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"
26 #include "hw/audio/soundhw.h"
27 #include "audio/audio.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"
35 #include "qemu/module.h"
36 #include "qapi/error.h"
38 #define dolog(...) AUD_log ("sb16", __VA_ARGS__)
41 /* #define DEBUG_SB16_MOST */
44 #define ldebug(...) dolog (__VA_ARGS__)
49 static const char e3
[] = "COPYRIGHT (C) CREATIVE TECHNOLOGY LTD, 1992.";
51 #define TYPE_SB16 "sb16"
52 #define SB16(obj) OBJECT_CHECK (SB16State, (obj), TYPE_SB16)
54 typedef struct SB16State
{
90 uint8_t csp_regs
[256];
99 uint8_t last_read_byte
;
105 int bytes_per_second
;
113 uint8_t mixer_regs
[256];
114 PortioList portio_list
;
117 static void SB_audio_callback (void *opaque
, int free
);
119 static int magic_of_irq (int irq
)
131 qemu_log_mask(LOG_GUEST_ERROR
, "bad irq %d\n", irq
);
136 static int irq_of_magic (int magic
)
148 qemu_log_mask(LOG_GUEST_ERROR
, "bad irq magic %d\n", magic
);
154 static void log_dsp (SB16State
*dsp
)
156 ldebug ("%s:%s:%d:%s:dmasize=%d:freq=%d:const=%d:speaker=%d\n",
157 dsp
->fmt_stereo
? "Stereo" : "Mono",
158 dsp
->fmt_signed
? "Signed" : "Unsigned",
160 dsp
->dma_auto
? "Auto" : "Single",
168 static void speaker (SB16State
*s
, int on
)
171 /* AUD_enable (s->voice, on); */
174 static void control (SB16State
*s
, int hold
)
176 int dma
= s
->use_hdma
? s
->hdma
: s
->dma
;
177 IsaDma
*isa_dma
= s
->use_hdma
? s
->isa_hdma
: s
->isa_dma
;
178 IsaDmaClass
*k
= ISADMA_GET_CLASS(isa_dma
);
179 s
->dma_running
= hold
;
181 ldebug ("hold %d high %d dma %d\n", hold
, s
->use_hdma
, dma
);
184 k
->hold_DREQ(isa_dma
, dma
);
185 AUD_set_active_out (s
->voice
, 1);
188 k
->release_DREQ(isa_dma
, dma
);
189 AUD_set_active_out (s
->voice
, 0);
193 static void aux_timer (void *opaque
)
195 SB16State
*s
= opaque
;
197 qemu_irq_raise (s
->pic
);
203 static void continue_dma8 (SB16State
*s
)
206 struct audsettings as
;
211 as
.nchannels
= 1 << s
->fmt_stereo
;
215 s
->voice
= AUD_open_out (
228 static void dma_cmd8 (SB16State
*s
, int mask
, int dma_len
)
230 s
->fmt
= AUDIO_FORMAT_U8
;
234 s
->fmt_stereo
= (s
->mixer_regs
[0x0e] & 2) != 0;
235 if (-1 == s
->time_const
) {
240 int tmp
= (256 - s
->time_const
);
241 s
->freq
= (1000000 + (tmp
/ 2)) / tmp
;
245 s
->block_size
= dma_len
<< s
->fmt_stereo
;
248 /* This is apparently the only way to make both Act1/PL
249 and SecondReality/FC work
251 Act1 sets block size via command 0x48 and it's an odd number
252 SR does the same with even number
253 Both use stereo, and Creatives own documentation states that
254 0x48 sets block size in bytes less one.. go figure */
255 s
->block_size
&= ~s
->fmt_stereo
;
258 s
->freq
>>= s
->fmt_stereo
;
259 s
->left_till_irq
= s
->block_size
;
260 s
->bytes_per_second
= (s
->freq
<< s
->fmt_stereo
);
261 /* s->highspeed = (mask & DMA8_HIGH) != 0; */
262 s
->dma_auto
= (mask
& DMA8_AUTO
) != 0;
263 s
->align
= (1 << s
->fmt_stereo
) - 1;
265 if (s
->block_size
& s
->align
) {
266 qemu_log_mask(LOG_GUEST_ERROR
, "warning: misaligned block size %d,"
267 " alignment %d\n", s
->block_size
, s
->align
+ 1);
270 ldebug ("freq %d, stereo %d, sign %d, bits %d, "
271 "dma %d, auto %d, fifo %d, high %d\n",
272 s
->freq
, s
->fmt_stereo
, s
->fmt_signed
, s
->fmt_bits
,
273 s
->block_size
, s
->dma_auto
, s
->fifo
, s
->highspeed
);
279 static void dma_cmd (SB16State
*s
, uint8_t cmd
, uint8_t d0
, int dma_len
)
281 s
->use_hdma
= cmd
< 0xc0;
282 s
->fifo
= (cmd
>> 1) & 1;
283 s
->dma_auto
= (cmd
>> 2) & 1;
284 s
->fmt_signed
= (d0
>> 4) & 1;
285 s
->fmt_stereo
= (d0
>> 5) & 1;
297 if (-1 != s
->time_const
) {
299 int tmp
= 256 - s
->time_const
;
300 s
->freq
= (1000000 + (tmp
/ 2)) / tmp
;
302 /* s->freq = 1000000 / ((255 - s->time_const) << s->fmt_stereo); */
303 s
->freq
= 1000000 / ((255 - s
->time_const
));
308 s
->block_size
= dma_len
+ 1;
309 s
->block_size
<<= (s
->fmt_bits
== 16);
311 /* It is clear that for DOOM and auto-init this value
312 shouldn't take stereo into account, while Miles Sound Systems
313 setsound.exe with single transfer mode wouldn't work without it
314 wonders of SB16 yet again */
315 s
->block_size
<<= s
->fmt_stereo
;
318 ldebug ("freq %d, stereo %d, sign %d, bits %d, "
319 "dma %d, auto %d, fifo %d, high %d\n",
320 s
->freq
, s
->fmt_stereo
, s
->fmt_signed
, s
->fmt_bits
,
321 s
->block_size
, s
->dma_auto
, s
->fifo
, s
->highspeed
);
323 if (16 == s
->fmt_bits
) {
325 s
->fmt
= AUDIO_FORMAT_S16
;
328 s
->fmt
= AUDIO_FORMAT_U16
;
333 s
->fmt
= AUDIO_FORMAT_S8
;
336 s
->fmt
= AUDIO_FORMAT_U8
;
340 s
->left_till_irq
= s
->block_size
;
342 s
->bytes_per_second
= (s
->freq
<< s
->fmt_stereo
) << (s
->fmt_bits
== 16);
344 s
->align
= (1 << (s
->fmt_stereo
+ (s
->fmt_bits
== 16))) - 1;
345 if (s
->block_size
& s
->align
) {
346 qemu_log_mask(LOG_GUEST_ERROR
, "warning: misaligned block size %d,"
347 " alignment %d\n", s
->block_size
, s
->align
+ 1);
351 struct audsettings as
;
356 as
.nchannels
= 1 << s
->fmt_stereo
;
360 s
->voice
= AUD_open_out (
374 static inline void dsp_out_data (SB16State
*s
, uint8_t val
)
376 ldebug ("outdata %#x\n", val
);
377 if ((size_t) s
->out_data_len
< sizeof (s
->out_data
)) {
378 s
->out_data
[s
->out_data_len
++] = val
;
382 static inline uint8_t dsp_get_data (SB16State
*s
)
385 return s
->in2_data
[--s
->in_index
];
388 dolog ("buffer underflow\n");
393 static void command (SB16State
*s
, uint8_t cmd
)
395 ldebug ("command %#x\n", cmd
);
397 if (cmd
> 0xaf && cmd
< 0xd0) {
399 qemu_log_mask(LOG_UNIMP
, "ADC not yet supported (command %#x)\n",
408 qemu_log_mask(LOG_GUEST_ERROR
, "%#x wrong bits\n", cmd
);
417 dsp_out_data (s
, 0x10); /* s->csp_param); */
429 /* __asm__ ("int3"); */
437 dsp_out_data (s
, 0xf8);
453 case 0x1c: /* Auto-Initialize DMA DAC, 8-bit */
454 dma_cmd8 (s
, DMA8_AUTO
, -1);
457 case 0x20: /* Direct ADC, Juice/PL */
458 dsp_out_data (s
, 0xff);
462 qemu_log_mask(LOG_UNIMP
, "0x35 - MIDI command not implemented\n");
484 dsp_out_data (s
, 0xaa);
487 case 0x47: /* Continue Auto-Initialize DMA 16bit */
495 s
->needed_bytes
= 2; /* DMA DAC, 4-bit ADPCM */
496 qemu_log_mask(LOG_UNIMP
, "0x75 - DMA DAC, 4-bit ADPCM not"
500 case 0x75: /* DMA DAC, 4-bit ADPCM Reference */
502 qemu_log_mask(LOG_UNIMP
, "0x74 - DMA DAC, 4-bit ADPCM Reference not"
506 case 0x76: /* DMA DAC, 2.6-bit ADPCM */
508 qemu_log_mask(LOG_UNIMP
, "0x74 - DMA DAC, 2.6-bit ADPCM not"
512 case 0x77: /* DMA DAC, 2.6-bit ADPCM Reference */
514 qemu_log_mask(LOG_UNIMP
, "0x74 - DMA DAC, 2.6-bit ADPCM Reference"
515 " not implemented\n");
519 qemu_log_mask(LOG_UNIMP
, "0x7d - Autio-Initialize DMA DAC, 4-bit"
520 " ADPCM Reference\n");
521 qemu_log_mask(LOG_UNIMP
, "not implemented\n");
525 qemu_log_mask(LOG_UNIMP
, "0x7d - Autio-Initialize DMA DAC, 2.6-bit"
526 " ADPCM Reference\n");
527 qemu_log_mask(LOG_UNIMP
, "not implemented\n");
536 dma_cmd8 (s
, ((cmd
& 1) == 0) | DMA8_HIGH
, -1);
539 case 0xd0: /* halt DMA operation. 8bit */
543 case 0xd1: /* speaker on */
547 case 0xd3: /* speaker off */
551 case 0xd4: /* continue DMA operation. 8bit */
552 /* KQ6 (or maybe Sierras audblst.drv in general) resets
553 the frequency between halt/continue */
557 case 0xd5: /* halt DMA operation. 16bit */
561 case 0xd6: /* continue DMA operation. 16bit */
565 case 0xd9: /* exit auto-init DMA after this block. 16bit */
569 case 0xda: /* exit auto-init DMA after this block. 8bit */
573 case 0xe0: /* DSP identification */
578 dsp_out_data (s
, s
->ver
& 0xff);
579 dsp_out_data (s
, s
->ver
>> 8);
589 for (i
= sizeof (e3
) - 1; i
>= 0; --i
)
590 dsp_out_data (s
, e3
[i
]);
594 case 0xe4: /* write test reg */
599 qemu_log_mask(LOG_UNIMP
, "Attempt to probe for ESS (0xe7)?\n");
602 case 0xe8: /* read test reg */
603 dsp_out_data (s
, s
->test_reg
);
608 dsp_out_data (s
, 0xaa);
609 s
->mixer_regs
[0x82] |= (cmd
== 0xf2) ? 1 : 2;
610 qemu_irq_raise (s
->pic
);
621 case 0xfc: /* FIXME */
626 qemu_log_mask(LOG_UNIMP
, "Unrecognized command %#x\n", cmd
);
631 if (!s
->needed_bytes
) {
636 if (!s
->needed_bytes
) {
645 qemu_log_mask(LOG_UNIMP
, "warning: command %#x,%d is not truly understood"
646 " yet\n", cmd
, s
->needed_bytes
);
651 static uint16_t dsp_get_lohi (SB16State
*s
)
653 uint8_t hi
= dsp_get_data (s
);
654 uint8_t lo
= dsp_get_data (s
);
655 return (hi
<< 8) | lo
;
658 static uint16_t dsp_get_hilo (SB16State
*s
)
660 uint8_t lo
= dsp_get_data (s
);
661 uint8_t hi
= dsp_get_data (s
);
662 return (hi
<< 8) | lo
;
665 static void complete (SB16State
*s
)
668 ldebug ("complete command %#x, in_index %d, needed_bytes %d\n",
669 s
->cmd
, s
->in_index
, s
->needed_bytes
);
671 if (s
->cmd
> 0xaf && s
->cmd
< 0xd0) {
672 d2
= dsp_get_data (s
);
673 d1
= dsp_get_data (s
);
674 d0
= dsp_get_data (s
);
677 dolog ("ADC params cmd = %#x d0 = %d, d1 = %d, d2 = %d\n",
681 ldebug ("cmd = %#x d0 = %d, d1 = %d, d2 = %d\n",
683 dma_cmd (s
, s
->cmd
, d0
, d1
+ (d2
<< 8));
689 s
->csp_mode
= dsp_get_data (s
);
692 ldebug ("CSP command 0x04: mode=%#x\n", s
->csp_mode
);
696 s
->csp_param
= dsp_get_data (s
);
697 s
->csp_value
= dsp_get_data (s
);
698 ldebug ("CSP command 0x05: param=%#x value=%#x\n",
704 d0
= dsp_get_data (s
);
705 d1
= dsp_get_data (s
);
706 ldebug ("write CSP register %d <- %#x\n", d1
, d0
);
708 ldebug ("0x83[%d] <- %#x\n", s
->csp_reg83r
, d0
);
709 s
->csp_reg83
[s
->csp_reg83r
% 4] = d0
;
713 s
->csp_regs
[d1
] = d0
;
718 d0
= dsp_get_data (s
);
719 ldebug ("read CSP register %#x -> %#x, mode=%#x\n",
720 d0
, s
->csp_regs
[d0
], s
->csp_mode
);
722 ldebug ("0x83[%d] -> %#x\n",
724 s
->csp_reg83
[s
->csp_reg83w
% 4]);
725 dsp_out_data (s
, s
->csp_reg83
[s
->csp_reg83w
% 4]);
729 dsp_out_data (s
, s
->csp_regs
[d0
]);
734 d0
= dsp_get_data (s
);
735 dolog ("cmd 0x10 d0=%#x\n", d0
);
739 dma_cmd8 (s
, 0, dsp_get_lohi (s
) + 1);
743 s
->time_const
= dsp_get_data (s
);
744 ldebug ("set time const %d\n", s
->time_const
);
750 * 0x41 is documented as setting the output sample rate,
751 * and 0x42 the input sample rate, but in fact SB16 hardware
752 * seems to have only a single sample rate under the hood,
753 * and FT2 sets output freq with this (go figure). Compare:
754 * http://homepages.cae.wisc.edu/~brodskye/sb16doc/sb16doc.html#SamplingRate
756 s
->freq
= dsp_get_hilo (s
);
757 ldebug ("set freq %d\n", s
->freq
);
761 s
->block_size
= dsp_get_lohi (s
) + 1;
762 ldebug ("set dma block len %d\n", s
->block_size
);
769 /* ADPCM stuff, ignore */
774 int freq
, samples
, bytes
;
777 freq
= s
->freq
> 0 ? s
->freq
: 11025;
778 samples
= dsp_get_lohi (s
) + 1;
779 bytes
= samples
<< s
->fmt_stereo
<< (s
->fmt_bits
== 16);
780 ticks
= muldiv64(bytes
, NANOSECONDS_PER_SECOND
, freq
);
781 if (ticks
< NANOSECONDS_PER_SECOND
/ 1024) {
782 qemu_irq_raise (s
->pic
);
788 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL
) + ticks
792 ldebug ("mix silence %d %d %" PRId64
"\n", samples
, bytes
, ticks
);
797 d0
= dsp_get_data (s
);
799 ldebug ("E0 data = %#x\n", d0
);
800 dsp_out_data (s
, ~d0
);
805 d0
= dsp_get_data (s
);
806 dolog ("E2 = %#x\n", d0
);
811 s
->test_reg
= dsp_get_data (s
);
815 d0
= dsp_get_data (s
);
816 ldebug ("command 0xf9 with %#x\n", d0
);
819 dsp_out_data (s
, 0xff);
823 dsp_out_data (s
, 0x07);
827 dsp_out_data (s
, 0x38);
831 dsp_out_data (s
, 0x00);
837 qemu_log_mask(LOG_UNIMP
, "complete: unrecognized command %#x\n",
847 static void legacy_reset (SB16State
*s
)
849 struct audsettings as
;
858 as
.fmt
= AUDIO_FORMAT_U8
;
861 s
->voice
= AUD_open_out (
870 /* Not sure about that... */
871 /* AUD_set_active_out (s->voice, 1); */
874 static void reset (SB16State
*s
)
876 qemu_irq_lower (s
->pic
);
878 qemu_irq_raise (s
->pic
);
879 qemu_irq_lower (s
->pic
);
882 s
->mixer_regs
[0x82] = 0;
886 s
->left_till_irq
= 0;
894 dsp_out_data (s
, 0xaa);
900 static void dsp_write(void *opaque
, uint32_t nport
, uint32_t val
)
902 SB16State
*s
= opaque
;
905 iport
= nport
- s
->port
;
907 ldebug ("write %#x <- %#x\n", nport
, val
);
919 case 0x03: /* FreeBSD kludge */
924 s
->v2x6
= 0; /* Prince of Persia, csp.sys, diagnose.exe */
927 case 0xb8: /* Panic */
932 dsp_out_data (s
, 0x38);
943 case 0x0c: /* write data or command | write status */
944 /* if (s->highspeed) */
947 if (s
->needed_bytes
== 0) {
950 if (0 == s
->needed_bytes
) {
956 if (s
->in_index
== sizeof (s
->in2_data
)) {
957 dolog ("in data overrun\n");
960 s
->in2_data
[s
->in_index
++] = val
;
961 if (s
->in_index
== s
->needed_bytes
) {
973 ldebug ("(nport=%#x, val=%#x)\n", nport
, val
);
978 static uint32_t dsp_read(void *opaque
, uint32_t nport
)
980 SB16State
*s
= opaque
;
981 int iport
, retval
, ack
= 0;
983 iport
= nport
- s
->port
;
986 case 0x06: /* reset */
990 case 0x0a: /* read data */
991 if (s
->out_data_len
) {
992 retval
= s
->out_data
[--s
->out_data_len
];
993 s
->last_read_byte
= retval
;
997 dolog ("empty output buffer for command %#x\n",
1000 retval
= s
->last_read_byte
;
1005 case 0x0c: /* 0 can write */
1006 retval
= s
->can_write
? 0 : 0x80;
1009 case 0x0d: /* timer interrupt clear */
1010 /* dolog ("timer interrupt clear\n"); */
1014 case 0x0e: /* data available status | irq 8 ack */
1015 retval
= (!s
->out_data_len
|| s
->highspeed
) ? 0 : 0x80;
1016 if (s
->mixer_regs
[0x82] & 1) {
1018 s
->mixer_regs
[0x82] &= ~1;
1019 qemu_irq_lower (s
->pic
);
1023 case 0x0f: /* irq 16 ack */
1025 if (s
->mixer_regs
[0x82] & 2) {
1027 s
->mixer_regs
[0x82] &= ~2;
1028 qemu_irq_lower (s
->pic
);
1037 ldebug ("read %#x -> %#x\n", nport
, retval
);
1043 dolog ("warning: dsp_read %#x error\n", nport
);
1047 static void reset_mixer (SB16State
*s
)
1051 memset (s
->mixer_regs
, 0xff, 0x7f);
1052 memset (s
->mixer_regs
+ 0x83, 0xff, sizeof (s
->mixer_regs
) - 0x83);
1054 s
->mixer_regs
[0x02] = 4; /* master volume 3bits */
1055 s
->mixer_regs
[0x06] = 4; /* MIDI volume 3bits */
1056 s
->mixer_regs
[0x08] = 0; /* CD volume 3bits */
1057 s
->mixer_regs
[0x0a] = 0; /* voice volume 2bits */
1059 /* d5=input filt, d3=lowpass filt, d1,d2=input source */
1060 s
->mixer_regs
[0x0c] = 0;
1062 /* d5=output filt, d1=stereo switch */
1063 s
->mixer_regs
[0x0e] = 0;
1065 /* voice volume L d5,d7, R d1,d3 */
1066 s
->mixer_regs
[0x04] = (4 << 5) | (4 << 1);
1068 s
->mixer_regs
[0x22] = (4 << 5) | (4 << 1);
1070 s
->mixer_regs
[0x26] = (4 << 5) | (4 << 1);
1072 for (i
= 0x30; i
< 0x48; i
++) {
1073 s
->mixer_regs
[i
] = 0x20;
1077 static void mixer_write_indexb(void *opaque
, uint32_t nport
, uint32_t val
)
1079 SB16State
*s
= opaque
;
1081 s
->mixer_nreg
= val
;
1084 static void mixer_write_datab(void *opaque
, uint32_t nport
, uint32_t val
)
1086 SB16State
*s
= opaque
;
1089 ldebug ("mixer_write [%#x] <- %#x\n", s
->mixer_nreg
, val
);
1091 switch (s
->mixer_nreg
) {
1098 int irq
= irq_of_magic (val
);
1099 ldebug ("setting irq to %d (val=%#x)\n", irq
, val
);
1110 dma
= ctz32 (val
& 0xf);
1111 hdma
= ctz32 (val
& 0xf0);
1112 if (dma
!= s
->dma
|| hdma
!= s
->hdma
) {
1113 qemu_log_mask(LOG_GUEST_ERROR
, "attempt to change DMA 8bit"
1114 " %d(%d), 16bit %d(%d) (val=%#x)\n", dma
, s
->dma
,
1115 hdma
, s
->hdma
, val
);
1125 qemu_log_mask(LOG_GUEST_ERROR
, "attempt to write into IRQ status"
1126 " register (val=%#x)\n", val
);
1130 if (s
->mixer_nreg
>= 0x80) {
1131 ldebug ("attempt to write mixer[%#x] <- %#x\n", s
->mixer_nreg
, val
);
1136 s
->mixer_regs
[s
->mixer_nreg
] = val
;
1139 static uint32_t mixer_read(void *opaque
, uint32_t nport
)
1141 SB16State
*s
= opaque
;
1144 #ifndef DEBUG_SB16_MOST
1145 if (s
->mixer_nreg
!= 0x82) {
1146 ldebug ("mixer_read[%#x] -> %#x\n",
1147 s
->mixer_nreg
, s
->mixer_regs
[s
->mixer_nreg
]);
1150 ldebug ("mixer_read[%#x] -> %#x\n",
1151 s
->mixer_nreg
, s
->mixer_regs
[s
->mixer_nreg
]);
1153 return s
->mixer_regs
[s
->mixer_nreg
];
1156 static int write_audio (SB16State
*s
, int nchan
, int dma_pos
,
1157 int dma_len
, int len
)
1159 IsaDma
*isa_dma
= nchan
== s
->dma
? s
->isa_dma
: s
->isa_hdma
;
1160 IsaDmaClass
*k
= ISADMA_GET_CLASS(isa_dma
);
1162 uint8_t tmpbuf
[4096];
1168 int left
= dma_len
- dma_pos
;
1172 to_copy
= MIN (temp
, left
);
1173 if (to_copy
> sizeof (tmpbuf
)) {
1174 to_copy
= sizeof (tmpbuf
);
1177 copied
= k
->read_memory(isa_dma
, nchan
, tmpbuf
, dma_pos
, to_copy
);
1178 copied
= AUD_write (s
->voice
, tmpbuf
, copied
);
1181 dma_pos
= (dma_pos
+ copied
) % dma_len
;
1192 static int SB_read_DMA (void *opaque
, int nchan
, int dma_pos
, int dma_len
)
1194 SB16State
*s
= opaque
;
1195 int till
, copy
, written
, free
;
1197 if (s
->block_size
<= 0) {
1198 qemu_log_mask(LOG_GUEST_ERROR
, "invalid block size=%d nchan=%d"
1199 " dma_pos=%d dma_len=%d\n", s
->block_size
, nchan
,
1204 if (s
->left_till_irq
< 0) {
1205 s
->left_till_irq
= s
->block_size
;
1209 free
= s
->audio_free
& ~s
->align
;
1210 if ((free
<= 0) || !dma_len
) {
1219 till
= s
->left_till_irq
;
1221 #ifdef DEBUG_SB16_MOST
1222 dolog ("pos:%06d %d till:%d len:%d\n",
1223 dma_pos
, free
, till
, dma_len
);
1227 if (s
->dma_auto
== 0) {
1232 written
= write_audio (s
, nchan
, dma_pos
, dma_len
, copy
);
1233 dma_pos
= (dma_pos
+ written
) % dma_len
;
1234 s
->left_till_irq
-= written
;
1236 if (s
->left_till_irq
<= 0) {
1237 s
->mixer_regs
[0x82] |= (nchan
& 4) ? 2 : 1;
1238 qemu_irq_raise (s
->pic
);
1239 if (s
->dma_auto
== 0) {
1245 #ifdef DEBUG_SB16_MOST
1246 ldebug ("pos %5d free %5d size %5d till % 5d copy %5d written %5d size %5d\n",
1247 dma_pos
, free
, dma_len
, s
->left_till_irq
, copy
, written
,
1251 while (s
->left_till_irq
<= 0) {
1252 s
->left_till_irq
= s
->block_size
+ s
->left_till_irq
;
1258 static void SB_audio_callback (void *opaque
, int free
)
1260 SB16State
*s
= opaque
;
1261 s
->audio_free
= free
;
1264 static int sb16_post_load (void *opaque
, int version_id
)
1266 SB16State
*s
= opaque
;
1269 AUD_close_out (&s
->card
, s
->voice
);
1273 if (s
->dma_running
) {
1275 struct audsettings as
;
1280 as
.nchannels
= 1 << s
->fmt_stereo
;
1284 s
->voice
= AUD_open_out (
1295 speaker (s
, s
->speaker
);
1300 static const VMStateDescription vmstate_sb16
= {
1303 .minimum_version_id
= 1,
1304 .post_load
= sb16_post_load
,
1305 .fields
= (VMStateField
[]) {
1306 VMSTATE_UINT32 (irq
, SB16State
),
1307 VMSTATE_UINT32 (dma
, SB16State
),
1308 VMSTATE_UINT32 (hdma
, SB16State
),
1309 VMSTATE_UINT32 (port
, SB16State
),
1310 VMSTATE_UINT32 (ver
, SB16State
),
1311 VMSTATE_INT32 (in_index
, SB16State
),
1312 VMSTATE_INT32 (out_data_len
, SB16State
),
1313 VMSTATE_INT32 (fmt_stereo
, SB16State
),
1314 VMSTATE_INT32 (fmt_signed
, SB16State
),
1315 VMSTATE_INT32 (fmt_bits
, SB16State
),
1316 VMSTATE_UINT32 (fmt
, SB16State
),
1317 VMSTATE_INT32 (dma_auto
, SB16State
),
1318 VMSTATE_INT32 (block_size
, SB16State
),
1319 VMSTATE_INT32 (fifo
, SB16State
),
1320 VMSTATE_INT32 (freq
, SB16State
),
1321 VMSTATE_INT32 (time_const
, SB16State
),
1322 VMSTATE_INT32 (speaker
, SB16State
),
1323 VMSTATE_INT32 (needed_bytes
, SB16State
),
1324 VMSTATE_INT32 (cmd
, SB16State
),
1325 VMSTATE_INT32 (use_hdma
, SB16State
),
1326 VMSTATE_INT32 (highspeed
, SB16State
),
1327 VMSTATE_INT32 (can_write
, SB16State
),
1328 VMSTATE_INT32 (v2x6
, SB16State
),
1330 VMSTATE_UINT8 (csp_param
, SB16State
),
1331 VMSTATE_UINT8 (csp_value
, SB16State
),
1332 VMSTATE_UINT8 (csp_mode
, SB16State
),
1333 VMSTATE_UINT8 (csp_param
, SB16State
),
1334 VMSTATE_BUFFER (csp_regs
, SB16State
),
1335 VMSTATE_UINT8 (csp_index
, SB16State
),
1336 VMSTATE_BUFFER (csp_reg83
, SB16State
),
1337 VMSTATE_INT32 (csp_reg83r
, SB16State
),
1338 VMSTATE_INT32 (csp_reg83w
, SB16State
),
1340 VMSTATE_BUFFER (in2_data
, SB16State
),
1341 VMSTATE_BUFFER (out_data
, SB16State
),
1342 VMSTATE_UINT8 (test_reg
, SB16State
),
1343 VMSTATE_UINT8 (last_read_byte
, SB16State
),
1345 VMSTATE_INT32 (nzero
, SB16State
),
1346 VMSTATE_INT32 (left_till_irq
, SB16State
),
1347 VMSTATE_INT32 (dma_running
, SB16State
),
1348 VMSTATE_INT32 (bytes_per_second
, SB16State
),
1349 VMSTATE_INT32 (align
, SB16State
),
1351 VMSTATE_INT32 (mixer_nreg
, SB16State
),
1352 VMSTATE_BUFFER (mixer_regs
, SB16State
),
1354 VMSTATE_END_OF_LIST ()
1358 static const MemoryRegionPortio sb16_ioport_list
[] = {
1359 { 4, 1, 1, .write
= mixer_write_indexb
},
1360 { 5, 1, 1, .read
= mixer_read
, .write
= mixer_write_datab
},
1361 { 6, 1, 1, .read
= dsp_read
, .write
= dsp_write
},
1362 { 10, 1, 1, .read
= dsp_read
},
1363 { 12, 1, 1, .write
= dsp_write
},
1364 { 12, 4, 1, .read
= dsp_read
},
1365 PORTIO_END_OF_LIST (),
1369 static void sb16_initfn (Object
*obj
)
1371 SB16State
*s
= SB16 (obj
);
1376 static void sb16_realizefn (DeviceState
*dev
, Error
**errp
)
1378 ISADevice
*isadev
= ISA_DEVICE (dev
);
1379 SB16State
*s
= SB16 (dev
);
1382 s
->isa_hdma
= isa_get_dma(isa_bus_from_device(isadev
), s
->hdma
);
1383 s
->isa_dma
= isa_get_dma(isa_bus_from_device(isadev
), s
->dma
);
1384 if (!s
->isa_dma
|| !s
->isa_hdma
) {
1385 error_setg(errp
, "ISA controller does not support DMA");
1389 isa_init_irq (isadev
, &s
->pic
, s
->irq
);
1391 s
->mixer_regs
[0x80] = magic_of_irq (s
->irq
);
1392 s
->mixer_regs
[0x81] = (1 << s
->dma
) | (1 << s
->hdma
);
1393 s
->mixer_regs
[0x82] = 2 << 5;
1396 s
->csp_regs
[9] = 0xf8;
1399 s
->aux_ts
= timer_new_ns(QEMU_CLOCK_VIRTUAL
, aux_timer
, s
);
1401 error_setg(errp
, "warning: Could not create auxiliary timer");
1404 isa_register_portio_list(isadev
, &s
->portio_list
, s
->port
,
1405 sb16_ioport_list
, s
, "sb16");
1407 k
= ISADMA_GET_CLASS(s
->isa_hdma
);
1408 k
->register_channel(s
->isa_hdma
, s
->hdma
, SB_read_DMA
, s
);
1410 k
= ISADMA_GET_CLASS(s
->isa_dma
);
1411 k
->register_channel(s
->isa_dma
, s
->dma
, SB_read_DMA
, s
);
1415 AUD_register_card ("sb16", &s
->card
);
1418 static Property sb16_properties
[] = {
1419 DEFINE_AUDIO_PROPERTIES(SB16State
, card
),
1420 DEFINE_PROP_UINT32 ("version", SB16State
, ver
, 0x0405), /* 4.5 */
1421 DEFINE_PROP_UINT32 ("iobase", SB16State
, port
, 0x220),
1422 DEFINE_PROP_UINT32 ("irq", SB16State
, irq
, 5),
1423 DEFINE_PROP_UINT32 ("dma", SB16State
, dma
, 1),
1424 DEFINE_PROP_UINT32 ("dma16", SB16State
, hdma
, 5),
1425 DEFINE_PROP_END_OF_LIST (),
1428 static void sb16_class_initfn (ObjectClass
*klass
, void *data
)
1430 DeviceClass
*dc
= DEVICE_CLASS (klass
);
1432 dc
->realize
= sb16_realizefn
;
1433 set_bit(DEVICE_CATEGORY_SOUND
, dc
->categories
);
1434 dc
->desc
= "Creative Sound Blaster 16";
1435 dc
->vmsd
= &vmstate_sb16
;
1436 device_class_set_props(dc
, sb16_properties
);
1439 static const TypeInfo sb16_info
= {
1441 .parent
= TYPE_ISA_DEVICE
,
1442 .instance_size
= sizeof (SB16State
),
1443 .instance_init
= sb16_initfn
,
1444 .class_init
= sb16_class_initfn
,
1447 static void sb16_register_types (void)
1449 type_register_static (&sb16_info
);
1450 deprecated_register_soundhw("sb16", "Creative Sound Blaster 16",
1454 type_init (sb16_register_types
)