diff options
author | 2012-09-17 09:28:12 +0000 | |
---|---|---|
committer | 2012-09-17 09:28:12 +0000 | |
commit | 0d0b34e3bea7fd9d0c12ed4324b80bfaf3b50692 (patch) | |
tree | 367f95d77cc21d9b9b364a46715409c8c41eea39 | |
parent | 0dc663e2e920bad3c4c1247dfb83c66a7b06d354 (diff) |
moved some more scsi command handling from scsibus into scsidev (nw)
-rw-r--r-- | src/emu/machine/scsibus.c | 41 | ||||
-rw-r--r-- | src/emu/machine/scsibus.h | 47 | ||||
-rw-r--r-- | src/emu/machine/scsidev.c | 56 | ||||
-rw-r--r-- | src/emu/machine/scsidev.h | 39 |
4 files changed, 83 insertions, 100 deletions
diff --git a/src/emu/machine/scsibus.c b/src/emu/machine/scsibus.c index 94af87de044..72f667ec06d 100644 --- a/src/emu/machine/scsibus.c +++ b/src/emu/machine/scsibus.c @@ -105,7 +105,7 @@ UINT8 scsibus_device::scsi_data_r() break; case SCSI_PHASE_STATUS: - result=status; // return command status + result=SCSI_STATUS_OK; // return command status break; case SCSI_PHASE_MESSAGE_IN: @@ -264,38 +264,9 @@ void scsibus_device::scsibus_exec_command() //is_linked=command[cmd_idx-1] & 0x01; is_linked=0; - // Assume command will succeed, if not set sytatus below. - if (command[0]!=SCSI_CMD_REQUEST_SENSE) - SET_STATUS_SENSE(SCSI_STATUS_OK,SCSI_SENSE_NO_SENSE); - // Check for locally executed commands, and if found execute them switch (command[0]) { - // Recalibrate drive - case SCSI_CMD_RECALIBRATE: - LOG(1,"SCSIBUS: Recalibrate drive\n"); - command_local=1; - xfer_count=0; - data_last=xfer_count; - bytes_left=0; - devices[last_id]->SetPhase(SCSI_PHASE_STATUS); - break; - - // Request sense, return previous error codes - case SCSI_CMD_REQUEST_SENSE: - LOG(1,"SCSIBUS: request_sense\n"); - command_local=1; - xfer_count=SCSI_SENSE_SIZE; - data_last=xfer_count; - bytes_left=0; - buffer[0]=sense; - buffer[1]=0x00; - buffer[2]=0x00; - buffer[3]=0x00; - SET_STATUS_SENSE(SCSI_STATUS_OK,SCSI_SENSE_NO_SENSE); - devices[last_id]->SetPhase(SCSI_PHASE_DATAOUT); - break; - // Format unit case SCSI_CMD_FORMAT_UNIT: LOG(1,"SCSIBUS: format unit command[1]=%02X & 0x10\n",(command[1] & 0x10)); @@ -311,16 +282,6 @@ void scsibus_device::scsibus_exec_command() dataout_timer->adjust(attotime::from_seconds(FORMAT_UNIT_TIMEOUT)); break; - // Send diagnostic info - case SCSI_CMD_SEND_DIAGNOSTIC: - LOG(1,"SCSIBUS: send_diagnostic\n"); - command_local=1; - xfer_count=(command[3]<<8)+command[4]; - data_last=xfer_count; - bytes_left=0; - devices[last_id]->SetPhase(SCSI_PHASE_DATAOUT); - break; - case SCSI_CMD_SEARCH_DATA_EQUAL: LOG(1,"SCSIBUS: Search_data_equaln"); command_local=1; diff --git a/src/emu/machine/scsibus.h b/src/emu/machine/scsibus.h index 7ed35a1534d..16db3015759 100644 --- a/src/emu/machine/scsibus.h +++ b/src/emu/machine/scsibus.h @@ -45,12 +45,8 @@ #define ADAPTEC_BUF_SIZE 1024 // scsidev -#define SCSI_CMD_RECALIBRATE 0x01 -#define SCSI_CMD_REQUEST_SENSE 0x03 -#define SCSI_CMD_MODE_SELECT 0x15 -#define SCSI_CMD_SEND_DIAGNOSTIC 0x1D -#define SCSI_CMD_BUFFER_WRITE 0x3B -#define SCSI_CMD_BUFFER_READ 0x3C +#define SCSI_CMD_BUFFER_WRITE ( 0x3b ) +#define SCSI_CMD_BUFFER_READ ( 0x3c ) // scsihd #define SCSI_CMD_FORMAT_UNIT 0x04 @@ -61,45 +57,9 @@ #define IS_COMMAND(cmd) (command[0]==cmd) #define IS_READ_COMMAND() ((command[0]==0x08) || (command[0]==0x28) || (command[0]==0xa8)) #define IS_WRITE_COMMAND() ((command[0]==0x0a) || (command[0]==0x2a)) -#define SET_STATUS_SENSE(stat,sen) { status=(stat); sense=(sen); } #define FORMAT_UNIT_TIMEOUT 5 -// -// Status / Sense data taken from Adaptec ACB40x0 documentation. -// - -#define SCSI_STATUS_OK 0x00 -#define SCSI_STATUS_CHECK 0x02 -#define SCSI_STATUS_EQUAL 0x04 -#define SCSI_STATUS_BUSY 0x08 - -#define SCSI_SENSE_ADDR_VALID 0x80 -#define SCSI_SENSE_NO_SENSE 0x00 -#define SCSI_SENSE_NO_INDEX 0x01 -#define SCSI_SENSE_SEEK_NOT_COMP 0x02 -#define SCSI_SENSE_WRITE_FAULT 0x03 -#define SCSI_SENSE_DRIVE_NOT_READY 0x04 -#define SCSI_SENSE_NO_TRACK0 0x06 -#define SCSI_SENSE_ID_CRC_ERROR 0x10 -#define SCSI_SENSE_UNCORRECTABLE 0x11 -#define SCSI_SENSE_ADDRESS_NF 0x12 -#define SCSI_SENSE_RECORD_NOT_FOUND 0x14 -#define SCSI_SENSE_SEEK_ERROR 0x15 -#define SCSI_SENSE_DATA_CHECK_RETRY 0x18 -#define SCSI_SENSE_ECC_VERIFY 0x19 -#define SCSI_SENSE_INTERLEAVE_ERROR 0x1A -#define SCSI_SENSE_UNFORMATTED 0x1C -#define SCSI_SENSE_ILLEGAL_COMMAND 0x20 -#define SCSI_SENSE_ILLEGAL_ADDRESS 0x21 -#define SCSI_SENSE_VOLUME_OVERFLOW 0x23 -#define SCSI_SENSE_BAD_ARGUMENT 0x24 -#define SCSI_SENSE_INVALID_LUN 0x25 -#define SCSI_SENSE_CART_CHANGED 0x28 -#define SCSI_SENSE_ERROR_OVERFLOW 0x2C - -#define SCSI_SENSE_SIZE 4 - struct adaptec_sense_t { // parameter list @@ -197,9 +157,6 @@ private: UINT8 cmd_idx; UINT8 is_linked; - UINT8 status; - UINT8 sense; - UINT8 buffer[ADAPTEC_BUF_SIZE]; UINT16 data_idx; int xfer_count; diff --git a/src/emu/machine/scsidev.c b/src/emu/machine/scsidev.c index a5c0546dc9d..42858e7830b 100644 --- a/src/emu/machine/scsidev.c +++ b/src/emu/machine/scsidev.c @@ -19,6 +19,8 @@ void scsidev_device::device_start() save_item( NAME( phase ) ); } +#define SCSI_SENSE_SIZE 4 + void scsidev_device::ExecCommand( int *transferLength ) { UINT8 *command; @@ -27,15 +29,30 @@ void scsidev_device::ExecCommand( int *transferLength ) switch( command[ 0 ] ) { - case 0x00: // TEST UNIT READY - SetPhase( SCSI_PHASE_STATUS ); - *transferLength = 0; - break; - - default: - logerror( "%s: SCSIDEV unknown command %02x\n", machine().describe_context(), command[ 0 ] ); - *transferLength = 0; - break; + case SCSI_CMD_TEST_UNIT_READY: + SetPhase( SCSI_PHASE_STATUS ); + *transferLength = 0; + break; + + case SCSI_CMD_RECALIBRATE: + SetPhase( SCSI_PHASE_STATUS ); + *transferLength = 0; + break; + + case SCSI_CMD_REQUEST_SENSE: + SetPhase( SCSI_PHASE_DATAOUT ); + *transferLength = SCSI_SENSE_SIZE; + break; + + case SCSI_CMD_SEND_DIAGNOSTIC: + SetPhase( SCSI_PHASE_DATAOUT ); + *transferLength = ( command[ 3 ] << 8 ) + command[ 4 ]; + break; + + default: + logerror( "%s: SCSIDEV unknown command %02x\n", machine().describe_context(), command[ 0 ] ); + *transferLength = 0; + break; } } @@ -47,9 +64,15 @@ void scsidev_device::ReadData( UINT8 *data, int dataLength ) switch( command[ 0 ] ) { - default: - logerror( "%s: SCSIDEV unknown read %02x\n", machine().describe_context(), command[ 0 ] ); - break; + case SCSI_CMD_REQUEST_SENSE: + data[ 0 ] = SCSI_SENSE_NO_SENSE; + data[ 1 ] = 0x00; + data[ 2 ] = 0x00; + data[ 3 ] = 0x00; + break; + default: + logerror( "%s: SCSIDEV unknown read %02x\n", machine().describe_context(), command[ 0 ] ); + break; } } @@ -61,9 +84,12 @@ void scsidev_device::WriteData( UINT8 *data, int dataLength ) switch( command[ 0 ] ) { - default: - logerror( "%s: SCSIDEV unknown write %02x\n", machine().describe_context(), command[ 0 ] ); - break; + case SCSI_CMD_SEND_DIAGNOSTIC: + break; + + default: + logerror( "%s: SCSIDEV unknown write %02x\n", machine().describe_context(), command[ 0 ] ); + break; } } diff --git a/src/emu/machine/scsidev.h b/src/emu/machine/scsidev.h index 3ddcdef2d16..8a3d4ca52c8 100644 --- a/src/emu/machine/scsidev.h +++ b/src/emu/machine/scsidev.h @@ -49,6 +49,45 @@ extern int SCSILengthFromUINT16( UINT8 *length ); #define SCSI_PHASE_MESSAGE_OUT ( 6 ) #define SCSI_PHASE_MESSAGE_IN ( 7 ) +#define SCSI_CMD_TEST_UNIT_READY ( 0x00 ) +#define SCSI_CMD_RECALIBRATE ( 0x01 ) +#define SCSI_CMD_REQUEST_SENSE ( 0x03 ) +#define SCSI_CMD_MODE_SELECT ( 0x15 ) +#define SCSI_CMD_SEND_DIAGNOSTIC ( 0x1d ) + +// +// Status / Sense data taken from Adaptec ACB40x0 documentation. +// + +#define SCSI_STATUS_OK 0x00 +#define SCSI_STATUS_CHECK 0x02 +#define SCSI_STATUS_EQUAL 0x04 +#define SCSI_STATUS_BUSY 0x08 + +#define SCSI_SENSE_ADDR_VALID 0x80 +#define SCSI_SENSE_NO_SENSE 0x00 +#define SCSI_SENSE_NO_INDEX 0x01 +#define SCSI_SENSE_SEEK_NOT_COMP 0x02 +#define SCSI_SENSE_WRITE_FAULT 0x03 +#define SCSI_SENSE_DRIVE_NOT_READY 0x04 +#define SCSI_SENSE_NO_TRACK0 0x06 +#define SCSI_SENSE_ID_CRC_ERROR 0x10 +#define SCSI_SENSE_UNCORRECTABLE 0x11 +#define SCSI_SENSE_ADDRESS_NF 0x12 +#define SCSI_SENSE_RECORD_NOT_FOUND 0x14 +#define SCSI_SENSE_SEEK_ERROR 0x15 +#define SCSI_SENSE_DATA_CHECK_RETRY 0x18 +#define SCSI_SENSE_ECC_VERIFY 0x19 +#define SCSI_SENSE_INTERLEAVE_ERROR 0x1A +#define SCSI_SENSE_UNFORMATTED 0x1C +#define SCSI_SENSE_ILLEGAL_COMMAND 0x20 +#define SCSI_SENSE_ILLEGAL_ADDRESS 0x21 +#define SCSI_SENSE_VOLUME_OVERFLOW 0x23 +#define SCSI_SENSE_BAD_ARGUMENT 0x24 +#define SCSI_SENSE_INVALID_LUN 0x25 +#define SCSI_SENSE_CART_CHANGED 0x28 +#define SCSI_SENSE_ERROR_OVERFLOW 0x2C + // SCSI IDs enum { |