mirror of
https://github.com/holub/mame
synced 2025-07-10 12:15:31 +03:00
replaced usage of psx_sio_install_handler & psx_sio_input with devices. [smf]
This commit is contained in:
parent
94c95380f4
commit
129b6d8b89
8
.gitattributes
vendored
8
.gitattributes
vendored
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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 );
|
||||
|
@ -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);
|
||||
|
@ -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 )
|
||||
{
|
||||
|
@ -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
|
||||
|
19
src/emu/cpu/psx/siodev.c
Normal file
19
src/emu/cpu/psx/siodev.c
Normal file
@ -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();
|
||||
}
|
39
src/emu/cpu/psx/siodev.h
Normal file
39
src/emu/cpu/psx/siodev.h
Normal file
@ -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
|
@ -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
|
||||
|
@ -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 )
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
19
src/mame/machine/k573cass.c
Normal file
19
src/mame/machine/k573cass.c
Normal file
@ -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 )
|
||||
{
|
||||
}
|
22
src/mame/machine/k573cass.h
Normal file
22
src/mame/machine/k573cass.h
Normal file
@ -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
|
@ -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 );
|
||||
}
|
||||
|
59
src/mame/machine/zndip.c
Normal file
59
src/mame/machine/zndip.c
Normal file
@ -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 );
|
||||
}
|
||||
}
|
37
src/mame/machine/zndip.h
Normal file
37
src/mame/machine/zndip.h
Normal file
@ -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
|
@ -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);
|
||||
|
||||
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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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: \
|
||||
|
@ -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 )
|
||||
|
201
src/mess/machine/psxcport.c
Normal file
201
src/mess/machine/psxcport.c
Normal file
@ -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 );
|
||||
}
|
38
src/mess/machine/psxcport.h
Normal file
38
src/mess/machine/psxcport.h
Normal file
@ -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
|
@ -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 \
|
||||
|
Loading…
Reference in New Issue
Block a user