diff options
Diffstat (limited to 'trunk/src/emu/sound/okim9810.h')
-rw-r--r-- | trunk/src/emu/sound/okim9810.h | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/trunk/src/emu/sound/okim9810.h b/trunk/src/emu/sound/okim9810.h new file mode 100644 index 00000000000..459c4edc046 --- /dev/null +++ b/trunk/src/emu/sound/okim9810.h @@ -0,0 +1,162 @@ +/*************************************************************************** + + okim9810.h + + OKI MSM9810 ADCPM(2) sound chip. + + Notes: + The master clock frequency for this chip can range from 3.5MHz to 4.5Mhz. + The typical oscillator is a 4.096Mhz crystal. + +***************************************************************************/ + +#pragma once + +#ifndef __OKIM9810_H__ +#define __OKIM9810_H__ + +#include "okiadpcm.h" + + +//************************************************************************** +// CONSTANTS +//************************************************************************** + +enum +{ + OKIM9810_ADPCM_PLAYBACK = 0, + OKIM9810_ADPCM2_PLAYBACK = 1, + OKIM9810_STRAIGHT8_PLAYBACK = 2, + OKIM9810_NONLINEAR8_PLAYBACK = 3 +}; + +enum +{ + OKIM9810_SECONDARY_FILTER = 0, + OKIM9810_PRIMARY_FILTER = 1, + OKIM9810_NO_FILTER = 2, + OKIM9810_NO_FILTER2 = 3 +}; + +enum +{ + OKIM9810_OUTPUT_TO_DIRECT_DAC = 0, + OKIM9810_OUTPUT_TO_VOLTAGE_FOLLOWER = 1 +}; + + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_OKIM9810_ADD(_tag, _clock) \ + MCFG_DEVICE_ADD(_tag, OKIM9810, _clock) + +#define MCFG_OKIM9810_REPLACE(_tag, _clock) \ + MCFG_DEVICE_REPLACE(_tag, OKIM9810, _clock) + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + + +// ======================> okim9810_device + +class okim9810_device : public device_t, + public device_sound_interface, + public device_memory_interface +{ +public: + // construction/destruction + okim9810_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + UINT8 read_status(); + void write_TMP_register(UINT8 command); + void write_command(UINT8 command); + + DECLARE_READ8_MEMBER( read ); + DECLARE_WRITE8_MEMBER( write ); + DECLARE_WRITE8_MEMBER( write_TMP_register ); + +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_audio(direct_read_data &direct, + stream_sample_t **buffers, + int samples, + const UINT8 global_volume, + const UINT32 clock, + const UINT8 filter_type); + + // computes volume scale from 3 volume numbers + UINT8 volume_scale(const UINT8 global_volume, + const UINT8 channel_volume, + const UINT8 pan_volume) const; + + oki_adpcm_state m_adpcm; // current ADPCM state + oki_adpcm2_state m_adpcm2; // current ADPCM2 state + UINT8 m_playbackAlgo; // current playback method + bool m_looping; + UINT8 m_startFlags; + UINT8 m_endFlags; + offs_t m_base_offset; // pointer to the base memory location + UINT32 m_count; // total samples to play + UINT32 m_samplingFreq; // voice sampling frequency + + bool m_playing; // playback state + UINT32 m_sample; // current sample number + + UINT8 m_channel_volume; // volume index set with the CVOL command + UINT8 m_pan_volume_left; // volume index set with the PAN command + UINT8 m_pan_volume_right; // volume index set with the PAN command + + INT32 m_startSample; // interpolation state - sample to interpolate from + INT32 m_endSample; // interpolation state - sample to interpolate to + UINT32 m_interpSampleNum; // interpolation state - fraction between start & end + + static const UINT8 s_volume_table[16]; + }; + + + // internal state + const address_space_config m_space_config; + + sound_stream* m_stream; + direct_read_data* m_direct; + + UINT8 m_TMP_register; + + UINT8 m_global_volume; // volume index set with the OPT command + UINT8 m_filter_type; // interpolation filter type set with the OPT command + UINT8 m_output_level; // flag stating if a voltage follower is connected + + static const int OKIM9810_VOICES = 8; + okim_voice m_voice[OKIM9810_VOICES]; + + static const UINT32 s_sampling_freq_table[16]; +}; + + +// device type definition +extern const device_type OKIM9810; + + + +#endif // __OKIM9810_H__ |