mirror of
https://github.com/thewesker/RASCSI.git
synced 2025-12-22 21:31:06 -05:00
143 lines
3.7 KiB
C++
143 lines
3.7 KiB
C++
//---------------------------------------------------------------------------
|
||
//
|
||
// SCSI Target Emulator RaSCSI (*^..^*)
|
||
// for Raspberry Pi
|
||
//
|
||
// Copyright (C) 2001-2006 PI.(ytanaka@ipc-tokai.or.jp)
|
||
// Copyright (C) 2014-2020 GIMONS
|
||
// Copyright (C) akuker
|
||
//
|
||
// Licensed under the BSD 3-Clause License.
|
||
// See LICENSE file in the project root folder.
|
||
//
|
||
// [ SCSI device controller ]
|
||
//
|
||
//---------------------------------------------------------------------------
|
||
#pragma once
|
||
#include "sasidev_ctrl.h"
|
||
|
||
//===========================================================================
|
||
//
|
||
// SCSI Device (Interits SASI device)
|
||
//
|
||
//===========================================================================
|
||
class SCSIDEV : public SASIDEV
|
||
{
|
||
public:
|
||
// Internal data definition
|
||
typedef struct {
|
||
// Synchronous transfer
|
||
BOOL syncenable; // Synchronous transfer possible
|
||
int syncperiod; // Synchronous transfer period
|
||
int syncoffset; // Synchronous transfer offset
|
||
int syncack; // Number of synchronous transfer ACKs
|
||
|
||
// ATN message
|
||
BOOL atnmsg;
|
||
int msc;
|
||
BYTE msb[256];
|
||
} scsi_t;
|
||
|
||
public:
|
||
// Basic Functions
|
||
#ifdef RASCSI
|
||
SCSIDEV();
|
||
#else
|
||
SCSIDEV(Device *dev);
|
||
#endif // RASCSI
|
||
// Constructor
|
||
|
||
void FASTCALL Reset();
|
||
// Device Reset
|
||
|
||
// 外部API
|
||
BUS::phase_t FASTCALL Process();
|
||
// Run
|
||
|
||
void FASTCALL SyncTransfer(BOOL enable) { scsi.syncenable = enable; }
|
||
// Synchronouse transfer enable setting
|
||
|
||
// Other
|
||
BOOL FASTCALL IsSASI() const {return FALSE;}
|
||
// SASI Check
|
||
BOOL FASTCALL IsSCSI() const {return TRUE;}
|
||
// SCSI check
|
||
|
||
private:
|
||
// Phase
|
||
void FASTCALL BusFree();
|
||
// Bus free phase
|
||
void FASTCALL Selection();
|
||
// Selection phase
|
||
void FASTCALL Execute();
|
||
// Execution phase
|
||
void FASTCALL MsgOut();
|
||
// Message out phase
|
||
void FASTCALL Error();
|
||
// Common erorr handling
|
||
|
||
// commands
|
||
void FASTCALL CmdInquiry();
|
||
// INQUIRY command
|
||
void FASTCALL CmdModeSelect();
|
||
// MODE SELECT command
|
||
void FASTCALL CmdModeSense();
|
||
// MODE SENSE command
|
||
void FASTCALL CmdStartStop();
|
||
// START STOP UNIT command
|
||
void FASTCALL CmdSendDiag();
|
||
// SEND DIAGNOSTIC command
|
||
void FASTCALL CmdRemoval();
|
||
// PREVENT/ALLOW MEDIUM REMOVAL command
|
||
void FASTCALL CmdReadCapacity();
|
||
// READ CAPACITY command
|
||
void FASTCALL CmdRead10();
|
||
// READ(10) command
|
||
void FASTCALL CmdWrite10();
|
||
// WRITE(10) command
|
||
void FASTCALL CmdSeek10();
|
||
// SEEK(10) command
|
||
void FASTCALL CmdVerify();
|
||
// VERIFY command
|
||
void FASTCALL CmdSynchronizeCache();
|
||
// SYNCHRONIZE CACHE command
|
||
void FASTCALL CmdReadDefectData10();
|
||
// READ DEFECT DATA(10) command
|
||
void FASTCALL CmdReadToc();
|
||
// READ TOC command
|
||
void FASTCALL CmdPlayAudio10();
|
||
// PLAY AUDIO(10) command
|
||
void FASTCALL CmdPlayAudioMSF();
|
||
// PLAY AUDIO MSF command
|
||
void FASTCALL CmdPlayAudioTrack();
|
||
// PLAY AUDIO TRACK INDEX command
|
||
void FASTCALL CmdModeSelect10();
|
||
// MODE SELECT(10) command
|
||
void FASTCALL CmdModeSense10();
|
||
// MODE SENSE(10) command
|
||
void FASTCALL CmdGetMessage10();
|
||
// GET MESSAGE(10) command
|
||
void FASTCALL CmdSendMessage10();
|
||
// SEND MESSAGE(10) command
|
||
|
||
// データ転送
|
||
void FASTCALL Send();
|
||
// Send data
|
||
#ifndef RASCSI
|
||
void FASTCALL SendNext();
|
||
// Continue sending data
|
||
#endif // RASCSI
|
||
void FASTCALL Receive();
|
||
// Receive data
|
||
#ifndef RASCSI
|
||
void FASTCALL ReceiveNext();
|
||
// Continue receiving data
|
||
#endif // RASCSI
|
||
BOOL FASTCALL XferMsg(DWORD msg);
|
||
// Data transfer message
|
||
|
||
scsi_t scsi;
|
||
// Internal data
|
||
};
|
||
|