X68k:SCSI

From Data Crystal
Jump to: navigation, search
	- SCSI IOCS MANUAL -

==============================================================================

・SCSI IOCSコール一覧

$00	_S_RESET	SPC のリセット及び SCSI バスのリセット
$01	_S_SELECT	アービトレーションフェーズとセレクションフェーズの実行
$02	_S_SELECTA	アービトレーションフェーズとセレクションフェーズの実行
$03	_S_CMDOUT	コマンドアウトフェーズの実行
$04	_S_DATAIN	データインフェーズの実行
$05	_S_DATAOUT	データアウトフェーズの実行
$06	_S_STSIN	ステータスインフェーズの実行
$07	_S_MSGIN	メッセージインフェーズの実行
$08	_S_MSGOUT	メッセージアウトフェーズの実行
$09	_S_PHASE	フェーズセンス
$0a	_S_LEVEL	SCSI IOCS のバージョンを調べる
$0b	_S_DATAINI	データインフェーズの実行
$0c	_S_DATAOUTI	データアウトフェーズの実行
$0d	_S_MSGOUTEXT	メッセージアウトフェーズの実行

$20	_S_INQUIRY	INQUIRY データの要求
$21	_S_READ		SCSI 装置よりデータの読み込み
$22	_S_WRITE	SCSI 装置へのデータの書き込み
$23	_S_FORMAT	SCSI 装置のフォーマット
$24	_S_TESTUNIT	SCSI 装置が動作可能であるか調べる
$25	_S_READCAP	SCSI 装置の容量に関する情報を調べる
$26	_S_READEXT	拡張 READ コマンド
$27	_S_WRITEEXT	拡張 WRITE コマンド
$28	_S_VERIFYEXT	拡張 VERIFY コマンド
$29	_S_MODESENSE	MODE SENSE データの要求
$2a	_S_MODESELECT	MODE SELECT コマンド
$2b	_S_REZEROUNIT	SCSI 装置を指定の状態にセット
$2c	_S_REQUEST	SCSI 装置のセンスデータを調べる
$2d	_S_SEEK		指定の論理ブロックアドレスへシークする
$2e	_S_READI	SCSI 装置よりデータの読み込み
$2f	_S_STARTSTOP	SCSI 装置に対して以降の操作を可能・不可能にすることを要求

$30	_S_EJECT6MO1	CZ-6MO1 に挿入されているメディアを排出
$31	_S_REASSIGN	欠陥ブロックの再割り当て
$32	_S_PAMEDIUM	メディアのイジェクトの禁止・許可を設定
$36	(_b_dskini)	SASI 装置を初期化する
$37	(_b_format)	SASI 装置をフォーマットする
$38	(_b_badfmt)	SASI 装置の破損トラックを使用不能にする
$39	(_b_assign)	SASI 装置を代替トラックを設定する

==============================================================================

・呼び出し方法

	d0.b に IOCS コール番号 0xf5 を、d1.l に SCSI コール番号を代入し IOCS
	コールを実行する.

・エラーコード

上位word:INTS(SPC の割り込みの原因)
	各ビットが 0 で割り込み無し、1 で割り込み有り.

	bit 23	SELECTED 割り込み
	bit 22	RESELECTED 割り込み
	bit 21	DISCONNECTED 割り込み
	bit 20	SPC に対するコマンドの動作の終了割り込み
	bit 19	実行しようとする転送フェーズと SCSI 上で要求されている転送フェ
		ーズとが不一致、あるいは転送中に他の転送フェーズが要求されたと
		きの割り込み
	bit 18	セレクション タイムアウト割り込み
	bit 17	SPC ハードウェア割り込み
	bit 16	RESET コンディション割り込み

下位word:PSNS(SCSI バス上の制御信号の状態)
	各ビットが 0 で信号ノンアクティブ、1 で信号アクティブ.

	bit 7	REQ
	bit 6	ACK
	bit 5	ATN
	bit 4	SEL
	bit 3	BSY
	bit 2	MSG
	bit 1	C/D
	bit 0	I/O

==============================================================================

・SCSI デバイスドライバで対応する SCSI 装置

(1)1 ブロックの容量が 256,512,1024 バイトのいずれかであること.

