Statistics
| Branch: | Revision:

root / hw / sb16.c @ c0fe3827

History | View | Annotate | Download (34.8 kB)

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
            );
259
    }
260

    
261
    control (s, 1);
262
    speaker (s, 1);
263
}
264

    
265
static void dma_cmd (SB16State *s, uint8_t cmd, uint8_t d0, int dma_len)
266
{
267
    s->use_hdma = cmd < 0xc0;
268
    s->fifo = (cmd >> 1) & 1;
269
    s->dma_auto = (cmd >> 2) & 1;
270
    s->fmt_signed = (d0 >> 4) & 1;
271
    s->fmt_stereo = (d0 >> 5) & 1;
272

    
273
    switch (cmd >> 4) {
274
    case 11:
275
        s->fmt_bits = 16;
276
        break;
277

    
278
    case 12:
279
        s->fmt_bits = 8;
280
        break;
281
    }
282

    
283
    if (-1 != s->time_const) {
284
#if 1
285
        int tmp = 256 - s->time_const;
286
        s->freq = (1000000 + (tmp / 2)) / tmp;
287
#else
288
        /* s->freq = 1000000 / ((255 - s->time_const) << s->fmt_stereo); */
289
        s->freq = 1000000 / ((255 - s->time_const));
290
#endif
291
        s->time_const = -1;
292
    }
293

    
294
    s->block_size = dma_len + 1;
295
    s->block_size <<= (s->fmt_bits == 16);
296
    if (!s->dma_auto) {
297
        /* It is clear that for DOOM and auto-init this value
298
           shouldn't take stereo into account, while Miles Sound Systems
299
           setsound.exe with single transfer mode wouldn't work without it
300
           wonders of SB16 yet again */
301
        s->block_size <<= s->fmt_stereo;
302
    }
303

    
304
    ldebug ("freq %d, stereo %d, sign %d, bits %d, "
305
            "dma %d, auto %d, fifo %d, high %d\n",
306
            s->freq, s->fmt_stereo, s->fmt_signed, s->fmt_bits,
307
            s->block_size, s->dma_auto, s->fifo, s->highspeed);
308

    
309
    if (16 == s->fmt_bits) {
310
        if (s->fmt_signed) {
311
            s->fmt = AUD_FMT_S16;
312
        }
313
        else {
314
            s->fmt = AUD_FMT_U16;
315
        }
316
    }
317
    else {
318
        if (s->fmt_signed) {
319
            s->fmt = AUD_FMT_S8;
320
        }
321
        else {
322
            s->fmt = AUD_FMT_U8;
323
        }
324
    }
325

    
326
    s->left_till_irq = s->block_size;
327

    
328
    s->bytes_per_second = (s->freq << s->fmt_stereo) << (s->fmt_bits == 16);
329
    s->highspeed = 0;
330
    s->align = (1 << (s->fmt_stereo + (s->fmt_bits == 16))) - 1;
331
    if (s->block_size & s->align) {
332
        dolog ("warning: misaligned block size %d, alignment %d\n",
333
               s->block_size, s->align + 1);
334
    }
335

    
336
    if (s->freq) {
337
        audsettings_t as;
338

    
339
        s->audio_free = 0;
340

    
341
        as.freq = s->freq;
342
        as.nchannels = 1 << s->fmt_stereo;
343
        as.fmt = s->fmt;
344

    
345
        s->voice = AUD_open_out (
346
            &s->card,
347
            s->voice,
348
            "sb16",
349
            s,
350
            SB_audio_callback,
351
            &as
352
            );
353
    }
354

    
355
    control (s, 1);
356
    speaker (s, 1);
357
}
358

    
359
static inline void dsp_out_data (SB16State *s, uint8_t val)
360
{
361
    ldebug ("outdata %#x\n", val);
362
    if ((size_t) s->out_data_len < sizeof (s->out_data)) {
363
        s->out_data[s->out_data_len++] = val;
364
    }
365
}
366

    
367
static inline uint8_t dsp_get_data (SB16State *s)
368
{
369
    if (s->in_index) {
370
        return s->in2_data[--s->in_index];
371
    }
372
    else {
373
        dolog ("buffer underflow\n");
374
        return 0;
375
    }
376
}
377

    
378
static void command (SB16State *s, uint8_t cmd)
379
{
380
    ldebug ("command %#x\n", cmd);
381

    
382
    if (cmd > 0xaf && cmd < 0xd0) {
383
        if (cmd & 8) {
384
            dolog ("ADC not yet supported (command %#x)\n", cmd);
385
        }
386

    
387
        switch (cmd >> 4) {
388
        case 11:
389
        case 12:
390
            break;
391
        default:
392
            dolog ("%#x wrong bits\n", cmd);
393
        }
394
        s->needed_bytes = 3;
395
    }
396
    else {
397
        s->needed_bytes = 0;
398

    
399
        switch (cmd) {
400
        case 0x03:
401
            dsp_out_data (s, 0x10); /* s->csp_param); */
402
            goto warn;
403

    
404
        case 0x04:
405
            s->needed_bytes = 1;
406
            goto warn;
407

    
408
        case 0x05:
409
            s->needed_bytes = 2;
410
            goto warn;
411

    
412
        case 0x08:
413
            /* __asm__ ("int3"); */
414
            goto warn;
415

    
416
        case 0x0e:
417
            s->needed_bytes = 2;
418
            goto warn;
419

    
420
        case 0x09:
421
            dsp_out_data (s, 0xf8);
422
            goto warn;
423

    
424
        case 0x0f:
425
            s->needed_bytes = 1;
426
            goto warn;
427

    
428
        case 0x10:
429
            s->needed_bytes = 1;
430
            goto warn;
431

    
432
        case 0x14:
433
            s->needed_bytes = 2;
434
            s->block_size = 0;
435
            break;
436

    
437
        case 0x1c:              /* Auto-Initialize DMA DAC, 8-bit */
438
            control (s, 1);
439
            break;
440

    
441
        case 0x20:              /* Direct ADC, Juice/PL */
442
            dsp_out_data (s, 0xff);
443
            goto warn;
444

    
445
        case 0x35:
446
            dolog ("0x35 - MIDI command not implemented\n");
447
            break;
448

    
449
        case 0x40:
450
            s->freq = -1;
451
            s->time_const = -1;
452
            s->needed_bytes = 1;
453
            break;
454

    
455
        case 0x41:
456
            s->freq = -1;
457
            s->time_const = -1;
458
            s->needed_bytes = 2;
459
            break;
460

    
461
        case 0x42:
462
            s->freq = -1;
463
            s->time_const = -1;
464
            s->needed_bytes = 2;
465
            goto warn;
466

    
467
        case 0x45:
468
            dsp_out_data (s, 0xaa);
469
            goto warn;
470

    
471
        case 0x47:                /* Continue Auto-Initialize DMA 16bit */
472
            break;
473

    
474
        case 0x48:
475
            s->needed_bytes = 2;
476
            break;
477

    
478
        case 0x74:
479
            s->needed_bytes = 2; /* DMA DAC, 4-bit ADPCM */
480
            dolog ("0x75 - DMA DAC, 4-bit ADPCM not implemented\n");
481
            break;
482

    
483
        case 0x75:              /* DMA DAC, 4-bit ADPCM Reference */
484
            s->needed_bytes = 2;
485
            dolog ("0x74 - DMA DAC, 4-bit ADPCM Reference not implemented\n");
486
            break;
487

    
488
        case 0x76:              /* DMA DAC, 2.6-bit ADPCM */
489
            s->needed_bytes = 2;
490
            dolog ("0x74 - DMA DAC, 2.6-bit ADPCM not implemented\n");
491
            break;
492

    
493
        case 0x77:              /* DMA DAC, 2.6-bit ADPCM Reference */
494
            s->needed_bytes = 2;
495
            dolog ("0x74 - DMA DAC, 2.6-bit ADPCM Reference not implemented\n");
496
            break;
497

    
498
        case 0x7d:
499
            dolog ("0x7d - Autio-Initialize DMA DAC, 4-bit ADPCM Reference\n");
500
            dolog ("not implemented\n");
501
            break;
502

    
503
        case 0x7f:
504
            dolog (
505
                "0x7d - Autio-Initialize DMA DAC, 2.6-bit ADPCM Reference\n"
506
                );
507
            dolog ("not implemented\n");
508
            break;
509

    
510
        case 0x80:
511
            s->needed_bytes = 2;
512
            break;
513

    
514
        case 0x90:
515
        case 0x91:
516
            dma_cmd8 (s, ((cmd & 1) == 0) | DMA8_HIGH, -1);
517
            break;
518

    
519
        case 0xd0:              /* halt DMA operation. 8bit */
520
            control (s, 0);
521
            break;
522

    
523
        case 0xd1:              /* speaker on */
524
            speaker (s, 1);
525
            break;
526

    
527
        case 0xd3:              /* speaker off */
528
            speaker (s, 0);
529
            break;
530

    
531
        case 0xd4:              /* continue DMA operation. 8bit */
532
            control (s, 1);
533
            break;
534

    
535
        case 0xd5:              /* halt DMA operation. 16bit */
536
            control (s, 0);
537
            break;
538

    
539
        case 0xd6:              /* continue DMA operation. 16bit */
540
            control (s, 1);
541
            break;
542

    
543
        case 0xd9:              /* exit auto-init DMA after this block. 16bit */
544
            s->dma_auto = 0;
545
            break;
546

    
547
        case 0xda:              /* exit auto-init DMA after this block. 8bit */
548
            s->dma_auto = 0;
549
            break;
550

    
551
        case 0xe0:              /* DSP identification */
552
            s->needed_bytes = 1;
553
            break;
554

    
555
        case 0xe1:
556
            dsp_out_data (s, s->ver & 0xff);
557
            dsp_out_data (s, s->ver >> 8);
558
            break;
559

    
560
        case 0xe2:
561
            s->needed_bytes = 1;
562
            goto warn;
563

    
564
        case 0xe3:
565
            {
566
                int i;
567
                for (i = sizeof (e3) - 1; i >= 0; --i)
568
                    dsp_out_data (s, e3[i]);
569
            }
570
            break;
571

    
572
        case 0xe4:              /* write test reg */
573
            s->needed_bytes = 1;
574
            break;
575

    
576
        case 0xe7:
577
            dolog ("Attempt to probe for ESS (0xe7)?\n");
578
            break;
579

    
580
        case 0xe8:              /* read test reg */
581
            dsp_out_data (s, s->test_reg);
582
            break;
583

    
584
        case 0xf2:
585
        case 0xf3:
586
            dsp_out_data (s, 0xaa);
587
            s->mixer_regs[0x82] |= (cmd == 0xf2) ? 1 : 2;
588
            pic_set_irq (s->irq, 1);
589
            break;
590

    
591
        case 0xf9:
592
            s->needed_bytes = 1;
593
            goto warn;
594

    
595
        case 0xfa:
596
            dsp_out_data (s, 0);
597
            goto warn;
598

    
599
        case 0xfc:              /* FIXME */
600
            dsp_out_data (s, 0);
601
            goto warn;
602

    
603
        default:
604
            dolog ("Unrecognized command %#x\n", cmd);
605
            break;
606
        }
607
    }
608

    
609
    if (!s->needed_bytes) {
610
        ldebug ("\n");
611
    }
612

    
613
 exit:
614
    if (!s->needed_bytes) {
615
        s->cmd = -1;
616
    }
617
    else {
618
        s->cmd = cmd;
619
    }
620
    return;
621

    
622
 warn:
623
    dolog ("warning: command %#x,%d is not truly understood yet\n",
624
           cmd, s->needed_bytes);
625
    goto exit;
626

    
627
}
628

    
629
static uint16_t dsp_get_lohi (SB16State *s)
630
{
631
    uint8_t hi = dsp_get_data (s);
632
    uint8_t lo = dsp_get_data (s);
633
    return (hi << 8) | lo;
634
}
635

    
636
static uint16_t dsp_get_hilo (SB16State *s)
637
{
638
    uint8_t lo = dsp_get_data (s);
639
    uint8_t hi = dsp_get_data (s);
640
    return (hi << 8) | lo;
641
}
642

    
643
static void complete (SB16State *s)
644
{
645
    int d0, d1, d2;
646
    ldebug ("complete command %#x, in_index %d, needed_bytes %d\n",
647
            s->cmd, s->in_index, s->needed_bytes);
648

    
649
    if (s->cmd > 0xaf && s->cmd < 0xd0) {
650
        d2 = dsp_get_data (s);
651
        d1 = dsp_get_data (s);
652
        d0 = dsp_get_data (s);
653

    
654
        if (s->cmd & 8) {
655
            dolog ("ADC params cmd = %#x d0 = %d, d1 = %d, d2 = %d\n",
656
                   s->cmd, d0, d1, d2);
657
        }
658
        else {
659
            ldebug ("cmd = %#x d0 = %d, d1 = %d, d2 = %d\n",
660
                    s->cmd, d0, d1, d2);
661
            dma_cmd (s, s->cmd, d0, d1 + (d2 << 8));
662
        }
663
    }
664
    else {
665
        switch (s->cmd) {
666
        case 0x04:
667
            s->csp_mode = dsp_get_data (s);
668
            s->csp_reg83r = 0;
669
            s->csp_reg83w = 0;
670
            ldebug ("CSP command 0x04: mode=%#x\n", s->csp_mode);
671
            break;
672

    
673
        case 0x05:
674
            s->csp_param = dsp_get_data (s);
675
            s->csp_value = dsp_get_data (s);
676
            ldebug ("CSP command 0x05: param=%#x value=%#x\n",
677
                    s->csp_param,
678
                    s->csp_value);
679
            break;
680

    
681
        case 0x0e:
682
            d0 = dsp_get_data (s);
683
            d1 = dsp_get_data (s);
684
            ldebug ("write CSP register %d <- %#x\n", d1, d0);
685
            if (d1 == 0x83) {
686
                ldebug ("0x83[%d] <- %#x\n", s->csp_reg83r, d0);
687
                s->csp_reg83[s->csp_reg83r % 4] = d0;
688
                s->csp_reg83r += 1;
689
            }
690
            else {
691
                s->csp_regs[d1] = d0;
692
            }
693
            break;
694

    
695
        case 0x0f:
696
            d0 = dsp_get_data (s);
697
            ldebug ("read CSP register %#x -> %#x, mode=%#x\n",
698
                    d0, s->csp_regs[d0], s->csp_mode);
699
            if (d0 == 0x83) {
700
                ldebug ("0x83[%d] -> %#x\n",
701
                        s->csp_reg83w,
702
                        s->csp_reg83[s->csp_reg83w % 4]);
703
                dsp_out_data (s, s->csp_reg83[s->csp_reg83w % 4]);
704
                s->csp_reg83w += 1;
705
            }
706
            else {
707
                dsp_out_data (s, s->csp_regs[d0]);
708
            }
709
            break;
710

    
711
        case 0x10:
712
            d0 = dsp_get_data (s);
713
            dolog ("cmd 0x10 d0=%#x\n", d0);
714
            break;
715

    
716
        case 0x14:
717
            dma_cmd8 (s, 0, dsp_get_lohi (s) + 1);
718
            break;
719

    
720
        case 0x40:
721
            s->time_const = dsp_get_data (s);
722
            ldebug ("set time const %d\n", s->time_const);
723
            break;
724

    
725
        case 0x42:              /* FT2 sets output freq with this, go figure */
726
#if 0
727
            dolog ("cmd 0x42 might not do what it think it should\n");
728
#endif
729
        case 0x41:
730
            s->freq = dsp_get_hilo (s);
731
            ldebug ("set freq %d\n", s->freq);
732
            break;
733

    
734
        case 0x48:
735
            s->block_size = dsp_get_lohi (s) + 1;
736
            ldebug ("set dma block len %d\n", s->block_size);
737
            break;
738

    
739
        case 0x74:
740
        case 0x75:
741
        case 0x76:
742
        case 0x77:
743
            /* ADPCM stuff, ignore */
744
            break;
745

    
746
        case 0x80:
747
            {
748
                int freq, samples, bytes;
749
                int64_t ticks;
750

    
751
                freq = s->freq > 0 ? s->freq : 11025;
752
                samples = dsp_get_lohi (s) + 1;
753
                bytes = samples << s->fmt_stereo << (s->fmt_bits == 16);
754
                ticks = (bytes * ticks_per_sec) / freq;
755
                if (ticks < ticks_per_sec / 1024) {
756
                    pic_set_irq (s->irq, 1);
757
                }
758
                else {
759
                    if (s->aux_ts) {
760
                        qemu_mod_timer (
761
                            s->aux_ts,
762
                            qemu_get_clock (vm_clock) + ticks
763
                            );
764
                    }
765
                }
766
                ldebug ("mix silence %d %d %lld\n", samples, bytes, ticks);
767
            }
768
            break;
769

    
770
        case 0xe0:
771
            d0 = dsp_get_data (s);
772
            s->out_data_len = 0;
773
            ldebug ("E0 data = %#x\n", d0);
774
            dsp_out_data (s, ~d0);
775
            break;
776

    
777
        case 0xe2:
778
            d0 = dsp_get_data (s);
779
            ldebug ("E2 = %#x\n", d0);
780
            break;
781

    
782
        case 0xe4:
783
            s->test_reg = dsp_get_data (s);
784
            break;
785

    
786
        case 0xf9:
787
            d0 = dsp_get_data (s);
788
            ldebug ("command 0xf9 with %#x\n", d0);
789
            switch (d0) {
790
            case 0x0e:
791
                dsp_out_data (s, 0xff);
792
                break;
793

    
794
            case 0x0f:
795
                dsp_out_data (s, 0x07);
796
                break;
797

    
798
            case 0x37:
799
                dsp_out_data (s, 0x38);
800
                break;
801

    
802
            default:
803
                dsp_out_data (s, 0x00);
804
                break;
805
            }
806
            break;
807

    
808
        default:
809
            dolog ("complete: unrecognized command %#x\n", s->cmd);
810
            return;
811
        }
812
    }
813

    
814
    ldebug ("\n");
815
    s->cmd = -1;
816
    return;
817
}
818

    
819
static void reset (SB16State *s)
820
{
821
    pic_set_irq (s->irq, 0);
822
    if (s->dma_auto) {
823
        pic_set_irq (s->irq, 1);
824
        pic_set_irq (s->irq, 0);
825
    }
826

    
827
    s->mixer_regs[0x82] = 0;
828
    s->dma_auto = 0;
829
    s->in_index = 0;
830
    s->out_data_len = 0;
831
    s->left_till_irq = 0;
832
    s->needed_bytes = 0;
833
    s->block_size = -1;
834
    s->nzero = 0;
835
    s->highspeed = 0;
836
    s->v2x6 = 0;
837
    s->cmd = -1;
838

    
839
    dsp_out_data(s, 0xaa);
840
    speaker (s, 0);
841
    control (s, 0);
842
}
843

    
844
static IO_WRITE_PROTO (dsp_write)
845
{
846
    SB16State *s = opaque;
847
    int iport;
848

    
849
    iport = nport - s->port;
850

    
851
    ldebug ("write %#x <- %#x\n", nport, val);
852
    switch (iport) {
853
    case 0x06:
854
        switch (val) {
855
        case 0x00:
856
            if (s->v2x6 == 1) {
857
                if (0 && s->highspeed) {
858
                    s->highspeed = 0;
859
                    pic_set_irq (s->irq, 0);
860
                    control (s, 0);
861
                }
862
                else {
863
                    reset (s);
864
                }
865
            }
866
            s->v2x6 = 0;
867
            break;
868

    
869
        case 0x01:
870
        case 0x03:              /* FreeBSD kludge */
871
            s->v2x6 = 1;
872
            break;
873

    
874
        case 0xc6:
875
            s->v2x6 = 0;        /* Prince of Persia, csp.sys, diagnose.exe */
876
            break;
877

    
878
        case 0xb8:              /* Panic */
879
            reset (s);
880
            break;
881

    
882
        case 0x39:
883
            dsp_out_data (s, 0x38);
884
            reset (s);
885
            s->v2x6 = 0x39;
886
            break;
887

    
888
        default:
889
            s->v2x6 = val;
890
            break;
891
        }
892
        break;
893

    
894
    case 0x0c:                  /* write data or command | write status */
895
/*         if (s->highspeed) */
896
/*             break; */
897

    
898
        if (0 == s->needed_bytes) {
899
            command (s, val);
900
#if 0
901
            if (0 == s->needed_bytes) {
902
                log_dsp (s);
903
            }
904
#endif
905
        }
906
        else {
907
            if (s->in_index == sizeof (s->in2_data)) {
908
                dolog ("in data overrun\n");
909
            }
910
            else {
911
                s->in2_data[s->in_index++] = val;
912
                if (s->in_index == s->needed_bytes) {
913
                    s->needed_bytes = 0;
914
                    complete (s);
915
#if 0
916
                    log_dsp (s);
917
#endif
918
                }
919
            }
920
        }
921
        break;
922

    
923
    default:
924
        ldebug ("(nport=%#x, val=%#x)\n", nport, val);
925
        break;
926
    }
927
}
928

    
929
static IO_READ_PROTO (dsp_read)
930
{
931
    SB16State *s = opaque;
932
    int iport, retval, ack = 0;
933

    
934
    iport = nport - s->port;
935

    
936
    switch (iport) {
937
    case 0x06:                  /* reset */
938
        retval = 0xff;
939
        break;
940

    
941
    case 0x0a:                  /* read data */
942
        if (s->out_data_len) {
943
            retval = s->out_data[--s->out_data_len];
944
            s->last_read_byte = retval;
945
        }
946
        else {
947
            if (s->cmd != -1) {
948
                dolog ("empty output buffer for command %#x\n",
949
                       s->cmd);
950
            }
951
            retval = s->last_read_byte;
952
            /* goto error; */
953
        }
954
        break;
955

    
956
    case 0x0c:                  /* 0 can write */
957
        retval = s->can_write ? 0 : 0x80;
958
        break;
959

    
960
    case 0x0d:                  /* timer interrupt clear */
961
        /* dolog ("timer interrupt clear\n"); */
962
        retval = 0;
963
        break;
964

    
965
    case 0x0e:                  /* data available status | irq 8 ack */
966
        retval = (!s->out_data_len || s->highspeed) ? 0 : 0x80;
967
        if (s->mixer_regs[0x82] & 1) {
968
            ack = 1;
969
            s->mixer_regs[0x82] &= 1;
970
            pic_set_irq (s->irq, 0);
971
        }
972
        break;
973

    
974
    case 0x0f:                  /* irq 16 ack */
975
        retval = 0xff;
976
        if (s->mixer_regs[0x82] & 2) {
977
            ack = 1;
978
            s->mixer_regs[0x82] &= 2;
979
            pic_set_irq (s->irq, 0);
980
        }
981
        break;
982

    
983
    default:
984
        goto error;
985
    }
986

    
987
    if (!ack) {
988
        ldebug ("read %#x -> %#x\n", nport, retval);
989
    }
990

    
991
    return retval;
992

    
993
 error:
994
    dolog ("warning: dsp_read %#x error\n", nport);
995
    return 0xff;
996
}
997

    
998
static void reset_mixer (SB16State *s)
999
{
1000
    int i;
1001

    
1002
    memset (s->mixer_regs, 0xff, 0x7f);
1003
    memset (s->mixer_regs + 0x83, 0xff, sizeof (s->mixer_regs) - 0x83);
1004

    
1005
    s->mixer_regs[0x02] = 4;    /* master volume 3bits */
1006
    s->mixer_regs[0x06] = 4;    /* MIDI volume 3bits */
1007
    s->mixer_regs[0x08] = 0;    /* CD volume 3bits */
1008
    s->mixer_regs[0x0a] = 0;    /* voice volume 2bits */
1009

    
1010
    /* d5=input filt, d3=lowpass filt, d1,d2=input source */
1011
    s->mixer_regs[0x0c] = 0;
1012

    
1013
    /* d5=output filt, d1=stereo switch */
1014
    s->mixer_regs[0x0e] = 0;
1015

    
1016
    /* voice volume L d5,d7, R d1,d3 */
1017
    s->mixer_regs[0x04] = (4 << 5) | (4 << 1);
1018
    /* master ... */
1019
    s->mixer_regs[0x22] = (4 << 5) | (4 << 1);
1020
    /* MIDI ... */
1021
    s->mixer_regs[0x26] = (4 << 5) | (4 << 1);
1022

    
1023
    for (i = 0x30; i < 0x48; i++) {
1024
        s->mixer_regs[i] = 0x20;
1025
    }
1026
}
1027

    
1028
static IO_WRITE_PROTO(mixer_write_indexb)
1029
{
1030
    SB16State *s = opaque;
1031
    (void) nport;
1032
    s->mixer_nreg = val;
1033
}
1034

    
1035
static IO_WRITE_PROTO(mixer_write_datab)
1036
{
1037
    SB16State *s = opaque;
1038

    
1039
    (void) nport;
1040
    ldebug ("mixer_write [%#x] <- %#x\n", s->mixer_nreg, val);
1041

    
1042
    switch (s->mixer_nreg) {
1043
    case 0x00:
1044
        reset_mixer (s);
1045
        break;
1046

    
1047
    case 0x80:
1048
        {
1049
            int irq = irq_of_magic (val);
1050
            ldebug ("setting irq to %d (val=%#x)\n", irq, val);
1051
            if (irq > 0) {
1052
                s->irq = irq;
1053
            }
1054
        }
1055
        break;
1056

    
1057
    case 0x81:
1058
        {
1059
            int dma, hdma;
1060

    
1061
            dma = lsbindex (val & 0xf);
1062
            hdma = lsbindex (val & 0xf0);
1063
            if (dma != s->dma || hdma != s->hdma) {
1064
                dolog (
1065
                    "attempt to change DMA "
1066
                    "8bit %d(%d), 16bit %d(%d) (val=%#x)\n",
1067
                    dma, s->dma, hdma, s->hdma, val);
1068
            }
1069
#if 0
1070
            s->dma = dma;
1071
            s->hdma = hdma;
1072
#endif
1073
        }
1074
        break;
1075

    
1076
    case 0x82:
1077
        dolog ("attempt to write into IRQ status register (val=%#x)\n",
1078
               val);
1079
        return;
1080

    
1081
    default:
1082
        if (s->mixer_nreg >= 0x80) {
1083
            ldebug ("attempt to write mixer[%#x] <- %#x\n", s->mixer_nreg, val);
1084
        }
1085
        break;
1086
    }
1087

    
1088
    s->mixer_regs[s->mixer_nreg] = val;
1089
}
1090

    
1091
static IO_WRITE_PROTO(mixer_write_indexw)
1092
{
1093
    mixer_write_indexb (opaque, nport, val & 0xff);
1094
    mixer_write_datab (opaque, nport, (val >> 8) & 0xff);
1095
}
1096

    
1097
static IO_READ_PROTO(mixer_read)
1098
{
1099
    SB16State *s = opaque;
1100

    
1101
    (void) nport;
1102
#ifndef DEBUG_SB16_MOST
1103
    if (s->mixer_nreg != 0x82) {
1104
        ldebug ("mixer_read[%#x] -> %#x\n",
1105
                s->mixer_nreg, s->mixer_regs[s->mixer_nreg]);
1106
    }
1107
#else
1108
    ldebug ("mixer_read[%#x] -> %#x\n",
1109
            s->mixer_nreg, s->mixer_regs[s->mixer_nreg]);
1110
#endif
1111
    return s->mixer_regs[s->mixer_nreg];
1112
}
1113

    
1114
static int write_audio (SB16State *s, int nchan, int dma_pos,
1115
                        int dma_len, int len)
