Commit 202a456a2b2f6f331ee97618a485d8a74599a047

Authored by bellard
1 parent 3294b949

safer sb16 code


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@728 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 22 additions and 12 deletions
hw/sb16.c
@@ -26,7 +26,6 @@ @@ -26,7 +26,6 @@
26 #define MIN(a, b) ((a)>(b)?(b):(a)) 26 #define MIN(a, b) ((a)>(b)?(b):(a))
27 #define LENOFA(a) ((int) (sizeof(a)/sizeof(a[0]))) 27 #define LENOFA(a) ((int) (sizeof(a)/sizeof(a[0])))
28 28
29 -#define DEREF(x) (void)x  
30 #define log(...) fprintf (stderr, "sb16: " __VA_ARGS__) 29 #define log(...) fprintf (stderr, "sb16: " __VA_ARGS__)
31 30
32 /* #define DEBUG_SB16 */ 31 /* #define DEBUG_SB16 */
@@ -83,7 +82,7 @@ typedef struct SB16State { @@ -83,7 +82,7 @@ typedef struct SB16State {
83 82
84 /* mixer state */ 83 /* mixer state */
85 int mixer_nreg; 84 int mixer_nreg;
86 - uint8_t mixer_regs[0x83]; 85 + uint8_t mixer_regs[256];
87 } SB16State; 86 } SB16State;
88 87
89 /* XXX: suppress that and use a context */ 88 /* XXX: suppress that and use a context */
@@ -192,6 +191,12 @@ static void dma_cmd (uint8_t cmd, uint8_t d0, int dma_len) @@ -192,6 +191,12 @@ static void dma_cmd (uint8_t cmd, uint8_t d0, int dma_len)
192 dsp.speaker = 1; 191 dsp.speaker = 1;
193 } 192 }
194 193
  194 +static inline void dsp_out_data(SB16State *dsp, int val)
  195 +{
  196 + if (dsp->out_data_len < sizeof(dsp->out_data))
  197 + dsp->out_data[dsp->out_data_len++] = val;
  198 +}
  199 +
