X68k/TRAP

From Data Crystal
Jump to navigation Jump to search

This is a sub-page of X68k.

	- TRAP EXCEPTION MANAGER MANUAL -

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

・TRAP 例外処理一覧

trap	#0	ユーザ定義
trap	#1	〃(mpcm.x)
trap	#2	〃(pcm8.x)
trap	#3	〃(zmusic.x、zmsc3.x、middrv.r)
trap	#4	〃(mxdrv.x、madrv.x、mld.x、mcdrv.x)
trap	#5	〃
trap	#6	〃
trap	#7	〃

trap	#8	ブレークポイント(ROM デバッガ)
trap	#9	〃		(db.x、scd.x)
trap	#10	リセット/電原オフ処理
trap	#11	BREAK キー処理
trap	#12	COPY キー処理
trap	#13	CTRL+C 処理
trap	#14	エラー処理
trap	#15	IOCS コール

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

・trap #10	リセット/電原オフ処理

引数	d0.l =	$58363801('X68'<<8+1)	フロントスイッチによる電源オフ
		$58363802('X68'<<8+2)	外部スイッチによる電源オフ
		$58363803('X68'<<8+3)	ソフトスイッチによる電源オフ
		上記以外		ソフトウェアリセット

	電源オフ割り込みとキーボード処理内、若しくはユーザプログラムから呼び出
	され、電源切断及びソフトウェアによるリセット処理を行う.
	Human68k 起動時にはフックされて、DOS コール実行中に呼び出されてもすぐ
	には実行されず、終了してから呼び出されるようになる.

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

・trap #11	BREAK キー処理

引数	d0.b	シフトキーの状態

	BREAK キーが押された時に、キーボード処理から呼び出される. ただし、$40
	~$4f のディスク関連 IOCS を実行中は無視される.
	Human68k 起動時にはフックされて、DOS コール実行中に呼び出されてもすぐ
	には実行されず、終了してから呼び出されるようになる.
	SHIFT を押さずに BREAK キーを押した場合は、trap #11 の後に trap #13 も
	実行される.
	多重呼び出しは行われないので、リエントラントな構造である必要はない.

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

・trap #12	COPY キー処理

引数	d0.b	シフトキーの状態

	COPY キーが押された時にキーボード処理から呼び出され、画面のハードコピ
	ー処理を行う.
	多重呼び出しは行われないので、リエントラントな構造である必要はない.

	シフトキー状態によって以下のような動作をする.

	COPY		縮小コピー(1色)
	SHIFT + COPY	拡大コピー(1色)
	CTRL  + COPY	拡大コピー(4色)
	OPT.1 + COPY	FF 出力.
	OPT.2 + COPY	LF 〃

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

・trap #13	CTRL+C 処理

	CTRL+C 及び BREAK キーが入力された時にキーボード処理から呼び出される.
	通常は何もしないルーチンが登録されているので、ユーザが使用できる.

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

・trap #14	エラー処理

引数	d7.w	エラー番号
	a5.l	文字列のアドレス(d7.w = $??00 の場合のみ)

	ROM 起動時はキー入力を待って再起動するだけであるが、Human68k 起動時に
	はフックされ、白帯を表示してユーザの応答を待つルーチンに置き換わる.

	システムがエラーを検出した場合、d7.w にエラー番号をセットして trap #14
	が実行される. このエラー処理ルーチンでは、エラーの種別に応じてメッセー
	ジを出力した後、キーボードからの入力によって、d7.w に 1(再実行)か 2(無
	視) をセットして復帰する. 中止が指定された場合はアボートする(帰らない).

・エラー番号

$00xx		CPU 例外処理/未登録の割り込み(中止のみ)
		下位バイトがベクタ番号.
	$0002	バスエラーが発生した
	$0003	アドレスエラーが発生した
	$0004	おかしな命令を実行した
	$0005	0 で除算した
	$0006	CHK 命令を実行した
	$0007	TRAPV 命令を実行した
	$0008	特権命令を実行した
	$001f	インタラプトスイッチが押された
