// license:BSD-3-Clause // copyright-holders:Curt Coder /********************************************************************** LMC1992 Digitally-Controlled Stereo Tone and Volume Circuit with Four-Channel Input-Selector emulation **********************************************************************/ /* TODO: - inputs - outputs - bass - treble - volume - balance */ #include "lmc1992.h" //************************************************************************** // MACROS / CONSTANTS //************************************************************************** #define LOG 0 #define MICROWIRE_DEVICE_ADDRESS 2 enum { FUNCTION_INPUT_SELECT = 0, FUNCTION_BASS, FUNCTION_TREBLE, FUNCTION_VOLUME, FUNCTION_RIGHT_FRONT_FADER, FUNCTION_LEFT_FRONT_FADER, FUNCTION_RIGHT_REAR_FADER, FUNCTION_LEFT_REAR_FADER }; enum { INPUT_SELECT_OPEN = 0, INPUT_SELECT_INPUT1, INPUT_SELECT_INPUT2, INPUT_SELECT_INPUT3, INPUT_SELECT_INPUT4 }; //************************************************************************** // GLOBAL VARIABLES //************************************************************************** // devices const device_type LMC1992 = &device_creator; //************************************************************************** // INLINE HELPERS //************************************************************************** //------------------------------------------------- // execute_command - //------------------------------------------------- inline void lmc1992_device::execute_command(int addr, int data) { switch (addr) { case FUNCTION_INPUT_SELECT: if (data == INPUT_SELECT_OPEN) { if (LOG) logerror("LMC1992 '%s' Input Select : OPEN\n", tag()); } else { if (LOG) logerror("LMC1992 '%s' Input Select : INPUT%u\n", tag(), data); } m_input = data; break; case FUNCTION_BASS: if (LOG) logerror("LMC1992 '%s' Bass : %i dB\n", tag(), -40 + (data * 2)); m_bass = data; break; case FUNCTION_TREBLE: if (LOG) logerror("LMC1992 '%s' Treble : %i dB\n", tag(), -40 + (data * 2)); m_treble = data; break; case FUNCTION_VOLUME: if (LOG) logerror("LMC1992 '%s' Volume : %i dB\n", tag(), -80 + (data * 2)); m_volume = data; break; case FUNCTION_RIGHT_FRONT_FADER: if (LOG) logerror("LMC1992 '%s' Right Front Fader : %i dB\n", tag(), -40 + (data * 2)); m_fader_rf = data; break; case FUNCTION_LEFT_FRONT_FADER: if (LOG) logerror("LMC1992 '%s' Left Front Fader : %i dB\n", tag(), -40 + (data * 2)); m_fader_lf = data; break; case FUNCTION_RIGHT_REAR_FADER: if (LOG) logerror("LMC1992 '%s' Right Rear Fader : %i dB\n", tag(), -40 + (data * 2)); m_fader_rr = data; break; case FUNCTION_LEFT_REAR_FADER: if (LOG) logerror("LMC1992 '%s' Left Rear Fader : %i dB\n", tag(), -40 + (data * 2)); m_fader_lr = data; break; } } //************************************************************************** // LIVE DEVICE //************************************************************************** //------------------------------------------------- // lmc1992_device - constructor //------------------------------------------------- lmc1992_device::lmc1992_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : device_t(mconfig, LMC1992, "LMC1992", tag, owner, clock, "lmc1992", __FILE__), device_sound_interface(mconfig, *this) { } //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- void lmc1992_device::device_start() { // create sound streams // register for state saving save_item(NAME(m_enable)); save_item(NAME(m_data)); save_item(NAME(m_clk)); save_item(NAME(m_si)); save_item(NAME(m_input)); save_item(NAME(m_bass)); save_item(NAME(m_treble)); save_item(NAME(m_volume)); save_item(NAME(m_fader_rf)); save_item(NAME(m_fader_lf)); save_item(NAME(m_fader_rr)); save_item(NAME(m_fader_lr)); } //------------------------------------------------- // sound_stream_update - handle update requests for // our sound stream //------------------------------------------------- void lmc1992_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) { } //------------------------------------------------- // clock_w - //------------------------------------------------- WRITE_LINE_MEMBER( lmc1992_device::clock_w ) { if ((m_enable == 0) && ((m_clk == 0) && (state == 1))) { m_si >>= 1; m_si = m_si & 0x7fff; if (m_data) { m_si &= 0x8000; } } m_clk = state; } //------------------------------------------------- // data_w - //------------------------------------------------- WRITE_LINE_MEMBER( lmc1992_device::data_w ) { m_data = state; } //------------------------------------------------- // enable_w - //------------------------------------------------- WRITE_LINE_MEMBER( lmc1992_device::enable_w ) { if ((m_enable == 0) && (state == 1)) { UINT8 device_addr = (m_si & 0xc000) >> 14; UINT8 addr = (m_si & 0x3800) >> 11; UINT8 data = (m_si & 0x07e0) >> 5; if (device_addr == MICROWIRE_DEVICE_ADDRESS) { execute_command(addr, data); } } m_enable = state; }