diff options
author | 2016-04-18 14:08:54 +0200 | |
---|---|---|
committer | 2016-04-18 14:08:54 +0200 | |
commit | c47bd3a9370dde25764b2153c235f6c57acaacda (patch) | |
tree | 8a85b614de608dc3294c4f59df20bb74d6e177ad /src/devices/machine/gen_latch.cpp | |
parent | 8a07dafbafd614e9d060b827e2e0a49185e284ba (diff) |
Added generic latch to replace soundlatch in driver_device (nw)
Diffstat (limited to 'src/devices/machine/gen_latch.cpp')
-rw-r--r-- | src/devices/machine/gen_latch.cpp | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/src/devices/machine/gen_latch.cpp b/src/devices/machine/gen_latch.cpp new file mode 100644 index 00000000000..54982bc7e85 --- /dev/null +++ b/src/devices/machine/gen_latch.cpp @@ -0,0 +1,155 @@ +// license:BSD-3-Clause +// copyright-holders:Miodrag Milanovic +/*************************************************************************** + + Generic 8bit and 16 bit latch devices + +***************************************************************************/ +#include "emu.h" +#include "gen_latch.h" + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type GENERIC_LATCH_8 = &device_creator<generic_latch_8_device>; + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// generic_latch_8_device - constructor +//------------------------------------------------- + +generic_latch_8_device::generic_latch_8_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, GENERIC_LATCH_8, "Generic 8-bit latch", tag, owner, clock, "generic_latch_8", __FILE__), + m_latched_value(0), + m_latch_read(0) +{ +} + +READ8_MEMBER( generic_latch_8_device::read ) +{ + m_latch_read = 1; + return m_latched_value; +} + +WRITE8_MEMBER( generic_latch_8_device::write ) +{ + machine().scheduler().synchronize(timer_expired_delegate(FUNC(generic_latch_8_device::sync_callback), this), data); +} + +WRITE_LINE_MEMBER( generic_latch_8_device::preset_w ) +{ + m_latched_value = 0xff; +} + +WRITE_LINE_MEMBER( generic_latch_8_device::clear_w ) +{ + m_latched_value = 0x00; +} + +//------------------------------------------------- +// soundlatch_sync_callback - time-delayed +// callback to set a latch value +//------------------------------------------------- + +void generic_latch_8_device::sync_callback(void *ptr, INT32 param) +{ + UINT8 value = param; + + // if the latch hasn't been read and the value is changed, log a warning + if (!m_latch_read && m_latched_value != value) + logerror("Warning: latch %s written before being read. Previous: %02x, new: %02x\n", tag(), m_latched_value, value); + + // store the new value and mark it not read + m_latched_value = value; + m_latch_read = 0; +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void generic_latch_8_device::device_start() +{ + // register for state saving + save_item(NAME(m_latched_value)); + save_item(NAME(m_latch_read)); +} + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type GENERIC_LATCH_16 = &device_creator<generic_latch_16_device>; + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// generic_latch_16_device - constructor +//------------------------------------------------- + +generic_latch_16_device::generic_latch_16_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, GENERIC_LATCH_16, "Generic 16-bit latch", tag, owner, clock, "generic_latch_16", __FILE__), + m_latched_value(0), + m_latch_read(0) +{ +} + +READ16_MEMBER( generic_latch_16_device::read ) +{ + m_latch_read = 1; + return m_latched_value; +} + +WRITE16_MEMBER( generic_latch_16_device::write ) +{ + machine().scheduler().synchronize(timer_expired_delegate(FUNC(generic_latch_16_device::sync_callback), this), data); +} + +WRITE_LINE_MEMBER( generic_latch_16_device::preset_w ) +{ + m_latched_value = 0xffff; +} + +WRITE_LINE_MEMBER( generic_latch_16_device::clear_w ) +{ + m_latched_value = 0x0000; +} + +//------------------------------------------------- +// soundlatch_sync_callback - time-delayed +// callback to set a latch value +//------------------------------------------------- + +void generic_latch_16_device::sync_callback(void *ptr, INT32 param) +{ + UINT16 value = param; + + // if the latch hasn't been read and the value is changed, log a warning + if (!m_latch_read && m_latched_value != value) + logerror("Warning: latch %s written before being read. Previous: %02x, new: %02x\n", tag(), m_latched_value, value); + + // store the new value and mark it not read + m_latched_value = value; + m_latch_read = 0; +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void generic_latch_16_device::device_start() +{ + // register for state saving + save_item(NAME(m_latched_value)); + save_item(NAME(m_latch_read)); +} + + |