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 | |
parent | 8a07dafbafd614e9d060b827e2e0a49185e284ba (diff) |
Added generic latch to replace soundlatch in driver_device (nw)
Diffstat (limited to 'src/devices/machine')
-rw-r--r-- | src/devices/machine/gen_latch.cpp | 155 | ||||
-rw-r--r-- | src/devices/machine/gen_latch.h | 80 |
2 files changed, 235 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)); +} + + diff --git a/src/devices/machine/gen_latch.h b/src/devices/machine/gen_latch.h new file mode 100644 index 00000000000..65149fc5985 --- /dev/null +++ b/src/devices/machine/gen_latch.h @@ -0,0 +1,80 @@ +// license:BSD-3-Clause +// copyright-holders:Miodrag Milanovic +/*************************************************************************** + + Generic 8bit and 16 bit latch devices + +***************************************************************************/ + +#pragma once + +#ifndef __GEN_LATCH_H__ +#define __GEN_LATCH_H__ + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_GENERIC_LATCH_8_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, GENERIC_LATCH_8, 0) + +#define MCFG_GENERIC_LATCH_16_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, GENERIC_LATCH_16, 0) + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> generic_latch_8_device + +class generic_latch_8_device : public device_t +{ +public: + // construction/destruction + generic_latch_8_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + DECLARE_READ8_MEMBER( read ); + DECLARE_WRITE8_MEMBER( write ); + DECLARE_WRITE_LINE_MEMBER( preset_w ); + DECLARE_WRITE_LINE_MEMBER( clear_w ); + +protected: + virtual void device_start() override; + + void sync_callback(void *ptr, INT32 param); +private: + UINT16 m_latched_value; + UINT8 m_latch_read; +}; + +// device type definition +extern const device_type GENERIC_LATCH_8; + + +// ======================> generic_latch_16_device + +class generic_latch_16_device : public device_t +{ +public: + // construction/destruction + generic_latch_16_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + DECLARE_READ16_MEMBER( read ); + DECLARE_WRITE16_MEMBER( write ); + DECLARE_WRITE_LINE_MEMBER( preset_w ); + DECLARE_WRITE_LINE_MEMBER( clear_w ); + +protected: + virtual void device_start() override; + + void sync_callback(void *ptr, INT32 param); +private: + UINT16 m_latched_value; + UINT8 m_latch_read; +}; + +// device type definition +extern const device_type GENERIC_LATCH_16; + + +#endif /* __GEN_LATCH_H__ */ |