summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/sound/aica.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/sound/aica.h')
-rw-r--r--src/devices/sound/aica.h114
1 files changed, 56 insertions, 58 deletions
diff --git a/src/devices/sound/aica.h b/src/devices/sound/aica.h
index c8e79281b12..0f2c33d4355 100644
--- a/src/devices/sound/aica.h
+++ b/src/devices/sound/aica.h
@@ -14,42 +14,44 @@
#include "aicadsp.h"
-class aica_device : public device_t, public device_sound_interface
+class aica_device : public device_t, public device_sound_interface, public device_memory_interface
{
public:
static constexpr feature_type imperfect_features() { return feature::SOUND; }
- aica_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ aica_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
- void set_roffset(int roffset) { m_roffset = roffset; }
auto irq() { return m_irq_cb.bind(); }
auto main_irq() { return m_main_irq_cb.bind(); }
// AICA register access
- DECLARE_READ16_MEMBER( read );
- DECLARE_WRITE16_MEMBER( write );
+ u16 read(offs_t offset);
+ void write(offs_t offset, u16 data, u16 mem_mask = ~0);
// MIDI I/O access
- DECLARE_WRITE16_MEMBER( midi_in );
- DECLARE_READ16_MEMBER( midi_out_r );
-
- void set_ram_base(void *base, int size);
+ void midi_in(u8 data);
+ u8 midi_out_r();
protected:
// device-level overrides
virtual void device_start() override;
+ virtual void device_post_load() override;
virtual void device_clock_changed() override;
// sound stream update overrides
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
+ // device_memory_interface configuration
+ virtual space_config_vector memory_space_config() const override;
+
+ address_space_config m_data_config;
private:
enum AICA_STATE {AICA_ATTACK,AICA_DECAY1,AICA_DECAY2,AICA_RELEASE};
struct AICA_LFO_t
{
- unsigned short phase;
- uint32_t phase_step;
+ u16 phase;
+ u32 phase_step;
int *table;
int *scale;
};
@@ -72,16 +74,15 @@ private:
{
union
{
- uint16_t data[0x40]; //only 0x1a bytes used
- uint8_t datab[0x80];
+ u16 data[0x40]; //only 0x1a bytes used
+ u8 datab[0x80];
} udata;
- uint8_t active; //this slot is currently playing
- uint8_t *base; //samples base address
- uint32_t prv_addr; // previous play address (for ADPCM)
- uint32_t cur_addr; //current play address (24.8)
- uint32_t nxt_addr; //next play address
- uint32_t step; //pitch step (24.8)
- uint8_t Backwards; //the wave is playing backwards
+ u8 active; //this slot is currently playing
+ u32 prv_addr; // previous play address (for ADPCM)
+ u32 cur_addr; //current play address (24.8)
+ u32 nxt_addr; //next play address
+ u32 step; //pitch step (24.8)
+ u8 Backwards; //the wave is playing backwards
AICA_EG_t EG; //Envelope
AICA_LFO_t PLFO; //Phase LFO
AICA_LFO_t ALFO; //Amplitude LFO
@@ -90,12 +91,12 @@ private:
int cur_quant; //current ADPCM step
int curstep;
int cur_lpquant, cur_lpsample, cur_lpstep;
- uint8_t *adbase, *adlpbase;
- uint8_t lpend;
+ u32 adbase;
+ u8 lpend;
};
- unsigned char DecodeSCI(unsigned char irq);
+ u8 DecodeSCI(u8 irq);
void ResetInterrupts();
void CheckPendingIRQ();
@@ -108,56 +109,55 @@ private:
int Get_RR(int base,int R);
void Compute_EG(AICA_SLOT *slot);
int EG_Update(AICA_SLOT *slot);
- uint32_t Step(AICA_SLOT *slot);
+ u32 Step(AICA_SLOT *slot);
void Compute_LFO(AICA_SLOT *slot);
void InitADPCM(int *PrevSignal, int *PrevQuant);
- inline signed short DecodeADPCM(int *PrevSignal, unsigned char Delta, int *PrevQuant);
+ inline s16 DecodeADPCM(int *PrevSignal, u8 Delta, int *PrevQuant);
void StartSlot(AICA_SLOT *slot);
void StopSlot(AICA_SLOT *slot,int keyoff);
void Init();
void ClockChange();
void UpdateSlotReg(int s,int r);
- void UpdateReg(address_space &space, int reg);
+ void UpdateReg(int reg);
void UpdateSlotRegR(int slot,int reg);
- void UpdateRegR(address_space &space, int reg);
- void w16(address_space &space,unsigned int addr,unsigned short val);
- unsigned short r16(address_space &space, unsigned int addr);
- inline int32_t UpdateSlot(AICA_SLOT *slot);
+ void UpdateRegR(int reg);
+ void w16(u32 addr,u16 val);
+ u16 r16(u32 addr);
+ inline s32 UpdateSlot(AICA_SLOT *slot);
void DoMasterSamples(int nsamples);
- void aica_exec_dma(address_space &space);
+ void exec_dma();
- void AICALFO_Init();
- inline signed int AICAPLFO_Step(AICA_LFO_t *LFO);
- inline signed int AICAALFO_Step(AICA_LFO_t *LFO);
- void AICALFO_ComputeStep(AICA_LFO_t *LFO,uint32_t LFOF,uint32_t LFOWS,uint32_t LFOS,int ALFO);
+ void LFO_Init();
+ inline s32 PLFO_Step(AICA_LFO_t *LFO);
+ inline s32 ALFO_Step(AICA_LFO_t *LFO);
+ void LFO_ComputeStep(AICA_LFO_t *LFO,u32 LFOF,u32 LFOWS,u32 LFOS,int ALFO);
double m_rate;
- int m_roffset; /* offset in the region */
devcb_write_line m_irq_cb;
devcb_write_line m_main_irq_cb;
- optional_memory_region m_ram_region;
union
{
- uint16_t data[0xc0/2];
- uint8_t datab[0xc0];
+ u16 data[0xc0/2];
+ u8 datab[0xc0];
} m_udata;
- uint16_t m_IRQL, m_IRQR;
- uint16_t m_EFSPAN[0x48];
+ u16 m_IRQL, m_IRQR;
+ u16 m_EFSPAN[0x48];
AICA_SLOT m_Slots[64];
- unsigned char *m_AICARAM;
- uint32_t m_AICARAM_LENGTH, m_RAM_MASK, m_RAM_MASK16;
+
+ address_space *m_data;
+ memory_access_cache<1, 0, ENDIANNESS_LITTLE> *m_cache;
sound_stream * m_stream;
- uint32_t m_IrqTimA;
- uint32_t m_IrqTimBC;
- uint32_t m_IrqMidi;
+ u32 m_IrqTimA;
+ u32 m_IrqTimBC;
+ u32 m_IrqMidi;
- uint8_t m_MidiOutW,m_MidiOutR;
- uint8_t m_MidiStack[16];
- uint8_t m_MidiW,m_MidiR;
+ u8 m_MidiOutW,m_MidiOutR;
+ u8 m_MidiStack[16];
+ u8 m_MidiW,m_MidiR;
int m_LPANTABLE[0x20000];
int m_RPANTABLE[0x20000];
@@ -165,18 +165,18 @@ private:
int m_TimPris[3];
int m_TimCnt[3];
- uint16_t m_mcieb, m_mcipd;
+ u16 m_mcieb, m_mcipd;
// timers
emu_timer *m_timerA, *m_timerB, *m_timerC;
// DMA stuff
struct {
- uint32_t dmea;
- uint16_t drga;
- uint16_t dlg;
- uint8_t dgate;
- uint8_t ddir;
+ u32 dmea;
+ u16 drga;
+ u16 dlg;
+ u8 dgate;
+ u8 ddir;
} m_dma;
@@ -189,9 +189,7 @@ private:
stream_sample_t *m_exts0;
stream_sample_t *m_exts1;
- int m_length;
-
- int32_t m_EG_TABLE[0x400];
+ s32 m_EG_TABLE[0x400];
int m_PLFO_TRI[256],m_PLFO_SQR[256],m_PLFO_SAW[256],m_PLFO_NOI[256];
int m_ALFO_TRI[256],m_ALFO_SQR[256],m_ALFO_SAW[256],m_ALFO_NOI[256];
int m_PSCALES[8][256];