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