From 7e7b1dc0bb5b9c2acd27fa353dce57e1a985adc9 Mon Sep 17 00:00:00 2001 From: smf- Date: Sun, 26 Oct 2014 10:31:24 +0000 Subject: Convert PSX sio to use devcb. [smf] --- src/emu/bus/psx/ctlrport.c | 34 ++++++++----- src/emu/bus/psx/ctlrport.h | 23 +++++++-- src/emu/cpu/cpu.mak | 2 +- src/emu/cpu/psx/sio.c | 114 +++++++++++++++-------------------------- src/emu/cpu/psx/sio.h | 38 +++++++++----- src/emu/cpu/psx/siodev.c | 22 -------- src/emu/cpu/psx/siodev.h | 41 --------------- src/mame/drivers/ksys573.c | 3 +- src/mame/drivers/taitogn.c | 45 +++++++++++++---- src/mame/drivers/zn.c | 61 +++++++++++++++++----- src/mame/machine/cat702.c | 35 +++++++++---- src/mame/machine/cat702.h | 25 ++++++--- src/mame/machine/k573cass.c | 120 +++++++++++++++++++------------------------- src/mame/machine/k573cass.h | 111 +++++++++++++++++++--------------------- src/mame/machine/zndip.c | 51 ++++++++++--------- src/mame/machine/zndip.h | 23 +++++++-- src/mess/drivers/psx.c | 18 ++++++- 17 files changed, 399 insertions(+), 367 deletions(-) delete mode 100644 src/emu/cpu/psx/siodev.c delete mode 100644 src/emu/cpu/psx/siodev.h 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(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("port1"); m_port1 = machine().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 static devcb_base &set_dsr_handler(device_t &device, _Object object) { return downcast(device).m_dsr_handler.set_callback(object); } + template static devcb_base &set_rxd_handler(device_t &device, _Object object) { return downcast(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, diff --git a/src/emu/cpu/cpu.mak b/src/emu/cpu/cpu.mak index d72872fd573..e733c15a58b 100644 --- a/src/emu/cpu/cpu.mak +++ b/src/emu/cpu/cpu.mak @@ -1174,7 +1174,7 @@ $(CPUOBJ)/mips/mips3drc.o: $(CPUSRC)/mips/mips3drc.c \ ifneq ($(filter PSX,$(CPUS)),) OBJDIRS += $(CPUOBJ)/psx -CPUOBJS += $(CPUOBJ)/psx/psx.o $(CPUOBJ)/psx/gte.o $(CPUOBJ)/psx/dma.o $(CPUOBJ)/psx/irq.o $(CPUOBJ)/psx/mdec.o $(CPUOBJ)/psx/rcnt.o $(CPUOBJ)/psx/sio.o $(CPUOBJ)/psx/siodev.o +CPUOBJS += $(CPUOBJ)/psx/psx.o $(CPUOBJ)/psx/gte.o $(CPUOBJ)/psx/dma.o $(CPUOBJ)/psx/irq.o $(CPUOBJ)/psx/mdec.o $(CPUOBJ)/psx/rcnt.o $(CPUOBJ)/psx/sio.o DASMOBJS += $(CPUOBJ)/psx/psxdasm.o endif diff --git a/src/emu/cpu/psx/sio.c b/src/emu/cpu/psx/sio.c index 24e12972f24..d9394403dfe 100644 --- a/src/emu/cpu/psx/sio.c +++ b/src/emu/cpu/psx/sio.c @@ -39,7 +39,13 @@ psxsio1_device::psxsio1_device(const machine_config &mconfig, const char *tag, d psxsio_device::psxsio_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) : device_t(mconfig, type, name, tag, owner, clock, shortname, source), - m_irq_handler(*this) + m_status(SIO_STATUS_TX_EMPTY | SIO_STATUS_TX_RDY), + m_rxd(1), + m_irq_handler(*this), + m_sck_handler(*this), + m_txd_handler(*this), + m_dtr_handler(*this), + m_rts_handler(*this) { } @@ -51,16 +57,15 @@ void psxsio_device::device_post_load() void psxsio_device::device_start() { m_irq_handler.resolve_safe(); + m_sck_handler.resolve_safe(); + m_txd_handler.resolve_safe(); + m_dtr_handler.resolve_safe(); + m_rts_handler.resolve_safe(); m_timer = timer_alloc( 0 ); - m_status = SIO_STATUS_TX_EMPTY | SIO_STATUS_TX_RDY; m_mode = 0; m_control = 0; m_baud = 0; - m_tx = 0; - m_rx = 0; - m_tx_prev = 0; - m_rx_prev = 0; m_rx_data = 0; m_tx_data = 0; m_rx_shift = 0; @@ -72,30 +77,13 @@ void psxsio_device::device_start() save_item( NAME( m_mode ) ); save_item( NAME( m_control ) ); save_item( NAME( m_baud ) ); - save_item( NAME( m_tx ) ); - save_item( NAME( m_rx ) ); - save_item( NAME( m_tx_prev ) ); - save_item( NAME( m_rx_prev ) ); + save_item( NAME( m_rxd ) ); save_item( NAME( m_rx_data ) ); save_item( NAME( m_tx_data ) ); save_item( NAME( m_rx_shift ) ); save_item( NAME( m_tx_shift ) ); save_item( NAME( m_rx_bits ) ); save_item( NAME( m_tx_bits ) ); - - deviceCount = 0; - - for( device_t *device = first_subdevice(); device != NULL; device = device->next() ) - { - psxsiodev_device *psxsiodev = dynamic_cast(device); - if( psxsiodev != NULL ) - { - devices[ deviceCount++ ] = psxsiodev; - psxsiodev->m_psxsio = this; - } - } - - input_update(); } void psxsio_device::sio_interrupt() @@ -149,22 +137,6 @@ void psxsio_device::sio_timer_adjust() m_timer->adjust( n_time ); } -void psxsio_device::output( int data, int mask ) -{ - int new_outputdata = ( m_outputdata & ~mask ) | ( data & mask ); - int new_mask = m_outputdata ^ new_outputdata; - - if( new_mask != 0 ) - { - m_outputdata = new_outputdata; - - for( int i = 0; i < deviceCount; i++ ) - { - devices[ i ]->data_in( m_outputdata, new_mask ); - } - } -} - void psxsio_device::device_timer(emu_timer &timer, device_timer_id tid, int param, void *ptr) { verboselog( machine(), 2, "sio tick\n" ); @@ -188,19 +160,20 @@ void psxsio_device::device_timer(emu_timer &timer, device_timer_id tid, int para if( m_tx_bits != 0 ) { - m_tx = ( m_tx & ~PSX_SIO_OUT_DATA ) | ( ( m_tx_shift & 1 ) * PSX_SIO_OUT_DATA ); + if( type() == PSX_SIO0 ) + { + m_sck_handler(0); + } + + m_txd_handler( m_tx_shift & 1 ); m_tx_shift >>= 1; m_tx_bits--; if( type() == PSX_SIO0 ) { - m_tx &= ~PSX_SIO_OUT_CLOCK; - output( m_tx, PSX_SIO_OUT_CLOCK | PSX_SIO_OUT_DATA ); - m_tx |= PSX_SIO_OUT_CLOCK; + m_sck_handler(1); } - output( m_tx, PSX_SIO_OUT_CLOCK | PSX_SIO_OUT_DATA ); - if( m_tx_bits == 0 && ( m_control & SIO_CONTROL_TX_IENA ) != 0 ) { @@ -210,7 +183,7 @@ void psxsio_device::device_timer(emu_timer &timer, device_timer_id tid, int para if( m_rx_bits != 0 ) { - m_rx_shift = ( m_rx_shift >> 1 ) | ( ( ( m_rx & PSX_SIO_IN_DATA ) / PSX_SIO_IN_DATA ) << 7 ); + m_rx_shift = ( m_rx_shift >> 1 ) | ( m_rxd << 7 ); m_rx_bits--; if( m_rx_bits == 0 ) @@ -265,31 +238,33 @@ WRITE32_MEMBER( psxsio_device::write ) verboselog( machine(), 1, "psx_sio_w reset\n" ); m_status |= SIO_STATUS_TX_EMPTY | SIO_STATUS_TX_RDY; m_status &= ~( SIO_STATUS_RX_RDY | SIO_STATUS_OVERRUN | SIO_STATUS_IRQ ); + m_irq_handler(0); // toggle DTR to reset controllers, Star Ocean 2, at least, requires it // the precise mechanism of the reset is unknown // maybe it's related to the bottom 2 bits of control which are usually set - output( m_tx ^ PSX_SIO_OUT_DTR, PSX_SIO_OUT_DTR ); + m_dtr_handler(0); + m_dtr_handler(1); + + m_tx_bits = 0; + m_rx_bits = 0; + m_txd_handler(1); } if( ( m_control & SIO_CONTROL_IACK ) != 0 ) { verboselog( machine(), 1, "psx_sio_w iack\n" ); m_status &= ~( SIO_STATUS_IRQ ); m_control &= ~( SIO_CONTROL_IACK ); + m_irq_handler(0); } if( ( m_control & SIO_CONTROL_DTR ) != 0 ) { - m_tx |= PSX_SIO_OUT_DTR; + m_dtr_handler(0); } else { - m_tx &= ~PSX_SIO_OUT_DTR; + m_dtr_handler(1); } - - output( m_tx, PSX_SIO_OUT_DTR ); - - m_tx_prev = m_tx; - } break; case 3: @@ -362,33 +337,24 @@ READ32_MEMBER( psxsio_device::read ) return data; } -void psxsio_device::input_update() +WRITE_LINE_MEMBER(psxsio_device::write_rxd) { - int data = 0; + m_rxd = state; +} - for( int i = 0; i < deviceCount; i++ ) +WRITE_LINE_MEMBER(psxsio_device::write_dsr) +{ + if (state) { - data |= devices[ i ]->m_dataout; + m_status &= ~SIO_STATUS_DSR; } - - int mask = data ^ m_rx; - - verboselog( machine(), 1, "input_update( %s, %02x, %02x )\n", tag(), mask, data ); - - m_rx = data; - - if( ( m_rx & PSX_SIO_IN_DSR ) != 0 ) + else if ((m_status & SIO_STATUS_DSR) == 0) { m_status |= SIO_STATUS_DSR; - if( ( m_rx_prev & PSX_SIO_IN_DSR ) == 0 && - ( m_control & SIO_CONTROL_DSR_IENA ) != 0 ) + + if( ( m_control & SIO_CONTROL_DSR_IENA ) != 0 ) { sio_interrupt(); } } - else - { - m_status &= ~SIO_STATUS_DSR; - } - m_rx_prev = m_rx; } diff --git a/src/emu/cpu/psx/sio.h b/src/emu/cpu/psx/sio.h index c2e084c6d5e..be6e725aae1 100644 --- a/src/emu/cpu/psx/sio.h +++ b/src/emu/cpu/psx/sio.h @@ -13,13 +13,25 @@ #define __PSXSIO_H__ #include "emu.h" -#include "siodev.h" extern const device_type PSX_SIO0; extern const device_type PSX_SIO1; #define MCFG_PSX_SIO_IRQ_HANDLER(_devcb) \ devcb = &psxsio_device::set_irq_handler(*device, DEVCB_##_devcb); + +#define MCFG_PSX_SIO_SCK_HANDLER(_devcb) \ + devcb = &psxsio_device::set_sck_handler(*device, DEVCB_##_devcb); + +#define MCFG_PSX_SIO_TXD_HANDLER(_devcb) \ + devcb = &psxsio_device::set_txd_handler(*device, DEVCB_##_devcb); + +#define MCFG_PSX_SIO_DTR_HANDLER(_devcb) \ + devcb = &psxsio_device::set_dtr_handler(*device, DEVCB_##_devcb); + +#define MCFG_PSX_SIO_RTS_HANDLER(_devcb) \ + devcb = &psxsio_device::set_rts_handler(*device, DEVCB_##_devcb); + #define SIO_BUF_SIZE ( 8 ) #define SIO_STATUS_TX_RDY ( 1 << 0 ) @@ -44,11 +56,17 @@ public: // static configuration helpers template static devcb_base &set_irq_handler(device_t &device, _Object object) { return downcast(device).m_irq_handler.set_callback(object); } + template static devcb_base &set_sck_handler(device_t &device, _Object object) { return downcast(device).m_sck_handler.set_callback(object); } + template static devcb_base &set_txd_handler(device_t &device, _Object object) { return downcast(device).m_txd_handler.set_callback(object); } + template static devcb_base &set_dtr_handler(device_t &device, _Object object) { return downcast(device).m_dtr_handler.set_callback(object); } + template static devcb_base &set_rts_handler(device_t &device, _Object object) { return downcast(device).m_rts_handler.set_callback(object); } DECLARE_WRITE32_MEMBER( write ); DECLARE_READ32_MEMBER( read ); - void input_update(); + DECLARE_WRITE_LINE_MEMBER(write_rxd); + DECLARE_WRITE_LINE_MEMBER(write_dsr); + DECLARE_WRITE_LINE_MEMBER(write_cts); protected: // device-level overrides @@ -57,7 +75,6 @@ protected: virtual void device_post_load(); private: - void output( int data, int mask ); void sio_interrupt(); void sio_timer_adjust(); @@ -65,10 +82,7 @@ private: UINT32 m_mode; UINT32 m_control; UINT32 m_baud; - UINT32 m_tx; - UINT32 m_rx; - UINT32 m_tx_prev; - UINT32 m_rx_prev; + int m_rxd; UINT32 m_tx_data; UINT32 m_rx_data; UINT32 m_tx_shift; @@ -79,12 +93,10 @@ private: emu_timer *m_timer; devcb_write_line m_irq_handler; - - psxsiodev_device *devices[ 10 ]; - int deviceCount; - - int m_outputdata; - //int m_inputdata; + devcb_write_line m_sck_handler; + devcb_write_line m_txd_handler; + devcb_write_line m_dtr_handler; + devcb_write_line m_rts_handler; }; class psxsio0_device : public psxsio_device diff --git a/src/emu/cpu/psx/siodev.c b/src/emu/cpu/psx/siodev.c deleted file mode 100644 index 9fe6a374aef..00000000000 --- a/src/emu/cpu/psx/siodev.c +++ /dev/null @@ -1,22 +0,0 @@ -// license:MAME -// copyright-holders:smf -#include "sio.h" -#include "siodev.h" - -psxsiodev_device::psxsiodev_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) : - device_t(mconfig, type, name, tag, owner, clock, shortname, source), - m_dataout(0) -{ -} - -void psxsiodev_device::device_start() -{ - m_dataout = 0; -} - -void psxsiodev_device::data_out( int data, int mask ) -{ - m_dataout = ( m_dataout & ~mask ) | ( data & mask ); - - m_psxsio->input_update(); -} diff --git a/src/emu/cpu/psx/siodev.h b/src/emu/cpu/psx/siodev.h deleted file mode 100644 index 628afe3f81e..00000000000 --- a/src/emu/cpu/psx/siodev.h +++ /dev/null @@ -1,41 +0,0 @@ -// license:MAME -// copyright-holders:smf -#pragma once - -#include "emu.h" - -#ifndef _PSXSIODEV_H_ -#define _PSXSIODEV_H_ - -#define PSX_SIO_OUT_DATA ( 1 ) /* COMMAND */ -#define PSX_SIO_OUT_DTR ( 2 ) /* ATT */ -#define PSX_SIO_OUT_RTS ( 4 ) -#define PSX_SIO_OUT_CLOCK ( 8 ) /* CLOCK */ -#define PSX_SIO_IN_DATA ( 1 ) /* DATA */ -#define PSX_SIO_IN_DSR ( 2 ) /* ACK */ -#define PSX_SIO_IN_CTS ( 4 ) - -class psxsio_device; - -class psxsiodev_device : public device_t -{ - friend class psxsio_device; - -public: - // construction/destruction - psxsiodev_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); - -protected: - // device-level overrides - virtual void device_start(); - - void data_out( int data, int mask ); - -private: - psxsio_device *m_psxsio; - - virtual void data_in( int data, int mask ) = 0; - int m_dataout; -}; - -#endif diff --git a/src/mame/drivers/ksys573.c b/src/mame/drivers/ksys573.c index 5b419ef6062..5c128cdd2a6 100644 --- a/src/mame/drivers/ksys573.c +++ b/src/mame/drivers/ksys573.c @@ -2038,9 +2038,8 @@ static MACHINE_CONFIG_START( konami573, ksys573_state ) MCFG_SLOT_OPTION_MACHINE_CONFIG( "cr589", cr589_config ) MCFG_SLOT_DEFAULT_OPTION( "cr589" ) - MCFG_DEVICE_ADD( "maincpu:sio1:cassette", KONAMI573_CASSETTE_SLOT_SERIAL, 0 ) - MCFG_DEVICE_ADD( "cassette", KONAMI573_CASSETTE_SLOT, 0 ) + MCFG_KONAMI573_CASSETTE_DSR_HANDLER(DEVWRITELINE( "maincpu:sio1", psxsio1_device, write_dsr ) ) // onboard flash MCFG_FUJITSU_29F016A_ADD( "29f016a.31m" ) diff --git a/src/mame/drivers/taitogn.c b/src/mame/drivers/taitogn.c index 16add2b2821..47df85cbe99 100644 --- a/src/mame/drivers/taitogn.c +++ b/src/mame/drivers/taitogn.c @@ -346,9 +346,10 @@ class taitogn_state : public driver_device public: taitogn_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_cat702_1(*this,"maincpu:sio0:cat702_1"), - m_cat702_2(*this,"maincpu:sio0:cat702_2"), - m_zndip(*this,"maincpu:sio0:zndip"), + m_sio0(*this, "maincpu:sio0"), + m_cat702_1(*this, "cat702_1"), + m_cat702_2(*this, "cat702_2"), + m_zndip(*this, "zndip"), m_maincpu(*this, "maincpu"), m_mn10200(*this, "mn10200"), m_flashbank(*this, "flashbank"), @@ -358,10 +359,19 @@ public: m_sndflash0(*this, "sndflash0"), m_sndflash1(*this, "sndflash1"), m_sndflash2(*this, "sndflash2"), - m_has_zoom(true) + m_has_zoom(true), + m_cat702_1_dataout(1), + m_cat702_2_dataout(1), + m_zndip_dataout(1) { } + DECLARE_WRITE_LINE_MEMBER(sio0_sck){ m_cat702_1->write_clock(state); m_cat702_2->write_clock(state); m_zndip->write_clock(state); } + DECLARE_WRITE_LINE_MEMBER(sio0_txd){ m_cat702_1->write_datain(state); m_cat702_2->write_datain(state); } + DECLARE_WRITE_LINE_MEMBER(cat702_1_dataout){ m_cat702_1_dataout = state; update_sio0_rxd(); } + DECLARE_WRITE_LINE_MEMBER(cat702_2_dataout){ m_cat702_2_dataout = state; update_sio0_rxd(); } + DECLARE_WRITE_LINE_MEMBER(zndip_dataout){ m_zndip_dataout = state; update_sio0_rxd(); } + void update_sio0_rxd() { m_sio0->write_rxd(m_cat702_1_dataout && m_cat702_2_dataout && m_zndip_dataout); } DECLARE_READ8_MEMBER(control_r); DECLARE_WRITE8_MEMBER(control_w); DECLARE_WRITE16_MEMBER(control2_w); @@ -384,6 +394,7 @@ protected: virtual void machine_reset(); private: + required_device m_sio0; required_device m_cat702_1; required_device m_cat702_2; required_device m_zndip; @@ -406,6 +417,10 @@ private: UINT8 m_n_znsecsel; UINT8 m_coin_info; + + int m_cat702_1_dataout; + int m_cat702_2_dataout; + int m_zndip_dataout; }; @@ -511,9 +526,9 @@ READ8_MEMBER(taitogn_state::znsecsel_r) WRITE8_MEMBER(taitogn_state::znsecsel_w) { - m_cat702_1->select( ( data >> 2 ) & 1 ); - m_cat702_2->select( ( data >> 3 ) & 1 ); - m_zndip->select( ( data & 0x8c ) != 0x8c ); + m_cat702_1->write_select((data >> 2) & 1); + m_cat702_2->write_select((data >> 3) & 1); + m_zndip->write_select((data & 0x8c) != 0x8c); m_n_znsecsel = data; } @@ -657,9 +672,19 @@ static MACHINE_CONFIG_START( coh3002t, taitogn_state ) MCFG_RAM_MODIFY("maincpu:ram") MCFG_RAM_DEFAULT_SIZE("4M") - MCFG_DEVICE_ADD("maincpu:sio0:cat702_1", CAT702, 0) - MCFG_DEVICE_ADD("maincpu:sio0:cat702_2", CAT702, 0) - MCFG_DEVICE_ADD("maincpu:sio0:zndip", ZNDIP, 0) + MCFG_DEVICE_MODIFY("maincpu:sio0") + MCFG_PSX_SIO_SCK_HANDLER(DEVWRITELINE(DEVICE_SELF_OWNER, taitogn_state, sio0_sck)) + MCFG_PSX_SIO_TXD_HANDLER(DEVWRITELINE(DEVICE_SELF_OWNER, taitogn_state, sio0_txd)) + + MCFG_DEVICE_ADD("cat702_1", CAT702, 0) + MCFG_CAT702_DATAOUT_HANDLER(WRITELINE(taitogn_state, cat702_1_dataout)) + + MCFG_DEVICE_ADD("cat702_2", CAT702, 0) + MCFG_CAT702_DATAOUT_HANDLER(WRITELINE(taitogn_state, cat702_2_dataout)) + + MCFG_DEVICE_ADD("zndip", ZNDIP, 0) + MCFG_ZNDIP_DATAOUT_HANDLER(WRITELINE(taitogn_state, zndip_dataout)) + MCFG_ZNDIP_DSR_HANDLER(DEVWRITELINE("maincpu:sio0", psxsio0_device, write_dsr)) MCFG_ZNDIP_DATA_HANDLER(IOPORT(":DSW")) MCFG_AT28C16_ADD( "at28c16", 0 ) diff --git a/src/mame/drivers/zn.c b/src/mame/drivers/zn.c index ca9a53d0bff..91e5660c58f 100644 --- a/src/mame/drivers/zn.c +++ b/src/mame/drivers/zn.c @@ -38,9 +38,10 @@ public: driver_device(mconfig, type, tag), m_gpu(*this, "gpu"), m_gpu_screen(*this, "gpu:screen"), - m_cat702_1(*this,"maincpu:sio0:cat702_1"), - m_cat702_2(*this,"maincpu:sio0:cat702_2"), - m_zndip(*this,"maincpu:sio0:zndip"), + m_sio0(*this, "maincpu:sio0"), + m_cat702_1(*this, "cat702_1"), + m_cat702_2(*this, "cat702_2"), + m_zndip(*this, "zndip"), m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), m_ram(*this, "maincpu:ram"), @@ -48,10 +49,19 @@ public: m_cbaj_fifo2(*this, "cbaj_fifo2"), m_mb3773(*this, "mb3773"), m_zoom(*this, "taito_zoom"), - m_vt83c461(*this, "ide") + m_vt83c461(*this, "ide"), + m_cat702_1_dataout(1), + m_cat702_2_dataout(1), + m_zndip_dataout(1) { } + DECLARE_WRITE_LINE_MEMBER(sio0_sck){ m_cat702_1->write_clock(state); m_cat702_2->write_clock(state); m_zndip->write_clock(state); } + DECLARE_WRITE_LINE_MEMBER(sio0_txd){ m_cat702_1->write_datain(state); m_cat702_2->write_datain(state); } + DECLARE_WRITE_LINE_MEMBER(cat702_1_dataout){ m_cat702_1_dataout = state; update_sio0_rxd(); } + DECLARE_WRITE_LINE_MEMBER(cat702_2_dataout){ m_cat702_2_dataout = state; update_sio0_rxd(); } + DECLARE_WRITE_LINE_MEMBER(zndip_dataout){ m_zndip_dataout = state; update_sio0_rxd(); } + void update_sio0_rxd() { m_sio0->write_rxd( m_cat702_1_dataout && m_cat702_2_dataout && m_zndip_dataout ); } DECLARE_CUSTOM_INPUT_MEMBER(jdredd_gun_mux_read); DECLARE_READ8_MEMBER(znsecsel_r); DECLARE_WRITE8_MEMBER(znsecsel_w); @@ -124,6 +134,7 @@ private: required_device m_gpu; required_device m_gpu_screen; + required_device m_sio0; required_device m_cat702_1; required_device m_cat702_2; required_device m_zndip; @@ -135,6 +146,10 @@ private: optional_device m_mb3773; optional_device m_zoom; optional_device m_vt83c461; + + int m_cat702_1_dataout; + int m_cat702_2_dataout; + int m_zndip_dataout; }; inline void ATTR_PRINTF(3,4) zn_state::verboselog( int n_level, const char *s_fmt, ... ) @@ -333,9 +348,9 @@ WRITE8_MEMBER(zn_state::znsecsel_w) { verboselog(2, "znsecsel_w( %08x, %08x, %08x )\n", offset, data, mem_mask ); - m_cat702_1->select( ( data >> 2 ) & 1 ); - m_cat702_2->select( ( data >> 3 ) & 1 ); - m_zndip->select( ( data & 0x8c ) != 0x8c ); + m_cat702_1->write_select((data >> 2) & 1); + m_cat702_2->write_select((data >> 3) & 1); + m_zndip->write_select((data & 0x8c) != 0x8c); m_n_znsecsel = data; } @@ -449,9 +464,19 @@ static MACHINE_CONFIG_START( zn1_1mb_vram, zn_state ) MCFG_RAM_MODIFY("maincpu:ram") MCFG_RAM_DEFAULT_SIZE("4M") - MCFG_DEVICE_ADD("maincpu:sio0:cat702_1", CAT702, 0) - MCFG_DEVICE_ADD("maincpu:sio0:cat702_2", CAT702, 0) - MCFG_DEVICE_ADD("maincpu:sio0:zndip", ZNDIP, 0) + MCFG_DEVICE_MODIFY("maincpu:sio0") + MCFG_PSX_SIO_SCK_HANDLER(DEVWRITELINE(DEVICE_SELF_OWNER, zn_state, sio0_sck)) + MCFG_PSX_SIO_TXD_HANDLER(DEVWRITELINE(DEVICE_SELF_OWNER, zn_state, sio0_txd)) + + MCFG_DEVICE_ADD("cat702_1", CAT702, 0) + MCFG_CAT702_DATAOUT_HANDLER(WRITELINE(zn_state, cat702_1_dataout)) + + MCFG_DEVICE_ADD("cat702_2", CAT702, 0) + MCFG_CAT702_DATAOUT_HANDLER(WRITELINE(zn_state, cat702_2_dataout)) + + MCFG_DEVICE_ADD("zndip", ZNDIP, 0) + MCFG_ZNDIP_DATAOUT_HANDLER(WRITELINE(zn_state, zndip_dataout)) + MCFG_ZNDIP_DSR_HANDLER(DEVWRITELINE("maincpu:sio0", psxsio0_device, write_dsr)) MCFG_ZNDIP_DATA_HANDLER(IOPORT(":DSW")) // 5MHz NEC uPD78081 MCU: @@ -483,9 +508,19 @@ static MACHINE_CONFIG_START( zn2, zn_state ) MCFG_RAM_MODIFY("maincpu:ram") MCFG_RAM_DEFAULT_SIZE("4M") - MCFG_DEVICE_ADD("maincpu:sio0:cat702_1", CAT702, 0) - MCFG_DEVICE_ADD("maincpu:sio0:cat702_2", CAT702, 0) - MCFG_DEVICE_ADD("maincpu:sio0:zndip", ZNDIP, 0) + MCFG_DEVICE_MODIFY("maincpu:sio0") + MCFG_PSX_SIO_SCK_HANDLER(DEVWRITELINE(DEVICE_SELF_OWNER, zn_state, sio0_sck)) + MCFG_PSX_SIO_TXD_HANDLER(DEVWRITELINE(DEVICE_SELF_OWNER, zn_state, sio0_txd)) + + MCFG_DEVICE_ADD("cat702_1", CAT702, 0) + MCFG_CAT702_DATAOUT_HANDLER(WRITELINE(zn_state, cat702_1_dataout)) + + MCFG_DEVICE_ADD("cat702_2", CAT702, 0) + MCFG_CAT702_DATAOUT_HANDLER(WRITELINE(zn_state, cat702_2_dataout)) + + MCFG_DEVICE_ADD("zndip", ZNDIP, 0) + MCFG_ZNDIP_DATAOUT_HANDLER(WRITELINE(zn_state, zndip_dataout)) + MCFG_ZNDIP_DSR_HANDLER(DEVWRITELINE("maincpu:sio0", psxsio0_device, write_dsr)) MCFG_ZNDIP_DATA_HANDLER(IOPORT(":DSW")) // 5MHz NEC uPD78081 MCU: diff --git a/src/mame/machine/cat702.c b/src/mame/machine/cat702.c index 8c362e65267..9c322e0ff52 100644 --- a/src/mame/machine/cat702.c +++ b/src/mame/machine/cat702.c @@ -87,17 +87,20 @@ const device_type CAT702 = &device_creator; cat702_device::cat702_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : - psxsiodev_device(mconfig, CAT702, "CAT702", tag, owner, clock, "cat702", __FILE__) + device_t(mconfig, CAT702, "CAT702", tag, owner, clock, "cat702", __FILE__), + m_dataout_handler(*this) { } void cat702_device::device_start() { - psxsiodev_device::device_start(); + m_dataout_handler.resolve_safe(); save_item(NAME(m_select)); save_item(NAME(m_state)); save_item(NAME(m_bit)); + + m_dataout_handler(1); } // Given the value for x7..x0 and linear transform coefficients a7..a0 @@ -159,29 +162,29 @@ void cat702_device::init(const UINT8 *transform) m_transform = transform; } -void cat702_device::select(int select) +WRITE_LINE_MEMBER(cat702_device::write_select) { - if (m_select != select) + if (m_select != state) { - if (!select) + if (!state) { m_state = 0xfc; m_bit = 0; } else { - data_out(0, PSX_SIO_IN_DATA); + m_dataout_handler(1); } - m_select = select; + m_select = state; } } -void cat702_device::data_in( int data, int mask ) +WRITE_LINE_MEMBER(cat702_device::write_clock) { static const UINT8 initial_sbox[8] = { 0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x7f }; - if ( !m_select && (mask & PSX_SIO_OUT_CLOCK) != 0 && (data & PSX_SIO_OUT_CLOCK) == 0) + if (!state && m_clock && !m_select) { if (m_bit==0) { @@ -190,12 +193,22 @@ void cat702_device::data_in( int data, int mask ) } // Compute the output and change the state - data_out(((m_state >> m_bit) & 1) != 0 ? PSX_SIO_IN_DATA : 0, PSX_SIO_IN_DATA); + m_dataout_handler(((m_state >> m_bit) & 1) != 0); + } - if((data & PSX_SIO_OUT_DATA)==0) + if (state && !m_clock && !m_select) + { + if (!m_datain) apply_bit_sbox(m_bit); m_bit++; m_bit&=7; } + + m_clock = state; +} + +WRITE_LINE_MEMBER(cat702_device::write_datain) +{ + m_datain = state; } diff --git a/src/mame/machine/cat702.h b/src/mame/machine/cat702.h index 57610327289..818ecd2d584 100644 --- a/src/mame/machine/cat702.h +++ b/src/mame/machine/cat702.h @@ -1,36 +1,47 @@ -/* CAT702 ZN security chip */ +/* CAT702 security chip */ #pragma once #ifndef __CAT702_H__ #define __CAT702_H__ -#include "cpu/psx/siodev.h" +#include "emu.h" extern const device_type CAT702; -class cat702_device : public psxsiodev_device +#define MCFG_CAT702_DATAOUT_HANDLER(_devcb) \ + devcb = &cat702_device::set_dataout_handler(*device, DEVCB_##_devcb); + +class cat702_device : public device_t { public: cat702_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - void init(const UINT8 *transform); - void select(int select); + // static configuration helpers + template static devcb_base &set_dataout_handler(device_t &device, _Object object) { return downcast(device).m_dataout_handler.set_callback(object); } + + void init(const UINT8 *transform); // TODO: region + + DECLARE_WRITE_LINE_MEMBER(write_select); + DECLARE_WRITE_LINE_MEMBER(write_datain); + DECLARE_WRITE_LINE_MEMBER(write_clock); protected: virtual void device_start(); private: - virtual void data_in( int data, int mask ); - UINT8 compute_sbox_coef(int sel, int bit); void apply_bit_sbox(int sel); void apply_sbox(const UINT8 *sbox); const UINT8 *m_transform; int m_select; + int m_clock; + int m_datain; UINT8 m_state; UINT8 m_bit; + + devcb_write_line m_dataout_handler; }; #endif diff --git a/src/mame/machine/k573cass.c b/src/mame/machine/k573cass.c index 53c6edb6bfa..e181dffbebc 100644 --- a/src/mame/machine/k573cass.c +++ b/src/mame/machine/k573cass.c @@ -7,6 +7,20 @@ #include "k573cass.h" +// class konami573_cassette_interface + +konami573_cassette_interface::konami573_cassette_interface(const machine_config &mconfig, device_t &device) + : device_slot_card_interface(mconfig, device) +{ + m_slot = dynamic_cast(device.owner()); +} + +konami573_cassette_interface::~konami573_cassette_interface() +{ +} + + + WRITE_LINE_MEMBER(konami573_cassette_interface::write_line_d0) { } @@ -31,11 +45,6 @@ WRITE_LINE_MEMBER(konami573_cassette_interface::write_line_zs01_sda) { } -READ_LINE_MEMBER(konami573_cassette_interface::read_line_dsr) -{ - return 1; -} - READ_LINE_MEMBER(konami573_cassette_interface::read_line_ds2401) { return 0; @@ -56,14 +65,14 @@ const device_type KONAMI573_CASSETTE_X = &device_creator; - -konami573_cassette_slot_serial_device::konami573_cassette_slot_serial_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : - psxsiodev_device(mconfig, KONAMI573_CASSETTE_SLOT, "Konami 573 Cassette Slot (SERIAL)", tag, owner, clock, "k573cassslotserial", __FILE__) -{ -} - -void konami573_cassette_slot_serial_device::device_start() -{ - psxsiodev_device::device_start(); -} - -void konami573_cassette_slot_serial_device::_data_out( int data, int mask ) -{ - data_out( data, mask ); -} - -void konami573_cassette_slot_serial_device::data_in( int data, int mask ) -{ -} - - const device_type KONAMI573_CASSETTE_SLOT = &device_creator; konami573_cassette_slot_device::konami573_cassette_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : device_t(mconfig, KONAMI573_CASSETTE_SLOT, "Konami 573 Cassette Slot", tag, owner, clock, "k573cassslot", __FILE__), device_slot_interface(mconfig, *this), - m_serial(*this, ":maincpu:sio1:cassette") /// HACK: this shouldn't know where the actual slot is. + m_dsr_handler(*this) { } void konami573_cassette_slot_device::device_start() { - m_cassette = dynamic_cast(get_card_device()); + m_dsr_handler.resolve_safe(); - if( m_cassette != NULL && m_cassette->read_line_dsr() ) - { - m_serial->_data_out( PSX_SIO_IN_DSR, PSX_SIO_IN_DSR ); - } - else - { - m_serial->_data_out( PSX_SIO_IN_DSR, 0 ); - } + m_dev = dynamic_cast(get_card_device()); } WRITE_LINE_MEMBER(konami573_cassette_slot_device::write_line_d0) { - if( m_cassette ) + if( m_dev ) { - m_cassette->write_line_d0( state ); + m_dev->write_line_d0( state ); } } WRITE_LINE_MEMBER(konami573_cassette_slot_device::write_line_d1) { - if( m_cassette ) + if( m_dev ) { - m_cassette->write_line_d1( state ); + m_dev->write_line_d1( state ); } } WRITE_LINE_MEMBER(konami573_cassette_slot_device::write_line_d2) { - if( m_cassette ) + if( m_dev ) { - m_cassette->write_line_d2( state ); + m_dev->write_line_d2( state ); } } WRITE_LINE_MEMBER(konami573_cassette_slot_device::write_line_d3) { - if( m_cassette ) + if( m_dev ) { - m_cassette->write_line_d3( state ); + m_dev->write_line_d3( state ); } } WRITE_LINE_MEMBER(konami573_cassette_slot_device::write_line_d4) { - if( m_cassette ) + if( m_dev ) { - m_cassette->write_line_d4( state ); + m_dev->write_line_d4( state ); } } WRITE_LINE_MEMBER(konami573_cassette_slot_device::write_line_d5) { - if( m_cassette ) + if( m_dev ) { - m_cassette->write_line_d5( state ); + m_dev->write_line_d5( state ); } } WRITE_LINE_MEMBER(konami573_cassette_slot_device::write_line_d6) { - if( m_cassette ) + if( m_dev ) { - m_cassette->write_line_d6( state ); + m_dev->write_line_d6( state ); } } WRITE_LINE_MEMBER(konami573_cassette_slot_device::write_line_d7) { - if( m_cassette ) + if( m_dev ) { - m_cassette->write_line_d7( state ); + m_dev->write_line_d7( state ); } } WRITE_LINE_MEMBER(konami573_cassette_slot_device::write_line_zs01_sda) { - if( m_cassette ) + if( m_dev ) { - m_cassette->write_line_zs01_sda( state ); + m_dev->write_line_zs01_sda( state ); } } READ_LINE_MEMBER(konami573_cassette_slot_device::read_line_ds2401) { - if( m_cassette ) + if( m_dev ) { - return m_cassette->read_line_ds2401(); + return m_dev->read_line_ds2401(); } return 0; @@ -491,9 +475,9 @@ READ_LINE_MEMBER(konami573_cassette_slot_device::read_line_ds2401) READ_LINE_MEMBER(konami573_cassette_slot_device::read_line_secflash_sda) { - if( m_cassette ) + if( m_dev ) { - return m_cassette->read_line_secflash_sda(); + return m_dev->read_line_secflash_sda(); } return 0; @@ -501,9 +485,9 @@ READ_LINE_MEMBER(konami573_cassette_slot_device::read_line_secflash_sda) READ_LINE_MEMBER(konami573_cassette_slot_device::read_line_adc083x_do) { - if( m_cassette ) + if( m_dev ) { - return m_cassette->read_line_adc083x_do(); + return m_dev->read_line_adc083x_do(); } return 0; @@ -511,9 +495,9 @@ READ_LINE_MEMBER(konami573_cassette_slot_device::read_line_adc083x_do) READ_LINE_MEMBER(konami573_cassette_slot_device::read_line_adc083x_sars) { - if( m_cassette ) + if( m_dev ) { - return m_cassette->read_line_adc083x_sars(); + return m_dev->read_line_adc083x_sars(); } return 0; diff --git a/src/mame/machine/k573cass.h b/src/mame/machine/k573cass.h index 3dc431111f3..b36bbfdb54b 100644 --- a/src/mame/machine/k573cass.h +++ b/src/mame/machine/k573cass.h @@ -10,16 +10,63 @@ #ifndef __K573CASS_H__ #define __K573CASS_H__ -#include "cpu/psx/siodev.h" #include "machine/adc083x.h" #include "machine/ds2401.h" #include "machine/x76f041.h" #include "machine/x76f100.h" #include "machine/zs01.h" -class konami573_cassette_interface +#define MCFG_KONAMI573_CASSETTE_DSR_HANDLER(_devcb) \ + devcb = &konami573_cassette_slot_device::set_dsr_handler(*device, DEVCB_##_devcb); + + +extern const device_type KONAMI573_CASSETTE_SLOT; + +class konami573_cassette_interface; + +class konami573_cassette_slot_device : public device_t, + public device_slot_interface { + friend class konami573_cassette_interface; + public: + konami573_cassette_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + template static devcb_base &set_dsr_handler(device_t &device, _Object object) { return downcast(device).m_dsr_handler.set_callback(object); } + + DECLARE_WRITE_LINE_MEMBER(write_line_d0); + DECLARE_WRITE_LINE_MEMBER(write_line_d1); + DECLARE_WRITE_LINE_MEMBER(write_line_d2); + DECLARE_WRITE_LINE_MEMBER(write_line_d3); + DECLARE_WRITE_LINE_MEMBER(write_line_d4); + DECLARE_WRITE_LINE_MEMBER(write_line_d5); + DECLARE_WRITE_LINE_MEMBER(write_line_d6); + DECLARE_WRITE_LINE_MEMBER(write_line_d7); + DECLARE_WRITE_LINE_MEMBER(write_line_zs01_sda); + DECLARE_READ_LINE_MEMBER(read_line_ds2401); + DECLARE_READ_LINE_MEMBER(read_line_secflash_sda); + DECLARE_READ_LINE_MEMBER(read_line_adc083x_do); + DECLARE_READ_LINE_MEMBER(read_line_adc083x_sars); + +protected: + virtual void device_start(); + + devcb_write_line m_dsr_handler; + +private: + konami573_cassette_interface *m_dev; +}; + +class konami573_cassette_interface : public device_slot_card_interface +{ + friend class konami573_cassette_slot_device; + +public: + konami573_cassette_interface(const machine_config &mconfig, device_t &device); + virtual ~konami573_cassette_interface(); + + DECLARE_WRITE_LINE_MEMBER(output_dsr) { m_slot->m_dsr_handler(state); } + virtual DECLARE_WRITE_LINE_MEMBER(write_line_d0); virtual DECLARE_WRITE_LINE_MEMBER(write_line_d1) = 0; virtual DECLARE_WRITE_LINE_MEMBER(write_line_d2) = 0; @@ -31,19 +78,17 @@ public: virtual DECLARE_WRITE_LINE_MEMBER(write_line_zs01_sda); virtual DECLARE_READ_LINE_MEMBER(read_line_ds2401); virtual DECLARE_READ_LINE_MEMBER(read_line_secflash_sda) = 0; - virtual DECLARE_READ_LINE_MEMBER(read_line_dsr); virtual DECLARE_READ_LINE_MEMBER(read_line_adc083x_do); virtual DECLARE_READ_LINE_MEMBER(read_line_adc083x_sars); - virtual ~konami573_cassette_interface() {} + konami573_cassette_slot_device *m_slot; }; extern const device_type KONAMI573_CASSETTE_X; class konami573_cassette_x_device: public device_t, - public konami573_cassette_interface, - public device_slot_card_interface + public konami573_cassette_interface { public: konami573_cassette_x_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); @@ -119,8 +164,7 @@ extern const device_type KONAMI573_CASSETTE_Y; devcb = &konami573_cassette_y_device::set_d7_handler(*device, DEVCB_##_devcb); class konami573_cassette_y_device: public device_t, - public konami573_cassette_interface, - public device_slot_card_interface + public konami573_cassette_interface { public: konami573_cassette_y_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); @@ -184,8 +228,7 @@ private: extern const device_type KONAMI573_CASSETTE_ZI; class konami573_cassette_zi_device: public device_t, - public konami573_cassette_interface, - public device_slot_card_interface + public konami573_cassette_interface { public: konami573_cassette_zi_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); @@ -208,52 +251,4 @@ private: }; -extern const device_type KONAMI573_CASSETTE_SLOT_SERIAL; - -class konami573_cassette_slot_serial_device : public psxsiodev_device -{ -public: - konami573_cassette_slot_serial_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - - void _data_out( int data, int mask ); - -protected: - virtual void device_start(); - -private: - virtual void data_in( int data, int mask ); -}; - - -extern const device_type KONAMI573_CASSETTE_SLOT; - -class konami573_cassette_slot_device : public device_t, - public device_slot_interface -{ -public: - konami573_cassette_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - - DECLARE_WRITE_LINE_MEMBER(write_line_d0); - DECLARE_WRITE_LINE_MEMBER(write_line_d1); - DECLARE_WRITE_LINE_MEMBER(write_line_d2); - DECLARE_WRITE_LINE_MEMBER(write_line_d3); - DECLARE_WRITE_LINE_MEMBER(write_line_d4); - DECLARE_WRITE_LINE_MEMBER(write_line_d5); - DECLARE_WRITE_LINE_MEMBER(write_line_d6); - DECLARE_WRITE_LINE_MEMBER(write_line_d7); - DECLARE_WRITE_LINE_MEMBER(write_line_zs01_sda); - DECLARE_READ_LINE_MEMBER(read_line_ds2401); - DECLARE_READ_LINE_MEMBER(read_line_secflash_sda); - DECLARE_READ_LINE_MEMBER(read_line_adc083x_do); - DECLARE_READ_LINE_MEMBER(read_line_adc083x_sars); - -protected: - virtual void device_start(); - -private: - required_device m_serial; - konami573_cassette_interface *m_cassette; -}; - - #endif diff --git a/src/mame/machine/zndip.c b/src/mame/machine/zndip.c index 8858816e7ab..5a1bc8f49e2 100644 --- a/src/mame/machine/zndip.c +++ b/src/mame/machine/zndip.c @@ -5,57 +5,62 @@ const device_type ZNDIP = &device_creator; zndip_device::zndip_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : - psxsiodev_device(mconfig, ZNDIP, "ZNDIP", tag, owner, clock, "zndip", __FILE__), - m_data_handler(*this) + device_t(mconfig, ZNDIP, "ZNDIP", tag, owner, clock, "zndip", __FILE__), + m_data_handler(*this), + m_dataout_handler(*this), + m_dsr_handler(*this) { } void zndip_device::device_start() { - psxsiodev_device::device_start(); - m_data_handler.resolve_safe( 0 ); + m_dataout_handler.resolve_safe(); + m_dsr_handler.resolve_safe(); m_dip_timer = timer_alloc( 0 ); + + m_dataout_handler(1); + m_dsr_handler(1); } -void zndip_device::select(int select) +WRITE_LINE_MEMBER(zndip_device::write_select) { - if (m_select != select) + if (!state && m_select) + { + m_bit = 0; + m_dip_timer->adjust( attotime::from_usec( 100 ), 0 ); + } + else { - if (!select) - { - m_bit = 0; - m_dip_timer->adjust( attotime::from_usec( 100 ), 1 ); - } - else - { - data_out(0, PSX_SIO_IN_DATA | PSX_SIO_IN_DSR); - } - - m_select = select; + m_dataout_handler(1); + m_dsr_handler(1); } + + m_select = state; } -void zndip_device::data_in( int data, int mask ) +WRITE_LINE_MEMBER(zndip_device::write_clock) { - if( !m_select && ( mask & PSX_SIO_OUT_CLOCK ) != 0 && ( data & PSX_SIO_OUT_CLOCK ) == 0) + if (!state && m_clock && !m_select) { int dip = m_data_handler(); int bit = ( ( dip >> m_bit ) & 1 ); // verboselog( machine, 2, "read dip %02x -> %02x\n", n_data, bit * PSX_SIO_IN_DATA ); - data_out( bit * PSX_SIO_IN_DATA, PSX_SIO_IN_DATA ); + m_dataout_handler(bit); m_bit++; m_bit &= 7; } + + m_clock = state; } void zndip_device::device_timer(emu_timer &timer, device_timer_id tid, int param, void *ptr) { - data_out( param * PSX_SIO_IN_DSR, PSX_SIO_IN_DSR ); + m_dsr_handler(param); - if( param ) + if( !param ) { - m_dip_timer->adjust( attotime::from_usec( 50 ), 0 ); + m_dip_timer->adjust( attotime::from_usec( 50 ), 1 ); } } diff --git a/src/mame/machine/zndip.h b/src/mame/machine/zndip.h index 1c7b364fb07..2285cbad464 100644 --- a/src/mame/machine/zndip.h +++ b/src/mame/machine/zndip.h @@ -5,32 +5,45 @@ #ifndef __ZNDIP_H__ #define __ZNDIP_H__ -#include "cpu/psx/siodev.h" +#include "emu.h" extern const device_type ZNDIP; +#define MCFG_ZNDIP_DATAOUT_HANDLER(_devcb) \ + devcb = &zndip_device::set_dataout_handler(*device, DEVCB_##_devcb); + +#define MCFG_ZNDIP_DSR_HANDLER(_devcb) \ + devcb = &zndip_device::set_dsr_handler(*device, DEVCB_##_devcb); + #define MCFG_ZNDIP_DATA_HANDLER(_devcb) \ devcb = &zndip_device::set_data_handler(*device, DEVCB_##_devcb); -class zndip_device : public psxsiodev_device + +class zndip_device : public device_t { public: zndip_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); // static configuration helpers template static devcb_base &set_data_handler(device_t &device, _Object object) { return downcast(device).m_data_handler.set_callback(object); } + template static devcb_base &set_dataout_handler(device_t &device, _Object object) { return downcast(device).m_dataout_handler.set_callback(object); } + template static devcb_base &set_dsr_handler(device_t &device, _Object object) { return downcast(device).m_dsr_handler.set_callback(object); } - void select(int select); + WRITE_LINE_MEMBER(write_select); + WRITE_LINE_MEMBER(write_clock); protected: virtual void device_start(); virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); private: - virtual void data_in( int data, int mask ); - devcb_read8 m_data_handler; + devcb_write_line m_dataout_handler; + devcb_write_line m_dsr_handler; int m_select; + int m_clock; + int m_datain; + UINT8 m_bit; emu_timer *m_dip_timer; }; diff --git a/src/mess/drivers/psx.c b/src/mess/drivers/psx.c index 79fbfa68fdd..181d7c50a94 100644 --- a/src/mess/drivers/psx.c +++ b/src/mess/drivers/psx.c @@ -493,10 +493,17 @@ static MACHINE_CONFIG_START( psj, psx1_state ) MCFG_RAM_MODIFY("maincpu:ram") MCFG_RAM_DEFAULT_SIZE("2M") - MCFG_DEVICE_ADD("maincpu:sio0:controllers", PSXCONTROLLERPORTS, 0) + MCFG_DEVICE_ADD("controllers", PSXCONTROLLERPORTS, 0) + MCFG_PSX_CONTROLLER_PORTS_RXD_HANDLER(DEVWRITELINE("maincpu:sio0", psxsio0_device, write_rxd)) + MCFG_PSX_CONTROLLER_PORTS_DSR_HANDLER(DEVWRITELINE("maincpu:sio0", psxsio0_device, write_dsr)) MCFG_PSX_CTRL_PORT_ADD("port1", psx_controllers, "digital_pad") MCFG_PSX_CTRL_PORT_ADD("port2", psx_controllers, "digital_pad") + MCFG_DEVICE_MODIFY("maincpu:sio0") + MCFG_PSX_SIO_DTR_HANDLER(DEVWRITELINE("^controllers", psxcontrollerports_device, write_dtr)) + MCFG_PSX_SIO_SCK_HANDLER(DEVWRITELINE("^controllers", psxcontrollerports_device, write_sck)) + MCFG_PSX_SIO_TXD_HANDLER(DEVWRITELINE("^controllers", psxcontrollerports_device, write_txd)) + /* video hardware */ MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8561Q, 0x100000, XTAL_53_693175MHz ) @@ -534,10 +541,17 @@ static MACHINE_CONFIG_START( pse, psx1_state ) MCFG_RAM_MODIFY("maincpu:ram") MCFG_RAM_DEFAULT_SIZE("2M") - MCFG_DEVICE_ADD("maincpu:sio0:controllers", PSXCONTROLLERPORTS, 0) + MCFG_DEVICE_ADD("controllers", PSXCONTROLLERPORTS, 0) + MCFG_PSX_CONTROLLER_PORTS_RXD_HANDLER(DEVWRITELINE("maincpu:sio0", psxsio0_device, write_rxd)) + MCFG_PSX_CONTROLLER_PORTS_DSR_HANDLER(DEVWRITELINE("maincpu:sio0", psxsio0_device, write_dsr)) MCFG_PSX_CTRL_PORT_ADD("port1", psx_controllers, "digital_pad") MCFG_PSX_CTRL_PORT_ADD("port2", psx_controllers, "digital_pad") + MCFG_DEVICE_MODIFY("maincpu:sio0") + MCFG_PSX_SIO_DTR_HANDLER(DEVWRITELINE("^controllers", psxcontrollerports_device, write_dtr)) + MCFG_PSX_SIO_SCK_HANDLER(DEVWRITELINE("^controllers", psxcontrollerports_device, write_sck)) + MCFG_PSX_SIO_TXD_HANDLER(DEVWRITELINE("^controllers", psxcontrollerports_device, write_txd)) + /* video hardware */ /* TODO: visible area and refresh rate */ MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8561Q, 0x100000, XTAL_53_693175MHz ) -- cgit v1.2.3