From 84cbea836eef9447fd59be312119153f0fbd87e0 Mon Sep 17 00:00:00 2001 From: Dirk Best Date: Sun, 29 Apr 2018 16:06:42 +0200 Subject: [PATCH] 315_5338a: Improve and clean up --- src/mame/machine/315_5338a.cpp | 85 +++++++++++++++------------------- src/mame/machine/315_5338a.h | 75 ++++++++++++++---------------- 2 files changed, 72 insertions(+), 88 deletions(-) diff --git a/src/mame/machine/315_5338a.cpp b/src/mame/machine/315_5338a.cpp index a362ce656e2..1d6cc4abcdc 100644 --- a/src/mame/machine/315_5338a.cpp +++ b/src/mame/machine/315_5338a.cpp @@ -33,16 +33,11 @@ DEFINE_DEVICE_TYPE(SEGA_315_5338A, sega_315_5338a_device, "315_5338a", "Sega 315 sega_315_5338a_device::sega_315_5338a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, SEGA_315_5338A, tag, owner, clock), m_read_cb(*this), m_write_cb(*this), - m_out0_cb(*this), - m_in1_cb(*this), - m_in2_cb(*this), - m_in3_cb(*this), - m_in4_cb(*this), - m_out4_cb(*this), - m_out5_cb(*this), - m_in6_cb(*this), - m_port0(0xff), m_config(0), m_serial_output(0), m_address(0) + m_in_port_cb{ {*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this} }, + m_out_port_cb{ {*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this} }, + m_port_config(0), m_serial_output(0), m_address(0) { + std::fill(std::begin(m_port_value), std::end(m_port_value), 0xff); } //------------------------------------------------- @@ -54,18 +49,16 @@ void sega_315_5338a_device::device_start() // resolve callbacks m_read_cb.resolve_safe(0xff); m_write_cb.resolve_safe(); - m_out0_cb.resolve_safe(); - m_in1_cb.resolve_safe(0xff); - m_in2_cb.resolve_safe(0xff); - m_in3_cb.resolve_safe(0xff); - m_in4_cb.resolve_safe(0xff); - m_out4_cb.resolve_safe(); - m_out5_cb.resolve_safe(); - m_in6_cb.resolve_safe(0xff); + + for (unsigned i = 0; i < 7; i++) + { + m_in_port_cb[i].resolve_safe(0xff); + m_out_port_cb[i].resolve_safe(); + } // register for save states - save_item(NAME(m_port0)); - save_item(NAME(m_config)); + save_pointer(NAME(m_port_value), 7); + save_item(NAME(m_port_config)); save_item(NAME(m_serial_output)); save_item(NAME(m_address)); } @@ -81,19 +74,19 @@ READ8_MEMBER( sega_315_5338a_device::read ) switch (offset) { - // return output latch - case 0x00: data = m_port0; break; - - // standard input ports - case 0x01: data = m_in1_cb(0); break; - case 0x02: data = m_in2_cb(0); break; - case 0x03: data = m_in3_cb(0); break; - - // input/output port - case 0x04: data = m_in4_cb(0); break; - - // input port - case 0x06: data = m_in6_cb(0); break; + // port 0 to 6 + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + if (BIT(m_port_config, offset)) + data = m_in_port_cb[offset](0); + else + data = m_port_value[offset]; + break; // serial data read back? case 0x0a: data = m_serial_output; break; @@ -122,23 +115,21 @@ WRITE8_MEMBER( sega_315_5338a_device::write ) switch (offset) { - // latched output port - case 0x00: m_port0 = data; m_out0_cb(data); break; - - // input/output port - case 0x04: m_out4_cb(data); break; - - // output port - case 0x05: m_out5_cb(data); break; - - // config register? - case 0x08: - // 765----- unknown - // ---4---- port 4 direction (0 = output, 1 = input) - // ----3210 unknown - m_config = data; + // port 0 to 6 + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + m_port_value[offset] = data; + m_out_port_cb[offset](data); break; + // port direction register (0 = output, 1 = input) + case 0x08: m_port_config = data; break; + // command register case 0x09: switch (data) diff --git a/src/mame/machine/315_5338a.h b/src/mame/machine/315_5338a.h index 82f37376fd5..4b60130cfa7 100644 --- a/src/mame/machine/315_5338a.h +++ b/src/mame/machine/315_5338a.h @@ -34,29 +34,47 @@ #define MCFG_315_5338A_WRITE_CB(_devcb) \ devcb = &downcast(*device).set_write_callback(DEVCB_##_devcb); +#define MCFG_315_5338A_IN0_CB(_devcb) \ + devcb = &downcast(*device).set_in_callback<0>(DEVCB_##_devcb); + #define MCFG_315_5338A_OUT0_CB(_devcb) \ - devcb = &downcast(*device).set_out0_callback(DEVCB_##_devcb); + devcb = &downcast(*device).set_out_callback<0>(DEVCB_##_devcb); #define MCFG_315_5338A_IN1_CB(_devcb) \ - devcb = &downcast(*device).set_in1_callback(DEVCB_##_devcb); + devcb = &downcast(*device).set_in_callback<1>(DEVCB_##_devcb); + +#define MCFG_315_5338A_OUT1_CB(_devcb) \ + devcb = &downcast(*device).set_out_callback<1>(DEVCB_##_devcb); #define MCFG_315_5338A_IN2_CB(_devcb) \ - devcb = &downcast(*device).set_in2_callback(DEVCB_##_devcb); + devcb = &downcast(*device).set_in_callback<2>(DEVCB_##_devcb); + +#define MCFG_315_5338A_OUT2_CB(_devcb) \ + devcb = &downcast(*device).set_out_callback<2>(DEVCB_##_devcb); #define MCFG_315_5338A_IN3_CB(_devcb) \ - devcb = &downcast(*device).set_in3_callback(DEVCB_##_devcb); + devcb = &downcast(*device).set_in_callback<3>(DEVCB_##_devcb); + +#define MCFG_315_5338A_OUT3_CB(_devcb) \ + devcb = &downcast(*device).set_out_callback<3>(DEVCB_##_devcb); #define MCFG_315_5338A_IN4_CB(_devcb) \ - devcb = &downcast(*device).set_in4_callback(DEVCB_##_devcb); + devcb = &downcast(*device).set_in_callback<4>(DEVCB_##_devcb); #define MCFG_315_5338A_OUT4_CB(_devcb) \ - devcb = &downcast(*device).set_out4_callback(DEVCB_##_devcb); + devcb = &downcast(*device).set_out_callback<4>(DEVCB_##_devcb); + +#define MCFG_315_5338A_IN5_CB(_devcb) \ + devcb = &downcast(*device).set_in_callback<5>(DEVCB_##_devcb); #define MCFG_315_5338A_OUT5_CB(_devcb) \ - devcb = &downcast(*device).set_out5_callback(DEVCB_##_devcb); + devcb = &downcast(*device).set_out_callback<5>(DEVCB_##_devcb); #define MCFG_315_5338A_IN6_CB(_devcb) \ - devcb = &downcast(*device).set_in6_callback(DEVCB_##_devcb); + devcb = &downcast(*device).set_in_callback<6>(DEVCB_##_devcb); + +#define MCFG_315_5338A_OUT6_CB(_devcb) \ + devcb = &downcast(*device).set_out_callback<6>(DEVCB_##_devcb); //************************************************************************** @@ -76,29 +94,11 @@ public: template devcb_base &set_write_callback(Object &&cb) { return m_write_cb.set_callback(std::forward(cb)); } - template devcb_base &set_out0_callback(Object &&cb) - { return m_out0_cb.set_callback(std::forward(cb)); } + template devcb_base &set_out_callback(Object &&cb) + { return m_out_port_cb[Port].set_callback(std::forward(cb)); } - template devcb_base &set_in1_callback(Object &&cb) - { return m_in1_cb.set_callback(std::forward(cb)); } - - template devcb_base &set_in2_callback(Object &&cb) - { return m_in2_cb.set_callback(std::forward(cb)); } - - template devcb_base &set_in3_callback(Object &&cb) - { return m_in3_cb.set_callback(std::forward(cb)); } - - template devcb_base &set_in4_callback(Object &&cb) - { return m_in4_cb.set_callback(std::forward(cb)); } - - template devcb_base &set_out4_callback(Object &&cb) - { return m_out4_cb.set_callback(std::forward(cb)); } - - template devcb_base &set_out5_callback(Object &&cb) - { return m_out5_cb.set_callback(std::forward(cb)); } - - template devcb_base &set_in6_callback(Object &&cb) - { return m_in6_cb.set_callback(std::forward(cb)); } + template devcb_base &set_in_callback(Object &&cb) + { return m_in_port_cb[Port].set_callback(std::forward(cb)); } DECLARE_READ8_MEMBER(read); DECLARE_WRITE8_MEMBER(write); @@ -111,18 +111,11 @@ private: // callbacks devcb_read8 m_read_cb; devcb_write8 m_write_cb; + devcb_read8 m_in_port_cb[7]; + devcb_write8 m_out_port_cb[7]; - devcb_write8 m_out0_cb; - devcb_read8 m_in1_cb; - devcb_read8 m_in2_cb; - devcb_read8 m_in3_cb; - devcb_read8 m_in4_cb; - devcb_write8 m_out4_cb; - devcb_write8 m_out5_cb; - devcb_read8 m_in6_cb; - - uint8_t m_port0; - uint8_t m_config; + uint8_t m_port_value[7]; + uint8_t m_port_config; uint8_t m_serial_output; uint16_t m_address; };