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