Commit bc0b1dc1eb30b729dc9cd5ee218370162033afaa

Authored by bellard
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,6 +37,7 @@
37 abort (); \ 37 abort (); \
38 } while (0) 38 } while (0)
39 39
  40 +/* #define DEBUG_SB16 */
40 #ifdef DEBUG_SB16 41 #ifdef DEBUG_SB16
41 #define lwarn(...) fprintf (stderr, "sb16: " __VA_ARGS__) 42 #define lwarn(...) fprintf (stderr, "sb16: " __VA_ARGS__)
42 #define linfo(...) fprintf (stderr, "sb16: " __VA_ARGS__) 43 #define linfo(...) fprintf (stderr, "sb16: " __VA_ARGS__)
@@ -60,7 +61,7 @@ static struct { @@ -60,7 +61,7 @@ static struct {
60 int hdma; 61 int hdma;
61 int port; 62 int port;
62 int mix_block; 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 static int mix_block, noirq; 66 static int mix_block, noirq;
66 67
@@ -205,7 +206,7 @@ static void command (uint8_t cmd) @@ -205,7 +206,7 @@ static void command (uint8_t cmd)
205 { 206 {
206 char *msg; 207 char *msg;
207 208
208 - msg = (char *)-1; 209 + msg = (char *) -1;
209 210
210 linfo ("%#x\n", cmd); 211 linfo ("%#x\n", cmd);
211 212
@@ -225,6 +226,12 @@ static void command (uint8_t cmd) @@ -225,6 +226,12 @@ static void command (uint8_t cmd)
225 } 226 }
226 else { 227 else {
227 switch (cmd) { 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 case 0x10: 235 case 0x10:
229 dsp.needed_bytes = 1; 236 dsp.needed_bytes = 1;
230 break; 237 break;
@@ -328,7 +335,7 @@ static void command (uint8_t cmd) @@ -328,7 +335,7 @@ static void command (uint8_t cmd)
328 335
329 case 0xf2: 336 case 0xf2:
330 dsp.out_data[dsp.out_data_len++] = 0xaa; 337 dsp.out_data[dsp.out_data_len++] = 0xaa;
331 - mixer.regs[0x82] |= 1; 338 + mixer.regs[0x82] |= mixer.regs[0x80];
332 pic_set_irq (sb.irq, 1); 339 pic_set_irq (sb.irq, 1);
333 return; 340 return;
334 341
@@ -500,13 +507,19 @@ static IO_READ_PROTO (dsp_read) @@ -500,13 +507,19 @@ static IO_READ_PROTO (dsp_read)
500 goto error; 507 goto error;
501 508
502 case 0xe: /* data available status | irq 8 ack */ 509 case 0xe: /* data available status | irq 8 ack */
  510 + /* XXX drop pic irq line here? */
  511 + ldebug ("8 ack\n");
503 retval = (0 == dsp.out_data_len) ? 0 : 0x80; 512 retval = (0 == dsp.out_data_len) ? 0 : 0x80;
  513 + mixer.regs[0x82] &= ~mixer.regs[0x80];
  514 + pic_set_irq (sb.irq, 0);
504 break; 515 break;
505 516
506 case 0xf: /* irq 16 ack */ 517 case 0xf: /* irq 16 ack */
507 - retval = 0xff;  
508 - mixer.regs[0x82] &= ~2; 518 + /* XXX drop pic irq line here? */
509 ldebug ("16 ack\n"); 519 ldebug ("16 ack\n");
  520 + retval = 0xff;
  521 + mixer.regs[0x82] &= ~mixer.regs[0x80];
  522 + pic_set_irq (sb.irq, 0);
510 break; 523 break;
511 524
512 default: 525 default:
@@ -514,8 +527,8 @@ static IO_READ_PROTO (dsp_read) @@ -514,8 +527,8 @@ static IO_READ_PROTO (dsp_read)
514 } 527 }
515 528
516 if ((0xc != iport) && (0xe != iport)) { 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 return retval; 534 return retval;
@@ -617,8 +630,6 @@ static int SB_read_DMA (uint32_t addr, int size, int *_irq) @@ -617,8 +630,6 @@ static int SB_read_DMA (uint32_t addr, int size, int *_irq)
617 630
618 ldebug ("addr:%#010x free:%d till:%d size:%d\n", 631 ldebug ("addr:%#010x free:%d till:%d size:%d\n",
619 addr, free, till, size); 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 if (till <= copy) { 633 if (till <= copy) {
623 if (0 == dsp.dma_auto) { 634 if (0 == dsp.dma_auto) {
624 copy = till; 635 copy = till;
@@ -631,8 +642,10 @@ static int SB_read_DMA (uint32_t addr, int size, int *_irq) @@ -631,8 +642,10 @@ static int SB_read_DMA (uint32_t addr, int size, int *_irq)
631 642
632 if (dsp.left_till_irq <= 0) { 643 if (dsp.left_till_irq <= 0) {
633 mixer.regs[0x82] |= mixer.regs[0x80]; 644 mixer.regs[0x82] |= mixer.regs[0x80];
634 - if (0 == noirq) 645 + if (0 == noirq) {
  646 + ldebug ("request irq\n");
635 *_irq = sb.irq; 647 *_irq = sb.irq;
  648 + }
636 649
637 if (0 == dsp.dma_auto) { 650 if (0 == dsp.dma_auto) {
638 control (0); 651 control (0);