1116
{
1117
    int temp, net;
1118
    uint8_t tmpbuf[4096];
1119

    
1120
    temp = len;
1121
    net = 0;
1122

    
1123
    while (temp) {
1124
        int left = dma_len - dma_pos;
1125
        int copied;
1126
        size_t to_copy;
1127

    
1128
        to_copy = audio_MIN (temp, left);
1129
        if (to_copy > sizeof (tmpbuf)) {
1130
            to_copy = sizeof (tmpbuf);
1131
        }
1132

    
1133
        copied = DMA_read_memory (nchan, tmpbuf, dma_pos, to_copy);
1134
        copied = AUD_write (s->voice, tmpbuf, copied);
1135

    
1136
        temp -= copied;
1137
        dma_pos = (dma_pos + copied) % dma_len;
1138
        net += copied;
1139

    
1140
        if (!copied) {
1141
            break;
1142
        }
1143
    }
1144

    
1145
    return net;
1146
}
1147

    
1148
static int SB_read_DMA (void *opaque, int nchan, int dma_pos, int dma_len)
1149
{
1150
    SB16State *s = opaque;
1151
    int till, copy, written, free;
1152

    
1153
    if (s->left_till_irq < 0) {
1154
        s->left_till_irq = s->block_size;
1155
    }
1156

    
1157
    if (s->voice) {
1158
        free = s->audio_free & ~s->align;
1159
        if ((free <= 0) || !dma_len) {
1160
            return dma_pos;
1161
        }
1162
    }
1163
    else {
1164
        free = dma_len;
1165
    }
1166

    
1167
    copy = free;
1168
    till = s->left_till_irq;
1169

    
1170
#ifdef DEBUG_SB16_MOST
1171
    dolog ("pos:%06d %d till:%d len:%d\n",
1172
           dma_pos, free, till, dma_len);
1173
#endif
1174

    
1175
    if (till <= copy) {
1176
        if (0 == s->dma_auto) {
1177
            copy = till;
1178
        }
1179
    }
1180

    
1181
    written = write_audio (s, nchan, dma_pos, dma_len, copy);
1182
    dma_pos = (dma_pos + written) % dma_len;
1183
    s->left_till_irq -= written;
1184

    
1185
    if (s->left_till_irq <= 0) {
1186
        s->mixer_regs[0x82] |= (nchan & 4) ? 2 : 1;
1187
        pic_set_irq (s->irq, 1);
1188
        if (0 == s->dma_auto) {
1189
            control (s, 0);
1190
            speaker (s, 0);
1191
        }
1192
    }
1193

    
1194
#ifdef DEBUG_SB16_MOST
1195
    ldebug ("pos %5d free %5d size %5d till % 5d copy %5d written %5d size %5d\n",
1196
            dma_pos, free, dma_len, s->left_till_irq, copy, written,
1197
            s->block_size);
1198
#endif
1199

    
1200
    while (s->left_till_irq <= 0) {
1201
        s->left_till_irq = s->block_size + s->left_till_irq;
1202
    }
1203

    
1204
    return dma_pos;
1205
}
1206

    
1207
static void SB_audio_callback (void *opaque, int free)
1208
{
1209
    SB16State *s = opaque;
1210
    s->audio_free = free;
1211
}
1212

    
1213
static void SB_save (QEMUFile *f, void *opaque)
1214
{
1215
    SB16State *s = opaque;
1216

    
1217
    qemu_put_be32s (f, &s->irq);
1218
    qemu_put_be32s (f, &s->dma);
1219
    qemu_put_be32s (f, &s->hdma);
1220
    qemu_put_be32s (f, &s->port);
1221
    qemu_put_be32s (f, &s->ver);
1222
    qemu_put_be32s (f, &s->in_index);
1223
    qemu_put_be32s (f, &s->out_data_len);
1224
    qemu_put_be32s (f, &s->fmt_stereo);
1225
    qemu_put_be32s (f, &s->fmt_signed);
1226
    qemu_put_be32s (f, &s->fmt_bits);
1227
    qemu_put_be32s (f, &s->fmt);
1228
    qemu_put_be32s (f, &s->dma_auto);
1229
    qemu_put_be32s (f, &s->block_size);
1230
    qemu_put_be32s (f, &s->fifo);
1231
    qemu_put_be32s (f, &s->freq);
1232
    qemu_put_be32s (f, &s->time_const);
1233
    qemu_put_be32s (f, &s->speaker);
1234
    qemu_put_be32s (f, &s->needed_bytes);
1235
    qemu_put_be32s (f, &s->cmd);
1236
    qemu_put_be32s (f, &s->use_hdma);
1237
    qemu_put_be32s (f, &s->highspeed);
1238
    qemu_put_be32s (f, &s->can_write);
1239
    qemu_put_be32s (f, &s->v2x6);
1240

    
1241
    qemu_put_8s (f, &s->csp_param);
1242
    qemu_put_8s (f, &s->csp_value);
1243
    qemu_put_8s (f, &s->csp_mode);
1244
    qemu_put_8s (f, &s->csp_param);
1245
    qemu_put_buffer (f, s->csp_regs, 256);
1246
    qemu_put_8s (f, &s->csp_index);
1247
    qemu_put_buffer (f, s->csp_reg83, 4);
1248
    qemu_put_be32s (f, &s->csp_reg83r);
1249
    qemu_put_be32s (f, &s->csp_reg83w);
1250

    
1251
    qemu_put_buffer (f, s->in2_data, sizeof (s->in2_data));
1252
    qemu_put_buffer (f, s->out_data, sizeof (s->out_data));
1253
    qemu_put_8s (f, &s->test_reg);
1254
    qemu_put_8s (f, &s->last_read_byte);
1255

    
1256
    qemu_put_be32s (f, &s->nzero);
1257
    qemu_put_be32s (f, &s->left_till_irq);
1258
    qemu_put_be32s (f, &s->dma_running);
1259
    qemu_put_be32s (f, &s->bytes_per_second);
1260
    qemu_put_be32s (f, &s->align);
1261

    
1262
    qemu_put_be32s (f, &s->mixer_nreg);
1263
    qemu_put_buffer (f, s->mixer_regs, 256);
1264
}
1265

    
1266
static int SB_load (QEMUFile *f, void *opaque, int version_id)
1267
{
1268
    SB16State *s = opaque;
1269

    
1270
    if (version_id != 1) {
1271
        return -EINVAL;
1272
    }
1273

    
1274
    qemu_get_be32s (f, &s->irq);
1275
    qemu_get_be32s (f, &s->dma);
1276
    qemu_get_be32s (f, &s->hdma);
1277
    qemu_get_be32s (f, &s->port);
1278
    qemu_get_be32s (f, &s->ver);
1279
    qemu_get_be32s (f, &s->in_index);
1280
    qemu_get_be32s (f, &s->out_data_len);
1281
    qemu_get_be32s (f, &s->fmt_stereo);
1282
    qemu_get_be32s (f, &s->fmt_signed);
1283
    qemu_get_be32s (f, &s->fmt_bits);
1284
    qemu_get_be32s (f, &s->fmt);
1285
    qemu_get_be32s (f, &s->dma_auto);
1286
    qemu_get_be32s (f, &s->block_size);
1287
    qemu_get_be32s (f, &s->fifo);
1288
    qemu_get_be32s (f, &s->freq);
1289
    qemu_get_be32s (f, &s->time_const);
1290
    qemu_get_be32s (f, &s->speaker);
1291
    qemu_get_be32s (f, &s->needed_bytes);
1292
    qemu_get_be32s (f, &s->cmd);
1293
    qemu_get_be32s (f, &s->use_hdma);
1294
    qemu_get_be32s (f, &s->highspeed);
1295
    qemu_get_be32s (f, &s->can_write);
1296
    qemu_get_be32s (f, &s->v2x6);
1297

    
1298
    qemu_get_8s (f, &s->csp_param);
1299
    qemu_get_8s (f, &s->csp_value);
1300
    qemu_get_8s (f, &s->csp_mode);
1301
    qemu_get_8s (f, &s->csp_param);
1302
    qemu_get_buffer (f, s->csp_regs, 256);
1303
    qemu_get_8s (f, &s->csp_index);
1304
    qemu_get_buffer (f, s->csp_reg83, 4);
1305
    qemu_get_be32s (f, &s->csp_reg83r);
1306
    qemu_get_be32s (f, &s->csp_reg83w);
1307

    
1308
    qemu_get_buffer (f, s->in2_data, sizeof (s->in2_data));
1309
    qemu_get_buffer (f, s->out_data, sizeof (s->out_data));
1310
    qemu_get_8s (f, &s->test_reg);
1311
    qemu_get_8s (f, &s->last_read_byte);
1312

    
1313
    qemu_get_be32s (f, &s->nzero);
1314
    qemu_get_be32s (f, &s->left_till_irq);
1315
    qemu_get_be32s (f, &s->dma_running);
1316
    qemu_get_be32s (f, &s->bytes_per_second);
1317
    qemu_get_be32s (f, &s->align);
1318

    
1319
    qemu_get_be32s (f, &s->mixer_nreg);
1320
    qemu_get_buffer (f, s->mixer_regs, 256);
1321

    
1322
    if (s->voice) {
1323
        AUD_close_out (&s->card, s->voice);
1324
        s->voice = NULL;
1325
    }
1326

    
1327
    if (s->dma_running) {
1328
        if (s->freq) {
1329
            audsettings_t as;
1330

    
1331
            s->audio_free = 0;
1332

    
1333
            as.freq = s->freq;
1334
            as.nchannels = 1 << s->fmt_stereo;
1335
            as.fmt = s->fmt;
1336

    
1337
            s->voice = AUD_open_out (
1338
                &s->card,
1339
                s->voice,
1340
                "sb16",
1341
                s,
1342
                SB_audio_callback,
1343
                &as
1344
                );
1345
        }
1346

    
1347
        control (s, 1);
1348
        speaker (s, s->speaker);
1349
    }
1350
    return 0;
1351
}
1352

    
1353
int SB16_init (AudioState *audio)
1354
{
1355
    SB16State *s;
1356
    int i;
1357
    static const uint8_t dsp_write_ports[] = {0x6, 0xc};
1358
    static const uint8_t dsp_read_ports[] = {0x6, 0xa, 0xc, 0xd, 0xe, 0xf};
1359

    
1360
    if (!audio) {
1361
        dolog ("No audio state\n");
1362
        return -1;
1363
    }
1364

    
1365
    s = qemu_mallocz (sizeof (*s));
1366
    if (!s) {
1367
        dolog ("Could not allocate memory for SB16 (%d bytes)\n",
1368
               sizeof (*s));
1369
        return -1;
1370
    }
1371

    
1372
    s->cmd = -1;
1373
    s->irq = conf.irq;
1374
    s->dma = conf.dma;
1375
    s->hdma = conf.hdma;
1376
    s->port = conf.port;
1377
    s->ver = conf.ver_lo | (conf.ver_hi << 8);
1378

    
1379
    s->mixer_regs[0x80] = magic_of_irq (s->irq);
1380
    s->mixer_regs[0x81] = (1 << s->dma) | (1 << s->hdma);
1381
    s->mixer_regs[0x82] = 2 << 5;
1382

    
1383
    s->csp_regs[5] = 1;
1384
    s->csp_regs[9] = 0xf8;
1385

    
1386
    reset_mixer (s);
1387
    s->aux_ts = qemu_new_timer (vm_clock, aux_timer, s);
1388
    if (!s->aux_ts) {
1389
        dolog ("warning: Could not create auxiliary timer\n");
1390
    }
1391

    
1392
    for (i = 0; i < LENOFA (dsp_write_ports); i++) {
1393
        register_ioport_write (s->port + dsp_write_ports[i], 1, 1, dsp_write, s);
1394
    }
1395

    
1396
    for (i = 0; i < LENOFA (dsp_read_ports); i++) {
1397
        register_ioport_read (s->port + dsp_read_ports[i], 1, 1, dsp_read, s);
1398
    }
1399

    
1400
    register_ioport_write (s->port + 0x4, 1, 1, mixer_write_indexb, s);
1401
    register_ioport_write (s->port + 0x4, 1, 2, mixer_write_indexw, s);
1402
    register_ioport_read (s->port + 0x5, 1, 1, mixer_read, s);
1403
    register_ioport_write (s->port + 0x5, 1, 1, mixer_write_datab, s);
1404

    
1405
    DMA_register_channel (s->hdma, SB_read_DMA, s);
1406
    DMA_register_channel (s->dma, SB_read_DMA, s);
1407
    s->can_write = 1;
1408

    
1409
    register_savevm ("sb16", 0, 1, SB_save, SB_load, s);
1410
    AUD_register_card (audio, "sb16", &s->card);
1411
    return 0;
1412
}