1 /* 2 * QEMU Soundblaster 16 emulation 3 * 4 * Copyright (c) 2003-2005 Vassili Karpov (malc) 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to deal 8 * in the Software without restriction, including without limitation the rights 9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 * copies of the Software, and to permit persons to whom the Software is 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in 14 * all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 * THE SOFTWARE. 23 */ 24 25 #include "qemu/osdep.h" 26 #include "hw/audio/soundhw.h" 27 #include "audio/audio.h" 28 #include "hw/irq.h" 29 #include "hw/isa/isa.h" 30 #include "hw/qdev-properties.h" 31 #include "migration/vmstate.h" 32 #include "qemu/timer.h" 33 #include "qemu/host-utils.h" 34 #include "qemu/log.h" 35 #include "qemu/module.h" 36 #include "qapi/error.h" 37 38 #define dolog(...) AUD_log ("sb16", __VA_ARGS__) 39 40 /* #define DEBUG */ 41 /* #define DEBUG_SB16_MOST */ 42 43 #ifdef DEBUG 44 #define ldebug(...) dolog (__VA_ARGS__) 45 #else 46 #define ldebug(...) 47 #endif 48 49 static const char e3[] = "COPYRIGHT (C) CREATIVE TECHNOLOGY LTD, 1992."; 50 51 #define TYPE_SB16 "sb16" 52 #define SB16(obj) OBJECT_CHECK (SB16State, (obj), TYPE_SB16) 53 54 typedef struct SB16State { 55 ISADevice parent_obj; 56 57 QEMUSoundCard card; 58 qemu_irq pic; 59 uint32_t irq; 60 uint32_t dma; 61 uint32_t hdma; 62 uint32_t port; 63 uint32_t ver; 64 IsaDma *isa_dma; 65 IsaDma *isa_hdma; 66 67 int in_index; 68 int out_data_len; 69 int fmt_stereo; 70 int fmt_signed; 71 int fmt_bits; 72 AudioFormat fmt; 73 int dma_auto; 74 int block_size; 75 int fifo; 76 int freq; 77 int time_const; 78 int speaker; 79 int needed_bytes; 80 int cmd; 81 int use_hdma; 82 int highspeed; 83 int can_write; 84 85 int v2x6; 86 87 uint8_t csp_param; 88 uint8_t csp_value; 89 uint8_t csp_mode; 90 uint8_t csp_regs[256]; 91 uint8_t csp_index; 92 uint8_t csp_reg83[4]; 93 int csp_reg83r; 94 int csp_reg83w; 95 96 uint8_t in2_data[10]; 97 uint8_t out_data[50]; 98 uint8_t test_reg; 99 uint8_t last_read_byte; 100 int nzero; 101 102 int left_till_irq; 103 104 int dma_running; 105 int bytes_per_second; 106 int align; 107 int audio_free; 108 SWVoiceOut *voice; 109 110 QEMUTimer *aux_ts; 111 /* mixer state */ 112 int mixer_nreg; 113 uint8_t mixer_regs[256]; 114 PortioList portio_list; 115 } SB16State; 116 117 static void SB_audio_callback (void *opaque, int free); 118 119 static int magic_of_irq (int irq) 120 { 121 switch (irq) { 122 case 5: 123 return 2; 124 case 7: 125 return 4; 126 case 9: 127 return 1; 128 case 10: 129 return 8; 130 default: 131 qemu_log_mask(LOG_GUEST_ERROR, "bad irq %d\n", irq); 132 return 2; 133 } 134 } 135 136 static int irq_of_magic (int magic) 137 { 138 switch (magic) { 139 case 1: 140 return 9; 141 case 2: 142 return 5; 143 case 4: 144 return 7; 145 case 8: 146 return 10; 147 default: 148 qemu_log_mask(LOG_GUEST_ERROR, "bad irq magic %d\n", magic); 149 return -1; 150 } 151 } 152 153 #if 0 154 static void log_dsp (SB16State *dsp) 155 { 156 ldebug ("%s:%s:%d:%s:dmasize=%d:freq=%d:const=%d:speaker=%d\n", 157 dsp->fmt_stereo ? "Stereo" : "Mono", 158 dsp->fmt_signed ? "Signed" : "Unsigned", 159 dsp->fmt_bits, 160 dsp->dma_auto ? "Auto" : "Single", 161 dsp->block_size, 162 dsp->freq, 163 dsp->time_const, 164 dsp->speaker); 165 } 166 #endif 167 168 static void speaker (SB16State *s, int on) 169 { 170 s->speaker = on; 171 /* AUD_enable (s->voice, on); */ 172 } 173 174 static void control (SB16State *s, int hold) 175 { 176 int dma = s->use_hdma ? s->hdma : s->dma; 177 IsaDma *isa_dma = s->use_hdma ? s->isa_hdma : s->isa_dma; 178 IsaDmaClass *k = ISADMA_GET_CLASS(isa_dma); 179 s->dma_running = hold; 180 181 ldebug ("hold %d high %d dma %d\n", hold, s->use_hdma, dma); 182 183 if (hold) { 184 k->hold_DREQ(isa_dma, dma); 185 AUD_set_active_out (s->voice, 1); 186 } 187 else { 188 k->release_DREQ(isa_dma, dma); 189 AUD_set_active_out (s->voice, 0); 190 } 191 } 192 193 static void aux_timer (void *opaque) 194 { 195 SB16State *s = opaque; 196 s->can_write = 1; 197 qemu_irq_raise (s->pic); 198 } 199 200 #define DMA8_AUTO 1 201 #define DMA8_HIGH 2 202 203 static void continue_dma8 (SB16State *s) 204 { 205 if (s->freq > 0) { 206 struct audsettings as; 207 208 s->audio_free = 0; 209 210 as.freq = s->freq; 211 as.nchannels = 1 << s->fmt_stereo; 212 as.fmt = s->fmt; 213 as.endianness = 0; 214 215 s->voice = AUD_open_out ( 216 &s->card, 217 s->voice, 218 "sb16", 219 s, 220 SB_audio_callback, 221 &as 222 ); 223 } 224 225 control (s, 1); 226 } 227 228 static void dma_cmd8 (SB16State *s, int mask, int dma_len) 229 { 230 s->fmt = AUDIO_FORMAT_U8; 231 s->use_hdma = 0; 232 s->fmt_bits = 8; 233 s->fmt_signed = 0; 234 s->fmt_stereo = (s->mixer_regs[0x0e] & 2) != 0; 235 if (-1 == s->time_const) { 236 if (s->freq <= 0) 237 s->freq = 11025; 238 } 239 else { 240 int tmp = (256 - s->time_const); 241 s->freq = (1000000 + (tmp / 2)) / tmp; 242 } 243 244 if (dma_len != -1) { 245 s->block_size = dma_len << s->fmt_stereo; 246 } 247 else { 248 /* This is apparently the only way to make both Act1/PL 249 and SecondReality/FC work 250 251 Act1 sets block size via command 0x48 and it's an odd number 252 SR does the same with even number 253 Both use stereo, and Creatives own documentation states that 254 0x48 sets block size in bytes less one.. go figure */ 255 s->block_size &= ~s->fmt_stereo; 256 } 257 258 s->freq >>= s->fmt_stereo; 259 s->left_till_irq = s->block_size; 260 s->bytes_per_second = (s->freq << s->fmt_stereo); 261 /* s->highspeed = (mask & DMA8_HIGH) != 0; */ 262 s->dma_auto = (mask & DMA8_AUTO) != 0; 263 s->align = (1 << s->fmt_stereo) - 1; 264 265 if (s->block_size & s->align) { 266 qemu_log_mask(LOG_GUEST_ERROR, "warning: misaligned block size %d," 267 " alignment %d\n", s->block_size, s->align + 1); 268 } 269 270 ldebug ("freq %d, stereo %d, sign %d, bits %d, " 271 "dma %d, auto %d, fifo %d, high %d\n", 272 s->freq, s->fmt_stereo, s->fmt_signed, s->fmt_bits, 273 s->block_size, s->dma_auto, s->fifo, s->highspeed); 274 275 continue_dma8 (s); 276 speaker (s, 1); 277 } 278 279 static void dma_cmd (SB16State *s, uint8_t cmd, uint8_t d0, int dma_len) 280 { 281 s->use_hdma = cmd < 0xc0; 282 s->fifo = (cmd >> 1) & 1; 283 s->dma_auto = (cmd >> 2) & 1; 284 s->fmt_signed = (d0 >> 4) & 1; 285 s->fmt_stereo = (d0 >> 5) & 1; 286 287 switch (cmd >> 4) { 288 case 11: 289 s->fmt_bits = 16; 290 break; 291 292 case 12: 293 s->fmt_bits = 8; 294 break; 295 } 296 297 if (-1 != s->time_const) { 298 #if 1 299 int tmp = 256 - s->time_const; 300 s->freq = (1000000 + (tmp / 2)) / tmp; 301 #else 302 /* s->freq = 1000000 / ((255 - s->time_const) << s->fmt_stereo); */ 303 s->freq = 1000000 / ((255 - s->time_const)); 304 #endif 305 s->time_const = -1; 306 } 307 308 s->block_size = dma_len + 1; 309 s->block_size <<= (s->fmt_bits == 16); 310 if (!s->dma_auto) { 311 /* It is clear that for DOOM and auto-init this value 312 shouldn't take stereo into account, while Miles Sound Systems 313 setsound.exe with single transfer mode wouldn't work without it 314 wonders of SB16 yet again */ 315 s->block_size <<= s->fmt_stereo; 316 } 317 318 ldebug ("freq %d, stereo %d, sign %d, bits %d, " 319 "dma %d, auto %d, fifo %d, high %d\n", 320 s->freq, s->fmt_stereo, s->fmt_signed, s->fmt_bits, 321 s->block_size, s->dma_auto, s->fifo, s->highspeed); 322 323 if (16 == s->fmt_bits) { 324 if (s->fmt_signed) { 325 s->fmt = AUDIO_FORMAT_S16; 326 } 327 else { 328 s->fmt = AUDIO_FORMAT_U16; 329 } 330 } 331 else { 332 if (s->fmt_signed) { 333 s->fmt = AUDIO_FORMAT_S8; 334 } 335 else { 336 s->fmt = AUDIO_FORMAT_U8; 337 } 338 } 339 340 s->left_till_irq = s->block_size; 341 342 s->bytes_per_second = (s->freq << s->fmt_stereo) << (s->fmt_bits == 16); 343 s->highspeed = 0; 344 s->align = (1 << (s->fmt_stereo + (s->fmt_bits == 16))) - 1; 345 if (s->block_size & s->align) { 346 qemu_log_mask(LOG_GUEST_ERROR, "warning: misaligned block size %d," 347 " alignment %d\n", s->block_size, s->align + 1); 348 } 349 350 if (s->freq) { 351 struct audsettings as; 352 353 s->audio_free = 0; 354 355 as.freq = s->freq; 356 as.nchannels = 1 << s->fmt_stereo; 357 as.fmt = s->fmt; 358 as.endianness = 0; 359 360 s->voice = AUD_open_out ( 361 &s->card, 362 s->voice, 363 "sb16", 364 s, 365 SB_audio_callback, 366 &as 367 ); 368 } 369 370 control (s, 1); 371 speaker (s, 1); 372 } 373 374 static inline void dsp_out_data (SB16State *s, uint8_t val) 375 { 376 ldebug ("outdata %#x\n", val); 377 if ((size_t) s->out_data_len < sizeof (s->out_data)) { 378 s->out_data[s->out_data_len++] = val; 379 } 380 } 381 382 static inline uint8_t dsp_get_data (SB16State *s) 383 { 384 if (s->in_index) { 385 return s->in2_data[--s->in_index]; 386 } 387 else { 388 dolog ("buffer underflow\n"); 389 return 0; 390 } 391 } 392 393 static void command (SB16State *s, uint8_t cmd) 394 { 395 ldebug ("command %#x\n", cmd); 396 397 if (cmd > 0xaf && cmd < 0xd0) { 398 if (cmd & 8) { 399 qemu_log_mask(LOG_UNIMP, "ADC not yet supported (command %#x)\n", 400 cmd); 401 } 402 403 switch (cmd >> 4) { 404 case 11: 405 case 12: 406 break; 407 default: 408 qemu_log_mask(LOG_GUEST_ERROR, "%#x wrong bits\n", cmd); 409 } 410 s->needed_bytes = 3; 411 } 412 else { 413 s->needed_bytes = 0; 414 415 switch (cmd) { 416 case 0x03: 417 dsp_out_data (s, 0x10); /* s->csp_param); */ 418 goto warn; 419 420 case 0x04: 421 s->needed_bytes = 1; 422 goto warn; 423 424 case 0x05: 425 s->needed_bytes = 2; 426 goto warn; 427 428 case 0x08: 429 /* __asm__ ("int3"); */ 430 goto warn; 431 432 case 0x0e: 433 s->needed_bytes = 2; 434 goto warn; 435 436 case 0x09: 437 dsp_out_data (s, 0xf8); 438 goto warn; 439 440 case 0x0f: 441 s->needed_bytes = 1; 442 goto warn; 443 444 case 0x10: 445 s->needed_bytes = 1; 446 goto warn; 447 448 case 0x14: 449 s->needed_bytes = 2; 450 s->block_size = 0; 451 break; 452 453 case 0x1c: /* Auto-Initialize DMA DAC, 8-bit */ 454 dma_cmd8 (s, DMA8_AUTO, -1); 455 break; 456 457 case 0x20: /* Direct ADC, Juice/PL */ 458 dsp_out_data (s, 0xff); 459 goto warn; 460 461 case 0x35: 462 qemu_log_mask(LOG_UNIMP, "0x35 - MIDI command not implemented\n"); 463 break; 464 465 case 0x40: 466 s->freq = -1; 467 s->time_const = -1; 468 s->needed_bytes = 1; 469 break; 470 471 case 0x41: 472 s->freq = -1; 473 s->time_const = -1; 474 s->needed_bytes = 2; 475 break; 476 477 case 0x42: 478 s->freq = -1; 479 s->time_const = -1; 480 s->needed_bytes = 2; 481 goto warn; 482 483 case 0x45: 484 dsp_out_data (s, 0xaa); 485 goto warn; 486 487 case 0x47: /* Continue Auto-Initialize DMA 16bit */ 488 break; 489 490 case 0x48: 491 s->needed_bytes = 2; 492 break; 493 494 case 0x74: 495 s->needed_bytes = 2; /* DMA DAC, 4-bit ADPCM */ 496 qemu_log_mask(LOG_UNIMP, "0x75 - DMA DAC, 4-bit ADPCM not" 497 " implemented\n"); 498 break; 499 500 case 0x75: /* DMA DAC, 4-bit ADPCM Reference */ 501 s->needed_bytes = 2; 502 qemu_log_mask(LOG_UNIMP, "0x74 - DMA DAC, 4-bit ADPCM Reference not" 503 " implemented\n"); 504 break; 505 506 case 0x76: /* DMA DAC, 2.6-bit ADPCM */ 507 s->needed_bytes = 2; 508 qemu_log_mask(LOG_UNIMP, "0x74 - DMA DAC, 2.6-bit ADPCM not" 509 " implemented\n"); 510 break; 511 512 case 0x77: /* DMA DAC, 2.6-bit ADPCM Reference */ 513 s->needed_bytes = 2; 514 qemu_log_mask(LOG_UNIMP, "0x74 - DMA DAC, 2.6-bit ADPCM Reference" 515 " not implemented\n"); 516 break; 517 518 case 0x7d: 519 qemu_log_mask(LOG_UNIMP, "0x7d - Autio-Initialize DMA DAC, 4-bit" 520 " ADPCM Reference\n"); 521 qemu_log_mask(LOG_UNIMP, "not implemented\n"); 522 break; 523 524 case 0x7f: 525 qemu_log_mask(LOG_UNIMP, "0x7d - Autio-Initialize DMA DAC, 2.6-bit" 526 " ADPCM Reference\n"); 527 qemu_log_mask(LOG_UNIMP, "not implemented\n"); 528 break; 529 530 case 0x80: 531 s->needed_bytes = 2; 532 break; 533 534 case 0x90: 535 case 0x91: 536 dma_cmd8 (s, ((cmd & 1) == 0) | DMA8_HIGH, -1); 537 break; 538 539 case 0xd0: /* halt DMA operation. 8bit */ 540 control (s, 0); 541 break; 542 543 case 0xd1: /* speaker on */ 544 speaker (s, 1); 545 break; 546 547 case 0xd3: /* speaker off */ 548 speaker (s, 0); 549 break; 550 551 case 0xd4: /* continue DMA operation. 8bit */ 552 /* KQ6 (or maybe Sierras audblst.drv in general) resets 553 the frequency between halt/continue */ 554 continue_dma8 (s); 555 break; 556 557 case 0xd5: /* halt DMA operation. 16bit */ 558 control (s, 0); 559 break; 560 561 case 0xd6: /* continue DMA operation. 16bit */ 562 control (s, 1); 563 break; 564 565 case 0xd9: /* exit auto-init DMA after this block. 16bit */ 566 s->dma_auto = 0; 567 break; 568 569 case 0xda: /* exit auto-init DMA after this block. 8bit */ 570 s->dma_auto = 0; 571 break; 572 573 case 0xe0: /* DSP identification */ 574 s->needed_bytes = 1; 575 break; 576 577 case 0xe1: 578 dsp_out_data (s, s->ver & 0xff); 579 dsp_out_data (s, s->ver >> 8); 580 break; 581 582 case 0xe2: 583 s->needed_bytes = 1; 584 goto warn; 585 586 case 0xe3: 587 { 588 int i; 589 for (i = sizeof (e3) - 1; i >= 0; --i) 590 dsp_out_data (s, e3[i]); 591 } 592 break; 593 594 case 0xe4: /* write test reg */ 595 s->needed_bytes = 1; 596 break; 597 598 case 0xe7: 599 qemu_log_mask(LOG_UNIMP, "Attempt to probe for ESS (0xe7)?\n"); 600 break; 601 602 case 0xe8: /* read test reg */ 603 dsp_out_data (s, s->test_reg); 604 break; 605 606 case 0xf2: 607 case 0xf3: 608 dsp_out_data (s, 0xaa); 609 s->mixer_regs[0x82] |= (cmd == 0xf2) ? 1 : 2; 610 qemu_irq_raise (s->pic); 611 break; 612 613 case 0xf9: 614 s->needed_bytes = 1; 615 goto warn; 616 617 case 0xfa: 618 dsp_out_data (s, 0); 619 goto warn; 620 621 case 0xfc: /* FIXME */ 622 dsp_out_data (s, 0); 623 goto warn; 624 625 default: 626 qemu_log_mask(LOG_UNIMP, "Unrecognized command %#x\n", cmd); 627 break; 628 } 629 } 630 631 if (!s->needed_bytes) { 632 ldebug ("\n"); 633 } 634 635 exit: 636 if (!s->needed_bytes) { 637 s->cmd = -1; 638 } 639 else { 640 s->cmd = cmd; 641 } 642 return; 643 644 warn: 645 qemu_log_mask(LOG_UNIMP, "warning: command %#x,%d is not truly understood" 646 " yet\n", cmd, s->needed_bytes); 647 goto exit; 648 649 } 650 651 static uint16_t dsp_get_lohi (SB16State *s) 652 { 653 uint8_t hi = dsp_get_data (s); 654 uint8_t lo = dsp_get_data (s); 655 return (hi << 8) | lo; 656 } 657 658 static uint16_t dsp_get_hilo (SB16State *s) 659 { 660 uint8_t lo = dsp_get_data (s); 661 uint8_t hi = dsp_get_data (s); 662 return (hi << 8) | lo; 663 } 664 665 static void complete (SB16State *s) 666 { 667 int d0, d1, d2; 668 ldebug ("complete command %#x, in_index %d, needed_bytes %d\n", 669 s->cmd, s->in_index, s->needed_bytes); 670 671 if (s->cmd > 0xaf && s->cmd < 0xd0) { 672 d2 = dsp_get_data (s); 673 d1 = dsp_get_data (s); 674 d0 = dsp_get_data (s); 675 676 if (s->cmd & 8) { 677 dolog ("ADC params cmd = %#x d0 = %d, d1 = %d, d2 = %d\n", 678 s->cmd, d0, d1, d2); 679 } 680 else { 681 ldebug ("cmd = %#x d0 = %d, d1 = %d, d2 = %d\n", 682 s->cmd, d0, d1, d2); 683 dma_cmd (s, s->cmd, d0, d1 + (d2 << 8)); 684 } 685 } 686 else { 687 switch (s->cmd) { 688 case 0x04: 689 s->csp_mode = dsp_get_data (s); 690 s->csp_reg83r = 0; 691 s->csp_reg83w = 0; 692 ldebug ("CSP command 0x04: mode=%#x\n", s->csp_mode); 693 break; 694 695 case 0x05: 696 s->csp_param = dsp_get_data (s); 697 s->csp_value = dsp_get_data (s); 698 ldebug ("CSP command 0x05: param=%#x value=%#x\n", 699 s->csp_param, 700 s->csp_value); 701 break; 702 703 case 0x0e: 704 d0 = dsp_get_data (s); 705 d1 = dsp_get_data (s); 706 ldebug ("write CSP register %d <- %#x\n", d1, d0); 707 if (d1 == 0x83) { 708 ldebug ("0x83[%d] <- %#x\n", s->csp_reg83r, d0); 709 s->csp_reg83[s->csp_reg83r % 4] = d0; 710 s->csp_reg83r += 1; 711 } 712 else { 713 s->csp_regs[d1] = d0; 714 } 715 break; 716 717 case 0x0f: 718 d0 = dsp_get_data (s); 719 ldebug ("read CSP register %#x -> %#x, mode=%#x\n", 720 d0, s->csp_regs[d0], s->csp_mode); 721 if (d0 == 0x83) { 722 ldebug ("0x83[%d] -> %#x\n", 723 s->csp_reg83w, 724 s->csp_reg83[s->csp_reg83w % 4]); 725 dsp_out_data (s, s->csp_reg83[s->csp_reg83w % 4]); 726 s->csp_reg83w += 1; 727 } 728 else { 729 dsp_out_data (s, s->csp_regs[d0]); 730 } 731 break; 732 733 case 0x10: 734 d0 = dsp_get_data (s); 735 dolog ("cmd 0x10 d0=%#x\n", d0); 736 break; 737 738 case 0x14: 739 dma_cmd8 (s, 0, dsp_get_lohi (s) + 1); 740 break; 741 742 case 0x40: 743 s->time_const = dsp_get_data (s); 744 ldebug ("set time const %d\n", s->time_const); 745 break; 746 747 case 0x41: 748 case 0x42: 749 /* 750 * 0x41 is documented as setting the output sample rate, 751 * and 0x42 the input sample rate, but in fact SB16 hardware 752 * seems to have only a single sample rate under the hood, 753 * and FT2 sets output freq with this (go figure). Compare: 754 * http://homepages.cae.wisc.edu/~brodskye/sb16doc/sb16doc.html#SamplingRate 755 */ 756 s->freq = dsp_get_hilo (s); 757 ldebug ("set freq %d\n", s->freq); 758 break; 759 760 case 0x48: 761 s->block_size = dsp_get_lohi (s) + 1; 762 ldebug ("set dma block len %d\n", s->block_size); 763 break; 764 765 case 0x74: 766 case 0x75: 767 case 0x76: 768 case 0x77: 769 /* ADPCM stuff, ignore */ 770 break; 771 772 case 0x80: 773 { 774 int freq, samples, bytes; 775 int64_t ticks; 776 777 freq = s->freq > 0 ? s->freq : 11025; 778 samples = dsp_get_lohi (s) + 1; 779 bytes = samples << s->fmt_stereo << (s->fmt_bits == 16); 780 ticks = muldiv64(bytes, NANOSECONDS_PER_SECOND, freq); 781 if (ticks < NANOSECONDS_PER_SECOND / 1024) { 782 qemu_irq_raise (s->pic); 783 } 784 else { 785 if (s->aux_ts) { 786 timer_mod ( 787 s->aux_ts, 788 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + ticks 789 ); 790 } 791 } 792 ldebug ("mix silence %d %d %" PRId64 "\n", samples, bytes, ticks); 793 } 794 break; 795 796 case 0xe0: 797 d0 = dsp_get_data (s); 798 s->out_data_len = 0; 799 ldebug ("E0 data = %#x\n", d0); 800 dsp_out_data (s, ~d0); 801 break; 802 803 case 0xe2: 804 #ifdef DEBUG 805 d0 = dsp_get_data (s); 806 dolog ("E2 = %#x\n", d0); 807 #endif 808 break; 809 810 case 0xe4: 811 s->test_reg = dsp_get_data (s); 812 break; 813 814 case 0xf9: 815 d0 = dsp_get_data (s); 816 ldebug ("command 0xf9 with %#x\n", d0); 817 switch (d0) { 818 case 0x0e: 819 dsp_out_data (s, 0xff); 820 break; 821 822 case 0x0f: 823 dsp_out_data (s, 0x07); 824 break; 825 826 case 0x37: 827 dsp_out_data (s, 0x38); 828 break; 829 830 default: 831 dsp_out_data (s, 0x00); 832 break; 833 } 834 break; 835 836 default: 837 qemu_log_mask(LOG_UNIMP, "complete: unrecognized command %#x\n", 838 s->cmd); 839 return; 840 } 841 } 842 843 ldebug ("\n"); 844 s->cmd = -1; 845 } 846 847 static void legacy_reset (SB16State *s) 848 { 849 struct audsettings as; 850 851 s->freq = 11025; 852 s->fmt_signed = 0; 853 s->fmt_bits = 8; 854 s->fmt_stereo = 0; 855 856 as.freq = s->freq; 857 as.nchannels = 1; 858 as.fmt = AUDIO_FORMAT_U8; 859 as.endianness = 0; 860 861 s->voice = AUD_open_out ( 862 &s->card, 863 s->voice, 864 "sb16", 865 s, 866 SB_audio_callback, 867 &as 868 ); 869 870 /* Not sure about that... */ 871 /* AUD_set_active_out (s->voice, 1); */ 872 } 873 874 static void reset (SB16State *s) 875 { 876 qemu_irq_lower (s->pic); 877 if (s->dma_auto) { 878 qemu_irq_raise (s->pic); 879 qemu_irq_lower (s->pic); 880 } 881 882 s->mixer_regs[0x82] = 0; 883 s->dma_auto = 0; 884 s->in_index = 0; 885 s->out_data_len = 0; 886 s->left_till_irq = 0; 887 s->needed_bytes = 0; 888 s->block_size = -1; 889 s->nzero = 0; 890 s->highspeed = 0; 891 s->v2x6 = 0; 892 s->cmd = -1; 893 894 dsp_out_data (s, 0xaa); 895 speaker (s, 0); 896 control (s, 0); 897 legacy_reset (s); 898 } 899 900 static void dsp_write(void *opaque, uint32_t nport, uint32_t val) 901 { 902 SB16State *s = opaque; 903 int iport; 904 905 iport = nport - s->port; 906 907 ldebug ("write %#x <- %#x\n", nport, val); 908 switch (iport) { 909 case 0x06: 910 switch (val) { 911 case 0x00: 912 if (s->v2x6 == 1) { 913 reset (s); 914 } 915 s->v2x6 = 0; 916 break; 917 918 case 0x01: 919 case 0x03: /* FreeBSD kludge */ 920 s->v2x6 = 1; 921 break; 922 923 case 0xc6: 924 s->v2x6 = 0; /* Prince of Persia, csp.sys, diagnose.exe */ 925 break; 926 927 case 0xb8: /* Panic */ 928 reset (s); 929 break; 930 931 case 0x39: 932 dsp_out_data (s, 0x38); 933 reset (s); 934 s->v2x6 = 0x39; 935 break; 936 937 default: 938 s->v2x6 = val; 939 break; 940 } 941 break; 942 943 case 0x0c: /* write data or command | write status */ 944 /* if (s->highspeed) */ 945 /* break; */ 946 947 if (s->needed_bytes == 0) { 948 command (s, val); 949 #if 0 950 if (0 == s->needed_bytes) { 951 log_dsp (s); 952 } 953 #endif 954 } 955 else { 956 if (s->in_index == sizeof (s->in2_data)) { 957 dolog ("in data overrun\n"); 958 } 959 else { 960 s->in2_data[s->in_index++] = val; 961 if (s->in_index == s->needed_bytes) { 962 s->needed_bytes = 0; 963 complete (s); 964 #if 0 965 log_dsp (s); 966 #endif 967 } 968 } 969 } 970 break; 971 972 default: 973 ldebug ("(nport=%#x, val=%#x)\n", nport, val); 974 break; 975 } 976 } 977 978 static uint32_t dsp_read(void *opaque, uint32_t nport) 979 { 980 SB16State *s = opaque; 981 int iport, retval, ack = 0; 982 983 iport = nport - s->port; 984 985 switch (iport) { 986 case 0x06: /* reset */ 987 retval = 0xff; 988 break; 989 990 case 0x0a: /* read data */ 991 if (s->out_data_len) { 992 retval = s->out_data[--s->out_data_len]; 993 s->last_read_byte = retval; 994 } 995 else { 996 if (s->cmd != -1) { 997 dolog ("empty output buffer for command %#x\n", 998 s->cmd); 999 } 1000 retval = s->last_read_byte; 1001 /* goto error; */ 1002 } 1003 break; 1004 1005 case 0x0c: /* 0 can write */ 1006 retval = s->can_write ? 0 : 0x80; 1007 break; 1008 1009 case 0x0d: /* timer interrupt clear */ 1010 /* dolog ("timer interrupt clear\n"); */ 1011 retval = 0; 1012 break; 1013 1014 case 0x0e: /* data available status | irq 8 ack */ 1015 retval = (!s->out_data_len || s->highspeed) ? 0 : 0x80; 1016 if (s->mixer_regs[0x82] & 1) { 1017 ack = 1; 1018 s->mixer_regs[0x82] &= ~1; 1019 qemu_irq_lower (s->pic); 1020 } 1021 break; 1022 1023 case 0x0f: /* irq 16 ack */ 1024 retval = 0xff; 1025 if (s->mixer_regs[0x82] & 2) { 1026 ack = 1; 1027 s->mixer_regs[0x82] &= ~2; 1028 qemu_irq_lower (s->pic); 1029 } 1030 break; 1031 1032 default: 1033 goto error; 1034 } 1035 1036 if (!ack) { 1037 ldebug ("read %#x -> %#x\n", nport, retval); 1038 } 1039 1040 return retval; 1041 1042 error: 1043 dolog ("warning: dsp_read %#x error\n", nport); 1044 return 0xff; 1045 } 1046 1047 static void reset_mixer (SB16State *s) 1048 { 1049 int i; 1050 1051 memset (s->mixer_regs, 0xff, 0x7f); 1052 memset (s->mixer_regs + 0x83, 0xff, sizeof (s->mixer_regs) - 0x83); 1053 1054 s->mixer_regs[0x02] = 4; /* master volume 3bits */ 1055 s->mixer_regs[0x06] = 4; /* MIDI volume 3bits */ 1056 s->mixer_regs[0x08] = 0; /* CD volume 3bits */ 1057 s->mixer_regs[0x0a] = 0; /* voice volume 2bits */ 1058 1059 /* d5=input filt, d3=lowpass filt, d1,d2=input source */ 1060 s->mixer_regs[0x0c] = 0; 1061 1062 /* d5=output filt, d1=stereo switch */ 1063 s->mixer_regs[0x0e] = 0; 1064 1065 /* voice volume L d5,d7, R d1,d3 */ 1066 s->mixer_regs[0x04] = (4 << 5) | (4 << 1); 1067 /* master ... */ 1068 s->mixer_regs[0x22] = (4 << 5) | (4 << 1); 1069 /* MIDI ... */ 1070 s->mixer_regs[0x26] = (4 << 5) | (4 << 1); 1071 1072 for (i = 0x30; i < 0x48; i++) { 1073 s->mixer_regs[i] = 0x20; 1074 } 1075 } 1076 1077 static void mixer_write_indexb(void *opaque, uint32_t nport, uint32_t val) 1078 { 1079 SB16State *s = opaque; 1080 (void) nport; 1081 s->mixer_nreg = val; 1082 } 1083 1084 static void mixer_write_datab(void *opaque, uint32_t nport, uint32_t val) 1085 { 1086 SB16State *s = opaque; 1087 1088 (void) nport; 1089 ldebug ("mixer_write [%#x] <- %#x\n", s->mixer_nreg, val); 1090 1091 switch (s->mixer_nreg) { 1092 case 0x00: 1093 reset_mixer (s); 1094 break; 1095 1096 case 0x80: 1097 { 1098 int irq = irq_of_magic (val); 1099 ldebug ("setting irq to %d (val=%#x)\n", irq, val); 1100 if (irq > 0) { 1101 s->irq = irq; 1102 } 1103 } 1104 break; 1105 1106 case 0x81: 1107 { 1108 int dma, hdma; 1109 1110 dma = ctz32 (val & 0xf); 1111 hdma = ctz32 (val & 0xf0); 1112 if (dma != s->dma || hdma != s->hdma) { 1113 qemu_log_mask(LOG_GUEST_ERROR, "attempt to change DMA 8bit" 1114 " %d(%d), 16bit %d(%d) (val=%#x)\n", dma, s->dma, 1115 hdma, s->hdma, val); 1116 } 1117 #if 0 1118 s->dma = dma; 1119 s->hdma = hdma; 1120 #endif 1121 } 1122 break; 1123 1124 case 0x82: 1125 qemu_log_mask(LOG_GUEST_ERROR, "attempt to write into IRQ status" 1126 " register (val=%#x)\n", val); 1127 return; 1128 1129 default: 1130 if (s->mixer_nreg >= 0x80) { 1131 ldebug ("attempt to write mixer[%#x] <- %#x\n", s->mixer_nreg, val); 1132 } 1133 break; 1134 } 1135 1136 s->mixer_regs[s->mixer_nreg] = val; 1137 } 1138 1139 static uint32_t mixer_read(void *opaque, uint32_t nport) 1140 { 1141 SB16State *s = opaque; 1142 1143 (void) nport; 1144 #ifndef DEBUG_SB16_MOST 1145 if (s->mixer_nreg != 0x82) { 1146 ldebug ("mixer_read[%#x] -> %#x\n", 1147 s->mixer_nreg, s->mixer_regs[s->mixer_nreg]); 1148 } 1149 #else 1150 ldebug ("mixer_read[%#x] -> %#x\n", 1151 s->mixer_nreg, s->mixer_regs[s->mixer_nreg]); 1152 #endif 1153 return s->mixer_regs[s->mixer_nreg]; 1154 } 1155 1156 static int write_audio (SB16State *s, int nchan, int dma_pos, 1157 int dma_len, int len) 1158 { 1159 IsaDma *isa_dma = nchan == s->dma ? s->isa_dma : s->isa_hdma; 1160 IsaDmaClass *k = ISADMA_GET_CLASS(isa_dma); 1161 int temp, net; 1162 uint8_t tmpbuf[4096]; 1163 1164 temp = len; 1165 net = 0; 1166 1167 while (temp) { 1168 int left = dma_len - dma_pos; 1169 int copied; 1170 size_t to_copy; 1171 1172 to_copy = audio_MIN (temp, left); 1173 if (to_copy > sizeof (tmpbuf)) { 1174 to_copy = sizeof (tmpbuf); 1175 } 1176 1177 copied = k->read_memory(isa_dma, nchan, tmpbuf, dma_pos, to_copy); 1178 copied = AUD_write (s->voice, tmpbuf, copied); 1179 1180 temp -= copied; 1181 dma_pos = (dma_pos + copied) % dma_len; 1182 net += copied; 1183 1184 if (!copied) { 1185 break; 1186 } 1187 } 1188 1189 return net; 1190 } 1191 1192 static int SB_read_DMA (void *opaque, int nchan, int dma_pos, int dma_len) 1193 { 1194 SB16State *s = opaque; 1195 int till, copy, written, free; 1196 1197 if (s->block_size <= 0) { 1198 qemu_log_mask(LOG_GUEST_ERROR, "invalid block size=%d nchan=%d" 1199 " dma_pos=%d dma_len=%d\n", s->block_size, nchan, 1200 dma_pos, dma_len); 1201 return dma_pos; 1202 } 1203 1204 if (s->left_till_irq < 0) { 1205 s->left_till_irq = s->block_size; 1206 } 1207 1208 if (s->voice) { 1209 free = s->audio_free & ~s->align; 1210 if ((free <= 0) || !dma_len) { 1211 return dma_pos; 1212 } 1213 } 1214 else { 1215 free = dma_len; 1216 } 1217 1218 copy = free; 1219 till = s->left_till_irq; 1220 1221 #ifdef DEBUG_SB16_MOST 1222 dolog ("pos:%06d %d till:%d len:%d\n", 1223 dma_pos, free, till, dma_len); 1224 #endif 1225 1226 if (till <= copy) { 1227 if (s->dma_auto == 0) { 1228 copy = till; 1229 } 1230 } 1231 1232 written = write_audio (s, nchan, dma_pos, dma_len, copy); 1233 dma_pos = (dma_pos + written) % dma_len; 1234 s->left_till_irq -= written; 1235 1236 if (s->left_till_irq <= 0) { 1237 s->mixer_regs[0x82] |= (nchan & 4) ? 2 : 1; 1238 qemu_irq_raise (s->pic); 1239 if (s->dma_auto == 0) { 1240 control (s, 0); 1241 speaker (s, 0); 1242 } 1243 } 1244 1245 #ifdef DEBUG_SB16_MOST 1246 ldebug ("pos %5d free %5d size %5d till % 5d copy %5d written %5d size %5d\n", 1247 dma_pos, free, dma_len, s->left_till_irq, copy, written, 1248 s->block_size); 1249 #endif 1250 1251 while (s->left_till_irq <= 0) { 1252 s->left_till_irq = s->block_size + s->left_till_irq; 1253 } 1254 1255 return dma_pos; 1256 } 1257 1258 static void SB_audio_callback (void *opaque, int free) 1259 { 1260 SB16State *s = opaque; 1261 s->audio_free = free; 1262 } 1263 1264 static int sb16_post_load (void *opaque, int version_id) 1265 { 1266 SB16State *s = opaque; 1267 1268 if (s->voice) { 1269 AUD_close_out (&s->card, s->voice); 1270 s->voice = NULL; 1271 } 1272 1273 if (s->dma_running) { 1274 if (s->freq) { 1275 struct audsettings as; 1276 1277 s->audio_free = 0; 1278 1279 as.freq = s->freq; 1280 as.nchannels = 1 << s->fmt_stereo; 1281 as.fmt = s->fmt; 1282 as.endianness = 0; 1283 1284 s->voice = AUD_open_out ( 1285 &s->card, 1286 s->voice, 1287 "sb16", 1288 s, 1289 SB_audio_callback, 1290 &as 1291 ); 1292 } 1293 1294 control (s, 1); 1295 speaker (s, s->speaker); 1296 } 1297 return 0; 1298 } 1299 1300 static const VMStateDescription vmstate_sb16 = { 1301 .name = "sb16", 1302 .version_id = 1, 1303 .minimum_version_id = 1, 1304 .post_load = sb16_post_load, 1305 .fields = (VMStateField[]) { 1306 VMSTATE_UINT32 (irq, SB16State), 1307 VMSTATE_UINT32 (dma, SB16State), 1308 VMSTATE_UINT32 (hdma, SB16State), 1309 VMSTATE_UINT32 (port, SB16State), 1310 VMSTATE_UINT32 (ver, SB16State), 1311 VMSTATE_INT32 (in_index, SB16State), 1312 VMSTATE_INT32 (out_data_len, SB16State), 1313 VMSTATE_INT32 (fmt_stereo, SB16State), 1314 VMSTATE_INT32 (fmt_signed, SB16State), 1315 VMSTATE_INT32 (fmt_bits, SB16State), 1316 VMSTATE_UINT32 (fmt, SB16State), 1317 VMSTATE_INT32 (dma_auto, SB16State), 1318 VMSTATE_INT32 (block_size, SB16State), 1319 VMSTATE_INT32 (fifo, SB16State), 1320 VMSTATE_INT32 (freq, SB16State), 1321 VMSTATE_INT32 (time_const, SB16State), 1322 VMSTATE_INT32 (speaker, SB16State), 1323 VMSTATE_INT32 (needed_bytes, SB16State), 1324 VMSTATE_INT32 (cmd, SB16State), 1325 VMSTATE_INT32 (use_hdma, SB16State), 1326 VMSTATE_INT32 (highspeed, SB16State), 1327 VMSTATE_INT32 (can_write, SB16State), 1328 VMSTATE_INT32 (v2x6, SB16State), 1329 1330 VMSTATE_UINT8 (csp_param, SB16State), 1331 VMSTATE_UINT8 (csp_value, SB16State), 1332 VMSTATE_UINT8 (csp_mode, SB16State), 1333 VMSTATE_UINT8 (csp_param, SB16State), 1334 VMSTATE_BUFFER (csp_regs, SB16State), 1335 VMSTATE_UINT8 (csp_index, SB16State), 1336 VMSTATE_BUFFER (csp_reg83, SB16State), 1337 VMSTATE_INT32 (csp_reg83r, SB16State), 1338 VMSTATE_INT32 (csp_reg83w, SB16State), 1339 1340 VMSTATE_BUFFER (in2_data, SB16State), 1341 VMSTATE_BUFFER (out_data, SB16State), 1342 VMSTATE_UINT8 (test_reg, SB16State), 1343 VMSTATE_UINT8 (last_read_byte, SB16State), 1344 1345 VMSTATE_INT32 (nzero, SB16State), 1346 VMSTATE_INT32 (left_till_irq, SB16State), 1347 VMSTATE_INT32 (dma_running, SB16State), 1348 VMSTATE_INT32 (bytes_per_second, SB16State), 1349 VMSTATE_INT32 (align, SB16State), 1350 1351 VMSTATE_INT32 (mixer_nreg, SB16State), 1352 VMSTATE_BUFFER (mixer_regs, SB16State), 1353 1354 VMSTATE_END_OF_LIST () 1355 } 1356 }; 1357 1358 static const MemoryRegionPortio sb16_ioport_list[] = { 1359 { 4, 1, 1, .write = mixer_write_indexb }, 1360 { 5, 1, 1, .read = mixer_read, .write = mixer_write_datab }, 1361 { 6, 1, 1, .read = dsp_read, .write = dsp_write }, 1362 { 10, 1, 1, .read = dsp_read }, 1363 { 12, 1, 1, .write = dsp_write }, 1364 { 12, 4, 1, .read = dsp_read }, 1365 PORTIO_END_OF_LIST (), 1366 }; 1367 1368 1369 static void sb16_initfn (Object *obj) 1370 { 1371 SB16State *s = SB16 (obj); 1372 1373 s->cmd = -1; 1374 } 1375 1376 static void sb16_realizefn (DeviceState *dev, Error **errp) 1377 { 1378 ISADevice *isadev = ISA_DEVICE (dev); 1379 SB16State *s = SB16 (dev); 1380 IsaDmaClass *k; 1381 1382 s->isa_hdma = isa_get_dma(isa_bus_from_device(isadev), s->hdma); 1383 s->isa_dma = isa_get_dma(isa_bus_from_device(isadev), s->dma); 1384 if (!s->isa_dma || !s->isa_hdma) { 1385 error_setg(errp, "ISA controller does not support DMA"); 1386 return; 1387 } 1388 1389 isa_init_irq (isadev, &s->pic, s->irq); 1390 1391 s->mixer_regs[0x80] = magic_of_irq (s->irq); 1392 s->mixer_regs[0x81] = (1 << s->dma) | (1 << s->hdma); 1393 s->mixer_regs[0x82] = 2 << 5; 1394 1395 s->csp_regs[5] = 1; 1396 s->csp_regs[9] = 0xf8; 1397 1398 reset_mixer (s); 1399 s->aux_ts = timer_new_ns(QEMU_CLOCK_VIRTUAL, aux_timer, s); 1400 if (!s->aux_ts) { 1401 error_setg(errp, "warning: Could not create auxiliary timer"); 1402 } 1403 1404 isa_register_portio_list(isadev, &s->portio_list, s->port, 1405 sb16_ioport_list, s, "sb16"); 1406 1407 k = ISADMA_GET_CLASS(s->isa_hdma); 1408 k->register_channel(s->isa_hdma, s->hdma, SB_read_DMA, s); 1409 1410 k = ISADMA_GET_CLASS(s->isa_dma); 1411 k->register_channel(s->isa_dma, s->dma, SB_read_DMA, s); 1412 1413 s->can_write = 1; 1414 1415 AUD_register_card ("sb16", &s->card); 1416 } 1417 1418 static int SB16_init (ISABus *bus) 1419 { 1420 isa_create_simple (bus, TYPE_SB16); 1421 return 0; 1422 } 1423 1424 static Property sb16_properties[] = { 1425 DEFINE_PROP_UINT32 ("version", SB16State, ver, 0x0405), /* 4.5 */ 1426 DEFINE_PROP_UINT32 ("iobase", SB16State, port, 0x220), 1427 DEFINE_PROP_UINT32 ("irq", SB16State, irq, 5), 1428 DEFINE_PROP_UINT32 ("dma", SB16State, dma, 1), 1429 DEFINE_PROP_UINT32 ("dma16", SB16State, hdma, 5), 1430 DEFINE_PROP_END_OF_LIST (), 1431 }; 1432 1433 static void sb16_class_initfn (ObjectClass *klass, void *data) 1434 { 1435 DeviceClass *dc = DEVICE_CLASS (klass); 1436 1437 dc->realize = sb16_realizefn; 1438 set_bit(DEVICE_CATEGORY_SOUND, dc->categories); 1439 dc->desc = "Creative Sound Blaster 16"; 1440 dc->vmsd = &vmstate_sb16; 1441 dc->props = sb16_properties; 1442 } 1443 1444 static const TypeInfo sb16_info = { 1445 .name = TYPE_SB16, 1446 .parent = TYPE_ISA_DEVICE, 1447 .instance_size = sizeof (SB16State), 1448 .instance_init = sb16_initfn, 1449 .class_init = sb16_class_initfn, 1450 }; 1451 1452 static void sb16_register_types (void) 1453 { 1454 type_register_static (&sb16_info); 1455 isa_register_soundhw("sb16", "Creative Sound Blaster 16", SB16_init); 1456 } 1457 1458 type_init (sb16_register_types) 1459