Converted the Konami System 573 Security Cassettes to use slots. The current setting is no longer saved, so the default cassette is "game". Some games have additional I/O connected via the security cassette, which is now hooked up when the cassette is loaded instead of patched directly into the memory map. If the game has a separate "install" cassette then you need to select this and hard reset (shift+F3 or select reset from the slot menu) before it will let you install from the CD. [smf]

This commit is contained in:
smf- 2013-05-30 15:17:43 +00:00
parent 9910ce0ecc
commit fd4a360e4d
5 changed files with 1254 additions and 460 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,19 +1,517 @@
/*
* Konami 573 Security Cassette
*
*/
#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, "konami573", __FILE__)
WRITE_LINE_MEMBER(konami573_cassette_interface::write_line_d0)
{
}
void konami573cassette_device::device_start()
WRITE_LINE_MEMBER(konami573_cassette_interface::write_line_d4)
{
}
WRITE_LINE_MEMBER(konami573_cassette_interface::write_line_d5)
{
}
WRITE_LINE_MEMBER(konami573_cassette_interface::write_line_d6)
{
}
WRITE_LINE_MEMBER(konami573_cassette_interface::write_line_d7)
{
}
WRITE_LINE_MEMBER(konami573_cassette_interface::write_line_zs01_sda)
{
}
READ_LINE_MEMBER(konami573_cassette_interface::read_line_dsr)
{
return 1;
}
READ_LINE_MEMBER(konami573_cassette_interface::read_line_ds2401)
{
return 0;
}
READ_LINE_MEMBER(konami573_cassette_interface::read_line_adc083x_do)
{
return 0;
}
READ_LINE_MEMBER(konami573_cassette_interface::read_line_adc083x_sars)
{
return 0;
}
const device_type KONAMI573_CASSETTE_X = &device_creator<konami573_cassette_x_device>;
konami573_cassette_x_device::konami573_cassette_x_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, KONAMI573_CASSETTE_X, "KONAMI 573 CASSETTE X", tag, owner, clock, "sys573", __FILE__),
device_slot_card_interface(mconfig, *this),
m_x76f041(*this, "eeprom")
{
}
konami573_cassette_x_device::konami573_cassette_x_device(const machine_config &mconfig, const device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) :
device_t(mconfig, type, name, tag, owner, clock, shortname, __FILE__),
device_slot_card_interface(mconfig, *this),
m_x76f041(*this, "eeprom")
{
}
static MACHINE_CONFIG_FRAGMENT( cassx )
MCFG_X76F041_ADD( "eeprom" )
MACHINE_CONFIG_END
machine_config_constructor konami573_cassette_x_device::device_mconfig_additions() const
{
return MACHINE_CONFIG_NAME( cassx );
}
void konami573_cassette_x_device::device_start()
{
}
WRITE_LINE_MEMBER(konami573_cassette_x_device::write_line_d0)
{
m_x76f041->sda_w( state );
}
WRITE_LINE_MEMBER(konami573_cassette_x_device::write_line_d1)
{
m_x76f041->scl_w( state );
}
WRITE_LINE_MEMBER(konami573_cassette_x_device::write_line_d2)
{
m_x76f041->cs_w( state );
}
WRITE_LINE_MEMBER(konami573_cassette_x_device::write_line_d3)
{
m_x76f041->rst_w( state );
}
READ_LINE_MEMBER(konami573_cassette_x_device::read_line_secflash_sda)
{
return m_x76f041->sda_r();
}
const device_type KONAMI573_CASSETTE_XI = &device_creator<konami573_cassette_xi_device>;
konami573_cassette_xi_device::konami573_cassette_xi_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
konami573_cassette_x_device(mconfig, KONAMI573_CASSETTE_XI, "KONAMI 573 CASSETTE XI", tag, owner, clock, "sys573", __FILE__),
m_ds2401(*this, "id"),
m_adc0838(*this, "adc0838")
{
}
static MACHINE_CONFIG_FRAGMENT( cassxi )
MCFG_X76F041_ADD( "eeprom" )
MCFG_DS2401_ADD( "id" )
MCFG_DEVICE_ADD( "adc0838", ADC0838, 0 )
MACHINE_CONFIG_END
machine_config_constructor konami573_cassette_xi_device::device_mconfig_additions() const
{
return MACHINE_CONFIG_NAME( cassxi );
}
WRITE_LINE_MEMBER(konami573_cassette_xi_device::write_line_d0)
{
konami573_cassette_x_device::write_line_d0( state ); // shares line with x76f041 sda
m_adc0838->cs_write( state );
}
WRITE_LINE_MEMBER(konami573_cassette_xi_device::write_line_d1)
{
konami573_cassette_x_device::write_line_d1( state ); // shares line with x76f041 scl
m_adc0838->clk_write( state );
}
WRITE_LINE_MEMBER(konami573_cassette_xi_device::write_line_d4)
{
m_ds2401->write( !state );
}
WRITE_LINE_MEMBER(konami573_cassette_xi_device::write_line_d5)
{
m_adc0838->di_write( state );
}
READ_LINE_MEMBER(konami573_cassette_xi_device::read_line_ds2401)
{
return m_ds2401->read();
}
READ_LINE_MEMBER(konami573_cassette_xi_device::read_line_adc083x_do)
{
return m_adc0838->do_read();
}
READ_LINE_MEMBER(konami573_cassette_xi_device::read_line_adc083x_sars)
{
return m_adc0838->sars_read();
}
const device_type KONAMI573_CASSETTE_Y = &device_creator<konami573_cassette_y_device>;
konami573_cassette_y_device::konami573_cassette_y_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, KONAMI573_CASSETTE_Y, "KONAMI 573 CASSETTE Y", tag, owner, clock, "sys573", __FILE__),
device_slot_card_interface(mconfig, *this),
m_x76f100(*this, "eeprom"),
m_d0_handler(*this),
m_d1_handler(*this),
m_d2_handler(*this),
m_d3_handler(*this),
m_d4_handler(*this),
m_d5_handler(*this),
m_d6_handler(*this),
m_d7_handler(*this)
{
}
konami573_cassette_y_device::konami573_cassette_y_device(const machine_config &mconfig, const device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) :
device_t(mconfig, type, name, tag, owner, clock, shortname, __FILE__),
device_slot_card_interface(mconfig, *this),
m_x76f100(*this, "eeprom"),
m_d0_handler(*this),
m_d1_handler(*this),
m_d2_handler(*this),
m_d3_handler(*this),
m_d4_handler(*this),
m_d5_handler(*this),
m_d6_handler(*this),
m_d7_handler(*this)
{
}
static MACHINE_CONFIG_FRAGMENT( cassy )
MCFG_X76F100_ADD( "eeprom" )
MACHINE_CONFIG_END
machine_config_constructor konami573_cassette_y_device::device_mconfig_additions() const
{
return MACHINE_CONFIG_NAME( cassy );
}
void konami573_cassette_y_device::device_start()
{
m_d0_handler.resolve_safe();
m_d1_handler.resolve_safe();
m_d2_handler.resolve_safe();
m_d3_handler.resolve_safe();
m_d4_handler.resolve_safe();
m_d5_handler.resolve_safe();
m_d6_handler.resolve_safe();
m_d7_handler.resolve_safe();
}
READ_LINE_MEMBER(konami573_cassette_y_device::read_line_secflash_sda)
{
return m_x76f100->sda_r();
}
WRITE_LINE_MEMBER(konami573_cassette_y_device::write_line_d0)
{
m_d0_handler( state );
m_x76f100->sda_w( state );
}
WRITE_LINE_MEMBER(konami573_cassette_y_device::write_line_d1)
{
m_d1_handler( state );
m_x76f100->scl_w( state );
}
WRITE_LINE_MEMBER(konami573_cassette_y_device::write_line_d2)
{
m_d2_handler( state );
m_x76f100->cs_w( state );
}
WRITE_LINE_MEMBER(konami573_cassette_y_device::write_line_d3)
{
m_d3_handler( state );
m_x76f100->rst_w( state );
}
WRITE_LINE_MEMBER(konami573_cassette_y_device::write_line_d4)
{
m_d4_handler( state );
}
WRITE_LINE_MEMBER(konami573_cassette_y_device::write_line_d5)
{
m_d5_handler( state );
}
WRITE_LINE_MEMBER(konami573_cassette_y_device::write_line_d6)
{
m_d6_handler( state );
}
WRITE_LINE_MEMBER(konami573_cassette_y_device::write_line_d7)
{
m_d7_handler( state );
}
const device_type KONAMI573_CASSETTE_YI = &device_creator<konami573_cassette_yi_device>;
konami573_cassette_yi_device::konami573_cassette_yi_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
konami573_cassette_y_device(mconfig, KONAMI573_CASSETTE_YI, "KONAMI 573 CASSETTE YI", tag, owner, clock, "sys573", __FILE__),
m_ds2401(*this, "id")
{
}
static MACHINE_CONFIG_FRAGMENT( cassyi )
MCFG_X76F100_ADD( "eeprom" )
MCFG_DS2401_ADD( "id" )
MACHINE_CONFIG_END
machine_config_constructor konami573_cassette_yi_device::device_mconfig_additions() const
{
return MACHINE_CONFIG_NAME( cassyi );
}
WRITE_LINE_MEMBER(konami573_cassette_yi_device::write_line_d4)
{
konami573_cassette_y_device::write_line_d4( state );
m_ds2401->write( !state );
}
READ_LINE_MEMBER(konami573_cassette_yi_device::read_line_ds2401)
{
return m_ds2401->read();
}
const device_type KONAMI573_CASSETTE_ZI = &device_creator<konami573_cassette_zi_device>;
konami573_cassette_zi_device::konami573_cassette_zi_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, KONAMI573_CASSETTE_ZI, "KONAMI 573 CASSETTE ZI", tag, owner, clock, "sys573", __FILE__),
device_slot_card_interface(mconfig, *this),
m_zs01(*this,"eeprom"),
m_ds2401(*this, "id")
{
}
static MACHINE_CONFIG_FRAGMENT( casszi )
MCFG_ZS01_ADD( "eeprom", "id" )
MCFG_DS2401_ADD( "id" )
MACHINE_CONFIG_END
machine_config_constructor konami573_cassette_zi_device::device_mconfig_additions() const
{
return MACHINE_CONFIG_NAME( casszi );
}
void konami573_cassette_zi_device::device_start()
{
}
WRITE_LINE_MEMBER(konami573_cassette_zi_device::write_line_d1)
{
m_zs01->scl_w( state );
}
WRITE_LINE_MEMBER(konami573_cassette_zi_device::write_line_d2)
{
m_zs01->cs_w( state );
}
WRITE_LINE_MEMBER(konami573_cassette_zi_device::write_line_d3)
{
m_zs01->rst_w( state );
}
WRITE_LINE_MEMBER(konami573_cassette_zi_device::write_line_d4)
{
m_ds2401->write( !state );
}
WRITE_LINE_MEMBER(konami573_cassette_zi_device::write_line_zs01_sda)
{
m_zs01->sda_w( state );
}
READ_LINE_MEMBER(konami573_cassette_zi_device::read_line_ds2401)
{
return m_ds2401->read();
}
READ_LINE_MEMBER(konami573_cassette_zi_device::read_line_secflash_sda)
{
return m_zs01->sda_r();
}
const device_type KONAMI573_CASSETTE_SLOT_SERIAL = &device_creator<konami573_cassette_slot_serial_device>;
konami573_cassette_slot_serial_device::konami573_cassette_slot_serial_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
psxsiodev_device(mconfig, KONAMI573_CASSETTE_SLOT, "KONAMI 573 CASSETTE SLOT (SERIAL)", tag, owner, clock, "sys573", __FILE__)
{
}
void konami573_cassette_slot_serial_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 )
void konami573_cassette_slot_serial_device::_data_out( int data, int mask )
{
data_out( data, mask );
}
void konami573_cassette_slot_serial_device::data_in( int data, int mask )
{
}
const device_type KONAMI573_CASSETTE_SLOT = &device_creator<konami573_cassette_slot_device>;
konami573_cassette_slot_device::konami573_cassette_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, KONAMI573_CASSETTE_SLOT, "KONAMI 573 CASSETTE SLOT", tag, owner, clock, "sys573", __FILE__),
device_slot_interface(mconfig, *this),
m_serial(*this, ":maincpu:sio1:cassette") /// HACK: this shouldn't know where the actual slot is.
{
}
void konami573_cassette_slot_device::device_start()
{
m_cassette = dynamic_cast<konami573_cassette_interface *>(get_card_device());
if( m_cassette != NULL && m_cassette->read_line_dsr() )
{
m_serial->_data_out( PSX_SIO_IN_DSR, PSX_SIO_IN_DSR );
}
else
{
m_serial->_data_out( PSX_SIO_IN_DSR, 0 );
}
}
WRITE_LINE_MEMBER(konami573_cassette_slot_device::write_line_d0)
{
if( m_cassette )
{
m_cassette->write_line_d0( state );
}
}
WRITE_LINE_MEMBER(konami573_cassette_slot_device::write_line_d1)
{
if( m_cassette )
{
m_cassette->write_line_d1( state );
}
}
WRITE_LINE_MEMBER(konami573_cassette_slot_device::write_line_d2)
{
if( m_cassette )
{
m_cassette->write_line_d2( state );
}
}
WRITE_LINE_MEMBER(konami573_cassette_slot_device::write_line_d3)
{
if( m_cassette )
{
m_cassette->write_line_d3( state );
}
}
WRITE_LINE_MEMBER(konami573_cassette_slot_device::write_line_d4)
{
if( m_cassette )
{
m_cassette->write_line_d4( state );
}
}
WRITE_LINE_MEMBER(konami573_cassette_slot_device::write_line_d5)
{
if( m_cassette )
{
m_cassette->write_line_d5( state );
}
}
WRITE_LINE_MEMBER(konami573_cassette_slot_device::write_line_d6)
{
if( m_cassette )
{
m_cassette->write_line_d6( state );
}
}
WRITE_LINE_MEMBER(konami573_cassette_slot_device::write_line_d7)
{
if( m_cassette )
{
m_cassette->write_line_d7( state );
}
}
WRITE_LINE_MEMBER(konami573_cassette_slot_device::write_line_zs01_sda)
{
if( m_cassette )
{
m_cassette->write_line_zs01_sda( state );
}
}
READ_LINE_MEMBER(konami573_cassette_slot_device::read_line_ds2401)
{
if( m_cassette )
{
return m_cassette->read_line_ds2401();
}
return 0;
}
READ_LINE_MEMBER(konami573_cassette_slot_device::read_line_secflash_sda)
{
if( m_cassette )
{
return m_cassette->read_line_secflash_sda();
}
return 0;
}
READ_LINE_MEMBER(konami573_cassette_slot_device::read_line_adc083x_do)
{
if( m_cassette )
{
return m_cassette->read_line_adc083x_do();
}
return 0;
}
READ_LINE_MEMBER(konami573_cassette_slot_device::read_line_adc083x_sars)
{
if( m_cassette )
{
return m_cassette->read_line_adc083x_sars();
}
return 0;
}

