diff options
Diffstat (limited to 'src/emu/machine/adc1038.c')
-rw-r--r-- | src/emu/machine/adc1038.c | 210 |
1 files changed, 77 insertions, 133 deletions
diff --git a/src/emu/machine/adc1038.c b/src/emu/machine/adc1038.c index 05675c3de89..d40614343d3 100644 --- a/src/emu/machine/adc1038.c +++ b/src/emu/machine/adc1038.c @@ -10,185 +10,129 @@ #include "emu.h" #include "adc1038.h" -/*************************************************************************** - TYPE DEFINITIONS -***************************************************************************/ -struct adc1038_state +const device_type ADC1038 = &device_creator<adc1038_device>; + +adc1038_device::adc1038_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, ADC1038, "A/D Converters 1038", tag, owner, clock) { - int cycle; - int clk; - int adr; - int data_in; - int data_out; - int adc_data; - int sars; - adc1038_input_read_func input_callback_r; - - int gticlub_hack; -}; +} -/***************************************************************************** - INLINE FUNCTIONS -*****************************************************************************/ +//------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- -INLINE adc1038_state *adc1038_get_safe_token( device_t *device ) +void adc1038_device::device_config_complete() { - assert(device != NULL); - assert(device->type() == ADC1038); + // inherit a copy of the static data + const adc1038_interface *intf = reinterpret_cast<const adc1038_interface *>(static_config()); + if (intf != NULL) + *static_cast<adc1038_interface *>(this) = *intf; - return (adc1038_state *)downcast<adc1038_device *>(device)->token(); + // or initialize to defaults if none provided + else + { + input_callback_r = NULL; + } } -INLINE const adc1038_interface *adc1038_get_interface( device_t *device ) +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void adc1038_device::device_start() +{ + m_input_callback_r_func = input_callback_r; + + save_item(NAME(m_cycle)); + save_item(NAME(m_clk)); + save_item(NAME(m_adr)); + save_item(NAME(m_data_in)); + save_item(NAME(m_data_out)); + save_item(NAME(m_adc_data)); + save_item(NAME(m_sars)); +} + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void adc1038_device::device_reset() { - assert(device != NULL); - assert((device->type() == ADC1038)); - return (const adc1038_interface *) device->static_config(); + m_cycle = 0; + m_clk = 0; + m_adr = 0; + m_data_in = 0; + m_data_out = 0; + m_adc_data = 0; + m_sars = 1; } /***************************************************************************** DEVICE HANDLERS *****************************************************************************/ -READ_LINE_DEVICE_HANDLER( adc1038_do_read ) +READ_LINE_MEMBER( adc1038_device::do_read ) { - adc1038_state *adc1038 = adc1038_get_safe_token(device); - - adc1038->data_out = (adc1038->adc_data & 0x200) ? 1 : 0; - adc1038->adc_data <<= 1; + m_data_out = (m_adc_data & 0x200) ? 1 : 0; + m_adc_data <<= 1; //printf("ADC DO\n"); - return adc1038->data_out; + return m_data_out; } -WRITE_LINE_DEVICE_HANDLER( adc1038_di_write ) +WRITE_LINE_MEMBER( adc1038_device::di_write ) { - adc1038_state *adc1038 = adc1038_get_safe_token(device); - - adc1038->data_in = state; + m_data_in = state; } -WRITE_LINE_DEVICE_HANDLER( adc1038_clk_write ) +WRITE_LINE_MEMBER( adc1038_device::clk_write ) { - adc1038_state *adc1038 = adc1038_get_safe_token(device); - // GTI Club doesn't sync on SARS - if (adc1038->gticlub_hack) + if (m_gticlub_hack) { - if (adc1038->clk == 0 && state == 0) + if (m_clk == 0 && state == 0) { - adc1038->cycle = 0; + m_cycle = 0; - /* notice that adc1038->adr is always < 7! */ - adc1038->adc_data = adc1038->input_callback_r(device, adc1038->adr); + /* notice that m_adr is always < 7! */ + m_adc_data = m_input_callback_r_func(this, m_adr); } } if (state == 1) { - //printf("ADC CLK, DI = %d, cycle = %d\n", adc1038->data_in, adc1038->cycle); + //printf("ADC CLK, DI = %d, cycle = %d\n", m_data_in, m_cycle); - if (adc1038->cycle == 0) // A2 + if (m_cycle == 0) // A2 { - adc1038->adr = 0; - adc1038->adr |= (adc1038->data_in << 2); + m_adr = 0; + m_adr |= (m_data_in << 2); } - else if (adc1038->cycle == 1) // A1 + else if (m_cycle == 1) // A1 { - adc1038->adr |= (adc1038->data_in << 1); + m_adr |= (m_data_in << 1); } - else if (adc1038->cycle == 2) // A0 + else if (m_cycle == 2) // A0 { - adc1038->adr |= (adc1038->data_in << 0); + m_adr |= (m_data_in << 0); } - adc1038->cycle++; + m_cycle++; } - adc1038->clk = state; + m_clk = state; } -READ_LINE_DEVICE_HANDLER( adc1038_sars_read ) +READ_LINE_MEMBER( adc1038_device::sars_read ) { - adc1038_state *adc1038 = adc1038_get_safe_token(device); + m_cycle = 0; - adc1038->cycle = 0; + /* notice that m_adr is always < 7! */ + m_adc_data = m_input_callback_r_func(this, m_adr); - /* notice that adc1038->adr is always < 7! */ - adc1038->adc_data = adc1038->input_callback_r(device, adc1038->adr); - - adc1038->sars ^= 1; - return adc1038->sars; -} - - -/***************************************************************************** - DEVICE INTERFACE -*****************************************************************************/ - -static DEVICE_START( adc1038 ) -{ - adc1038_state *adc1038 = adc1038_get_safe_token(device); - const adc1038_interface *intf = adc1038_get_interface(device); - - adc1038->gticlub_hack = intf->gticlub_hack; - adc1038->input_callback_r = intf->input_callback_r; - - device->save_item(NAME(adc1038->cycle)); - device->save_item(NAME(adc1038->clk)); - device->save_item(NAME(adc1038->adr)); - device->save_item(NAME(adc1038->data_in)); - device->save_item(NAME(adc1038->data_out)); - device->save_item(NAME(adc1038->adc_data)); - device->save_item(NAME(adc1038->sars)); -} - -static DEVICE_RESET( adc1038 ) -{ - adc1038_state *adc1038 = adc1038_get_safe_token(device); - - adc1038->cycle = 0; - adc1038->clk = 0; - adc1038->adr = 0; - adc1038->data_in = 0; - adc1038->data_out = 0; - adc1038->adc_data = 0; - adc1038->sars = 1; -} - -const device_type ADC1038 = &device_creator<adc1038_device>; - -adc1038_device::adc1038_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : device_t(mconfig, ADC1038, "A/D Converters 1038", tag, owner, clock) -{ - m_token = global_alloc_clear(adc1038_state); -} - -//------------------------------------------------- -// device_config_complete - perform any -// operations now that the configuration is -// complete -//------------------------------------------------- - -void adc1038_device::device_config_complete() -{ -} - -//------------------------------------------------- -// device_start - device-specific startup -//------------------------------------------------- - -void adc1038_device::device_start() -{ - DEVICE_START_NAME( adc1038 )(this); -} - -//------------------------------------------------- -// device_reset - device-specific reset -//------------------------------------------------- - -void adc1038_device::device_reset() -{ - DEVICE_RESET_NAME( adc1038 )(this); + m_sars ^= 1; + return m_sars; } |