Commit 202a456a2b2f6f331ee97618a485d8a74599a047
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 | } |