(2)ANSI-SCSI 規格(ANSI X3.131-1986)中の以下のコマンドを備えていること.

	0x00	TEST UNIT READY
	0x01	REZERO UNIT
	0x03	REQUEST SENSE
	0x04	FORMAT UNIT
	0x08	READ
	0x0a	WRITE
	0x12	INQUIRY
	0x1a	MODE SENSE
	0x25	READ CAPACITY

(3)論理ユニット番号(LUN)を使用しないこと(LUN が 0 であること).

(4)モードセンスコマンドにおいて、ページコード 3f で全てのページ内容が送出され
   るか、またはモードセンスヘッダの 4 バイトが送出されること.

(5)FORMAT UNIT コマンド(コマンド列 04 00 00 00 00 00)での物理フォーマット時に
   自動的に不良ブロックの代替処理を行うこと.

(6)SCSI 装置 1 台の容量が 1M バイト以上 16G バイト未満であること.

(7)電源投入時に自動的に SCSI 装置が使用可能状態になること(START/STOP UNIT コマ
   ンドによる装置の起動が不要なこと).

==============================================================================

==============================================================================

$00	_S_RESET	SPC のリセット及び SCSI バスのリセット

返値	なし(d0.l の内容は保証されない)

	SPC の初期化及び SCSI バスのリセットを行う.
	SRAM 内の SCSI 関係ワークも初期化される.
	バスリセット後に 2 秒間待機する.

==============================================================================

$01	_S_SELECT	アービトレーションフェーズとセレクションフェーズの実行

引数	d4.b	ターゲット ID

返値	d0.l	エラーコード(0 以外なら異常終了)

	アービトレーションフェーズとセレクションフェーズを実行する.
	SASI-HD に対して実行する時はアービトレーションフェーズは省略する.

==============================================================================

$01	_S_SELECTA	アービトレーションフェーズとセレクションフェーズの実行

引数	d4.b	ターゲット ID

返値	d0.l	エラーコード(0 以外なら異常終了)

	アービトレーションフェーズとセレクションフェーズを実行する.
	ATN 信号を 1 にして実行する他は _S_SELECT と同じである.

==============================================================================

$03	_S_CMDOUT	コマンドアウトフェーズの実行

引数	d3.l	コマンドのバイト数
	a1.l	CDB(COMAND DISCRIPTOR BLOCK)の先頭アドレス

返値	d0.l	エラーコード(0 以外なら異常終了)

	コマンドアウトフェーズを実行する.
	a1.l のアドレスから d3.l バイトのデータを SCSI バス上に出力する.
	グループ 0,1,5 のコマンドの時は d3.l にバイト数を指定する必要はない.

==============================================================================

$04	_S_DATAIN	データインフェーズの実行

引数	d3.l	読み込みバイト数
	a1.l	バッファアドレス

返値	d0.l	エラーコード(0 以外なら異常終了)

	データインフェーズを実行する.
	a1.l のアドレスへ d3.l バイトのデータを SCSI バス上から読み込む.
	データ転送は常に DMA によって行われる.

==============================================================================

$05	_S_DATAOUT	データアウトフェーズの実行

引数	d3.l	書き込みバイト数
	a1.l	データアドレス

返値	d0.l	エラーコード(0 以外なら異常終了)

	データアウトフェーズを実行する.
	a1.l のアドレスから d3.l バイトのデータを SCSI バス上へ書き込む.
	データ転送は常に DMA によって行われる.

==============================================================================

$06	_S_STSIN	ステータスインフェーズの実行

引数	a1.l	バッファアドレス

返値	d0.l	エラーコード(0 以外なら異常終了)

	ステータスインフェーズを実行する.
	a1.l のアドレスへ 1 バイトのデータを SCSI バス上から読み込む.

==============================================================================

$07	_S_MSGIN	メッセージインフェーズの実行

引数	a1.l	バッファアドレス

返値	d0.l	エラーコード(0 以外なら異常終了)

	メッセージインフェーズを実行する.
	a1.l のアドレスへ 1 バイトのデータを SCSI バス上から読み込む.

==============================================================================

$08	_S_MSGOUT	メッセージアウトフェーズの実行

引数	a1.l	データアドレス

返値	d0.l	エラーコード(0 以外なら異常終了)

	メッセージアウトフェーズを実行する.
	a1.l のアドレスから 1 バイトのデータを SCSI バス上へ書き込む.
	データ転送は常に MPU によって行われる.

