mirror of
https://github.com/akuker/RASCSI.git
synced 2024-06-13 07:29:39 +00:00
1142 lines
34 KiB
C++
1142 lines
34 KiB
C++
//---------------------------------------------------------------------------
|
||
//
|
||
// X68000 EMULATOR "XM6"
|
||
//
|
||
// Copyright (C) 2001-2006 PI.(ytanaka@ipc-tokai.or.jp)
|
||
// Copyright (C) 2014-2020 GIMONS
|
||
//
|
||
// XM6i
|
||
// Copyright (C) 2010-2015 isaki@NetBSD.org
|
||
//
|
||
// Imported sava's Anex86/T98Next image and MO format support patch.
|
||
//
|
||
// [ ディスク ]
|
||
//
|
||
//---------------------------------------------------------------------------
|
||
|
||
#if !defined(disk_h)
|
||
#define disk_h
|
||
|
||
#include "log.h"
|
||
#include "scsi.h"
|
||
|
||
//---------------------------------------------------------------------------
|
||
//
|
||
// エラー定義(REQUEST SENSEで返されるセンスコード)
|
||
//
|
||
// MSB 予約(0x00)
|
||
// センスキー
|
||
// 拡張センスコード(ASC)
|
||
// LSB 拡張センスコードクォリファイア(ASCQ)
|
||
//
|
||
//---------------------------------------------------------------------------
|
||
#define DISK_NOERROR 0x00000000 // NO ADDITIONAL SENSE INFO.
|
||
#define DISK_DEVRESET 0x00062900 // POWER ON OR RESET OCCURED
|
||
#define DISK_NOTREADY 0x00023a00 // MEDIUM NOT PRESENT
|
||
#define DISK_ATTENTION 0x00062800 // MEDIUM MAY HAVE CHANGED
|
||
#define DISK_PREVENT 0x00045302 // MEDIUM REMOVAL PREVENTED
|
||
#define DISK_READFAULT 0x00031100 // UNRECOVERED READ ERROR
|
||
#define DISK_WRITEFAULT 0x00030300 // PERIPHERAL DEVICE WRITE FAULT
|
||
#define DISK_WRITEPROTECT 0x00042700 // WRITE PROTECTED
|
||
#define DISK_MISCOMPARE 0x000e1d00 // MISCOMPARE DURING VERIFY
|
||
#define DISK_INVALIDCMD 0x00052000 // INVALID COMMAND OPERATION CODE
|
||
#define DISK_INVALIDLBA 0x00052100 // LOGICAL BLOCK ADDR. OUT OF RANGE
|
||
#define DISK_INVALIDCDB 0x00052400 // INVALID FIELD IN CDB
|
||
#define DISK_INVALIDLUN 0x00052500 // LOGICAL UNIT NOT SUPPORTED
|
||
#define DISK_INVALIDPRM 0x00052600 // INVALID FIELD IN PARAMETER LIST
|
||
#define DISK_INVALIDMSG 0x00054900 // INVALID MESSAGE ERROR
|
||
#define DISK_PARAMLEN 0x00051a00 // PARAMETERS LIST LENGTH ERROR
|
||
#define DISK_PARAMNOT 0x00052601 // PARAMETERS NOT SUPPORTED
|
||
#define DISK_PARAMVALUE 0x00052602 // PARAMETERS VALUE INVALID
|
||
#define DISK_PARAMSAVE 0x00053900 // SAVING PARAMETERS NOT SUPPORTED
|
||
#define DISK_NODEFECT 0x00010000 // DEFECT LIST NOT FOUND
|
||
|
||
#if 0
|
||
#define DISK_AUDIOPROGRESS 0x00??0011 // AUDIO PLAY IN PROGRESS
|
||
#define DISK_AUDIOPAUSED 0x00??0012 // AUDIO PLAY PAUSED
|
||
#define DISK_AUDIOSTOPPED 0x00??0014 // AUDIO PLAY STOPPED DUE TO ERROR
|
||
#define DISK_AUDIOCOMPLETE 0x00??0013 // AUDIO PLAY SUCCESSFULLY COMPLETED
|
||
#endif
|
||
|
||
//===========================================================================
|
||
//
|
||
// ディスクトラック
|
||
//
|
||
//===========================================================================
|
||
class DiskTrack
|
||
{
|
||
public:
|
||
// 内部データ定義
|
||
typedef struct {
|
||
int track; // トラックナンバー
|
||
int size; // セクタサイズ(8 or 9)
|
||
int sectors; // セクタ数(<=0x100)
|
||
DWORD length; // データバッファ長
|
||
BYTE *buffer; // データバッファ
|
||
BOOL init; // ロード済みか
|
||
BOOL changed; // 変更済みフラグ
|
||
DWORD maplen; // 変更済みマップ長
|
||
BOOL *changemap; // 変更済みマップ
|
||
BOOL raw; // RAWモード
|
||
off64_t imgoffset; // 実データまでのオフセット
|
||
} disktrk_t;
|
||
|
||
public:
|
||
// 基本ファンクション
|
||
DiskTrack();
|
||
// コンストラクタ
|
||
virtual ~DiskTrack();
|
||
// デストラクタ
|
||
void FASTCALL Init(int track, int size, int sectors, BOOL raw = FALSE,
|
||
off64_t imgoff = 0);
|
||
// 初期化
|
||
BOOL FASTCALL Load(const Filepath& path);
|
||
// ロード
|
||
BOOL FASTCALL Save(const Filepath& path);
|
||
// セーブ
|
||
|
||
// リード・ライト
|
||
BOOL FASTCALL Read(BYTE *buf, int sec) const;
|
||
// セクタリード
|
||
BOOL FASTCALL Write(const BYTE *buf, int sec);
|
||
// セクタライト
|
||
|
||
// その他
|
||
int FASTCALL GetTrack() const { return dt.track; }
|
||
// トラック取得
|
||
BOOL FASTCALL IsChanged() const { return dt.changed; }
|
||
// 変更フラグチェック
|
||
|
||
private:
|
||
// 内部データ
|
||
disktrk_t dt;
|
||
// 内部データ
|
||
};
|
||
|
||
//===========================================================================
|
||
//
|
||
// ディスクキャッシュ
|
||
//
|
||
//===========================================================================
|
||
class DiskCache
|
||
{
|
||
public:
|
||
// 内部データ定義
|
||
typedef struct {
|
||
DiskTrack *disktrk; // 割り当てトラック
|
||
DWORD serial; // 最終シリアル
|
||
} cache_t;
|
||
|
||
// キャッシュ数
|
||
enum {
|
||
CacheMax = 16 // キャッシュするトラック数
|
||
};
|
||
|
||
public:
|
||
// 基本ファンクション
|
||
DiskCache(const Filepath& path, int size, int blocks,
|
||
off64_t imgoff = 0);
|
||
// コンストラクタ
|
||
virtual ~DiskCache();
|
||
// デストラクタ
|
||
void FASTCALL SetRawMode(BOOL raw);
|
||
// CD-ROM rawモード設定
|
||
|
||
// アクセス
|
||
BOOL FASTCALL Save();
|
||
// 全セーブ&解放
|
||
BOOL FASTCALL Read(BYTE *buf, int block);
|
||
// セクタリード
|
||
BOOL FASTCALL Write(const BYTE *buf, int block);
|
||
// セクタライト
|
||
BOOL FASTCALL GetCache(int index, int& track, DWORD& serial) const;
|
||
// キャッシュ情報取得
|
||
|
||
private:
|
||
// 内部管理
|
||
void FASTCALL Clear();
|
||
// トラックをすべてクリア
|
||
DiskTrack* FASTCALL Assign(int track);
|
||
// トラックのロード
|
||
BOOL FASTCALL Load(int index, int track, DiskTrack *disktrk = NULL);
|
||
// トラックのロード
|
||
void FASTCALL Update();
|
||
// シリアル番号更新
|
||
|
||
// 内部データ
|
||
cache_t cache[CacheMax];
|
||
// キャッシュ管理
|
||
DWORD serial;
|
||
// 最終アクセスシリアルナンバ
|
||
Filepath sec_path;
|
||
// パス
|
||
int sec_size;
|
||
// セクタサイズ(8 or 9 or 11)
|
||
int sec_blocks;
|
||
// セクタブロック数
|
||
BOOL cd_raw;
|
||
// CD-ROM RAWモード
|
||
off64_t imgoffset;
|
||
// 実データまでのオフセット
|
||
};
|
||
|
||
//===========================================================================
|
||
//
|
||
// ディスク
|
||
//
|
||
//===========================================================================
|
||
class Disk
|
||
{
|
||
public:
|
||
// 内部ワーク
|
||
typedef struct {
|
||
DWORD id; // メディアID
|
||
BOOL ready; // 有効なディスク
|
||
BOOL writep; // 書き込み禁止
|
||
BOOL readonly; // 読み込み専用
|
||
BOOL removable; // 取り外し
|
||
BOOL lock; // ロック
|
||
BOOL attn; // アテンション
|
||
BOOL reset; // リセット
|
||
int size; // セクタサイズ
|
||
DWORD blocks; // 総セクタ数
|
||
DWORD lun; // LUN
|
||
DWORD code; // ステータスコード
|
||
DiskCache *dcache; // ディスクキャッシュ
|
||
off64_t imgoffset; // 実データまでのオフセット
|
||
} disk_t;
|
||
|
||
public:
|
||
// 基本ファンクション
|
||
Disk();
|
||
// コンストラクタ
|
||
virtual ~Disk();
|
||
// デストラクタ
|
||
virtual void FASTCALL Reset();
|
||
// デバイスリセット
|
||
#ifndef RASCSI
|
||
virtual BOOL FASTCALL Save(Fileio *fio, int ver);
|
||
// セーブ
|
||
virtual BOOL FASTCALL Load(Fileio *fio, int ver);
|
||
// ロード
|
||
#endif // RASCSI
|
||
|
||
// ID
|
||
DWORD FASTCALL GetID() const { return disk.id; }
|
||
// メディアID取得
|
||
BOOL FASTCALL IsNULL() const;
|
||
// NULLチェック
|
||
BOOL FASTCALL IsSASI() const;
|
||
// SASIチェック
|
||
|
||
// メディア操作
|
||
virtual BOOL FASTCALL Open(const Filepath& path, BOOL attn = TRUE);
|
||
// オープン
|
||
void FASTCALL GetPath(Filepath& path) const;
|
||
// パス取得
|
||
void FASTCALL Eject(BOOL force);
|
||
// イジェクト
|
||
BOOL FASTCALL IsReady() const { return disk.ready; }
|
||
// Readyチェック
|
||
void FASTCALL WriteP(BOOL flag);
|
||
// 書き込み禁止
|
||
BOOL FASTCALL IsWriteP() const { return disk.writep; }
|
||
// 書き込み禁止チェック
|
||
BOOL FASTCALL IsReadOnly() const { return disk.readonly; }
|
||
// Read Onlyチェック
|
||
BOOL FASTCALL IsRemovable() const { return disk.removable; }
|
||
// リムーバブルチェック
|
||
BOOL FASTCALL IsLocked() const { return disk.lock; }
|
||
// ロックチェック
|
||
BOOL FASTCALL IsAttn() const { return disk.attn; }
|
||
// 交換チェック
|
||
BOOL FASTCALL Flush();
|
||
// キャッシュフラッシュ
|
||
void FASTCALL GetDisk(disk_t *buffer) const;
|
||
// 内部ワーク取得
|
||
|
||
// プロパティ
|
||
void FASTCALL SetLUN(DWORD lun) { disk.lun = lun; }
|
||
// LUNセット
|
||
DWORD FASTCALL GetLUN() { return disk.lun; }
|
||
// LUN取得
|
||
// コマンド
|
||
virtual int FASTCALL Inquiry(const DWORD *cdb, BYTE *buf, DWORD major, DWORD minor);
|
||
// INQUIRYコマンド
|
||
virtual int FASTCALL RequestSense(const DWORD *cdb, BYTE *buf);
|
||
// REQUEST SENSEコマンド
|
||
int FASTCALL SelectCheck(const DWORD *cdb);
|
||
// SELECTチェック
|
||
int FASTCALL SelectCheck10(const DWORD *cdb);
|
||
// SELECT(10)チェック
|
||
virtual BOOL FASTCALL ModeSelect(const DWORD *cdb, const BYTE *buf, int length);
|
||
// MODE SELECTコマンド
|
||
virtual int FASTCALL ModeSense(const DWORD *cdb, BYTE *buf);
|
||
// MODE SENSEコマンド
|
||
virtual int FASTCALL ModeSense10(const DWORD *cdb, BYTE *buf);
|
||
// MODE SENSE(10)コマンド
|
||
int FASTCALL ReadDefectData10(const DWORD *cdb, BYTE *buf);
|
||
// READ DEFECT DATA(10)コマンド
|
||
virtual BOOL FASTCALL TestUnitReady(const DWORD *cdb);
|
||
// TEST UNIT READYコマンド
|
||
BOOL FASTCALL Rezero(const DWORD *cdb);
|
||
// REZEROコマンド
|
||
BOOL FASTCALL Format(const DWORD *cdb);
|
||
// FORMAT UNITコマンド
|
||
BOOL FASTCALL Reassign(const DWORD *cdb);
|
||
// REASSIGN UNITコマンド
|
||
virtual int FASTCALL Read(BYTE *buf, DWORD block);
|
||
// READコマンド
|
||
int FASTCALL WriteCheck(DWORD block);
|
||
// WRITEチェック
|
||
BOOL FASTCALL Write(const BYTE *buf, DWORD block);
|
||
// WRITEコマンド
|
||
BOOL FASTCALL Seek(const DWORD *cdb);
|
||
// SEEKコマンド
|
||
BOOL FASTCALL Assign(const DWORD *cdb);
|
||
// ASSIGNコマンド
|
||
BOOL FASTCALL Specify(const DWORD *cdb);
|
||
// SPECIFYコマンド
|
||
BOOL FASTCALL StartStop(const DWORD *cdb);
|
||
// START STOP UNITコマンド
|
||
BOOL FASTCALL SendDiag(const DWORD *cdb);
|
||
// SEND DIAGNOSTICコマンド
|
||
BOOL FASTCALL Removal(const DWORD *cdb);
|
||
// PREVENT/ALLOW MEDIUM REMOVALコマンド
|
||
int FASTCALL ReadCapacity(const DWORD *cdb, BYTE *buf);
|
||
// READ CAPACITYコマンド
|
||
BOOL FASTCALL Verify(const DWORD *cdb);
|
||
// VERIFYコマンド
|
||
virtual int FASTCALL ReadToc(const DWORD *cdb, BYTE *buf);
|
||
// READ TOCコマンド
|
||
virtual BOOL FASTCALL PlayAudio(const DWORD *cdb);
|
||
// PLAY AUDIOコマンド
|
||
virtual BOOL FASTCALL PlayAudioMSF(const DWORD *cdb);
|
||
// PLAY AUDIO MSFコマンド
|
||
virtual BOOL FASTCALL PlayAudioTrack(const DWORD *cdb);
|
||
// PLAY AUDIO TRACKコマンド
|
||
void FASTCALL InvalidCmd() { disk.code = DISK_INVALIDCMD; }
|
||
// サポートしていないコマンド
|
||
|
||
// その他
|
||
BOOL IsCacheWB() { return cache_wb; }
|
||
// キャッシュモード取得
|
||
void SetCacheWB(BOOL enable) { cache_wb = enable; }
|
||
// キャッシュモード設定
|
||
|
||
protected:
|
||
// サブ処理
|
||
virtual int FASTCALL AddError(BOOL change, BYTE *buf);
|
||
// エラーページ追加
|
||
virtual int FASTCALL AddFormat(BOOL change, BYTE *buf);
|
||
// フォーマットページ追加
|
||
virtual int FASTCALL AddDrive(BOOL change, BYTE *buf);
|
||
// ドライブページ追加
|
||
int FASTCALL AddOpt(BOOL change, BYTE *buf);
|
||
// オプティカルページ追加
|
||
int FASTCALL AddCache(BOOL change, BYTE *buf);
|
||
// キャッシュページ追加
|
||
int FASTCALL AddCDROM(BOOL change, BYTE *buf);
|
||
// CD-ROMページ追加
|
||
int FASTCALL AddCDDA(BOOL change, BYTE *buf);
|
||
// CD-DAページ追加
|
||
virtual int FASTCALL AddVendor(int page, BOOL change, BYTE *buf);
|
||
// ベンダ特殊ページ追加
|
||
BOOL FASTCALL CheckReady();
|
||
// レディチェック
|
||
|
||
// 内部データ
|
||
disk_t disk;
|
||
// ディスク内部データ
|
||
Filepath diskpath;
|
||
// パス(GetPath用)
|
||
BOOL cache_wb;
|
||
// キャッシュモード
|
||
};
|
||
|
||
//===========================================================================
|
||
//
|
||
// SASI ハードディスク
|
||
//
|
||
//===========================================================================
|
||
class SASIHD : public Disk
|
||
{
|
||
public:
|
||
// 基本ファンクション
|
||
SASIHD();
|
||
// コンストラクタ
|
||
void FASTCALL Reset();
|
||
// リセット
|
||
BOOL FASTCALL Open(const Filepath& path, BOOL attn = TRUE);
|
||
// オープン
|
||
// コマンド
|
||
int FASTCALL RequestSense(const DWORD *cdb, BYTE *buf);
|
||
// REQUEST SENSEコマンド
|
||
};
|
||
|
||
//===========================================================================
|
||
//
|
||
// SCSI ハードディスク
|
||
//
|
||
//===========================================================================
|
||
class SCSIHD : public Disk
|
||
{
|
||
public:
|
||
// 基本ファンクション
|
||
SCSIHD();
|
||
// コンストラクタ
|
||
void FASTCALL Reset();
|
||
// リセット
|
||
BOOL FASTCALL Open(const Filepath& path, BOOL attn = TRUE);
|
||
// オープン
|
||
|
||
// コマンド
|
||
int FASTCALL Inquiry(
|
||
const DWORD *cdb, BYTE *buf, DWORD major, DWORD minor);
|
||
// INQUIRYコマンド
|
||
BOOL FASTCALL ModeSelect(const DWORD *cdb, const BYTE *buf, int length);
|
||
// MODE SELECT(6)コマンド
|
||
};
|
||
|
||
//===========================================================================
|
||
//
|
||
// SCSI ハードディスク(PC-9801-55 NEC純正/Anex86/T98Next)
|
||
//
|
||
//===========================================================================
|
||
class SCSIHD_NEC : public SCSIHD
|
||
{
|
||
public:
|
||
// 基本ファンクション
|
||
SCSIHD_NEC();
|
||
// コンストラクタ
|
||
|
||
BOOL FASTCALL Open(const Filepath& path, BOOL attn = TRUE);
|
||
// オープン
|
||
|
||
// コマンド
|
||
int FASTCALL Inquiry(
|
||
const DWORD *cdb, BYTE *buf, DWORD major, DWORD minor);
|
||
// INQUIRYコマンド
|
||
|
||
// サブ処理
|
||
int FASTCALL AddError(BOOL change, BYTE *buf);
|
||
// エラーページ追加
|
||
int FASTCALL AddFormat(BOOL change, BYTE *buf);
|
||
// フォーマットページ追加
|
||
int FASTCALL AddDrive(BOOL change, BYTE *buf);
|
||
// ドライブページ追加
|
||
|
||
private:
|
||
int cylinders;
|
||
// シリンダ数
|
||
int heads;
|
||
// ヘッド数
|
||
int sectors;
|
||
// セクタ数
|
||
int sectorsize;
|
||
// セクタサイズ
|
||
off64_t imgoffset;
|
||
// イメージオフセット
|
||
off64_t imgsize;
|
||
// イメージサイズ
|
||
};
|
||
|
||
//===========================================================================
|
||
//
|
||
// SCSI ハードディスク(Macintosh Apple純正)
|
||
//
|
||
//===========================================================================
|
||
class SCSIHD_APPLE : public SCSIHD
|
||
{
|
||
public:
|
||
// 基本ファンクション
|
||
SCSIHD_APPLE();
|
||
// コンストラクタ
|
||
// コマンド
|
||
int FASTCALL Inquiry(
|
||
const DWORD *cdb, BYTE *buf, DWORD major, DWORD minor);
|
||
// INQUIRYコマンド
|
||
|
||
// サブ処理
|
||
int FASTCALL AddVendor(int page, BOOL change, BYTE *buf);
|
||
// ベンダ特殊ページ追加
|
||
};
|
||
|
||
//===========================================================================
|
||
//
|
||
// SCSI 光磁気ディスク
|
||
//
|
||
//===========================================================================
|
||
class SCSIMO : public Disk
|
||
{
|
||
public:
|
||
// 基本ファンクション
|
||
SCSIMO();
|
||
// コンストラクタ
|
||
BOOL FASTCALL Open(const Filepath& path, BOOL attn = TRUE);
|
||
// オープン
|
||
#ifndef RASCSI
|
||
BOOL FASTCALL Load(Fileio *fio, int ver);
|
||
// ロード
|
||
#endif // RASCSI
|
||
|
||
// コマンド
|
||
int FASTCALL Inquiry(const DWORD *cdb, BYTE *buf, DWORD major, DWORD minor);
|
||
// INQUIRYコマンド
|
||
BOOL FASTCALL ModeSelect(const DWORD *cdb, const BYTE *buf, int length);
|
||
// MODE SELECT(6)コマンド
|
||
|
||
// サブ処理
|
||
int FASTCALL AddVendor(int page, BOOL change, BYTE *buf);
|
||
// ベンダ特殊ページ追加
|
||
};
|
||
|
||
//---------------------------------------------------------------------------
|
||
//
|
||
// クラス先行定義
|
||
//
|
||
//---------------------------------------------------------------------------
|
||
class SCSICD;
|
||
|
||
//===========================================================================
|
||
//
|
||
// CD-ROM トラック
|
||
//
|
||
//===========================================================================
|
||
class CDTrack
|
||
{
|
||
public:
|
||
// 基本ファンクション
|
||
CDTrack(SCSICD *scsicd);
|
||
// コンストラクタ
|
||
virtual ~CDTrack();
|
||
// デストラクタ
|
||
BOOL FASTCALL Init(int track, DWORD first, DWORD last);
|
||
// 初期化
|
||
|
||
// プロパティ
|
||
void FASTCALL SetPath(BOOL cdda, const Filepath& path);
|
||
// パス設定
|
||
void FASTCALL GetPath(Filepath& path) const;
|
||
// パス取得
|
||
void FASTCALL AddIndex(int index, DWORD lba);
|
||
// インデックス追加
|
||
DWORD FASTCALL GetFirst() const;
|
||
// 開始LBA取得
|
||
DWORD FASTCALL GetLast() const;
|
||
// 終端LBA取得
|
||
DWORD FASTCALL GetBlocks() const;
|
||
// ブロック数取得
|
||
int FASTCALL GetTrackNo() const;
|
||
// トラック番号取得
|
||
BOOL FASTCALL IsValid(DWORD lba) const;
|
||
// 有効なLBAか
|
||
BOOL FASTCALL IsAudio() const;
|
||
// オーディオトラックか
|
||
|
||
private:
|
||
SCSICD *cdrom;
|
||
// 親デバイス
|
||
BOOL valid;
|
||
// 有効なトラック
|
||
int track_no;
|
||
// トラック番号
|
||
DWORD first_lba;
|
||
// 開始LBA
|
||
DWORD last_lba;
|
||
// 終了LBA
|
||
BOOL audio;
|
||
// オーディオトラックフラグ
|
||
BOOL raw;
|
||
// RAWデータフラグ
|
||
Filepath imgpath;
|
||
// イメージファイルパス
|
||
};
|
||
|
||
//===========================================================================
|
||
//
|
||
// CD-DA バッファ
|
||
//
|
||
//===========================================================================
|
||
class CDDABuf
|
||
{
|
||
public:
|
||
// 基本ファンクション
|
||
CDDABuf();
|
||
// コンストラクタ
|
||
virtual ~CDDABuf();
|
||
// デストラクタ
|
||
#if 0
|
||
BOOL Init();
|
||
// 初期化
|
||
BOOL FASTCALL Load(const Filepath& path);
|
||
// ロード
|
||
BOOL FASTCALL Save(const Filepath& path);
|
||
// セーブ
|
||
|
||
// API
|
||
void FASTCALL Clear();
|
||
// バッファクリア
|
||
BOOL FASTCALL Open(Filepath& path);
|
||
// ファイル指定
|
||
BOOL FASTCALL GetBuf(DWORD *buffer, int frames);
|
||
// バッファ取得
|
||
BOOL FASTCALL IsValid();
|
||
// 有効チェック
|
||
BOOL FASTCALL ReadReq();
|
||
// 読み込み要求
|
||
BOOL FASTCALL IsEnd() const;
|
||
// 終了チェック
|
||
|
||
private:
|
||
Filepath wavepath;
|
||
// Waveパス
|
||
BOOL valid;
|
||
// オープン結果
|
||
DWORD *buf;
|
||
// データバッファ
|
||
DWORD read;
|
||
// Readポインタ
|
||
DWORD write;
|
||
// Writeポインタ
|
||
DWORD num;
|
||
// データ有効数
|
||
DWORD rest;
|
||
// ファイル残りサイズ
|
||
#endif
|
||
};
|
||
|
||
//===========================================================================
|
||
//
|
||
// SCSI CD-ROM
|
||
//
|
||
//===========================================================================
|
||
class SCSICD : public Disk
|
||
{
|
||
public:
|
||
// トラック数
|
||
enum {
|
||
TrackMax = 96 // トラック最大数
|
||
};
|
||
|
||
public:
|
||
// 基本ファンクション
|
||
SCSICD();
|
||
// コンストラクタ
|
||
virtual ~SCSICD();
|
||
// デストラクタ
|
||
BOOL FASTCALL Open(const Filepath& path, BOOL attn = TRUE);
|
||
// オープン
|
||
#ifndef RASCSI
|
||
BOOL FASTCALL Load(Fileio *fio, int ver);
|
||
// ロード
|
||
#endif // RASCSI
|
||
|
||
// コマンド
|
||
int FASTCALL Inquiry(const DWORD *cdb, BYTE *buf, DWORD major, DWORD minor);
|
||
// INQUIRYコマンド
|
||
int FASTCALL Read(BYTE *buf, DWORD block);
|
||
// READコマンド
|
||
int FASTCALL ReadToc(const DWORD *cdb, BYTE *buf);
|
||
// READ TOCコマンド
|
||
BOOL FASTCALL PlayAudio(const DWORD *cdb);
|
||
// PLAY AUDIOコマンド
|
||
BOOL FASTCALL PlayAudioMSF(const DWORD *cdb);
|
||
// PLAY AUDIO MSFコマンド
|
||
BOOL FASTCALL PlayAudioTrack(const DWORD *cdb);
|
||
// PLAY AUDIO TRACKコマンド
|
||
|
||
// CD-DA
|
||
BOOL FASTCALL NextFrame();
|
||
// フレーム通知
|
||
void FASTCALL GetBuf(DWORD *buffer, int samples, DWORD rate);
|
||
// CD-DAバッファ取得
|
||
|
||
// LBA-MSF変換
|
||
void FASTCALL LBAtoMSF(DWORD lba, BYTE *msf) const;
|
||
// LBA→MSF変換
|
||
DWORD FASTCALL MSFtoLBA(const BYTE *msf) const;
|
||
// MSF→LBA変換
|
||
|
||
private:
|
||
// オープン
|
||
BOOL FASTCALL OpenCue(const Filepath& path);
|
||
// オープン(CUE)
|
||
BOOL FASTCALL OpenIso(const Filepath& path);
|
||
// オープン(ISO)
|
||
BOOL FASTCALL OpenPhysical(const Filepath& path);
|
||
// オープン(Physical)
|
||
BOOL rawfile;
|
||
// RAWフラグ
|
||
|
||
// トラック管理
|
||
void FASTCALL ClearTrack();
|
||
// トラッククリア
|
||
int FASTCALL SearchTrack(DWORD lba) const;
|
||
// トラック検索
|
||
CDTrack* track[TrackMax];
|
||
// トラックオブジェクト
|
||
int tracks;
|
||
// トラックオブジェクト有効数
|
||
int dataindex;
|
||
// 現在のデータトラック
|
||
int audioindex;
|
||
// 現在のオーディオトラック
|
||
|
||
int frame;
|
||
// フレーム番号
|
||
|
||
#if 0
|
||
CDDABuf da_buf;
|
||
// CD-DAバッファ
|
||
int da_num;
|
||
// CD-DAトラック数
|
||
int da_cur;
|
||
// CD-DAカレントトラック
|
||
int da_next;
|
||
// CD-DAネクストトラック
|
||
BOOL da_req;
|
||
// CD-DAデータ要求
|
||
#endif
|
||
};
|
||
|
||
//===========================================================================
|
||
//
|
||
// SCSI ホストブリッジ
|
||
//
|
||
//===========================================================================
|
||
#if defined(RASCSI) && !defined(BAREMETAL)
|
||
class CTapDriver;
|
||
#endif // RASCSI && !BAREMETAL
|
||
class CFileSys;
|
||
class SCSIBR : public Disk
|
||
{
|
||
public:
|
||
// 基本ファンクション
|
||
SCSIBR();
|
||
// コンストラクタ
|
||
virtual ~SCSIBR();
|
||
// デストラクタ
|
||
|
||
// コマンド
|
||
int FASTCALL Inquiry(const DWORD *cdb, BYTE *buf, DWORD major, DWORD minor);
|
||
// INQUIRYコマンド
|
||
BOOL FASTCALL TestUnitReady(const DWORD *cdb);
|
||
// TEST UNIT READYコマンド
|
||
int FASTCALL GetMessage10(const DWORD *cdb, BYTE *buf);
|
||
// GET MESSAGE10コマンド
|
||
BOOL FASTCALL SendMessage10(const DWORD *cdb, BYTE *buf);
|
||
// SEND MESSAGE10コマンド
|
||
|
||
private:
|
||
#if defined(RASCSI) && !defined(BAREMETAL)
|
||
int FASTCALL GetMacAddr(BYTE *buf);
|
||
// MACアドレス取得
|
||
void FASTCALL SetMacAddr(BYTE *buf);
|
||
// MACアドレス設定
|
||
void FASTCALL ReceivePacket();
|
||
// パケット受信
|
||
void FASTCALL GetPacketBuf(BYTE *buf);
|
||
// パケット取得
|
||
void FASTCALL SendPacket(BYTE *buf, int len);
|
||
// パケット送信
|
||
|
||
CTapDriver *tap;
|
||
// TAPドライバ
|
||
BOOL m_bTapEnable;
|
||
// TAP有効フラグ
|
||
BYTE mac_addr[6];
|
||
// MACアドレス
|
||
int packet_len;
|
||
// 受信パケットサイズ
|
||
BYTE packet_buf[0x1000];
|
||
// 受信パケットバッファ
|
||
BOOL packet_enable;
|
||
// 受信パケット有効
|
||
#endif // RASCSI && !BAREMETAL
|
||
|
||
int FASTCALL ReadFsResult(BYTE *buf);
|
||
// ファイルシステム読み込み(結果コード)
|
||
int FASTCALL ReadFsOut(BYTE *buf);
|
||
// ファイルシステム読み込み(返却データ)
|
||
int FASTCALL ReadFsOpt(BYTE *buf);
|
||
// ファイルシステム読み込み(オプションデータ)
|
||
void FASTCALL WriteFs(int func, BYTE *buf);
|
||
// ファイルシステム書き込み(実行)
|
||
void FASTCALL WriteFsOpt(BYTE *buf, int len);
|
||
// ファイルシステム書き込み(オプションデータ)
|
||
|
||
// コマンドハンドラ
|
||
void FASTCALL FS_InitDevice(BYTE *buf);
|
||
// $40 - デバイス起動
|
||
void FASTCALL FS_CheckDir(BYTE *buf);
|
||
// $41 - ディレクトリチェック
|
||
void FASTCALL FS_MakeDir(BYTE *buf);
|
||
// $42 - ディレクトリ作成
|
||
void FASTCALL FS_RemoveDir(BYTE *buf);
|
||
// $43 - ディレクトリ削除
|
||
void FASTCALL FS_Rename(BYTE *buf);
|
||
// $44 - ファイル名変更
|
||
void FASTCALL FS_Delete(BYTE *buf);
|
||
// $45 - ファイル削除
|
||
void FASTCALL FS_Attribute(BYTE *buf);
|
||
// $46 - ファイル属性取得/設定
|
||
void FASTCALL FS_Files(BYTE *buf);
|
||
// $47 - ファイル検索
|
||
void FASTCALL FS_NFiles(BYTE *buf);
|
||
// $48 - ファイル次検索
|
||
void FASTCALL FS_Create(BYTE *buf);
|
||
// $49 - ファイル作成
|
||
void FASTCALL FS_Open(BYTE *buf);
|
||
// $4A - ファイルオープン
|
||
void FASTCALL FS_Close(BYTE *buf);
|
||
// $4B - ファイルクローズ
|
||
void FASTCALL FS_Read(BYTE *buf);
|
||
// $4C - ファイル読み込み
|
||
void FASTCALL FS_Write(BYTE *buf);
|
||
// $4D - ファイル書き込み
|
||
void FASTCALL FS_Seek(BYTE *buf);
|
||
// $4E - ファイルシーク
|
||
void FASTCALL FS_TimeStamp(BYTE *buf);
|
||
// $4F - ファイル時刻取得/設定
|
||
void FASTCALL FS_GetCapacity(BYTE *buf);
|
||
// $50 - 容量取得
|
||
void FASTCALL FS_CtrlDrive(BYTE *buf);
|
||
// $51 - ドライブ状態検査/制御
|
||
void FASTCALL FS_GetDPB(BYTE *buf);
|
||
// $52 - DPB取得
|
||
void FASTCALL FS_DiskRead(BYTE *buf);
|
||
// $53 - セクタ読み込み
|
||
void FASTCALL FS_DiskWrite(BYTE *buf);
|
||
// $54 - セクタ書き込み
|
||
void FASTCALL FS_Ioctrl(BYTE *buf);
|
||
// $55 - IOCTRL
|
||
void FASTCALL FS_Flush(BYTE *buf);
|
||
// $56 - フラッシュ
|
||
void FASTCALL FS_CheckMedia(BYTE *buf);
|
||
// $57 - メディア交換チェック
|
||
void FASTCALL FS_Lock(BYTE *buf);
|
||
// $58 - 排他制御
|
||
|
||
CFileSys *fs;
|
||
// ファイルシステムアクセッサー
|
||
DWORD fsresult;
|
||
// ファイルシステムアクセス結果コード
|
||
BYTE fsout[0x800];
|
||
// ファイルシステムアクセス結果バッファ
|
||
DWORD fsoutlen;
|
||
// ファイルシステムアクセス結果バッファサイズ
|
||
BYTE fsopt[0x1000000];
|
||
// ファイルシステムアクセスバッファ
|
||
DWORD fsoptlen;
|
||
// ファイルシステムアクセスバッファサイズ
|
||
};
|
||
|
||
//===========================================================================
|
||
//
|
||
// SASI コントローラ
|
||
//
|
||
//===========================================================================
|
||
class SASIDEV
|
||
{
|
||
public:
|
||
// 論理ユニット最大数
|
||
enum {
|
||
UnitMax = 8
|
||
};
|
||
|
||
#ifdef RASCSI
|
||
// タイミング調整用
|
||
enum {
|
||
min_exec_time_sasi = 100, // SASI BOOT/FORMAT 30:NG 35:OK
|
||
min_exec_time_scsi = 50
|
||
};
|
||
#endif // RASCSI
|
||
|
||
// 内部データ定義
|
||
typedef struct {
|
||
// 全般
|
||
BUS::phase_t phase; // 遷移フェーズ
|
||
int id; // コントローラID(0-7)
|
||
BUS *bus; // バス
|
||
|
||
// コマンド
|
||
DWORD cmd[10]; // コマンドデータ
|
||
DWORD status; // ステータスデータ
|
||
DWORD message; // メッセージデータ
|
||
|
||
#ifdef RASCSI
|
||
// 実行
|
||
DWORD execstart; // 実行開始時間
|
||
#endif // RASCSI
|
||
|
||
// 転送
|
||
BYTE *buffer; // 転送バッファ
|
||
int bufsize; // 転送バッファサイズ
|
||
DWORD blocks; // 転送ブロック数
|
||
DWORD next; // 次のレコード
|
||
DWORD offset; // 転送オフセット
|
||
DWORD length; // 転送残り長さ
|
||
|
||
// 論理ユニット
|
||
Disk *unit[UnitMax];
|
||
// 論理ユニット
|
||
} ctrl_t;
|
||
|
||
public:
|
||
// 基本ファンクション
|
||
#ifdef RASCSI
|
||
SASIDEV();
|
||
#else
|
||
SASIDEV(Device *dev);
|
||
#endif //RASCSI
|
||
|
||
// コンストラクタ
|
||
virtual ~SASIDEV();
|
||
// デストラクタ
|
||
virtual void FASTCALL Reset();
|
||
// デバイスリセット
|
||
#ifndef RASCSI
|
||
virtual BOOL FASTCALL Save(Fileio *fio, int ver);
|
||
// セーブ
|
||
virtual BOOL FASTCALL Load(Fileio *fio, int ver);
|
||
// ロード
|
||
#endif //RASCSI
|
||
|
||
// 外部API
|
||
virtual BUS::phase_t FASTCALL Process();
|
||
// 実行
|
||
|
||
// 接続
|
||
void FASTCALL Connect(int id, BUS *sbus);
|
||
// コントローラ接続
|
||
Disk* FASTCALL GetUnit(int no);
|
||
// 論理ユニット取得
|
||
void FASTCALL SetUnit(int no, Disk *dev);
|
||
// 論理ユニット設定
|
||
BOOL FASTCALL HasUnit();
|
||
// 有効な論理ユニットを持っているか返す
|
||
|
||
// その他
|
||
BUS::phase_t FASTCALL GetPhase() {return ctrl.phase;}
|
||
// フェーズ取得
|
||
int FASTCALL GetID() {return ctrl.id;}
|
||
// ID取得
|
||
void FASTCALL GetCTRL(ctrl_t *buffer);
|
||
// 内部情報取得
|
||
ctrl_t* FASTCALL GetWorkAddr() { return &ctrl; }
|
||
// 内部情報アドレス取得
|
||
virtual BOOL FASTCALL IsSASI() const {return TRUE;}
|
||
// SASIチェック
|
||
virtual BOOL FASTCALL IsSCSI() const {return FALSE;}
|
||
// SCSIチェック
|
||
Disk* FASTCALL GetBusyUnit();
|
||
// ビジー状態のユニットを取得
|
||
|
||
protected:
|
||
// フェーズ処理
|
||
virtual void FASTCALL BusFree();
|
||
// バスフリーフェーズ
|
||
virtual void FASTCALL Selection();
|
||
// セレクションフェーズ
|
||
virtual void FASTCALL Command();
|
||
// コマンドフェーズ
|
||
virtual void FASTCALL Execute();
|
||
// 実行フェーズ
|
||
void FASTCALL Status();
|
||
// ステータスフェーズ
|
||
void FASTCALL MsgIn();
|
||
// メッセージインフェーズ
|
||
void FASTCALL DataIn();
|
||
// データインフェーズ
|
||
void FASTCALL DataOut();
|
||
// データアウトフェーズ
|
||
virtual void FASTCALL Error();
|
||
// 共通エラー処理
|
||
|
||
// コマンド
|
||
void FASTCALL CmdTestUnitReady();
|
||
// TEST UNIT READYコマンド
|
||
void FASTCALL CmdRezero();
|
||
// REZERO UNITコマンド
|
||
void FASTCALL CmdRequestSense();
|
||
// REQUEST SENSEコマンド
|
||
void FASTCALL CmdFormat();
|
||
// FORMATコマンド
|
||
void FASTCALL CmdReassign();
|
||
// REASSIGN BLOCKSコマンド
|
||
void FASTCALL CmdRead6();
|
||
// READ(6)コマンド
|
||
void FASTCALL CmdWrite6();
|
||
// WRITE(6)コマンド
|
||
void FASTCALL CmdSeek6();
|
||
// SEEK(6)コマンド
|
||
void FASTCALL CmdAssign();
|
||
// ASSIGNコマンド
|
||
void FASTCALL CmdSpecify();
|
||
// SPECIFYコマンド
|
||
void FASTCALL CmdInvalid();
|
||
// サポートしていないコマンド
|
||
|
||
// データ転送
|
||
virtual void FASTCALL Send();
|
||
// データ送信
|
||
#ifndef RASCSI
|
||
virtual void FASTCALL SendNext();
|
||
// データ送信継続
|
||
#endif // RASCSI
|
||
virtual void FASTCALL Receive();
|
||
// データ受信
|
||
#ifndef RASCSI
|
||
virtual void FASTCALL ReceiveNext();
|
||
// データ受信継続
|
||
#endif // RASCSI
|
||
BOOL FASTCALL XferIn(BYTE* buf);
|
||
// データ転送IN
|
||
BOOL FASTCALL XferOut(BOOL cont);
|
||
// データ転送OUT
|
||
|
||
// 特殊
|
||
void FASTCALL FlushUnit();
|
||
// 論理ユニットフラッシュ
|
||
|
||
// ログ
|
||
void FASTCALL Log(Log::loglevel level, const char *format, ...);
|
||
// ログ出力
|
||
|
||
protected:
|
||
#ifndef RASCSI
|
||
Device *host;
|
||
// ホストデバイス
|
||
#endif // RASCSI
|
||
|
||
ctrl_t ctrl;
|
||
// 内部データ
|
||
};
|
||
|
||
//===========================================================================
|
||
//
|
||
// SCSI デバイス(SASI デバイスを継承)
|
||
//
|
||
//===========================================================================
|
||
class SCSIDEV : public SASIDEV
|
||
{
|
||
public:
|
||
// 内部データ定義
|
||
typedef struct {
|
||
// 同期転送
|
||
BOOL syncenable; // 同期転送可能
|
||
int syncperiod; // 同期転送ピリオド
|
||
int syncoffset; // 同期転送オフセット
|
||
int syncack; // 同期転送ACK数
|
||
|
||
// ATNメッセージ
|
||
BOOL atnmsg;
|
||
int msc;
|
||
BYTE msb[256];
|
||
} scsi_t;
|
||
|
||
public:
|
||
// 基本ファンクション
|
||
#ifdef RASCSI
|
||
SCSIDEV();
|
||
#else
|
||
SCSIDEV(Device *dev);
|
||
#endif // RASCSI
|
||
// コンストラクタ
|
||
|
||
void FASTCALL Reset();
|
||
// デバイスリセット
|
||
|
||
// 外部API
|
||
BUS::phase_t FASTCALL Process();
|
||
// 実行
|
||
|
||
void FASTCALL SyncTransfer(BOOL enable) { scsi.syncenable = enable; }
|
||
// 同期転送可能設定
|
||
|
||
// その他
|
||
BOOL FASTCALL IsSASI() const {return FALSE;}
|
||
// SASIチェック
|
||
BOOL FASTCALL IsSCSI() const {return TRUE;}
|
||
// SCSIチェック
|
||
|
||
private:
|
||
// フェーズ
|
||
void FASTCALL BusFree();
|
||
// バスフリーフェーズ
|
||
void FASTCALL Selection();
|
||
// セレクションフェーズ
|
||
void FASTCALL Execute();
|
||
// 実行フェーズ
|
||
void FASTCALL MsgOut();
|
||
// メッセージアウトフェーズ
|
||
void FASTCALL Error();
|
||
// 共通エラー処理
|
||
|
||
// コマンド
|
||
void FASTCALL CmdInquiry();
|
||
// INQUIRYコマンド
|
||
void FASTCALL CmdModeSelect();
|
||
// MODE SELECTコマンド
|
||
void FASTCALL CmdModeSense();
|
||
// MODE SENSEコマンド
|
||
void FASTCALL CmdStartStop();
|
||
// START STOP UNITコマンド
|
||
void FASTCALL CmdSendDiag();
|
||
// SEND DIAGNOSTICコマンド
|
||
void FASTCALL CmdRemoval();
|
||
// PREVENT/ALLOW MEDIUM REMOVALコマンド
|
||
void FASTCALL CmdReadCapacity();
|
||
// READ CAPACITYコマンド
|
||
void FASTCALL CmdRead10();
|
||
// READ(10)コマンド
|
||
void FASTCALL CmdWrite10();
|
||
// WRITE(10)コマンド
|
||
void FASTCALL CmdSeek10();
|
||
// SEEK(10)コマンド
|
||
void FASTCALL CmdVerify();
|
||
// VERIFYコマンド
|
||
void FASTCALL CmdSynchronizeCache();
|
||
// SYNCHRONIZE CACHE コマンド
|
||
void FASTCALL CmdReadDefectData10();
|
||
// READ DEFECT DATA(10) コマンド
|
||
void FASTCALL CmdReadToc();
|
||
// READ TOCコマンド
|
||
void FASTCALL CmdPlayAudio10();
|
||
// PLAY AUDIO(10)コマンド
|
||
void FASTCALL CmdPlayAudioMSF();
|
||
// PLAY AUDIO MSFコマンド
|
||
void FASTCALL CmdPlayAudioTrack();
|
||
// PLAY AUDIO TRACK INDEXコマンド
|
||
void FASTCALL CmdModeSelect10();
|
||
// MODE SELECT(10)コマンド
|
||
void FASTCALL CmdModeSense10();
|
||
// MODE SENSE(10)コマンド
|
||
void FASTCALL CmdGetMessage10();
|
||
// GET MESSAGE(10)コマンド
|
||
void FASTCALL CmdSendMessage10();
|
||
// SEND MESSAGE(10)コマンド
|
||
|
||
// データ転送
|
||
void FASTCALL Send();
|
||
// データ送信
|
||
#ifndef RASCSI
|
||
void FASTCALL SendNext();
|
||
// データ送信継続
|
||
#endif // RASCSI
|
||
void FASTCALL Receive();
|
||
// データ受信
|
||
#ifndef RASCSI
|
||
void FASTCALL ReceiveNext();
|
||
// データ受信継続
|
||
#endif // RASCSI
|
||
BOOL FASTCALL XferMsg(DWORD msg);
|
||
// データ転送MSG
|
||
|
||
scsi_t scsi;
|
||
// 内部データ
|
||
};
|
||
|
||
#endif // disk_h
|