2023-10-04 11:37:53 +03:00
|
|
|
/*
|
|
|
|
* QEMU Apple Sound Chip emulation
|
|
|
|
*
|
|
|
|
* Apple Sound Chip (ASC) 344S0063
|
|
|
|
* Enhanced Apple Sound Chip (EASC) 343S1063
|
|
|
|
*
|
|
|
|
* Copyright (c) 2012-2018 Laurent Vivier <laurent@vivier.eu>
|
|
|
|
* Copyright (c) 2022 Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef HW_AUDIO_ASC_H
|
|
|
|
#define HW_AUDIO_ASC_H
|
|
|
|
|
|
|
|
#include "qemu/osdep.h"
|
|
|
|
#include "hw/sysbus.h"
|
|
|
|
#include "audio/audio.h"
|
|
|
|
|
|
|
|
#define ASC_FREQ 22257
|
|
|
|
|
|
|
|
enum {
|
|
|
|
ASC_TYPE_ASC = 0, /* original discrete Apple Sound Chip */
|
|
|
|
ASC_TYPE_EASC = 1 /* discrete Enhanced Apple Sound Chip */
|
|
|
|
};
|
|
|
|
|
|
|
|
#define ASC_FIFO_OFFSET 0x0
|
|
|
|
#define ASC_FIFO_SIZE 0x400
|
|
|
|
|
|
|
|
#define ASC_REG_OFFSET 0x800
|
|
|
|
#define ASC_REG_SIZE 0x60
|
|
|
|
|
|
|
|
#define ASC_EXTREG_OFFSET 0xf00
|
|
|
|
#define ASC_EXTREG_SIZE 0x20
|
|
|
|
|
|
|
|
typedef struct ASCFIFOState {
|
|
|
|
int index;
|
|
|
|
|
|
|
|
MemoryRegion mem_fifo;
|
|
|
|
uint8_t fifo[ASC_FIFO_SIZE];
|
|
|
|
uint8_t int_status;
|
|
|
|
|
|
|
|
int cnt;
|
|
|
|
int wptr;
|
|
|
|
int rptr;
|
|
|
|
|
|
|
|
MemoryRegion mem_extregs;
|
|
|
|
uint8_t extregs[ASC_EXTREG_SIZE];
|
|
|
|
|
|
|
|
int xa_cnt;
|
|
|
|
uint8_t xa_val;
|
|
|
|
uint8_t xa_flags;
|
|
|
|
int16_t xa_last[2];
|
|
|
|
} ASCFIFOState;
|
|
|
|
|
|
|
|
struct ASCState {
|
|
|
|
SysBusDevice parent_obj;
|
|
|
|
|
|
|
|
uint8_t type;
|
|
|
|
MemoryRegion asc;
|
|
|
|
MemoryRegion mem_fifo;
|
|
|
|
MemoryRegion mem_regs;
|
|
|
|
MemoryRegion mem_extregs;
|
|
|
|
|
|
|
|
QEMUSoundCard card;
|
|
|
|
SWVoiceOut *voice;
|
|
|
|
uint8_t *mixbuf;
|
|
|
|
int samples;
|
|
|
|
int shift;
|
|
|
|
|
2023-10-04 11:37:54 +03:00
|
|
|
uint8_t *silentbuf;
|
|
|
|
|
2023-10-04 11:37:53 +03:00
|
|
|
/* Time when we were last able to generate samples */
|
|
|
|
int64_t fifo_empty_ns;
|
|
|
|
|
|
|
|
qemu_irq irq;
|
|
|
|
|
|
|
|
ASCFIFOState fifos[2];
|
|
|
|
|
|
|
|
uint8_t regs[ASC_REG_SIZE];
|
|
|
|
};
|
|
|
|
|
|
|
|
#define TYPE_ASC "apple-sound-chip"
|
|
|
|
OBJECT_DECLARE_SIMPLE_TYPE(ASCState, ASC)
|
|
|
|
|
|
|
|
#endif
|