summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author smf- <smf-@users.noreply.github.com>2014-10-26 10:31:24 +0000
committer smf- <smf-@users.noreply.github.com>2014-10-26 10:32:58 +0000
commit7e7b1dc0bb5b9c2acd27fa353dce57e1a985adc9 (patch)
treed56c9d65b59f292ca92971be0a8c60fdf4db63ef
parent50d983885308d97db172d25006250b3c58677acc (diff)
Convert PSX sio to use devcb. [smf]
-rw-r--r--src/emu/bus/psx/ctlrport.c34
-rw-r--r--src/emu/bus/psx/ctlrport.h23
-rw-r--r--src/emu/cpu/cpu.mak2
-rw-r--r--src/emu/cpu/psx/sio.c114
-rw-r--r--src/emu/cpu/psx/sio.h38
-rw-r--r--src/emu/cpu/psx/siodev.c22
-rw-r--r--src/emu/cpu/psx/siodev.h41
-rw-r--r--src/mame/drivers/ksys573.c3
-rw-r--r--src/mame/drivers/taitogn.c45
-rw-r--r--src/mame/drivers/zn.c61
-rw-r--r--src/mame/machine/cat702.c35
-rw-r--r--src/mame/machine/cat702.h25
-rw-r--r--src/mame/machine/k573cass.c120
-rw-r--r--src/mame/machine/k573cass.h111
-rw-r--r--src/mame/machine/zndip.c51
-rw-r--r--src/mame/machine/zndip.h23
-rw-r--r--src/mess/drivers/psx.c18
17 files changed, 399 insertions, 367 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,
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<psxsiodev_device *>(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<class _Object> static devcb_base &set_irq_handler(device_t &device, _Object object) { return downcast<psxsio_device &>(device).m_irq_handler.set_callback(object); }
+ template<class _Object> static devcb_base &set_sck_handler(device_t &device, _Object object) { return downcast<psxsio_device &>(device).m_sck_handler.set_callback(object); }
+ template<class _Object> static devcb_base &set_txd_handler(device_t &device, _Object object) { return downcast<psxsio_device &>(device).m_txd_handler.set_callback(object); }
+ template<class _Object> static devcb_base &set_dtr_handler(device_t &device, _Object object) { return downcast<psxsio_device &>(device).m_dtr_handler.set_callback(object); }
+ template<class _Object> static devcb_base &set_rts_handler(device_t &device, _Object object) { return downcast<psxsio_device &>(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<psxsio0_device> m_sio0;
required_device<cat702_device> m_cat702_1;
required_device<cat702_device> m_cat702_2;
required_device<zndip_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<psxgpu_device> m_gpu;
required_device<screen_device> m_gpu_screen;
+ required_device<psxsio0_device> m_sio0;
required_device<cat702_device> m_cat702_1;
required_device<cat702_device> m_cat702_2;
required_device<zndip_device> m_zndip;
@@ -135,6 +146,10 @@ private:
optional_device<mb3773_device> m_mb3773;
optional_device<taito_zoom_device> m_zoom;
optional_device<vt83c461_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::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<class _Object> static devcb_base &set_dataout_handler(device_t &device, _Object object) { return downcast<cat702_device &>(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<konami573_cassette_slot_device *>(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_x_de
konami573_cassette_x_device::konami573_cassette_x_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, KONAMI573_CASSETTE_X, "Konami 573 Cassette X", tag, owner, clock, "k573cassx", __FILE__),
- device_slot_card_interface(mconfig, *this),
+ konami573_cassette_interface(mconfig, *this),
m_x76f041(*this, "eeprom")
{
}
konami573_cassette_x_device::konami573_cassette_x_device(const machine_config &mconfig, const 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, __FILE__),
- device_slot_card_interface(mconfig, *this),
+ konami573_cassette_interface(mconfig, *this),
m_x76f041(*this, "eeprom")
{
}
@@ -79,6 +88,7 @@ machine_config_constructor konami573_cassette_x_device::device_mconfig_additions
void konami573_cassette_x_device::device_start()
{
+ output_dsr(0);
}
WRITE_LINE_MEMBER(konami573_cassette_x_device::write_line_d0)
@@ -171,7 +181,7 @@ const device_type KONAMI573_CASSETTE_Y = &device_creator<konami573_cassette_y_de
konami573_cassette_y_device::konami573_cassette_y_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, KONAMI573_CASSETTE_Y, "Konami 573 Cassette Y", tag, owner, clock, "k573cassy", __FILE__),
- device_slot_card_interface(mconfig, *this),
+ konami573_cassette_interface(mconfig, *this),
m_x76f100(*this, "eeprom"),
m_d0_handler(*this),
m_d1_handler(*this),
@@ -186,7 +196,7 @@ konami573_cassette_y_device::konami573_cassette_y_device(const machine_config &m
konami573_cassette_y_device::konami573_cassette_y_device(const machine_config &mconfig, const 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, __FILE__),
- device_slot_card_interface(mconfig, *this),
+ konami573_cassette_interface(mconfig, *this),
m_x76f100(*this, "eeprom"),
m_d0_handler(*this),
m_d1_handler(*this),
@@ -218,6 +228,8 @@ void konami573_cassette_y_device::device_start()
m_d5_handler.resolve_safe();
m_d6_handler.resolve_safe();
m_d7_handler.resolve_safe();
+
+ output_dsr(0);
}
READ_LINE_MEMBER(konami573_cassette_y_device::read_line_secflash_sda)
@@ -305,7 +317,7 @@ const device_type KONAMI573_CASSETTE_ZI = &device_creator<konami573_cassette_zi_
konami573_cassette_zi_device::konami573_cassette_zi_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, KONAMI573_CASSETTE_ZI, "Konami 573 Cassette ZI", tag, owner, clock, "k573casszi", __FILE__),
- device_slot_card_interface(mconfig, *this),
+ konami573_cassette_interface(mconfig, *this),
m_zs01(*this,"eeprom"),
m_ds2401(*this, "id")
{
@@ -324,6 +336,7 @@ machine_config_constructor konami573_cassette_zi_device::device_mconfig_addition
void konami573_cassette_zi_device::device_start()
{
+ output_dsr(0);
}
WRITE_LINE_MEMBER(konami573_cassette_zi_device::write_line_d1)
@@ -362,128 +375,99 @@ READ_LINE_MEMBER(konami573_cassette_zi_device::read_line_secflash_sda)
}
-const device_type KONAMI573_CASSETTE_SLOT_SERIAL = &device_creator<konami573_cassette_slot_serial_device>;
-
-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::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<konami573_cassette_interface *>(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<konami573_cassette_interface *>(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<class _Object> static devcb_base &set_dsr_handler(device_t &device, _Object object) { return downcast<konami573_cassette_slot_device &>(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<konami573_cassette_slot_serial_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::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<class _Object> static devcb_base &set_data_handler(device_t &device, _Object object) { return downcast<zndip_device &>(device).m_data_handler.set_callback(object); }
+ template<class _Object> static devcb_base &set_dataout_handler(device_t &device, _Object object) { return downcast<zndip_device &>(device).m_dataout_handler.set_callback(object); }
+ template<class _Object> static devcb_base &set_dsr_handler(device_t &device, _Object object) { return downcast<zndip_device &>(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 )