Commit feea13e186a902179fcd79e3ce5318b5eb73c0d2
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) | ... | ... |