summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/gen_latch.cpp
diff options
context:
space:
mode:
author Miodrag Milanovic <mmicko@gmail.com>2016-04-18 14:08:54 +0200
committer Miodrag Milanovic <mmicko@gmail.com>2016-04-18 14:08:54 +0200
commitc47bd3a9370dde25764b2153c235f6c57acaacda (patch)
tree8a85b614de608dc3294c4f59df20bb74d6e177ad /src/devices/machine/gen_latch.cpp
parent8a07dafbafd614e9d060b827e2e0a49185e284ba (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.cpp155
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));
+}
+
+