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