From 0445eff6bacee45ae60a56e2006da73d4e376f63 Mon Sep 17 00:00:00 2001 From: Ryan Holtz Date: Tue, 24 Aug 2010 23:40:33 +0000 Subject: Fixed 6821pia and 7474, fixes for 6522via incoming. carpolo now works again. No whatsnew. --- src/emu/machine/6821pia.c | 20 ++++++++++ src/emu/machine/7474.c | 95 +++++++++++++++++++++++++++++++++++------------ src/emu/machine/7474.h | 22 +++++++---- 3 files changed, 107 insertions(+), 30 deletions(-) (limited to 'src/emu/machine') diff --git a/src/emu/machine/6821pia.c b/src/emu/machine/6821pia.c index a6913c6a5b6..8b96f268381 100644 --- a/src/emu/machine/6821pia.c +++ b/src/emu/machine/6821pia.c @@ -82,7 +82,27 @@ device_t *pia6821_device_config::alloc_device(running_machine &machine) const void pia6821_device_config::device_config_complete() { + // inherit a copy of the static data + const pia6821_interface *intf = reinterpret_cast(static_config()); + if (intf != NULL) + *static_cast(this) = *intf; + // or initialize to defaults if none provided + else + { + memset(&m_in_a_func, 0, sizeof(m_in_a_func)); + memset(&m_in_b_func, 0, sizeof(m_in_b_func)); + memset(&m_in_ca1_func, 0, sizeof(m_in_ca1_func)); + memset(&m_in_cb1_func, 0, sizeof(m_in_cb1_func)); + memset(&m_in_ca2_func, 0, sizeof(m_in_ca2_func)); + memset(&m_in_cb2_func, 0, sizeof(m_in_cb2_func)); + memset(&m_out_a_func, 0, sizeof(m_out_a_func)); + memset(&m_out_b_func, 0, sizeof(m_out_b_func)); + memset(&m_out_ca2_func, 0, sizeof(m_out_ca2_func)); + memset(&m_out_cb2_func, 0, sizeof(m_out_cb2_func)); + memset(&m_irq_a_func, 0, sizeof(m_irq_a_func)); + memset(&m_irq_b_func, 0, sizeof(m_irq_b_func)); + } } diff --git a/src/emu/machine/7474.c b/src/emu/machine/7474.c index b3bba22c6d0..254e3b4bb29 100644 --- a/src/emu/machine/7474.c +++ b/src/emu/machine/7474.c @@ -76,6 +76,29 @@ device_t *ttl7474_device_config::alloc_device(running_machine &machine) const +//------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- + +void ttl7474_device_config::device_config_complete() +{ + m_target_tag = reinterpret_cast(m_inline_data[INLINE_TARGET_TAG]); + m_base_output_cb = reinterpret_cast(m_inline_data[INLINE_OUTPUT_CB]); + m_base_comp_output_cb = reinterpret_cast(m_inline_data[INLINE_COMP_OUTPUT_CB]); + + m_output_cb.type = DEVCB_TYPE_DEVICE; + m_output_cb.tag = m_target_tag; + m_output_cb.writeline = m_base_output_cb; + + m_comp_output_cb.type = DEVCB_TYPE_DEVICE; + m_comp_output_cb.tag = m_target_tag; + m_comp_output_cb.writeline = m_base_comp_output_cb; +} + + + //************************************************************************** // LIVE DEVICE //************************************************************************** @@ -97,7 +120,15 @@ ttl7474_device::ttl7474_device(running_machine &_machine, const ttl7474_device_c void ttl7474_device::device_start() { - register_globals(); + state_save_register_device_item(this, 0, m_clear); + state_save_register_device_item(this, 0, m_preset); + state_save_register_device_item(this, 0, m_clk); + state_save_register_device_item(this, 0, m_d); + state_save_register_device_item(this, 0, m_output); + state_save_register_device_item(this, 0, m_output_comp); + state_save_register_device_item(this, 0, m_last_clock); + state_save_register_device_item(this, 0, m_last_output); + state_save_register_device_item(this, 0, m_last_output_comp); devcb_resolve_write_line(&m_output_cb, &m_config.m_output_cb, this); devcb_resolve_write_line(&m_comp_output_cb, &m_config.m_comp_output_cb, this); @@ -112,9 +143,14 @@ void ttl7474_device::device_reset() init(); } + +//------------------------------------------------- +// update - update internal state +//------------------------------------------------- + void ttl7474_device::update() { - if (!m_preset && m_clear) /* line 1 in truth table */ + if (!m_preset && m_clear) /* line 1 in truth table */ { m_output = 1; m_output_comp = 0; @@ -129,32 +165,34 @@ void ttl7474_device::update() m_output = 1; m_output_comp = 1; } - else if (!m_last_clock && m_clock) /* line 4 in truth table */ + else if (!m_last_clock && m_clk) /* line 4 in truth table */ { m_output = m_d; m_output_comp = !m_d; } - m_last_clock = m_clock; + m_last_clock = m_clk; /* call callback if any of the outputs changed */ if (m_output != m_last_output) { m_last_output = m_output; - if (m_output_cb.write != NULL) - devcb_call_write_line(&m_output_cb, m_output); + devcb_call_write_line(&m_output_cb, m_output); } /* call callback if any of the outputs changed */ if (m_output_comp != m_last_output_comp) { m_last_output_comp = m_output_comp; - if (m_comp_output_cb.write != NULL) - devcb_call_write_line(&m_comp_output_cb, m_output_comp); + devcb_call_write_line(&m_comp_output_cb, m_output_comp); } } +//------------------------------------------------- +// clear_w - set the clear line state +//------------------------------------------------- + WRITE_LINE_DEVICE_HANDLER( ttl7474_clear_w ) { downcast(device)->clear_w(state); @@ -166,6 +204,11 @@ void ttl7474_device::clear_w(UINT8 state) update(); } + +//------------------------------------------------- +// clear_w - set the clear line state +//------------------------------------------------- + WRITE_LINE_DEVICE_HANDLER( ttl7474_preset_w ) { downcast(device)->preset_w(state); @@ -177,6 +220,11 @@ void ttl7474_device::preset_w(UINT8 state) update(); } + +//------------------------------------------------- +// clock_w - set the clock line state +//------------------------------------------------- + WRITE_LINE_DEVICE_HANDLER( ttl7474_clock_w ) { downcast(device)->clock_w(state); @@ -184,10 +232,15 @@ WRITE_LINE_DEVICE_HANDLER( ttl7474_clock_w ) void ttl7474_device::clock_w(UINT8 state) { - m_clock = state & 1; + m_clk = state & 1; update(); } + +//------------------------------------------------- +// d_w - set the d line state +//------------------------------------------------- + WRITE_LINE_DEVICE_HANDLER( ttl7474_d_w ) { downcast(device)->d_w(state); @@ -200,6 +253,10 @@ void ttl7474_device::d_w(UINT8 state) } +//------------------------------------------------- +// output_r - get the output line state +//------------------------------------------------- + READ_LINE_DEVICE_HANDLER( ttl7474_output_r ) { return downcast(device)->output_r(); @@ -210,6 +267,11 @@ UINT8 ttl7474_device::output_r() return m_output; } + +//----------------------------------------------------- +// output_comp_r - get the output-compare line state +//----------------------------------------------------- + READ_LINE_DEVICE_HANDLER( ttl7474_output_comp_r ) { return downcast(device)->output_comp_r(); @@ -224,7 +286,7 @@ void ttl7474_device::init() { m_clear = 1; m_preset = 1; - m_clock = 1; + m_clk = 1; m_d = 1; m_output = -1; @@ -232,17 +294,4 @@ void ttl7474_device::init() m_last_output = -1; } -void ttl7474_device::register_globals() -{ - state_save_register_device_item(this, 0, m_clear); - state_save_register_device_item(this, 0, m_preset); - state_save_register_device_item(this, 0, m_clock); - state_save_register_device_item(this, 0, m_d); - state_save_register_device_item(this, 0, m_output); - state_save_register_device_item(this, 0, m_output_comp); - state_save_register_device_item(this, 0, m_last_clock); - state_save_register_device_item(this, 0, m_last_output); - state_save_register_device_item(this, 0, m_last_output_comp); -} - const device_type MACHINE_TTL7474 = ttl7474_device_config::static_alloc_device_config; diff --git a/src/emu/machine/7474.h b/src/emu/machine/7474.h index d3878925262..1d34c794ec7 100644 --- a/src/emu/machine/7474.h +++ b/src/emu/machine/7474.h @@ -52,14 +52,19 @@ #define MDRV_7474_ADD(_tag, _target_tag, _output_cb, _comp_output_cb) \ MDRV_DEVICE_ADD(_tag, MACHINE_TTL7474, 0) \ + MDRV_7474_TARGET_TAG(_target_tag) \ MDRV_7474_OUTPUT_CB(_output_cb) \ MDRV_7474_COMP_OUTPUT_CB(_comp_output_cb) #define MDRV_7474_REPLACE(_tag, _target_tag, _output_cb, _comp_output_cb) \ MDRV_DEVICE_REPLACE(_tag, TTL7474, 0) \ + MDRV_7474_TARGET_TAG(_target_tag) \ MDRV_7474_OUTPUT_CB(_output_cb) \ MDRV_7474_COMP_OUTPUT_CB(_comp_output_cb) +#define MDRV_7474_TARGET_TAG(_target_tag) \ + MDRV_DEVICE_INLINE_DATAPTR(ttl7474_device_config::INLINE_TARGET_TAG, _target_tag) + #define MDRV_7474_OUTPUT_CB(_cb) \ MDRV_DEVICE_INLINE_DATAPTR(ttl7474_device_config::INLINE_OUTPUT_CB, _cb) @@ -86,19 +91,23 @@ public: static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); virtual device_t *alloc_device(running_machine &machine) const; - // inline configuration indexes go here (none yet) - - // indexes to inline data + // inline configuration indexes go here enum { + INLINE_TARGET_TAG, INLINE_OUTPUT_CB, INLINE_COMP_OUTPUT_CB }; protected: - // device_config overrides (none yet) + // device_config overrides + virtual void device_config_complete(); + + // internal state goes here + const char *m_target_tag; + void (*m_base_output_cb)(device_t *device, INT32); + void (*m_base_comp_output_cb)(device_t *device, INT32); - // internal state goes here (none yet) devcb_write_line m_output_cb; devcb_write_line m_comp_output_cb; }; @@ -140,7 +149,7 @@ private: /* inputs */ UINT8 m_clear; /* pin 1/13 */ UINT8 m_preset; /* pin 4/10 */ - UINT8 m_clock; /* pin 3/11 */ + UINT8 m_clk; /* pin 3/11 */ UINT8 m_d; /* pin 2/12 */ /* outputs */ @@ -153,7 +162,6 @@ private: UINT8 m_last_output_comp; void update(); - void register_globals(); void init(); }; -- cgit v1.2.3-70-g09d2