master
h 85 lines 1.64 KB
Raw
1 /*
2 * QEMU Apple Sound Chip emulation
3 *
4 * Apple Sound Chip (ASC) 344S0063
5 * Enhanced Apple Sound Chip (EASC) 343S1063
6 *
7 * Copyright (c) 2012-2018 Laurent Vivier <laurent@vivier.eu>
8 * Copyright (c) 2022 Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
9 *
10 * SPDX-License-Identifier: GPL-2.0-or-later
11 */
12
13 #ifndef HW_AUDIO_ASC_H
14 #define HW_AUDIO_ASC_H
15
16 #include "hw/core/sysbus.h"
17 #include "qemu/audio.h"
18
19 #define ASC_FREQ 22257
20
21 enum {
22 ASC_TYPE_ASC = 0, /* original discrete Apple Sound Chip */
23 ASC_TYPE_EASC = 1 /* discrete Enhanced Apple Sound Chip */
24 };
25
26 #define ASC_FIFO_OFFSET 0x0
27 #define ASC_FIFO_SIZE 0x400
28
29 #define ASC_REG_OFFSET 0x800
30 #define ASC_REG_SIZE 0x60
31
32 #define ASC_EXTREG_OFFSET 0xf00
33 #define ASC_EXTREG_SIZE 0x20
34
35 typedef struct ASCFIFOState {
36 int index;
37
38 MemoryRegion mem_fifo;
39 uint8_t fifo[ASC_FIFO_SIZE];
40 uint8_t int_status;
41
42 int cnt;
43 int wptr;
44 int rptr;
45
46 MemoryRegion mem_extregs;
47 uint8_t extregs[ASC_EXTREG_SIZE];
48
49 int xa_cnt;
50 uint8_t xa_val;
51 uint8_t xa_flags;
52 int16_t xa_last[2];
53 } ASCFIFOState;
54
55 struct ASCState {
56 SysBusDevice parent_obj;
57
58 uint8_t type;
59 MemoryRegion asc;
60 MemoryRegion mem_fifo;
61 MemoryRegion mem_regs;
62 MemoryRegion mem_extregs;
63
64 AudioBackend *audio_be;
65 SWVoiceOut *voice;
66 uint8_t *mixbuf;
67 int samples;
68 int shift;
69
70 uint8_t *silentbuf;
71
72 /* Time when we were last able to generate samples */
73 int64_t fifo_empty_ns;
74
75 qemu_irq irq;
76
77 ASCFIFOState fifos[2];
78
79 uint8_t regs[ASC_REG_SIZE];
80 };
81
82 #define TYPE_ASC "apple-sound-chip"
83 OBJECT_DECLARE_SIMPLE_TYPE(ASCState, ASC)
84
85 #endif