mirror of
https://github.com/akuker/RASCSI.git
synced 2024-11-25 20:33:35 +00:00
Translate source code in x68k (#289)
* Translate code comments * Remove documentation that is contained in wiki * Translate code comments * Remove documentation that is contained in wiki * Translate configuration file * Remove documentation that is covered by wiki * Translate code comments * Translate strings and code comments * Cleanup
This commit is contained in:
parent
6d32a8d102
commit
af4e3dfe80
@ -1,11 +0,0 @@
|
||||
X68000 commands for the management tool (rasctl)
|
||||
|
||||
Overview
|
||||
|
||||
This is a program for using the RaSCSI management tool (rasctl) to interface with
|
||||
a real X68000 computer running Human68k over the RaSCSI bridge device.
|
||||
|
||||
Description
|
||||
|
||||
It has the exact same functionality as the management tool (rasctl) running on
|
||||
the Raspberry Pi, so please refer to the RaSCSI documentation for instructions.
|
File diff suppressed because it is too large
Load Diff
@ -3,9 +3,9 @@
|
||||
// SCSI Target Emulator RaSCSI (*^..^*)
|
||||
// for Raspberry Pi
|
||||
//
|
||||
// Powered by XM6 TypeG Technorogy.
|
||||
// Powered by XM6 TypeG Technology.
|
||||
// Copyright (C) 2016-2017 GIMONS
|
||||
// [ ホストファイルシステム ブリッジドライバ ]
|
||||
// [ Host Filesystem Bridge Driver ]
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
@ -30,7 +30,7 @@ typedef int BOOL;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// 定数定義
|
||||
// Constant definitions
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
#define FILEPATH_MAX _MAX_PATH
|
||||
@ -38,219 +38,218 @@ typedef int BOOL;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// ステータスコード定義
|
||||
// Status code definitions
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
#define FS_INVALIDFUNC 0xFFFFFFFF // 無効なファンクションコードを実行した
|
||||
#define FS_FILENOTFND 0xFFFFFFFE // 指定したファイルが見つからない
|
||||
#define FS_DIRNOTFND 0xFFFFFFFD // 指定したディレクトリが見つからない
|
||||
#define FS_OVEROPENED 0xFFFFFFFC // オープンしているファイルが多すぎる
|
||||
#define FS_CANTACCESS 0xFFFFFFFB // ディレクトリやボリュームラベルはアクセス不可
|
||||
#define FS_NOTOPENED 0xFFFFFFFA // 指定したハンドルはオープンされていない
|
||||
#define FS_INVALIDMEM 0xFFFFFFF9 // メモリ管理領域が破壊された
|
||||
#define FS_OUTOFMEM 0xFFFFFFF8 // 実行に必要なメモリがない
|
||||
#define FS_INVALIDPTR 0xFFFFFFF7 // 無効なメモリ管理ポインタを指定した
|
||||
#define FS_INVALIDENV 0xFFFFFFF6 // 不正な環境を指定した
|
||||
#define FS_ILLEGALFMT 0xFFFFFFF5 // 実行ファイルのフォーマットが異常
|
||||
#define FS_ILLEGALMOD 0xFFFFFFF4 // オープンのアクセスモードが異常
|
||||
#define FS_INVALIDPATH 0xFFFFFFF3 // ファイル名の指定に誤りがある
|
||||
#define FS_INVALIDPRM 0xFFFFFFF2 // 無効なパラメータでコールした
|
||||
#define FS_INVALIDDRV 0xFFFFFFF1 // ドライブ指定に誤りがある
|
||||
#define FS_DELCURDIR 0xFFFFFFF0 // カレントディレクトリは削除できない
|
||||
#define FS_NOTIOCTRL 0xFFFFFFEF // IOCTRLできないデバイス
|
||||
#define FS_LASTFILE 0xFFFFFFEE // これ以上ファイルが見つからない
|
||||
#define FS_CANTWRITE 0xFFFFFFED // 指定のファイルは書き込みできない
|
||||
#define FS_DIRALREADY 0xFFFFFFEC // 指定のディレクトリは既に登録されている
|
||||
#define FS_CANTDELETE 0xFFFFFFEB // ファイルがあるので削除できない
|
||||
#define FS_CANTRENAME 0xFFFFFFEA // ファイルがあるのでリネームできない
|
||||
#define FS_DISKFULL 0xFFFFFFE9 // ディスクが一杯でファイルが作れない
|
||||
#define FS_DIRFULL 0xFFFFFFE8 // ディレクトリが一杯でファイルが作れない
|
||||
#define FS_CANTSEEK 0xFFFFFFE7 // 指定の位置にはシークできない
|
||||
#define FS_SUPERVISOR 0xFFFFFFE6 // スーパーバイザ状態でスーパバイザ指定した
|
||||
#define FS_THREADNAME 0xFFFFFFE5 // 同じスレッド名が存在する
|
||||
#define FS_BUFWRITE 0xFFFFFFE4 // プロセス間通信のバッファが書込み禁止
|
||||
#define FS_BACKGROUND 0xFFFFFFE3 // バックグラウンドプロセスを起動できない
|
||||
#define FS_OUTOFLOCK 0xFFFFFFE0 // ロック領域が足りない
|
||||
#define FS_LOCKED 0xFFFFFFDF // ロックされていてアクセスできない
|
||||
#define FS_DRIVEOPENED 0xFFFFFFDE // 指定のドライブはハンドラがオープンされている
|
||||
#define FS_LINKOVER 0xFFFFFFDD // シンボリックリンクネストが16回を超えた
|
||||
#define FS_FILEEXIST 0xFFFFFFB0 // ファイルが存在する
|
||||
#define FS_INVALIDFUNC 0xFFFFFFFF // Executed an invalid function
|
||||
#define FS_FILENOTFND 0xFFFFFFFE // The selected file can not be found
|
||||
#define FS_DIRNOTFND 0xFFFFFFFD // The selected directory can not be found
|
||||
#define FS_OVEROPENED 0xFFFFFFFC // There are too many files open
|
||||
#define FS_CANTACCESS 0xFFFFFFFB // Can not access the direcory or volume
|
||||
#define FS_NOTOPENED 0xFFFFFFFA // The selected handle is not opened
|
||||
#define FS_INVALIDMEM 0xFFFFFFF9 // Memory management has been destroyed
|
||||
#define FS_OUTOFMEM 0xFFFFFFF8 // Insufficient memory for execution
|
||||
#define FS_INVALIDPTR 0xFFFFFFF7 // Selected an invalid memory management pointer
|
||||
#define FS_INVALIDENV 0xFFFFFFF6 // Selected an invalid environment
|
||||
#define FS_ILLEGALFMT 0xFFFFFFF5 // The exeucted file is in an invalid format
|
||||
#define FS_ILLEGALMOD 0xFFFFFFF4 // Invalid open access mode
|
||||
#define FS_INVALIDPATH 0xFFFFFFF3 // Mistake in selected file name
|
||||
#define FS_INVALIDPRM 0xFFFFFFF2 // Called with an invalid parameter
|
||||
#define FS_INVALIDDRV 0xFFFFFFF1 // Mistake in selected drive
|
||||
#define FS_DELCURDIR 0xFFFFFFF0 // Unable to delete the current directory
|
||||
#define FS_NOTIOCTRL 0xFFFFFFEF // Unable to use IOCTRL with the device
|
||||
#define FS_LASTFILE 0xFFFFFFEE // Can not find any more files
|
||||
#define FS_CANTWRITE 0xFFFFFFED // Selected file can not be written
|
||||
#define FS_DIRALREADY 0xFFFFFFEC // Selected directory is already registered
|
||||
#define FS_CANTDELETE 0xFFFFFFEB // Can not delete because of a file
|
||||
#define FS_CANTRENAME 0xFFFFFFEA // Can not rename because of a file
|
||||
#define FS_DISKFULL 0xFFFFFFE9 // Can not create a file because the disk is full
|
||||
#define FS_DIRFULL 0xFFFFFFE8 // Can not create a file because the directory is full
|
||||
#define FS_CANTSEEK 0xFFFFFFE7 // Can not seek in the selected location
|
||||
#define FS_SUPERVISOR 0xFFFFFFE6 // Selected supervisor in supervisor mode
|
||||
#define FS_THREADNAME 0xFFFFFFE5 // A thread with this name already exists
|
||||
#define FS_BUFWRITE 0xFFFFFFE4 // Writing to inter-process communication buffers is disallowed
|
||||
#define FS_BACKGROUND 0xFFFFFFE3 // Unable to start a background process
|
||||
#define FS_OUTOFLOCK 0xFFFFFFE0 // Insufficient lock space
|
||||
#define FS_LOCKED 0xFFFFFFDF // Can not access because it is locked
|
||||
#define FS_DRIVEOPENED 0xFFFFFFDE // Selected drive has an open handler
|
||||
#define FS_LINKOVER 0xFFFFFFDD // The symbolic link is nested over 16 times
|
||||
#define FS_FILEEXIST 0xFFFFFFB0 // The file exists
|
||||
|
||||
#define FS_FATAL_MEDIAOFFLINE 0xFFFFFFA3 // メディアが入っていない
|
||||
#define FS_FATAL_WRITEPROTECT 0xFFFFFFA2 // 書き込み禁止違反
|
||||
#define FS_FATAL_INVALIDCOMMAND 0xFFFFFFA1 // 不正なコマンド番号
|
||||
#define FS_FATAL_INVALIDUNIT 0xFFFFFFA0 // 不正なユニット番号
|
||||
#define FS_FATAL_MEDIAOFFLINE 0xFFFFFFA3 // No media inserted
|
||||
#define FS_FATAL_WRITEPROTECT 0xFFFFFFA2 // Write protected
|
||||
#define FS_FATAL_INVALIDCOMMAND 0xFFFFFFA1 // Invalid command number
|
||||
#define FS_FATAL_INVALIDUNIT 0xFFFFFFA0 // Invalid unit number
|
||||
|
||||
#define HUMAN68K_PATH_MAX 96 // Human68kのパス最大長
|
||||
#define HUMAN68K_PATH_MAX 96 // Longest path allowed in Human68k
|
||||
|
||||
//===========================================================================
|
||||
//
|
||||
/// Human68k 名前空間
|
||||
/// Human68k name space
|
||||
//
|
||||
//===========================================================================
|
||||
/// ファイル属性ビット
|
||||
/// File attribute bit
|
||||
enum attribute_t {
|
||||
AT_READONLY = 0x01, // 読み込み専用属性
|
||||
AT_HIDDEN = 0x02, // 隠し属性
|
||||
AT_SYSTEM = 0x04, // システム属性
|
||||
AT_VOLUME = 0x08, // ボリュームラベル属性
|
||||
AT_DIRECTORY= 0x10, // ディレクトリ属性
|
||||
AT_ARCHIVE = 0x20, // アーカイブ属性
|
||||
AT_ALL = 0xFF, // 全ての属性ビットが1
|
||||
AT_READONLY = 0x01, // Read only attribute
|
||||
AT_HIDDEN = 0x02, // Hidden attribute
|
||||
AT_SYSTEM = 0x04, // System attribute
|
||||
AT_VOLUME = 0x08, // Volume label attribute
|
||||
AT_DIRECTORY = 0x10, // Directory attribute
|
||||
AT_ARCHIVE = 0x20, // Archive attribute
|
||||
AT_ALL = 0xFF, // All attribute bits are 1
|
||||
};
|
||||
|
||||
/// ファイルオープンモード
|
||||
/// File open modes
|
||||
enum open_t {
|
||||
OP_READ = 0, // 読み込み
|
||||
OP_WRITE = 1, // 書き込み
|
||||
OP_FULL = 2, // 読み書き
|
||||
OP_MASK = 0x0F, // 判定用マスク
|
||||
OP_SHARE_NONE = 0x10, // 共有禁止
|
||||
OP_SHARE_READ = 0x20, // 読み込み共有
|
||||
OP_SHARE_WRITE = 0x30, // 書き込み共有
|
||||
OP_SHARE_FULL = 0x40, // 読み書き共有
|
||||
OP_SHARE_MASK = 0x70, // 共有判定用マスク
|
||||
OP_SPECIAL = 0x100,// 辞書アクセス
|
||||
OP_READ = 0, // Read
|
||||
OP_WRITE = 1, // Write
|
||||
OP_FULL = 2, // Read/Write
|
||||
OP_MASK = 0x0F, // Decision mask
|
||||
OP_SHARE_NONE = 0x10, // Sharing forbidden
|
||||
OP_SHARE_READ = 0x20, // Read sharing
|
||||
OP_SHARE_WRITE = 0x30, // Write sharing
|
||||
OP_SHARE_FULL = 0x40, // Read/Write sharing
|
||||
OP_SHARE_MASK = 0x70, // Sharing decision mask
|
||||
OP_SPECIAL = 0x100, // Dictionary access
|
||||
};
|
||||
|
||||
/// シーク種類
|
||||
/// Seek types
|
||||
enum seek_t {
|
||||
SK_BEGIN = 0, // ファイル先頭から
|
||||
SK_CURRENT = 1, // 現在位置から
|
||||
SK_END = 2, // ファイル末尾から
|
||||
SK_BEGIN = 0, // From the beginning of a file
|
||||
SK_CURRENT = 1, // From the current location
|
||||
SK_END = 2, // From the end of the file
|
||||
};
|
||||
|
||||
/// メディアバイト
|
||||
/// Media byte
|
||||
enum media_t {
|
||||
MEDIA_2DD_10 = 0xE0, // 2DD/10セクタ
|
||||
MEDIA_1D_9 = 0xE5, // 1D/9セクタ
|
||||
MEDIA_2D_9 = 0xE6, // 2D/9セクタ
|
||||
MEDIA_1D_8 = 0xE7, // 1D/8セクタ
|
||||
MEDIA_2D_8 = 0xE8, // 2D/8セクタ
|
||||
MEDIA_2HT = 0xEA, // 2HT
|
||||
MEDIA_2HS = 0xEB, // 2HS
|
||||
MEDIA_2HDE = 0xEC, // 2DDE
|
||||
MEDIA_1DD_9 = 0xEE, // 1DD/9セクタ
|
||||
MEDIA_1DD_8 = 0xEF, // 1DD/8セクタ
|
||||
MEDIA_MANUAL = 0xF1, // リモートドライブ (手動イジェクト)
|
||||
MEDIA_REMOVABLE = 0xF2, // リモートドライブ (リムーバブル)
|
||||
MEDIA_REMOTE = 0xF3, // リモートドライブ
|
||||
MEDIA_DAT = 0xF4, // SCSI-DAT
|
||||
MEDIA_CDROM = 0xF5, // SCSI-CDROM
|
||||
MEDIA_MO = 0xF6, // SCSI-MO
|
||||
MEDIA_SCSI_HD = 0xF7, // SCSI-HD
|
||||
MEDIA_SASI_HD = 0xF8, // SASI-HD
|
||||
MEDIA_RAMDISK = 0xF9, // RAMディスク
|
||||
MEDIA_2HQ = 0xFA, // 2HQ
|
||||
MEDIA_2DD_8 = 0xFB, // 2DD/8セクタ
|
||||
MEDIA_2DD_9 = 0xFC, // 2DD/9セクタ
|
||||
MEDIA_2HC = 0xFD, // 2HC
|
||||
MEDIA_2HD = 0xFE, // 2HD
|
||||
MEDIA_2DD_10 = 0xE0, // 2DD/10 sector
|
||||
MEDIA_1D_9 = 0xE5, // 1D/9 sector
|
||||
MEDIA_2D_9 = 0xE6, // 2D/9 sector
|
||||
MEDIA_1D_8 = 0xE7, // 1D/8 sector
|
||||
MEDIA_2D_8 = 0xE8, // 2D/8 sector
|
||||
MEDIA_2HT = 0xEA, // 2HT
|
||||
MEDIA_2HS = 0xEB, // 2HS
|
||||
MEDIA_2HDE = 0xEC, // 2DDE
|
||||
MEDIA_1DD_9 = 0xEE, // 1DD/9 sector
|
||||
MEDIA_1DD_8 = 0xEF, // 1DD/8 sector
|
||||
MEDIA_MANUAL = 0xF1, // Remote drive (manual eject)
|
||||
MEDIA_REMOVABLE = 0xF2, // Remote drive (removable)
|
||||
MEDIA_REMOTE = 0xF3, // Remote drive
|
||||
MEDIA_DAT = 0xF4, // SCSI-DAT
|
||||
MEDIA_CDROM = 0xF5, // SCSI-CDROM
|
||||
MEDIA_MO = 0xF6, // SCSI-MO
|
||||
MEDIA_SCSI_HD = 0xF7, // SCSI-HD
|
||||
MEDIA_SASI_HD = 0xF8, // SASI-HD
|
||||
MEDIA_RAMDISK = 0xF9, // RAM disk
|
||||
MEDIA_2HQ = 0xFA, // 2HQ
|
||||
MEDIA_2DD_8 = 0xFB, // 2DD/8 sector
|
||||
MEDIA_2DD_9 = 0xFC, // 2DD/9 sector
|
||||
MEDIA_2HC = 0xFD, // 2HC
|
||||
MEDIA_2HD = 0xFE, // 2HD
|
||||
};
|
||||
|
||||
/// namests構造体
|
||||
/// namests struct
|
||||
typedef struct {
|
||||
BYTE wildcard; // ワイルドカード文字数
|
||||
BYTE drive; // ドライブ番号
|
||||
BYTE path[65]; // パス(サブディレクトリ+/)
|
||||
BYTE name[8]; // ファイル名 (PADDING 0x20)
|
||||
BYTE ext[3]; // 拡張子 (PADDING 0x20)
|
||||
BYTE add[10]; // ファイル名追加 (PADDING 0x00)
|
||||
BYTE wildcard; // Wildcard character length
|
||||
BYTE drive; // Drive number
|
||||
BYTE path[65]; // Path (subdirectory +/)
|
||||
BYTE name[8]; // File name (PADDING 0x20)
|
||||
BYTE ext[3]; // Extension (PADDING 0x20)
|
||||
BYTE add[10]; // File name addition (PADDING 0x00)
|
||||
} namests_t;
|
||||
|
||||
/// files構造体
|
||||
/// files struct
|
||||
typedef struct {
|
||||
BYTE fatr; // + 0 検索する属性 読込専用
|
||||
BYTE fatr; // + 0 search attribute; read-only
|
||||
BYTE pad1[3]; // padding
|
||||
// BYTE drive; // + 1 ドライブ番号 読込専用
|
||||
DWORD sector; // + 2 ディレクトリのセクタ DOS _FILES先頭アドレスで代用
|
||||
// WORD cluster; // + 6 ディレクトリのクラスタ 詳細不明 (未使用)
|
||||
WORD offset; // + 8 ディレクトリエントリ 書込専用
|
||||
// BYTE name[8]; // +10 作業用ファイル名 読込専用 (未使用)
|
||||
// BYTE ext[3]; // +18 作業用拡張子 読込専用 (未使用)
|
||||
BYTE attr; // +21 ファイル属性 書込専用
|
||||
// BYTE drive; // + 1 drive number; read-only
|
||||
DWORD sector; // + 2 directory sector; DOS _FILES first address substitute
|
||||
// WORD cluster; // + 6 directory cluster; details unknown (unused)
|
||||
WORD offset; // + 8 directory entry; write-only
|
||||
// BYTE name[8]; // +10 working file name; write-only (unused)
|
||||
// BYTE ext[3]; // +18 working extension; write-only (unused)
|
||||
BYTE attr; // +21 file attribute; write-only
|
||||
BYTE pad2; // padding
|
||||
WORD time; // +22 最終変更時刻 書込専用
|
||||
WORD date; // +24 最終変更月日 書込専用
|
||||
DWORD size; // +26 ファイルサイズ 書込専用
|
||||
BYTE full[23]; // +30 フルファイル名 書込専用
|
||||
WORD time; // +22 last change time of day; write-only
|
||||
WORD date; // +24 last change date; write-only
|
||||
DWORD size; // +26 file size; write-only
|
||||
BYTE full[23]; // +30 full name; write-only
|
||||
BYTE pad3; // padding
|
||||
} files_t;
|
||||
|
||||
/// FCB<43>\‘¢‘Ì
|
||||
typedef struct {
|
||||
// BYTE pad00[6]; // + 0~+ 5 (未使用)
|
||||
DWORD fileptr; // + 6~+ 9 ファイルポインタ
|
||||
// BYTE pad01[4]; // +10~+13 (未使用)
|
||||
WORD mode; // +14~+15 オープンモード
|
||||
// BYTE pad02[16]; // +16~+31 (未使用)
|
||||
// DWORD zero; // +32~+35 オープンのとき0が書き込まれている (未使用)
|
||||
// BYTE name[8]; // +36~+43 ファイル名 (PADDING 0x20) (未使用)
|
||||
// BYTE ext[3]; // +44~+46 拡張子 (PADDING 0x20) (未使用)
|
||||
BYTE attr; // +47 ファイル属性
|
||||
BYTE pad; // padding
|
||||
// BYTE add[10]; // +48~+57 ファイル名追加 (PADDING 0x00) (未使用)
|
||||
WORD time; // +58~+59 最終変更時刻
|
||||
WORD date; // +60~+61 最終変更月日
|
||||
// WORD cluster; // +62~+63 クラスタ番号 (未使用)
|
||||
DWORD size; // +64~+67 ファイルサイズ
|
||||
// BYTE pad03[28]; // +68~+95 FATキャッシュ (未使用)
|
||||
// BYTE pad00[6]; // + 0~+ 5 (unused)
|
||||
DWORD fileptr; // + 6~+ 9 file pointer
|
||||
// BYTE pad01[4]; // +10~+13 (unused)
|
||||
WORD mode; // +14~+15 open mode
|
||||
// BYTE pad02[16]; // +16~+31 (unused)
|
||||
// DWORD zero; // +32~+35 zeros are written when opened (unused)
|
||||
// BYTE name[8]; // +36~+43 file name (PADDING 0x20) (unused)
|
||||
// BYTE ext[3]; // +44~+46 extension (PADDING 0x20) (unused)
|
||||
BYTE attr; // +47 file attribute
|
||||
// BYTE add[10]; // +48~+57 file name addition (PADDING 0x00) (unused)
|
||||
WORD time; // +58~+59 last change time of day
|
||||
WORD date; // +60~+61 last change date
|
||||
// WORD cluster; // +62~+63 cluster number (unused)
|
||||
DWORD size; // +64~+67 file size
|
||||
// BYTE pad03[28]; // +68~+95 FAT cache (unused)
|
||||
} fcb_t;
|
||||
|
||||
/// capacity構造体
|
||||
/// capacity struct
|
||||
typedef struct {
|
||||
WORD freearea; // + 0 使用可能なクラスタ数
|
||||
WORD clusters; // + 2 総クラスタ数
|
||||
WORD sectors; // + 4 クラスタあたりのセクタ数
|
||||
WORD bytes; // + 6 セクタ当たりのバイト数
|
||||
WORD freearea; // + 0 Number of available clusters
|
||||
WORD clusters; // + 2 Total number of clusters
|
||||
WORD sectors; // + 4 Number of sectors per cluster
|
||||
WORD bytes; // + 6 Number of bytes per sector
|
||||
} capacity_t;
|
||||
|
||||
/// ctrldrive構造体
|
||||
/// ctrldrive struct
|
||||
typedef struct {
|
||||
BYTE status; // +13 状態
|
||||
BYTE status; // +13 status
|
||||
BYTE pad[3]; // padding
|
||||
} ctrldrive_t;
|
||||
|
||||
/// DPB構造体
|
||||
/// DPB struct
|
||||
typedef struct {
|
||||
WORD sector_size; // + 0 1セクタ当りのバイト数
|
||||
BYTE cluster_size; // + 2 1クラスタ当りのセクタ数-1
|
||||
BYTE shift; // + 3 クラスタ→セクタのシフト数
|
||||
WORD fat_sector; // + 4 FATの先頭セクタ番号
|
||||
BYTE fat_max; // + 6 FAT領域の個数
|
||||
BYTE fat_size; // + 7 FATの占めるセクタ数(複写分を除く)
|
||||
WORD file_max; // + 8 ルートディレクトリに入るファイルの個数
|
||||
WORD data_sector; // +10 データ領域の先頭セクタ番号
|
||||
WORD cluster_max; // +12 総クラスタ数+1
|
||||
WORD root_sector; // +14 ルートディレクトリの先頭セクタ番号
|
||||
// DWORD driverentry; // +16 デバイスドライバへのポインタ (未使用)
|
||||
BYTE media; // +20 メディア識別子
|
||||
// BYTE flag; // +21 DPB使用フラグ (未使用)
|
||||
BYTE pad; // padding
|
||||
WORD sector_size; // + 0 Number of bytes in one sector
|
||||
BYTE cluster_size; // + 2 Number sectors in one cluster -1
|
||||
BYTE shift; // + 3 Number of cluster<65>¨sector shifts
|
||||
WORD fat_sector; // + 4 FAT first sector number
|
||||
BYTE fat_max; // + 6 FAT storage quantity
|
||||
BYTE fat_size; // + 7 FAT controlled sector number (excluding duplicates)
|
||||
WORD file_max; // + 8 Number of files in the root directory
|
||||
WORD data_sector; // +10 First sector number of data storage
|
||||
WORD cluster_max; // +12 Total number of clusters +1
|
||||
WORD root_sector; // +14 First sector number of root directory
|
||||
// DWORD driverentry; // +16 Device driver pointer (unused)
|
||||
BYTE media; // +20 Media identifier
|
||||
// BYTE flag; // +21 Flag used by DPB (unused)
|
||||
BYTE pad; // padding
|
||||
} dpb_t;
|
||||
|
||||
/// ディレクトリエントリ構造体
|
||||
/// Directory entry struct
|
||||
typedef struct {
|
||||
BYTE name[8]; // + 0 ファイル名 (PADDING 0x20)
|
||||
BYTE ext[3]; // + 8 拡張子 (PADDING 0x20)
|
||||
BYTE attr; // +11 ファイル属性
|
||||
BYTE add[10]; // +12 ファイル名追加 (PADDING 0x00)
|
||||
WORD time; // +22 最終変更時刻
|
||||
WORD date; // +24 最終変更月日
|
||||
WORD cluster; // +26 クラスタ番号
|
||||
DWORD size; // +28 ファイルサイズ
|
||||
BYTE name[8]; // + 0 File name (PADDING 0x20)
|
||||
BYTE ext[3]; // + 8 Extension (PADDING 0x20)
|
||||
BYTE attr; // +11 File attribute
|
||||
BYTE add[10]; // +12 File name addition (PADDING 0x00)
|
||||
WORD time; // +22 Last change time of day
|
||||
WORD date; // +24 Last change date
|
||||
WORD cluster; // +26 Cluster number
|
||||
DWORD size; // +28 File size
|
||||
} dirent_t;
|
||||
|
||||
/// IOCTRLパラメータ共用体
|
||||
/// IOCTRL parameter union
|
||||
typedef union {
|
||||
BYTE buffer[8]; // バイト単位でのアクセス
|
||||
DWORD param; // パラメータ(先頭4バイト)
|
||||
WORD media; // メディアバイト(先頭2バイト)
|
||||
BYTE buffer[8]; // Access in byte units
|
||||
DWORD param; // Parameter (First 4 bytes)
|
||||
WORD media; // Media byte (First 2 bytes)
|
||||
} ioctrl_t;
|
||||
|
||||
/// コマンドライン引数構造体
|
||||
/// Command line parameter struct
|
||||
typedef struct {
|
||||
BYTE buf[256]; // コマンドライン引数
|
||||
BYTE buf[256]; // Command line argument
|
||||
} argument_t;
|
||||
|
||||
#endif // bridge_h
|
||||
|
@ -3,9 +3,9 @@
|
||||
* SCSI Target Emulator RaSCSI (*^..^*)
|
||||
* for Raspberry Pi
|
||||
*
|
||||
* Powered by XM6 TypeG Technorogy.
|
||||
* Powered by XM6 TypeG Technology.
|
||||
* Copyright (C) 2016-2019 GIMONS
|
||||
* [ ホストファイルシステム ブリッジドライバ ]
|
||||
* [ Host Filesystem Bridge Driver ]
|
||||
*
|
||||
* Based on
|
||||
* X68k Emulator Host Filesystem Driver version 0.27
|
||||
@ -20,19 +20,19 @@
|
||||
|
||||
.XREF _Init, _Process ;bridge.c
|
||||
|
||||
COMMAND EQU 2 コマンド番号
|
||||
ERRLOW EQU 3 エラーコード下位8ビット
|
||||
ERRHIGH EQU 4 エラーコード上位8ビット
|
||||
MXUNIT EQU 13 ユニット数
|
||||
DEVEND EQU 14 ドライバ終了アドレス
|
||||
BDEVNO EQU 22 ベースドライブ番号
|
||||
COMMAND EQU 2 Command number
|
||||
ERRLOW EQU 3 Error code lower 8 bits
|
||||
ERRHIGH EQU 4 Error code upper 8 bits
|
||||
MXUNIT EQU 13 Number of units
|
||||
DEVEND EQU 14 Driver exit address
|
||||
BDEVNO EQU 22 Base drive number
|
||||
|
||||
DDHEADER:
|
||||
DC.L -1 +$00 リンクポインタ
|
||||
DC.W $2040 +$04 デバイス属性
|
||||
DC.L -1 +$00 Link pointer
|
||||
DC.W $2040 +$04 Device attribute
|
||||
DC.L DDSTRATEGY +$06
|
||||
DC.L DDENTRY_FIRST +$0A
|
||||
DC.B '*EMUHOST' +$0E デバイス名
|
||||
DC.B '*EMUHOST' +$0E Device name
|
||||
|
||||
DDREQUEST:
|
||||
DC.L 0
|
||||
@ -41,12 +41,12 @@ DDSTRATEGY:
|
||||
MOVE.L A5,DDREQUEST
|
||||
RTS
|
||||
|
||||
*デバイスドライバエントリ
|
||||
*Device driver entry
|
||||
DDENTRY:
|
||||
MOVE.L SP,(STACK_BUFF)
|
||||
LEA (DEF_STACK),SP
|
||||
MOVEM.L D1-D3/A0-A2,-(SP)
|
||||
MOVEM.L DDREQUEST(PC),D0 D0.L: リクエストヘッダアドレス
|
||||
MOVEM.L DDREQUEST(PC),D0 D0.L: Request header address
|
||||
MOVE.L D0,-(SP)
|
||||
BSR _Process
|
||||
ADDQ.L #4,SP
|
||||
@ -56,67 +56,67 @@ DDENTRY:
|
||||
|
||||
KEEP_HERE:
|
||||
|
||||
*初回のみのデバイスドライバエントリ
|
||||
*First time only device driver entry
|
||||
DDENTRY_FIRST:
|
||||
MOVEM.L D1-D3/A0-A2/A5,-(SP)
|
||||
MOVEA.L DDREQUEST(PC),A5 A5.L: リクエストヘッダアドレス
|
||||
* CMPI.B #$40,COMMAND(A5) 現行のHuman68kではチェック不要
|
||||
* BNE UNSUPPORTED エラー: 未対応
|
||||
MOVEA.L DDREQUEST(PC),A5 A5.L: Request header address
|
||||
* CMPI.B #$40,COMMAND(A5) No need to check when Human68k is running
|
||||
* BNE UNSUPPORTED Error: Not supported
|
||||
|
||||
*タイトル表示
|
||||
*Show title
|
||||
PEA MESSAGE_TITLE(PC)
|
||||
DOS _PRINT
|
||||
ADDQ.L #4,SP
|
||||
|
||||
*デバイスチェック
|
||||
*Device check
|
||||
DEVICE_CHECK:
|
||||
BSR _Init
|
||||
|
||||
TST.L D0
|
||||
BEQ NOTFOUND エラー: デバイスが存在しません
|
||||
BEQ NOTFOUND Error: Device not found
|
||||
|
||||
*常駐開始
|
||||
*Resident program start
|
||||
LEA DDENTRY(PC),A1
|
||||
|
||||
LEA DDHEADER+$0A(PC),A0
|
||||
MOVE.L A1,(A0) ドライバエントリを設定
|
||||
MOVE.L #PROG_END,DEVEND(A5) 常駐終了アドレスを設定
|
||||
MOVE.L A1,(A0) Configure driver entry
|
||||
MOVE.L #PROG_END,DEVEND(A5) Configure resident exit address
|
||||
|
||||
ST.B MXUNIT(A5) ポート未実装の判定のため負の値を設定しておく
|
||||
JSR (A1) ドライバエントリを実行
|
||||
ST.B MXUNIT(A5) Set negative number since port is considered unimplemented
|
||||
JSR (A1) Execute driver entry
|
||||
|
||||
TST.B MXUNIT(A5) ユニット数確認
|
||||
BLE NODRIVE エラー: ドライブがありません
|
||||
TST.B MXUNIT(A5) Verify number of units
|
||||
BLE NODRIVE Error: No drive
|
||||
|
||||
MOVE.B BDEVNO(A5),D0
|
||||
MOVE.B MXUNIT(A5),D1
|
||||
LEA FIRSTDRIVE(PC),A0
|
||||
ADD.B D0,(A0) 開始ドライブ名書き換え
|
||||
ADD.B D1,D0 終了ドライブ名書き換え
|
||||
ADD.B D0,(A0) Overwrite start drive name
|
||||
ADD.B D1,D0 Overwrite stop drive name
|
||||
ADD.B D0,LASTDRIVE-FIRSTDRIVE(A0)
|
||||
|
||||
PEA MESSAGE_DRIVENAME(PC) 正常: ドライブA:
|
||||
PEA MESSAGE_DRIVENAME(PC) Normal: Drive A:
|
||||
DOS _PRINT
|
||||
|
||||
PEA MESSAGE_DRIVENAME2(PC) 正常: からZ:
|
||||
PEA MESSAGE_DRIVENAME2(PC) Normal: to Z:
|
||||
SUBQ.B #2,D1
|
||||
BCS @F
|
||||
DOS _PRINT
|
||||
@@ ADDQ.L #8,SP
|
||||
|
||||
PEA MESSAGE_DRIVENAME3(PC) 正常: を登録しました
|
||||
PEA MESSAGE_DRIVENAME3(PC) Normal: was registered
|
||||
BRA QUIT
|
||||
|
||||
NOTFOUND:
|
||||
PEA MESSAGE_NOTFOUND(PC) エラー: デバイスが存在しません
|
||||
PEA MESSAGE_NOTFOUND(PC) Error: Device not found
|
||||
BRA ABORT
|
||||
|
||||
UNSUPPORTED:
|
||||
PEA MESSAGE_UNSUPPORTED(PC) エラー: 未対応
|
||||
PEA MESSAGE_UNSUPPORTED(PC) Error: Not supported
|
||||
BRA ABORT
|
||||
|
||||
NODRIVE:
|
||||
PEA MESSAGE_NODRIVE(PC) エラー: ドライブがありません
|
||||
PEA MESSAGE_NODRIVE(PC) Error: No drive
|
||||
|
||||
ABORT:
|
||||
MOVE.B #$0D,ERRLOW(A5)
|
||||
@ -139,41 +139,41 @@ SECRET:
|
||||
|
||||
DATA
|
||||
|
||||
*エラーメッセージ
|
||||
*Error messages
|
||||
MESSAGE_NOTFOUND:
|
||||
DC.B 'デバイスが存在しません',$0D,$0A,0
|
||||
DC.B 'Device not found',$0D,$0A,0
|
||||
|
||||
MESSAGE_UNSUPPORTED:
|
||||
DC.B '未対応',$0D,$0A,0
|
||||
DC.B 'Not supported',$0D,$0A,0
|
||||
|
||||
MESSAGE_NODRIVE:
|
||||
DC.B 'ドライブがありません',$0D,$0A,0
|
||||
DC.B 'No drive',$0D,$0A,0
|
||||
|
||||
*登録メッセージ
|
||||
*Registration messages
|
||||
MESSAGE_DRIVENAME:
|
||||
DC.B 'ドライブ'
|
||||
DC.B 'Drive'
|
||||
FIRSTDRIVE:
|
||||
DC.B 'A:',0
|
||||
MESSAGE_DRIVENAME2:
|
||||
DC.B 'から'
|
||||
DC.B ' to '
|
||||
LASTDRIVE:
|
||||
DC.B '@:',0
|
||||
MESSAGE_DRIVENAME3:
|
||||
DC.B 'を登録しました',$0D,$0A,0
|
||||
DC.B ' was registered',$0D,$0A,0
|
||||
|
||||
*タイトル
|
||||
*Title
|
||||
MESSAGE_TITLE:
|
||||
DC.B $0D,$0A
|
||||
MESSAGE_TITLE2:
|
||||
DC.B 'RaSCSI FileSystem Driver version 1.42',$0D,$0A,0
|
||||
|
||||
*ありがとう!
|
||||
*Thanks!
|
||||
CREDIT:
|
||||
DC.B 'Coded by GIMONS',$0D,$0A
|
||||
DC.B 'Special thanks to',$0D,$0A
|
||||
DC.B 9,'co',$0D,$0A
|
||||
DC.B 9,'PI.',$0D,$0A
|
||||
DC.B 9,'立花@桑島技研',$0D,$0A
|
||||
DC.B 9,'PI.',$0D,$0A
|
||||
DC.B 9,'Tachibana@Kuwashima Giken',$0D,$0A
|
||||
DC.B 0
|
||||
|
||||
BSS
|
||||
|
@ -1,29 +0,0 @@
|
||||
RaSCSI ファイルシステムドライバ
|
||||
RASDRV version 1.42
|
||||
|
||||
■概要
|
||||
|
||||
本プログラムはX68000実機で動作しているHuman68kからRaSCSIのブリッジデバイスを
|
||||
通してRaspberry Pi側のファイルシステムを直接操作するためのデバイスドライバです。
|
||||
X68000エミュレータであるXM6及びXM6改ならびにTypeGのWindrvXMと同等の機能を提供
|
||||
します。
|
||||
|
||||
■解説
|
||||
|
||||
利用するにはRaspberry PiのRaSCSIでブリッジデバイスを有効にする必要があります。
|
||||
例えばSCSI ID6にブリッジデバイスを有効にする場合はrascsi -ID6 BRIDGEといった
|
||||
指定が必要です。
|
||||
|
||||
次にデバイスドライバRASCSI.SYSを実機の環境にコピーします。あとはCONFIG.SYSの
|
||||
後半部分に以下のように記述してください。
|
||||
|
||||
DEVICE = \SYS\RASDRV.SYS
|
||||
|
||||
起動オプションを指定しない場合はRaspberry Piのルートディレクトリ配下をマウント
|
||||
します。引数にディレクトリ名を指定することでそのディレクトリをマウントできます。
|
||||
例えば/home/pi/appと/home/pi/dataというディレクトリをマウントする場合は
|
||||
|
||||
DEVICE = \SYS\RASDRV.SYS /home/pi/app /home/pi/data
|
||||
|
||||
と記述することで二つのディレクトリを別々のドライブとしてマウント可能です。
|
||||
その他のオプションとしてWindrvXMのものが指定可能です。
|
@ -1,42 +0,0 @@
|
||||
RaSCSI用 Ethernetドライバ
|
||||
RASETHER version 1.20
|
||||
|
||||
Based on
|
||||
Neptune-X board driver for Human-68k(ESP-X) version 0.03
|
||||
Programed 1996-7 by Shi-MAD.
|
||||
Special thanks to Niggle, FIRST, yamapu ...
|
||||
|
||||
● このプログラムは
|
||||
|
||||
Shi-MAD さんの作られた Ethernet 用 ISA バスブリッジ "Neptune-X" 用デバ
|
||||
イスドライバ ether_ne.sys を改造した ether_ne.sys ver0.03 +M01 +1 +L12を
|
||||
参考にして開発したRaSCSI用のイーサーネット通信ドライバです。
|
||||
|
||||
● 使い方
|
||||
|
||||
基本的にはオリジナルのドライバと同じようにデバイスドライバとしてCONFIG.SYS
|
||||
で組み込んで下さい。
|
||||
|
||||
例)
|
||||
DEVICE = \SYS\RASETHER.SYS
|
||||
|
||||
以下のオプションが指定可能です。
|
||||
-tx [xは数字] : 使用するtrapを指定します。xは0から6が指定可能です。
|
||||
ただし、指定したtrapが使用中である場合は、trap #0から
|
||||
空いている所を自動探索し、見つかった空きtrapを利用し
|
||||
ます。
|
||||
-n : APIにtrapを使用しません。
|
||||
|
||||
RASETHERで拡張したオプションは以下のとおりです。
|
||||
-px [xは数字] : パケット受信のポーリング間隔を指定します1がデフォルトです。
|
||||
1の場合は約16ms毎にポーリングします。2,3・・・8まで指定が可能
|
||||
です。数字が一つ増えるごとに16ms間隔が大きくなります。
|
||||
|
||||
-ix [xは数字] : ポーリングに使用する割り込みのタイプを指定します。
|
||||
デフォルトは0でMFPのGPIP割り込み(V-DISP)を利用します。
|
||||
1を指定するとTimer-A割り込みを使用します。
|
||||
|
||||
|
||||
● このドライバについて
|
||||
オリジナルのether_ne.sys及び改造版のether_ne.sys ver0.03 +M01 +1 +L12の
|
||||
利用規定に従います。
|
@ -3,9 +3,9 @@
|
||||
// SCSI Target Emulator RaSCSI (*^..^*)
|
||||
// for Raspberry Pi
|
||||
//
|
||||
// Powered by XM6 TypeG Technorogy.
|
||||
// Powered by XM6 TypeG Technology.
|
||||
// Copyright (C) 2016-2017 GIMONS
|
||||
// [ RaSCSI イーサーネット メイン ]
|
||||
// [ RaSCSI Ethernet Main ]
|
||||
//
|
||||
// Based on
|
||||
// Neptune-X board driver for Human-68k(ESP-X) version 0.03
|
||||
@ -25,7 +25,7 @@ int trap_no;
|
||||
int num_of_prt;
|
||||
struct prt PRT_LIST[NPRT];
|
||||
|
||||
// マルチキャスト(未対応)
|
||||
// Multicast (not supported)
|
||||
#ifdef MULTICAST
|
||||
int num_of_multicast;
|
||||
struct eaddr multicast_array[NMULTICAST];
|
||||
@ -45,7 +45,7 @@ static int sprint_eaddr(unsigned char* dst, void* e)
|
||||
}
|
||||
|
||||
/************************************************
|
||||
* TRAP nが使用可能か調べる *
|
||||
* Check if TRAP n can be used *
|
||||
************************************************/
|
||||
static int is_valid_trap(int trap_no)
|
||||
{
|
||||
@ -55,10 +55,10 @@ static int is_valid_trap(int trap_no)
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 使用中かどうかチェック
|
||||
// Check if in use
|
||||
addr = (unsigned int)_dos_intvcg(TRAP_VECNO(trap_no));
|
||||
|
||||
// 処理アドレスの最上位バイトにベクタ番号が入っていれば未使用
|
||||
// Unused if the uppermost byte of the process address contains the vector number
|
||||
if (addr & 0xff000000) {
|
||||
return -1;
|
||||
}
|
||||
@ -67,13 +67,13 @@ static int is_valid_trap(int trap_no)
|
||||
}
|
||||
|
||||
/************************************************
|
||||
* 未使用のTRAP nを検索 *
|
||||
* Search for unused TRAP n *
|
||||
************************************************/
|
||||
static int search_trap_no(int def)
|
||||
{
|
||||
int i;
|
||||
|
||||
// もしdefが使用可能ならそれに決定
|
||||
// If def is usable, choose that
|
||||
if (is_valid_trap(def)) {
|
||||
return def;
|
||||
}
|
||||
@ -96,8 +96,8 @@ static void* trap_vector(int trap_no, void *func)
|
||||
}
|
||||
|
||||
/************************************************
|
||||
初期化関数(ne.sイニシャライズで呼びます) *
|
||||
************************************************/
|
||||
* Init Function (call with ne.s initialize) *
|
||||
************************************************/
|
||||
int Initialize(void)
|
||||
{
|
||||
unsigned char buff[128];
|
||||
@ -106,27 +106,27 @@ int Initialize(void)
|
||||
|
||||
if (SearchRaSCSI())
|
||||
{
|
||||
Print("RaSCSI Ether Adapter の存在を確認できませんでした\r\n");
|
||||
Print("Could not locate the RaSCSI Ethernet Adapter\r\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (InitList(NPRT)
|
||||
|| InitRaSCSI())
|
||||
{
|
||||
Print("RaSCSI Ether Adapter Driver の初期化に失敗しました\r\n");
|
||||
Print("Failed to initialize the RaSCSI Ethernet Adapter Driver\r\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset(ðer_addr, 0x00, sizeof(ether_addr));
|
||||
GetMacAddr(ðer_addr);
|
||||
|
||||
// 未使用trap番号を調べる(指定番号優先)
|
||||
// Inspect unused trap number (prioritize specified number)
|
||||
if (trap_no >= 0) {
|
||||
trap_no = search_trap_no(trap_no);
|
||||
}
|
||||
|
||||
if (trap_no >= 0) {
|
||||
// trapをフックする
|
||||
// Hook the trap
|
||||
trap_vector(trap_no, (void*)trap_entry);
|
||||
sprintf(buff, " API trap number:%d ", trap_no);
|
||||
} else {
|
||||
@ -141,14 +141,14 @@ int Initialize(void)
|
||||
sprintf(buff, "MAC Addr:%s\r\n", buff2);
|
||||
Print(buff);
|
||||
|
||||
// ポーリング開始
|
||||
// Start polling
|
||||
RegisterIntProcess(poll_interval);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/************************************************
|
||||
* プロトコルリスト初期化 *
|
||||
* Initialize Protocol List *
|
||||
************************************************/
|
||||
int InitList(int n)
|
||||
{
|
||||
@ -171,7 +171,7 @@ int InitList(int n)
|
||||
}
|
||||
|
||||
/************************************************
|
||||
* 受信ハンドラ(プロトコル)追加 *
|
||||
* Add Receive Handler (protocol) *
|
||||
************************************************/
|
||||
int AddList(int type, int_handler handler)
|
||||
{
|
||||
@ -184,7 +184,7 @@ int AddList(int type, int_handler handler)
|
||||
|
||||
result = -1;
|
||||
|
||||
// overwrite if alreay exist
|
||||
// overwrite if already exist
|
||||
p = &PRT_LIST[0];
|
||||
for (i = 0; i < NPRT; i++, p++) {
|
||||
if ((p->type == type && p->malloc != (malloc_func)-1)
|
||||
@ -214,7 +214,7 @@ int AddList(int type, int_handler handler)
|
||||
}
|
||||
|
||||
/************************************************
|
||||
* 受信ハンドラ(プロトコル)削除 *
|
||||
* Delete Receive Handler (protocol) *
|
||||
************************************************/
|
||||
int DeleteList(int type)
|
||||
{
|
||||
@ -238,7 +238,7 @@ int DeleteList(int type)
|
||||
}
|
||||
|
||||
/************************************************
|
||||
* 受信ハンドラ(プロトコル)サーチ *
|
||||
* Search Receive Handler (protocol) *
|
||||
************************************************/
|
||||
int_handler SearchList(int type)
|
||||
{
|
||||
@ -260,7 +260,7 @@ int_handler SearchList(int type)
|
||||
|
||||
|
||||
/************************************************
|
||||
* 受信ハンドラ(プロトコル)サーチ *
|
||||
* Search Receive Handler (protocol) *
|
||||
************************************************/
|
||||
int_handler SearchList2(int type, int n)
|
||||
{
|
||||
|
@ -3,9 +3,9 @@
|
||||
// SCSI Target Emulator RaSCSI (*^..^*)
|
||||
// for Raspberry Pi
|
||||
//
|
||||
// Powered by XM6 TypeG Technorogy.
|
||||
// Powered by XM6 TypeG Technology.
|
||||
// Copyright (C) 2016-2017 GIMONS
|
||||
// [ RaSCSI イーサーネット メイン ]
|
||||
// [ RaSCSI Ethernet Main ]
|
||||
//
|
||||
// Based on
|
||||
// Neptune-X board driver for Human-68k(ESP-X) version 0.03
|
||||
@ -25,7 +25,7 @@
|
||||
|
||||
// number of multicast address we can handle **EDIT this**
|
||||
#define NMULTICAST (64)
|
||||
/* ただし、まだマルチキャストには対応していない */
|
||||
/* However, multicast is not yet supported */
|
||||
|
||||
struct eaddr {
|
||||
unsigned char eaddr [6];
|
||||
@ -41,7 +41,7 @@ struct prt {
|
||||
};
|
||||
|
||||
|
||||
// グローバル変数
|
||||
// Global variables
|
||||
extern unsigned int scsiid;
|
||||
extern int trap_no;
|
||||
extern int num_of_prt;
|
||||
@ -53,7 +53,7 @@ extern struct eaddr multicast_array [NMULTICAST];
|
||||
#endif
|
||||
|
||||
|
||||
// プロトタイプ宣言
|
||||
// Prototype declarations
|
||||
extern int Initialize (void);
|
||||
extern int InitList (int);
|
||||
extern int AddList (int, int_handler);
|
||||
@ -69,7 +69,7 @@ extern void MakeMulticastTable (unsigned char*);
|
||||
#endif
|
||||
|
||||
|
||||
// ne.s 内関数
|
||||
// Function within ne.s
|
||||
extern void trap_entry (void);
|
||||
|
||||
|
||||
|
@ -3,9 +3,9 @@
|
||||
** SCSI Target Emulator RaSCSI (*^..^*)
|
||||
** for Raspberry Pi
|
||||
**
|
||||
** Powered by XM6 TypeG Technorogy.
|
||||
** Powered by XM6 TypeG Technology.
|
||||
** Copyright (C) 2016-2017 GIMONS
|
||||
** [ RaSCSI イーサーネット ドライバ ]
|
||||
** [ RaSCSI Ethernet Driver ]
|
||||
**
|
||||
** Based on
|
||||
** Neptune-X board driver for Human-68k(ESP-X) version 0.03
|
||||
@ -23,21 +23,21 @@
|
||||
* Global Symbols ---------------------- *
|
||||
|
||||
*
|
||||
* C言語用 外部宣言
|
||||
* For C language: external declarations
|
||||
*
|
||||
.xref _Initialize, _AddList, _SearchList, _DeleteList ;main.c
|
||||
.xref _GetMacAddr, _SetMacAddr ;scsictl.c
|
||||
.xref _SendPacket, _SetPacketReception ;scsictl.c
|
||||
* .xref _AddMulticastAddr, _DelMulticastAddr ;未実装
|
||||
* .xref _AddMulticastAddr, _DelMulticastAddr ;not implemented
|
||||
|
||||
*
|
||||
* C言語用 外部変数
|
||||
* For C language: external functions
|
||||
*
|
||||
.xref _num_of_prt ;main.c 登録プロトコル数
|
||||
.xref _trap_no ;使用trapナンバー
|
||||
.xref _trans_counter ;scsictl.c 送信/受信バイト数
|
||||
.xref _intr_type ;scsictl.c 割り込み種別
|
||||
.xref _poll_interval ;scsictl.c ポーリング間隔
|
||||
.xref _num_of_prt ;main.c Number of registered protocols
|
||||
.xref _trap_no ;Used trap number
|
||||
.xref _trans_counter ;scsictl.c Number of send/receive bytes
|
||||
.xref _intr_type ;scsictl.c Type of interrupt
|
||||
.xref _poll_interval ;scsictl.c Polling interval
|
||||
|
||||
|
||||
* Text Section -------------------------------- *
|
||||
@ -47,21 +47,21 @@
|
||||
|
||||
|
||||
*
|
||||
* デバイスヘッダー
|
||||
* Device Header
|
||||
*
|
||||
device_header:
|
||||
.dc.l -1 ;リンクポインター
|
||||
.dc.l -1 ;link pointer
|
||||
.dc $8000 ;device att.
|
||||
.dc.l strategy_entry ;stategy entry
|
||||
.dc.l interupt_entry ;interupt entry
|
||||
.dc.l strategy_entry ;strategy entry
|
||||
.dc.l interupt_entry ;interrupt entry
|
||||
.dc.b '/dev/en0' ;device name
|
||||
.dc.b 'EthD' ;for etherlib.a
|
||||
.dc.b 'RASC' ;driver name (この後にエントリーを置く)
|
||||
.dc.b 'RASC' ;driver name (put in entry later)
|
||||
|
||||
* 'RASC' から superjsr_entry の間には何も置かないこと
|
||||
* Don not put anything between 'RASC' and superjsr_entry
|
||||
|
||||
*
|
||||
* イーサドライバ 関数 エントリー ( for DOS _SUPERJSR )
|
||||
* Ether Driver Function Entry ( for DOS _SUPERJSR )
|
||||
* in: d0: command number
|
||||
* a0: args
|
||||
*
|
||||
@ -79,11 +79,11 @@ superjsr_entry:
|
||||
|
||||
bsr do_command
|
||||
movem.l (sp)+,d1-d7/a1-a7
|
||||
rts ;普通のリターン
|
||||
rts ;normal return
|
||||
|
||||
|
||||
*
|
||||
* イーサドライバ 関数 エントリー ( for trap #n )
|
||||
* Ether Driver Function Entry ( for trap #n )
|
||||
* in: d0: command number
|
||||
* a0: args
|
||||
*
|
||||
@ -101,51 +101,51 @@ _trap_entry::
|
||||
|
||||
bsr do_command
|
||||
movem.l (sp)+,d1-d7/a1-a7
|
||||
rte ;割り込みリターン
|
||||
rte ;interrupt return
|
||||
|
||||
|
||||
*
|
||||
* 各処理ふりわけ
|
||||
* Assign each command
|
||||
*
|
||||
do_command:
|
||||
moveq #FUNC_MIN,d1
|
||||
cmp.l d0,d1
|
||||
bgt error ;d0<-2 なら未対応コマンド番号
|
||||
bgt error ;d0<-2 is an unsupported command number
|
||||
moveq #FUNC_MAX,d1
|
||||
cmp.l d1,d0
|
||||
bgt error ;9<d0 なら未対応コマンド番号
|
||||
bgt error ;9<d0 is an unsupported command number
|
||||
|
||||
add d0,d0
|
||||
move (jumptable,pc,d0.w),d0
|
||||
jmp (jumptable,pc,d0.w) ;引数 a0 をレジスタ渡し
|
||||
jmp (jumptable,pc,d0.w) ;Pass parameter a0 to register
|
||||
** rts
|
||||
error:
|
||||
moveq #-1,d0
|
||||
rts
|
||||
|
||||
*
|
||||
* ジャンプテーブル
|
||||
* Jump Table
|
||||
*
|
||||
|
||||
FUNC_MIN: .equ ($-jumptable)/2
|
||||
.dc get_cnt_addr-jumptable ;-2 ... 送受信カウンタのアドレス取得
|
||||
.dc driver_entry-jumptable ;-1 ... 使用trap番号の取得
|
||||
.dc get_cnt_addr-jumptable ;-2 ... Get transfer counter address
|
||||
.dc driver_entry-jumptable ;-1 ... Get used trap number
|
||||
jumptable:
|
||||
.dc get_driver_version-jumptable ;00 ... バージョンの取得
|
||||
.dc get_mac_addr-jumptable ;01 ... 現在のMACアドレス取得
|
||||
.dc get_prom_addr-jumptable ;02 ... PROMに書かれたMACアドレス取得
|
||||
.dc set_mac_addr-jumptable ;03 ... MACアドレスの設定
|
||||
.dc send_packet-jumptable ;04 ... パケット送信
|
||||
.dc set_int_addr-jumptable ;05 ... パケット受信ハンドラ設定
|
||||
.dc get_int_addr-jumptable ;06 ... パケット受信ハンドラのアドレス取得
|
||||
.dc del_int_addr-jumptable ;07 ... ハンドラ削除
|
||||
.dc set_multicast_addr-jumptable ;08 ... (マルチキャストの設定<未対応>)
|
||||
.dc get_statistics-jumptable ;09 ... (統計読み出し<未対応>)
|
||||
.dc get_driver_version-jumptable ;00 ... Get version
|
||||
.dc get_mac_addr-jumptable ;01 ... Get current MAC address
|
||||
.dc get_prom_addr-jumptable ;02 ... Get MAC address written in PROM
|
||||
.dc set_mac_addr-jumptable ;03 ... Set MAC address
|
||||
.dc send_packet-jumptable ;04 ... Send packet
|
||||
.dc set_int_addr-jumptable ;05 ... Set packet receive handler
|
||||
.dc get_int_addr-jumptable ;06 ... Get packet receive handler address
|
||||
.dc del_int_addr-jumptable ;07 ... Delete handler
|
||||
.dc set_multicast_addr-jumptable ;08 ... (Set multicast <unsupported>)
|
||||
.dc get_statistics-jumptable ;09 ... (Read out statistics <unsupported>)
|
||||
FUNC_MAX: .equ ($-jumptable)/2-1
|
||||
|
||||
|
||||
*
|
||||
* コマンド -2: 送受信カウンタのアドレスを返す
|
||||
* Command -2: Return transfer counter address
|
||||
* return: address
|
||||
*
|
||||
get_cnt_addr:
|
||||
@ -155,7 +155,7 @@ get_cnt_addr:
|
||||
|
||||
|
||||
*
|
||||
* コマンド -1: 使用trap番号を返す
|
||||
* Command -1: Return used trap number
|
||||
* return: trap number to use (-1:use SUPERJSR)
|
||||
*
|
||||
driver_entry:
|
||||
@ -166,13 +166,13 @@ driver_entry:
|
||||
*mesff: .dc.b 'DriverEntry',13,10,0
|
||||
* .text
|
||||
|
||||
move.l (_trap_no,pc),d0 ;trap_no ... main.c 変数
|
||||
move.l (_trap_no,pc),d0 ;trap_no ... main.c variable
|
||||
rts
|
||||
|
||||
|
||||
*
|
||||
* コマンド 00: ドライバーのバージョンを返す
|
||||
* return: version number (例... ver1.00 なら 100 を返す)
|
||||
* Command 00: Return driver version
|
||||
* return: version number (Ex... for ver1.00 return 100)
|
||||
*
|
||||
get_driver_version:
|
||||
* pea (mes00,pc)
|
||||
@ -187,7 +187,7 @@ get_driver_version:
|
||||
|
||||
|
||||
*
|
||||
* コマンド 01: 現在の MAC アドレスの取得
|
||||
* Command 01: Get current MAC address
|
||||
* return: same as *dst
|
||||
*
|
||||
get_mac_addr:
|
||||
@ -200,13 +200,13 @@ get_mac_addr:
|
||||
|
||||
pea (a0)
|
||||
pea (a0)
|
||||
bsr _GetMacAddr ;scsictl.c 関数
|
||||
bsr _GetMacAddr ;scsictl.c function
|
||||
addq.l #4,sp
|
||||
move.l (sp)+,d0 ;引数の a0 を d0 にそのまま返す
|
||||
move.l (sp)+,d0 ;Return d0 for parameter a0
|
||||
rts
|
||||
|
||||
*
|
||||
* コマンド 02: EEPROM に書かれた MAC アドレスの取得
|
||||
* Command 02: Get MAC address written to EEPROM
|
||||
* return: same as *dst
|
||||
*
|
||||
get_prom_addr:
|
||||
@ -219,13 +219,13 @@ get_prom_addr:
|
||||
|
||||
pea (a0)
|
||||
pea (a0)
|
||||
bsr _GetMacAddr ;scsictl.c 関数
|
||||
bsr _GetMacAddr ;scsictl.c function
|
||||
addq.l #4,sp
|
||||
move.l (sp)+,d0 ;引数の a0 を d0 にそのまま返す
|
||||
move.l (sp)+,d0 ;Return d0 for parameter a0
|
||||
rts
|
||||
|
||||
*
|
||||
* コマンド 03: MACアドレスの設定
|
||||
* Command 03: Set MAC address
|
||||
* return: 0 (if no errors)
|
||||
*
|
||||
set_mac_addr:
|
||||
@ -237,13 +237,13 @@ set_mac_addr:
|
||||
* .text
|
||||
|
||||
pea (a0)
|
||||
bsr _SetMacAddr ;scsictl.c 関数
|
||||
bsr _SetMacAddr ;scsictl.c function
|
||||
addq.l #4,sp
|
||||
rts
|
||||
|
||||
|
||||
*
|
||||
* コマンド 04: パケット送信
|
||||
* Command 04: Send packet
|
||||
* packet contents:
|
||||
* Distination MAC: 6 bytes
|
||||
* Source(own) MAC: 6 bytes
|
||||
@ -256,10 +256,10 @@ send_packet:
|
||||
* DOS _PRINT
|
||||
* addq.l #4,sp
|
||||
|
||||
move.l (a0)+,d0 ;パケットサイズ
|
||||
move.l (a0),-(sp) ;パケットアドレス
|
||||
move.l (a0)+,d0 ;packet size
|
||||
move.l (a0),-(sp) ;packet address
|
||||
move.l d0,-(sp)
|
||||
bsr _SendPacket ;scsictl.c 関数
|
||||
bsr _SendPacket ;scsictl.c function
|
||||
addq.l #8,sp
|
||||
|
||||
* move.l d0,-(sp)
|
||||
@ -269,14 +269,14 @@ send_packet:
|
||||
* move.l (sp)+,d0
|
||||
* .data
|
||||
*mes04: .dc.b 13,10,'SendPacket,13,10',0
|
||||
*mes04e:.dc.b 13,10,'SendPacketおわり',13,10,0
|
||||
*mes04e:.dc.b 13,10,'SendPacket finished',13,10,0
|
||||
* .text
|
||||
|
||||
rts
|
||||
|
||||
|
||||
*
|
||||
* コマンド 05: 受信割り込みハンドラ追加・設定
|
||||
* Command 05: Set / add receive interrupt handler
|
||||
* type: 0x00000800 IP packet
|
||||
* 0x00000806 ARP packet
|
||||
* return: 0 (if no errors)
|
||||
@ -289,28 +289,28 @@ set_int_addr:
|
||||
*mes05: .dc.b 'SetIntAddr',13,10,0
|
||||
* .text
|
||||
|
||||
move.l (a0)+,d0 ;プロトコル番号
|
||||
move.l (a0),-(sp) ;ハンドラ関数のアドレス
|
||||
move.l (a0)+,d0 ;protocol number
|
||||
move.l (a0),-(sp) ;address to handler function
|
||||
move.l d0,-(sp)
|
||||
bsr _AddList ;main.c 関数
|
||||
bsr _AddList ;main.c function
|
||||
addq.l #8,sp
|
||||
tst.l d0
|
||||
bmi set_int_addr_rts ;登録失敗
|
||||
bmi set_int_addr_rts ;Registration failed
|
||||
|
||||
cmpi.l #1,(_num_of_prt) ;ハンドラ数が1なら割り込み許可へ
|
||||
cmpi.l #1,(_num_of_prt) ;Permit interrupt if number of handlers is 1
|
||||
bne set_int_addr_rts
|
||||
|
||||
pea (1) ;1=<許可>
|
||||
bsr _SetPacketReception ;割り込み許可 ... scsictl.c
|
||||
pea (1) ;1=<Permit>
|
||||
bsr _SetPacketReception ;interrupt permitted ... scsictl.c
|
||||
addq.l #4,sp
|
||||
|
||||
* moveq #0,d0 ;SetPacketReception() で常に 0 が返るので省略
|
||||
* moveq #0,d0 ;SetPacketReception() always returns 0 so bypass
|
||||
set_int_addr_rts:
|
||||
rts
|
||||
|
||||
|
||||
*
|
||||
* コマンド 06: 割り込みハンドラのアドレス取得
|
||||
* Command 06: Get interrupt handler and address
|
||||
* return: interupt address
|
||||
*
|
||||
get_int_addr:
|
||||
@ -328,7 +328,7 @@ get_int_addr:
|
||||
|
||||
|
||||
*
|
||||
* コマンド 07: 割り込みハンドラの削除
|
||||
* Command 07: Delete interrupt handler
|
||||
* return: 0 (if no errors)
|
||||
*
|
||||
del_int_addr:
|
||||
@ -340,24 +340,24 @@ del_int_addr:
|
||||
* .text
|
||||
|
||||
pea (a0)
|
||||
bsr _DeleteList ;main.c 関数
|
||||
bsr _DeleteList ;main.c function
|
||||
move.l d0,(sp)+
|
||||
bmi del_int_addr_ret ;削除失敗
|
||||
bmi del_int_addr_ret ;Delete failed
|
||||
|
||||
tst.l (_num_of_prt) ;ハンドラが一つもなくなれば割り込みを禁止する
|
||||
tst.l (_num_of_prt) ;Forbid interrupts if handlers are gone
|
||||
bne del_int_addr_ret
|
||||
|
||||
clr.l -(sp) ;0=<禁止>
|
||||
bsr _SetPacketReception ;割り込み禁止 ... scsictl.c
|
||||
clr.l -(sp) ;0=<Block>
|
||||
bsr _SetPacketReception ;Interrupt forbitten ... scsictl.c
|
||||
addq.l #4,sp
|
||||
|
||||
* moveq #0,d0 ;SetPacketReception() で常に 0 が返るので省略
|
||||
* moveq #0,d0 ;SetPacketReception() always returns 0 so bypass
|
||||
del_int_addr_ret:
|
||||
rts
|
||||
|
||||
|
||||
*
|
||||
* コマンド 08: マルチキャストアドレスの設定
|
||||
* Command 08: Set multicast address
|
||||
*
|
||||
set_multicast_addr:
|
||||
* pea (mes08,pc)
|
||||
@ -372,7 +372,7 @@ set_multicast_addr:
|
||||
|
||||
|
||||
*
|
||||
* コマンド 09: 統計読み出し
|
||||
* Command 09: Read out statistics
|
||||
*
|
||||
get_statistics:
|
||||
* pea (mes09,pc)
|
||||
@ -386,7 +386,7 @@ get_statistics:
|
||||
rts
|
||||
|
||||
*
|
||||
* デバイスドライバエントリー
|
||||
* Device Driver Entry
|
||||
*
|
||||
strategy_entry:
|
||||
move.l a5,(request_buffer)
|
||||
@ -394,7 +394,7 @@ strategy_entry:
|
||||
|
||||
|
||||
interupt_entry:
|
||||
move.l sp,(stack_buff) ;自前のスタックエリアを使う
|
||||
move.l sp,(stack_buff) ;Use own stack area
|
||||
lea (def_stack),sp ;
|
||||
|
||||
movem.l d1-d7/a0-a5,-(sp)
|
||||
@ -481,13 +481,13 @@ opt_i:
|
||||
bra opt_loop
|
||||
|
||||
arg_end:
|
||||
bsr _Initialize ;main.c 関数
|
||||
;I/Oアドレス設定
|
||||
;MACアドレス取得
|
||||
;プロトコルリスト初期化
|
||||
;SCSICTL初期化
|
||||
;割り込みハンドラ(ベクタ設定)
|
||||
;trapサービス(ベクタ設定)
|
||||
bsr _Initialize ;main.c function
|
||||
;Set I/O address
|
||||
;Get MAC address
|
||||
;Init protocol list
|
||||
;Init SCSICTL
|
||||
;Interrupt handler (set vector)
|
||||
;trap service (set vector)
|
||||
tst.l d0
|
||||
bne errorret
|
||||
|
||||
@ -508,7 +508,7 @@ intret:
|
||||
move.b d0,(3,a5)
|
||||
movem.l (sp)+,d1-d7/a0-a5
|
||||
|
||||
movea.l (stack_buff,pc),sp ;スタックポインタを元にもどす
|
||||
movea.l (stack_buff,pc),sp ;Restore stack pointer
|
||||
rts
|
||||
|
||||
get_num:
|
||||
@ -539,7 +539,7 @@ mestitle:
|
||||
.dc.b 'RaSCSI Ethernet Driver version 1.20 / Based on ether_ne.sys+M01L12',13,10
|
||||
.dc.b 0
|
||||
mesparam_err:
|
||||
.dc.b 'パラメータが異常です',13,10,0
|
||||
.dc.b 'Invalid parameter',13,10,0
|
||||
.even
|
||||
|
||||
|
||||
@ -562,7 +562,7 @@ stack_buff_i:
|
||||
.quad
|
||||
|
||||
*
|
||||
* スタックエリア
|
||||
* Stack area
|
||||
*
|
||||
.ds.b 1024*8
|
||||
def_stack:
|
||||
|
@ -3,9 +3,9 @@
|
||||
// SCSI Target Emulator RaSCSI (*^..^*)
|
||||
// for Raspberry Pi
|
||||
//
|
||||
// Powered by XM6 TypeG Technorogy.
|
||||
// Powered by XM6 TypeG Technology.
|
||||
// Copyright (C) 2016-2017 GIMONS
|
||||
// [ RaSCSI イーサーネット SCSI制御部 ]
|
||||
// [ RaSCSI Ethernet SCSI Control Department ]
|
||||
//
|
||||
// Based on
|
||||
// Neptune-X board driver for Human-68k(ESP-X) version 0.03
|
||||
@ -47,24 +47,24 @@ typedef struct
|
||||
#define MFP_IERB 0xe88009
|
||||
#define MFP_IMRB 0xe88015
|
||||
|
||||
// asmsub.s 内のサブルーチン
|
||||
// Subroutine in asmsub.s
|
||||
extern void DI();
|
||||
extern void EI();
|
||||
|
||||
volatile short* iocsexec = (short*)0xa0e; // IOCS実行中ワーク
|
||||
struct trans_counter trans_counter; // 送受信カウンタ
|
||||
unsigned char rx_buff[2048]; // 受信バッファ
|
||||
int imr; // 割り込み許可フラグ
|
||||
int scsistop; // SCSI停止中フラグ
|
||||
int intr_type; // 割り込み種別(0:V-DISP 1:TimerA)
|
||||
int poll_interval; // ポーリング間隔(設定)
|
||||
int poll_current; // ポーリング間隔(現在)
|
||||
int idle; // アイドルカウンタ
|
||||
volatile short* iocsexec = (short*)0xa0e; // Work when executin IOCS
|
||||
struct trans_counter trans_counter; // Transfer counter
|
||||
unsigned char rx_buff[2048]; // Receive buffer
|
||||
int imr; // Interrupt permission flag
|
||||
int scsistop; // SCSI stopped flag
|
||||
int intr_type; // Interrupt type (0:V-DISP 1:TimerA)
|
||||
int poll_interval; // Polling interval (configure)
|
||||
int poll_current; // Polling interval (current)
|
||||
int idle; // Idle counter
|
||||
|
||||
#define POLLING_SLEEP 255 // 4-5s
|
||||
|
||||
/************************************************
|
||||
* MACアドレス取得命令発行 *
|
||||
* Execute command to get MAC address *
|
||||
************************************************/
|
||||
int SCSI_GETMACADDR(unsigned char *mac)
|
||||
{
|
||||
@ -105,7 +105,7 @@ int SCSI_GETMACADDR(unsigned char *mac)
|
||||
}
|
||||
|
||||
/************************************************
|
||||
* MACアドレス設定命令発行 *
|
||||
* Execute command to configure MAC address *
|
||||
************************************************/
|
||||
int SCSI_SETMACADDR(const unsigned char *mac)
|
||||
{
|
||||
@ -144,7 +144,7 @@ int SCSI_SETMACADDR(const unsigned char *mac)
|
||||
}
|
||||
|
||||
/************************************************
|
||||
* パケット受信サイズ取得命令発行 *
|
||||
* Execute command to get received packet size*
|
||||
************************************************/
|
||||
int SCSI_GETPACKETLEN(int *len)
|
||||
{
|
||||
@ -188,7 +188,7 @@ int SCSI_GETPACKETLEN(int *len)
|
||||
}
|
||||
|
||||
/************************************************
|
||||
* パケット受信命令発行 *
|
||||
* Execute receive packet command *
|
||||
************************************************/
|
||||
int SCSI_GETPACKETBUF(unsigned char *buf, int len)
|
||||
{
|
||||
@ -229,7 +229,7 @@ int SCSI_GETPACKETBUF(unsigned char *buf, int len)
|
||||
}
|
||||
|
||||
/************************************************
|
||||
* パケット送信命令発行 *
|
||||
* Execute packet send command *
|
||||
************************************************/
|
||||
int SCSI_SENDPACKET(const unsigned char *buf, int len)
|
||||
{
|
||||
@ -267,7 +267,7 @@ int SCSI_SENDPACKET(const unsigned char *buf, int len)
|
||||
}
|
||||
|
||||
/************************************************
|
||||
* MACアドレス取得 *
|
||||
* Get MAC address *
|
||||
************************************************/
|
||||
int GetMacAddr(struct eaddr* buf)
|
||||
{
|
||||
@ -279,7 +279,7 @@ int GetMacAddr(struct eaddr* buf)
|
||||
}
|
||||
|
||||
/************************************************
|
||||
* MACアドレス設定 *
|
||||
* Set MAC address *
|
||||
************************************************/
|
||||
int SetMacAddr(const struct eaddr* data)
|
||||
{
|
||||
@ -291,7 +291,7 @@ int SetMacAddr(const struct eaddr* data)
|
||||
}
|
||||
|
||||
/************************************************
|
||||
* RaSCSI検索 *
|
||||
* Search RaSCSI *
|
||||
************************************************/
|
||||
int SearchRaSCSI()
|
||||
{
|
||||
@ -299,7 +299,7 @@ int SearchRaSCSI()
|
||||
INQUIRYOPT_T inq;
|
||||
|
||||
for (i = 0; i <= 7; i++) {
|
||||
// BRIDGEデバイス検索
|
||||
// Search for BRIDGE device
|
||||
if (S_INQUIRY(sizeof(INQUIRY_T) , i, (struct INQUIRY*)&inq) < 0) {
|
||||
continue;
|
||||
}
|
||||
@ -308,7 +308,7 @@ int SearchRaSCSI()
|
||||
continue;
|
||||
}
|
||||
|
||||
// TAP初期化状態を取得
|
||||
// Get TAP initialization status
|
||||
if (S_INQUIRY(sizeof(INQUIRYOPT_T) , i, (struct INQUIRY*)&inq) < 0) {
|
||||
continue;
|
||||
}
|
||||
@ -317,7 +317,7 @@ int SearchRaSCSI()
|
||||
continue;
|
||||
}
|
||||
|
||||
// SCSI ID確定
|
||||
// Configure SCSI ID
|
||||
scsiid = i;
|
||||
return 0;
|
||||
}
|
||||
@ -326,7 +326,7 @@ int SearchRaSCSI()
|
||||
}
|
||||
|
||||
/************************************************
|
||||
* RaSCSI初期化 関数 *
|
||||
* Init RaSCSI method *
|
||||
************************************************/
|
||||
int InitRaSCSI(void)
|
||||
{
|
||||
@ -343,7 +343,7 @@ int InitRaSCSI(void)
|
||||
}
|
||||
|
||||
/************************************************
|
||||
* RaSCSI 割り込み処理 関数(ポーリング) *
|
||||
* RaSCSI interrupt handler function (polling) *
|
||||
************************************************/
|
||||
void interrupt IntProcess(void)
|
||||
{
|
||||
@ -353,78 +353,78 @@ void interrupt IntProcess(void)
|
||||
int_handler func;
|
||||
int i;
|
||||
|
||||
// V-DISP GPIP割り込みはアイドルカウンタで制御
|
||||
// V-DISP GPIP interrupt idle count control
|
||||
if (intr_type == 0) {
|
||||
// アイドル加算
|
||||
// Increment idle
|
||||
idle++;
|
||||
|
||||
// 次回の処理予定に到達していないならスキップ
|
||||
// Skip if not yet next scheduled processing
|
||||
if (idle < poll_current) {
|
||||
return;
|
||||
}
|
||||
|
||||
// アイドルカウンタをクリア
|
||||
// Clear idle counter
|
||||
idle = 0;
|
||||
}
|
||||
|
||||
// 割り込み開始
|
||||
// Start interrupt
|
||||
|
||||
// 割り込み許可の時だけ
|
||||
// Only when interrupt is permitted
|
||||
if (imr == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// IOCS実行中ならばスキップ
|
||||
// Skip if executing IOCS
|
||||
if (*iocsexec != -1) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 受信処理中は割り込み禁止
|
||||
// Interrupt forbidden if receiving data
|
||||
DI ();
|
||||
|
||||
// バスフリーの時だけ
|
||||
// Only in bus free phase
|
||||
phase = S_PHASE();
|
||||
if (phase != 0) {
|
||||
// 終了
|
||||
// Exit
|
||||
goto ei_exit;
|
||||
}
|
||||
|
||||
// 受信処理
|
||||
// Receive data
|
||||
if (SCSI_GETPACKETLEN(&len) == 0) {
|
||||
// RaSCSI停止中
|
||||
// RaSCSI is stopped
|
||||
scsistop = 1;
|
||||
|
||||
// ポーリング間隔の再設定(寝る)
|
||||
// Reset polling interval (sleep)
|
||||
UpdateIntProcess(POLLING_SLEEP);
|
||||
|
||||
// 終了
|
||||
// Exit
|
||||
goto ei_exit;
|
||||
}
|
||||
|
||||
// RaSCSIは動作中
|
||||
// RaSCSI is stopped
|
||||
if (scsistop) {
|
||||
scsistop = 0;
|
||||
|
||||
// ポーリング間隔の再設定(急ぐ)
|
||||
// Reset polling interval (hurry)
|
||||
UpdateIntProcess(poll_interval);
|
||||
}
|
||||
|
||||
// パケットは到着してなかった
|
||||
// Packets did not arrive
|
||||
if (len == 0) {
|
||||
// 終了
|
||||
// Exit
|
||||
goto ei_exit;
|
||||
}
|
||||
|
||||
// 受信バッファメモリへパケット転送
|
||||
// Tranfer packets to receive buffer memory
|
||||
if (SCSI_GETPACKETBUF(rx_buff, len) == 0) {
|
||||
// 失敗
|
||||
// Fail
|
||||
goto ei_exit;
|
||||
}
|
||||
|
||||
// 割り込み許可
|
||||
// Interrupt permitted
|
||||
EI ();
|
||||
|
||||
// パケットタイプでデータ分別
|
||||
// Split data by packet type
|
||||
type = rx_buff[12] * 256 + rx_buff[13];
|
||||
i = 0;
|
||||
while ((func = SearchList2(type, i))) {
|
||||
@ -435,12 +435,12 @@ void interrupt IntProcess(void)
|
||||
return;
|
||||
|
||||
ei_exit:
|
||||
// 割り込み許可
|
||||
// Interrupt permitted
|
||||
EI ();
|
||||
}
|
||||
|
||||
/************************************************
|
||||
* RaSCSI パケット送信 関数 (ne.sから) *
|
||||
* RaSCSI Send Packets Function (from ne.s) *
|
||||
************************************************/
|
||||
int SendPacket(int len, const unsigned char* data)
|
||||
{
|
||||
@ -449,35 +449,35 @@ int SendPacket(int len, const unsigned char* data)
|
||||
}
|
||||
|
||||
if (len > 1514) { // 6 + 6 + 2 + 1500
|
||||
return -1; // エラー
|
||||
return -1; // Error
|
||||
}
|
||||
|
||||
// RaSCSI停止中のようならエラー
|
||||
// If RaSCSI seems to be stopped, throw an error
|
||||
if (scsistop) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 送信処理中は割り込み禁止
|
||||
// Interrupt is not permitted during sending
|
||||
DI ();
|
||||
|
||||
// 送信処理と送信フラグアップ
|
||||
// Send processing and raise send flag
|
||||
if (SCSI_SENDPACKET(data, len) == 0) {
|
||||
// 割り込み許可
|
||||
// Interrupt permitted
|
||||
EI ();
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 割り込み許可
|
||||
// Interrupt permitted
|
||||
EI ();
|
||||
|
||||
// 送信依頼済み
|
||||
// Finished requesting send
|
||||
trans_counter.send_byte += len;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/************************************************
|
||||
* RaSCSI 割り込み許可、不許可設定 関数 *
|
||||
* RaSCSI Interrupt Permission Setting Function*
|
||||
************************************************/
|
||||
int SetPacketReception(int i)
|
||||
{
|
||||
@ -486,19 +486,19 @@ int SetPacketReception(int i)
|
||||
}
|
||||
|
||||
/************************************************
|
||||
* RaSCSI 割り込み処理登録 *
|
||||
* RaSCSI Interrupt Processing Registration *
|
||||
************************************************/
|
||||
void RegisterIntProcess(int n)
|
||||
{
|
||||
volatile unsigned char *p;
|
||||
|
||||
// ポーリング間隔(現在)の更新とアイドルカウンタクリア
|
||||
// Update polling interval (current) and clear idle counter
|
||||
poll_current = n;
|
||||
idle = 0;
|
||||
|
||||
if (intr_type == 0) {
|
||||
// V-DISP GPIP割り込みベクタを書き換えて
|
||||
// 割り込みを有効にする
|
||||
// Overwrite V-DISP GPIP interrupt vectors
|
||||
// and enable interrupt
|
||||
B_INTVCS(0x46, (int)IntProcess);
|
||||
p = (unsigned char *)MFP_AEB;
|
||||
*p = *p | 0x10;
|
||||
@ -507,28 +507,28 @@ void RegisterIntProcess(int n)
|
||||
p = (unsigned char *)MFP_IMRB;
|
||||
*p = *p | 0x40;
|
||||
} else if (intr_type == 1) {
|
||||
// TimerAはカウントモードを設定
|
||||
// Set TimerA counter mode
|
||||
VDISPST(NULL, 0, 0);
|
||||
VDISPST(IntProcess, 0, poll_current);
|
||||
}
|
||||
}
|
||||
|
||||
/************************************************
|
||||
* RaSCSI 割り込み処理変更 *
|
||||
* RaSCSI Interrupt Processing Update *
|
||||
************************************************/
|
||||
void UpdateIntProcess(int n)
|
||||
{
|
||||
// ポーリング間隔(現在)と同じなら更新しない
|
||||
// Do not update if polling interval (current) is the same
|
||||
if (n == poll_current) {
|
||||
return;
|
||||
}
|
||||
|
||||
// ポーリング間隔(現在)の更新とアイドルカウンタクリア
|
||||
// Update polling interval (current) and clear idle counter
|
||||
poll_current = n;
|
||||
idle = 0;
|
||||
|
||||
if (intr_type == 1) {
|
||||
// TimerAは再登録必要
|
||||
// TimerA requires re-registering
|
||||
VDISPST(NULL, 0, 0);
|
||||
VDISPST(IntProcess, 0, poll_current);
|
||||
}
|
||||
|
@ -3,9 +3,9 @@
|
||||
// SCSI Target Emulator RaSCSI (*^..^*)
|
||||
// for Raspberry Pi
|
||||
//
|
||||
// Powered by XM6 TypeG Technorogy.
|
||||
// Powered by XM6 TypeG Technology.
|
||||
// Copyright (C) 2016-2017 GIMONS
|
||||
// [ RaSCSI イーサーネット SCSI制御部 ]
|
||||
// [ RaSCSI Ethernet SCSI Control Department ]
|
||||
//
|
||||
// Based on
|
||||
// Neptune-X board driver for Human-68k(ESP-X) version 0.03
|
||||
@ -17,11 +17,11 @@
|
||||
#ifndef scsictl_h
|
||||
#define scsictl_h
|
||||
|
||||
// グローバル変数
|
||||
// Global variables
|
||||
extern int intr_type;
|
||||
extern int poll_interval;
|
||||
|
||||
// 送受信カウンタ
|
||||
// Transfer counter
|
||||
struct trans_counter {
|
||||
unsigned int send_byte;
|
||||
unsigned int recv_byte;
|
||||
|
Loading…
Reference in New Issue
Block a user