Welcome to Data Crystal's new home! Data Crystal is now part of the TCRF family (sort of).
The wiki has recently moved; please report any issues in Discord. Pardon the dust.

X68k/TRAP: Difference between revisions

From Data Crystal
Jump to navigation Jump to search
(Created page with ' <nowiki> - TRAP EXCEPTION MANAGER MANUAL - ============================================================================== ・TRAP 例外処理一覧 trap #0 ユーザ定義 t…')
 
mNo edit summary
Line 1: Line 1:
<nowiki> - TRAP EXCEPTION MANAGER MANUAL -
{{subpage|game=Sharp X68000}}
<nowiki>
- TRAP EXCEPTION MANAGER MANUAL -


==============================================================================
==============================================================================
Line 191: Line 193:


==============================================================================
==============================================================================
</nowiki>
</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

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