==============================================================================

$09	_S_PHASE	フェーズセンス

返値	d0.l	現在のフェーズ

	SPC の PSNS レジスタを読み込む.

==============================================================================

$0a	_S_LEVEL	SCSI IOCS のバージョンを調べる

返値	d0.l	SCSI IOCS のバージョン

	SCSI IOCS のバージョンを調べる. 機種と返値の関係は以下の通り.

	X68000 SUPER		 0
	SCSI ボード CZ-8BS1	 1
	X68000 XVI		 3
	X68030			10

==============================================================================

$0b	_S_DATAINI	データインフェーズの実行

引数	d3.l	読み込みバイト数
	a1.l	バッファアドレス

返値	d0.l	エラーコード(0 以外なら異常終了)

	データインフェーズを実行する.
	a1.l のアドレスへ d3.l バイトのデータを SCSI バス上から読み込む.
	データ転送は常に MPU によって行われる.

==============================================================================

$0c	_S_DATAOUTI	データアウトフェーズの実行

引数	d3.l	書き込みバイト数
	a1.l	データアドレス

返値	d0.l	エラーコード(0 以外なら異常終了)

	データアウトフェーズを実行する.
	a1.l のアドレスから d3.l バイトのデータを SCSI バス上へ書き込む.
	データ転送は常に MPU によって行われる.

==============================================================================

$0d	_S_MSGOUTEXT	メッセージアウトフェーズの実行(拡張メッセージ)

引数	a1.l	データアドレス

返値	d0.l	エラーコード(0 以外なら異常終了)

	メッセージアウトフェーズを実行し、3 バイト以上の拡張メッセージを送る.
	a1.l+2 のアドレスに拡張メッセージコード、a1.l+3 からのアドレスに拡張メ
	ッセージ引数を格納し呼び出すと、コードに応じた長さだけ拡張メッセージを
	SCSI バス上へ書き込む.
	メッセージデータ及び拡張メッセージ長はコードによって決まるので、a1.l
	からの 2 バイトはユーザが指定する必要はなく、また指定しても無視される.
	データ転送は常に MPU によって行われる.
	このコールは X68030 のみ使用可能.

==============================================================================

$20	_S_INQUIRY	INQUIRY データの要求

引数	d3.b	読み込みバイト数
	d4.b	ターゲット ID
	a1.l	バッファアドレス

返値	d0.l	ステータス(-1 なら異常終了)
		上位:メッセージインフェーズで得た情報
		下位:ステータス〃

	a1.l のアドレスへ d3.b バイトの INQUIRY データを読み込む.
	データ転送は常に MPU によって行われる.

	INQUIRY データの内容は以下の通り.

offset	size
0	1.b	Peripheral Device Type(デバイス種別)
1	1.b	bit 7:RMB bit 6~0:Device-Type Qualifier
2	1.b	bit 7~6:ISO Version bit 5~3:ECMA Version
		bit 2~0:ANSI-Approved Version(準拠規格)
3	1.b	(予約)
4	1.b	Additional Lengt(追加データ長)
5~	?.b	Vendor Unique Parameter Bytes(追加データ)

	Peripheral Device Type の内容は以下の通り.

 値	 内容
$00	 ダイレクトアクセスデバイス(HDD等)
$01	 シーケンシャルアクセスデバイス(MT等)
$02	 プリンタデバイス
$03	 プロセッサデバイス
$04	 WORM(追記型)デバイス
$05	 読み出し専用ダイレクトアクセスデバイス
$06~$7e (将来拡張用)
$7f	 論理ユニットは存在しない
$80~$ff 各ベンタで自由に使用可

	ANSI-Approved Version の内容は以下の通り.

値	内容
0	準拠規格なし
1	ANSI X3.131-1986 準拠
2	ANSI X3T9.2/86-109(SCSI-2)準拠
3~7	(将来拡張用)

==============================================================================

$21	_S_READ		SCSI 装置よりデータの読み込み

引数	d2.l	目的読み込み位置(論理ブロック番号)
	d3.l	読み込みブロック数(1~255)
	d4.b	ターゲット ID
	d5.l	1 ブロックの容量(0:256 1:512 2:1024)
	a1.l	バッファアドレス

