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