replaced usage of psx_sio_install_handler & psx_sio_input with devices. [smf]

This commit is contained in:
smf- 2012-11-10 18:53:00 +00:00
parent 94c95380f4
commit 129b6d8b89
24 changed files with 587 additions and 605 deletions

8
.gitattributes vendored
View File

@ -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

View File

@ -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

View File

@ -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 );

View File

@ -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);

View File

@ -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 )
{

View File

@ -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
View 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
View 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

View File

@ -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

View File

@ -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 )

View File

@ -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)

View File

@ -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

View 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 )
{
}

View 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

View File

@ -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
View 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
View 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

View File

@ -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;
}

View File

@ -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);

View File

@ -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: \

View File

@ -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
View 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 );
}

View 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

View File

@ -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 \