返値	d0.l	ステータス(-1,-2 なら異常終了)
		上位:メッセージインフェーズで得た情報
		下位:ステータス〃

	d2.l の論理ブロック番号のブロックから d3.l ブロック分のデータを a1.l
	のアドレスへ読み込む.
	データ転送は SRAM 設定値によって DMA か MPU のどちらかが使用される.

==============================================================================

$22	_S_WRITE	SCSI 装置へのデータの書き込み

引数	d2.l	目的書き込み位置(論理ブロック番号)
	d3.l	書き込みブロック数(1~255)
	d4.b	ターゲット ID
	d5.l	1 ブロックの容量(0:256 1:512 2:1024)
	a1.l	データアドレス

返値	d0.l	ステータス(-1,-2 なら異常終了)
		上位:メッセージインフェーズで得た情報
		下位:ステータス〃

	a1.l のアドレスから d3.l ブロック分のデータを d2.l の論理ブロック番号
	のブロックへ書き込む.
	データ転送は SRAM 設定値によって DMA か MPU のどちらかが使用される.

==============================================================================

$23	_S_FORMAT	SCSI 装置のフォーマット

引数	d3.w	インターリーブ
	d4.b	ターゲット ID

返値	d0.l	ステータス(-1 なら異常終了)
		上位:メッセージインフェーズで得た情報
		下位:ステータス〃

	指定のインターリーブ値で SCSI 装置をフォーマットする.

==============================================================================

$24	_S_TESTUNIT	SCSI 装置が動作可能であるか調べる

引数	d4.b	ターゲット ID

返値	d0.l	ステータス(-1 なら異常終了)
		上位:メッセージインフェーズで得た情報
		下位:ステータス〃

	SCSI 装置が動作可能であるか調べる. 返値の d0.l が 0 の時のみ動作可能.

==============================================================================

$25	_S_READCAP	SCSI 装置の容量に関する情報を調べる

引数	d4.b	ターゲット ID
	a1.l	バッファアドレス

返値	d0.l	ステータス(-1 なら異常終了)
		上位:メッセージインフェーズで得た情報
		下位:ステータス〃

	a1.l のアドレスへ 8 バイトの READ CAPACITY データを読み込む.
	データ転送は常に MPU によって行われる.

	READ CAPACITY データの内容は以下の通り.

offset	size
0	1.l	論理ブロックアドレス
1	1.l	ブロック長(バイト単位)

==============================================================================

$26	_S_READEXT	拡張 READ コマンド

引数	d2.l	目的読み込み位置(論理ブロック番号)
	d3.l	読み込みブロック数(1~65535)
	d4.b	ターゲット ID
	d5.l	1 ブロックの容量(0:256 1:512 2:1024)
	a1.l	バッファアドレス

返値	d0.l	ステータス(-1,-2 なら異常終了)
		上位:メッセージインフェーズで得た情報
		下位:ステータス〃

	d2.l の論理ブロック番号のブロックから d3.l ブロック分のデータを a1.l
	のアドレスへ読み込む.
	グループ 1 のコマンドで、読み込みブロック長は 65535 まで指定可能.
	データ転送は SRAM 設定値によって DMA か MPU のどちらかが使用される.

==============================================================================

$27	_S_WRITEEXT	拡張 WRITE コマンド

引数	d2.l	目的書き込み位置(論理ブロック番号)
	d3.l	書き込みブロック数(1~65535)
	d4.b	ターゲット ID
	d5.l	1 ブロックの容量(0:256 1:512 2:1024)
	a1.l	データアドレス

返値	d0.l	ステータス(-1,-2 なら異常終了)
		上位:メッセージインフェーズで得た情報
		下位:ステータス〃

	a1.l のアドレスから d3.l ブロック分のデータを d2.l の論理ブロック番号
	のブロックへ書き込む.
	グループ 1 のコマンドで、書き込みブロック長は 65535 まで指定可能.
	データ転送は SRAM 設定値によって DMA か MPU のどちらかが使用される.

==============================================================================

$28	_S_VERIFYEXT	拡張 VERIFY コマンド

引数	d2.l	目的比較位置(論理ブロック番号)
	d3.l	比較ブロック数(1~65535)
	d4.b	ターゲット ID
	d5.l	1 ブロックの容量(0:256 1:512 2:1024)
	a1.l	データアドレス

