Started converting i/o to 16 bit (nw)

This commit is contained in:
smf- 2013-05-21 12:40:50 +00:00
parent 996da030ac
commit 83685d79bc

View File

@ -559,7 +559,7 @@ public:
int m_atapi_cdata_wait; int m_atapi_cdata_wait;
int m_atapi_xfermod; int m_atapi_xfermod;
UINT32 m_n_security_control; UINT16 m_n_security_control;
void (ksys573_state::*m_security_callback)( int data ); void (ksys573_state::*m_security_callback)( int data );
UINT8 m_gx700pwbf_output_data[ 4 ]; UINT8 m_gx700pwbf_output_data[ 4 ];
@ -607,16 +607,16 @@ public:
DECLARE_CUSTOM_INPUT_MEMBER(gn845pwbb_read); DECLARE_CUSTOM_INPUT_MEMBER(gn845pwbb_read);
DECLARE_CUSTOM_INPUT_MEMBER(gunmania_tank_shutter_sensor); DECLARE_CUSTOM_INPUT_MEMBER(gunmania_tank_shutter_sensor);
DECLARE_CUSTOM_INPUT_MEMBER(gunmania_cable_holder_sensor); DECLARE_CUSTOM_INPUT_MEMBER(gunmania_cable_holder_sensor);
DECLARE_WRITE32_MEMBER(mb89371_w); DECLARE_WRITE16_MEMBER(mb89371_w);
DECLARE_READ32_MEMBER(mb89371_r); DECLARE_READ16_MEMBER(mb89371_r);
DECLARE_READ32_MEMBER(jamma_r); DECLARE_READ32_MEMBER(jamma_r);
DECLARE_READ32_MEMBER(control_r); DECLARE_READ16_MEMBER(control_r);
DECLARE_WRITE32_MEMBER(control_w); DECLARE_WRITE16_MEMBER(control_w);
DECLARE_READ32_MEMBER(atapi_r); DECLARE_READ16_MEMBER(atapi_r);
DECLARE_WRITE32_MEMBER(atapi_w); DECLARE_WRITE16_MEMBER(atapi_w);
DECLARE_WRITE32_MEMBER(atapi_reset_w); DECLARE_WRITE16_MEMBER(atapi_reset_w);
DECLARE_WRITE32_MEMBER(security_w); DECLARE_WRITE16_MEMBER(security_w);
DECLARE_READ32_MEMBER(security_r); DECLARE_READ16_MEMBER(security_r);
DECLARE_READ16_MEMBER(flash_r); DECLARE_READ16_MEMBER(flash_r);
DECLARE_WRITE16_MEMBER(flash_w); DECLARE_WRITE16_MEMBER(flash_w);
DECLARE_READ32_MEMBER(ge765pwbba_r); DECLARE_READ32_MEMBER(ge765pwbba_r);
@ -688,15 +688,15 @@ void ATTR_PRINTF(3,4) ksys573_state::verboselog( int n_level, const char *s_fmt
} }
} }
WRITE32_MEMBER(ksys573_state::mb89371_w) WRITE16_MEMBER(ksys573_state::mb89371_w)
{ {
verboselog(2, "mb89371_w %08x %08x %08x\n", offset, mem_mask, data ); verboselog(2, "mb89371_w %04x %04x %04x\n", offset, mem_mask, data );
} }
READ32_MEMBER(ksys573_state::mb89371_r) READ16_MEMBER(ksys573_state::mb89371_r)
{ {
UINT32 data = 0xffffffff; UINT32 data = 0xffff;
verboselog(2, "mb89371_r %08x %08x %08x\n", offset, mem_mask, data ); verboselog(2, "mb89371_r %04x %04x %04x\n", offset, mem_mask, data );
return data; return data;
} }
@ -731,20 +731,18 @@ READ32_MEMBER(ksys573_state::jamma_r)
return data; return data;
} }
READ32_MEMBER(ksys573_state::control_r) READ16_MEMBER(ksys573_state::control_r)
{ {
verboselog(2, "control_r( %08x, %08x ) %08x\n", offset, mem_mask, m_control ); verboselog(2, "control_r( %08x, %08x ) %08x\n", offset, mem_mask, m_control );
return m_control; return m_control;
} }
WRITE32_MEMBER(ksys573_state::control_w) WRITE16_MEMBER(ksys573_state::control_w)
{ {
UINT32 control;
int old_bank = m_flash_bank; int old_bank = m_flash_bank;
COMBINE_DATA(&m_control); COMBINE_DATA(&m_control);
control = m_control;
verboselog(2, "control_w( %08x, %08x, %08x )\n", offset, mem_mask, data ); verboselog(2, "control_w( %08x, %08x, %08x )\n", offset, mem_mask, data );
@ -753,39 +751,38 @@ WRITE32_MEMBER(ksys573_state::control_w)
// zs01 only, others are reached through security_w // zs01 only, others are reached through security_w
device_secure_serial_flash *secflash = machine().device<device_secure_serial_flash>(m_security_cart_number ? "game_eeprom" : "install_eeprom"); device_secure_serial_flash *secflash = machine().device<device_secure_serial_flash>(m_security_cart_number ? "game_eeprom" : "install_eeprom");
if( dynamic_cast<zs01_device *>(secflash) ) if( dynamic_cast<zs01_device *>(secflash) )
secflash->sda_w( !( ( control >> 6 ) & 1 ) ); /* 0x40 */ secflash->sda_w( !( ( m_control >> 6 ) & 1 ) ); /* 0x40 */
if( m_flash_device[0][0] != NULL && ( control & ~0x43 ) == 0x00 ) if( m_flash_device[0][0] != NULL && ( m_control & ~0x43 ) == 0x00 )
{ {
m_flash_bank = (0 << 8) + ( ( control & 3 ) * 2 ); m_flash_bank = (0 << 8) + ( ( m_control & 3 ) * 2 );
if( m_flash_bank != old_bank ) verboselog(1, "onboard %d\n", control & 3 ); if( m_flash_bank != old_bank ) verboselog(1, "onboard %d\n", m_control & 3 );
} }
else if( m_flash_device[1][0] != NULL && ( control & ~0x47 ) == 0x10 ) else if( m_flash_device[1][0] != NULL && ( m_control & ~0x47 ) == 0x10 )
{ {
m_flash_bank = (1 << 8) + ( ( control & 7 ) * 2 ); m_flash_bank = (1 << 8) + ( ( m_control & 7 ) * 2 );
if( m_flash_bank != old_bank ) verboselog(1, "pccard1 %d\n", control & 7 ); if( m_flash_bank != old_bank ) verboselog(1, "pccard1 %d\n", m_control & 7 );
} }
else if( m_flash_device[2][0] != NULL && ( control & ~0x47 ) == 0x20 ) else if( m_flash_device[2][0] != NULL && ( m_control & ~0x47 ) == 0x20 )
{ {
m_flash_bank = (2 << 8) + ( ( control & 7 ) * 2 ); m_flash_bank = (2 << 8) + ( ( m_control & 7 ) * 2 );
if( m_flash_bank != old_bank ) verboselog(1, "pccard2 %d\n", control & 7 ); if( m_flash_bank != old_bank ) verboselog(1, "pccard2 %d\n", m_control & 7 );
} }
else if( m_flash_device[3][0] != NULL && ( control & ~0x47 ) == 0x20 ) else if( m_flash_device[3][0] != NULL && ( m_control & ~0x47 ) == 0x20 )
{ {
m_flash_bank = (3 << 8) + ( ( control & 7 ) * 2 ); m_flash_bank = (3 << 8) + ( ( m_control & 7 ) * 2 );
if( m_flash_bank != old_bank ) verboselog(1, "pccard3 %d\n", control & 7 ); if( m_flash_bank != old_bank ) verboselog(1, "pccard3 %d\n", m_control & 7 );
} }
else if( m_flash_device[4][0] != NULL && ( control & ~0x47 ) == 0x28 ) else if( m_flash_device[4][0] != NULL && ( m_control & ~0x47 ) == 0x28 )
{ {
m_flash_bank = (4 << 8) + ( ( control & 7 ) * 2 ); m_flash_bank = (4 << 8) + ( ( m_control & 7 ) * 2 );
if( m_flash_bank != old_bank ) verboselog(1, "pccard4 %d\n", control & 7 ); if( m_flash_bank != old_bank ) verboselog(1, "pccard4 %d\n", m_control & 7 );
} }
} }
TIMER_CALLBACK_MEMBER(ksys573_state::atapi_xfer_end) TIMER_CALLBACK_MEMBER(ksys573_state::atapi_xfer_end)
{ {
UINT32 *p_n_psxram = m_p_n_psxram; UINT32 *p_n_psxram = m_p_n_psxram;
UINT8 *atapi_regs = m_atapi_regs;
int i, n_state; int i, n_state;
UINT8 sector_buffer[ 4096 ]; UINT8 sector_buffer[ 4096 ];
@ -832,16 +829,16 @@ TIMER_CALLBACK_MEMBER(ksys573_state::atapi_xfer_end)
if (m_atapi_xferlen > 0) if (m_atapi_xferlen > 0)
{ {
//mame_printf_debug("ATAPI: starting next piece of multi-part transfer\n"); //mame_printf_debug("ATAPI: starting next piece of multi-part transfer\n");
atapi_regs[ATAPI_REG_COUNTLOW] = m_atapi_xferlen & 0xff; m_atapi_regs[ATAPI_REG_COUNTLOW] = m_atapi_xferlen & 0xff;
atapi_regs[ATAPI_REG_COUNTHIGH] = (m_atapi_xferlen>>8)&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)))); m_atapi_timer->adjust(m_maincpu->cycles_to_attotime((ATAPI_CYCLES_PER_SECTOR * (m_atapi_xferlen/2048))));
} }
else else
{ {
//mame_printf_debug("ATAPI: Transfer completed, dropping DRQ\n"); //mame_printf_debug("ATAPI: Transfer completed, dropping DRQ\n");
atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_DRDY; m_atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_DRDY;
atapi_regs[ATAPI_REG_INTREASON] = ATAPI_INTREASON_IO | ATAPI_INTREASON_COMMAND; m_atapi_regs[ATAPI_REG_INTREASON] = ATAPI_INTREASON_IO | ATAPI_INTREASON_COMMAND;
} }
m_psxirq->intin10(1); m_psxirq->intin10(1);
@ -849,12 +846,11 @@ TIMER_CALLBACK_MEMBER(ksys573_state::atapi_xfer_end)
verboselog(2, "atapi_xfer_end: %d %d\n", m_atapi_xferlen, m_atapi_xfermod ); verboselog(2, "atapi_xfer_end: %d %d\n", m_atapi_xferlen, m_atapi_xfermod );
} }
READ32_MEMBER(ksys573_state::atapi_r) READ16_MEMBER(ksys573_state::atapi_r)
{ {
UINT8 *atapi_regs = m_atapi_regs; int data;
int reg, data;
if (mem_mask == 0x0000ffff) // word-wide command read if (offset == 0 && mem_mask == 0xffff) // word-wide command read
{ {
// mame_printf_debug("ATAPI: packet read = %04x\n", atapi_data[atapi_data_ptr]); // mame_printf_debug("ATAPI: packet read = %04x\n", atapi_data[atapi_data_ptr]);
@ -882,18 +878,18 @@ READ32_MEMBER(ksys573_state::atapi_r)
verboselog(2, "atapi_r: atapi_xferlen=%d\n", m_atapi_xferlen ); verboselog(2, "atapi_r: atapi_xferlen=%d\n", m_atapi_xferlen );
if( m_atapi_xferlen != 0 ) if( m_atapi_xferlen != 0 )
{ {
atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_DRQ | ATAPI_STAT_SERVDSC; m_atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_DRQ | ATAPI_STAT_SERVDSC;
atapi_regs[ATAPI_REG_INTREASON] = ATAPI_INTREASON_IO; m_atapi_regs[ATAPI_REG_INTREASON] = ATAPI_INTREASON_IO;
} }
else else
{ {
//mame_printf_debug("ATAPI: dropping DRQ\n"); //mame_printf_debug("ATAPI: dropping DRQ\n");
atapi_regs[ATAPI_REG_CMDSTATUS] = 0; m_atapi_regs[ATAPI_REG_CMDSTATUS] = 0;
atapi_regs[ATAPI_REG_INTREASON] = ATAPI_INTREASON_IO; m_atapi_regs[ATAPI_REG_INTREASON] = ATAPI_INTREASON_IO;
} }
atapi_regs[ATAPI_REG_COUNTLOW] = m_atapi_xferlen & 0xff; m_atapi_regs[ATAPI_REG_COUNTLOW] = m_atapi_xferlen & 0xff;
atapi_regs[ATAPI_REG_COUNTHIGH] = (m_atapi_xferlen>>8)&0xff; m_atapi_regs[ATAPI_REG_COUNTHIGH] = (m_atapi_xferlen>>8)&0xff;
m_psxirq->intin10(1); m_psxirq->intin10(1);
} }
@ -910,8 +906,8 @@ READ32_MEMBER(ksys573_state::atapi_r)
if( m_atapi_xferlen == 0 ) if( m_atapi_xferlen == 0 )
{ {
atapi_regs[ATAPI_REG_CMDSTATUS] = 0; m_atapi_regs[ATAPI_REG_CMDSTATUS] = 0;
atapi_regs[ATAPI_REG_INTREASON] = ATAPI_INTREASON_IO; m_atapi_regs[ATAPI_REG_INTREASON] = ATAPI_INTREASON_IO;
m_psxirq->intin10(1); m_psxirq->intin10(1);
} }
} }
@ -923,18 +919,9 @@ READ32_MEMBER(ksys573_state::atapi_r)
} }
else else
{ {
int shift; data = m_atapi_regs[offset];
reg = offset<<1;
shift = 0;
if (mem_mask == 0x00ff0000)
{
reg += 1;
shift = 16;
}
data = atapi_regs[reg]; switch( offset )
switch( reg )
{ {
case ATAPI_REG_DATA: case ATAPI_REG_DATA:
verboselog(1, "atapi_r: data=%02x\n", data ); verboselog(1, "atapi_r: data=%02x\n", data );
@ -963,29 +950,23 @@ READ32_MEMBER(ksys573_state::atapi_r)
} }
// mame_printf_debug("ATAPI: read reg %d = %x (PC=%x)\n", reg, data, space.device().safe_pc()); // mame_printf_debug("ATAPI: read reg %d = %x (PC=%x)\n", reg, data, space.device().safe_pc());
data <<= shift;
} }
verboselog(2, "atapi_r( %08x, %08x ) %08x\n", offset, mem_mask, data ); verboselog(2, "atapi_r( %08x, %08x ) %08x\n", offset, mem_mask, data );
return data; return data;
} }
WRITE32_MEMBER(ksys573_state::atapi_w) WRITE16_MEMBER(ksys573_state::atapi_w)
{ {
UINT8 *atapi_regs = m_atapi_regs;
UINT8 *atapi_data = m_atapi_data;
int reg;
verboselog(2, "atapi_w( %08x, %08x, %08x )\n", offset, mem_mask, data ); verboselog(2, "atapi_w( %08x, %08x, %08x )\n", offset, mem_mask, data );
if (mem_mask == 0x0000ffff) // word-wide command write if (offset == 0 && mem_mask == 0xffff) // word-wide command write
{ {
verboselog(2, "atapi_w: data=%04x\n", data ); verboselog(2, "atapi_w: data=%04x\n", data );
// mame_printf_debug("ATAPI: packet write %04x\n", data); // mame_printf_debug("ATAPI: packet write %04x\n", data);
atapi_data[m_atapi_data_ptr++] = data & 0xff; m_atapi_data[m_atapi_data_ptr++] = data & 0xff;
atapi_data[m_atapi_data_ptr++] = data >> 8; m_atapi_data[m_atapi_data_ptr++] = data >> 8;
if (m_atapi_cdata_wait) if (m_atapi_cdata_wait)
{ {
@ -993,13 +974,13 @@ WRITE32_MEMBER(ksys573_state::atapi_w)
if (m_atapi_data_ptr == m_atapi_cdata_wait) if (m_atapi_data_ptr == m_atapi_cdata_wait)
{ {
// send it to the device // send it to the device
m_cr589->WriteData( atapi_data, m_atapi_cdata_wait ); m_cr589->WriteData( m_atapi_data, m_atapi_cdata_wait );
// assert IRQ // assert IRQ
m_psxirq->intin10(1); m_psxirq->intin10(1);
// not sure here, but clear DRQ at least? // not sure here, but clear DRQ at least?
atapi_regs[ATAPI_REG_CMDSTATUS] = 0; m_atapi_regs[ATAPI_REG_CMDSTATUS] = 0;
} }
} }
@ -1007,7 +988,7 @@ WRITE32_MEMBER(ksys573_state::atapi_w)
{ {
int phase; int phase;
verboselog(2, "atapi_w: command %02x\n", atapi_data[0]&0xff ); verboselog(2, "atapi_w: command %02x\n", m_atapi_data[0]&0xff );
// reset data pointer for reading SCSI results // reset data pointer for reading SCSI results
m_atapi_data_ptr = 0; m_atapi_data_ptr = 0;
@ -1020,7 +1001,7 @@ WRITE32_MEMBER(ksys573_state::atapi_w)
if (m_atapi_xferlen != -1) if (m_atapi_xferlen != -1)
{ {
// mame_printf_debug("ATAPI: SCSI command %02x returned %d bytes from the device\n", atapi_data[0]&0xff, m_atapi_xferlen); // 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 // store the returned command length in the ATAPI regs, splitting into
// multiple transfers if necessary // multiple transfers if necessary
@ -1031,20 +1012,20 @@ WRITE32_MEMBER(ksys573_state::atapi_w)
m_atapi_xferlen = MAX_TRANSFER_SIZE; m_atapi_xferlen = MAX_TRANSFER_SIZE;
} }
atapi_regs[ATAPI_REG_COUNTLOW] = m_atapi_xferlen & 0xff; m_atapi_regs[ATAPI_REG_COUNTLOW] = m_atapi_xferlen & 0xff;
atapi_regs[ATAPI_REG_COUNTHIGH] = (m_atapi_xferlen>>8)&0xff; m_atapi_regs[ATAPI_REG_COUNTHIGH] = (m_atapi_xferlen>>8)&0xff;
if (m_atapi_xferlen == 0) if (m_atapi_xferlen == 0)
{ {
// if no data to return, set the registers properly // if no data to return, set the registers properly
atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_DRDY; m_atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_DRDY;
atapi_regs[ATAPI_REG_INTREASON] = ATAPI_INTREASON_IO|ATAPI_INTREASON_COMMAND; m_atapi_regs[ATAPI_REG_INTREASON] = ATAPI_INTREASON_IO|ATAPI_INTREASON_COMMAND;
} }
else else
{ {
// indicate data ready: set DRQ and DMA ready, and IO in INTREASON // indicate data ready: set DRQ and DMA ready, and IO in INTREASON
atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_DRQ | ATAPI_STAT_SERVDSC; m_atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_DRQ | ATAPI_STAT_SERVDSC;
atapi_regs[ATAPI_REG_INTREASON] = ATAPI_INTREASON_IO; m_atapi_regs[ATAPI_REG_INTREASON] = ATAPI_INTREASON_IO;
} }
switch( phase ) switch( phase )
@ -1055,15 +1036,15 @@ WRITE32_MEMBER(ksys573_state::atapi_w)
} }
// perform special ATAPI processing of certain commands // perform special ATAPI processing of certain commands
switch (atapi_data[0]&0xff) switch (m_atapi_data[0]&0xff)
{ {
case 0x00: // BUS RESET / TEST UNIT READY case 0x00: // BUS RESET / TEST UNIT READY
case 0xbb: // SET CDROM SPEED case 0xbb: // SET CDROM SPEED
atapi_regs[ATAPI_REG_CMDSTATUS] = 0; m_atapi_regs[ATAPI_REG_CMDSTATUS] = 0;
break; break;
case 0x45: // PLAY case 0x45: // PLAY
atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_BSY; m_atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_BSY;
m_atapi_timer->adjust( downcast<cpu_device *>(&space.device())->cycles_to_attotime( ATAPI_CYCLES_PER_SECTOR ) ); m_atapi_timer->adjust( downcast<cpu_device *>(&space.device())->cycles_to_attotime( ATAPI_CYCLES_PER_SECTOR ) );
break; break;
} }
@ -1075,23 +1056,16 @@ WRITE32_MEMBER(ksys573_state::atapi_w)
{ {
// mame_printf_debug("ATAPI: SCSI device returned error!\n"); // mame_printf_debug("ATAPI: SCSI device returned error!\n");
atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_DRQ | ATAPI_STAT_CHECK; m_atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_DRQ | ATAPI_STAT_CHECK;
atapi_regs[ATAPI_REG_ERRFEAT] = 0x50; // sense key = ILLEGAL REQUEST m_atapi_regs[ATAPI_REG_ERRFEAT] = 0x50; // sense key = ILLEGAL REQUEST
atapi_regs[ATAPI_REG_COUNTLOW] = 0; m_atapi_regs[ATAPI_REG_COUNTLOW] = 0;
atapi_regs[ATAPI_REG_COUNTHIGH] = 0; m_atapi_regs[ATAPI_REG_COUNTHIGH] = 0;
} }
} }
} }
else else
{ {
reg = offset<<1; switch( offset )
if (mem_mask == 0x00ff0000)
{
reg += 1;
data >>= 16;
}
switch( reg )
{ {
case ATAPI_REG_DATA: case ATAPI_REG_DATA:
verboselog(1, "atapi_w: data=%02x\n", data ); verboselog(1, "atapi_w: data=%02x\n", data );
@ -1119,18 +1093,18 @@ WRITE32_MEMBER(ksys573_state::atapi_w)
break; break;
} }
atapi_regs[reg] = data; m_atapi_regs[offset] = data;
// mame_printf_debug("ATAPI: reg %d = %x (offset %x mask %x PC=%x)\n", reg, data, offset, mem_mask, space.device().safe_pc()); // mame_printf_debug("ATAPI: reg %d = %x (offset %x mask %x PC=%x)\n", reg, data, offset, mem_mask, space.device().safe_pc());
if (reg == ATAPI_REG_CMDSTATUS) if (offset == ATAPI_REG_CMDSTATUS)
{ {
// mame_printf_debug("ATAPI command %x issued! (PC=%x)\n", data, space.device().safe_pc()); // mame_printf_debug("ATAPI command %x issued! (PC=%x)\n", data, space.device().safe_pc());
switch (data) switch (data)
{ {
case 0xa0: // PACKET case 0xa0: // PACKET
atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_DRQ; m_atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_DRQ;
atapi_regs[ATAPI_REG_INTREASON] = ATAPI_INTREASON_COMMAND; m_atapi_regs[ATAPI_REG_INTREASON] = ATAPI_INTREASON_COMMAND;
m_atapi_data_ptr = 0; m_atapi_data_ptr = 0;
m_atapi_data_len = 0; m_atapi_data_len = 0;
@ -1143,7 +1117,7 @@ WRITE32_MEMBER(ksys573_state::atapi_w)
break; break;
case 0xa1: // IDENTIFY PACKET DEVICE case 0xa1: // IDENTIFY PACKET DEVICE
atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_DRQ; m_atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_DRQ;
m_atapi_data_ptr = 0; m_atapi_data_ptr = 0;
m_atapi_data_len = 512; m_atapi_data_len = 512;
@ -1152,45 +1126,45 @@ WRITE32_MEMBER(ksys573_state::atapi_w)
m_atapi_xferlen = 0; m_atapi_xferlen = 0;
m_atapi_xfermod = 0; m_atapi_xfermod = 0;
memset( atapi_data, 0, m_atapi_data_len ); memset( m_atapi_data, 0, m_atapi_data_len );
atapi_data[ 0 ^ 1 ] = 0x85; // ATAPI device, cmd set 5 compliant, DRQ within 3 ms of PACKET command m_atapi_data[ 0 ^ 1 ] = 0x85; // ATAPI device, cmd set 5 compliant, DRQ within 3 ms of PACKET command
atapi_data[ 1 ^ 1 ] = 0x00; m_atapi_data[ 1 ^ 1 ] = 0x00;
memset( &atapi_data[ 46 ], ' ', 8 ); memset( &m_atapi_data[ 46 ], ' ', 8 );
atapi_data[ 46 ^ 1 ] = '1'; m_atapi_data[ 46 ^ 1 ] = '1';
atapi_data[ 47 ^ 1 ] = '.'; m_atapi_data[ 47 ^ 1 ] = '.';
atapi_data[ 48 ^ 1 ] = '0'; m_atapi_data[ 48 ^ 1 ] = '0';
memset( &atapi_data[ 54 ], ' ', 40 ); memset( &m_atapi_data[ 54 ], ' ', 40 );
atapi_data[ 54 ^ 1 ] = 'M'; m_atapi_data[ 54 ^ 1 ] = 'M';
atapi_data[ 55 ^ 1 ] = 'A'; m_atapi_data[ 55 ^ 1 ] = 'A';
atapi_data[ 56 ^ 1 ] = 'T'; m_atapi_data[ 56 ^ 1 ] = 'T';
atapi_data[ 57 ^ 1 ] = 'S'; m_atapi_data[ 57 ^ 1 ] = 'S';
atapi_data[ 58 ^ 1 ] = 'H'; m_atapi_data[ 58 ^ 1 ] = 'H';
atapi_data[ 59 ^ 1 ] = 'I'; m_atapi_data[ 59 ^ 1 ] = 'I';
atapi_data[ 60 ^ 1 ] = 'T'; m_atapi_data[ 60 ^ 1 ] = 'T';
atapi_data[ 61 ^ 1 ] = 'A'; m_atapi_data[ 61 ^ 1 ] = 'A';
atapi_data[ 62 ^ 1 ] = ' '; m_atapi_data[ 62 ^ 1 ] = ' ';
atapi_data[ 63 ^ 1 ] = 'C'; m_atapi_data[ 63 ^ 1 ] = 'C';
atapi_data[ 64 ^ 1 ] = 'R'; m_atapi_data[ 64 ^ 1 ] = 'R';
atapi_data[ 65 ^ 1 ] = '-'; m_atapi_data[ 65 ^ 1 ] = '-';
atapi_data[ 66 ^ 1 ] = '5'; m_atapi_data[ 66 ^ 1 ] = '5';
atapi_data[ 67 ^ 1 ] = '8'; m_atapi_data[ 67 ^ 1 ] = '8';
atapi_data[ 68 ^ 1 ] = '9'; m_atapi_data[ 68 ^ 1 ] = '9';
atapi_data[ 69 ^ 1 ] = ' '; m_atapi_data[ 69 ^ 1 ] = ' ';
atapi_data[ 98 ^ 1 ] = 0x04; // IORDY may be disabled m_atapi_data[ 98 ^ 1 ] = 0x04; // IORDY may be disabled
atapi_data[ 99 ^ 1 ] = 0x00; m_atapi_data[ 99 ^ 1 ] = 0x00;
atapi_regs[ATAPI_REG_COUNTLOW] = 0; m_atapi_regs[ATAPI_REG_COUNTLOW] = 0;
atapi_regs[ATAPI_REG_COUNTHIGH] = 2; m_atapi_regs[ATAPI_REG_COUNTHIGH] = 2;
m_psxirq->intin10(1); m_psxirq->intin10(1);
break; break;
case 0xef: // SET FEATURES case 0xef: // SET FEATURES
atapi_regs[ATAPI_REG_CMDSTATUS] = 0; m_atapi_regs[ATAPI_REG_CMDSTATUS] = 0;
m_atapi_data_ptr = 0; m_atapi_data_ptr = 0;
m_atapi_data_len = 0; m_atapi_data_len = 0;
@ -1233,7 +1207,7 @@ void ksys573_state::atapi_init()
save_item( NAME(m_atapi_xfermod) ); save_item( NAME(m_atapi_xfermod) );
} }
WRITE32_MEMBER(ksys573_state::atapi_reset_w) WRITE16_MEMBER(ksys573_state::atapi_reset_w)
{ {
UINT8 *atapi_regs = m_atapi_regs; UINT8 *atapi_regs = m_atapi_regs;
@ -1280,15 +1254,13 @@ void ksys573_state::cdrom_dma_write( UINT32 *ram, UINT32 n_address, INT32 n_size
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 * (m_atapi_xferlen/2048))));
} }
WRITE32_MEMBER(ksys573_state::security_w) WRITE16_MEMBER(ksys573_state::security_w)
{ {
int security_cart_number = m_security_cart_number; int security_cart_number = m_security_cart_number;
COMBINE_DATA( &m_n_security_control ); COMBINE_DATA( &m_n_security_control );
verboselog(2, "security_w( %08x, %08x, %08x )\n", offset, mem_mask, data ); verboselog(2, "security_w( %08x, %08x, %08x )\n", offset, mem_mask, data );
if( ACCESSING_BITS_0_15 )
{
ds2401_device *ds2401 = machine().device<ds2401_device>(security_cart_number ? "game_id" : "install_id"); ds2401_device *ds2401 = machine().device<ds2401_device>(security_cart_number ? "game_id" : "install_id");
device_secure_serial_flash *secflash = machine().device<device_secure_serial_flash>(security_cart_number ? "game_eeprom" : "install_eeprom"); device_secure_serial_flash *secflash = machine().device<device_secure_serial_flash>(security_cart_number ? "game_eeprom" : "install_eeprom");
@ -1309,14 +1281,13 @@ WRITE32_MEMBER(ksys573_state::security_w)
{ {
(this->*m_security_callback)( data & 0xff ); (this->*m_security_callback)( data & 0xff );
} }
}
ioport("OUT1")->write_safe( data, mem_mask ); ioport("OUT1")->write_safe( data, mem_mask );
} }
READ32_MEMBER(ksys573_state::security_r) READ16_MEMBER(ksys573_state::security_r)
{ {
UINT32 data = m_n_security_control; UINT16 data = m_n_security_control;
verboselog(2, "security_r( %08x, %08x ) %08x\n", offset, mem_mask, data ); verboselog(2, "security_r( %08x, %08x ) %08x\n", offset, mem_mask, data );
return data; return data;
} }
@ -1378,18 +1349,18 @@ static ADDRESS_MAP_START( konami573_map, AS_PROGRAM, 32, ksys573_state )
AM_RANGE(0x1f400004, 0x1f400007) AM_READ(jamma_r ) AM_RANGE(0x1f400004, 0x1f400007) AM_READ(jamma_r )
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_READWRITE(atapi_r, atapi_w ) // IDE controller, used mostly in ATAPI mode (only 3 pure IDE commands seen so far) 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(0x1f500000, 0x1f500003) AM_READWRITE(control_r, control_w ) // 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_WRITE(atapi_reset_w ) AM_RANGE(0x1f560000, 0x1f560003) AM_WRITE16(atapi_reset_w, 0x0000ffff)
AM_RANGE(0x1f5c0000, 0x1f5c0003) AM_WRITENOP // watchdog? AM_RANGE(0x1f5c0000, 0x1f5c0003) AM_WRITENOP // watchdog?
AM_RANGE(0x1f620000, 0x1f623fff) AM_DEVREADWRITE8("m48t58", timekeeper_device, read, write, 0x00ff00ff) AM_RANGE(0x1f620000, 0x1f623fff) AM_DEVREADWRITE8("m48t58", timekeeper_device, read, write, 0x00ff00ff)
AM_RANGE(0x1f680000, 0x1f68001f) AM_READWRITE(mb89371_r, mb89371_w) AM_RANGE(0x1f680000, 0x1f68001f) AM_READWRITE16(mb89371_r, mb89371_w, 0xffffffff)
AM_RANGE(0x1f6a0000, 0x1f6a0003) AM_READWRITE(security_r, security_w ) AM_RANGE(0x1f6a0000, 0x1f6a0003) AM_READWRITE16(security_r, security_w, 0x0000ffff)
ADDRESS_MAP_END ADDRESS_MAP_END
void ksys573_state::flash_init( ) void ksys573_state::flash_init()
{ {
// find onboard flash devices // find onboard flash devices
astring tempstr; astring tempstr;