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