View File

@ -1,16 +1,215 @@
/*
* Konami 573 Security Cassette
*
*/
#pragma once
#ifndef __K573CASS_H__
#define __K573CASS_H__
#include "cpu/psx/siodev.h"
#include "machine/adc083x.h"
#include "machine/ds2401.h"
#include "machine/x76f041.h"
#include "machine/x76f100.h"
#include "machine/zs01.h"
extern const device_type KONAMI573CASSETTE;
class konami573cassette_device : public psxsiodev_device
class konami573_cassette_interface
{
public:
konami573cassette_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d0);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d1) = 0;
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d2) = 0;
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d3) = 0;
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d4);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d5);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d6);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d7);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_zs01_sda);
virtual DECLARE_READ_LINE_MEMBER(read_line_ds2401);
virtual DECLARE_READ_LINE_MEMBER(read_line_secflash_sda) = 0;
virtual DECLARE_READ_LINE_MEMBER(read_line_dsr);
virtual DECLARE_READ_LINE_MEMBER(read_line_adc083x_do);
virtual DECLARE_READ_LINE_MEMBER(read_line_adc083x_sars);
};
extern const device_type KONAMI573_CASSETTE_X;
class konami573_cassette_x_device: public device_t,
public konami573_cassette_interface,
public device_slot_card_interface
{
public:
konami573_cassette_x_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
konami573_cassette_x_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock,const char *shortname = "", const char *source = __FILE__);
virtual DECLARE_READ_LINE_MEMBER(read_line_secflash_sda);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d0);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d1);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d2);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d3);
protected:
virtual void device_start();
virtual machine_config_constructor device_mconfig_additions() const;
private:
required_device<x76f041_device> m_x76f041;
};
extern const device_type KONAMI573_CASSETTE_XI;
class konami573_cassette_xi_device: public konami573_cassette_x_device
{
public:
konami573_cassette_xi_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
virtual DECLARE_READ_LINE_MEMBER(read_line_ds2401);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d4);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d0);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d1);
virtual DECLARE_READ_LINE_MEMBER(read_line_adc083x_do);
virtual DECLARE_READ_LINE_MEMBER(read_line_adc083x_sars);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d5);
protected:
virtual machine_config_constructor device_mconfig_additions() const;
private:
required_device<ds2401_device> m_ds2401;
required_device<adc0838_device> m_adc0838;
};
extern const device_type KONAMI573_CASSETTE_Y;
#define MCFG_KONAMI573_CASSETTE_Y_D0_HANDLER(_devcb) \
devcb = &konami573_cassette_y_device::set_d0_handler(*device, DEVCB2_##_devcb);
#define MCFG_KONAMI573_CASSETTE_Y_D1_HANDLER(_devcb) \
devcb = &konami573_cassette_y_device::set_d1_handler(*device, DEVCB2_##_devcb);
#define MCFG_KONAMI573_CASSETTE_Y_D2_HANDLER(_devcb) \
devcb = &konami573_cassette_y_device::set_d2_handler(*device, DEVCB2_##_devcb);
#define MCFG_KONAMI573_CASSETTE_Y_D3_HANDLER(_devcb) \
devcb = &konami573_cassette_y_device::set_d3_handler(*device, DEVCB2_##_devcb);
#define MCFG_KONAMI573_CASSETTE_Y_D4_HANDLER(_devcb) \
devcb = &konami573_cassette_y_device::set_d4_handler(*device, DEVCB2_##_devcb);
#define MCFG_KONAMI573_CASSETTE_Y_D5_HANDLER(_devcb) \
devcb = &konami573_cassette_y_device::set_d5_handler(*device, DEVCB2_##_devcb);
#define MCFG_KONAMI573_CASSETTE_Y_D6_HANDLER(_devcb) \
devcb = &konami573_cassette_y_device::set_d6_handler(*device, DEVCB2_##_devcb);
#define MCFG_KONAMI573_CASSETTE_Y_D7_HANDLER(_devcb) \
devcb = &konami573_cassette_y_device::set_d7_handler(*device, DEVCB2_##_devcb);
class konami573_cassette_y_device: public device_t,
public konami573_cassette_interface,
public device_slot_card_interface
{
public:
konami573_cassette_y_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
konami573_cassette_y_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock,const char *shortname = "", const char *source = __FILE__);
// static configuration helpers
template<class _Object> static devcb2_base &set_d0_handler(device_t &device, _Object object) { return downcast<konami573_cassette_y_device &>(device).m_d0_handler.set_callback(object); }
template<class _Object> static devcb2_base &set_d1_handler(device_t &device, _Object object) { return downcast<konami573_cassette_y_device &>(device).m_d1_handler.set_callback(object); }
template<class _Object> static devcb2_base &set_d2_handler(device_t &device, _Object object) { return downcast<konami573_cassette_y_device &>(device).m_d2_handler.set_callback(object); }
template<class _Object> static devcb2_base &set_d3_handler(device_t &device, _Object object) { return downcast<konami573_cassette_y_device &>(device).m_d3_handler.set_callback(object); }
template<class _Object> static devcb2_base &set_d4_handler(device_t &device, _Object object) { return downcast<konami573_cassette_y_device &>(device).m_d4_handler.set_callback(object); }
template<class _Object> static devcb2_base &set_d5_handler(device_t &device, _Object object) { return downcast<konami573_cassette_y_device &>(device).m_d5_handler.set_callback(object); }
template<class _Object> static devcb2_base &set_d6_handler(device_t &device, _Object object) { return downcast<konami573_cassette_y_device &>(device).m_d6_handler.set_callback(object); }
template<class _Object> static devcb2_base &set_d7_handler(device_t &device, _Object object) { return downcast<konami573_cassette_y_device &>(device).m_d7_handler.set_callback(object); }
virtual DECLARE_READ_LINE_MEMBER(read_line_secflash_sda);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d0);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d1);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d2);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d3);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d4);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d5);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d6);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d7);
protected:
virtual void device_start();
virtual machine_config_constructor device_mconfig_additions() const;
private:
required_device<x76f100_device> m_x76f100;
devcb2_write_line m_d0_handler;
devcb2_write_line m_d1_handler;
devcb2_write_line m_d2_handler;
devcb2_write_line m_d3_handler;
devcb2_write_line m_d4_handler;
devcb2_write_line m_d5_handler;
devcb2_write_line m_d6_handler;
devcb2_write_line m_d7_handler;
};
extern const device_type KONAMI573_CASSETTE_YI;
class konami573_cassette_yi_device: public konami573_cassette_y_device
{
public:
konami573_cassette_yi_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
virtual DECLARE_READ_LINE_MEMBER(read_line_ds2401);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d4);
protected:
virtual machine_config_constructor device_mconfig_additions() const;
private:
required_device<ds2401_device> m_ds2401;
};
extern const device_type KONAMI573_CASSETTE_ZI;
class konami573_cassette_zi_device: public device_t,
public konami573_cassette_interface,
public device_slot_card_interface
{
public:
konami573_cassette_zi_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
virtual DECLARE_READ_LINE_MEMBER(read_line_ds2401);
virtual DECLARE_READ_LINE_MEMBER(read_line_secflash_sda);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d4);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d1);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d2);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_d3);
virtual DECLARE_WRITE_LINE_MEMBER(write_line_zs01_sda);
protected:
virtual void device_start();
virtual machine_config_constructor device_mconfig_additions() const;
private:
required_device<zs01_device> m_zs01;
required_device<ds2401_device> m_ds2401;
};
extern const device_type KONAMI573_CASSETTE_SLOT_SERIAL;
class konami573_cassette_slot_serial_device : public psxsiodev_device
{
public:
konami573_cassette_slot_serial_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
void _data_out( int data, int mask );
protected:
virtual void device_start();
@ -19,4 +218,36 @@ private:
virtual void data_in( int data, int mask );
};
extern const device_type KONAMI573_CASSETTE_SLOT;
class konami573_cassette_slot_device : public device_t,
public device_slot_interface
{
public:
konami573_cassette_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
DECLARE_WRITE_LINE_MEMBER(write_line_d0);
DECLARE_WRITE_LINE_MEMBER(write_line_d1);
DECLARE_WRITE_LINE_MEMBER(write_line_d2);
DECLARE_WRITE_LINE_MEMBER(write_line_d3);
DECLARE_WRITE_LINE_MEMBER(write_line_d4);
DECLARE_WRITE_LINE_MEMBER(write_line_d5);
DECLARE_WRITE_LINE_MEMBER(write_line_d6);
DECLARE_WRITE_LINE_MEMBER(write_line_d7);
DECLARE_WRITE_LINE_MEMBER(write_line_zs01_sda);
DECLARE_READ_LINE_MEMBER(read_line_ds2401);
DECLARE_READ_LINE_MEMBER(read_line_secflash_sda);
DECLARE_READ_LINE_MEMBER(read_line_adc083x_do);
DECLARE_READ_LINE_MEMBER(read_line_adc083x_sars);
protected:
virtual void device_start();
private:
required_device<konami573_cassette_slot_serial_device> m_serial;
konami573_cassette_interface *m_cassette;
};
#endif

