xref: /qemu/include/hw/audio/asc.h (revision 3cc72cdb)
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 "qemu/osdep.h"
17 #include "hw/sysbus.h"
18 #include "audio/audio.h"
19 
20 #define ASC_FREQ 22257
21 
22 enum {
23     ASC_TYPE_ASC    = 0,  /* original discrete Apple Sound Chip */
24     ASC_TYPE_EASC   = 1   /* discrete Enhanced Apple Sound Chip */
25 };
26 
27 #define ASC_FIFO_OFFSET    0x0
28 #define ASC_FIFO_SIZE      0x400
29 
30 #define ASC_REG_OFFSET     0x800
31 #define ASC_REG_SIZE       0x60
32 
33 #define ASC_EXTREG_OFFSET  0xf00
34 #define ASC_EXTREG_SIZE    0x20
35 
36 typedef struct ASCFIFOState {
37     int index;
38 
39     MemoryRegion mem_fifo;
40     uint8_t fifo[ASC_FIFO_SIZE];
41     uint8_t int_status;
42 
43     int cnt;
44     int wptr;
45     int rptr;
46 
47     MemoryRegion mem_extregs;
48     uint8_t extregs[ASC_EXTREG_SIZE];
49 
50     int xa_cnt;
51     uint8_t xa_val;
52     uint8_t xa_flags;
53     int16_t xa_last[2];
54 } ASCFIFOState;
55 
56 struct ASCState {
57     SysBusDevice parent_obj;
58 
59     uint8_t type;
60     MemoryRegion asc;
61     MemoryRegion mem_fifo;
62     MemoryRegion mem_regs;
63     MemoryRegion mem_extregs;
64 
65     QEMUSoundCard card;
66     SWVoiceOut *voice;
67     uint8_t *mixbuf;
68     int samples;
69     int shift;
70 
71     uint8_t *silentbuf;
72 
73     /* Time when we were last able to generate samples */
74     int64_t fifo_empty_ns;
75 
76     qemu_irq irq;
77 
78     ASCFIFOState fifos[2];
79 
80     uint8_t regs[ASC_REG_SIZE];
81 };
82 
83 #define TYPE_ASC "apple-sound-chip"
84 OBJECT_DECLARE_SIMPLE_TYPE(ASCState, ASC)
85 
86 #endif
87