Revision d329a6fb 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 log(...) fprintf (stderr, "sb16: " __VA_ARGS__) |
|
29 |
#define log(...) do { \ |
|
30 |
fprintf (stderr, "sb16: " __VA_ARGS__); \ |
|
31 |
fputc ('\n', stderr); \ |
|
32 |
} while (0) |
|
30 | 33 |
|
31 | 34 |
/* #define DEBUG_SB16 */ |
32 | 35 |
#ifdef DEBUG_SB16 |
... | ... | |
44 | 47 |
#define IO_WRITE_PROTO(name) \ |
45 | 48 |
void name (void *opaque, uint32_t nport, uint32_t val) |
46 | 49 |
|
50 |
static const char e3[] = "COPYRIGHT (C) CREATIVE TECHNOLOGY LTD, 1992."; |
|
51 |
|
|
47 | 52 |
static struct { |
48 | 53 |
int ver_lo; |
49 | 54 |
int ver_hi; |
... | ... | |
76 | 81 |
int v2x6; |
77 | 82 |
|
78 | 83 |
uint8_t in_data[10]; |
79 |
uint8_t out_data[10];
|
|
84 |
uint8_t out_data[50];
|
|
80 | 85 |
|
81 | 86 |
int left_till_irq; |
82 | 87 |
|
... | ... | |
223 | 228 |
/* IMS uses those when probing for sound devices */ |
224 | 229 |
return; |
225 | 230 |
|
231 |
case 0x04: |
|
232 |
dsp->needed_bytes = 1; |
|
233 |
break; |
|
234 |
|
|
235 |
case 0x05: |
|
236 |
case 0x0e: |
|
237 |
dsp->needed_bytes = 2; |
|
238 |
break; |
|
239 |
|
|
240 |
case 0x0f: |
|
241 |
dsp->needed_bytes = 1; |
|
242 |
dsp_out_data (dsp, 0); |
|
243 |
break; |
|
244 |
|
|
226 | 245 |
case 0x10: |
227 | 246 |
dsp->needed_bytes = 1; |
228 | 247 |
break; |
... | ... | |
274 | 293 |
uint8_t d0; |
275 | 294 |
|
276 | 295 |
d0 = 4; |
277 |
if (dsp->fmt_signed) d0 |= 16;
|
|
278 |
if (dsp->fmt_stereo) d0 |= 32;
|
|
296 |
/* if (dsp->fmt_signed) d0 |= 16; */
|
|
297 |
/* if (dsp->fmt_stereo) d0 |= 32; */
|
|
279 | 298 |
dma_cmd (cmd == 0x90 ? 0xc4 : 0xc0, d0, -1); |
280 | 299 |
cmd = -1; |
281 | 300 |
break; |
... | ... | |
324 | 343 |
dsp_out_data(dsp, sb.ver_hi); |
325 | 344 |
return; |
326 | 345 |
|
346 |
case 0xe3: |
|
347 |
{ |
|
348 |
int i; |
|
349 |
for (i = sizeof (e3) - 1; i >= 0; --i) |
|
350 |
dsp_out_data (dsp, e3[i]); |
|
351 |
return; |
|
352 |
} |
|
353 |
|
|
327 | 354 |
case 0xf2: |
328 | 355 |
dsp_out_data(dsp, 0xaa); |
329 | 356 |
dsp->mixer_regs[0x82] |= dsp->mixer_regs[0x80]; |
... | ... | |
360 | 387 |
} |
361 | 388 |
else { |
362 | 389 |
switch (dsp->cmd) { |
390 |
case 0x05: |
|
391 |
case 0x04: |
|
392 |
case 0x0e: |
|
393 |
case 0x0f: |
|
394 |
break; |
|
363 | 395 |
|
364 | 396 |
case 0x10: |
365 | 397 |
break; |
... | ... | |
425 | 457 |
|
426 | 458 |
iport = nport - sb.port; |
427 | 459 |
|
460 |
ldebug ("write %#x %#x\n", nport, iport); |
|
428 | 461 |
switch (iport) { |
429 | 462 |
case 0x6: |
463 |
control (0); |
|
430 | 464 |
if (0 == val) |
431 | 465 |
dsp->v2x6 = 0; |
432 | 466 |
else if ((1 == val) && (0 == dsp->v2x6)) { |
... | ... | |
477 | 511 |
if (dsp->out_data_len) { |
478 | 512 |
retval = dsp->out_data[--dsp->out_data_len]; |
479 | 513 |
} else { |
480 |
log("empty output buffer\n");
|
|
514 |
log("empty output buffer"); |
|
481 | 515 |
goto error; |
482 | 516 |
} |
483 | 517 |
break; |
... | ... | |
487 | 521 |
break; |
488 | 522 |
|
489 | 523 |
case 0xd: /* timer interrupt clear */ |
490 |
log("timer interrupt clear\n");
|
|
524 |
log("timer interrupt clear"); |
|
491 | 525 |
goto error; |
492 | 526 |
|
493 | 527 |
case 0xe: /* data available status | irq 8 ack */ |
... | ... | |
669 | 703 |
case 10: |
670 | 704 |
return 8; |
671 | 705 |
default: |
672 |
log ("bad irq %d\n", irq);
|
|
706 |
log ("bad irq %d", irq); |
|
673 | 707 |
return 2; |
674 | 708 |
} |
675 | 709 |
} |
... | ... | |
687 | 721 |
case 8: |
688 | 722 |
return 10; |
689 | 723 |
default: |
690 |
log ("bad irq magic %d\n", magic);
|
|
724 |
log ("bad irq magic %d", magic); |
|
691 | 725 |
return 2; |
692 | 726 |
} |
693 | 727 |
} |
Also available in: Unified diff