// license:BSD-3-Clause
// copyright-holders:smf
/***************************************************************************
t10spc.h
***************************************************************************/
#ifndef MAME_MACHINE_T10SPC_H
#define MAME_MACHINE_T10SPC_H
#pragma once
class t10spc
{
public:
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)
{
}
virtual ~t10spc() { }
virtual void SetDevice( void *device ) = 0;
virtual void GetDevice( void **device ) = 0;
virtual void SetCommand( uint8_t *command, int commandLength );
virtual void ExecCommand();
virtual void WriteData( uint8_t *data, int dataLength );
virtual void ReadData( uint8_t *data, int dataLength );
void GetLength( int *transferLength ) { *transferLength = m_transfer_length; }
virtual void GetPhase( int *phase ) { *phase = m_phase; }
protected:
virtual void t10_start(device_t &device);
virtual void t10_reset();
int SCSILengthFromUINT8( uint8_t *length ) { if( *length == 0 ) { return 256; } return *length; }
int SCSILengthFromUINT16( uint8_t *length ) { return ( *(length) << 8 ) | *(length + 1 ); }
enum sense_key_t
{
SCSI_SENSE_KEY_NO_SENSE = 0,
SCSI_SENSE_KEY_MEDIUM_ERROR = 2,
SCSI_SENSE_KEY_ILLEGAL_REQUEST = 5,
SCSI_SENSE_KEY_UNIT_ATTENTION = 6
};
enum sense_asc_ascq_t
{
SCSI_SENSE_ASC_ASCQ_NO_SENSE = 0x0,
SCSI_SENSE_ASC_ASCQ_AUDIO_PLAY_OPERATION_IN_PROGRESS = 0x0011,
SCSI_SENSE_ASC_ASCQ_AUDIO_PLAY_OPERATION_PAUSED = 0x0012,
SCSI_SENSE_ASC_ASCQ_AUDIO_PLAY_OPERATION_SUCCESSFULLY_COMPLETED = 0x0013,
SCSI_SENSE_ASC_ASCQ_AUDIO_PLAY_OPERATION_STOPPED_DUE_TO_ERROR = 0x0014,
SCSI_SENSE_ASC_ASCQ_ILLEGAL_MODE_FOR_THIS_TRACK = 0x6400
};
enum status_code_t
{
SCSI_STATUS_CODE_GOOD = 0x00,
SCSI_STATUS_CODE_CHECK_CONDITION = 0x02,
SCSI_STATUS_CODE_CONDITION_MET = 0x04,
SCSI_STATUS_CODE_BUSY = 0x08,
SCSI_STATUS_CODE_INTERMEDIATE = 0x14,
SCSI_STATUS_CODE_RESERVATION_CONFLICT = 0x18,
SCSI_STATUS_CODE_COMMAND_TERMINATED = 0x22,
SCSI_STATUS_CODE_TASK_SET_FULL = 0x28,
SCSI_STATUS_CODE_ACA_ACTIVE = 0x30,
SCSI_STATUS_CODE_TASK_ABORTED = 0x40
};
// these are defined here because t10mmc also needs them.
enum
{
T10SBC_CMD_FORMAT_UNIT = 0x04,
T10SBC_CMD_READ_6 = 0x08,
T10SBC_CMD_WRITE_6 = 0x0a,
T10SBC_CMD_SEEK_6 = 0x0b,
T10SBC_CMD_READ_10 = 0x28,
T10SBC_CMD_READ_CAPACITY = 0x25,
T10SBC_CMD_WRITE_10 = 0x2a,
T10SBC_CMD_SEEK_10 = 0x2b,
T10SBC_CMD_READ_12 = 0xa8
};
enum
{
T10SPC_CMD_TEST_UNIT_READY = 0x00,
T10SPC_CMD_RECALIBRATE = 0x01,
T10SPC_CMD_REQUEST_SENSE = 0x03,
T10SPC_CMD_INQUIRY = 0x12,
T10SPC_CMD_MODE_SELECT_6 = 0x15,
T10SPC_CMD_RESERVE_6 = 0x16,
T10SPC_CMD_RELEASE_6 = 0x17,
T10SPC_CMD_MODE_SENSE_6 = 0x1a,
T10SPC_CMD_START_STOP_UNIT = 0x1b,
T10SPC_CMD_RECEIVE_DIAGNOSTIC_RESULTS = 0x1c,
T10SPC_CMD_SEND_DIAGNOSTIC = 0x1d,
T10SPC_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL = 0x1e,
T10SPC_CMD_WRITE_BUFFER = 0x3b,
T10SPC_CMD_READ_BUFFER = 0x3c,
T10SPC_CMD_LOG_SELECT = 0x4c,
T10SPC_CMD_LOG_SENSE = 0x4d,
T10SPC_CMD_MODE_SELECT_10 = 0x55,
T10SPC_CMD_RESERVE_10 = 0x56,
T10SPC_CMD_RELEASE_10 = 0x57,
T10SPC_CMD_MODE_SENSE_10 = 0x5a,
T10SPC_CMD_PERSISTENT_RESERVE_IN = 0x5e,
T10SPC_CMD_PERSISTENT_RESERVE_OUT = 0x5f,
T10SPC_CMD_EXTENDED_COPY = 0x83,
T10SPC_CMD_RECEIVE_COPY_RESULTS = 0x84,
T10SPC_CMD_REPORT_LUNS = 0xa0,
T10SPC_CMD_REPORT_DEVICE_IDENTIFIER = 0xa3,
T10SPC_CMD_SET_DEVICE_IDENTIFIER = 0xa4,
T10SPC_CMD_MOVE_MEDIUM_ATTACHED = 0xa7,
T10SPC_CMD_READ_ELEMENT_STATUS_ATTACHED = 0xb4
};
void set_sense(sense_key_t key, sense_asc_ascq_t asc_ascq);
uint8_t command[ 32 ];
int commandLength;
int m_transfer_length;
int m_phase;
status_code_t m_status_code;
uint8_t m_sense_key;
uint8_t m_sense_asc;
uint8_t m_sense_ascq;
uint32_t m_sense_information;
int m_sector_bytes;
device_t *m_device;
};
#define SCSI_PHASE_DATAOUT ( 0 )
#define SCSI_PHASE_DATAIN ( 1 )
#define SCSI_PHASE_COMMAND ( 2 )
#define SCSI_PHASE_STATUS ( 3 )
#define SCSI_PHASE_MESSAGE_OUT ( 6 )
#define SCSI_PHASE_MESSAGE_IN ( 7 )
#define SCSI_PHASE_BUS_FREE ( 8 )
#define SCSI_PHASE_SELECT ( 9 )
#endif // MAME_MACHINE_T10SPC_H