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