mirror of
https://github.com/holub/mame
synced 2025-10-04 16:34:53 +03:00
Refactored Konami System 573 to use ATA_INTERFACE [smf]
This commit is contained in:
parent
85ed8d9061
commit
8fe60e8831
@ -23,6 +23,43 @@ machine_config_constructor atapi_cdrom_device::device_mconfig_additions() const
|
|||||||
return MACHINE_CONFIG_NAME( atapicdr );
|
return MACHINE_CONFIG_NAME( atapicdr );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void atapi_cdrom_device::device_start()
|
||||||
|
{
|
||||||
|
memset(m_identify_buffer, 0, sizeof(m_identify_buffer));
|
||||||
|
|
||||||
|
m_identify_buffer[ 0 ] = 0x8500; // ATAPI device, cmd set 5 compliant, DRQ within 3 ms of PACKET command
|
||||||
|
|
||||||
|
m_identify_buffer[ 23 ] = ('1' << 8) | '.';
|
||||||
|
m_identify_buffer[ 24 ] = ('0' << 8) | ' ';
|
||||||
|
m_identify_buffer[ 25 ] = (' ' << 8) | ' ';
|
||||||
|
m_identify_buffer[ 26 ] = (' ' << 8) | ' ';
|
||||||
|
|
||||||
|
m_identify_buffer[ 27 ] = ('M' << 8) | 'A';
|
||||||
|
m_identify_buffer[ 28 ] = ('M' << 8) | 'E';
|
||||||
|
m_identify_buffer[ 29 ] = (' ' << 8) | 'C';
|
||||||
|
m_identify_buffer[ 30 ] = ('o' << 8) | 'm';
|
||||||
|
m_identify_buffer[ 31 ] = ('p' << 8) | 'r';
|
||||||
|
m_identify_buffer[ 32 ] = ('e' << 8) | 's';
|
||||||
|
m_identify_buffer[ 33 ] = ('s' << 8) | 'e';
|
||||||
|
m_identify_buffer[ 34 ] = ('d' << 8) | ' ';
|
||||||
|
m_identify_buffer[ 35 ] = ('C' << 8) | 'D';
|
||||||
|
m_identify_buffer[ 36 ] = ('R' << 8) | 'O';
|
||||||
|
m_identify_buffer[ 37 ] = ('M' << 8) | ' ';
|
||||||
|
m_identify_buffer[ 38 ] = (' ' << 8) | ' ';
|
||||||
|
m_identify_buffer[ 39 ] = (' ' << 8) | ' ';
|
||||||
|
m_identify_buffer[ 40 ] = (' ' << 8) | ' ';
|
||||||
|
m_identify_buffer[ 41 ] = (' ' << 8) | ' ';
|
||||||
|
m_identify_buffer[ 42 ] = (' ' << 8) | ' ';
|
||||||
|
m_identify_buffer[ 43 ] = (' ' << 8) | ' ';
|
||||||
|
m_identify_buffer[ 44 ] = (' ' << 8) | ' ';
|
||||||
|
m_identify_buffer[ 45 ] = (' ' << 8) | ' ';
|
||||||
|
m_identify_buffer[ 46 ] = (' ' << 8) | ' ';
|
||||||
|
|
||||||
|
m_identify_buffer[ 49 ] = 0x0600; // Word 49=Capabilities, IORDY may be disabled (bit_10), LBA Supported mandatory (bit_9)
|
||||||
|
|
||||||
|
atapi_hle_device::device_start();
|
||||||
|
}
|
||||||
|
|
||||||
void atapi_cdrom_device::perform_diagnostic()
|
void atapi_cdrom_device::perform_diagnostic()
|
||||||
{
|
{
|
||||||
m_error = IDE_ERROR_DIAGNOSTIC_PASSED;
|
m_error = IDE_ERROR_DIAGNOSTIC_PASSED;
|
||||||
@ -30,42 +67,4 @@ void atapi_cdrom_device::perform_diagnostic()
|
|||||||
|
|
||||||
void atapi_cdrom_device::identify_packet_device()
|
void atapi_cdrom_device::identify_packet_device()
|
||||||
{
|
{
|
||||||
m_buffer_size = 512;
|
|
||||||
|
|
||||||
memset(m_buffer, 0, m_buffer_size);
|
|
||||||
|
|
||||||
m_buffer[ 0 ^ 1 ] = 0x85; // ATAPI device, cmd set 5 compliant, DRQ within 3 ms of PACKET command
|
|
||||||
m_buffer[ 1 ^ 1 ] = 0x80; // ATAPI device, removable media
|
|
||||||
|
|
||||||
memset( &m_buffer[ 46 ], ' ', 8 );
|
|
||||||
m_buffer[ 46 ^ 1 ] = '1';
|
|
||||||
m_buffer[ 47 ^ 1 ] = '.';
|
|
||||||
m_buffer[ 48 ^ 1 ] = '0';
|
|
||||||
|
|
||||||
memset( &m_buffer[ 54 ], ' ', 40 );
|
|
||||||
m_buffer[ 54 ^ 1 ] = 'M';
|
|
||||||
m_buffer[ 55 ^ 1 ] = 'A';
|
|
||||||
m_buffer[ 56 ^ 1 ] = 'M';
|
|
||||||
m_buffer[ 57 ^ 1 ] = 'E';
|
|
||||||
m_buffer[ 58 ^ 1 ] = ' ';
|
|
||||||
m_buffer[ 59 ^ 1 ] = 'C';
|
|
||||||
m_buffer[ 60 ^ 1 ] = 'o';
|
|
||||||
m_buffer[ 61 ^ 1 ] = 'm';
|
|
||||||
m_buffer[ 62 ^ 1 ] = 'p';
|
|
||||||
m_buffer[ 63 ^ 1 ] = 'r';
|
|
||||||
m_buffer[ 64 ^ 1 ] = 'e';
|
|
||||||
m_buffer[ 65 ^ 1 ] = 's';
|
|
||||||
m_buffer[ 66 ^ 1 ] = 's';
|
|
||||||
m_buffer[ 67 ^ 1 ] = 'e';
|
|
||||||
m_buffer[ 68 ^ 1 ] = 'd';
|
|
||||||
m_buffer[ 69 ^ 1 ] = ' ';
|
|
||||||
m_buffer[ 70 ^ 1 ] = 'C';
|
|
||||||
m_buffer[ 71 ^ 1 ] = 'D';
|
|
||||||
m_buffer[ 72 ^ 1 ] = '-';
|
|
||||||
m_buffer[ 73 ^ 1 ] = 'R';
|
|
||||||
m_buffer[ 74 ^ 1 ] = 'O';
|
|
||||||
m_buffer[ 75 ^ 1 ] = 'M';
|
|
||||||
|
|
||||||
m_buffer[ 98 ^ 1 ] = 0x06; // Word 49=Capabilities, IORDY may be disabled (bit_10), LBA Supported mandatory (bit_9)
|
|
||||||
m_buffer[ 99 ^ 1 ] = 0x00;
|
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,8 @@ public:
|
|||||||
atapi_cdrom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
atapi_cdrom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
// device-level overrides
|
||||||
|
virtual void device_start();
|
||||||
virtual machine_config_constructor device_mconfig_additions() const;
|
virtual machine_config_constructor device_mconfig_additions() const;
|
||||||
|
|
||||||
virtual void perform_diagnostic();
|
virtual void perform_diagnostic();
|
||||||
|
@ -14,7 +14,7 @@ void atapi_hle_device::process_buffer()
|
|||||||
{
|
{
|
||||||
int phase;
|
int phase;
|
||||||
|
|
||||||
// printf( "atapi command %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
|
//printf( "atapi command %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||||
// m_buffer[0],m_buffer[1],m_buffer[2],m_buffer[3],
|
// m_buffer[0],m_buffer[1],m_buffer[2],m_buffer[3],
|
||||||
// m_buffer[4],m_buffer[5],m_buffer[6],m_buffer[7],
|
// m_buffer[4],m_buffer[5],m_buffer[6],m_buffer[7],
|
||||||
// m_buffer[8],m_buffer[9],m_buffer[10],m_buffer[11]);
|
// m_buffer[8],m_buffer[9],m_buffer[10],m_buffer[11]);
|
||||||
@ -29,7 +29,7 @@ void atapi_hle_device::process_buffer()
|
|||||||
if (m_buffer_size == 0xffff)
|
if (m_buffer_size == 0xffff)
|
||||||
m_buffer_size = 0xfffe;
|
m_buffer_size = 0xfffe;
|
||||||
|
|
||||||
// printf("atapi result %08x %08x\n", m_data_size, m_buffer_size);
|
//printf("atapi result %08x %08x\n", m_data_size, m_buffer_size);
|
||||||
|
|
||||||
if (m_buffer_size > ATAPI_BUFFER_LENGTH || m_buffer_size == 0)
|
if (m_buffer_size > ATAPI_BUFFER_LENGTH || m_buffer_size == 0)
|
||||||
m_buffer_size = ATAPI_BUFFER_LENGTH;
|
m_buffer_size = ATAPI_BUFFER_LENGTH;
|
||||||
@ -55,6 +55,8 @@ void atapi_hle_device::process_buffer()
|
|||||||
{
|
{
|
||||||
m_sector_count = ATAPI_INTERRUPT_REASON_IO | ATAPI_INTERRUPT_REASON_CD;
|
m_sector_count = ATAPI_INTERRUPT_REASON_IO | ATAPI_INTERRUPT_REASON_CD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
set_irq(ASSERT_LINE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SCSI_PHASE_DATAIN:
|
case SCSI_PHASE_DATAIN:
|
||||||
@ -63,12 +65,13 @@ void atapi_hle_device::process_buffer()
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
m_cylinder_low = 0;
|
||||||
|
m_cylinder_high = 0;
|
||||||
m_sector_count = ATAPI_INTERRUPT_REASON_IO | ATAPI_INTERRUPT_REASON_CD;
|
m_sector_count = ATAPI_INTERRUPT_REASON_IO | ATAPI_INTERRUPT_REASON_CD;
|
||||||
|
set_irq(ASSERT_LINE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
set_irq(ASSERT_LINE);
|
|
||||||
|
|
||||||
m_packet = 0;
|
m_packet = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -133,6 +136,9 @@ void atapi_hle_device::fill_buffer()
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case IDE_COMMAND_IDENTIFY_PACKET_DEVICE:
|
case IDE_COMMAND_IDENTIFY_PACKET_DEVICE:
|
||||||
|
m_cylinder_low = 0;
|
||||||
|
m_cylinder_high = 0;
|
||||||
|
|
||||||
m_sector_count = ATAPI_INTERRUPT_REASON_IO | ATAPI_INTERRUPT_REASON_CD;
|
m_sector_count = ATAPI_INTERRUPT_REASON_IO | ATAPI_INTERRUPT_REASON_CD;
|
||||||
set_irq(ASSERT_LINE);
|
set_irq(ASSERT_LINE);
|
||||||
break;
|
break;
|
||||||
@ -160,18 +166,49 @@ void atapi_hle_device::process_command()
|
|||||||
soft_reset();
|
soft_reset();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case IDE_COMMAND_SET_FEATURES:
|
||||||
|
//printf("IDE Set features (%02X %02X %02X %02X %02X)\n", m_feature, m_sector_count & 0xff, m_sector_number, m_cylinder_low, m_cylinder_high);
|
||||||
|
set_irq(ASSERT_LINE);
|
||||||
|
break;
|
||||||
|
|
||||||
case IDE_COMMAND_PACKET:
|
case IDE_COMMAND_PACKET:
|
||||||
m_packet = 1;
|
m_packet = 1;
|
||||||
|
|
||||||
|
if (packet_command_length() == PACKET_COMMAND_LENGTH_16)
|
||||||
|
{
|
||||||
|
m_buffer_size = 16;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
m_buffer_size = 12;
|
m_buffer_size = 12;
|
||||||
|
}
|
||||||
|
|
||||||
m_status |= IDE_STATUS_DRQ;
|
m_status |= IDE_STATUS_DRQ;
|
||||||
m_sector_count = ATAPI_INTERRUPT_REASON_CD;
|
m_sector_count = ATAPI_INTERRUPT_REASON_CD;
|
||||||
|
|
||||||
|
if (packet_command_response() == PACKET_COMMAND_RESPONSE_INTRQ)
|
||||||
|
{
|
||||||
set_irq(ASSERT_LINE);
|
set_irq(ASSERT_LINE);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IDE_COMMAND_IDENTIFY_PACKET_DEVICE:
|
case IDE_COMMAND_IDENTIFY_PACKET_DEVICE:
|
||||||
identify_packet_device();
|
identify_packet_device();
|
||||||
|
|
||||||
|
for( int w = 0; w < 256; w++ )
|
||||||
|
{
|
||||||
|
m_buffer[w * 2] = m_identify_buffer[ w ] & 0xff;
|
||||||
|
m_buffer[(w * 2) + 1] = m_identify_buffer[ w ] >> 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_buffer_size = 512;
|
||||||
|
|
||||||
|
m_error = 0;
|
||||||
|
m_cylinder_low = m_buffer_size & 0xff;
|
||||||
|
m_cylinder_high = m_buffer_size >> 8;
|
||||||
|
|
||||||
m_status |= IDE_STATUS_DRQ;
|
m_status |= IDE_STATUS_DRQ;
|
||||||
|
m_sector_count = ATAPI_INTERRUPT_REASON_IO;
|
||||||
set_irq(ASSERT_LINE);
|
set_irq(ASSERT_LINE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -198,3 +235,13 @@ void atapi_hle_device::finished_command()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
atapi_hle_device::packet_command_length_t atapi_hle_device::packet_command_length()
|
||||||
|
{
|
||||||
|
return (packet_command_length_t) (m_identify_buffer[0] & 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
atapi_hle_device::packet_command_response_t atapi_hle_device::packet_command_response()
|
||||||
|
{
|
||||||
|
return (packet_command_response_t) ((m_identify_buffer[0] >> 5 ) & 3);
|
||||||
|
}
|
||||||
|
@ -30,23 +30,40 @@ public:
|
|||||||
ATAPI_INTERRUPT_REASON_TAG = 0xf8 // command tag
|
ATAPI_INTERRUPT_REASON_TAG = 0xf8 // command tag
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum packet_command_length_t
|
||||||
|
{
|
||||||
|
PACKET_COMMAND_LENGTH_12,
|
||||||
|
PACKET_COMMAND_LENGTH_16
|
||||||
|
};
|
||||||
|
|
||||||
|
enum packet_command_response_t
|
||||||
|
{
|
||||||
|
PACKET_COMMAND_RESPONSE_DRQ_3MS,
|
||||||
|
PACKET_COMMAND_RESPONSE_INTRQ,
|
||||||
|
PACKET_COMMAND_RESPONSE_DRQ_50US
|
||||||
|
};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual int sector_length() { return ATAPI_BUFFER_LENGTH; }
|
virtual int sector_length() { return ATAPI_BUFFER_LENGTH; }
|
||||||
virtual void process_buffer();
|
virtual void process_buffer();
|
||||||
virtual void fill_buffer();
|
virtual void fill_buffer();
|
||||||
virtual bool is_ready() { return false ; }
|
virtual bool is_ready() { return false; }
|
||||||
virtual void signature();
|
virtual void signature();
|
||||||
virtual void process_command();
|
virtual void process_command();
|
||||||
virtual void finished_command();
|
virtual void finished_command();
|
||||||
|
|
||||||
|
UINT16 m_identify_buffer[256];
|
||||||
virtual void identify_packet_device() = 0;
|
virtual void identify_packet_device() = 0;
|
||||||
|
|
||||||
|
packet_command_length_t packet_command_length();
|
||||||
|
packet_command_response_t packet_command_response();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int m_packet;
|
int m_packet;
|
||||||
int m_data_size;
|
int m_data_size;
|
||||||
required_device<scsihle_device> m_scsidev_device;
|
required_device<scsihle_device> m_scsidev_device;
|
||||||
|
|
||||||
static const int ATAPI_BUFFER_LENGTH = 0x800;
|
static const int ATAPI_BUFFER_LENGTH = 0xf800;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,23 +1,19 @@
|
|||||||
/*
|
#include "cr589.h"
|
||||||
* Matsushita CR-589
|
#include "scsicd.h"
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "emu.h"
|
|
||||||
#include "machine/cr589.h"
|
#include "machine/cr589.h"
|
||||||
|
|
||||||
// device type definition
|
// device type definition
|
||||||
const device_type CR589 = &device_creator<cr589_device>;
|
const device_type SCSI_CR589 = &device_creator<scsi_cr589_device>;
|
||||||
|
|
||||||
cr589_device::cr589_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
scsi_cr589_device::scsi_cr589_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
||||||
: scsicd_device(mconfig, CR589, "CR589", tag, owner, clock, "cr589", __FILE__)
|
: scsicd_device(mconfig, SCSI_CR589, "SCSI CR589", tag, owner, clock, "scsi cr589", __FILE__)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
static const int identity_offset = 0x3ab;
|
static const int identity_offset = 0x3ab;
|
||||||
static const char download_identity[] = "MATSHITA CD98Q4 DOWNLOADGS0N";
|
static const char download_identity[] = "MATSHITA CD98Q4 DOWNLOADGS0N";
|
||||||
|
|
||||||
void cr589_device::device_start()
|
void scsi_cr589_device::device_start()
|
||||||
{
|
{
|
||||||
scsicd_device::device_start();
|
scsicd_device::device_start();
|
||||||
|
|
||||||
@ -29,7 +25,7 @@ void cr589_device::device_start()
|
|||||||
save_item(NAME(bufferOffset));
|
save_item(NAME(bufferOffset));
|
||||||
}
|
}
|
||||||
|
|
||||||
void cr589_device::ExecCommand( int *transferLength )
|
void scsi_cr589_device::ExecCommand( int *transferLength )
|
||||||
{
|
{
|
||||||
switch( command[ 0 ] )
|
switch( command[ 0 ] )
|
||||||
{
|
{
|
||||||
@ -55,7 +51,7 @@ void cr589_device::ExecCommand( int *transferLength )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cr589_device::ReadData( UINT8 *data, int dataLength )
|
void scsi_cr589_device::ReadData( UINT8 *data, int dataLength )
|
||||||
{
|
{
|
||||||
switch( command[ 0 ] )
|
switch( command[ 0 ] )
|
||||||
{
|
{
|
||||||
@ -83,7 +79,7 @@ void cr589_device::ReadData( UINT8 *data, int dataLength )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cr589_device::WriteData( UINT8 *data, int dataLength )
|
void scsi_cr589_device::WriteData( UINT8 *data, int dataLength )
|
||||||
{
|
{
|
||||||
switch( command[ 0 ] )
|
switch( command[ 0 ] )
|
||||||
{
|
{
|
||||||
@ -108,3 +104,71 @@ void cr589_device::WriteData( UINT8 *data, int dataLength )
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// device type definition
|
||||||
|
const device_type CR589 = &device_creator<matsushita_cr589_device>;
|
||||||
|
|
||||||
|
matsushita_cr589_device::matsushita_cr589_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
||||||
|
: atapi_hle_device(mconfig, CR589, "Matsushita CR589", tag, owner, clock, "cr589", __FILE__)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static MACHINE_CONFIG_FRAGMENT( cr589 )
|
||||||
|
MCFG_DEVICE_ADD("device", SCSI_CR589, 0)
|
||||||
|
MACHINE_CONFIG_END
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// machine_config_additions - device-specific
|
||||||
|
// machine configurations
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
machine_config_constructor matsushita_cr589_device::device_mconfig_additions() const
|
||||||
|
{
|
||||||
|
return MACHINE_CONFIG_NAME( cr589 );
|
||||||
|
}
|
||||||
|
|
||||||
|
void matsushita_cr589_device::device_start()
|
||||||
|
{
|
||||||
|
memset(m_identify_buffer, 0, sizeof(m_identify_buffer));
|
||||||
|
|
||||||
|
m_identify_buffer[ 0 ] = 0x8500; // ATAPI device, cmd set 5 compliant, DRQ within 3 ms of PACKET command
|
||||||
|
|
||||||
|
m_identify_buffer[ 23 ] = ('1' << 8) | '.';
|
||||||
|
m_identify_buffer[ 24 ] = ('0' << 8) | ' ';
|
||||||
|
m_identify_buffer[ 25 ] = (' ' << 8) | ' ';
|
||||||
|
m_identify_buffer[ 26 ] = (' ' << 8) | ' ';
|
||||||
|
|
||||||
|
m_identify_buffer[ 27 ] = ('M' << 8) | 'A';
|
||||||
|
m_identify_buffer[ 28 ] = ('T' << 8) | 'S';
|
||||||
|
m_identify_buffer[ 29 ] = ('H' << 8) | 'I';
|
||||||
|
m_identify_buffer[ 30 ] = ('T' << 8) | 'A';
|
||||||
|
m_identify_buffer[ 31 ] = (' ' << 8) | 'C';
|
||||||
|
m_identify_buffer[ 32 ] = ('R' << 8) | '-';
|
||||||
|
m_identify_buffer[ 33 ] = ('5' << 8) | '8';
|
||||||
|
m_identify_buffer[ 34 ] = ('9' << 8) | ' ';
|
||||||
|
m_identify_buffer[ 35 ] = (' ' << 8) | ' ';
|
||||||
|
m_identify_buffer[ 36 ] = (' ' << 8) | ' ';
|
||||||
|
m_identify_buffer[ 37 ] = (' ' << 8) | ' ';
|
||||||
|
m_identify_buffer[ 38 ] = (' ' << 8) | ' ';
|
||||||
|
m_identify_buffer[ 39 ] = (' ' << 8) | ' ';
|
||||||
|
m_identify_buffer[ 40 ] = (' ' << 8) | ' ';
|
||||||
|
m_identify_buffer[ 41 ] = (' ' << 8) | ' ';
|
||||||
|
m_identify_buffer[ 42 ] = (' ' << 8) | ' ';
|
||||||
|
m_identify_buffer[ 43 ] = (' ' << 8) | ' ';
|
||||||
|
m_identify_buffer[ 44 ] = (' ' << 8) | ' ';
|
||||||
|
m_identify_buffer[ 45 ] = (' ' << 8) | ' ';
|
||||||
|
m_identify_buffer[ 46 ] = (' ' << 8) | ' ';
|
||||||
|
|
||||||
|
m_identify_buffer[ 49 ] = 0x0400; // IORDY may be disabled
|
||||||
|
|
||||||
|
atapi_hle_device::device_start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void matsushita_cr589_device::perform_diagnostic()
|
||||||
|
{
|
||||||
|
m_error = IDE_ERROR_DIAGNOSTIC_PASSED;
|
||||||
|
}
|
||||||
|
|
||||||
|
void matsushita_cr589_device::identify_packet_device()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
@ -1,10 +1,27 @@
|
|||||||
|
/***************************************************************************
|
||||||
|
|
||||||
|
cr589.h
|
||||||
|
|
||||||
|
Matsushita CR589
|
||||||
|
|
||||||
|
Copyright Nicola Salmoria and the MAME Team.
|
||||||
|
Visit http://mamedev.org for licensing and usage restrictions.
|
||||||
|
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifndef __CR589_H__
|
||||||
|
#define __CR589_H__
|
||||||
|
|
||||||
|
#include "atapihle.h"
|
||||||
#include "scsicd.h"
|
#include "scsicd.h"
|
||||||
|
|
||||||
class cr589_device : public scsicd_device
|
class scsi_cr589_device : public scsicd_device
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// construction/destruction
|
// construction/destruction
|
||||||
cr589_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
scsi_cr589_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||||
|
|
||||||
virtual void ExecCommand( int *transferLength );
|
virtual void ExecCommand( int *transferLength );
|
||||||
virtual void WriteData( UINT8 *data, int dataLength );
|
virtual void WriteData( UINT8 *data, int dataLength );
|
||||||
@ -20,5 +37,24 @@ private:
|
|||||||
int bufferOffset;
|
int bufferOffset;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// device type definition
|
||||||
|
extern const device_type SCSI_CR589;
|
||||||
|
|
||||||
|
class matsushita_cr589_device : public atapi_hle_device
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
matsushita_cr589_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// device-level overrides
|
||||||
|
virtual machine_config_constructor device_mconfig_additions() const;
|
||||||
|
virtual void device_start();
|
||||||
|
|
||||||
|
virtual void perform_diagnostic();
|
||||||
|
virtual void identify_packet_device();
|
||||||
|
};
|
||||||
|
|
||||||
// device type definition
|
// device type definition
|
||||||
extern const device_type CR589;
|
extern const device_type CR589;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
@ -20,7 +20,6 @@
|
|||||||
Note 4: Some games require you to press f2 to skip the rtc cleared note.
|
Note 4: Some games require you to press f2 to skip the rtc cleared note.
|
||||||
|
|
||||||
TODO:
|
TODO:
|
||||||
* integrate ATAPI code with Aaron's ATA/IDE code
|
|
||||||
* emulate memory card board GE885-PWB(A)A ( contains Toshiba tmpr3904af, ram, rom, tranceiver and glue ).
|
* emulate memory card board GE885-PWB(A)A ( contains Toshiba tmpr3904af, ram, rom, tranceiver and glue ).
|
||||||
|
|
||||||
-----------------------------------------------------------------------------------------
|
-----------------------------------------------------------------------------------------
|
||||||
@ -483,6 +482,7 @@ G: gun mania only, drives air soft gun (this game uses real BB bullet)
|
|||||||
#include "cdrom.h"
|
#include "cdrom.h"
|
||||||
#include "cpu/psx/psx.h"
|
#include "cpu/psx/psx.h"
|
||||||
#include "machine/adc083x.h"
|
#include "machine/adc083x.h"
|
||||||
|
#include "machine/ataintf.h"
|
||||||
#include "machine/bankdev.h"
|
#include "machine/bankdev.h"
|
||||||
#include "machine/cr589.h"
|
#include "machine/cr589.h"
|
||||||
#include "machine/ds2401.h"
|
#include "machine/ds2401.h"
|
||||||
@ -500,33 +500,6 @@ G: gun mania only, drives air soft gun (this game uses real BB bullet)
|
|||||||
|
|
||||||
#define ATAPI_CYCLES_PER_SECTOR (5000) // plenty of time to allow DMA setup etc. BIOS requires this be at least 2000, individual games may vary.
|
#define ATAPI_CYCLES_PER_SECTOR (5000) // plenty of time to allow DMA setup etc. BIOS requires this be at least 2000, individual games may vary.
|
||||||
|
|
||||||
#define ATAPI_STAT_BSY 0x80
|
|
||||||
#define ATAPI_STAT_DRDY 0x40
|
|
||||||
#define ATAPI_STAT_DMARDDF 0x20
|
|
||||||
#define ATAPI_STAT_SERVDSC 0x10
|
|
||||||
#define ATAPI_STAT_DRQ 0x08
|
|
||||||
#define ATAPI_STAT_CORR 0x04
|
|
||||||
#define ATAPI_STAT_CHECK 0x01
|
|
||||||
|
|
||||||
#define ATAPI_INTREASON_COMMAND 0x01
|
|
||||||
#define ATAPI_INTREASON_IO 0x02
|
|
||||||
#define ATAPI_INTREASON_RELEASE 0x04
|
|
||||||
|
|
||||||
#define ATAPI_REG_DATA 0
|
|
||||||
#define ATAPI_REG_ERRFEAT 1
|
|
||||||
#define ATAPI_REG_INTREASON 2
|
|
||||||
#define ATAPI_REG_SAMTAG 3
|
|
||||||
#define ATAPI_REG_COUNTLOW 4
|
|
||||||
#define ATAPI_REG_COUNTHIGH 5
|
|
||||||
#define ATAPI_REG_DRIVESEL 6
|
|
||||||
#define ATAPI_REG_CMDSTATUS 7
|
|
||||||
#define ATAPI_REG_MAX 16
|
|
||||||
|
|
||||||
#define ATAPI_DATA_SIZE ( 64 * 1024 )
|
|
||||||
|
|
||||||
#define MAX_TRANSFER_SIZE ( 63488 )
|
|
||||||
|
|
||||||
|
|
||||||
class ksys573_state : public driver_device
|
class ksys573_state : public driver_device
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -538,7 +511,7 @@ public:
|
|||||||
m_analog3(*this, "analog3"),
|
m_analog3(*this, "analog3"),
|
||||||
m_pads(*this, "PADS"),
|
m_pads(*this, "PADS"),
|
||||||
m_psxirq(*this, ":maincpu:irq"),
|
m_psxirq(*this, ":maincpu:irq"),
|
||||||
m_cr589(*this, ":cdrom"),
|
m_ata(*this, "ata"),
|
||||||
m_maincpu(*this, "maincpu"),
|
m_maincpu(*this, "maincpu"),
|
||||||
m_ram(*this, "maincpu:ram"),
|
m_ram(*this, "maincpu:ram"),
|
||||||
m_flashbank(*this, "flashbank"),
|
m_flashbank(*this, "flashbank"),
|
||||||
@ -561,8 +534,6 @@ public:
|
|||||||
DECLARE_CUSTOM_INPUT_MEMBER(gunmania_cable_holder_sensor);
|
DECLARE_CUSTOM_INPUT_MEMBER(gunmania_cable_holder_sensor);
|
||||||
DECLARE_READ16_MEMBER(control_r);
|
DECLARE_READ16_MEMBER(control_r);
|
||||||
DECLARE_WRITE16_MEMBER(control_w);
|
DECLARE_WRITE16_MEMBER(control_w);
|
||||||
DECLARE_READ16_MEMBER(atapi_r);
|
|
||||||
DECLARE_WRITE16_MEMBER(atapi_w);
|
|
||||||
DECLARE_WRITE16_MEMBER(atapi_reset_w);
|
DECLARE_WRITE16_MEMBER(atapi_reset_w);
|
||||||
DECLARE_WRITE16_MEMBER(security_w);
|
DECLARE_WRITE16_MEMBER(security_w);
|
||||||
DECLARE_READ16_MEMBER(security_r);
|
DECLARE_READ16_MEMBER(security_r);
|
||||||
@ -601,6 +572,7 @@ public:
|
|||||||
DECLARE_WRITE_LINE_MEMBER(hyperbbc_lamp_strobe1);
|
DECLARE_WRITE_LINE_MEMBER(hyperbbc_lamp_strobe1);
|
||||||
DECLARE_WRITE_LINE_MEMBER(hyperbbc_lamp_strobe2);
|
DECLARE_WRITE_LINE_MEMBER(hyperbbc_lamp_strobe2);
|
||||||
DECLARE_WRITE_LINE_MEMBER(hyperbbc_lamp_strobe3);
|
DECLARE_WRITE_LINE_MEMBER(hyperbbc_lamp_strobe3);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(ata_interrupt);
|
||||||
TIMER_CALLBACK_MEMBER(atapi_xfer_end);
|
TIMER_CALLBACK_MEMBER(atapi_xfer_end);
|
||||||
DECLARE_WRITE8_MEMBER(ddr_output_callback);
|
DECLARE_WRITE8_MEMBER(ddr_output_callback);
|
||||||
DECLARE_WRITE8_MEMBER(ddrsolo_output_callback);
|
DECLARE_WRITE8_MEMBER(ddrsolo_output_callback);
|
||||||
@ -624,8 +596,7 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
inline void ATTR_PRINTF(3,4) verboselog( int n_level, const char *s_fmt, ... );
|
inline void ATTR_PRINTF(3,4) verboselog( int n_level, const char *s_fmt, ... );
|
||||||
void atapi_init();
|
void update_disc();
|
||||||
void update_mode();
|
|
||||||
void gx700pwbf_output( int offset, UINT8 data );
|
void gx700pwbf_output( int offset, UINT8 data );
|
||||||
void gx700pwfbf_init( void (ksys573_state::*output_callback_func)( address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT8 data, ATTR_UNUSED UINT8 mem_mask ) );
|
void gx700pwfbf_init( void (ksys573_state::*output_callback_func)( address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT8 data, ATTR_UNUSED UINT8 mem_mask ) );
|
||||||
void gn845pwbb_do_w( int offset, int data );
|
void gn845pwbb_do_w( int offset, int data );
|
||||||
@ -633,15 +604,11 @@ private:
|
|||||||
|
|
||||||
required_device<psxirq_device> m_psxirq;
|
required_device<psxirq_device> m_psxirq;
|
||||||
|
|
||||||
emu_timer *m_atapi_timer;
|
required_device<ata_interface_device> m_ata;
|
||||||
required_device<scsihle_device> m_cr589;
|
|
||||||
cdrom_file *m_available_cdroms[ 2 ];
|
cdrom_file *m_available_cdroms[ 2 ];
|
||||||
int m_atapi_data_ptr;
|
emu_timer *m_atapi_timer;
|
||||||
int m_atapi_data_len;
|
|
||||||
int m_atapi_xferlen;
|
|
||||||
int m_atapi_xferbase;
|
int m_atapi_xferbase;
|
||||||
int m_atapi_cdata_wait;
|
int m_atapi_xfersize;
|
||||||
int m_atapi_xfermod;
|
|
||||||
|
|
||||||
UINT32 m_control;
|
UINT32 m_control;
|
||||||
UINT16 m_n_security_control;
|
UINT16 m_n_security_control;
|
||||||
@ -682,10 +649,6 @@ private:
|
|||||||
|
|
||||||
UINT32 *m_p_n_psxram;
|
UINT32 *m_p_n_psxram;
|
||||||
|
|
||||||
/* memory */
|
|
||||||
UINT8 m_atapi_regs[ATAPI_REG_MAX];
|
|
||||||
UINT8 m_atapi_data[ATAPI_DATA_SIZE];
|
|
||||||
|
|
||||||
int m_tank_shutter_position;
|
int m_tank_shutter_position;
|
||||||
int m_cable_holder_release;
|
int m_cable_holder_release;
|
||||||
|
|
||||||
@ -724,7 +687,7 @@ static ADDRESS_MAP_START( konami573_map, AS_PROGRAM, 32, ksys573_state )
|
|||||||
AM_RANGE(0x1f400004, 0x1f400007) AM_READ_PORT("IN1")
|
AM_RANGE(0x1f400004, 0x1f400007) AM_READ_PORT("IN1")
|
||||||
AM_RANGE(0x1f400008, 0x1f40000b) AM_READ_PORT("IN2")
|
AM_RANGE(0x1f400008, 0x1f40000b) AM_READ_PORT("IN2")
|
||||||
AM_RANGE(0x1f40000c, 0x1f40000f) AM_READ_PORT("IN3")
|
AM_RANGE(0x1f40000c, 0x1f40000f) AM_READ_PORT("IN3")
|
||||||
AM_RANGE(0x1f480000, 0x1f48000f) AM_READWRITE16(atapi_r, atapi_w, 0xffffffff) // IDE controller, used mostly in ATAPI mode (only 3 pure IDE commands seen so far)
|
AM_RANGE(0x1f480000, 0x1f48000f) AM_DEVREADWRITE16("ata", ata_interface_device, read_cs0, write_cs0, 0xffffffff)
|
||||||
AM_RANGE(0x1f500000, 0x1f500003) AM_READWRITE16(control_r, control_w, 0x0000ffff) // Konami can't make a game without a "control" register.
|
AM_RANGE(0x1f500000, 0x1f500003) AM_READWRITE16(control_r, control_w, 0x0000ffff) // Konami can't make a game without a "control" register.
|
||||||
AM_RANGE(0x1f560000, 0x1f560003) AM_WRITE16(atapi_reset_w, 0x0000ffff)
|
AM_RANGE(0x1f560000, 0x1f560003) AM_WRITE16(atapi_reset_w, 0x0000ffff)
|
||||||
AM_RANGE(0x1f5c0000, 0x1f5c0003) AM_WRITENOP // watchdog?
|
AM_RANGE(0x1f5c0000, 0x1f5c0003) AM_WRITENOP // watchdog?
|
||||||
@ -787,454 +750,33 @@ WRITE16_MEMBER(ksys573_state::control_w)
|
|||||||
|
|
||||||
TIMER_CALLBACK_MEMBER(ksys573_state::atapi_xfer_end)
|
TIMER_CALLBACK_MEMBER(ksys573_state::atapi_xfer_end)
|
||||||
{
|
{
|
||||||
UINT32 *p_n_psxram = m_p_n_psxram;
|
/// TODO: respect timing of data from ATAPI device.
|
||||||
int i, n_state;
|
|
||||||
UINT8 sector_buffer[ 4096 ];
|
|
||||||
|
|
||||||
m_atapi_timer->adjust(attotime::never);
|
m_atapi_timer->adjust(attotime::never);
|
||||||
|
|
||||||
// verboselog(2, "atapi_xfer_end( %d ) atapi_xferlen = %d, atapi_xfermod=%d\n", x, atapi_xfermod, atapi_xferlen );
|
address_space &space = m_maincpu->space(AS_PROGRAM);
|
||||||
|
|
||||||
// mame_printf_debug("ATAPI: xfer_end. xferlen = %d, atapi_xfermod = %d\n", atapi_xferlen, atapi_xfermod);
|
while( m_atapi_xfersize > 0 )
|
||||||
|
|
||||||
while( m_atapi_xferlen > 0 )
|
|
||||||
{
|
{
|
||||||
// get a sector from the SCSI device
|
UINT32 d = m_ata->read_cs0(space, (UINT32) 0, (UINT32) 0xffff) << 0;
|
||||||
m_cr589->ReadData( sector_buffer, 2048 );
|
d |= m_ata->read_cs0(space, (UINT32) 0, (UINT32) 0xffff) << 16;
|
||||||
|
|
||||||
m_atapi_xferlen -= 2048;
|
m_p_n_psxram[ m_atapi_xferbase / 4 ] = d;
|
||||||
|
|
||||||
i = 0;
|
|
||||||
n_state = 2048 / 4;
|
|
||||||
while( n_state > 0 )
|
|
||||||
{
|
|
||||||
p_n_psxram[ m_atapi_xferbase / 4 ] =
|
|
||||||
( sector_buffer[ i + 0 ] << 0 ) |
|
|
||||||
( sector_buffer[ i + 1 ] << 8 ) |
|
|
||||||
( sector_buffer[ i + 2 ] << 16 ) |
|
|
||||||
( sector_buffer[ i + 3 ] << 24 );
|
|
||||||
m_atapi_xferbase += 4;
|
m_atapi_xferbase += 4;
|
||||||
i += 4;
|
m_atapi_xfersize--;
|
||||||
n_state--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_atapi_xfermod > MAX_TRANSFER_SIZE)
|
|
||||||
{
|
|
||||||
m_atapi_xferlen = MAX_TRANSFER_SIZE;
|
|
||||||
m_atapi_xfermod = m_atapi_xfermod - MAX_TRANSFER_SIZE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_atapi_xferlen = m_atapi_xfermod;
|
|
||||||
m_atapi_xfermod = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (m_atapi_xferlen > 0)
|
|
||||||
{
|
|
||||||
//mame_printf_debug("ATAPI: starting next piece of multi-part transfer\n");
|
|
||||||
m_atapi_regs[ATAPI_REG_COUNTLOW] = m_atapi_xferlen & 0xff;
|
|
||||||
m_atapi_regs[ATAPI_REG_COUNTHIGH] = (m_atapi_xferlen>>8)&0xff;
|
|
||||||
|
|
||||||
m_atapi_timer->adjust(m_maincpu->cycles_to_attotime((ATAPI_CYCLES_PER_SECTOR * (m_atapi_xferlen/2048))));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//mame_printf_debug("ATAPI: Transfer completed, dropping DRQ\n");
|
|
||||||
m_atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_DRDY;
|
|
||||||
m_atapi_regs[ATAPI_REG_INTREASON] = ATAPI_INTREASON_IO | ATAPI_INTREASON_COMMAND;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_psxirq->intin10(1);
|
|
||||||
|
|
||||||
verboselog(2, "atapi_xfer_end: %d %d\n", m_atapi_xferlen, m_atapi_xfermod );
|
|
||||||
}
|
|
||||||
|
|
||||||
READ16_MEMBER(ksys573_state::atapi_r)
|
|
||||||
{
|
|
||||||
int data;
|
|
||||||
|
|
||||||
if (offset == 0 && mem_mask == 0xffff) // word-wide command read
|
|
||||||
{
|
|
||||||
// mame_printf_debug("ATAPI: packet read = %04x\n", atapi_data[atapi_data_ptr]);
|
|
||||||
|
|
||||||
// assert IRQ and drop DRQ
|
|
||||||
if (m_atapi_data_ptr == 0 && m_atapi_data_len == 0)
|
|
||||||
{
|
|
||||||
// get the data from the device
|
|
||||||
if( m_atapi_xferlen > 0 )
|
|
||||||
{
|
|
||||||
m_cr589->ReadData( m_atapi_data, m_atapi_xferlen );
|
|
||||||
m_atapi_data_len = m_atapi_xferlen;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_atapi_xfermod > MAX_TRANSFER_SIZE)
|
|
||||||
{
|
|
||||||
m_atapi_xferlen = MAX_TRANSFER_SIZE;
|
|
||||||
m_atapi_xfermod = m_atapi_xfermod - MAX_TRANSFER_SIZE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_atapi_xferlen = m_atapi_xfermod;
|
|
||||||
m_atapi_xfermod = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
verboselog(2, "atapi_r: atapi_xferlen=%d\n", m_atapi_xferlen );
|
|
||||||
if( m_atapi_xferlen != 0 )
|
|
||||||
{
|
|
||||||
m_atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_DRQ | ATAPI_STAT_SERVDSC;
|
|
||||||
m_atapi_regs[ATAPI_REG_INTREASON] = ATAPI_INTREASON_IO;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//mame_printf_debug("ATAPI: dropping DRQ\n");
|
|
||||||
m_atapi_regs[ATAPI_REG_CMDSTATUS] = 0;
|
|
||||||
m_atapi_regs[ATAPI_REG_INTREASON] = ATAPI_INTREASON_IO;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_atapi_regs[ATAPI_REG_COUNTLOW] = m_atapi_xferlen & 0xff;
|
|
||||||
m_atapi_regs[ATAPI_REG_COUNTHIGH] = (m_atapi_xferlen>>8)&0xff;
|
|
||||||
|
|
||||||
m_psxirq->intin10(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if( m_atapi_data_ptr < m_atapi_data_len )
|
|
||||||
{
|
|
||||||
data = m_atapi_data[m_atapi_data_ptr++];
|
|
||||||
data |= ( m_atapi_data[m_atapi_data_ptr++] << 8 );
|
|
||||||
if( m_atapi_data_ptr >= m_atapi_data_len )
|
|
||||||
{
|
|
||||||
// verboselog(2, "atapi_r: read all bytes\n" );
|
|
||||||
m_atapi_data_ptr = 0;
|
|
||||||
m_atapi_data_len = 0;
|
|
||||||
|
|
||||||
if( m_atapi_xferlen == 0 )
|
|
||||||
{
|
|
||||||
m_atapi_regs[ATAPI_REG_CMDSTATUS] = 0;
|
|
||||||
m_atapi_regs[ATAPI_REG_INTREASON] = ATAPI_INTREASON_IO;
|
|
||||||
m_psxirq->intin10(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
data = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
data = m_atapi_regs[offset];
|
|
||||||
|
|
||||||
switch( offset )
|
|
||||||
{
|
|
||||||
case ATAPI_REG_DATA:
|
|
||||||
verboselog(1, "atapi_r: data=%02x\n", data );
|
|
||||||
break;
|
|
||||||
case ATAPI_REG_ERRFEAT:
|
|
||||||
verboselog(1, "atapi_r: errfeat=%02x\n", data );
|
|
||||||
break;
|
|
||||||
case ATAPI_REG_INTREASON:
|
|
||||||
verboselog(1, "atapi_r: intreason=%02x\n", data );
|
|
||||||
break;
|
|
||||||
case ATAPI_REG_SAMTAG:
|
|
||||||
verboselog(1, "atapi_r: samtag=%02x\n", data );
|
|
||||||
break;
|
|
||||||
case ATAPI_REG_COUNTLOW:
|
|
||||||
verboselog(1, "atapi_r: countlow=%02x\n", data );
|
|
||||||
break;
|
|
||||||
case ATAPI_REG_COUNTHIGH:
|
|
||||||
verboselog(1, "atapi_r: counthigh=%02x\n", data );
|
|
||||||
break;
|
|
||||||
case ATAPI_REG_DRIVESEL:
|
|
||||||
verboselog(1, "atapi_r: drivesel=%02x\n", data );
|
|
||||||
break;
|
|
||||||
case ATAPI_REG_CMDSTATUS:
|
|
||||||
verboselog(1, "atapi_r: cmdstatus=%02x\n", data );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// mame_printf_debug("ATAPI: read reg %d = %x (PC=%x)\n", reg, data, m_maincpu->pc());
|
|
||||||
}
|
|
||||||
|
|
||||||
verboselog(2, "atapi_r( %08x, %08x ) %08x\n", offset, mem_mask, data );
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
WRITE16_MEMBER(ksys573_state::atapi_w)
|
|
||||||
{
|
|
||||||
verboselog(2, "atapi_w( %08x, %08x, %08x )\n", offset, mem_mask, data );
|
|
||||||
|
|
||||||
if (offset == 0 && mem_mask == 0xffff) // word-wide command write
|
|
||||||
{
|
|
||||||
verboselog(2, "atapi_w: data=%04x\n", data );
|
|
||||||
|
|
||||||
// mame_printf_debug("ATAPI: packet write %04x\n", data);
|
|
||||||
m_atapi_data[m_atapi_data_ptr++] = data & 0xff;
|
|
||||||
m_atapi_data[m_atapi_data_ptr++] = data >> 8;
|
|
||||||
|
|
||||||
if (m_atapi_cdata_wait)
|
|
||||||
{
|
|
||||||
// mame_printf_debug("ATAPI: waiting, ptr %d wait %d\n", m_atapi_data_ptr, m_atapi_cdata_wait);
|
|
||||||
if (m_atapi_data_ptr == m_atapi_cdata_wait)
|
|
||||||
{
|
|
||||||
// send it to the device
|
|
||||||
m_cr589->WriteData( m_atapi_data, m_atapi_cdata_wait );
|
|
||||||
|
|
||||||
// assert IRQ
|
|
||||||
m_psxirq->intin10(1);
|
|
||||||
|
|
||||||
// not sure here, but clear DRQ at least?
|
|
||||||
m_atapi_regs[ATAPI_REG_CMDSTATUS] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
else if ( m_atapi_data_ptr == 12 )
|
|
||||||
{
|
|
||||||
int phase;
|
|
||||||
|
|
||||||
verboselog(2, "atapi_w: command %02x\n", m_atapi_data[0]&0xff );
|
|
||||||
|
|
||||||
// reset data pointer for reading SCSI results
|
|
||||||
m_atapi_data_ptr = 0;
|
|
||||||
m_atapi_data_len = 0;
|
|
||||||
|
|
||||||
// send it to the SCSI device
|
|
||||||
m_cr589->SetCommand( m_atapi_data, 12 );
|
|
||||||
m_cr589->ExecCommand( &m_atapi_xferlen );
|
|
||||||
m_cr589->GetPhase( &phase );
|
|
||||||
|
|
||||||
if (m_atapi_xferlen != -1)
|
|
||||||
{
|
|
||||||
// mame_printf_debug("ATAPI: SCSI command %02x returned %d bytes from the device\n", m_atapi_data[0]&0xff, m_atapi_xferlen);
|
|
||||||
|
|
||||||
// store the returned command length in the ATAPI regs, splitting into
|
|
||||||
// multiple transfers if necessary
|
|
||||||
m_atapi_xfermod = 0;
|
|
||||||
if (m_atapi_xferlen > MAX_TRANSFER_SIZE)
|
|
||||||
{
|
|
||||||
m_atapi_xfermod = m_atapi_xferlen - MAX_TRANSFER_SIZE;
|
|
||||||
m_atapi_xferlen = MAX_TRANSFER_SIZE;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_atapi_regs[ATAPI_REG_COUNTLOW] = m_atapi_xferlen & 0xff;
|
|
||||||
m_atapi_regs[ATAPI_REG_COUNTHIGH] = (m_atapi_xferlen>>8)&0xff;
|
|
||||||
|
|
||||||
if (m_atapi_xferlen == 0)
|
|
||||||
{
|
|
||||||
// if no data to return, set the registers properly
|
|
||||||
m_atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_DRDY;
|
|
||||||
m_atapi_regs[ATAPI_REG_INTREASON] = ATAPI_INTREASON_IO|ATAPI_INTREASON_COMMAND;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// indicate data ready: set DRQ and DMA ready, and IO in INTREASON
|
|
||||||
m_atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_DRQ | ATAPI_STAT_SERVDSC;
|
|
||||||
m_atapi_regs[ATAPI_REG_INTREASON] = ATAPI_INTREASON_IO;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch( phase )
|
|
||||||
{
|
|
||||||
case SCSI_PHASE_DATAOUT:
|
|
||||||
m_atapi_cdata_wait = m_atapi_xferlen;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// perform special ATAPI processing of certain commands
|
|
||||||
switch (m_atapi_data[0]&0xff)
|
|
||||||
{
|
|
||||||
case 0x00: // BUS RESET / TEST UNIT READY
|
|
||||||
case 0xbb: // SET CDROM SPEED
|
|
||||||
m_atapi_regs[ATAPI_REG_CMDSTATUS] = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x45: // PLAY
|
|
||||||
m_atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_BSY;
|
|
||||||
m_atapi_timer->adjust( m_maincpu->cycles_to_attotime( ATAPI_CYCLES_PER_SECTOR ) );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// assert IRQ
|
|
||||||
m_psxirq->intin10(1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// mame_printf_debug("ATAPI: SCSI device returned error!\n");
|
|
||||||
|
|
||||||
m_atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_DRQ | ATAPI_STAT_CHECK;
|
|
||||||
m_atapi_regs[ATAPI_REG_ERRFEAT] = 0x50; // sense key = ILLEGAL REQUEST
|
|
||||||
m_atapi_regs[ATAPI_REG_COUNTLOW] = 0;
|
|
||||||
m_atapi_regs[ATAPI_REG_COUNTHIGH] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
switch( offset )
|
|
||||||
{
|
|
||||||
case ATAPI_REG_DATA:
|
|
||||||
verboselog(1, "atapi_w: data=%02x\n", data );
|
|
||||||
break;
|
|
||||||
case ATAPI_REG_ERRFEAT:
|
|
||||||
verboselog(1, "atapi_w: errfeat=%02x\n", data );
|
|
||||||
break;
|
|
||||||
case ATAPI_REG_INTREASON:
|
|
||||||
verboselog(1, "atapi_w: intreason=%02x\n", data );
|
|
||||||
break;
|
|
||||||
case ATAPI_REG_SAMTAG:
|
|
||||||
verboselog(1, "atapi_w: samtag=%02x\n", data );
|
|
||||||
break;
|
|
||||||
case ATAPI_REG_COUNTLOW:
|
|
||||||
verboselog(1, "atapi_w: countlow=%02x\n", data );
|
|
||||||
break;
|
|
||||||
case ATAPI_REG_COUNTHIGH:
|
|
||||||
verboselog(1, "atapi_w: counthigh=%02x\n", data );
|
|
||||||
break;
|
|
||||||
case ATAPI_REG_DRIVESEL:
|
|
||||||
verboselog(1, "atapi_w: drivesel=%02x\n", data );
|
|
||||||
break;
|
|
||||||
case ATAPI_REG_CMDSTATUS:
|
|
||||||
verboselog(1, "atapi_w: cmdstatus=%02x\n", data );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_atapi_regs[offset] = data;
|
|
||||||
// mame_printf_debug("ATAPI: reg %d = %x (offset %x mask %x PC=%x)\n", reg, data, offset, mem_mask, m_maincpu->pc());
|
|
||||||
|
|
||||||
if (offset == ATAPI_REG_CMDSTATUS)
|
|
||||||
{
|
|
||||||
// mame_printf_debug("ATAPI command %x issued! (PC=%x)\n", data, m_maincpu->pc());
|
|
||||||
|
|
||||||
switch (data)
|
|
||||||
{
|
|
||||||
case 0xa0: // PACKET
|
|
||||||
m_atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_DRQ;
|
|
||||||
m_atapi_regs[ATAPI_REG_INTREASON] = ATAPI_INTREASON_COMMAND;
|
|
||||||
|
|
||||||
m_atapi_data_ptr = 0;
|
|
||||||
m_atapi_data_len = 0;
|
|
||||||
|
|
||||||
/* we have no data */
|
|
||||||
m_atapi_xferlen = 0;
|
|
||||||
m_atapi_xfermod = 0;
|
|
||||||
|
|
||||||
m_atapi_cdata_wait = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xa1: // IDENTIFY PACKET DEVICE
|
|
||||||
m_atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_DRQ;
|
|
||||||
|
|
||||||
m_atapi_data_ptr = 0;
|
|
||||||
m_atapi_data_len = 512;
|
|
||||||
|
|
||||||
/* we have no data */
|
|
||||||
m_atapi_xferlen = 0;
|
|
||||||
m_atapi_xfermod = 0;
|
|
||||||
|
|
||||||
memset( m_atapi_data, 0, m_atapi_data_len );
|
|
||||||
|
|
||||||
m_atapi_data[ 0 ^ 1 ] = 0x85; // ATAPI device, cmd set 5 compliant, DRQ within 3 ms of PACKET command
|
|
||||||
m_atapi_data[ 1 ^ 1 ] = 0x00;
|
|
||||||
|
|
||||||
memset( &m_atapi_data[ 46 ], ' ', 8 );
|
|
||||||
m_atapi_data[ 46 ^ 1 ] = '1';
|
|
||||||
m_atapi_data[ 47 ^ 1 ] = '.';
|
|
||||||
m_atapi_data[ 48 ^ 1 ] = '0';
|
|
||||||
|
|
||||||
memset( &m_atapi_data[ 54 ], ' ', 40 );
|
|
||||||
m_atapi_data[ 54 ^ 1 ] = 'M';
|
|
||||||
m_atapi_data[ 55 ^ 1 ] = 'A';
|
|
||||||
m_atapi_data[ 56 ^ 1 ] = 'T';
|
|
||||||
m_atapi_data[ 57 ^ 1 ] = 'S';
|
|
||||||
m_atapi_data[ 58 ^ 1 ] = 'H';
|
|
||||||
m_atapi_data[ 59 ^ 1 ] = 'I';
|
|
||||||
m_atapi_data[ 60 ^ 1 ] = 'T';
|
|
||||||
m_atapi_data[ 61 ^ 1 ] = 'A';
|
|
||||||
m_atapi_data[ 62 ^ 1 ] = ' ';
|
|
||||||
m_atapi_data[ 63 ^ 1 ] = 'C';
|
|
||||||
m_atapi_data[ 64 ^ 1 ] = 'R';
|
|
||||||
m_atapi_data[ 65 ^ 1 ] = '-';
|
|
||||||
m_atapi_data[ 66 ^ 1 ] = '5';
|
|
||||||
m_atapi_data[ 67 ^ 1 ] = '8';
|
|
||||||
m_atapi_data[ 68 ^ 1 ] = '9';
|
|
||||||
m_atapi_data[ 69 ^ 1 ] = ' ';
|
|
||||||
|
|
||||||
m_atapi_data[ 98 ^ 1 ] = 0x04; // IORDY may be disabled
|
|
||||||
m_atapi_data[ 99 ^ 1 ] = 0x00;
|
|
||||||
|
|
||||||
m_atapi_regs[ATAPI_REG_COUNTLOW] = 0;
|
|
||||||
m_atapi_regs[ATAPI_REG_COUNTHIGH] = 2;
|
|
||||||
|
|
||||||
m_psxirq->intin10(1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xef: // SET FEATURES
|
|
||||||
m_atapi_regs[ATAPI_REG_CMDSTATUS] = 0;
|
|
||||||
|
|
||||||
m_atapi_data_ptr = 0;
|
|
||||||
m_atapi_data_len = 0;
|
|
||||||
|
|
||||||
m_psxirq->intin10(1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
mame_printf_debug("ATAPI: Unknown IDE command %x\n", data);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ksys573_state::atapi_init()
|
WRITE_LINE_MEMBER(ksys573_state::ata_interrupt)
|
||||||
{
|
{
|
||||||
m_atapi_regs[ATAPI_REG_CMDSTATUS] = 0;
|
m_psxirq->intin10(state);
|
||||||
m_atapi_regs[ATAPI_REG_ERRFEAT] = 1;
|
|
||||||
m_atapi_regs[ATAPI_REG_COUNTLOW] = 0x14;
|
|
||||||
m_atapi_regs[ATAPI_REG_COUNTHIGH] = 0xeb;
|
|
||||||
|
|
||||||
m_atapi_data_ptr = 0;
|
|
||||||
m_atapi_data_len = 0;
|
|
||||||
m_atapi_cdata_wait = 0;
|
|
||||||
|
|
||||||
m_atapi_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(ksys573_state::atapi_xfer_end),this));
|
|
||||||
m_atapi_timer->adjust(attotime::never);
|
|
||||||
|
|
||||||
m_available_cdroms[ 0 ] = cdrom_open( get_disk_handle( machine(), ":cdrom0" ) );
|
|
||||||
m_available_cdroms[ 1 ] = cdrom_open( get_disk_handle( machine(), ":cdrom1" ) );
|
|
||||||
|
|
||||||
save_item( NAME(m_atapi_regs) );
|
|
||||||
save_item( NAME(m_atapi_data) );
|
|
||||||
save_item( NAME(m_atapi_data_ptr) );
|
|
||||||
save_item( NAME(m_atapi_data_len) );
|
|
||||||
save_item( NAME(m_atapi_xferlen) );
|
|
||||||
save_item( NAME(m_atapi_xferbase) );
|
|
||||||
save_item( NAME(m_atapi_cdata_wait) );
|
|
||||||
save_item( NAME(m_atapi_xfermod) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER(ksys573_state::atapi_reset_w)
|
WRITE16_MEMBER(ksys573_state::atapi_reset_w)
|
||||||
{
|
{
|
||||||
UINT8 *atapi_regs = m_atapi_regs;
|
if (!(data&1))
|
||||||
|
|
||||||
verboselog(2, "atapi_reset_w( %08x, %08x, %08x )\n", offset, mem_mask, data );
|
|
||||||
|
|
||||||
if (data)
|
|
||||||
{
|
{
|
||||||
verboselog(2, "atapi_reset_w: reset\n" );
|
m_ata->reset();
|
||||||
|
|
||||||
// mame_printf_debug("ATAPI reset\n");
|
|
||||||
|
|
||||||
atapi_regs[ATAPI_REG_CMDSTATUS] = 0;
|
|
||||||
atapi_regs[ATAPI_REG_ERRFEAT] = 1;
|
|
||||||
atapi_regs[ATAPI_REG_COUNTLOW] = 0x14;
|
|
||||||
atapi_regs[ATAPI_REG_COUNTHIGH] = 0xeb;
|
|
||||||
|
|
||||||
m_atapi_data_ptr = 0;
|
|
||||||
m_atapi_data_len = 0;
|
|
||||||
m_atapi_cdata_wait = 0;
|
|
||||||
|
|
||||||
m_atapi_xferlen = 0;
|
|
||||||
m_atapi_xfermod = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1252,11 +794,9 @@ void ksys573_state::cdrom_dma_write( UINT32 *ram, UINT32 n_address, INT32 n_size
|
|||||||
// mame_printf_debug("DMA write: address %08x size %08x\n", n_address, n_size);
|
// mame_printf_debug("DMA write: address %08x size %08x\n", n_address, n_size);
|
||||||
|
|
||||||
m_atapi_xferbase = n_address;
|
m_atapi_xferbase = n_address;
|
||||||
|
m_atapi_xfersize = n_size;
|
||||||
verboselog(2, "atapi_xfer_end: %d %d\n", m_atapi_xferlen, m_atapi_xfermod );
|
|
||||||
|
|
||||||
// set a transfer complete timer (Note: CYCLES_PER_SECTOR can't be lower than 2000 or the BIOS ends up "out of order")
|
// set a transfer complete timer (Note: CYCLES_PER_SECTOR can't be lower than 2000 or the BIOS ends up "out of order")
|
||||||
m_atapi_timer->adjust(m_maincpu->cycles_to_attotime((ATAPI_CYCLES_PER_SECTOR * (m_atapi_xferlen/2048))));
|
m_atapi_timer->adjust(m_maincpu->cycles_to_attotime((ATAPI_CYCLES_PER_SECTOR * (n_size/512))));
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE16_MEMBER(ksys573_state::security_w)
|
WRITE16_MEMBER(ksys573_state::security_w)
|
||||||
@ -1275,7 +815,7 @@ READ16_MEMBER(ksys573_state::security_r)
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ksys573_state::update_mode()
|
void ksys573_state::update_disc()
|
||||||
{
|
{
|
||||||
int cd = m_cd->read();
|
int cd = m_cd->read();
|
||||||
cdrom_file *new_cdrom;
|
cdrom_file *new_cdrom;
|
||||||
@ -1289,20 +829,28 @@ void ksys573_state::update_mode()
|
|||||||
new_cdrom = m_available_cdroms[ 0 ];
|
new_cdrom = m_available_cdroms[ 0 ];
|
||||||
}
|
}
|
||||||
|
|
||||||
void *current_cdrom;
|
scsihle_device *image = machine().device<scsihle_device>("ata:0:cr589:device");
|
||||||
m_cr589->GetDevice( ¤t_cdrom );
|
if (image != NULL)
|
||||||
|
{
|
||||||
|
void *current_cdrom = NULL;
|
||||||
|
image->GetDevice( ¤t_cdrom );
|
||||||
|
|
||||||
if( current_cdrom != new_cdrom )
|
if( current_cdrom != new_cdrom )
|
||||||
{
|
{
|
||||||
current_cdrom = new_cdrom;
|
current_cdrom = new_cdrom;
|
||||||
|
|
||||||
m_cr589->SetDevice( new_cdrom );
|
image->SetDevice( new_cdrom );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ksys573_state::driver_start()
|
void ksys573_state::driver_start()
|
||||||
{
|
{
|
||||||
atapi_init();
|
m_atapi_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(ksys573_state::atapi_xfer_end),this));
|
||||||
|
m_atapi_timer->adjust(attotime::never);
|
||||||
|
|
||||||
|
m_available_cdroms[ 0 ] = cdrom_open( get_disk_handle( machine(), ":cdrom0" ) );
|
||||||
|
m_available_cdroms[ 1 ] = cdrom_open( get_disk_handle( machine(), ":cdrom1" ) );
|
||||||
|
|
||||||
m_n_security_control = 0;
|
m_n_security_control = 0;
|
||||||
m_control = 0;
|
m_control = 0;
|
||||||
@ -1313,12 +861,12 @@ void ksys573_state::driver_start()
|
|||||||
|
|
||||||
MACHINE_RESET_MEMBER(ksys573_state,konami573)
|
MACHINE_RESET_MEMBER(ksys573_state,konami573)
|
||||||
{
|
{
|
||||||
update_mode();
|
update_disc();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ksys573_state::sys573_vblank(screen_device &screen, bool vblank_state)
|
void ksys573_state::sys573_vblank(screen_device &screen, bool vblank_state)
|
||||||
{
|
{
|
||||||
update_mode();
|
update_disc();
|
||||||
|
|
||||||
/// TODO: emulate the memory controller board
|
/// TODO: emulate the memory controller board
|
||||||
if( strcmp( machine().system().name, "ddr2ml" ) == 0 )
|
if( strcmp( machine().system().name, "ddr2ml" ) == 0 )
|
||||||
@ -2548,9 +2096,19 @@ static double analogue_inputs_callback( device_t *device, UINT8 input )
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SLOT_INTERFACE_START(ksys573_ata_devices)
|
||||||
|
SLOT_INTERFACE("cr589", CR589)
|
||||||
|
SLOT_INTERFACE_END
|
||||||
|
|
||||||
SLOT_INTERFACE_START(slot_empty)
|
SLOT_INTERFACE_START(slot_empty)
|
||||||
SLOT_INTERFACE_END
|
SLOT_INTERFACE_END
|
||||||
|
|
||||||
|
static MACHINE_CONFIG_FRAGMENT( cr589_config )
|
||||||
|
MCFG_DEVICE_MODIFY("device:cdda")
|
||||||
|
MCFG_SOUND_ROUTE(0, "^^^^^lspeaker", 1.0)
|
||||||
|
MCFG_SOUND_ROUTE(1, "^^^^^rspeaker", 1.0)
|
||||||
|
MACHINE_CONFIG_END
|
||||||
|
|
||||||
static MACHINE_CONFIG_START( konami573, ksys573_state )
|
static MACHINE_CONFIG_START( konami573, ksys573_state )
|
||||||
/* basic machine hardware */
|
/* basic machine hardware */
|
||||||
MCFG_CPU_ADD( "maincpu", CXD8530CQ, XTAL_67_7376MHz )
|
MCFG_CPU_ADD( "maincpu", CXD8530CQ, XTAL_67_7376MHz )
|
||||||
@ -2565,7 +2123,12 @@ static MACHINE_CONFIG_START( konami573, ksys573_state )
|
|||||||
MCFG_MACHINE_RESET_OVERRIDE(ksys573_state, konami573)
|
MCFG_MACHINE_RESET_OVERRIDE(ksys573_state, konami573)
|
||||||
|
|
||||||
MCFG_DEVICE_ADD("mb89371", MB89371, 0)
|
MCFG_DEVICE_ADD("mb89371", MB89371, 0)
|
||||||
MCFG_DEVICE_ADD("cdrom", CR589, 0)
|
|
||||||
|
MCFG_ATA_INTERFACE_ADD("ata", ksys573_ata_devices, "cr589", NULL, true)
|
||||||
|
MCFG_ATA_INTERFACE_IRQ_HANDLER(WRITELINE(ksys573_state, ata_interrupt))
|
||||||
|
|
||||||
|
MCFG_DEVICE_MODIFY("ata:0")
|
||||||
|
MCFG_DEVICE_CARD_MACHINE_CONFIG( "cr589", cr589_config )
|
||||||
|
|
||||||
MCFG_DEVICE_ADD("maincpu:sio1:cassette", KONAMI573_CASSETTE_SLOT_SERIAL, 0)
|
MCFG_DEVICE_ADD("maincpu:sio1:cassette", KONAMI573_CASSETTE_SLOT_SERIAL, 0)
|
||||||
|
|
||||||
@ -2605,10 +2168,6 @@ static MACHINE_CONFIG_START( konami573, ksys573_state )
|
|||||||
MCFG_SOUND_ROUTE( 0, "lspeaker", 1.0 )
|
MCFG_SOUND_ROUTE( 0, "lspeaker", 1.0 )
|
||||||
MCFG_SOUND_ROUTE( 1, "rspeaker", 1.0 )
|
MCFG_SOUND_ROUTE( 1, "rspeaker", 1.0 )
|
||||||
|
|
||||||
MCFG_SOUND_MODIFY( "cdrom:cdda" )
|
|
||||||
MCFG_SOUND_ROUTE( 0, "^^lspeaker", 1.0 )
|
|
||||||
MCFG_SOUND_ROUTE( 1, "^^rspeaker", 1.0 )
|
|
||||||
|
|
||||||
MCFG_M48T58_ADD( "m48t58" )
|
MCFG_M48T58_ADD( "m48t58" )
|
||||||
|
|
||||||
MCFG_DEVICE_ADD( "adc0834", ADC0834, 0 )
|
MCFG_DEVICE_ADD( "adc0834", ADC0834, 0 )
|
||||||
|
Loading…
Reference in New Issue
Block a user