summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--.gitattributes8
-rw-r--r--src/emu/cpu/cpu.mak2
-rw-r--r--src/emu/cpu/psx/psx.c38
-rw-r--r--src/emu/cpu/psx/psx.h2
-rw-r--r--src/emu/cpu/psx/sio.c74
-rw-r--r--src/emu/cpu/psx/sio.h23
-rw-r--r--src/emu/cpu/psx/siodev.c19
-rw-r--r--src/emu/cpu/psx/siodev.h39
-rw-r--r--src/mame/drivers/ksys573.c29
-rw-r--r--src/mame/drivers/taitogn.c132
-rw-r--r--src/mame/drivers/zn.c163
-rw-r--r--src/mame/includes/psx.h2
-rw-r--r--src/mame/machine/k573cass.c19
-rw-r--r--src/mame/machine/k573cass.h22
-rw-r--r--src/mame/machine/psx.c12
-rw-r--r--src/mame/machine/zndip.c59
-rw-r--r--src/mame/machine/zndip.h37
-rw-r--r--src/mame/machine/znsec.c49
-rw-r--r--src/mame/machine/znsec.h7
-rw-r--r--src/mame/mame.mak4
-rw-r--r--src/mess/drivers/psx.c210
-rw-r--r--src/mess/machine/psxcport.c201
-rw-r--r--src/mess/machine/psxcport.h38
-rw-r--r--src/mess/mess.mak1
24 files changed, 586 insertions, 604 deletions
diff --git a/.gitattributes b/.gitattributes
index 2faba7e64c9..f38e379d509 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -668,6 +668,8 @@ src/emu/cpu/psx/rcnt.c svneol=native#text/plain
src/emu/cpu/psx/rcnt.h svneol=native#text/plain
src/emu/cpu/psx/sio.c svneol=native#text/plain
src/emu/cpu/psx/sio.h svneol=native#text/plain
+src/emu/cpu/psx/siodev.c svneol=native#text/plain
+src/emu/cpu/psx/siodev.h svneol=native#text/plain
src/emu/cpu/rsp/rsp.c svneol=native#text/plain
src/emu/cpu/rsp/rsp.h svneol=native#text/plain
src/emu/cpu/rsp/rsp_dasm.c svneol=native#text/plain
@@ -4649,6 +4651,8 @@ src/mame/machine/jalcrpt.h svneol=native#text/plain
src/mame/machine/jumpshot.c svneol=native#text/plain
src/mame/machine/jvs13551.c svneol=native#text/plain
src/mame/machine/jvs13551.h svneol=native#text/plain
+src/mame/machine/k573cass.c svneol=native#text/plain
+src/mame/machine/k573cass.h svneol=native#text/plain
src/mame/machine/kabuki.c svneol=native#text/plain
src/mame/machine/kaneko_calc3.c svneol=native#text/plain
src/mame/machine/kaneko_calc3.h svneol=native#text/plain
@@ -4833,6 +4837,8 @@ src/mame/machine/vsnes.c svneol=native#text/plain
src/mame/machine/williams.c svneol=native#text/plain
src/mame/machine/wrally.c svneol=native#text/plain
src/mame/machine/xevious.c svneol=native#text/plain
+src/mame/machine/zndip.c svneol=native#text/plain
+src/mame/machine/zndip.h svneol=native#text/plain
src/mame/machine/znsec.c svneol=native#text/plain
src/mame/machine/znsec.h svneol=native#text/plain
src/mame/machine/zs01.c svneol=native#text/plain
@@ -7138,6 +7144,8 @@ src/mess/machine/psxcd.c svneol=native#text/plain
src/mess/machine/psxcd.h svneol=native#text/plain
src/mess/machine/psxcddrv.c svneol=native#text/plain
src/mess/machine/psxcddrv.h svneol=native#text/plain
+src/mess/machine/psxcport.c svneol=native#text/plain
+src/mess/machine/psxcport.h svneol=native#text/plain
src/mess/machine/radio86.c svneol=native#text/plain
src/mess/machine/rm380z.c svneol=native#text/plain
src/mess/machine/rmnimbus.c svneol=native#text/plain
diff --git a/src/emu/cpu/cpu.mak b/src/emu/cpu/cpu.mak
index eeba32d2b82..9f8564c6773 100644
--- a/src/emu/cpu/cpu.mak
+++ b/src/emu/cpu/cpu.mak
@@ -931,7 +931,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
+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
DASMOBJS += $(CPUOBJ)/psx/psxdasm.o
endif
diff --git a/src/emu/cpu/psx/psx.c b/src/emu/cpu/psx/psx.c
index 6d99c5c6468..bf021fec8ed 100644
--- a/src/emu/cpu/psx/psx.c
+++ b/src/emu/cpu/psx/psx.c
@@ -3167,44 +3167,6 @@ psxcpu_device *psxcpu_device::getcpu( device_t &device, const char *cputag )
return downcast<psxcpu_device *>( device.subdevice( cputag ) );
}
-void psxcpu_device::install_sio_handler( device_t &device, const char *cputag, int n_port, psx_sio_handler p_f_sio_handler )
-{
- psxsio_device *sio;
-
- switch( n_port )
- {
- case 0:
- sio = getcpu( device, cputag )->subdevice<psxsio_device>("sio0");
- break;
- case 1:
- sio = getcpu( device, cputag )->subdevice<psxsio_device>("sio1");
- break;
- default:
- return;
- }
-
- sio->install_handler( p_f_sio_handler );
-}
-
-void psxcpu_device::sio_input( device_t &device, const char *cputag, int n_port, int n_mask, int n_data )
-{
- psxsio_device *sio;
-
- switch( n_port )
- {
- case 0:
- sio = getcpu( device, cputag )->subdevice<psxsio_device>("sio0");
- break;
- case 1:
- sio = getcpu( device, cputag )->subdevice<psxsio_device>("sio1");
- break;
- default:
- return;
- }
-
- sio->input( n_mask, n_data );
-}
-
READ32_HANDLER( psxcpu_device::gpu_r )
{
return m_gpu_read_handler( space, offset, mem_mask );
diff --git a/src/emu/cpu/psx/psx.h b/src/emu/cpu/psx/psx.h
index b42ec76c4b1..de722f094fb 100644
--- a/src/emu/cpu/psx/psx.h
+++ b/src/emu/cpu/psx/psx.h
@@ -143,8 +143,6 @@ public:
DECLARE_READ32_MEMBER( gpu_r );
static psxcpu_device *getcpu( device_t &device, const char *cputag );
- static void install_sio_handler( device_t &device, const char *cputag, int n_port, psx_sio_handler p_f_sio_handler );
- static void sio_input( device_t &device, const char *cputag, int n_port, int n_mask, int n_data );
protected:
psxcpu_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, address_map_constructor internal_map);
diff --git a/src/emu/cpu/psx/sio.c b/src/emu/cpu/psx/sio.c
index b7da951febc..8f4906a5623 100644
--- a/src/emu/cpu/psx/sio.c
+++ b/src/emu/cpu/psx/sio.c
@@ -6,7 +6,6 @@
*/
#include "sio.h"
-#include "includes/psx.h"
#define VERBOSE_LEVEL ( 0 )
@@ -38,7 +37,6 @@ 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 *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, type, "PSX SIO", tag, owner, clock),
- m_fn_handler(NULL),
m_irq_handler(*this)
{
}
@@ -82,11 +80,20 @@ void psxsio_device::device_start()
save_item( NAME( m_tx_shift ) );
save_item( NAME( m_rx_bits ) );
save_item( NAME( m_tx_bits ) );
-}
-void psxsio_device::install_handler( psx_sio_handler p_f_sio_handler )
-{
- m_fn_handler = p_f_sio_handler;
+ 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()
@@ -140,6 +147,22 @@ 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" );
@@ -167,18 +190,15 @@ void psxsio_device::device_timer(emu_timer &timer, device_timer_id tid, int para
m_tx_shift >>= 1;
m_tx_bits--;
- if( m_fn_handler != NULL )
+ if( type() == PSX_SIO0 )
{
- if( type() == PSX_SIO0 )
- {
- m_tx &= ~PSX_SIO_OUT_CLOCK;
- (*m_fn_handler)( machine(), m_tx );
- m_tx |= PSX_SIO_OUT_CLOCK;
- }
-
- (*m_fn_handler)( machine(), m_tx );
+ m_tx &= ~PSX_SIO_OUT_CLOCK;
+ output( m_tx, PSX_SIO_OUT_CLOCK | PSX_SIO_OUT_DATA );
+ m_tx |= PSX_SIO_OUT_CLOCK;
}
+ output( m_tx, PSX_SIO_OUT_CLOCK | PSX_SIO_OUT_DATA );
+
if( m_tx_bits == 0 &&
( m_control & SIO_CONTROL_TX_IENA ) != 0 )
{
@@ -259,13 +279,7 @@ WRITE32_MEMBER( psxsio_device::write )
m_tx &= ~PSX_SIO_OUT_DTR;
}
- if( ( ( m_tx ^ m_tx_prev ) & PSX_SIO_OUT_DTR ) != 0 )
- {
- if( m_fn_handler != NULL )
- {
- (*m_fn_handler)( machine(), m_tx );
- }
- }
+ output( m_tx, PSX_SIO_OUT_DTR );
m_tx_prev = m_tx;
@@ -341,10 +355,20 @@ READ32_MEMBER( psxsio_device::read )
return data;
}
-void psxsio_device::input( int n_mask, int n_data )
+void psxsio_device::input_update()
{
- verboselog( machine(), 1, "psx_sio_input( %s, %02x, %02x )\n", tag(), n_mask, n_data );
- m_rx = ( m_rx & ~n_mask ) | ( n_data & n_mask );
+ int data = 0;
+
+ for( int i = 0; i < deviceCount; i++ )
+ {
+ data |= devices[ i ]->m_dataout;
+ }
+
+ 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 )
{
diff --git a/src/emu/cpu/psx/sio.h b/src/emu/cpu/psx/sio.h
index 4d4267718d4..fc1d45632a3 100644
--- a/src/emu/cpu/psx/sio.h
+++ b/src/emu/cpu/psx/sio.h
@@ -11,23 +11,14 @@
#define __PSXSIO_H__
#include "emu.h"
+#include "siodev.h"
extern const device_type PSX_SIO0;
extern const device_type PSX_SIO1;
-typedef void ( *psx_sio_handler )( running_machine &, int );
-
#define MCFG_PSX_SIO_IRQ_HANDLER(_devcb) \
devcb = &psxsio_device::set_irq_handler(*device, DEVCB2_##_devcb); \
-#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 )
-
#define SIO_BUF_SIZE ( 8 )
#define SIO_STATUS_TX_RDY ( 1 << 0 )
@@ -53,12 +44,10 @@ public:
// static configuration helpers
template<class _Object> static devcb2_base &set_irq_handler(device_t &device, _Object object) { return downcast<psxsio_device &>(device).m_irq_handler.set_callback(object); }
- void install_handler( psx_sio_handler p_f_sio_handler );
-
DECLARE_WRITE32_MEMBER( write );
DECLARE_READ32_MEMBER( read );
- void input( int n_mask, int n_data );
+ void input_update();
protected:
// device-level overrides
@@ -67,6 +56,7 @@ protected:
virtual void device_post_load();
private:
+ void output( int data, int mask );
void sio_interrupt();
void sio_timer_adjust();
@@ -86,9 +76,14 @@ private:
UINT32 m_rx_bits;
emu_timer *m_timer;
- psx_sio_handler m_fn_handler;
devcb2_write_line m_irq_handler;
+
+ psxsiodev_device *devices[ 10 ];
+ int deviceCount;
+
+ int m_outputdata;
+ int m_inputdata;
};
class psxsio0_device : public psxsio_device
diff --git a/src/emu/cpu/psx/siodev.c b/src/emu/cpu/psx/siodev.c
new file mode 100644
index 00000000000..6faad6b2ba9
--- /dev/null
+++ b/src/emu/cpu/psx/siodev.c
@@ -0,0 +1,19 @@
+#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) :
+ device_t(mconfig, type, name, tag, owner, clock)
+{
+}
+
+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
new file mode 100644
index 00000000000..51ea53e076c
--- /dev/null
+++ b/src/emu/cpu/psx/siodev.h
@@ -0,0 +1,39 @@
+#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);
+
+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 eb25523aaed..33a9adfe643 100644
--- a/src/mame/drivers/ksys573.c
+++ b/src/mame/drivers/ksys573.c
@@ -444,6 +444,7 @@ G: gun mania only, drives air soft gun (this game uses real BB bullet)
#include "sound/cdda.h"
#include "sound/mas3507d.h"
#include "cdrom.h"
+#include "machine/k573cass.h"
#define VERBOSE_LEVEL ( 0 )
@@ -1390,7 +1391,6 @@ static void update_mode( running_machine &machine )
DRIVER_INIT_MEMBER(ksys573_state,konami573)
{
-
psx_driver_init(machine());
atapi_init(machine());
@@ -1401,13 +1401,6 @@ DRIVER_INIT_MEMBER(ksys573_state,konami573)
MACHINE_RESET_MEMBER(ksys573_state,konami573)
{
-
- if( machine().device<device_secure_serial_flash>("install_eeprom") )
- {
- /* security cart */
- psx_sio_input( machine(), 1, PSX_SIO_IN_DSR, PSX_SIO_IN_DSR );
- }
-
m_flash_bank = -1;
update_mode(machine());
@@ -3146,37 +3139,45 @@ MACHINE_CONFIG_END
// Up to two carts can be used
static MACHINE_CONFIG_DERIVED( konami573x, konami573 )
+ MCFG_DEVICE_ADD("maincpu:sio1:k573cass", KONAMI573CASSETTE, 0)
MCFG_X76F041_ADD( "install_eeprom" )
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( konami573y, konami573 )
+ MCFG_DEVICE_ADD("maincpu:sio1:k573cass", KONAMI573CASSETTE, 0)
MCFG_X76F100_ADD( "install_eeprom" )
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( konami573yi, konami573 )
+ MCFG_DEVICE_ADD("maincpu:sio1:k573cass", KONAMI573CASSETTE, 0)
MCFG_X76F100_ADD( "install_eeprom" )
MCFG_DS2401_ADD( "install_id" )
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( konami573zi, konami573 )
+ MCFG_DEVICE_ADD("maincpu:sio1:k573cass", KONAMI573CASSETTE, 0)
MCFG_ZS01_ADD( "install_eeprom", "install_id" )
MCFG_DS2401_ADD( "install_id" )
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( k573baitx, k573bait )
+ MCFG_DEVICE_ADD("maincpu:sio1:k573cass", KONAMI573CASSETTE, 0)
MCFG_X76F041_ADD( "install_eeprom" )
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( k573dx, k573d )
+ MCFG_DEVICE_ADD("maincpu:sio1:k573cass", KONAMI573CASSETTE, 0)
MCFG_X76F041_ADD( "install_eeprom" )
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( k573dxi, k573d )
+ MCFG_DEVICE_ADD("maincpu:sio1:k573cass", KONAMI573CASSETTE, 0)
MCFG_X76F041_ADD( "install_eeprom" )
MCFG_DS2401_ADD( "install_id" )
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( k573dxzi, k573d )
+ MCFG_DEVICE_ADD("maincpu:sio1:k573cass", KONAMI573CASSETTE, 0)
MCFG_X76F041_ADD( "install_eeprom" )
MCFG_DS2401_ADD( "install_id" )
MCFG_ZS01_ADD( "game_eeprom", "game_id" )
@@ -3184,11 +3185,13 @@ static MACHINE_CONFIG_DERIVED( k573dxzi, k573d )
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( k573dyi, k573d )
+ MCFG_DEVICE_ADD("maincpu:sio1:k573cass", KONAMI573CASSETTE, 0)
MCFG_X76F100_ADD( "install_eeprom" )
MCFG_DS2401_ADD( "install_id" )
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( k573dyyi, k573d )
+ MCFG_DEVICE_ADD("maincpu:sio1:k573cass", KONAMI573CASSETTE, 0)
MCFG_X76F100_ADD( "install_eeprom" )
MCFG_DS2401_ADD( "install_id" )
MCFG_X76F100_ADD( "game_eeprom" )
@@ -3196,25 +3199,30 @@ static MACHINE_CONFIG_DERIVED( k573dyyi, k573d )
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( k573dzi, k573d )
+ MCFG_DEVICE_ADD("maincpu:sio1:k573cass", KONAMI573CASSETTE, 0)
MCFG_ZS01_ADD( "install_eeprom", "install_id" )
MCFG_DS2401_ADD( "install_id" )
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( pccard1x, pccard1 )
+ MCFG_DEVICE_ADD("maincpu:sio1:k573cass", KONAMI573CASSETTE, 0)
MCFG_X76F041_ADD( "install_eeprom" )
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( pccard1xi, pccard1 )
+ MCFG_DEVICE_ADD("maincpu:sio1:k573cass", KONAMI573CASSETTE, 0)
MCFG_X76F041_ADD( "install_eeprom" )
MCFG_DS2401_ADD( "install_id" )
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( pccard1yi, pccard1 )
+ MCFG_DEVICE_ADD("maincpu:sio1:k573cass", KONAMI573CASSETTE, 0)
MCFG_X76F100_ADD( "install_eeprom" )
MCFG_DS2401_ADD( "install_id" )
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( pccard1dxzi, pccard1d )
+ MCFG_DEVICE_ADD("maincpu:sio1:k573cass", KONAMI573CASSETTE, 0)
MCFG_X76F041_ADD( "install_eeprom" )
MCFG_DS2401_ADD( "install_id" )
MCFG_ZS01_ADD( "game_eeprom", "game_id" )
@@ -3222,11 +3230,13 @@ static MACHINE_CONFIG_DERIVED( pccard1dxzi, pccard1d )
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( pccard1dzi, pccard1d )
+ MCFG_DEVICE_ADD("maincpu:sio1:k573cass", KONAMI573CASSETTE, 0)
MCFG_ZS01_ADD( "install_eeprom", "install_id" )
MCFG_DS2401_ADD( "install_id" )
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( pccard2yyi, pccard2 )
+ MCFG_DEVICE_ADD("maincpu:sio1:k573cass", KONAMI573CASSETTE, 0)
MCFG_X76F100_ADD( "install_eeprom" )
MCFG_DS2401_ADD( "install_id" )
MCFG_X76F100_ADD( "game_eeprom" )
@@ -3234,6 +3244,7 @@ static MACHINE_CONFIG_DERIVED( pccard2yyi, pccard2 )
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( pccard2dxzi, pccard2d )
+ MCFG_DEVICE_ADD("maincpu:sio1:k573cass", KONAMI573CASSETTE, 0)
MCFG_X76F041_ADD( "install_eeprom" )
MCFG_DS2401_ADD( "install_id" )
MCFG_ZS01_ADD( "game_eeprom", "game_id" )
@@ -3241,6 +3252,7 @@ static MACHINE_CONFIG_DERIVED( pccard2dxzi, pccard2d )
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( pccard2dyyi, pccard2d )
+ MCFG_DEVICE_ADD("maincpu:sio1:k573cass", KONAMI573CASSETTE, 0)
MCFG_X76F100_ADD( "install_eeprom" )
MCFG_DS2401_ADD( "install_id" )
MCFG_X76F100_ADD( "game_eeprom" )
@@ -3248,6 +3260,7 @@ static MACHINE_CONFIG_DERIVED( pccard2dyyi, pccard2d )
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( pccard2dzi, pccard2d )
+ MCFG_DEVICE_ADD("maincpu:sio1:k573cass", KONAMI573CASSETTE, 0)
MCFG_ZS01_ADD( "install_eeprom", "install_id" )
MCFG_DS2401_ADD( "install_id" )
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/taitogn.c b/src/mame/drivers/taitogn.c
index 9ae88418f2c..34ce1cc83f9 100644
--- a/src/mame/drivers/taitogn.c
+++ b/src/mame/drivers/taitogn.c
@@ -324,6 +324,7 @@ Type 3 (PCMCIA Compact Flash Adaptor + Compact Flash card, sealed together with
#include "machine/at28c16.h"
#include "machine/intelfsh.h"
#include "machine/znsec.h"
+#include "machine/zndip.h"
#include "machine/idectrl.h"
#include "machine/mb3773.h"
#include "sound/spu.h"
@@ -334,13 +335,15 @@ class taitogn_state : public psx_state
public:
taitogn_state(const machine_config &mconfig, device_type type, const char *tag) :
psx_state(mconfig, type, tag),
- m_znsec0(*this,"znsec0"),
- m_znsec1(*this,"znsec1")
+ m_znsec0(*this,"maincpu:sio0:znsec0"),
+ m_znsec1(*this,"maincpu:sio0:znsec1"),
+ m_zndip(*this,"maincpu:sio0:zndip")
{
}
required_device<znsec_device> m_znsec0;
required_device<znsec_device> m_znsec1;
+ required_device<zndip_device> m_zndip;
intel_te28f160_device *m_biosflash;
intel_e28f400_device *m_pgmflash;
@@ -357,10 +360,6 @@ public:
int m_v;
UINT32 m_n_znsecsel;
- UINT32 m_b_znsecport;
- int m_n_dip_bit;
- int m_b_lastclock;
- emu_timer *m_dip_timer;
UINT32 m_coin_info;
UINT32 m_mux_data;
@@ -395,7 +394,6 @@ public:
DECLARE_DRIVER_INIT(coh3002t_mp);
DECLARE_DRIVER_INIT(coh3002t);
DECLARE_MACHINE_RESET(coh3002t);
- TIMER_CALLBACK_MEMBER(dip_timer_fired);
};
@@ -692,123 +690,15 @@ READ32_MEMBER(taitogn_state::znsecsel_r)
return m_n_znsecsel;
}
-static void sio_znsec0_handler( running_machine &machine, int n_data )
-{
- taitogn_state *state = machine.driver_data<taitogn_state>();
-
- if( ( n_data & PSX_SIO_OUT_CLOCK ) == 0 )
- {
- if( state->m_b_lastclock )
- psx_sio_input( machine, 0, PSX_SIO_IN_DATA, ( state->m_znsec0->step( ( n_data & PSX_SIO_OUT_DATA ) != 0 ) != 0 ) * PSX_SIO_IN_DATA );
-
- state->m_b_lastclock = 0;
- }
- else
- {
- state->m_b_lastclock = 1;
- }
-}
-
-static void sio_znsec1_handler( running_machine &machine, int n_data )
-{
- taitogn_state *state = machine.driver_data<taitogn_state>();
-
- if( ( n_data & PSX_SIO_OUT_CLOCK ) == 0 )
- {
- if( state->m_b_lastclock )
- psx_sio_input( machine, 0, PSX_SIO_IN_DATA, ( state->m_znsec1->step( ( n_data & PSX_SIO_OUT_DATA ) != 0 ) != 0 ) * PSX_SIO_IN_DATA );
-
- state->m_b_lastclock = 0;
- }
- else
- {
- state->m_b_lastclock = 1;
- }
-}
-
-static void sio_pad_handler( running_machine &machine, int n_data )
-{
- taitogn_state *state = machine.driver_data<taitogn_state>();
-
- if( ( n_data & PSX_SIO_OUT_DTR ) != 0 )
- {
- state->m_b_znsecport = 1;
- }
- else
- {
- state->m_b_znsecport = 0;
- }
-
- psx_sio_input( machine, 0, PSX_SIO_IN_DATA | PSX_SIO_IN_DSR, PSX_SIO_IN_DATA | PSX_SIO_IN_DSR );
-}
-
-static void sio_dip_handler( running_machine &machine, int n_data )
-{
- taitogn_state *state = machine.driver_data<taitogn_state>();
-
- if( ( n_data & PSX_SIO_OUT_CLOCK ) == 0 )
- {
- if( state->m_b_lastclock )
- {
- int bit = ( ( state->ioport("DSW")->read() >> state->m_n_dip_bit ) & 1 );
- psx_sio_input( machine, 0, PSX_SIO_IN_DATA, bit * PSX_SIO_IN_DATA );
- state->m_n_dip_bit++;
- state->m_n_dip_bit &= 7;
- }
- state->m_b_lastclock = 0;
- }
- else
- {
- state->m_b_lastclock = 1;
- }
-}
-
WRITE32_MEMBER(taitogn_state::znsecsel_w)
{
COMBINE_DATA( &m_n_znsecsel );
m_znsec0->select( ( m_n_znsecsel >> 2 ) & 1 );
m_znsec1->select( ( m_n_znsecsel >> 3 ) & 1 );
-
- if( ( m_n_znsecsel & 0x80 ) == 0 )
- {
- psx_sio_install_handler( machine(), 0, sio_pad_handler );
- psx_sio_input( machine(), 0, PSX_SIO_IN_DSR, 0 );
- }
- else if( ( m_n_znsecsel & 0x08 ) == 0 )
- {
- psx_sio_install_handler( machine(), 0, sio_znsec1_handler );
- psx_sio_input( machine(), 0, PSX_SIO_IN_DSR, 0 );
- }
- else if( ( m_n_znsecsel & 0x04 ) == 0 )
- {
- psx_sio_install_handler( machine(), 0, sio_znsec0_handler );
- psx_sio_input( machine(), 0, PSX_SIO_IN_DSR, 0 );
- }
- else
- {
- m_n_dip_bit = 0;
- m_b_lastclock = 1;
-
- psx_sio_install_handler( machine(), 0, sio_dip_handler );
- psx_sio_input( machine(), 0, PSX_SIO_IN_DSR, 0 );
-
- m_dip_timer->adjust( downcast<cpu_device *>(&space.device())->cycles_to_attotime( 100 ), 1 );
- }
+ m_zndip->select( ( m_n_znsecsel & 0x8c ) != 0x8c );
}
-TIMER_CALLBACK_MEMBER(taitogn_state::dip_timer_fired)
-{
-
- psx_sio_input( machine(), 0, PSX_SIO_IN_DSR, param * PSX_SIO_IN_DSR );
-
- if( param )
- {
- m_dip_timer->adjust(machine().device<cpu_device>("maincpu")->cycles_to_attotime(50));
- }
-}
-
-
READ32_MEMBER(taitogn_state::boardconfig_r)
{
/*
@@ -881,8 +771,6 @@ DRIVER_INIT_MEMBER(taitogn_state,coh3002t)
psx_driver_init(machine());
m_znsec0->init(tt10);
m_znsec1->init(tt16);
- psx_sio_install_handler(machine(), 0, sio_pad_handler);
- m_dip_timer = machine().scheduler().timer_alloc( timer_expired_delegate(FUNC(taitogn_state::dip_timer_fired),this), NULL );
UINT32 metalength;
memset(m_cis, 0xff, 512);
@@ -898,8 +786,6 @@ DRIVER_INIT_MEMBER(taitogn_state,coh3002t_mp)
MACHINE_RESET_MEMBER(taitogn_state,coh3002t)
{
-
- m_b_lastclock = 1;
m_locked = 0x1ff;
install_handlers(machine(), 0);
m_control = 0;
@@ -951,8 +837,10 @@ static MACHINE_CONFIG_START( coh3002t, taitogn_state )
MCFG_CPU_ADD( "maincpu", CXD8661R, XTAL_100MHz )
MCFG_CPU_PROGRAM_MAP(taitogn_map)
- MCFG_DEVICE_ADD("znsec0", ZNSEC, 0)
- MCFG_DEVICE_ADD("znsec1", ZNSEC, 0)
+ MCFG_DEVICE_ADD("maincpu:sio0:znsec0", ZNSEC, 0)
+ MCFG_DEVICE_ADD("maincpu:sio0:znsec1", ZNSEC, 0)
+ MCFG_DEVICE_ADD("maincpu:sio0:zndip", ZNDIP, 0)
+ MCFG_ZNDIP_DATA_HANDLER(IOPORT(":DSW"))
/* video hardware */
MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8654Q, 0x200000, XTAL_53_693175MHz )
diff --git a/src/mame/drivers/zn.c b/src/mame/drivers/zn.c
index 19e53ac01f5..277d57803f4 100644
--- a/src/mame/drivers/zn.c
+++ b/src/mame/drivers/zn.c
@@ -18,6 +18,7 @@
#include "machine/nvram.h"
#include "machine/mb3773.h"
#include "machine/znsec.h"
+#include "machine/zndip.h"
#include "machine/idectrl.h"
#include "audio/taitosnd.h"
#include "sound/2610intf.h"
@@ -35,19 +36,17 @@ public:
zn_state(const machine_config &mconfig, device_type type, const char *tag) :
psx_state(mconfig, type, tag),
m_gpu(*this, "gpu"),
- m_znsec0(*this,"znsec0"),
- m_znsec1(*this,"znsec1")
+ m_znsec0(*this,"maincpu:sio0:znsec0"),
+ m_znsec1(*this,"maincpu:sio0:znsec1"),
+ m_zndip(*this,"maincpu:sio0:zndip")
{
}
required_device<psxgpu_device> m_gpu;
required_device<znsec_device> m_znsec0;
required_device<znsec_device> m_znsec1;
+ required_device<zndip_device> m_zndip;
UINT32 m_n_znsecsel;
- UINT32 m_b_znsecport;
- int m_n_dip_bit;
- int m_b_lastclock;
- emu_timer *m_dip_timer;
size_t m_taitofx1_eeprom_size1;
UINT8 *m_taitofx1_eeprom1;
@@ -126,7 +125,6 @@ public:
DECLARE_MACHINE_RESET(coh1002v);
DECLARE_MACHINE_RESET(coh1002m);
INTERRUPT_GEN_MEMBER(qsound_interrupt);
- TIMER_CALLBACK_MEMBER(dip_timer_fired);
};
INLINE void ATTR_PRINTF(3,4) verboselog( running_machine &machine, int n_level, const char *s_fmt, ... )
@@ -319,129 +317,17 @@ READ32_MEMBER(zn_state::znsecsel_r)
return m_n_znsecsel;
}
-static void sio_znsec0_handler( running_machine &machine, int n_data )
-{
- zn_state *state = machine.driver_data<zn_state>();
-
- if( ( n_data & PSX_SIO_OUT_CLOCK ) == 0 )
- {
- if( state->m_b_lastclock )
- {
- psx_sio_input( machine, 0, PSX_SIO_IN_DATA, ( state->m_znsec0->step( ( n_data & PSX_SIO_OUT_DATA ) != 0 ) != 0 ) * PSX_SIO_IN_DATA );
- }
-
- state->m_b_lastclock = 0;
- }
- else
- {
- state->m_b_lastclock = 1;
- }
-}
-
-static void sio_znsec1_handler( running_machine &machine, int n_data )
-{
- zn_state *state = machine.driver_data<zn_state>();
-
- if( ( n_data & PSX_SIO_OUT_CLOCK ) == 0 )
- {
- if( state->m_b_lastclock )
- {
- psx_sio_input( machine, 0, PSX_SIO_IN_DATA, ( state->m_znsec1->step( ( n_data & PSX_SIO_OUT_DATA ) != 0 ) != 0 ) * PSX_SIO_IN_DATA );
- }
-
- state->m_b_lastclock = 0;
- }
- else
- {
- state->m_b_lastclock = 1;
- }
-}
-
-static void sio_pad_handler( running_machine &machine, int n_data )
-{
- zn_state *state = machine.driver_data<zn_state>();
-
- if( ( n_data & PSX_SIO_OUT_DTR ) != 0 )
- {
- state->m_b_znsecport = 1;
- }
- else
- {
- state->m_b_znsecport = 0;
- }
-
- verboselog( machine, 2, "read pad %04x %04x %02x\n", state->m_n_znsecsel, state->m_b_znsecport, n_data );
- psx_sio_input( machine, 0, PSX_SIO_IN_DATA | PSX_SIO_IN_DSR, PSX_SIO_IN_DATA | PSX_SIO_IN_DSR );
-}
-
-static void sio_dip_handler( running_machine &machine, int n_data )
-{
- zn_state *state = machine.driver_data<zn_state>();
-
- if( ( n_data & PSX_SIO_OUT_CLOCK ) == 0 )
- {
- if( state->m_b_lastclock )
- {
- int bit = ( ( state->ioport("DSW")->read() >> state->m_n_dip_bit ) & 1 );
- verboselog( machine, 2, "read dip %02x -> %02x\n", n_data, bit * PSX_SIO_IN_DATA );
- psx_sio_input( machine, 0, PSX_SIO_IN_DATA, bit * PSX_SIO_IN_DATA );
- state->m_n_dip_bit++;
- state->m_n_dip_bit &= 7;
- }
- state->m_b_lastclock = 0;
- }
- else
- {
- state->m_b_lastclock = 1;
- }
-}
-
WRITE32_MEMBER(zn_state::znsecsel_w)
{
COMBINE_DATA( &m_n_znsecsel );
m_znsec0->select( ( m_n_znsecsel >> 2 ) & 1 );
m_znsec1->select( ( m_n_znsecsel >> 3 ) & 1 );
-
- if( ( m_n_znsecsel & 0x80 ) == 0 )
- {
- psx_sio_install_handler( machine(), 0, sio_pad_handler );
- psx_sio_input( machine(), 0, PSX_SIO_IN_DSR, 0 );
- }
- else if( ( m_n_znsecsel & 0x08 ) == 0 )
- {
- psx_sio_install_handler( machine(), 0, sio_znsec1_handler );
- psx_sio_input( machine(), 0, PSX_SIO_IN_DSR, 0 );
- }
- else if( ( m_n_znsecsel & 0x04 ) == 0 )
- {
- psx_sio_install_handler( machine(), 0, sio_znsec0_handler );
- psx_sio_input( machine(), 0, PSX_SIO_IN_DSR, 0 );
- }
- else
- {
- m_n_dip_bit = 0;
- m_b_lastclock = 1;
-
- psx_sio_install_handler( machine(), 0, sio_dip_handler );
- psx_sio_input( machine(), 0, PSX_SIO_IN_DSR, 0 );
-
- m_dip_timer->adjust( downcast<cpu_device *>(&space.device())->cycles_to_attotime( 100 ), 1 );
- }
+ m_zndip->select( ( m_n_znsecsel & 0x8c ) != 0x8c );
verboselog( machine(), 2, "znsecsel_w( %08x, %08x, %08x )\n", offset, data, mem_mask );
}
-TIMER_CALLBACK_MEMBER(zn_state::dip_timer_fired)
-{
- psx_sio_input( machine(), 0, PSX_SIO_IN_DSR, param * PSX_SIO_IN_DSR );
-
- if( param )
- {
- m_dip_timer->adjust( machine().device<cpu_device>( "maincpu" )->cycles_to_attotime(50 ) );
- }
-}
-
READ32_MEMBER(zn_state::boardconfig_r)
{
/*
@@ -536,21 +422,11 @@ static void zn_driver_init( running_machine &machine )
{
state->m_znsec0->init( zn_config_table[ n_game ].p_n_mainsec );
state->m_znsec1->init( zn_config_table[ n_game ].p_n_gamesec );
- psx_sio_install_handler( machine, 0, sio_pad_handler );
+// psx_sio_install_handler( machine, 0, sio_pad_handler );
break;
}
n_game++;
}
-
- state->m_dip_timer = machine.scheduler().timer_alloc( timer_expired_delegate(FUNC(zn_state::dip_timer_fired),state), NULL );
-}
-
-static void zn_machine_init( running_machine &machine )
-{
- zn_state *state = machine.driver_data<zn_state>();
-
- state->m_n_dip_bit = 0;
- state->m_b_lastclock = 1;
}
static MACHINE_CONFIG_START( zn1_1mb_vram, zn_state )
@@ -558,8 +434,10 @@ static MACHINE_CONFIG_START( zn1_1mb_vram, zn_state )
MCFG_CPU_ADD( "maincpu", CXD8530CQ, XTAL_67_7376MHz )
MCFG_CPU_PROGRAM_MAP( zn_map)
- MCFG_DEVICE_ADD("znsec0", ZNSEC, 0)
- MCFG_DEVICE_ADD("znsec1", ZNSEC, 0)
+ MCFG_DEVICE_ADD("maincpu:sio0:znsec0", ZNSEC, 0)
+ MCFG_DEVICE_ADD("maincpu:sio0:znsec1", ZNSEC, 0)
+ MCFG_DEVICE_ADD("maincpu:sio0:zndip", ZNDIP, 0)
+ MCFG_ZNDIP_DATA_HANDLER(IOPORT(":DSW"))
/* video hardware */
MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8561Q, 0x100000, XTAL_53_693175MHz )
@@ -583,8 +461,10 @@ static MACHINE_CONFIG_START( zn2, zn_state )
MCFG_CPU_ADD( "maincpu", CXD8661R, XTAL_100MHz )
MCFG_CPU_PROGRAM_MAP( zn_map)
- MCFG_DEVICE_ADD("znsec0", ZNSEC, 0)
- MCFG_DEVICE_ADD("znsec1", ZNSEC, 0)
+ MCFG_DEVICE_ADD("maincpu:sio0:znsec0", ZNSEC, 0)
+ MCFG_DEVICE_ADD("maincpu:sio0:znsec1", ZNSEC, 0)
+ MCFG_DEVICE_ADD("maincpu:sio0:zndip", ZNDIP, 0)
+ MCFG_ZNDIP_DATA_HANDLER(IOPORT(":DSW"))
/* video hardware */
MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8654Q, 0x200000, XTAL_53_693175MHz )
@@ -767,7 +647,6 @@ MACHINE_RESET_MEMBER(zn_state,coh1000c)
machine().root_device().membank( "bank1" )->set_base( machine().root_device().memregion( "user2" )->base() ); /* fixed game rom */
machine().root_device().membank( "bank2" )->set_base( machine().root_device().memregion( "user2" )->base() + 0x400000 ); /* banked game rom */
machine().root_device().membank( "bank3" )->set_base( machine().root_device().memregion( "user3" )->base() ); /* country rom */
- zn_machine_init(machine());
}
static ADDRESS_MAP_START( qsound_map, AS_PROGRAM, 8, zn_state )
@@ -975,7 +854,6 @@ MACHINE_RESET_MEMBER(zn_state,coh3002c)
machine().root_device().membank( "bank1" )->set_base( machine().root_device().memregion( "user2" )->base() ); /* fixed game rom */
machine().root_device().membank( "bank2" )->set_base( machine().root_device().memregion( "user2" )->base() + 0x400000 ); /* banked game rom */
machine().root_device().membank( "bank3" )->set_base( machine().root_device().memregion( "user3" )->base() ); /* country rom */
- zn_machine_init(machine());
}
static MACHINE_CONFIG_DERIVED( coh3002c, zn2 )
@@ -1260,7 +1138,6 @@ MACHINE_RESET_MEMBER(zn_state,coh1000ta)
{
membank( "bank1" )->set_base( memregion( "user2" )->base() ); /* banked game rom */
membank( "bank2" )->set_base( m_taitofx1_eeprom1 );
- zn_machine_init(machine());
}
static ADDRESS_MAP_START( fx1a_sound_map, AS_PROGRAM, 8, zn_state )
@@ -1350,11 +1227,9 @@ DRIVER_INIT_MEMBER(zn_state,coh1000tb)
MACHINE_RESET_MEMBER(zn_state,coh1000tb)
{
-
membank( "bank1" )->set_base( memregion( "user2" )->base() ); /* banked game rom */
membank( "bank2" )->set_base( m_taitofx1_eeprom1 );
membank( "bank3" )->set_base( m_taitofx1_eeprom2 );
- zn_machine_init(machine());
}
static MACHINE_CONFIG_DERIVED( coh1000tb, zn1_2mb_vram )
@@ -1530,7 +1405,6 @@ DRIVER_INIT_MEMBER(zn_state,coh1000w)
MACHINE_RESET_MEMBER(zn_state,coh1000w)
{
machine().root_device().membank( "bank1" )->set_base( machine().root_device().memregion( "user2" )->base() ); /* fixed game rom */
- zn_machine_init(machine());
machine().device("ide")->reset();
}
@@ -1718,7 +1592,6 @@ DRIVER_INIT_MEMBER(zn_state,coh1002e)
MACHINE_RESET_MEMBER(zn_state,coh1002e)
{
machine().root_device().membank( "bank1" )->set_base( machine().root_device().memregion( "user2" )->base() ); /* banked game rom */
- zn_machine_init(machine());
}
static ADDRESS_MAP_START( psarc_snd_map, AS_PROGRAM, 16, zn_state )
@@ -1862,8 +1735,6 @@ MACHINE_RESET_MEMBER(zn_state,bam2)
{
machine().root_device().membank( "bank1" )->set_base( machine().root_device().memregion( "user2" )->base() ); /* fixed game rom */
machine().root_device().membank( "bank2" )->set_base( machine().root_device().memregion( "user2" )->base() + 0x400000 ); /* banked game rom */
-
- zn_machine_init(machine());
}
static MACHINE_CONFIG_DERIVED( bam2, zn1_2mb_vram )
@@ -2190,7 +2061,6 @@ DRIVER_INIT_MEMBER(zn_state,coh1000a)
MACHINE_RESET_MEMBER(zn_state,coh1000a)
{
machine().root_device().membank( "bank1" )->set_base( machine().root_device().memregion( "user2" )->base() ); /* fixed game rom */
- zn_machine_init(machine());
if( ( !strcmp( machine().system().name, "jdredd" ) ) ||
( !strcmp( machine().system().name, "jdreddb" ) ) )
{
@@ -2346,7 +2216,6 @@ DRIVER_INIT_MEMBER(zn_state,coh1001l)
MACHINE_RESET_MEMBER(zn_state,coh1001l)
{
machine().root_device().membank( "bank1" )->set_base( machine().root_device().memregion( "user2" )->base() ); /* banked rom */
- zn_machine_init(machine());
}
static MACHINE_CONFIG_DERIVED( coh1001l, zn1_2mb_vram )
@@ -2390,7 +2259,6 @@ MACHINE_RESET_MEMBER(zn_state,coh1002v)
{
machine().root_device().membank( "bank1" )->set_base( machine().root_device().memregion( "user2" )->base() ); /* fixed game rom */
machine().root_device().membank( "bank2" )->set_base( machine().root_device().memregion( "user3" )->base() ); /* banked rom */
- zn_machine_init(machine());
}
static MACHINE_CONFIG_DERIVED( coh1002v, zn1_2mb_vram )
@@ -2592,7 +2460,6 @@ DRIVER_INIT_MEMBER(zn_state,coh1002m)
MACHINE_RESET_MEMBER(zn_state,coh1002m)
{
machine().root_device().membank( "bank1" )->set_base( machine().root_device().memregion( "user2" )->base() );
- zn_machine_init(machine());
}
READ8_MEMBER(zn_state::cbaj_z80_latch_r)
diff --git a/src/mame/includes/psx.h b/src/mame/includes/psx.h
index 431463ca5ec..e199f63efa0 100644
--- a/src/mame/includes/psx.h
+++ b/src/mame/includes/psx.h
@@ -27,8 +27,6 @@ public:
extern void psx_driver_init( running_machine &machine );
DECLARE_WRITE32_HANDLER( psx_com_delay_w );
DECLARE_READ32_HANDLER( psx_com_delay_r );
-extern void psx_sio_install_handler( running_machine &, int, psx_sio_handler );
-extern void psx_sio_input( running_machine &, int, int, int );
#define PSX_H ( 1 )
#endif
diff --git a/src/mame/machine/k573cass.c b/src/mame/machine/k573cass.c
new file mode 100644
index 00000000000..ea686db64a6
--- /dev/null
+++ b/src/mame/machine/k573cass.c
@@ -0,0 +1,19 @@
+#include "k573cass.h"
+
+const device_type KONAMI573CASSETTE = &device_creator<konami573cassette_device>;
+
+konami573cassette_device::konami573cassette_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ psxsiodev_device(mconfig, KONAMI573CASSETTE, "KONAMI 573 CASSETTE", tag, owner, clock)
+{
+}
+
+void konami573cassette_device::device_start()
+{
+ psxsiodev_device::device_start();
+
+ data_out( PSX_SIO_IN_DSR, PSX_SIO_IN_DSR );
+}
+
+void konami573cassette_device::data_in( int data, int mask )
+{
+}
diff --git a/src/mame/machine/k573cass.h b/src/mame/machine/k573cass.h
new file mode 100644
index 00000000000..e85f7bb2c23
--- /dev/null
+++ b/src/mame/machine/k573cass.h
@@ -0,0 +1,22 @@
+#pragma once
+
+#ifndef __K573CASS_H__
+#define __K573CASS_H__
+
+#include "cpu/psx/siodev.h"
+
+extern const device_type KONAMI573CASSETTE;
+
+class konami573cassette_device : public psxsiodev_device
+{
+public:
+ konami573cassette_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+protected:
+ void device_start();
+
+private:
+ virtual void data_in( int data, int mask );
+};
+
+#endif
diff --git a/src/mame/machine/psx.c b/src/mame/machine/psx.c
index 96880d7e51b..2bb3d12aae7 100644
--- a/src/mame/machine/psx.c
+++ b/src/mame/machine/psx.c
@@ -48,15 +48,3 @@ READ32_HANDLER( psx_com_delay_r )
verboselog( p_psx, 1, "psx_com_delay_r( %08x )\n", mem_mask );
return p_psx->n_com_delay;
}
-
-/* SIO */
-
-void psx_sio_install_handler( running_machine &machine, int n_port, psx_sio_handler p_f_sio_handler )
-{
- psxcpu_device::install_sio_handler( *machine.device("maincpu^"), "maincpu", n_port, p_f_sio_handler );
-}
-
-void psx_sio_input( running_machine &machine, int n_port, int n_mask, int n_data )
-{
- psxcpu_device::sio_input( *machine.device("maincpu^"), "maincpu", n_port, n_mask, n_data );
-}
diff --git a/src/mame/machine/zndip.c b/src/mame/machine/zndip.c
new file mode 100644
index 00000000000..e3623f0def2
--- /dev/null
+++ b/src/mame/machine/zndip.c
@@ -0,0 +1,59 @@
+#include "zndip.h"
+
+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),
+ m_data_handler(*this)
+{
+}
+
+void zndip_device::device_start()
+{
+ psxsiodev_device::device_start();
+
+ m_data_handler.resolve_safe( 0 );
+
+ m_dip_timer = timer_alloc( 0 );
+}
+
+void zndip_device::select(int select)
+{
+ if (m_select != select)
+ {
+ 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;
+ }
+}
+
+void zndip_device::data_in( int data, int mask )
+{
+ if( !m_select && ( mask & PSX_SIO_OUT_CLOCK ) != 0 && ( data & PSX_SIO_OUT_CLOCK ) == 0)
+ {
+ 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_bit++;
+ m_bit &= 7;
+ }
+}
+
+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 );
+
+ if( param )
+ {
+ m_dip_timer->adjust( attotime::from_usec( 50 ), 0 );
+ }
+}
diff --git a/src/mame/machine/zndip.h b/src/mame/machine/zndip.h
new file mode 100644
index 00000000000..790f127b286
--- /dev/null
+++ b/src/mame/machine/zndip.h
@@ -0,0 +1,37 @@
+#pragma once
+
+#ifndef __ZNDIP_H__
+#define __ZNDIP_H__
+
+#include "cpu/psx/siodev.h"
+
+extern const device_type ZNDIP;
+
+#define MCFG_ZNDIP_DATA_HANDLER(_devcb) \
+ devcb = &zndip_device::set_data_handler(*device, DEVCB2_##_devcb); \
+
+class zndip_device : public psxsiodev_device
+{
+public:
+ zndip_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ // static configuration helpers
+ template<class _Object> static devcb2_base &set_data_handler(device_t &device, _Object object) { return downcast<zndip_device &>(device).m_data_handler.set_callback(object); }
+
+ void select(int select);
+
+protected:
+ 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 );
+
+ devcb2_read8 m_data_handler;
+
+ int m_select;
+ UINT8 m_bit;
+ emu_timer *m_dip_timer;
+};
+
+#endif
diff --git a/src/mame/machine/znsec.c b/src/mame/machine/znsec.c
index 965bf7d55e6..17cd04c02ec 100644
--- a/src/mame/machine/znsec.c
+++ b/src/mame/machine/znsec.c
@@ -87,12 +87,14 @@
const device_type ZNSEC = &device_creator<znsec_device>;
znsec_device::znsec_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
- device_t(mconfig, ZNSEC, "ZNSEC", tag, owner, clock)
+ psxsiodev_device(mconfig, ZNSEC, "ZNSEC", tag, owner, clock)
{
}
void znsec_device::device_start()
{
+ psxsiodev_device::device_start();
+
save_item(NAME(m_select));
save_item(NAME(m_state));
save_item(NAME(m_bit));
@@ -159,32 +161,41 @@ void znsec_device::init(const UINT8 *transform)
void znsec_device::select(int select)
{
- if (m_select && !select)
+ if (m_select != select)
{
- m_state = 0xfc;
- m_bit = 0;
- }
+ if (!select)
+ {
+ m_state = 0xfc;
+ m_bit = 0;
+ }
+ else
+ {
+ data_out(0, PSX_SIO_IN_DATA);
+ }
- m_select = select;
+ m_select = select;
+ }
}
-UINT8 znsec_device::step(UINT8 input)
+void znsec_device::data_in( int data, int mask )
{
- UINT8 res;
static const UINT8 initial_sbox[8] = { 0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x7f };
- if (m_bit==0)
+ if ( !m_select && (mask & PSX_SIO_OUT_CLOCK) != 0 && (data & PSX_SIO_OUT_CLOCK) == 0)
{
- // Apply the initial sbox
- apply_sbox(initial_sbox);
- }
+ if (m_bit==0)
+ {
+ // Apply the initial sbox
+ apply_sbox(initial_sbox);
+ }
+
+ // Compute the output and change the state
+ data_out(((m_state >> m_bit) & 1) != 0 ? PSX_SIO_IN_DATA : 0, PSX_SIO_IN_DATA);
- // Compute the output and change the state
- res = (m_state >> m_bit) & 1;
- if((input & 1)==0)
- apply_bit_sbox(m_bit);
+ if((data & PSX_SIO_OUT_DATA)==0)
+ apply_bit_sbox(m_bit);
- m_bit++;
- m_bit&=7;
- return res;
+ m_bit++;
+ m_bit&=7;
+ }
}
diff --git a/src/mame/machine/znsec.h b/src/mame/machine/znsec.h
index 4a781a5a63f..b2ff99bf345 100644
--- a/src/mame/machine/znsec.h
+++ b/src/mame/machine/znsec.h
@@ -5,23 +5,24 @@
#ifndef __ZNSEC_H__
#define __ZNSEC_H__
-#include "emu.h"
+#include "cpu/psx/siodev.h"
extern const device_type ZNSEC;
-class znsec_device : public device_t
+class znsec_device : public psxsiodev_device
{
public:
znsec_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
void init(const UINT8 *transform);
void select(int select);
- UINT8 step(UINT8 input);
protected:
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);
diff --git a/src/mame/mame.mak b/src/mame/mame.mak
index f2aae180ba7..27559e2a688 100644
--- a/src/mame/mame.mak
+++ b/src/mame/mame.mak
@@ -920,7 +920,7 @@ $(MAMEOBJ)/konami.a: \
$(DRIVERS)/konamim2.o \
$(DRIVERS)/kontest.o \
$(DRIVERS)/konendev.o \
- $(DRIVERS)/ksys573.o $(MACHINE)/zs01.o \
+ $(DRIVERS)/ksys573.o $(MACHINE)/k573cass.o $(MACHINE)/zs01.o \
$(DRIVERS)/labyrunr.o $(VIDEO)/labyrunr.o \
$(DRIVERS)/lethal.o $(VIDEO)/lethal.o \
$(DRIVERS)/mainevt.o $(VIDEO)/mainevt.o \
@@ -1366,7 +1366,7 @@ $(MAMEOBJ)/snk.a: \
$(DRIVERS)/snk68.o $(VIDEO)/snk68.o \
$(MAMEOBJ)/sony.a: \
- $(DRIVERS)/zn.o $(MACHINE)/znsec.o \
+ $(DRIVERS)/zn.o $(MACHINE)/zndip.o $(MACHINE)/znsec.o \
$(MACHINE)/psx.o
$(MAMEOBJ)/stern.a: \
diff --git a/src/mess/drivers/psx.c b/src/mess/drivers/psx.c
index c36ce3784b8..ed6b8d6f16b 100644
--- a/src/mess/drivers/psx.c
+++ b/src/mess/drivers/psx.c
@@ -18,18 +18,7 @@
#include "zlib.h"
#include "machine/psxcd.h"
#include "machine/psxcard.h"
-
-struct pad_t
-{
- UINT8 n_shiftin;
- UINT8 n_shiftout;
- int n_bits;
- int n_state;
- int n_byte;
- int b_lastclock;
- int b_ack;
-};
-
+#include "machine/psxcport.h"
class psx1_state : public psx_state
{
@@ -39,7 +28,6 @@ public:
UINT8 *m_exe_buffer;
int m_exe_size;
- pad_t m_pad[ 2 ];
int m_cd_param_p;
int m_cd_result_p;
int m_cd_result_c;
@@ -55,7 +43,6 @@ public:
DECLARE_DIRECT_UPDATE_MEMBER(psx_setopbase);
DECLARE_DRIVER_INIT(psx);
DECLARE_MACHINE_RESET(psx);
- TIMER_CALLBACK_MEMBER(psx_pad_ack);
};
@@ -476,191 +463,6 @@ static QUICKLOAD_LOAD( psx_exe_load )
return IMAGE_INIT_PASS;
}
-/* PAD emulation */
-
-#define PAD_STATE_IDLE ( 0 )
-#define PAD_STATE_LISTEN ( 1 )
-#define PAD_STATE_ACTIVE ( 2 )
-#define PAD_STATE_READ ( 3 )
-#define PAD_STATE_UNLISTEN ( 4 )
-#define PAD_STATE_MEMCARD ( 5 )
-
-#define PAD_TYPE_STANDARD ( 4 )
-#define PAD_BYTES_STANDARD ( 2 )
-
-#define PAD_CMD_START ( 0x01 )
-#define PAD_CMD_READ ( 0x42 ) /* B */
-
-#define PAD_DATA_OK ( 0x5a ) /* Z */
-#define PAD_DATA_IDLE ( 0xff )
-
-TIMER_CALLBACK_MEMBER(psx1_state::psx_pad_ack)
-{
- int n_port = param;
- pad_t *pad = &m_pad[ n_port ];
-
- if( pad->n_state != PAD_STATE_IDLE )
- {
- psx_sio_input( machine(), 0, PSX_SIO_IN_DSR, pad->b_ack * PSX_SIO_IN_DSR );
- if( !pad->b_ack )
- {
- pad->b_ack = 1;
- machine().scheduler().timer_set(attotime::from_usec( 2 ), timer_expired_delegate(FUNC(psx1_state::psx_pad_ack),this) , n_port);
- }
- }
-}
-
-static void psx_pad( running_machine &machine, int n_port, int n_data )
-{
- psx1_state *state = machine.driver_data<psx1_state>();
- pad_t *pad = &state->m_pad[ n_port ];
- int b_sel;
- int b_clock;
- int b_data;
- int b_ack;
- int b_ready;
- static const char *const portnames[] = { "IN0", "IN1", "IN2", "IN3" };
- psxcard_device *psxcard = NULL;
-
- if (n_port == 0)
- {
- psxcard = machine.device<psxcard_device>("card1");
- }
- else
- {
- psxcard = machine.device<psxcard_device>("card2");
- }
-
- b_sel = ( n_data & PSX_SIO_OUT_DTR ) / PSX_SIO_OUT_DTR;
- b_clock = ( n_data & PSX_SIO_OUT_CLOCK ) / PSX_SIO_OUT_CLOCK;
- b_data = ( n_data & PSX_SIO_OUT_DATA ) / PSX_SIO_OUT_DATA;
- b_ready = 0;
- b_ack = 0;
-
- if( b_sel )
- {
- pad->n_state = PAD_STATE_IDLE;
- }
-
- switch( pad->n_state )
- {
- case PAD_STATE_LISTEN:
- case PAD_STATE_ACTIVE:
- case PAD_STATE_READ:
- case PAD_STATE_MEMCARD:
- if( pad->b_lastclock && !b_clock )
- {
- psx_sio_input( machine, 0, PSX_SIO_IN_DATA, ( pad->n_shiftout & 1 ) * PSX_SIO_IN_DATA );
- pad->n_shiftout >>= 1;
- }
- if( !pad->b_lastclock && b_clock )
- {
- pad->n_shiftin >>= 1;
- pad->n_shiftin |= b_data << 7;
- pad->n_bits++;
-
- if( pad->n_bits == 8 )
- {
- pad->n_bits = 0;
- b_ready = 1;
- }
- }
- break;
- }
-
- pad->b_lastclock = b_clock;
-
- switch( pad->n_state )
- {
- case PAD_STATE_IDLE:
- if( !b_sel )
- {
- pad->n_state = PAD_STATE_LISTEN;
- pad->n_shiftout = PAD_DATA_IDLE;
- pad->n_bits = 0;
- }
- break;
- case PAD_STATE_LISTEN:
- if( b_ready )
- {
- if( pad->n_shiftin == PAD_CMD_START )
- {
- pad->n_state = PAD_STATE_ACTIVE;
- pad->n_shiftout = ( PAD_TYPE_STANDARD << 4 ) | ( PAD_BYTES_STANDARD >> 1 );
- b_ack = 1;
- }
- else if( psxcard->transfer(pad->n_shiftin, &pad->n_shiftout) )
- {
- pad->n_state = PAD_STATE_MEMCARD;
- b_ack = 1;
- }
- else
- {
- pad->n_state = PAD_STATE_UNLISTEN;
- }
- }
- break;
- case PAD_STATE_MEMCARD:
- if( b_ready )
- {
- if( psxcard->transfer(pad->n_shiftin, &pad->n_shiftout) )
- {
- b_ack = 1;
- }
- else
- {
- b_ack = 0;
- pad->n_state = PAD_STATE_IDLE;
- }
- }
- break;
- case PAD_STATE_ACTIVE:
- if( b_ready )
- {
- if( pad->n_shiftin == PAD_CMD_READ )
- {
- pad->n_state = PAD_STATE_READ;
- pad->n_shiftout = PAD_DATA_OK;
- pad->n_byte = 0;
- b_ack = 1;
- }
- else
- {
- pad->n_state = PAD_STATE_UNLISTEN;
- }
- }
- break;
- case PAD_STATE_READ:
- if( b_ready )
- {
- if( pad->n_byte < PAD_BYTES_STANDARD )
- {
- pad->n_shiftout = machine.root_device().ioport(portnames[pad->n_byte + ( n_port * PAD_BYTES_STANDARD )])->read();
- pad->n_byte++;
- b_ack = 1;
- }
- else
- {
- pad->n_state = PAD_STATE_LISTEN;
- }
- }
- break;
- }
-
- if( b_ack )
- {
- pad->b_ack = 0;
- machine.scheduler().timer_set(attotime::from_usec( 10 ), timer_expired_delegate(FUNC(psx1_state::psx_pad_ack),state), n_port);
- }
-}
-
-static void psx_sio0( running_machine &machine, int n_data )
-{
- /* todo: raise data & ack when nothing is driving it low */
- psx_pad( machine, 0, n_data );
- psx_pad( machine, 1, n_data ^ PSX_SIO_OUT_DTR );
-}
-
/* ----------------------------------------------------------------------- */
static void cd_dma_read( psxcd_device *psxcd, UINT32 n_address, INT32 n_size )
@@ -701,12 +503,6 @@ static ADDRESS_MAP_START( psx_map, AS_PROGRAM, 32, psx1_state )
AM_RANGE(0xfffe0130, 0xfffe0133) AM_WRITENOP
ADDRESS_MAP_END
-
-MACHINE_RESET_MEMBER(psx1_state,psx)
-{
- psx_sio_install_handler( machine(), 0, psx_sio0 );
-}
-
DRIVER_INIT_MEMBER(psx1_state,psx)
{
psx_driver_init(machine());
@@ -765,7 +561,7 @@ static MACHINE_CONFIG_START( psxntsc, psx1_state )
MCFG_CPU_ADD( "maincpu", CXD8530CQ, XTAL_67_7376MHz )
MCFG_CPU_PROGRAM_MAP( psx_map )
- MCFG_MACHINE_RESET_OVERRIDE(psx1_state, psx )
+ MCFG_DEVICE_ADD("maincpu:sio0:controllers", PSXCONTROLLERPORTS, 0)
/* video hardware */
MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8561Q, 0x100000, XTAL_53_693175MHz )
@@ -796,8 +592,6 @@ static MACHINE_CONFIG_START( psxpal, psx1_state )
MCFG_CPU_ADD( "maincpu", CXD8530AQ, XTAL_67_7376MHz )
MCFG_CPU_PROGRAM_MAP( psx_map)
- MCFG_MACHINE_RESET_OVERRIDE(psx1_state, psx )
-
/* video hardware */
/* TODO: visible area and refresh rate */
MCFG_PSXGPU_ADD( "maincpu", "gpu", CXD8561Q, 0x100000, XTAL_53_693175MHz )
diff --git a/src/mess/machine/psxcport.c b/src/mess/machine/psxcport.c
new file mode 100644
index 00000000000..482e44ea58f
--- /dev/null
+++ b/src/mess/machine/psxcport.c
@@ -0,0 +1,201 @@
+/* PAD emulation */
+
+#include "psxcport.h"
+#include "machine/psxcard.h"
+
+#define PAD_STATE_IDLE ( 0 )
+#define PAD_STATE_LISTEN ( 1 )
+#define PAD_STATE_ACTIVE ( 2 )
+#define PAD_STATE_READ ( 3 )
+#define PAD_STATE_UNLISTEN ( 4 )
+#define PAD_STATE_MEMCARD ( 5 )
+
+#define PAD_TYPE_STANDARD ( 4 )
+#define PAD_BYTES_STANDARD ( 2 )
+
+#define PAD_CMD_START ( 0x01 )
+#define PAD_CMD_READ ( 0x42 ) /* B */
+
+#define PAD_DATA_OK ( 0x5a ) /* Z */
+#define PAD_DATA_IDLE ( 0xff )
+
+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)
+{
+}
+
+void psxcontrollerports_device::device_start()
+{
+ psxsiodev_device::device_start();
+
+ m_ack_timer = timer_alloc( 0 );
+}
+
+void psxcontrollerports_device::device_timer(emu_timer &timer, device_timer_id tid, int param, void *ptr)
+{
+ int n_port = param;
+ pad_t *pad = &m_pad[ n_port ];
+
+ if( pad->n_state != PAD_STATE_IDLE )
+ {
+ data_out( pad->b_ack * PSX_SIO_IN_DSR, PSX_SIO_IN_DSR );
+
+ if( !pad->b_ack )
+ {
+ pad->b_ack = 1;
+ m_ack_timer->adjust( attotime::from_usec( 2 ), n_port );
+ }
+ }
+}
+
+void psxcontrollerports_device::psx_pad( int n_port, int n_data )
+{
+ pad_t *pad = &m_pad[ n_port ];
+ int b_sel;
+ int b_clock;
+ int b_data;
+ int b_ack;
+ int b_ready;
+ static const char *const portnames[] = { ":IN0", ":IN1", ":IN2", ":IN3" };
+ psxcard_device *psxcard = NULL;
+
+ if (n_port == 0)
+ {
+ psxcard = machine().device<psxcard_device>(":card1");
+ }
+ else
+ {
+ psxcard = machine().device<psxcard_device>(":card2");
+ }
+
+ b_sel = ( n_data & PSX_SIO_OUT_DTR ) / PSX_SIO_OUT_DTR;
+ b_clock = ( n_data & PSX_SIO_OUT_CLOCK ) / PSX_SIO_OUT_CLOCK;
+ b_data = ( n_data & PSX_SIO_OUT_DATA ) / PSX_SIO_OUT_DATA;
+ b_ready = 0;
+ b_ack = 0;
+
+ if( b_sel )
+ {
+ pad->n_state = PAD_STATE_IDLE;
+ }
+
+ switch( pad->n_state )
+ {
+ case PAD_STATE_LISTEN:
+ case PAD_STATE_ACTIVE:
+ case PAD_STATE_READ:
+ case PAD_STATE_MEMCARD:
+ if( pad->b_lastclock && !b_clock )
+ {
+ data_out( ( pad->n_shiftout & 1 ) * PSX_SIO_IN_DATA, PSX_SIO_IN_DATA );
+ pad->n_shiftout >>= 1;
+ }
+ if( !pad->b_lastclock && b_clock )
+ {
+ pad->n_shiftin >>= 1;
+ pad->n_shiftin |= b_data << 7;
+ pad->n_bits++;
+
+ if( pad->n_bits == 8 )
+ {
+ pad->n_bits = 0;
+ b_ready = 1;
+ }
+ }
+ break;
+ }
+
+ pad->b_lastclock = b_clock;
+
+ switch( pad->n_state )
+ {
+ case PAD_STATE_IDLE:
+ if( !b_sel )
+ {
+ pad->n_state = PAD_STATE_LISTEN;
+ pad->n_shiftout = PAD_DATA_IDLE;
+ pad->n_bits = 0;
+ }
+ break;
+ case PAD_STATE_LISTEN:
+ if( b_ready )
+ {
+ if( pad->n_shiftin == PAD_CMD_START )
+ {
+ pad->n_state = PAD_STATE_ACTIVE;
+ pad->n_shiftout = ( PAD_TYPE_STANDARD << 4 ) | ( PAD_BYTES_STANDARD >> 1 );
+ b_ack = 1;
+ }
+ else if( psxcard->transfer(pad->n_shiftin, &pad->n_shiftout) )
+ {
+ pad->n_state = PAD_STATE_MEMCARD;
+ b_ack = 1;
+ }
+ else
+ {
+ pad->n_state = PAD_STATE_UNLISTEN;
+ }
+ }
+ break;
+ case PAD_STATE_MEMCARD:
+ if( b_ready )
+ {
+ if( psxcard->transfer(pad->n_shiftin, &pad->n_shiftout) )
+ {
+ b_ack = 1;
+ }
+ else
+ {
+ b_ack = 0;
+ pad->n_state = PAD_STATE_IDLE;
+ }
+ }
+ break;
+ case PAD_STATE_ACTIVE:
+ if( b_ready )
+ {
+ if( pad->n_shiftin == PAD_CMD_READ )
+ {
+ pad->n_state = PAD_STATE_READ;
+ pad->n_shiftout = PAD_DATA_OK;
+ pad->n_byte = 0;
+ b_ack = 1;
+ }
+ else
+ {
+ pad->n_state = PAD_STATE_UNLISTEN;
+ }
+ }
+ break;
+ case PAD_STATE_READ:
+ if( b_ready )
+ {
+ if( pad->n_byte < PAD_BYTES_STANDARD )
+ {
+ pad->n_shiftout = ioport(portnames[pad->n_byte + ( n_port * PAD_BYTES_STANDARD )])->read();
+ pad->n_byte++;
+ b_ack = 1;
+ }
+ else
+ {
+ pad->n_state = PAD_STATE_LISTEN;
+ }
+ }
+ break;
+ }
+
+ if( b_ack )
+ {
+ pad->b_ack = 0;
+ m_ack_timer->adjust( attotime::from_usec( 10 ), n_port );
+ }
+}
+
+void psxcontrollerports_device::data_in( int data, int mask )
+{
+ /* todo: raise data & ack when nothing is driving it low */
+ psx_pad( 0, data );
+ psx_pad( 1, data ^ PSX_SIO_OUT_DTR );
+}
diff --git a/src/mess/machine/psxcport.h b/src/mess/machine/psxcport.h
new file mode 100644
index 00000000000..7ed4330f638
--- /dev/null
+++ b/src/mess/machine/psxcport.h
@@ -0,0 +1,38 @@
+#pragma once
+
+#ifndef __PSXCPORT_H__
+#define __PSXCPORT_H__
+
+#include "cpu/psx/siodev.h"
+
+extern const device_type PSXCONTROLLERPORTS;
+
+struct pad_t
+{
+ UINT8 n_shiftin;
+ UINT8 n_shiftout;
+ int n_bits;
+ int n_state;
+ int n_byte;
+ int b_lastclock;
+ int b_ack;
+};
+
+class psxcontrollerports_device : public psxsiodev_device
+{
+public:
+ psxcontrollerports_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+protected:
+ void device_start();
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
+
+private:
+ void psx_pad( int n_port, int n_data );
+ virtual void data_in( int data, int mask );
+
+ pad_t m_pad[ 2 ];
+ emu_timer *m_ack_timer;
+};
+
+#endif
diff --git a/src/mess/mess.mak b/src/mess/mess.mak
index 2837e1b0e27..a9d38031296 100644
--- a/src/mess/mess.mak
+++ b/src/mess/mess.mak
@@ -1668,6 +1668,7 @@ $(MESSOBJ)/snk.a: \
$(MESSOBJ)/sony.a: \
$(MESS_DRIVERS)/psx.o \
+ $(MESS_MACHINE)/psxcport.o \
$(MESS_MACHINE)/psxcd.o \
$(MESS_MACHINE)/psxcddrv.o \
$(MESS_MACHINE)/psxcard.o \