diff options
author | 2014-10-26 10:31:24 +0000 | |
---|---|---|
committer | 2014-10-26 10:32:58 +0000 | |
commit | 7e7b1dc0bb5b9c2acd27fa353dce57e1a985adc9 (patch) | |
tree | d56c9d65b59f292ca92971be0a8c60fdf4db63ef /src/emu/bus/psx | |
parent | 50d983885308d97db172d25006250b3c58677acc (diff) |
Convert PSX sio to use devcb. [smf]
Diffstat (limited to 'src/emu/bus/psx')
-rw-r--r-- | src/emu/bus/psx/ctlrport.c | 34 | ||||
-rw-r--r-- | src/emu/bus/psx/ctlrport.h | 23 |
2 files changed, 40 insertions, 17 deletions
diff --git a/src/emu/bus/psx/ctlrport.c b/src/emu/bus/psx/ctlrport.c index 70d09fbffd9..46b2ab51de1 100644 --- a/src/emu/bus/psx/ctlrport.c +++ b/src/emu/bus/psx/ctlrport.c @@ -37,18 +37,22 @@ void psx_controller_port_device::disable_card(bool state) const device_type PSXCONTROLLERPORTS = &device_creator<psxcontrollerports_device>; -psxcontrollerports_device::psxcontrollerports_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : - psxsiodev_device(mconfig, PSXCONTROLLERPORTS, "PSXCONTROLLERPORTS", tag, owner, clock, "psxcontrollerports", __FILE__) +psxcontrollerports_device::psxcontrollerports_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, PSXCONTROLLERPORTS, "PSXCONTROLLERPORTS", tag, owner, clock, "psxcontrollerports", __FILE__), + m_dsr_handler(*this), + m_rxd_handler(*this) { } void psxcontrollerports_device::device_start() { + m_dsr_handler.resolve_safe(); + m_rxd_handler.resolve_safe(); + m_port0 = machine().device<psx_controller_port_device>("port1"); m_port1 = machine().device<psx_controller_port_device>("port2"); m_port0->setup_ack_cb(psx_controller_port_device::void_cb(FUNC(psxcontrollerports_device::ack), this)); m_port1->setup_ack_cb(psx_controller_port_device::void_cb(FUNC(psxcontrollerports_device::ack), this)); - psxsiodev_device::device_start(); } // add controllers to define so they can be connected to the multitap @@ -66,22 +70,28 @@ SLOT_INTERFACE_START(psx_controllers_nomulti) PSX_CONTROLLERS SLOT_INTERFACE_END -void psxcontrollerports_device::data_in( int data, int mask ) +WRITE_LINE_MEMBER(psxcontrollerports_device::write_dtr) { - m_port0->sel_w((data & PSX_SIO_OUT_DTR)?1:0); - m_port0->tx_w((data & PSX_SIO_OUT_DATA)?1:0); - m_port0->clock_w((data & PSX_SIO_OUT_CLOCK)?1:0); // clock must be last + m_port0->sel_w(!state); + m_port1->sel_w(state); +} - m_port1->tx_w((data & PSX_SIO_OUT_DATA)?1:0); - m_port1->sel_w((data & PSX_SIO_OUT_DTR)?0:1); // not dtr - m_port1->clock_w((data & PSX_SIO_OUT_CLOCK)?1:0); +WRITE_LINE_MEMBER(psxcontrollerports_device::write_sck) +{ + m_port0->clock_w(state); + m_port1->clock_w(state); + m_rxd_handler(m_port0->rx_r() && m_port1->rx_r()); +} - data_out(((m_port0->rx_r() && m_port1->rx_r()) * PSX_SIO_IN_DATA), PSX_SIO_IN_DATA); +WRITE_LINE_MEMBER(psxcontrollerports_device::write_txd) +{ + m_port0->tx_w(state); + m_port1->tx_w(state); } void psxcontrollerports_device::ack() { - data_out((!(m_port0->ack_r() && m_port1->ack_r()) * PSX_SIO_IN_DSR), PSX_SIO_IN_DSR); + m_dsr_handler(m_port0->ack_r() && m_port1->ack_r()); } device_psx_controller_interface::device_psx_controller_interface(const machine_config &mconfig, device_t &device) : diff --git a/src/emu/bus/psx/ctlrport.h b/src/emu/bus/psx/ctlrport.h index c0a556f114b..2e73bcc52ac 100644 --- a/src/emu/bus/psx/ctlrport.h +++ b/src/emu/bus/psx/ctlrport.h @@ -3,7 +3,6 @@ #ifndef __PSXCPORT_H__ #define __PSXCPORT_H__ -#include "cpu/psx/siodev.h" #include "memcard.h" #define MCFG_PSX_CTRL_PORT_ADD(_tag, _slot_intf, _def_slot) \ @@ -25,7 +24,7 @@ public: device_psx_controller_interface(const machine_config &mconfig, device_t &device); virtual ~device_psx_controller_interface(); - void clock_w(bool state) { if(m_clock && !m_sel && !state && !m_memcard) do_pad(); m_clock = state; } + void clock_w(bool state) { if(!m_clock && !m_sel && state && !m_memcard) do_pad(); m_clock = state; } void sel_w(bool state); bool rx_r() { return m_rx; } @@ -78,20 +77,34 @@ private: required_ioport m_pad1; }; -class psxcontrollerports_device : public psxsiodev_device +#define MCFG_PSX_CONTROLLER_PORTS_DSR_HANDLER(_devcb) \ + devcb = &psxcontrollerports_device::set_dsr_handler(*device, DEVCB_##_devcb); + +#define MCFG_PSX_CONTROLLER_PORTS_RXD_HANDLER(_devcb) \ + devcb = &psxcontrollerports_device::set_rxd_handler(*device, DEVCB_##_devcb); + +class psxcontrollerports_device : public device_t { public: psxcontrollerports_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); void ack(); + template<class _Object> static devcb_base &set_dsr_handler(device_t &device, _Object object) { return downcast<psxcontrollerports_device &>(device).m_dsr_handler.set_callback(object); } + template<class _Object> static devcb_base &set_rxd_handler(device_t &device, _Object object) { return downcast<psxcontrollerports_device &>(device).m_rxd_handler.set_callback(object); } + + DECLARE_WRITE_LINE_MEMBER(write_sck); + DECLARE_WRITE_LINE_MEMBER(write_dtr); + DECLARE_WRITE_LINE_MEMBER(write_txd); + protected: virtual void device_start(); private: - virtual void data_in(int data, int mask); - psx_controller_port_device *m_port0; psx_controller_port_device *m_port1; + + devcb_write_line m_dsr_handler; + devcb_write_line m_rxd_handler; }; class psx_controller_port_device : public device_t, |