返値	d0.l	ステータス(-1,-2 なら異常終了)
		上位:メッセージインフェーズで得た情報
		下位:ステータス〃

	a1.l のアドレスから d3.l ブロック分のデータを d2.l の論理ブロック番号
	のブロックと比較する.
	グループ 1 のコマンドで、比較ブロック長は 65535 まで指定可能.
	データ転送は SRAM 設定値によって DMA か MPU のどちらかが使用される.

==============================================================================

$29	_S_MODESENSE	MODE SENSE データの要求

引数	d2.b	bit 7~6:PC bit 5~0:ページコード
	d3.b	読み込みバイト数
	d4.b	ターゲット ID
	a1.l	バッファアドレス

返値	d0.l	ステータス(-1 なら異常終了)
		上位:メッセージインフェーズで得た情報
		下位:ステータス〃

	a1.l のアドレスへ d3.b バイトの MODE SENSE データを読み込む.
	データ転送は常に MPU によって行われる.

	PC は 0:カレント値、1:変更可能値、2:デフォルト値、3:セーブ値で指定する.
	ページコードの内容は以下の通り.

0	ページディスクリプタは転送しない
1	リード/ライトエラーリカバリパラメータ
2	ディスコネクト/リコネクトパラメータ
3	フォーマットパラメータ
4	ドライブパラメータ
7	ベリファイエラーリカバリパラメータ
8	キャッシングパラメータ
$21	アディショナルエラーリカバリパラメータ
$22	リコネクションタイミングパラメータ
$3f	全パラメータ

	MODE SENSE データの内容は以下の通り.

offset	size
0	1.b	センスデータ長(自分自身は含まない)
1	1.b	メディアタイプ
2	1.b	bit 7:Write Protect(1 で書き込み禁止) bit 6~0:(予約)
3	1.b	ブロックディスクリプタ長(8の倍数になる)
4	1.b	密度コード  ┐
5	3.b	ブロック数  │ブロックディスクリプタ
6	1.b	(将来拡張用)│(複数になることもある)
7	3.b	ブロック長  ┘
8~	?.b	ベンダごとに自由に使用可

==============================================================================

$2a	_S_MODESELECT	MODE SELECT コマンド

引数	d2.b	不明
	d3.b	不明
	d4.b	ターゲット ID

返値	d0.l	ステータス(-1 なら異常終了)
		上位:メッセージインフェーズで得た情報
		下位:ステータス〃

	MODE SELECT コマンドを実行する.
	データ転送は常に MPU によって行われる.

==============================================================================

$2b	_S_REZEROUNIT	SCSI 装置を指定の状態にセット

引数	d4.b	ターゲット ID

返値	d0.l	ステータス(-1 なら異常終了)
		上位:メッセージインフェーズで得た情報
		下位:ステータス〃

	SCSI 装置を指定の状態にセットすることを要求する.
	指定の状態は各装置の取扱説明書を参照のこと.

==============================================================================

$2c	_S_REQUEST	SCSI 装置のセンスデータを調べる

引数	d3.b	読み込みバイト数
	d4.b	ターゲット ID
	a1.l	バッファアドレス

返値	d0.l	ステータス(-1 なら異常終了)
		上位:メッセージインフェーズで得た情報
		下位:ステータス〃

	a1.l のアドレスへ d3.b バイトの REQUEST SENSE データを読み込む.
	データ転送は常に MPU によって行われる.

	REQUEST SENSE データの内容は以下の通り.

offset	size
0	1.b	bit 7:1 で論理アドレスの値が有効
		bit 6~4:エラークラス bit 3~0:エラーコード
1	1.b	bit 7~5:(自由に使用可) bit 4~0:論理アドレス(上位)
2	1.b	論理アドレス(中位)
3	1.b	論理アドレス(下位)

==============================================================================

$2d	_S_SEEK		指定の論理ブロックアドレスへシークする

引数	d2.l	目的移動位置(論理ブロック番号)
	d4.b	ターゲット ID

返値	d0.l	ステータス(-1 なら異常終了)
		上位:メッセージインフェーズで得た情報
		下位:ステータス〃

	d2.l の論理ブロック番号にシークする.

==============================================================================

$2e	_S_READI	SCSI 装置よりデータの読み込み