View File

@ -9,7 +9,6 @@
#include "emu.h"
#include "machine/zs01.h"
#include "machine/ds2401.h"
#define VERBOSE_LEVEL 0
@ -53,6 +52,12 @@ void zs01_device::device_start()
save_item(NAME(response_to_reset));
save_item(NAME(command_key));
save_item(NAME(data_key));
m_ds2401 = siblingdevice<ds2401_device>(ds2401_tag);
if( m_ds2401 == NULL )
{
logerror( "ds2401 '%s' not found\n", ds2401_tag );
}
}
void zs01_device::device_reset()
@ -412,9 +417,9 @@ void zs01_device::scl_1()
switch(write_buffer[1]) {
case 0xfd: {
/* TODO: use read/write to talk to the ds2401, which will require a timer. */
ds2401_device *ds2401 = machine().device<ds2401_device>(ds2401_tag);
for(int i = 0; i < SIZE_DATA_BUFFER; i++)
read_buffer[2+i] = ds2401->direct_read(SIZE_DATA_BUFFER-i-1);
if( m_ds2401 != NULL )
for(int i = 0; i < SIZE_DATA_BUFFER; i++)
read_buffer[2+i] = m_ds2401->direct_read(SIZE_DATA_BUFFER-i-1);
break;
}
default:

View File

@ -8,10 +8,12 @@
#ifndef __ZS01_H__
#define __ZS01_H__
#include "machine/ds2401.h"
#include "machine/secflash.h"
#define MCFG_ZS01_ADD(_tag, ds2401_tag) \
MCFG_DEVICE_ADD(_tag, ZS01, 0) \
zs01_device::static_set_ds2401_tag(*device, ds2401_tag);
#include "machine/secflash.h"
class zs01_device : public device_secure_serial_flash
{
@ -82,6 +84,8 @@ protected:
private:
inline void ATTR_PRINTF(3,4) verboselog(int n_level, const char *s_fmt, ...);
ds2401_device *m_ds2401;
};