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