summaryrefslogblamecommitdiffstatshomepage
path: root/src/devices/machine/t10spc.h
blob: 254ce87a4c0a8dda6f0cd7555746fee45a9172c4 (plain) (tree)
1
2
3
4
5
6
7
8

                        





                                                                            



                             
 



            



                                                                                                                                                                                                     
                             


                                                    
                                                                       
                                   

                                                                






                                                                                      

                                                                                                         
 


                                            


                                                   











                                                                                         













                                                             










                                                                 
                                         


































                                                               

                                                                   
                              


                              
                                    



                                     












                                    
                               
// 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