diff options
Diffstat (limited to 'src/devices/sound/aica.h')
-rw-r--r-- | src/devices/sound/aica.h | 114 |
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]; |