2 * QEMU Soundblaster 16 emulation
4 * Copyright (c) 2003-2005 Vassili Karpov (malc)
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:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
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
25 #include "qemu/osdep.h"
27 #include "hw/audio/soundhw.h"
28 #include "audio/audio.h"
29 #include "hw/isa/isa.h"
31 #include "qemu/timer.h"
32 #include "qemu/host-utils.h"
34 #include "qemu/module.h"
35 #include "qapi/error.h"
37 #define dolog(...) AUD_log ("sb16", __VA_ARGS__)
40 /* #define DEBUG_SB16_MOST */
43 #define ldebug(...) dolog (__VA_ARGS__)
48 static const char e3
[] = "COPYRIGHT (C) CREATIVE TECHNOLOGY LTD, 1992.";
50 #define TYPE_SB16 "sb16"
51 #define SB16(obj) OBJECT_CHECK (SB16State, (obj), TYPE_SB16)
53 typedef struct SB16State
{
89 uint8_t csp_regs
[256];
98 uint8_t last_read_byte
;
104 int bytes_per_second
;
112 uint8_t mixer_regs
[256];
113 PortioList portio_list
;
116 static void SB_audio_callback (void *opaque
, int free
);
118 static int magic_of_irq (int irq
)
130 qemu_log_mask(LOG_GUEST_ERROR
, "bad irq %d\n", irq
);
135 static int irq_of_magic (int magic
)
147 qemu_log_mask(LOG_GUEST_ERROR
, "bad irq magic %d\n", magic
);
153 static void log_dsp (SB16State
*dsp
)
155 ldebug ("%s:%s:%d:%s:dmasize=%d:freq=%d:const=%d:speaker=%d\n",
156 dsp
->fmt_stereo
? "Stereo" : "Mono",
157 dsp
->fmt_signed
? "Signed" : "Unsigned",
159 dsp
->dma_auto
? "Auto" : "Single",
167 static void speaker (SB16State
*s
, int on
)
170 /* AUD_enable (s->voice, on); */
173 static void control (SB16State
*s
, int hold
)
175 int dma
= s
->use_hdma
? s
->hdma
: s
->dma
;
176 IsaDma
*isa_dma
= s
->use_hdma
? s
->isa_hdma
: s
->isa_dma
;
177 IsaDmaClass
*k
= ISADMA_GET_CLASS(isa_dma
);
178 s
->dma_running
= hold
;
180 ldebug ("hold %d high %d dma %d\n", hold
, s
->use_hdma
, dma
);
183 k
->hold_DREQ(isa_dma
, dma
);
184 AUD_set_active_out (s
->voice
, 1);
187 k
->release_DREQ(isa_dma
, dma
);
188 AUD_set_active_out (s
->voice
, 0);
192 static void aux_timer (void *opaque
)
194 SB16State
*s
= opaque
;
196 qemu_irq_raise (s
->pic
);
202 static void continue_dma8 (SB16State
*s
)
205 struct audsettings as
;
210 as
.nchannels
= 1 << s
->fmt_stereo
;
214 s
->voice
= AUD_open_out (
227 static void dma_cmd8 (SB16State
*s
, int mask
, int dma_len
)
229 s
->fmt
= AUDIO_FORMAT_U8
;
233 s
->fmt_stereo
= (s
->mixer_regs
[0x0e] & 2) != 0;
234 if (-1 == s
->time_const
) {
239 int tmp
= (256 - s
->time_const
);
240 s
->freq
= (1000000 + (tmp
/ 2)) / tmp
;
244 s
->block_size
= dma_len
<< s
->fmt_stereo
;
247 /* This is apparently the only way to make both Act1/PL
248 and SecondReality/FC work
250 Act1 sets block size via command 0x48 and it's an odd number
251 SR does the same with even number
252 Both use stereo, and Creatives own documentation states that
253 0x48 sets block size in bytes less one.. go figure */
254 s
->block_size
&= ~s
->fmt_stereo
;
257 s
->freq
>>= s
->fmt_stereo
;
258 s
->left_till_irq
= s
->block_size
;
259 s
->bytes_per_second
= (s
->freq
<< s
->fmt_stereo
);
260 /* s->highspeed = (mask & DMA8_HIGH) != 0; */
261 s
->dma_auto
= (mask
& DMA8_AUTO
) != 0;
262 s
->align
= (1 << s
->fmt_stereo
) - 1;
264 if (s
->block_size
& s
->align
) {
265 qemu_log_mask(LOG_GUEST_ERROR
, "warning: misaligned block size %d,"
266 " alignment %d\n", s
->block_size
, s
->align
+ 1);
269 ldebug ("freq %d, stereo %d, sign %d, bits %d, "
270 "dma %d, auto %d, fifo %d, high %d\n",
271 s
->freq
, s
->fmt_stereo
, s
->fmt_signed
, s
->fmt_bits
,
272 s
->block_size
, s
->dma_auto
, s
->fifo
, s
->highspeed
);
278 static void dma_cmd (SB16State
*s
, uint8_t cmd
, uint8_t d0
, int dma_len
)
280 s
->use_hdma
= cmd
< 0xc0;
281 s
->fifo
= (cmd
>> 1) & 1;
282 s
->dma_auto
= (cmd
>> 2) & 1;
283 s
->fmt_signed
= (d0
>> 4) & 1;
284 s
->fmt_stereo
= (d0
>> 5) & 1;
296 if (-1 != s
->time_const
) {
298 int tmp
= 256 - s
->time_const
;
299 s
->freq
= (1000000 + (tmp
/ 2)) / tmp
;
301 /* s->freq = 1000000 / ((255 - s->time_const) << s->fmt_stereo); */
302 s
->freq
= 1000000 / ((255 - s
->time_const
));
307 s
->block_size
= dma_len
+ 1;
308 s
->block_size
<<= (s
->fmt_bits
== 16);
310 /* It is clear that for DOOM and auto-init this value
311 shouldn't take stereo into account, while Miles Sound Systems
312 setsound.exe with single transfer mode wouldn't work without it
313 wonders of SB16 yet again */
314 s
->block_size
<<= s
->fmt_stereo
;
317 ldebug ("freq %d, stereo %d, sign %d, bits %d, "
318 "dma %d, auto %d, fifo %d, high %d\n",
319 s
->freq
, s
->fmt_stereo
, s
->fmt_signed
, s
->fmt_bits
,
320 s
->block_size
, s
->dma_auto
, s
->fifo
, s
->highspeed
);
322 if (16 == s
->fmt_bits
) {
324 s
->fmt
= AUDIO_FORMAT_S16
;
327 s
->fmt
= AUDIO_FORMAT_U16
;
332 s
->fmt
= AUDIO_FORMAT_S8
;
335 s
->fmt
= AUDIO_FORMAT_U8
;
339 s
->left_till_irq
= s
->block_size
;
341 s
->bytes_per_second
= (s
->freq
<< s
->fmt_stereo
) << (s
->fmt_bits
== 16);
343 s
->align
= (1 << (s
->fmt_stereo
+ (s
->fmt_bits
== 16))) - 1;
344 if (s
->block_size
& s
->align
) {
345 qemu_log_mask(LOG_GUEST_ERROR
, "warning: misaligned block size %d,"
346 " alignment %d\n", s
->block_size
, s
->align
+ 1);
350 struct audsettings as
;
355 as
.nchannels
= 1 << s
->fmt_stereo
;
359 s
->voice
= AUD_open_out (
373 static inline void dsp_out_data (SB16State
*s
, uint8_t val
)
375 ldebug ("outdata %#x\n", val
);
376 if ((size_t) s
->out_data_len
< sizeof (s
->out_data
)) {
377 s
->out_data
[s
->out_data_len
++] = val
;
381 static inline uint8_t dsp_get_data (SB16State
*s
)
384 return s
->in2_data
[--s
->in_index
];
387 dolog ("buffer underflow\n");
392 static void command (SB16State
*s
, uint8_t cmd
)
394 ldebug ("command %#x\n", cmd
);
396 if (cmd
> 0xaf && cmd
< 0xd0) {
398 qemu_log_mask(LOG_UNIMP
, "ADC not yet supported (command %#x)\n",
407 qemu_log_mask(LOG_GUEST_ERROR
, "%#x wrong bits\n", cmd
);
416 dsp_out_data (s
, 0x10); /* s->csp_param); */
428 /* __asm__ ("int3"); */
436 dsp_out_data (s
, 0xf8);
452 case 0x1c: /* Auto-Initialize DMA DAC, 8-bit */
453 dma_cmd8 (s
, DMA8_AUTO
, -1);
456 case 0x20: /* Direct ADC, Juice/PL */
457 dsp_out_data (s
, 0xff);
461 qemu_log_mask(LOG_UNIMP
, "0x35 - MIDI command not implemented\n");
483 dsp_out_data (s
, 0xaa);
486 case 0x47: /* Continue Auto-Initialize DMA 16bit */
494 s
->needed_bytes
= 2; /* DMA DAC, 4-bit ADPCM */
495 qemu_log_mask(LOG_UNIMP
, "0x75 - DMA DAC, 4-bit ADPCM not"
499 case 0x75: /* DMA DAC, 4-bit ADPCM Reference */
501 qemu_log_mask(LOG_UNIMP
, "0x74 - DMA DAC, 4-bit ADPCM Reference not"
505 case 0x76: /* DMA DAC, 2.6-bit ADPCM */
507 qemu_log_mask(LOG_UNIMP
, "0x74 - DMA DAC, 2.6-bit ADPCM not"
511 case 0x77: /* DMA DAC, 2.6-bit ADPCM Reference */
513 qemu_log_mask(LOG_UNIMP
, "0x74 - DMA DAC, 2.6-bit ADPCM Reference"
514 " not implemented\n");
518 qemu_log_mask(LOG_UNIMP
, "0x7d - Autio-Initialize DMA DAC, 4-bit"
519 " ADPCM Reference\n");
520 qemu_log_mask(LOG_UNIMP
, "not implemented\n");
524 qemu_log_mask(LOG_UNIMP
, "0x7d - Autio-Initialize DMA DAC, 2.6-bit"
525 " ADPCM Reference\n");
526 qemu_log_mask(LOG_UNIMP
, "not implemented\n");
535 dma_cmd8 (s
, ((cmd
& 1) == 0) | DMA8_HIGH
, -1);
538 case 0xd0: /* halt DMA operation. 8bit */
542 case 0xd1: /* speaker on */
546 case 0xd3: /* speaker off */
550 case 0xd4: /* continue DMA operation. 8bit */
551 /* KQ6 (or maybe Sierras audblst.drv in general) resets
552 the frequency between halt/continue */
556 case 0xd5: /* halt DMA operation. 16bit */
560 case 0xd6: /* continue DMA operation. 16bit */
564 case 0xd9: /* exit auto-init DMA after this block. 16bit */
568 case 0xda: /* exit auto-init DMA after this block. 8bit */
572 case 0xe0: /* DSP identification */
577 dsp_out_data (s
, s
->ver
& 0xff);
578 dsp_out_data (s
, s
->ver
>> 8);
588 for (i
= sizeof (e3
) - 1; i
>= 0; --i
)
589 dsp_out_data (s
, e3
[i
]);
593 case 0xe4: /* write test reg */
598 qemu_log_mask(LOG_UNIMP
, "Attempt to probe for ESS (0xe7)?\n");
601 case 0xe8: /* read test reg */
602 dsp_out_data (s
, s
->test_reg
);
607 dsp_out_data (s
, 0xaa);
608 s
->mixer_regs
[0x82] |= (cmd
== 0xf2) ? 1 : 2;
609 qemu_irq_raise (s
->pic
);
620 case 0xfc: /* FIXME */
625 qemu_log_mask(LOG_UNIMP
, "Unrecognized command %#x\n", cmd
);
630 if (!s
->needed_bytes
) {
635 if (!s
->needed_bytes
) {
644 qemu_log_mask(LOG_UNIMP
, "warning: command %#x,%d is not truly understood"
645 " yet\n", cmd
, s
->needed_bytes
);
650 static uint16_t dsp_get_lohi (SB16State
*s
)
652 uint8_t hi
= dsp_get_data (s
);
653 uint8_t lo
= dsp_get_data (s
);
654 return (hi
<< 8) | lo
;
657 static uint16_t dsp_get_hilo (SB16State
*s
)
659 uint8_t lo
= dsp_get_data (s
);
660 uint8_t hi
= dsp_get_data (s
);
661 return (hi
<< 8) | lo
;
664 static void complete (SB16State
*s
)
667 ldebug ("complete command %#x, in_index %d, needed_bytes %d\n",
668 s
->cmd
, s
->in_index
, s
->needed_bytes
);
670 if (s
->cmd
> 0xaf && s
->cmd
< 0xd0) {
671 d2
= dsp_get_data (s
);
672 d1
= dsp_get_data (s
);
673 d0
= dsp_get_data (s
);
676 dolog ("ADC params cmd = %#x d0 = %d, d1 = %d, d2 = %d\n",
680 ldebug ("cmd = %#x d0 = %d, d1 = %d, d2 = %d\n",
682 dma_cmd (s
, s
->cmd
, d0
, d1
+ (d2
<< 8));
688 s
->csp_mode
= dsp_get_data (s
);
691 ldebug ("CSP command 0x04: mode=%#x\n", s
->csp_mode
);
695 s
->csp_param
= dsp_get_data (s
);
696 s
->csp_value
= dsp_get_data (s
);
697 ldebug ("CSP command 0x05: param=%#x value=%#x\n",
703 d0
= dsp_get_data (s
);
704 d1
= dsp_get_data (s
);
705 ldebug ("write CSP register %d <- %#x\n", d1
, d0
);
707 ldebug ("0x83[%d] <- %#x\n", s
->csp_reg83r
, d0
);
708 s
->csp_reg83
[s
->csp_reg83r
% 4] = d0
;
712 s
->csp_regs
[d1
] = d0
;
717 d0
= dsp_get_data (s
);
718 ldebug ("read CSP register %#x -> %#x, mode=%#x\n",
719 d0
, s
->csp_regs
[d0
], s
->csp_mode
);
721 ldebug ("0x83[%d] -> %#x\n",
723 s
->csp_reg83
[s
->csp_reg83w
% 4]);
724 dsp_out_data (s
, s
->csp_reg83
[s
->csp_reg83w
% 4]);
728 dsp_out_data (s
, s
->csp_regs
[d0
]);
733 d0
= dsp_get_data (s
);
734 dolog ("cmd 0x10 d0=%#x\n", d0
);
738 dma_cmd8 (s
, 0, dsp_get_lohi (s
) + 1);
742 s
->time_const
= dsp_get_data (s
);
743 ldebug ("set time const %d\n", s
->time_const
);
749 * 0x41 is documented as setting the output sample rate,
750 * and 0x42 the input sample rate, but in fact SB16 hardware
751 * seems to have only a single sample rate under the hood,
752 * and FT2 sets output freq with this (go figure). Compare:
753 * http://homepages.cae.wisc.edu/~brodskye/sb16doc/sb16doc.html#SamplingRate
755 s
->freq
= dsp_get_hilo (s
);
756 ldebug ("set freq %d\n", s
->freq
);
760 s
->block_size
= dsp_get_lohi (s
) + 1;
761 ldebug ("set dma block len %d\n", s
->block_size
);
768 /* ADPCM stuff, ignore */
773 int freq
, samples
, bytes
;
776 freq
= s
->freq
> 0 ? s
->freq
: 11025;
777 samples
= dsp_get_lohi (s
) + 1;
778 bytes
= samples
<< s
->fmt_stereo
<< (s
->fmt_bits
== 16);
779 ticks
= muldiv64(bytes
, NANOSECONDS_PER_SECOND
, freq
);
780 if (ticks
< NANOSECONDS_PER_SECOND
/ 1024) {
781 qemu_irq_raise (s
->pic
);
787 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL
) + ticks
791 ldebug ("mix silence %d %d %" PRId64
"\n", samples
, bytes
, ticks
);
796 d0
= dsp_get_data (s
);
798 ldebug ("E0 data = %#x\n", d0
);
799 dsp_out_data (s
, ~d0
);
804 d0
= dsp_get_data (s
);
805 dolog ("E2 = %#x\n", d0
);
810 s
->test_reg
= dsp_get_data (s
);
814 d0
= dsp_get_data (s
);
815 ldebug ("command 0xf9 with %#x\n", d0
);
818 dsp_out_data (s
, 0xff);
822 dsp_out_data (s
, 0x07);
826 dsp_out_data (s
, 0x38);
830 dsp_out_data (s
, 0x00);
836 qemu_log_mask(LOG_UNIMP
, "complete: unrecognized command %#x\n",
846 static void legacy_reset (SB16State
*s
)
848 struct audsettings as
;
857 as
.fmt
= AUDIO_FORMAT_U8
;
860 s
->voice
= AUD_open_out (
869 /* Not sure about that... */
870 /* AUD_set_active_out (s->voice, 1); */
873 static void reset (SB16State
*s
)
875 qemu_irq_lower (s
->pic
);
877 qemu_irq_raise (s
->pic
);
878 qemu_irq_lower (s
->pic
);
881 s
->mixer_regs
[0x82] = 0;
885 s
->left_till_irq
= 0;
893 dsp_out_data (s
, 0xaa);
899 static void dsp_write(void *opaque
, uint32_t nport
, uint32_t val
)
901 SB16State
*s
= opaque
;
904 iport
= nport
- s
->port
;
906 ldebug ("write %#x <- %#x\n", nport
, val
);
918 case 0x03: /* FreeBSD kludge */
923 s
->v2x6
= 0; /* Prince of Persia, csp.sys, diagnose.exe */
926 case 0xb8: /* Panic */
931 dsp_out_data (s
, 0x38);
942 case 0x0c: /* write data or command | write status */
943 /* if (s->highspeed) */
946 if (s
->needed_bytes
== 0) {
949 if (0 == s
->needed_bytes
) {
955 if (s
->in_index
== sizeof (s
->in2_data
)) {
956 dolog ("in data overrun\n");
959 s
->in2_data
[s
->in_index
++] = val
;
960 if (s
->in_index
== s
->needed_bytes
) {
972 ldebug ("(nport=%#x, val=%#x)\n", nport
, val
);
977 static uint32_t dsp_read(void *opaque
, uint32_t nport
)
979 SB16State
*s
= opaque
;
980 int iport
, retval
, ack
= 0;
982 iport
= nport
- s
->port
;
985 case 0x06: /* reset */
989 case 0x0a: /* read data */
990 if (s
->out_data_len
) {
991 retval
= s
->out_data
[--s
->out_data_len
];
992 s
->last_read_byte
= retval
;
996 dolog ("empty output buffer for command %#x\n",
999 retval
= s
->last_read_byte
;
1004 case 0x0c: /* 0 can write */
1005 retval
= s
->can_write
? 0 : 0x80;
1008 case 0x0d: /* timer interrupt clear */
1009 /* dolog ("timer interrupt clear\n"); */
1013 case 0x0e: /* data available status | irq 8 ack */
1014 retval
= (!s
->out_data_len
|| s
->highspeed
) ? 0 : 0x80;
1015 if (s
->mixer_regs
[0x82] & 1) {
1017 s
->mixer_regs
[0x82] &= ~1;
1018 qemu_irq_lower (s
->pic
);
1022 case 0x0f: /* irq 16 ack */
1024 if (s
->mixer_regs
[0x82] & 2) {
1026 s
->mixer_regs
[0x82] &= ~2;
1027 qemu_irq_lower (s
->pic
);
1036 ldebug ("read %#x -> %#x\n", nport
, retval
);
1042 dolog ("warning: dsp_read %#x error\n", nport
);
1046 static void reset_mixer (SB16State
*s
)
1050 memset (s
->mixer_regs
, 0xff, 0x7f);
1051 memset (s
->mixer_regs
+ 0x83, 0xff, sizeof (s
->mixer_regs
) - 0x83);
1053 s
->mixer_regs
[0x02] = 4; /* master volume 3bits */
1054 s
->mixer_regs
[0x06] = 4; /* MIDI volume 3bits */
1055 s
->mixer_regs
[0x08] = 0; /* CD volume 3bits */
1056 s
->mixer_regs
[0x0a] = 0; /* voice volume 2bits */
1058 /* d5=input filt, d3=lowpass filt, d1,d2=input source */
1059 s
->mixer_regs
[0x0c] = 0;
1061 /* d5=output filt, d1=stereo switch */
1062 s
->mixer_regs
[0x0e] = 0;
1064 /* voice volume L d5,d7, R d1,d3 */
1065 s
->mixer_regs
[0x04] = (4 << 5) | (4 << 1);
1067 s
->mixer_regs
[0x22] = (4 << 5) | (4 << 1);
1069 s
->mixer_regs
[0x26] = (4 << 5) | (4 << 1);
1071 for (i
= 0x30; i
< 0x48; i
++) {
1072 s
->mixer_regs
[i
] = 0x20;
1076 static void mixer_write_indexb(void *opaque
, uint32_t nport
, uint32_t val
)
1078 SB16State
*s
= opaque
;
1080 s
->mixer_nreg
= val
;
1083 static void mixer_write_datab(void *opaque
, uint32_t nport
, uint32_t val
)
1085 SB16State
*s
= opaque
;
1088 ldebug ("mixer_write [%#x] <- %#x\n", s
->mixer_nreg
, val
);
1090 switch (s
->mixer_nreg
) {
1097 int irq
= irq_of_magic (val
);
1098 ldebug ("setting irq to %d (val=%#x)\n", irq
, val
);
1109 dma
= ctz32 (val
& 0xf);
1110 hdma
= ctz32 (val
& 0xf0);
1111 if (dma
!= s
->dma
|| hdma
!= s
->hdma
) {
1112 qemu_log_mask(LOG_GUEST_ERROR
, "attempt to change DMA 8bit"
1113 " %d(%d), 16bit %d(%d) (val=%#x)\n", dma
, s
->dma
,
1114 hdma
, s
->hdma
, val
);
1124 qemu_log_mask(LOG_GUEST_ERROR
, "attempt to write into IRQ status"
1125 " register (val=%#x)\n", val
);
1129 if (s
->mixer_nreg
>= 0x80) {
1130 ldebug ("attempt to write mixer[%#x] <- %#x\n", s
->mixer_nreg
, val
);
1135 s
->mixer_regs
[s
->mixer_nreg
] = val
;
1138 static uint32_t mixer_read(void *opaque
, uint32_t nport
)
1140 SB16State
*s
= opaque
;
1143 #ifndef DEBUG_SB16_MOST
1144 if (s
->mixer_nreg
!= 0x82) {
1145 ldebug ("mixer_read[%#x] -> %#x\n",
1146 s
->mixer_nreg
, s
->mixer_regs
[s
->mixer_nreg
]);
1149 ldebug ("mixer_read[%#x] -> %#x\n",
1150 s
->mixer_nreg
, s
->mixer_regs
[s
->mixer_nreg
]);
1152 return s
->mixer_regs
[s
->mixer_nreg
];
1155 static int write_audio (SB16State
*s
, int nchan
, int dma_pos
,
1156 int dma_len
, int len
)
1158 IsaDma
*isa_dma
= nchan
== s
->dma
? s
->isa_dma
: s
->isa_hdma
;
1159 IsaDmaClass
*k
= ISADMA_GET_CLASS(isa_dma
);
1161 uint8_t tmpbuf
[4096];
1167 int left
= dma_len
- dma_pos
;
1171 to_copy
= audio_MIN (temp
, left
);
1172 if (to_copy
> sizeof (tmpbuf
)) {
1173 to_copy
= sizeof (tmpbuf
);
1176 copied
= k
->read_memory(isa_dma
, nchan
, tmpbuf
, dma_pos
, to_copy
);
1177 copied
= AUD_write (s
->voice
, tmpbuf
, copied
);
1180 dma_pos
= (dma_pos
+ copied
) % dma_len
;
1191 static int SB_read_DMA (void *opaque
, int nchan
, int dma_pos
, int dma_len
)
1193 SB16State
*s
= opaque
;
1194 int till
, copy
, written
, free
;
1196 if (s
->block_size
<= 0) {
1197 qemu_log_mask(LOG_GUEST_ERROR
, "invalid block size=%d nchan=%d"
1198 " dma_pos=%d dma_len=%d\n", s
->block_size
, nchan
,
1203 if (s
->left_till_irq
< 0) {
1204 s
->left_till_irq
= s
->block_size
;
1208 free
= s
->audio_free
& ~s
->align
;
1209 if ((free
<= 0) || !dma_len
) {
1218 till
= s
->left_till_irq
;
1220 #ifdef DEBUG_SB16_MOST
1221 dolog ("pos:%06d %d till:%d len:%d\n",
1222 dma_pos
, free
, till
, dma_len
);
1226 if (s
->dma_auto
== 0) {
1231 written
= write_audio (s
, nchan
, dma_pos
, dma_len
, copy
);
1232 dma_pos
= (dma_pos
+ written
) % dma_len
;
1233 s
->left_till_irq
-= written
;
1235 if (s
->left_till_irq
<= 0) {
1236 s
->mixer_regs
[0x82] |= (nchan
& 4) ? 2 : 1;
1237 qemu_irq_raise (s
->pic
);
1238 if (s
->dma_auto
== 0) {
1244 #ifdef DEBUG_SB16_MOST
1245 ldebug ("pos %5d free %5d size %5d till % 5d copy %5d written %5d size %5d\n",
1246 dma_pos
, free
, dma_len
, s
->left_till_irq
, copy
, written
,
1250 while (s
->left_till_irq
<= 0) {
1251 s
->left_till_irq
= s
->block_size
+ s
->left_till_irq
;
1257 static void SB_audio_callback (void *opaque
, int free
)
1259 SB16State
*s
= opaque
;
1260 s
->audio_free
= free
;
1263 static int sb16_post_load (void *opaque
, int version_id
)
1265 SB16State
*s
= opaque
;
1268 AUD_close_out (&s
->card
, s
->voice
);
1272 if (s
->dma_running
) {
1274 struct audsettings as
;
1279 as
.nchannels
= 1 << s
->fmt_stereo
;
1283 s
->voice
= AUD_open_out (
1294 speaker (s
, s
->speaker
);
1299 static const VMStateDescription vmstate_sb16
= {
1302 .minimum_version_id
= 1,
1303 .post_load
= sb16_post_load
,
1304 .fields
= (VMStateField
[]) {
1305 VMSTATE_UINT32 (irq
, SB16State
),
1306 VMSTATE_UINT32 (dma
, SB16State
),
1307 VMSTATE_UINT32 (hdma
, SB16State
),
1308 VMSTATE_UINT32 (port
, SB16State
),
1309 VMSTATE_UINT32 (ver
, SB16State
),
1310 VMSTATE_INT32 (in_index
, SB16State
),
1311 VMSTATE_INT32 (out_data_len
, SB16State
),
1312 VMSTATE_INT32 (fmt_stereo
, SB16State
),
1313 VMSTATE_INT32 (fmt_signed
, SB16State
),
1314 VMSTATE_INT32 (fmt_bits
, SB16State
),
1315 VMSTATE_UINT32 (fmt
, SB16State
),
1316 VMSTATE_INT32 (dma_auto
, SB16State
),
1317 VMSTATE_INT32 (block_size
, SB16State
),
1318 VMSTATE_INT32 (fifo
, SB16State
),
1319 VMSTATE_INT32 (freq
, SB16State
),
1320 VMSTATE_INT32 (time_const
, SB16State
),
1321 VMSTATE_INT32 (speaker
, SB16State
),
1322 VMSTATE_INT32 (needed_bytes
, SB16State
),
1323 VMSTATE_INT32 (cmd
, SB16State
),
1324 VMSTATE_INT32 (use_hdma
, SB16State
),
1325 VMSTATE_INT32 (highspeed
, SB16State
),
1326 VMSTATE_INT32 (can_write
, SB16State
),
1327 VMSTATE_INT32 (v2x6
, SB16State
),
1329 VMSTATE_UINT8 (csp_param
, SB16State
),
1330 VMSTATE_UINT8 (csp_value
, SB16State
),
1331 VMSTATE_UINT8 (csp_mode
, SB16State
),
1332 VMSTATE_UINT8 (csp_param
, SB16State
),
1333 VMSTATE_BUFFER (csp_regs
, SB16State
),
1334 VMSTATE_UINT8 (csp_index
, SB16State
),
1335 VMSTATE_BUFFER (csp_reg83
, SB16State
),
1336 VMSTATE_INT32 (csp_reg83r
, SB16State
),
1337 VMSTATE_INT32 (csp_reg83w
, SB16State
),
1339 VMSTATE_BUFFER (in2_data
, SB16State
),
1340 VMSTATE_BUFFER (out_data
, SB16State
),
1341 VMSTATE_UINT8 (test_reg
, SB16State
),
1342 VMSTATE_UINT8 (last_read_byte
, SB16State
),
1344 VMSTATE_INT32 (nzero
, SB16State
),
1345 VMSTATE_INT32 (left_till_irq
, SB16State
),
1346 VMSTATE_INT32 (dma_running
, SB16State
),
1347 VMSTATE_INT32 (bytes_per_second
, SB16State
),
1348 VMSTATE_INT32 (align
, SB16State
),
1350 VMSTATE_INT32 (mixer_nreg
, SB16State
),
1351 VMSTATE_BUFFER (mixer_regs
, SB16State
),
1353 VMSTATE_END_OF_LIST ()
1357 static const MemoryRegionPortio sb16_ioport_list
[] = {
1358 { 4, 1, 1, .write
= mixer_write_indexb
},
1359 { 5, 1, 1, .read
= mixer_read
, .write
= mixer_write_datab
},
1360 { 6, 1, 1, .read
= dsp_read
, .write
= dsp_write
},
1361 { 10, 1, 1, .read
= dsp_read
},
1362 { 12, 1, 1, .write
= dsp_write
},
1363 { 12, 4, 1, .read
= dsp_read
},
1364 PORTIO_END_OF_LIST (),
1368 static void sb16_initfn (Object
*obj
)
1370 SB16State
*s
= SB16 (obj
);
1375 static void sb16_realizefn (DeviceState
*dev
, Error
**errp
)
1377 ISADevice
*isadev
= ISA_DEVICE (dev
);
1378 SB16State
*s
= SB16 (dev
);
1381 s
->isa_hdma
= isa_get_dma(isa_bus_from_device(isadev
), s
->hdma
);
1382 s
->isa_dma
= isa_get_dma(isa_bus_from_device(isadev
), s
->dma
);
1383 if (!s
->isa_dma
|| !s
->isa_hdma
) {
1384 error_setg(errp
, "ISA controller does not support DMA");
1388 isa_init_irq (isadev
, &s
->pic
, s
->irq
);
1390 s
->mixer_regs
[0x80] = magic_of_irq (s
->irq
);
1391 s
->mixer_regs
[0x81] = (1 << s
->dma
) | (1 << s
->hdma
);
1392 s
->mixer_regs
[0x82] = 2 << 5;
1395 s
->csp_regs
[9] = 0xf8;
1398 s
->aux_ts
= timer_new_ns(QEMU_CLOCK_VIRTUAL
, aux_timer
, s
);
1400 error_setg(errp
, "warning: Could not create auxiliary timer");
1403 isa_register_portio_list(isadev
, &s
->portio_list
, s
->port
,
1404 sb16_ioport_list
, s
, "sb16");
1406 k
= ISADMA_GET_CLASS(s
->isa_hdma
);
1407 k
->register_channel(s
->isa_hdma
, s
->hdma
, SB_read_DMA
, s
);
1409 k
= ISADMA_GET_CLASS(s
->isa_dma
);
1410 k
->register_channel(s
->isa_dma
, s
->dma
, SB_read_DMA
, s
);
1414 AUD_register_card ("sb16", &s
->card
);
1417 static int SB16_init (ISABus
*bus
)
1419 isa_create_simple (bus
, TYPE_SB16
);
1423 static Property sb16_properties
[] = {
1424 DEFINE_PROP_UINT32 ("version", SB16State
, ver
, 0x0405), /* 4.5 */
1425 DEFINE_PROP_UINT32 ("iobase", SB16State
, port
, 0x220),
1426 DEFINE_PROP_UINT32 ("irq", SB16State
, irq
, 5),
1427 DEFINE_PROP_UINT32 ("dma", SB16State
, dma
, 1),
1428 DEFINE_PROP_UINT32 ("dma16", SB16State
, hdma
, 5),
1429 DEFINE_PROP_END_OF_LIST (),
1432 static void sb16_class_initfn (ObjectClass
*klass
, void *data
)
1434 DeviceClass
*dc
= DEVICE_CLASS (klass
);
1436 dc
->realize
= sb16_realizefn
;
1437 set_bit(DEVICE_CATEGORY_SOUND
, dc
->categories
);
1438 dc
->desc
= "Creative Sound Blaster 16";
1439 dc
->vmsd
= &vmstate_sb16
;
1440 dc
->props
= sb16_properties
;
1443 static const TypeInfo sb16_info
= {
1445 .parent
= TYPE_ISA_DEVICE
,
1446 .instance_size
= sizeof (SB16State
),
1447 .instance_init
= sb16_initfn
,
1448 .class_init
= sb16_class_initfn
,
1451 static void sb16_register_types (void)
1453 type_register_static (&sb16_info
);
1454 isa_register_soundhw("sb16", "Creative Sound Blaster 16", SB16_init
);
1457 type_init (sb16_register_types
)