mirror of
https://github.com/akuker/RASCSI.git
synced 2024-06-26 22:29:45 +00:00
* Device type unification, support of removable media
* Added support for .hdr extension
* Removable flag cleanup
* Manpage update
* Enriched PbOperation with PbDevice
* Added file size to PbImageFile
* Added device list support
* Set image_file
* Make remote interface more robust by ignoring SIGPIPE
* Return status only once
* Fixed typo
* Error handling update
* When starting rascsi parse everything before attaching devices
* Added dry run mode
* Comment update
* Updated logging
* Added Device base class, Disk class inherits from it
* Renaming
* Use vectors for controllers and disks, as preparation for using maps
* Updated file support handling
* Comment update
* DaynaPort and Bridge inherit from Device instead of Disk
* ProcessCmd() now works with devices instead of disks
* Renaming
* Added DeviceFactory
* Improved factory
* Comment update
* protected disk_t
* Code cleanup, added translations
* Device name can be set for rascsi
* rasctl can set device name
* Manpage update
* Manpage update
* Formatting update
* Check for missing name
* Initialize fd
* Initialize type
* Fixed string length issue
* Updated capacity formatting
* Fixed typo
* Split PbDevice into device and device definition
* Added TODO
* Renaming
* Renaming
* Device types can be explicitly specified with -t (no FILE:TYPE syntax anymore)
* Fixed compile-time issue
* Removed unused Append mode, updated read-only handling
* Type handling and manpage update
* Cleanup
* rasctl parser cleanup
* Review
* Constructor update
* Added .hdr (SCRM) support to web interface, tested web interface
* Default folder can be set remotely
* Removed deprecated operation
* DETACH supports all parameters in order to detach all devices
* include cleanup
* Logging should not depend on NDEBUG, for RaSCSI it is not peformance-critical
* INFO is default log level
* Exception renaming
* Updated GetPaddedName()
* Inheritance update
* Added BlockDevice class
* Removed unused code
* Updated typedefs
* Revert "Updated typedefs"
This reverts commit 546b46215a
.
* Removed unused code
* Fixed warnign
* Use standard C++ integer types, use streams to resolve printf data type issues
* Added TODOs
* Added TODO
* Renaming
* Added TODO
* Added TODO
* Improved dry-run
* Code cleanup
* Updated handling of unknown options, code review and cleanup
* Manpage update
* Added PrimaryDevice
* Include cleanup
* Added pure virtual methods
* Comment updates
* Split rasutil
* Replaced some occurrences of BOOL
* Removed obsolete RASCSI definition in xm6.h
* Removed unused code, updated TODOs, replaced BOOL
* Added capacity check (issue #192)
* Fixed (most likely) https://github.com/akuker/RASCSI/issues/191
* Fixed wrong error messages
* For root the default image folder is /home/pi/images, updated error handling
* Dynaport code review
* Improved error handling
* Implemented READ CAPACITY(16)
* Comment update
* Commands can be 16 bytes long
* Implemented READ/WRITE/VERIFY(16)
* Comment update
* Renamed method to reflect the name of the respective SCSI command
* Do not created devices during dryRun
* Fixed padding of SCSIHD_APPLE vendor and product
* Initial implementation
* Updated ReportLuns
* Byte count update
* Fixed typo
* Finalized REPORT LUNS
* Removed TODO
* Updated TODO
* TODO update
* Updated device factory
* Comment update
* 64 bit update, tested on Ubuntu 64 bit system
* Removed assertion
* SCSI hard disks always have Apple specific mode pages (resolves issue #193)
* Error messsage update, 64 bit cleanup
* Reduced streams usage
* Updated handling of device flags
* MOs are protectable
* Removed duplicate error code handling
* Removed duplicate code
* Fixed CmdReadToc buffer overflow (https://github.com/akuker/RASCSI/issues/194)
* Added naive implementation of GET EVENT STATUS NOTIFICATION to avoid wranings
* HD must set removable device bit if the media is removable
* Removed duplicate logging
* Updated daynaport additional length
* Removed broken daynaport REQUEST SENSE. Successfully tested with my Mac.
* EnableInterface should not always return TRUE
* Updated Inquiry
* Updated LUN handling
* Replaced incorrect free by delete
* Updated comments and write-protection handling
* Made default HD name consistent
* STATUS_NOERROR is default
* Fixed Eject
* More eject handling updates
* Manpage updates
* Logging update
* Changed debug level
* Logging update
* Log capacity of all media types
* Logging update
* Encapsulated disk.blocks
* Encapsulated sector size
* Added overrides
* Added more overrides
* Fixed error message
* Fixed typos
* Fixed logging
* Added logging
* Use PrimaryDevice when calling Inquiry
* Comment update
* Changed default buffer size for testing
* Reverted last change
* Removed debug output
* De-inlined methods because optimized code did not work with them inlined
* Web interface can attach Daynaport again
* Improved handling of read-only hard disks
* Fixed issue with "all" semantics of DETACH
* rasctl supports adding removable media devices without providing a filename
* Removed unused flag in PbDeviceDefinition
* Updated rasctl output for ecjected media (resolves issue #199)
* Validate default folder name when changing default folder
270 lines
6.6 KiB
C++
270 lines
6.6 KiB
C++
//---------------------------------------------------------------------------
|
||
//
|
||
// X68000 EMULATOR "XM6"
|
||
//
|
||
// Copyright (C) 2001-2006 PI.(ytanaka@ipc-tokai.or.jp)
|
||
// Copyright (C) 2014-2020 GIMONS
|
||
//
|
||
// [ SCSI Common Functionality ]
|
||
//
|
||
//---------------------------------------------------------------------------
|
||
|
||
#if !defined(scsi_h)
|
||
#define scsi_h
|
||
|
||
//===========================================================================
|
||
//
|
||
// Sense Keys and Additional Sense Codes
|
||
// (See https://www.t10.org/lists/1spc-lst.htm)
|
||
//
|
||
//===========================================================================
|
||
class ERROR_CODES
|
||
{
|
||
public:
|
||
enum sense_key : int {
|
||
NO_SENSE = 0x00,
|
||
RECOVERED_ERROR = 0x01,
|
||
NOT_READY = 0x02,
|
||
MEDIUM_ERROR = 0x03,
|
||
HARDWARE_ERROR = 0x04,
|
||
ILLEGAL_REQUEST = 0x05,
|
||
UNIT_ATTENTION = 0x06,
|
||
DATA_PROTECT = 0x07,
|
||
BLANK_CHECK = 0x08,
|
||
VENDOR_SPECIFIC = 0x09,
|
||
COPY_ABORTED = 0x0a,
|
||
ABORTED_COMMAND = 0x0b,
|
||
VOLUME_OVERFLOW = 0x0d,
|
||
MISCOMPARE = 0x0e,
|
||
COMPLETED = 0x0f
|
||
};
|
||
|
||
enum asc : int {
|
||
NO_ADDITIONAL_SENSE_INFORMATION = 0x00,
|
||
INVALID_COMMAND_OPERATION_CODE = 0x20,
|
||
LBA_OUT_OF_RANGE = 0x21,
|
||
INVALID_FIELD_IN_CDB = 0x24,
|
||
INVALID_LUN = 0x25,
|
||
WRITE_PROTECTED = 0x27,
|
||
MEDIUM_NOT_PRESENT = 0x3a
|
||
};
|
||
};
|
||
|
||
//===========================================================================
|
||
//
|
||
// SASI/SCSI Bus
|
||
//
|
||
//===========================================================================
|
||
class BUS
|
||
{
|
||
public:
|
||
// Operation modes definition
|
||
enum mode_e {
|
||
TARGET = 0,
|
||
INITIATOR = 1,
|
||
MONITOR = 2,
|
||
};
|
||
|
||
// Phase definition
|
||
enum phase_t : BYTE {
|
||
busfree, // バスフリーフェーズ
|
||
arbitration, // アービトレーションフェーズ
|
||
selection, // セレクションフェーズ
|
||
reselection, // リセレクションフェーズ
|
||
command, // コマンドフェーズ
|
||
execute, // 実行フェーズ Execute is an extension of the command phase
|
||
datain, // データイン
|
||
dataout, // データアウト
|
||
status, // ステータスフェーズ
|
||
msgin, // メッセージフェーズ
|
||
msgout, // メッセージアウトフェーズ
|
||
reserved // 未使用/リザーブ
|
||
};
|
||
|
||
BUS() { };
|
||
virtual ~BUS() { };
|
||
|
||
// Basic Functions
|
||
// 基本ファンクション
|
||
virtual BOOL Init(mode_e mode) = 0;
|
||
// 初期化
|
||
virtual void Reset() = 0;
|
||
// リセット
|
||
virtual void Cleanup() = 0;
|
||
// クリーンアップ
|
||
phase_t GetPhase();
|
||
// フェーズ取得
|
||
|
||
static phase_t GetPhase(DWORD mci)
|
||
{
|
||
return phase_table[mci];
|
||
}
|
||
// フェーズ取得
|
||
|
||
static const char* GetPhaseStrRaw(phase_t current_phase);
|
||
// Get the string phase name, based upon the raw data
|
||
|
||
// Extract as specific pin field from a raw data capture
|
||
static inline DWORD GetPinRaw(DWORD raw_data, DWORD pin_num)
|
||
{
|
||
return ((raw_data >> pin_num) & 1);
|
||
}
|
||
|
||
virtual bool GetBSY() = 0;
|
||
// BSYシグナル取得
|
||
virtual void SetBSY(bool ast) = 0;
|
||
// BSYシグナル設定
|
||
|
||
virtual BOOL GetSEL() = 0;
|
||
// SELシグナル取得
|
||
virtual void SetSEL(BOOL ast) = 0;
|
||
// SELシグナル設定
|
||
|
||
virtual BOOL GetATN() = 0;
|
||
// ATNシグナル取得
|
||
virtual void SetATN(BOOL ast) = 0;
|
||
// ATNシグナル設定
|
||
|
||
virtual BOOL GetACK() = 0;
|
||
// ACKシグナル取得
|
||
virtual void SetACK(BOOL ast) = 0;
|
||
// ACKシグナル設定
|
||
|
||
virtual BOOL GetRST() = 0;
|
||
// RSTシグナル取得
|
||
virtual void SetRST(BOOL ast) = 0;
|
||
// RSTシグナル設定
|
||
|
||
virtual BOOL GetMSG() = 0;
|
||
// MSGシグナル取得
|
||
virtual void SetMSG(BOOL ast) = 0;
|
||
// MSGシグナル設定
|
||
|
||
virtual BOOL GetCD() = 0;
|
||
// CDシグナル取得
|
||
virtual void SetCD(BOOL ast) = 0;
|
||
// CDシグナル設定
|
||
|
||
virtual BOOL GetIO() = 0;
|
||
// IOシグナル取得
|
||
virtual void SetIO(BOOL ast) = 0;
|
||
// IOシグナル設定
|
||
|
||
virtual BOOL GetREQ() = 0;
|
||
// REQシグナル取得
|
||
virtual void SetREQ(BOOL ast) = 0;
|
||
// REQシグナル設定
|
||
|
||
virtual BYTE GetDAT() = 0;
|
||
// データシグナル取得
|
||
virtual void SetDAT(BYTE dat) = 0;
|
||
// データシグナル設定
|
||
virtual BOOL GetDP() = 0;
|
||
// パリティシグナル取得
|
||
|
||
virtual int CommandHandShake(BYTE *buf) = 0;
|
||
// コマンド受信ハンドシェイク
|
||
virtual int ReceiveHandShake(BYTE *buf, int count) = 0;
|
||
// データ受信ハンドシェイク
|
||
virtual int SendHandShake(BYTE *buf, int count, int delay_after_bytes) = 0;
|
||
// データ送信ハンドシェイク
|
||
|
||
|
||
virtual BOOL GetSignal(int pin) = 0;
|
||
// Get SCSI input signal value
|
||
virtual void SetSignal(int pin, BOOL ast) = 0;
|
||
// Set SCSI output signal value
|
||
static const int SEND_NO_DELAY = -1;
|
||
// Passed into SendHandShake when we don't want to delay
|
||
protected:
|
||
phase_t m_current_phase = phase_t::reserved;
|
||
|
||
private:
|
||
static const phase_t phase_table[8];
|
||
// フェーズテーブル
|
||
|
||
static const char* phase_str_table[];
|
||
};
|
||
|
||
|
||
typedef struct __attribute__((packed)) {
|
||
BYTE operation_code;
|
||
BYTE misc_cdb_information;
|
||
BYTE page_code;
|
||
WORD length;
|
||
BYTE control;
|
||
} scsi_cdb_6_byte_t;
|
||
|
||
|
||
typedef struct __attribute__((packed)) {
|
||
BYTE operation_code;
|
||
BYTE service_action;
|
||
DWORD logical_block_address;
|
||
BYTE misc_cdb_information;
|
||
WORD length;
|
||
BYTE control;
|
||
} scsi_cdb_10_byte_t;
|
||
|
||
typedef struct __attribute__((packed)) {
|
||
BYTE operation_code;
|
||
BYTE service_action;
|
||
DWORD logical_block_address;
|
||
DWORD length;
|
||
BYTE misc_cdb_information;
|
||
BYTE control;
|
||
} scsi_cdb_12_byte_t;
|
||
|
||
typedef struct __attribute__((packed)) {
|
||
BYTE operation_code;
|
||
BYTE service_action;
|
||
DWORD logical_block_address;
|
||
DWORD length;
|
||
BYTE misc_cdb_information;
|
||
BYTE control;
|
||
} scsi_cdb_16_byte_t;
|
||
|
||
typedef struct __attribute__((packed)) {
|
||
BYTE operation_code;
|
||
BYTE reserved;
|
||
BYTE page_code;
|
||
WORD allocation_length;
|
||
BYTE control;
|
||
} scsi_cmd_inquiry_t;
|
||
|
||
typedef struct __attribute__((packed)) {
|
||
BYTE operation_code;
|
||
BYTE lba_msb_bits_4_0;
|
||
WORD logical_block_address;
|
||
BYTE transfer_length;
|
||
BYTE control;
|
||
} scsi_cmd_read_6_t;
|
||
|
||
typedef struct __attribute__((packed)) {
|
||
BYTE operation_code;
|
||
BYTE flags;
|
||
DWORD logical_block_address;
|
||
BYTE group_number;
|
||
WORD transfer_length;
|
||
BYTE control;
|
||
} scsi_cmd_read_10_t;
|
||
|
||
typedef struct __attribute__((packed)) {
|
||
BYTE operation_code;
|
||
BYTE flags;
|
||
DWORD logical_block_address;
|
||
DWORD transfer_length;
|
||
BYTE group_number;
|
||
BYTE control;
|
||
} scsi_cmd_read_12_t;
|
||
|
||
typedef struct __attribute__((packed)) {
|
||
BYTE operation_code;
|
||
BYTE descriptor_format;
|
||
WORD reserved;
|
||
BYTE allocation_length;
|
||
BYTE control;
|
||
} scsi_cmd_request_sense_t;
|
||
|
||
|
||
#endif // scsi_h
|