static int cr589_exec_command( SCSIInstance *scsiInstance, UINT8 *statusCode ) { UINT8 *command; int commandLength; SCSICr589 *our_this = (SCSICr589 *)SCSIThis( &SCSIClassCr589, scsiInstance ); SCSIGetCommand( scsiInstance, &command, &commandLength ); switch( command[ 0 ] ) { case 0x3b: // WRITE BUFFER our_this->bufferOffset = ( command[ 3 ] << 16 ) | ( command[ 4 ] << 8 ) | command[ 5 ]; SCSISetPhase( scsiInstance, SCSI_PHASE_DATAOUT ); return ( command[ 6 ] << 16 ) | ( command[ 7 ] << 8 ) | command[ 8 ]; case 0x3c: // READ BUFFER our_this->bufferOffset = ( command[ 3 ] << 16 ) | ( command[ 4 ] << 8 ) | command[ 5 ]; SCSISetPhase( scsiInstance, SCSI_PHASE_DATAIN ); return ( command[ 6 ] << 16 ) | ( command[ 7 ] << 8 ) | command[ 8 ]; case 0xcc: // FIRMWARE DOWNLOAD ENABLE SCSISetPhase( scsiInstance, SCSI_PHASE_DATAOUT ); return SCSILengthFromUINT16( &command[7] ); default: return SCSIBase( &SCSIClassCr589, SCSIOP_EXEC_COMMAND, scsiInstance, 0, NULL ); } }
void scsi_cr589_device::ExecCommand( int *transferLength ) { switch( command[ 0 ] ) { case 0x3b: // WRITE BUFFER bufferOffset = ( command[ 3 ] << 16 ) | ( command[ 4 ] << 8 ) | command[ 5 ]; SetPhase( SCSI_PHASE_DATAOUT ); *transferLength = ( command[ 6 ] << 16 ) | ( command[ 7 ] << 8 ) | command[ 8 ]; break; case 0x3c: // READ BUFFER bufferOffset = ( command[ 3 ] << 16 ) | ( command[ 4 ] << 8 ) | command[ 5 ]; SetPhase( SCSI_PHASE_DATAIN ); *transferLength = ( command[ 6 ] << 16 ) | ( command[ 7 ] << 8 ) | command[ 8 ]; break; case 0xcc: // FIRMWARE DOWNLOAD ENABLE SetPhase( SCSI_PHASE_DATAOUT ); *transferLength = SCSILengthFromUINT16( &command[7] ); break; default: scsicd_device::ExecCommand( transferLength ); } }