From 0839767cb356a6fe3d2512b8aaa317b0b17fc578 Mon Sep 17 00:00:00 2001 From: smf- Date: Tue, 17 Sep 2013 18:23:52 +0000 Subject: Use virtual multiple inheritance to share command processing between SCSI & ATAPI instead of having a SCSI subdevice. This allows matsushita_cr589_device & gdrom_device to derive from atapi_cdrom_device. [smf] --- src/emu/machine/t10spc.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 src/emu/machine/t10spc.c (limited to 'src/emu/machine/t10spc.c') diff --git a/src/emu/machine/t10spc.c b/src/emu/machine/t10spc.c new file mode 100644 index 00000000000..1ffdc4ea8b7 --- /dev/null +++ b/src/emu/machine/t10spc.c @@ -0,0 +1,90 @@ +#include "t10spc.h" + +#define SCSI_SENSE_SIZE 4 + +void t10spc::t10_start(device_t &device) +{ + device.save_item(NAME(command)); + device.save_item(NAME(commandLength)); + device.save_item(NAME(m_phase)); + device.save_item(NAME(m_transfer_length)); +} + +void t10spc::t10_reset() +{ + m_phase = SCSI_PHASE_BUS_FREE; +} + +void t10spc::ExecCommand() +{ + switch( command[ 0 ] ) + { + case SCSI_CMD_TEST_UNIT_READY: + m_phase = SCSI_PHASE_STATUS; + m_transfer_length = 0; + break; + + case SCSI_CMD_RECALIBRATE: + m_phase = SCSI_PHASE_STATUS; + m_transfer_length = 0; + break; + + case SCSI_CMD_REQUEST_SENSE: + m_phase = SCSI_PHASE_DATAOUT; + m_transfer_length = SCSI_SENSE_SIZE; + break; + + case SCSI_CMD_SEND_DIAGNOSTIC: + m_phase = SCSI_PHASE_DATAOUT; + m_transfer_length = SCSILengthFromUINT16(&command[3]); + break; + + default: + logerror( "SCSIDEV unknown command %02x\n", command[ 0 ] ); + m_transfer_length = 0; + break; + } +} + +void t10spc::ReadData( UINT8 *data, int dataLength ) +{ + switch( command[ 0 ] ) + { + case SCSI_CMD_REQUEST_SENSE: + data[ 0 ] = SCSI_SENSE_NO_SENSE; + data[ 1 ] = 0x00; + data[ 2 ] = 0x00; + data[ 3 ] = 0x00; + break; + default: + logerror( "SCSIDEV unknown read %02x\n", command[ 0 ] ); + break; + } +} + +void t10spc::WriteData( UINT8 *data, int dataLength ) +{ + switch( command[ 0 ] ) + { + case SCSI_CMD_SEND_DIAGNOSTIC: + break; + + default: + logerror( "SCSIDEV unknown write %02x\n", command[ 0 ] ); + break; + } +} + +void t10spc::SetCommand( UINT8 *_command, int _commandLength ) +{ + if( _commandLength > sizeof( command ) ) + { + /// TODO: output an error. + return; + } + + memcpy( command, _command, _commandLength ); + commandLength = _commandLength; + + m_phase = SCSI_PHASE_COMMAND; +} -- cgit v1.2.3-70-g09d2