Commit bc0b1dc1eb30b729dc9cd5ee218370162033afaa
1 parent
630be16f
sb16 patch (malc)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@561 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
23 additions
and
10 deletions
hw/sb16.c
... | ... | @@ -37,6 +37,7 @@ |
37 | 37 | abort (); \ |
38 | 38 | } while (0) |
39 | 39 | |
40 | +/* #define DEBUG_SB16 */ | |
40 | 41 | #ifdef DEBUG_SB16 |
41 | 42 | #define lwarn(...) fprintf (stderr, "sb16: " __VA_ARGS__) |
42 | 43 | #define linfo(...) fprintf (stderr, "sb16: " __VA_ARGS__) |
... | ... | @@ -60,7 +61,7 @@ static struct { |
60 | 61 | int hdma; |
61 | 62 | int port; |
62 | 63 | int mix_block; |
63 | -} sb = {4, 5, 5, 1, 5, 0x220, -1}; | |
64 | +} sb = {5, 4, 5, 1, 5, 0x220, -1}; | |
64 | 65 | |
65 | 66 | static int mix_block, noirq; |
66 | 67 | |
... | ... | @@ -205,7 +206,7 @@ static void command (uint8_t cmd) |
205 | 206 | { |
206 | 207 | char *msg; |
207 | 208 | |
208 | - msg = (char *)-1; | |
209 | + msg = (char *) -1; | |
209 | 210 | |
210 | 211 | linfo ("%#x\n", cmd); |
211 | 212 | |
... | ... | @@ -225,6 +226,12 @@ static void command (uint8_t cmd) |
225 | 226 | } |
226 | 227 | else { |
227 | 228 | switch (cmd) { |
229 | + case 0x00: | |
230 | + case 0x03: | |
231 | + case 0xe7: | |
232 | + /* IMS uses those when probing for sound devices */ | |
233 | + return; | |
234 | + | |
228 | 235 | case 0x10: |
229 | 236 | dsp.needed_bytes = 1; |
230 | 237 | break; |
... | ... | @@ -328,7 +335,7 @@ static void command (uint8_t cmd) |
328 | 335 | |
329 | 336 | case 0xf2: |
330 | 337 | dsp.out_data[dsp.out_data_len++] = 0xaa; |
331 | - mixer.regs[0x82] |= 1; | |
338 | + mixer.regs[0x82] |= mixer.regs[0x80]; | |
332 | 339 | pic_set_irq (sb.irq, 1); |
333 | 340 | return; |
334 | 341 | |
... | ... | @@ -500,13 +507,19 @@ static IO_READ_PROTO (dsp_read) |
500 | 507 | goto error; |
501 | 508 | |
502 | 509 | case 0xe: /* data available status | irq 8 ack */ |
510 | + /* XXX drop pic irq line here? */ | |
511 | + ldebug ("8 ack\n"); | |
503 | 512 | retval = (0 == dsp.out_data_len) ? 0 : 0x80; |
513 | + mixer.regs[0x82] &= ~mixer.regs[0x80]; | |
514 | + pic_set_irq (sb.irq, 0); | |
504 | 515 | break; |
505 | 516 | |
506 | 517 | case 0xf: /* irq 16 ack */ |
507 | - retval = 0xff; | |
508 | - mixer.regs[0x82] &= ~2; | |
518 | + /* XXX drop pic irq line here? */ | |
509 | 519 | ldebug ("16 ack\n"); |
520 | + retval = 0xff; | |
521 | + mixer.regs[0x82] &= ~mixer.regs[0x80]; | |
522 | + pic_set_irq (sb.irq, 0); | |
510 | 523 | break; |
511 | 524 | |
512 | 525 | default: |
... | ... | @@ -514,8 +527,8 @@ static IO_READ_PROTO (dsp_read) |
514 | 527 | } |
515 | 528 | |
516 | 529 | if ((0xc != iport) && (0xe != iport)) { |
517 | - ldebug ("(nport=%#x, size=%d) iport %#x = %#x\n", | |
518 | - nport, size, iport, retval); | |
530 | + ldebug ("nport=%#x iport %#x = %#x\n", | |
531 | + nport, iport, retval); | |
519 | 532 | } |
520 | 533 | |
521 | 534 | return retval; |
... | ... | @@ -617,8 +630,6 @@ static int SB_read_DMA (uint32_t addr, int size, int *_irq) |
617 | 630 | |
618 | 631 | ldebug ("addr:%#010x free:%d till:%d size:%d\n", |
619 | 632 | addr, free, till, size); |
620 | -/* linfo ("pos %d free %d size %d till %d copy %d auto %d noirq %d\n", */ | |
621 | -/* dsp.dma_pos, free, size, till, copy, dsp.dma_auto, noirq); */ | |
622 | 633 | if (till <= copy) { |
623 | 634 | if (0 == dsp.dma_auto) { |
624 | 635 | copy = till; |
... | ... | @@ -631,8 +642,10 @@ static int SB_read_DMA (uint32_t addr, int size, int *_irq) |
631 | 642 | |
632 | 643 | if (dsp.left_till_irq <= 0) { |
633 | 644 | mixer.regs[0x82] |= mixer.regs[0x80]; |
634 | - if (0 == noirq) | |
645 | + if (0 == noirq) { | |
646 | + ldebug ("request irq\n"); | |
635 | 647 | *_irq = sb.irq; |
648 | + } | |
636 | 649 | |
637 | 650 | if (0 == dsp.dma_auto) { |
638 | 651 | control (0); | ... | ... |