diff options
Diffstat (limited to 'trunk/src/emu/sound/okim6295.h')
-rw-r--r-- | trunk/src/emu/sound/okim6295.h | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/trunk/src/emu/sound/okim6295.h b/trunk/src/emu/sound/okim6295.h new file mode 100644 index 00000000000..5c11b7c6129 --- /dev/null +++ b/trunk/src/emu/sound/okim6295.h @@ -0,0 +1,125 @@ +/*************************************************************************** + + okim6295.h + + OKIM 6295 ADCPM sound chip. + +***************************************************************************/ + +#pragma once + +#ifndef __OKIM6295_H__ +#define __OKIM6295_H__ + +#include "sound/okiadpcm.h" + + + +//************************************************************************** +// CONSTANTS +//************************************************************************** + +enum +{ + OKIM6295_PIN7_LOW = 0, + OKIM6295_PIN7_HIGH = 1 +}; + + + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_OKIM6295_ADD(_tag, _clock, _pin7) \ + MCFG_DEVICE_ADD(_tag, OKIM6295, _clock) \ + MCFG_OKIM6295_PIN7(_pin7) + +#define MCFG_OKIM6295_REPLACE(_tag, _clock, _pin7) \ + MCFG_DEVICE_REPLACE(_tag, OKIM6295, _clock) \ + MCFG_OKIM6295_PIN7(_pin7) + +#define MCFG_OKIM6295_PIN7(_pin7) \ + okim6295_device::static_set_pin7(*device, _pin7); \ + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + + +// ======================> okim6295_device + +class okim6295_device : public device_t, + public device_sound_interface, + public device_memory_interface +{ +public: + // construction/destruction + okim6295_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + // inline configuration helpers + static void static_set_pin7(device_t &device, int pin7); + + // runtime configuration + void set_bank_base(offs_t base, bool bDontUpdateStream = false); + void set_pin7(int pin7); + + UINT8 read_status(); + void write_command(UINT8 command); + + DECLARE_READ8_MEMBER( read ); + DECLARE_WRITE8_MEMBER( write ); + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + virtual void device_post_load(); + virtual void device_clock_changed(); + + // device_memory_interface overrides + virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const; + + // device_sound_interface overrides + virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples); + + // a single voice + class okim_voice + { + public: + okim_voice(); + void generate_adpcm(direct_read_data &direct, stream_sample_t *buffer, int samples); + + oki_adpcm_state m_adpcm; // current ADPCM state + bool m_playing; + offs_t m_base_offset; // pointer to the base memory location + UINT32 m_sample; // current sample number + UINT32 m_count; // total samples to play + INT8 m_volume; // output volume + }; + + // configuration state + const address_space_config m_space_config; + + // internal state + static const int OKIM6295_VOICES = 4; + + okim_voice m_voice[OKIM6295_VOICES]; + INT32 m_command; + bool m_bank_installed; + offs_t m_bank_offs; + sound_stream * m_stream; + UINT8 m_pin7_state; + direct_read_data * m_direct; + + static const UINT8 s_volume_table[16]; +}; + + +// device type definition +extern const device_type OKIM6295; + + +#endif /* __OKIM6295_H__ */ |