引数	d2.l	目的読み込み位置(論理ブロック番号)
	d3.l	読み込みブロック数(1~255)
	d4.b	ターゲット ID
	d5.l	1 ブロックの容量(0:256 1:512 2:1024)
	a1.l	バッファアドレス

返値	d0.l	ステータス(-1,-2 なら異常終了)
		上位:メッセージインフェーズで得た情報
		下位:ステータス〃

	d2.l の論理ブロック番号のブロックから d3.l ブロック分のデータを a1.l
	のアドレスへ読み込む.
	データ転送は常に DMA によって行われる.

==============================================================================

$2f	_S_STARTSTOP	SCSI 装置に対して以降の操作を可能・不可能にすることを要求

引数	d3.b	操作可能・不可能(0:不可能 1:可能 2:メディア排出)
	d4.b	ターゲット ID

返値	d4.l	ステータス(-1 なら異常終了)
		上位:メッセージインフェーズで得た情報
		下位:ステータス〃

	引数の d3.b が 1 の時 SCSI 装置を操作出来るように設定し、0 の時は停止
	(操作不可)するように要求する. 2 の時は挿入されているメディアを排出する.

==============================================================================

$30	_S_EJECT6MO1	CZ-6MO1 に挿入されているメディアを排出

引数	d3.b	不明
	d4.b	ターゲット ID

返値	d4.l	ステータス(-1 なら異常終了)
		上位:メッセージインフェーズで得た情報
		下位:ステータス〃

	CZ-6MO1 に挿入されているメディアを排出する.

==============================================================================

$31	_S_REASSIGN	欠陥ブロックの再割り当て

引数	d3.l	書き込みバイト数
	d4.b	ターゲット ID
	a1.l	データアドレス

返値	d0.l	ステータス(-1 なら異常終了)
		上位:メッセージインフェーズで得た情報
		下位:ステータス〃

	欠陥ブロックの再割り当てを要求する.
	a1.l のアドレスから d3.l バイトの REASSIGN BLOCKS データを書き込む.
	データ転送は常に MPU によって行われる.

==============================================================================

$32	_S_PAMEDIUM	メディアのイジェクトの禁止・許可を設定

引数	d3.l	イジェクト許可・禁止(0:許可 1:禁止)
	d4.b	ターゲット ID

返値	d4.l	ステータス(-1 なら異常終了)
		上位:メッセージインフェーズで得た情報
		下位:ステータス〃

	メディアのイジェクト許可・禁止を設定する.

==============================================================================

$36	(_b_dskini)	SASI 装置を初期化する

引数	d3.b	不明
	d4.b	ターゲット ID
	a1.l	アサインドライブパラメータのアドレス

返値	d4.l	ステータス(-1 なら異常終了)
		上位:メッセージインフェーズで得た情報
		下位:ステータス〃

	ドライブを初期化する.
	データ転送は常に MPU によって行われる.

==============================================================================

$37	(_b_format)	SASI 装置をフォーマットする

引数	d2.l	目的フォーマット位置(論理ブロック番号)
	d3.b	インタリーブコード
	d4.b	ターゲット ID

返値	d4.l	ステータス(-1 なら異常終了)
		上位:メッセージインフェーズで得た情報
		下位:ステータス〃

	ディスクの物理フォーマットを行なう.

==============================================================================

$38	(_b_badfmt)	SASI 装置の破損トラックを使用不能にする

引数	d2.l	目的フォーマット位置(論理ブロック番号)
	d3.b	インタリーブコード
	d4.b	ターゲット ID

返値	d4.l	ステータス(-1 なら異常終了)
		上位:メッセージインフェーズで得た情報
		下位:ステータス〃

	ハードディスクの破壊トラックを使用不能にする.

==============================================================================

$39	(_b_assign)	SASI 装置を代替トラックを設定する

引数	d2.l	目的割り当て位置(論理ブロック番号)
	d3.b	インタリーブコード
	d4.b	ターゲット ID
	a1.l	代替トラック指定データのアドレス

返値	d4.l	ステータス(-1 なら異常終了)
		上位:メッセージインフェーズで得た情報
		下位:ステータス〃

	ハードディスクの代替トラックを設定する.
	データ転送は常に MPU によって行われる.

==============================================================================