1 // license:BSD-3-Clause 2 // copyright-holders:smf 3 /*************************************************************************** 4 5 t10spc.h 6 7 ***************************************************************************/ 8 9 #ifndef MAME_MACHINE_T10SPC_H 10 #define MAME_MACHINE_T10SPC_H 11 12 #pragma once 13 14 15 class t10spc 16 { 17 public: t10spc()18 t10spc() : commandLength(0), m_transfer_length(0), m_phase(0), m_status_code(), m_sense_key(0), m_sense_asc(0), m_sense_ascq(0), m_sense_information(0), m_sector_bytes(0), m_device(nullptr) 19 { 20 } 21 ~t10spc()22 virtual ~t10spc() { } 23 virtual void SetDevice( void *device ) = 0; 24 virtual void GetDevice( void **device ) = 0; 25 26 virtual void SetCommand( uint8_t *command, int commandLength ); 27 virtual void ExecCommand(); 28 virtual void WriteData( uint8_t *data, int dataLength ); 29 virtual void ReadData( uint8_t *data, int dataLength ); GetLength(int * transferLength)30 void GetLength( int *transferLength ) { *transferLength = m_transfer_length; } GetPhase(int * phase)31 virtual void GetPhase( int *phase ) { *phase = m_phase; } 32 33 protected: 34 virtual void t10_start(device_t &device); 35 virtual void t10_reset(); 36 SCSILengthFromUINT8(uint8_t * length)37 int SCSILengthFromUINT8( uint8_t *length ) { if( *length == 0 ) { return 256; } return *length; } SCSILengthFromUINT16(uint8_t * length)38 int SCSILengthFromUINT16( uint8_t *length ) { return ( *(length) << 8 ) | *(length + 1 ); } 39 40 enum sense_key_t 41 { 42 SCSI_SENSE_KEY_NO_SENSE = 0, 43 SCSI_SENSE_KEY_MEDIUM_ERROR = 2, 44 SCSI_SENSE_KEY_ILLEGAL_REQUEST = 5, 45 SCSI_SENSE_KEY_UNIT_ATTENTION = 6 46 }; 47 48 enum sense_asc_ascq_t 49 { 50 SCSI_SENSE_ASC_ASCQ_NO_SENSE = 0x0, 51 SCSI_SENSE_ASC_ASCQ_AUDIO_PLAY_OPERATION_IN_PROGRESS = 0x0011, 52 SCSI_SENSE_ASC_ASCQ_AUDIO_PLAY_OPERATION_PAUSED = 0x0012, 53 SCSI_SENSE_ASC_ASCQ_AUDIO_PLAY_OPERATION_SUCCESSFULLY_COMPLETED = 0x0013, 54 SCSI_SENSE_ASC_ASCQ_AUDIO_PLAY_OPERATION_STOPPED_DUE_TO_ERROR = 0x0014, 55 SCSI_SENSE_ASC_ASCQ_ILLEGAL_MODE_FOR_THIS_TRACK = 0x6400 56 }; 57 58 enum status_code_t 59 { 60 SCSI_STATUS_CODE_GOOD = 0x00, 61 SCSI_STATUS_CODE_CHECK_CONDITION = 0x02, 62 SCSI_STATUS_CODE_CONDITION_MET = 0x04, 63 SCSI_STATUS_CODE_BUSY = 0x08, 64 SCSI_STATUS_CODE_INTERMEDIATE = 0x14, 65 SCSI_STATUS_CODE_RESERVATION_CONFLICT = 0x18, 66 SCSI_STATUS_CODE_COMMAND_TERMINATED = 0x22, 67 SCSI_STATUS_CODE_TASK_SET_FULL = 0x28, 68 SCSI_STATUS_CODE_ACA_ACTIVE = 0x30, 69 SCSI_STATUS_CODE_TASK_ABORTED = 0x40 70 }; 71 72 // these are defined here because t10mmc also needs them. 73 enum 74 { 75 T10SBC_CMD_FORMAT_UNIT = 0x04, 76 T10SBC_CMD_READ_6 = 0x08, 77 T10SBC_CMD_WRITE_6 = 0x0a, 78 T10SBC_CMD_SEEK_6 = 0x0b, 79 T10SBC_CMD_READ_10 = 0x28, 80 T10SBC_CMD_READ_CAPACITY = 0x25, 81 T10SBC_CMD_WRITE_10 = 0x2a, 82 T10SBC_CMD_SEEK_10 = 0x2b, 83 T10SBC_CMD_READ_12 = 0xa8 84 }; 85 86 enum 87 { 88 T10SPC_CMD_TEST_UNIT_READY = 0x00, 89 T10SPC_CMD_RECALIBRATE = 0x01, 90 T10SPC_CMD_REQUEST_SENSE = 0x03, 91 T10SPC_CMD_INQUIRY = 0x12, 92 T10SPC_CMD_MODE_SELECT_6 = 0x15, 93 T10SPC_CMD_RESERVE_6 = 0x16, 94 T10SPC_CMD_RELEASE_6 = 0x17, 95 T10SPC_CMD_MODE_SENSE_6 = 0x1a, 96 T10SPC_CMD_START_STOP_UNIT = 0x1b, 97 T10SPC_CMD_RECEIVE_DIAGNOSTIC_RESULTS = 0x1c, 98 T10SPC_CMD_SEND_DIAGNOSTIC = 0x1d, 99 T10SPC_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL = 0x1e, 100 T10SPC_CMD_WRITE_BUFFER = 0x3b, 101 T10SPC_CMD_READ_BUFFER = 0x3c, 102 T10SPC_CMD_LOG_SELECT = 0x4c, 103 T10SPC_CMD_LOG_SENSE = 0x4d, 104 T10SPC_CMD_MODE_SELECT_10 = 0x55, 105 T10SPC_CMD_RESERVE_10 = 0x56, 106 T10SPC_CMD_RELEASE_10 = 0x57, 107 T10SPC_CMD_MODE_SENSE_10 = 0x5a, 108 T10SPC_CMD_PERSISTENT_RESERVE_IN = 0x5e, 109 T10SPC_CMD_PERSISTENT_RESERVE_OUT = 0x5f, 110 T10SPC_CMD_EXTENDED_COPY = 0x83, 111 T10SPC_CMD_RECEIVE_COPY_RESULTS = 0x84, 112 T10SPC_CMD_REPORT_LUNS = 0xa0, 113 T10SPC_CMD_REPORT_DEVICE_IDENTIFIER = 0xa3, 114 T10SPC_CMD_SET_DEVICE_IDENTIFIER = 0xa4, 115 T10SPC_CMD_MOVE_MEDIUM_ATTACHED = 0xa7, 116 T10SPC_CMD_READ_ELEMENT_STATUS_ATTACHED = 0xb4 117 }; 118 119 void set_sense(sense_key_t key, sense_asc_ascq_t asc_ascq); 120 121 uint8_t command[ 32 ]; 122 int commandLength; 123 int m_transfer_length; 124 int m_phase; 125 status_code_t m_status_code; 126 uint8_t m_sense_key; 127 uint8_t m_sense_asc; 128 uint8_t m_sense_ascq; 129 uint32_t m_sense_information; 130 int m_sector_bytes; 131 device_t *m_device; 132 }; 133 134 #define SCSI_PHASE_DATAOUT ( 0 ) 135 #define SCSI_PHASE_DATAIN ( 1 ) 136 #define SCSI_PHASE_COMMAND ( 2 ) 137 #define SCSI_PHASE_STATUS ( 3 ) 138 #define SCSI_PHASE_MESSAGE_OUT ( 6 ) 139 #define SCSI_PHASE_MESSAGE_IN ( 7 ) 140 #define SCSI_PHASE_BUS_FREE ( 8 ) 141 #define SCSI_PHASE_SELECT ( 9 ) 142 143 #endif // MAME_MACHINE_T10SPC_H 144