summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author smf- <smf-@users.noreply.github.com>2012-09-17 09:28:12 +0000
committer smf- <smf-@users.noreply.github.com>2012-09-17 09:28:12 +0000
commit0d0b34e3bea7fd9d0c12ed4324b80bfaf3b50692 (patch)
tree367f95d77cc21d9b9b364a46715409c8c41eea39
parent0dc663e2e920bad3c4c1247dfb83c66a7b06d354 (diff)
moved some more scsi command handling from scsibus into scsidev (nw)
-rw-r--r--src/emu/machine/scsibus.c41
-rw-r--r--src/emu/machine/scsibus.h47
-rw-r--r--src/emu/machine/scsidev.c56
-rw-r--r--src/emu/machine/scsidev.h39
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
{