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( 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("sio0"); - break; - case 1: - sio = getcpu( device, cputag )->subdevice("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("sio0"); - break; - case 1: - sio = getcpu( device, cputag )->subdevice("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(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 static devcb2_base &set_irq_handler(device_t &device, _Object object) { return downcast(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("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 m_znsec0; required_device m_znsec1; + required_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(); - - 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(); - - 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(); - - 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(); - - 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(&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("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 m_gpu; required_device m_znsec0; required_device m_znsec1; + required_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(); - - 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(); - - 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(); - - 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(); - - 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(&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( "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(); - - 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(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(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 static devcb2_base &set_data_handler(device_t &device, _Object object) { return downcast(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(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); + + if((data & PSX_SIO_OUT_DATA)==0) + apply_bit_sbox(m_bit); + + m_bit++; + m_bit&=7; } - - // Compute the output and change the state - res = (m_state >> m_bit) & 1; - if((input & 1)==0) - apply_bit_sbox(m_bit); - - m_bit++; - m_bit&=7; - return res; } 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(); - 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("card1"); - } - else - { - psxcard = machine.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(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(":card1"); + } + else + { + psxcard = machine().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 \