diff options
Diffstat (limited to 'src/devices/machine/latch8.h')
-rw-r--r-- | src/devices/machine/latch8.h | 156 |
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_ */ |