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