Revision 202a456a hw/sb16.c
b/hw/sb16.c | ||
---|---|---|
26 | 26 |
#define MIN(a, b) ((a)>(b)?(b):(a)) |
27 | 27 |
#define LENOFA(a) ((int) (sizeof(a)/sizeof(a[0]))) |
28 | 28 |
|
29 |
#define DEREF(x) (void)x |
|
30 | 29 |
#define log(...) fprintf (stderr, "sb16: " __VA_ARGS__) |
31 | 30 |
|
32 | 31 |
/* #define DEBUG_SB16 */ |
... | ... | |
83 | 82 |
|
84 | 83 |
/* mixer state */ |
85 | 84 |
int mixer_nreg; |
86 |
uint8_t mixer_regs[0x83];
|
|
85 |
uint8_t mixer_regs[256];
|
|
87 | 86 |
} SB16State; |
88 | 87 |
|
89 | 88 |
/* XXX: suppress that and use a context */ |
... | ... | |
192 | 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 | 200 |
static void command (SB16State *dsp, uint8_t cmd) |
196 | 201 |
{ |
197 | 202 |
linfo ("%#x\n", cmd); |
... | ... | |
228 | 233 |
break; |
229 | 234 |
|
230 | 235 |
case 0x20: |
231 |
dsp->out_data[dsp->out_data_len++] = 0xff;
|
|
236 |
dsp_out_data(dsp, 0xff);
|
|
232 | 237 |
break; |
233 | 238 |
|
234 | 239 |
case 0x35: |
... | ... | |
315 | 320 |
break; |
316 | 321 |
|
317 | 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 | 325 |
return; |
321 | 326 |
|
322 | 327 |
case 0xf2: |
323 |
dsp->out_data[dsp->out_data_len++] = 0xaa;
|
|
328 |
dsp_out_data(dsp, 0xaa);
|
|
324 | 329 |
dsp->mixer_regs[0x82] |= dsp->mixer_regs[0x80]; |
325 | 330 |
pic_set_irq (sb.irq, 1); |
326 | 331 |
return; |
... | ... | |
398 | 403 |
break; |
399 | 404 |
|
400 | 405 |
case 0xe0: |
401 |
dsp->out_data_len = 1;
|
|
406 |
dsp->out_data_len = 0;
|
|
402 | 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 | 409 |
break; |
405 | 410 |
|
406 | 411 |
default: |
... | ... | |
426 | 431 |
dsp->v2x6 = 0; |
427 | 432 |
else if ((1 == val) && (0 == dsp->v2x6)) { |
428 | 433 |
dsp->v2x6 = 1; |
429 |
dsp->out_data[dsp->out_data_len++] = 0xaa;
|
|
434 |
dsp_out_data(dsp, 0xaa);
|
|
430 | 435 |
} |
431 | 436 |
else |
432 | 437 |
dsp->v2x6 = ~0; |
... | ... | |
519 | 524 |
static IO_WRITE_PROTO(mixer_write_indexb) |
520 | 525 |
{ |
521 | 526 |
SB16State *dsp = opaque; |
522 |
dsp->mixer_nreg = val & 0xff;
|
|
527 |
dsp->mixer_nreg = val; |
|
523 | 528 |
} |
524 | 529 |
|
525 | 530 |
static IO_WRITE_PROTO(mixer_write_datab) |
526 | 531 |
{ |
527 | 532 |
SB16State *dsp = opaque; |
533 |
|
|
534 |
if (dsp->mixer_nreg > 0x83) |
|
535 |
return; |
|
528 | 536 |
dsp->mixer_regs[dsp->mixer_nreg] = val; |
529 | 537 |
} |
530 | 538 |
|
... | ... | |
666 | 674 |
} |
667 | 675 |
} |
668 | 676 |
|
677 |
#if 0 |
|
669 | 678 |
static int irq_of_magic (int magic) |
670 | 679 |
{ |
671 | 680 |
switch (magic) { |
... | ... | |
682 | 691 |
return 2; |
683 | 692 |
} |
684 | 693 |
} |
694 |
#endif |
|
685 | 695 |
|
686 | 696 |
void SB16_init (void) |
687 | 697 |
{ |
... | ... | |
690 | 700 |
static const uint8_t dsp_write_ports[] = {0x6, 0xc}; |
691 | 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 | 705 |
s->mixer_regs[0x0e] = ~0; |
694 | 706 |
s->mixer_regs[0x80] = magic_of_irq (sb.irq); |
695 | 707 |
s->mixer_regs[0x81] = 0x20 | (sb.dma << 1); |
696 | 708 |
|
697 |
DEREF (irq_of_magic); |
|
698 |
|
|
699 | 709 |
for (i = 0x30; i < 0x48; i++) { |
700 | 710 |
s->mixer_regs[i] = 0x20; |
701 | 711 |
} |
Also available in: Unified diff