summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/latch8.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/latch8.h')
-rw-r--r--src/devices/machine/latch8.h156
1 files changed, 55 insertions, 101 deletions
diff --git a/src/devices/machine/latch8.h b/src/devices/machine/latch8.h
index 6d9ce374558..fbaa5ebfaca 100644
--- a/src/devices/machine/latch8.h
+++ b/src/devices/machine/latch8.h
@@ -7,8 +7,7 @@
Generic emulation of 74LS174/175, 74LS259 and other latches.
Apart from providing synched latch operation, these
latches can be configured to read their input bitwise from other
- devices as well and individual bits can be connected to
- discrete nodes.
+ devices as well.
Please see audio/dkong.c for examples.
@@ -42,26 +41,26 @@ public:
/* read bit x */
/* return (latch >> x) & 0x01 */
- DECLARE_READ8_MEMBER( bit0_r );
- DECLARE_READ8_MEMBER( bit1_r );
- DECLARE_READ8_MEMBER( bit2_r );
- DECLARE_READ8_MEMBER( bit3_r );
- DECLARE_READ8_MEMBER( bit4_r );
- DECLARE_READ8_MEMBER( bit5_r );
- DECLARE_READ8_MEMBER( bit6_r );
- DECLARE_READ8_MEMBER( bit7_r );
+ DECLARE_READ_LINE_MEMBER( bit0_r );
+ DECLARE_READ_LINE_MEMBER( bit1_r );
+ DECLARE_READ_LINE_MEMBER( bit2_r );
+ DECLARE_READ_LINE_MEMBER( bit3_r );
+ DECLARE_READ_LINE_MEMBER( bit4_r );
+ DECLARE_READ_LINE_MEMBER( bit5_r );
+ DECLARE_READ_LINE_MEMBER( bit6_r );
+ DECLARE_READ_LINE_MEMBER( bit7_r );
/* read inverted bit x */
/* return (latch >> x) & 0x01 */
- DECLARE_READ8_MEMBER( bit0_q_r );
- DECLARE_READ8_MEMBER( bit1_q_r );
- DECLARE_READ8_MEMBER( bit2_q_r );
- DECLARE_READ8_MEMBER( bit3_q_r );
- DECLARE_READ8_MEMBER( bit4_q_r );
- DECLARE_READ8_MEMBER( bit5_q_r );
- DECLARE_READ8_MEMBER( bit6_q_r );
- DECLARE_READ8_MEMBER( bit7_q_r );
+ DECLARE_READ_LINE_MEMBER( bit0_q_r );
+ DECLARE_READ_LINE_MEMBER( bit1_q_r );
+ DECLARE_READ_LINE_MEMBER( bit2_q_r );
+ DECLARE_READ_LINE_MEMBER( bit3_q_r );
+ DECLARE_READ_LINE_MEMBER( bit4_q_r );
+ DECLARE_READ_LINE_MEMBER( bit5_q_r );
+ DECLARE_READ_LINE_MEMBER( bit6_q_r );
+ DECLARE_READ_LINE_MEMBER( bit7_q_r );
/* write bit x from data into bit determined by offset */
/* latch = (latch & ~(1<<offset)) | (((data >> x) & 0x01) << offset) */
@@ -79,23 +78,9 @@ public:
static void set_xorvalue(device_t &device, uint32_t xorvalue) { downcast<latch8_device &>(device).m_xorvalue = xorvalue; }
static void set_nosync(device_t &device, uint32_t nosync) { downcast<latch8_device &>(device).m_nosync = nosync; }
- template<class _Object> static devcb_base &set_write_0(device_t &device, _Object object, uint32_t offset) { downcast<latch8_device &>(device).m_offset[0] = offset; return downcast<latch8_device &>(device).m_write_0.set_callback(object); }
- template<class _Object> static devcb_base &set_write_1(device_t &device, _Object object, uint32_t offset) { downcast<latch8_device &>(device).m_offset[1] = offset; return downcast<latch8_device &>(device).m_write_1.set_callback(object); }
- template<class _Object> static devcb_base &set_write_2(device_t &device, _Object object, uint32_t offset) { downcast<latch8_device &>(device).m_offset[2] = offset; return downcast<latch8_device &>(device).m_write_2.set_callback(object); }
- template<class _Object> static devcb_base &set_write_3(device_t &device, _Object object, uint32_t offset) { downcast<latch8_device &>(device).m_offset[3] = offset; return downcast<latch8_device &>(device).m_write_3.set_callback(object); }
- template<class _Object> static devcb_base &set_write_4(device_t &device, _Object object, uint32_t offset) { downcast<latch8_device &>(device).m_offset[4] = offset; return downcast<latch8_device &>(device).m_write_4.set_callback(object); }
- template<class _Object> static devcb_base &set_write_5(device_t &device, _Object object, uint32_t offset) { downcast<latch8_device &>(device).m_offset[5] = offset; return downcast<latch8_device &>(device).m_write_5.set_callback(object); }
- template<class _Object> static devcb_base &set_write_6(device_t &device, _Object object, uint32_t offset) { downcast<latch8_device &>(device).m_offset[6] = offset; return downcast<latch8_device &>(device).m_write_6.set_callback(object); }
- template<class _Object> static devcb_base &set_write_7(device_t &device, _Object object, uint32_t offset) { downcast<latch8_device &>(device).m_offset[7] = offset; return downcast<latch8_device &>(device).m_write_7.set_callback(object); }
-
- template<class _Object> static devcb_base &set_read_0(device_t &device, _Object object, uint32_t offset) { downcast<latch8_device &>(device).m_offset[0] = offset; return downcast<latch8_device &>(device).m_read_0.set_callback(object); }
- template<class _Object> static devcb_base &set_read_1(device_t &device, _Object object, uint32_t offset) { downcast<latch8_device &>(device).m_offset[1] = offset; return downcast<latch8_device &>(device).m_read_1.set_callback(object); }
- template<class _Object> static devcb_base &set_read_2(device_t &device, _Object object, uint32_t offset) { downcast<latch8_device &>(device).m_offset[2] = offset; return downcast<latch8_device &>(device).m_read_2.set_callback(object); }
- template<class _Object> static devcb_base &set_read_3(device_t &device, _Object object, uint32_t offset) { downcast<latch8_device &>(device).m_offset[3] = offset; return downcast<latch8_device &>(device).m_read_3.set_callback(object); }
- template<class _Object> static devcb_base &set_read_4(device_t &device, _Object object, uint32_t offset) { downcast<latch8_device &>(device).m_offset[4] = offset; return downcast<latch8_device &>(device).m_read_4.set_callback(object); }
- template<class _Object> static devcb_base &set_read_5(device_t &device, _Object object, uint32_t offset) { downcast<latch8_device &>(device).m_offset[5] = offset; return downcast<latch8_device &>(device).m_read_5.set_callback(object); }
- template<class _Object> static devcb_base &set_read_6(device_t &device, _Object object, uint32_t offset) { downcast<latch8_device &>(device).m_offset[6] = offset; return downcast<latch8_device &>(device).m_read_6.set_callback(object); }
- template<class _Object> static devcb_base &set_read_7(device_t &device, _Object object, uint32_t offset) { downcast<latch8_device &>(device).m_offset[7] = offset; return downcast<latch8_device &>(device).m_read_7.set_callback(object); }
+ template<class _Object> static devcb_base &set_write_cb(device_t &device, int i, _Object object) { return downcast<latch8_device &>(device).m_write_cb[i].set_callback(object); }
+
+ template<class _Object> static devcb_base &set_read_cb(device_t &device, int i, _Object object) { return downcast<latch8_device &>(device).m_read_cb[i].set_callback(object); }
protected:
// device-level overrides
@@ -105,8 +90,8 @@ protected:
TIMER_CALLBACK_MEMBER( timerproc );
void update(uint8_t new_val, uint8_t mask);
- inline uint8_t bitx_r( offs_t offset, int bit);
inline void bitx_w(int bit, offs_t offset, uint8_t data);
+
private:
// internal state
uint8_t m_value;
@@ -118,25 +103,8 @@ private:
uint32_t m_xorvalue; /* after mask */
uint32_t m_nosync;
- devcb_write8 m_write_0;
- devcb_write8 m_write_1;
- devcb_write8 m_write_2;
- devcb_write8 m_write_3;
- devcb_write8 m_write_4;
- devcb_write8 m_write_5;
- devcb_write8 m_write_6;
- devcb_write8 m_write_7;
-
- devcb_read8 m_read_0;
- devcb_read8 m_read_1;
- devcb_read8 m_read_2;
- devcb_read8 m_read_3;
- devcb_read8 m_read_4;
- devcb_read8 m_read_5;
- devcb_read8 m_read_6;
- devcb_read8 m_read_7;
-
- uint32_t m_offset[8];
+ devcb_write_line m_write_cb[8];
+ devcb_read_line m_read_cb[8];
};
extern const device_type LATCH8;
@@ -161,68 +129,54 @@ extern const device_type LATCH8;
latch8_device::set_nosync(*device, _nosync);
/* Write bit to discrete node */
-#define MCFG_LATCH8_WRITE_0(_devcb, _node) \
- devcb = &latch8_device::set_write_0(*device, DEVCB_##_devcb, _node);
+#define MCFG_LATCH8_WRITE_0(_devcb) \
+ devcb = &latch8_device::set_write_cb(*device, 0, DEVCB_##_devcb);
-#define MCFG_LATCH8_WRITE_1(_devcb, _node) \
- devcb = &latch8_device::set_write_1(*device, DEVCB_##_devcb, _node);
+#define MCFG_LATCH8_WRITE_1(_devcb) \
+ devcb = &latch8_device::set_write_cb(*device, 1, DEVCB_##_devcb);
-#define MCFG_LATCH8_WRITE_2(_devcb, _node) \
- devcb = &latch8_device::set_write_2(*device, DEVCB_##_devcb, _node);
+#define MCFG_LATCH8_WRITE_2(_devcb) \
+ devcb = &latch8_device::set_write_cb(*device, 2, DEVCB_##_devcb);
-#define MCFG_LATCH8_WRITE_3(_devcb, _node) \
- devcb = &latch8_device::set_write_3(*device, DEVCB_##_devcb, _node);
+#define MCFG_LATCH8_WRITE_3(_devcb) \
+ devcb = &latch8_device::set_write_cb(*device, 3, DEVCB_##_devcb);
-#define MCFG_LATCH8_WRITE_4(_devcb, _node) \
- devcb = &latch8_device::set_write_4(*device, DEVCB_##_devcb, _node);
+#define MCFG_LATCH8_WRITE_4(_devcb) \
+ devcb = &latch8_device::set_write_cb(*device, 4, DEVCB_##_devcb);
-#define MCFG_LATCH8_WRITE_5(_devcb, _node) \
- devcb = &latch8_device::set_write_5(*device, DEVCB_##_devcb, _node);
+#define MCFG_LATCH8_WRITE_5(_devcb) \
+ devcb = &latch8_device::set_write_cb(*device, 5, DEVCB_##_devcb);
-#define MCFG_LATCH8_WRITE_6(_devcb, _node) \
- devcb = &latch8_device::set_write_6(*device, DEVCB_##_devcb, _node);
+#define MCFG_LATCH8_WRITE_6(_devcb) \
+ devcb = &latch8_device::set_write_cb(*device, 6, DEVCB_##_devcb);
-#define MCFG_LATCH8_WRITE_7(_devcb, _node) \
- devcb = &latch8_device::set_write_7(*device, DEVCB_##_devcb, _node);
+#define MCFG_LATCH8_WRITE_7(_devcb) \
+ devcb = &latch8_device::set_write_cb(*device, 7, DEVCB_##_devcb);
/* Upon read, replace bits by reading from another device handler */
-#define MCFG_LATCH8_READ_0(_devcb, _from_bit) \
- devcb = &latch8_device::set_read_0(*device, DEVCB_##_devcb, _from_bit);
-
-#define MCFG_LATCH8_READ_1(_devcb, _from_bit) \
- devcb = &latch8_device::set_read_1(*device, DEVCB_##_devcb, _from_bit);
-
-#define MCFG_LATCH8_READ_2(_devcb, _from_bit) \
- devcb = &latch8_device::set_read_2(*device, DEVCB_##_devcb, _from_bit);
-
-#define MCFG_LATCH8_READ_3(_devcb, _from_bit) \
- devcb = &latch8_device::set_read_3(*device, DEVCB_##_devcb, _from_bit);
-
-#define MCFG_LATCH8_READ_4(_devcb, _from_bit) \
- devcb = &latch8_device::set_read_4(*device, DEVCB_##_devcb, _from_bit);
-
-#define MCFG_LATCH8_READ_5(_devcb, _from_bit) \
- devcb = &latch8_device::set_read_5(*device, DEVCB_##_devcb, _from_bit);
+#define MCFG_LATCH8_READ_0(_devcb) \
+ devcb = &latch8_device::set_read_cb(*device, 0, DEVCB_##_devcb);
-#define MCFG_LATCH8_READ_6(_devcb, _from_bit) \
- devcb = &latch8_device::set_read_6(*device, DEVCB_##_devcb, _from_bit);
+#define MCFG_LATCH8_READ_1(_devcb) \
+ devcb = &latch8_device::set_read_cb(*device, 1, DEVCB_##_devcb);
-#define MCFG_LATCH8_READ_7(_devcb, _from_bit) \
- devcb = &latch8_device::set_read_7(*device, DEVCB_##_devcb, _from_bit);
+#define MCFG_LATCH8_READ_2(_devcb) \
+ devcb = &latch8_device::set_read_cb(*device, 2, DEVCB_##_devcb);
+#define MCFG_LATCH8_READ_3(_devcb) \
+ devcb = &latch8_device::set_read_cb(*device, 3, DEVCB_##_devcb);
-/* Accessor macros */
+#define MCFG_LATCH8_READ_4(_devcb) \
+ devcb = &latch8_device::set_read_cb(*device, 4, DEVCB_##_devcb);
-#define AM_LATCH8_READ(_tag) \
- AM_DEVREAD(_tag, latch8_device, read)
+#define MCFG_LATCH8_READ_5(_devcb) \
+ devcb = &latch8_device::set_read_cb(*device, 5, DEVCB_##_devcb);
-#define AM_LATCH8_READBIT(_tag, _bit) \
- AM_DEVREAD(_tag, latch8_device, bit ## _bit ## _q_r)
+#define MCFG_LATCH8_READ_6(_devcb) \
+ devcb = &latch8_device::set_read_cb(*device, 6, DEVCB_##_devcb);
-#define AM_LATCH8_WRITE(_tag) \
- AM_DEVWRITE(_tag, latch8_device, write)
+#define MCFG_LATCH8_READ_7(_devcb) \
+ devcb = &latch8_device::set_read_cb(*device, 7, DEVCB_##_devcb);
-#define AM_LATCH8_READWRITE(_tag) \
- AM_DEVREADWRITE(_tag, latch8_device, read, write)
#endif /* __LATCH8_H_ */