$01xx		未登録の IOCS コール
		下位バイトが IOCS コール番号.
		FD にしか実行できないコールを SASI に対して使用した時、若しく
		はその逆を行った時にも呼び出される.
$02xx~$0fxx	予約
$10xx~$1fxx	エラー(中止のみ)
$20xx~$2fxx	エラー(再実行のみ)
$30xx~$3fxx	エラー(再実行&中止)
	$301f	インタラプトスイッチが押された
$40xx~$4fxx	エラー(無視のみ)
$50xx~$5fxx	エラー(無視&中止)
$60xx~$6fxx	エラー(無視&再実行)
$70xx~$7fxx	エラー(無視&再実行&中止)
$80xx~$efxx	予約
$f0xx~$fdxx	F 系列の DOS コール以外の割り込み(中止のみ)
$fexx		浮動小数点演算パッケージが組み込まれていない(中止のみ)
$ffxx		未登録の DOS コール
		Human68k version 3.0x では、未登録の DOS コールは -1 を返すだ
		けなのでエラー処理は呼び出されない.

	インタラプトスイッチが押された場合のエラー番号は $001f と $003f の二通
	りあるが、通常は後者を使用する.

	$1000~$7fff のエラー番号は、上位バイトの bit 4、5、6 がそれぞれ中止、
	再実行、無視に対応する. この時の下位バイトの内容は以下の通り.

$00	ユーザ定義(a5.l に文字列のアドレスを入れる).
$01	無効なユニット番号を指定した.
$02	ディスクが入っていない.
$03	デバイスドライバに無効なコマンドを指定した.
$04	CRC エラー.
$05	ディスクの管理領域が破壊されている.
$06	シークエラー.
$07	無効なメディア.
$08	セクタが見つからない.
$09	プリンタが繋がっていない.
$0a	書き込みエラー.
$0b	読み込みエラー.
$0c	その他のエラー.
$0d	ライトプロテクト(プロテクトを外して同じディスクを入れる).
$0e	書き込み不可能.
$0f	ファイル共有違反.

	下位バイトが 0 の場合、表示する文字列をユーザが指定する事が出来る. 文
	字列のアドレスは a5.l で渡し、文字列は表示幅52桁以下であること. ただし
	デバイスドライバのエラーコードとして返す場合は下位バイト(リクエストヘ
	ッダ先頭から 3 バイト目)が 0 であれば正常終了として扱われ、文字列のア
	ドレスを渡すことも不可能なので、この機能は使用出来ない.

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

・trap #15	IOCS 処理

引数	d0.b	IOCS コール番号

	IOCS を実行する. 実行中、IOCS ワーク $a0e からの 1 ワードに IOCS コー
	ル番号が保存される(上位バイトは常に 0).
	d0.b 以外の引数と返値はコール番号によって異なる.

	IOCS コールを高速化するには、以下のような方法でショートカット呼び出し
	を実行する. ただし、スーパーバイザ状態でなければならない.

	movea.l	(IOCSコール番号*4+$400),a0
	jsr	(a0)

	IOCS の各機能は rts で帰るサブルーチンとして作成する.
	a0.l は破壊しても問題ないが(ユーザから見た場合、ショートカットする時は
	保存される保証はない)、他の返値を渡さないレジスタについては破壊しない
	こと.

ベクタベースレジスタ vbr への対応方法

	X68030(ROM IOCS version 1.3)では vbr を有効にする事が出来る.
	以下のベクタを、ROM 内を指す標準のベクタであることを確認した上で、それ
	ぞれの設定アドレスから 2 を引いた値に変更すればよい. ただし、一部の
	IOCS コールで直接 ROM 内のルーチンを呼び出しているものには対応できない.

	trap #15(IOCS 処理アドレステーブルも vbr+$400 に変更される)
	IOCS _FNTGET
	IOCS _OPMINTST
	IOCS _TIMERDST
	IOCS _VDISPST
	IOCS _CRTCRAS
	IOCS _HSYNCST
	IOCS _PRNINTST
	IOCS _B_INTVCS

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