xref: /qemu/include/hw/audio/asc.h (revision 7c0dfcf9)
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/sysbus.h"
17 #include "audio/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     QEMUSoundCard card;
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
86