195 static void command (SB16State *dsp, uint8_t cmd) 200 static void command (SB16State *dsp, uint8_t cmd)
196 { 201 {
197 linfo ("%#x\n", cmd); 202 linfo ("%#x\n", cmd);
@@ -228,7 +233,7 @@ static void command (SB16State *dsp, uint8_t cmd) @@ -228,7 +233,7 @@ static void command (SB16State *dsp, uint8_t cmd)
228 break; 233 break;
229 234
230 case 0x20: 235 case 0x20:
231 - dsp->out_data[dsp->out_data_len++] = 0xff; 236 + dsp_out_data(dsp, 0xff);
232 break; 237 break;
233 238
234 case 0x35: 239 case 0x35:
@@ -315,12 +320,12 @@ static void command (SB16State *dsp, uint8_t cmd) @@ -315,12 +320,12 @@ static void command (SB16State *dsp, uint8_t cmd)
315 break; 320 break;
316 321
317 case 0xe1: 322 case 0xe1:
318 - dsp->out_data[dsp->out_data_len++] = sb.ver_lo;  
319 - dsp->out_data[dsp->out_data_len++] = sb.ver_hi; 323 + dsp_out_data(dsp, sb.ver_lo);
  324 + dsp_out_data(dsp, sb.ver_hi);
320 return; 325 return;
321 326
322 case 0xf2: 327 case 0xf2:
323 - dsp->out_data[dsp->out_data_len++] = 0xaa; 328 + dsp_out_data(dsp, 0xaa);
324 dsp->mixer_regs[0x82] |= dsp->mixer_regs[0x80]; 329 dsp->mixer_regs[0x82] |= dsp->mixer_regs[0x80];
325 pic_set_irq (sb.irq, 1); 330 pic_set_irq (sb.irq, 1);
326 return; 331 return;
@@ -398,9 +403,9 @@ static void complete (SB16State *dsp) @@ -398,9 +403,9 @@ static void complete (SB16State *dsp)
398 break; 403 break;
399 404
400 case 0xe0: 405 case 0xe0:
401 - dsp->out_data_len = 1; 406 + dsp->out_data_len = 0;
402 linfo ("data = %#x\n", dsp->in_data[0]); 407 linfo ("data = %#x\n", dsp->in_data[0]);
403 - dsp->out_data[0] = dsp->in_data[0] ^ 0xff; 408 + dsp_out_data(dsp, dsp->in_data[0] ^ 0xff);
404 break; 409 break;
405 410
406 default: 411 default:
@@ -426,7 +431,7 @@ static IO_WRITE_PROTO (dsp_write) @@ -426,7 +431,7 @@ static IO_WRITE_PROTO (dsp_write)
426 dsp->v2x6 = 0; 431 dsp->v2x6 = 0;
427 else if ((1 == val) && (0 == dsp->v2x6)) { 432 else if ((1 == val) && (0 == dsp->v2x6)) {
428 dsp->v2x6 = 1; 433 dsp->v2x6 = 1;
429 - dsp->out_data[dsp->out_data_len++] = 0xaa; 434 + dsp_out_data(dsp, 0xaa);
430 } 435 }
431 else 436 else
432 dsp->v2x6 = ~0; 437 dsp->v2x6 = ~0;
@@ -519,12 +524,15 @@ static IO_READ_PROTO (dsp_read) @@ -519,12 +524,15 @@ static IO_READ_PROTO (dsp_read)
519 static IO_WRITE_PROTO(mixer_write_indexb) 524 static IO_WRITE_PROTO(mixer_write_indexb)
520 { 525 {
521 SB16State *dsp = opaque; 526 SB16State *dsp = opaque;
522 - dsp->mixer_nreg = val & 0xff; 527 + dsp->mixer_nreg = val;
523 } 528 }
524 529
525 static IO_WRITE_PROTO(mixer_write_datab) 530 static IO_WRITE_PROTO(mixer_write_datab)
526 { 531 {
527 SB16State *dsp = opaque; 532 SB16State *dsp = opaque;
  533 +
  534 + if (dsp->mixer_nreg > 0x83)
  535 + return;
528 dsp->mixer_regs[dsp->mixer_nreg] = val; 536 dsp->mixer_regs[dsp->mixer_nreg] = val;
529 } 537 }
530 538
@@ -666,6 +674,7 @@ static int magic_of_irq (int irq) @@ -666,6 +674,7 @@ static int magic_of_irq (int irq)
666 } 674 }
667 } 675 }
668 676
  677 +#if 0
669 static int irq_of_magic (int magic) 678 static int irq_of_magic (int magic)
670 { 679 {
671 switch (magic) { 680 switch (magic) {
@@ -682,6 +691,7 @@ static int irq_of_magic (int magic) @@ -682,6 +691,7 @@ static int irq_of_magic (int magic)
682 return 2; 691 return 2;
683 } 692 }
684 } 693 }
  694 +#endif
685 695
686 void SB16_init (void) 696 void SB16_init (void)
687 { 697 {
@@ -690,12 +700,12 @@ void SB16_init (void) @@ -690,12 +700,12 @@ void SB16_init (void)
690 static const uint8_t dsp_write_ports[] = {0x6, 0xc}; 700 static const uint8_t dsp_write_ports[] = {0x6, 0xc};
691 static const uint8_t dsp_read_ports[] = {0x6, 0xa, 0xc, 0xd, 0xe, 0xf}; 701 static const uint8_t dsp_read_ports[] = {0x6, 0xa, 0xc, 0xd, 0xe, 0xf};
692 702
  703 + memset(s->mixer_regs, 0xff, sizeof(s->mixer_regs));
  704 +
693 s->mixer_regs[0x0e] = ~0; 705 s->mixer_regs[0x0e] = ~0;
694 s->mixer_regs[0x80] = magic_of_irq (sb.irq); 706 s->mixer_regs[0x80] = magic_of_irq (sb.irq);
695 s->mixer_regs[0x81] = 0x20 | (sb.dma << 1); 707 s->mixer_regs[0x81] = 0x20 | (sb.dma << 1);
696 708
697 - DEREF (irq_of_magic);  
698 -  
699 for (i = 0x30; i < 0x48; i++) { 709 for (i = 0x30; i < 0x48; i++) {
700 s->mixer_regs[i] = 0x20; 710 s->mixer_regs[i] = 0x20;
701 } 711 }