315_5338a: Improve and clean up

This commit is contained in:
Dirk Best 2018-04-29 16:06:42 +02:00
parent 03fcfe9622
commit 84cbea836e
2 changed files with 72 additions and 88 deletions

View File

@ -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) : 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), device_t(mconfig, SEGA_315_5338A, tag, owner, clock),
m_read_cb(*this), m_write_cb(*this), m_read_cb(*this), m_write_cb(*this),
m_out0_cb(*this), m_in_port_cb{ {*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this} },
m_in1_cb(*this), m_out_port_cb{ {*this}, {*this}, {*this}, {*this}, {*this}, {*this}, {*this} },
m_in2_cb(*this), m_port_config(0), m_serial_output(0), m_address(0)
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)
{ {
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 // resolve callbacks
m_read_cb.resolve_safe(0xff); m_read_cb.resolve_safe(0xff);
m_write_cb.resolve_safe(); m_write_cb.resolve_safe();
m_out0_cb.resolve_safe();
m_in1_cb.resolve_safe(0xff); for (unsigned i = 0; i < 7; i++)
m_in2_cb.resolve_safe(0xff); {
m_in3_cb.resolve_safe(0xff); m_in_port_cb[i].resolve_safe(0xff);
m_in4_cb.resolve_safe(0xff); m_out_port_cb[i].resolve_safe();
m_out4_cb.resolve_safe(); }
m_out5_cb.resolve_safe();
m_in6_cb.resolve_safe(0xff);
// register for save states // register for save states
save_item(NAME(m_port0)); save_pointer(NAME(m_port_value), 7);
save_item(NAME(m_config)); save_item(NAME(m_port_config));
save_item(NAME(m_serial_output)); save_item(NAME(m_serial_output));
save_item(NAME(m_address)); save_item(NAME(m_address));
} }
@ -81,19 +74,19 @@ READ8_MEMBER( sega_315_5338a_device::read )
switch (offset) switch (offset)
{ {
// return output latch // port 0 to 6
case 0x00: data = m_port0; break; case 0x00:
case 0x01:
// standard input ports case 0x02:
case 0x01: data = m_in1_cb(0); break; case 0x03:
case 0x02: data = m_in2_cb(0); break; case 0x04:
case 0x03: data = m_in3_cb(0); break; case 0x05:
case 0x06:
// input/output port if (BIT(m_port_config, offset))
case 0x04: data = m_in4_cb(0); break; data = m_in_port_cb[offset](0);
else
// input port data = m_port_value[offset];
case 0x06: data = m_in6_cb(0); break; break;
// serial data read back? // serial data read back?
case 0x0a: data = m_serial_output; break; case 0x0a: data = m_serial_output; break;
@ -122,23 +115,21 @@ WRITE8_MEMBER( sega_315_5338a_device::write )
switch (offset) switch (offset)
{ {
// latched output port // port 0 to 6
case 0x00: m_port0 = data; m_out0_cb(data); break; case 0x00:
case 0x01:
// input/output port case 0x02:
case 0x04: m_out4_cb(data); break; case 0x03:
case 0x04:
// output port case 0x05:
case 0x05: m_out5_cb(data); break; case 0x06:
m_port_value[offset] = data;
// config register? m_out_port_cb[offset](data);
case 0x08:
// 765----- unknown
// ---4---- port 4 direction (0 = output, 1 = input)
// ----3210 unknown
m_config = data;
break; break;
// port direction register (0 = output, 1 = input)
case 0x08: m_port_config = data; break;
// command register // command register
case 0x09: case 0x09:
switch (data) switch (data)

View File

@ -34,29 +34,47 @@
#define MCFG_315_5338A_WRITE_CB(_devcb) \ #define MCFG_315_5338A_WRITE_CB(_devcb) \
devcb = &downcast<sega_315_5338a_device &>(*device).set_write_callback(DEVCB_##_devcb); devcb = &downcast<sega_315_5338a_device &>(*device).set_write_callback(DEVCB_##_devcb);
#define MCFG_315_5338A_IN0_CB(_devcb) \
devcb = &downcast<sega_315_5338a_device &>(*device).set_in_callback<0>(DEVCB_##_devcb);
#define MCFG_315_5338A_OUT0_CB(_devcb) \ #define MCFG_315_5338A_OUT0_CB(_devcb) \
devcb = &downcast<sega_315_5338a_device &>(*device).set_out0_callback(DEVCB_##_devcb); devcb = &downcast<sega_315_5338a_device &>(*device).set_out_callback<0>(DEVCB_##_devcb);
#define MCFG_315_5338A_IN1_CB(_devcb) \ #define MCFG_315_5338A_IN1_CB(_devcb) \
devcb = &downcast<sega_315_5338a_device &>(*device).set_in1_callback(DEVCB_##_devcb); devcb = &downcast<sega_315_5338a_device &>(*device).set_in_callback<1>(DEVCB_##_devcb);
#define MCFG_315_5338A_OUT1_CB(_devcb) \
devcb = &downcast<sega_315_5338a_device &>(*device).set_out_callback<1>(DEVCB_##_devcb);
#define MCFG_315_5338A_IN2_CB(_devcb) \ #define MCFG_315_5338A_IN2_CB(_devcb) \
devcb = &downcast<sega_315_5338a_device &>(*device).set_in2_callback(DEVCB_##_devcb); devcb = &downcast<sega_315_5338a_device &>(*device).set_in_callback<2>(DEVCB_##_devcb);
#define MCFG_315_5338A_OUT2_CB(_devcb) \
devcb = &downcast<sega_315_5338a_device &>(*device).set_out_callback<2>(DEVCB_##_devcb);
#define MCFG_315_5338A_IN3_CB(_devcb) \ #define MCFG_315_5338A_IN3_CB(_devcb) \
devcb = &downcast<sega_315_5338a_device &>(*device).set_in3_callback(DEVCB_##_devcb); devcb = &downcast<sega_315_5338a_device &>(*device).set_in_callback<3>(DEVCB_##_devcb);
#define MCFG_315_5338A_OUT3_CB(_devcb) \
devcb = &downcast<sega_315_5338a_device &>(*device).set_out_callback<3>(DEVCB_##_devcb);
#define MCFG_315_5338A_IN4_CB(_devcb) \ #define MCFG_315_5338A_IN4_CB(_devcb) \
devcb = &downcast<sega_315_5338a_device &>(*device).set_in4_callback(DEVCB_##_devcb); devcb = &downcast<sega_315_5338a_device &>(*device).set_in_callback<4>(DEVCB_##_devcb);
#define MCFG_315_5338A_OUT4_CB(_devcb) \ #define MCFG_315_5338A_OUT4_CB(_devcb) \
devcb = &downcast<sega_315_5338a_device &>(*device).set_out4_callback(DEVCB_##_devcb); devcb = &downcast<sega_315_5338a_device &>(*device).set_out_callback<4>(DEVCB_##_devcb);
#define MCFG_315_5338A_IN5_CB(_devcb) \
devcb = &downcast<sega_315_5338a_device &>(*device).set_in_callback<5>(DEVCB_##_devcb);
#define MCFG_315_5338A_OUT5_CB(_devcb) \ #define MCFG_315_5338A_OUT5_CB(_devcb) \
devcb = &downcast<sega_315_5338a_device &>(*device).set_out5_callback(DEVCB_##_devcb); devcb = &downcast<sega_315_5338a_device &>(*device).set_out_callback<5>(DEVCB_##_devcb);
#define MCFG_315_5338A_IN6_CB(_devcb) \ #define MCFG_315_5338A_IN6_CB(_devcb) \
devcb = &downcast<sega_315_5338a_device &>(*device).set_in6_callback(DEVCB_##_devcb); devcb = &downcast<sega_315_5338a_device &>(*device).set_in_callback<6>(DEVCB_##_devcb);
#define MCFG_315_5338A_OUT6_CB(_devcb) \
devcb = &downcast<sega_315_5338a_device &>(*device).set_out_callback<6>(DEVCB_##_devcb);
//************************************************************************** //**************************************************************************
@ -76,29 +94,11 @@ public:
template <class Object> devcb_base &set_write_callback(Object &&cb) template <class Object> devcb_base &set_write_callback(Object &&cb)
{ return m_write_cb.set_callback(std::forward<Object>(cb)); } { return m_write_cb.set_callback(std::forward<Object>(cb)); }
template <class Object> devcb_base &set_out0_callback(Object &&cb) template <int Port, class Object> devcb_base &set_out_callback(Object &&cb)
{ return m_out0_cb.set_callback(std::forward<Object>(cb)); } { return m_out_port_cb[Port].set_callback(std::forward<Object>(cb)); }
template <class Object> devcb_base &set_in1_callback(Object &&cb) template <int Port, class Object> devcb_base &set_in_callback(Object &&cb)
{ return m_in1_cb.set_callback(std::forward<Object>(cb)); } { return m_in_port_cb[Port].set_callback(std::forward<Object>(cb)); }
template <class Object> devcb_base &set_in2_callback(Object &&cb)
{ return m_in2_cb.set_callback(std::forward<Object>(cb)); }
template <class Object> devcb_base &set_in3_callback(Object &&cb)
{ return m_in3_cb.set_callback(std::forward<Object>(cb)); }
template <class Object> devcb_base &set_in4_callback(Object &&cb)
{ return m_in4_cb.set_callback(std::forward<Object>(cb)); }
template <class Object> devcb_base &set_out4_callback(Object &&cb)
{ return m_out4_cb.set_callback(std::forward<Object>(cb)); }
template <class Object> devcb_base &set_out5_callback(Object &&cb)
{ return m_out5_cb.set_callback(std::forward<Object>(cb)); }
template <class Object> devcb_base &set_in6_callback(Object &&cb)
{ return m_in6_cb.set_callback(std::forward<Object>(cb)); }
DECLARE_READ8_MEMBER(read); DECLARE_READ8_MEMBER(read);
DECLARE_WRITE8_MEMBER(write); DECLARE_WRITE8_MEMBER(write);
@ -111,18 +111,11 @@ private:
// callbacks // callbacks
devcb_read8 m_read_cb; devcb_read8 m_read_cb;
devcb_write8 m_write_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; uint8_t m_port_value[7];
devcb_read8 m_in1_cb; uint8_t m_port_config;
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_serial_output; uint8_t m_serial_output;
uint16_t m_address; uint16_t m_address;
}; };