Commit feea13e186a902179fcd79e3ce5318b5eb73c0d2

Authored by bellard
1 parent 6c270db7

sb16 fixes (WfW 3 appears to work with shipped drivers) (malc)


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2039 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 60 additions and 24 deletions
hw/sb16.c
... ... @@ -193,6 +193,31 @@ static void aux_timer (void *opaque)
193 193 #define DMA8_AUTO 1
194 194 #define DMA8_HIGH 2
195 195  
  196 +static void continue_dma8 (SB16State *s)
  197 +{
  198 + if (s->freq > 0) {
  199 + audsettings_t as;
  200 +
  201 + s->audio_free = 0;
  202 +
  203 + as.freq = s->freq;
  204 + as.nchannels = 1 << s->fmt_stereo;
  205 + as.fmt = s->fmt;
  206 +
  207 + s->voice = AUD_open_out (
  208 + &s->card,
  209 + s->voice,
  210 + "sb16",
  211 + s,
  212 + SB_audio_callback,
  213 + &as,
  214 + 0 /* little endian */
  215 + );
  216 + }
  217 +
  218 + control (s, 1);
  219 +}
  220 +
196 221 static void dma_cmd8 (SB16State *s, int mask, int dma_len)
197 222 {
198 223 s->fmt = AUD_FMT_U8;
... ... @@ -201,7 +226,8 @@ static void dma_cmd8 (SB16State *s, int mask, int dma_len)
201 226 s->fmt_signed = 0;
202 227 s->fmt_stereo = (s->mixer_regs[0x0e] & 2) != 0;
203 228 if (-1 == s->time_const) {
204   - s->freq = 11025;
  229 + if (s->freq <= 0)
  230 + s->freq = 11025;
205 231 }
206 232 else {
207 233 int tmp = (256 - s->time_const);
... ... @@ -239,27 +265,7 @@ static void dma_cmd8 (SB16State *s, int mask, int dma_len)
239 265 s->freq, s->fmt_stereo, s->fmt_signed, s->fmt_bits,
240 266 s->block_size, s->dma_auto, s->fifo, s->highspeed);
241 267  
242   - if (s->freq) {
243   - audsettings_t as;
244   -
245   - s->audio_free = 0;
246   -
247   - as.freq = s->freq;
248   - as.nchannels = 1 << s->fmt_stereo;
249   - as.fmt = s->fmt;
250   -
251   - s->voice = AUD_open_out (
252   - &s->card,
253   - s->voice,
254   - "sb16",
255   - s,
256   - SB_audio_callback,
257   - &as,
258   - 0 /* little endian */
259   - );
260   - }
261   -
262   - control (s, 1);
  268 + continue_dma8 (s);
263 269 speaker (s, 1);
264 270 }
265 271  
... ... @@ -437,7 +443,7 @@ static void command (SB16State *s, uint8_t cmd)
437 443 break;
438 444  
439 445 case 0x1c: /* Auto-Initialize DMA DAC, 8-bit */
440   - control (s, 1);
  446 + dma_cmd8 (s, DMA8_AUTO, -1);
441 447 break;
442 448  
443 449 case 0x20: /* Direct ADC, Juice/PL */
... ... @@ -531,7 +537,9 @@ static void command (SB16State *s, uint8_t cmd)
531 537 break;
532 538  
533 539 case 0xd4: /* continue DMA operation. 8bit */
534   - control (s, 1);
  540 + /* KQ6 (or maybe Sierras audblst.drv in general) resets
  541 + the frequency between halt/continue */
  542 + continue_dma8 (s);
535 543 break;
536 544  
537 545 case 0xd5: /* halt DMA operation. 16bit */
... ... @@ -818,6 +826,33 @@ static void complete (SB16State *s)
818 826 return;
819 827 }
820 828  
  829 +static void legacy_reset (SB16State *s)
  830 +{
  831 + audsettings_t as;
  832 +
  833 + s->freq = 11025;
  834 + s->fmt_signed = 0;
  835 + s->fmt_bits = 8;
  836 + s->fmt_stereo = 0;
  837 +
  838 + as.freq = s->freq;
  839 + as.nchannels = 1;
  840 + as.fmt = AUD_FMT_U8;
  841 +
  842 + s->voice = AUD_open_out (
  843 + &s->card,
  844 + s->voice,
  845 + "sb16",
  846 + s,
  847 + SB_audio_callback,
  848 + &as,
  849 + 0 /* little endian */
  850 + );
  851 +
  852 + /* Not sure about that... */
  853 + /* AUD_set_active_out (s->voice, 1); */
  854 +}
  855 +
821 856 static void reset (SB16State *s)
822 857 {
823 858 pic_set_irq (s->irq, 0);
... ... @@ -841,6 +876,7 @@ static void reset (SB16State *s)
841 876 dsp_out_data(s, 0xaa);
842 877 speaker (s, 0);
843 878 control (s, 0);
  879 + legacy_reset (s);
844 880 }
845 881  
846 882 static IO_WRITE_PROTO (dsp_write)
... ...