The current URL is datacrystal.tcrf.net.
X68k/TRAP: Difference between revisions
(Created page with ' <nowiki> - TRAP EXCEPTION MANAGER MANUAL - ============================================================================== ・TRAP 例外処理一覧 trap #0 ユーザ定義 t…') |
mNo edit summary |
||
Line 1: | Line 1: | ||
{{subpage|game=Sharp X68000}} | |||
<nowiki> | |||
- TRAP EXCEPTION MANAGER MANUAL - | |||
============================================================================== | ============================================================================== | ||
Line 191: | Line 193: | ||
============================================================================== | ============================================================================== | ||
</ | </pre> |
Revision as of 06:29, 5 June 2016
This is a sub-page of X68k.
<nowiki> - 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