全体の構成は次のようになります.
code segment use16 assume cs:code, ds:data ;ヘッダ部 db '86FMPCMI' ;8バイトの名前(ASCII),どう利用されるかは不明, ;重ならなければいい? dw code,00bah ;コード用に00bahのセレクタを使用しているらしい. ;このcodeの値を使いアロケーションされる. dw data,00b2h ;データ用で同上 dw 0002h ;セグメントの数? start: ;LOADされたときの実行ポイント ;コードセグメント pushad ... popad ends data segment ;データセグメント ... ends end start
C1 | AX=0003h |
---|---|
機能 | 仮想86モード(AT互換モード)のコンベンショナルメモリの フリーエリアの獲得 |
入力 | cx=獲得したいバイト数 |
返値 | エラー時 キャリーフラグ=1 ax=割り当てられた領域をプロテクトモードでのアクセスするためのセレクタ dx=割り当てられた領域の仮想86モードでのセグメント |
C2 | AX=0010h |
---|---|
機能 | 各モジュールとのインターフェース(後述) |
入力 | dx:esi=パラメータブロックへのポインタ |
C3 | AX=0020h |
---|---|
機能 | 仮想86モード(AT互換モード)の全メモリ空間の
アクセスのためのセレクタと レジスタの状態が保存されている領域のセレクタの獲得 |
返値 | エラー時 キャリーフラグ=1 ax=メモリーのセレクタ dx=レジスタのセレクタ |
備考 | xx番地をアクセスしたいメモリの86モードでの
リニアアドレスとすると プロテクトモードではax:xxでアクセスできる.ただし書き込み不可. dx:xxを操作することでxx番地にあたるレジスタの値を操作できる レジスタの保存状態は下の通り |
オフセット | レジスタ |
---|---|
+00h | edi |
+04h | esi |
+08h | ebp |
+10h | ebx |
+14h | edx |
+18h | ecx |
+1ch | eax |
+24h | eip |
+28h | cs |
+2ch | eflags |
+30h | esp |
+34h | ss |
+38h | es |
+3ch | ds |
+40h | fs |
+44h | gs |
C4 | AX=0021h |
---|---|
機能 | 仮想86モード(AT互換モード)でのサブルーチンの呼び出し |
備考 | 事前にC3を使って86モード時のcs,ipレジスタを呼び出したいアドレスに 設定しておくことが必要 |
C5 | AX=0022h |
---|---|
機能 |
仮想86モード(AT互換モード)での INT xxhの実行 |
入力 | dl=実行したい割り込み番号 |
備考 | 例えばdl=21hでDOSのファンクションコールが実行される.このとき 事前に C3を使って仮想86モード時のレジスタを設定しておくことが必要 |
C6 | AX=0030h |
---|---|
機能 | 仮想86モード(98互換モード)の全メモリ空間のアクセスのための
セレクタと レジスタの状態が保存されている領域のセレクタの獲得 |
返値 | エラー時 キャリーフラグ=1 ax=メモリーのセレクタ dx=レジスタのセレクタ |
備考 | xxをアクセスしたいメモリの86モードでのリニアアドレスとすると プロテクトモードではax:xxでアクセスできる.こちらは書き込みも可. |
C7 | AX=0041h |
---|---|
機能 | エラーメッセージ出力後98/V停止 |
入力 |
dx:edi=エラーメッセージ文字列(ASCIIZ)アドレス |
以下にC2で指定するデータの書式を示します. (W)はこちらで書き込む,(R)は値が返ってくるもの.
オフセット | 型 | 値 | 説明 |
---|---|---|---|
+0 | BYTE(8) | 'DISPATCH' | (W)ASCII名,固定 |
+8 | WORD | 0000h | (R)返値,0以外でエラー発生 |
+a | BYTE | num | (W)登録数 |
+b | WORD | 00h | 不明 |
... | 以下個々の登録を複数列挙 | ||
BYTE | 0ffh | (W)終端を意味する |
個々の登録の書式は先頭の1バイトで決まる.書式は以下の通り.
オフセット | 型 | 値 | 説明 |
---|---|---|---|
+0 | BYTE | 00h | (W)I/Oフォルト時 |
+1 | WORD | addr | (W)アクセスしたIOポートアドレス(98モードでの) |
+3 | WORD | 0000h | 不明 |
+5 | BYTE | 00h | 不明 |
+6 | WORD | offset | (W)フォルト発生時の処理ルーチンのアドレスのオフセット部 |
+8 | WORD | code | (W)同セレクタ |
オフセット | 型 | 値 | 説明 |
---|---|---|---|
+0 | BYTE | 03h | (W)ハードによる割り込み時 |
+1 | BYTE | irg | (W)対応する割り込みベクトル *1 |
+2 | WORD | _86int | (W)割り込み発生時の処理ルーチンのアドレスのオフセット部 |
+4 | WORD | code | (W)同セレクタ |
オフセット | 型 | 値 | 説明 |
---|---|---|---|
+0 | BYTE | 04h | (W)仮想86モードでの halt命令による停止時 |
+1 | BYTE(8) | 'ASPIBRIG' | (W)ASCII名,停止個所の識別に使う |
+9 | WORD | aspib | (W)停止時の処理ルーチンのアドレスのオフセット部 |
+b | WORD | code | (W)同セレクタ |
オフセット | 型 | 値 | 説明 |
---|---|---|---|
+0 | BYTE | 05h | (W)他のモジュールからの C2による呼び出し時 |
+1 | BYTE(8) | 'TIMER ' | (W)ASCII名,呼び出しの識別に使う |
+9 | WORD | l05D0 | (W)呼び出し処理ルーチンのアドレスのオフセット部 |
+b | WORD | code | (W)同セレクタ |
オフセット | 型 | 説明 |
---|---|---|
sp+1ch | BYTE | (W)単入力時は入力された値を設定 |
sp+25h | BYTE | (R)フォルト時のIO操作の種類 第2ビット=0 入力; 1 出力 第3ビット=0 ブロック転送時アドレス増加; 1 アドレス減少 第4ビット=0 単入出力; 1 ブロック転送 |
sp+28h | BYTE | (R)単出力時は出力する値 |
sp+28h | DWORD | (R)ブロック転送時は転送元(先)オフセット |
sp+2ch | WORD | (R)転送元(先)セレクタ |
sp+2eh | DWORD | (R)ブロック転送時の転送バイト数 |
Dispatcherに登録していない外部信号による割り込みに関しては, AT互換モードでリアルモード割込み動作のエミュレーションが行われる.
hlt dp1 dw dp2 - dp1 ;haltの次に識別名への相対値を置く ret dp2 db 'ASPIBRIG' ;8バイトの識別名(ASCII) ;この名前のルーチンが実行される.
オフセット | 型 | 説明 |
---|---|---|
sp+26h | DWORD | C2使用時のパラメータブロックポインタのオフセット 6節 |
sp+2ah | WORD | 同セレクタ部 |
オフセット | 型 | 値 | 説明 |
---|---|---|---|
+00h | BYTE(8) | 'PIC_FUNC' | (W)ASCII,モジュール名,固定 |
+08h | WORD | 0000h | (R)返値,0以外でエラー発生 |
+0ah | WORD | 0000h | (W)機能選択番号 0以外については不明 |
+0ch | BYTE | irg | (W)使用許可する割り込みベクトル(98モードでの) |
+0dh | WORD | 0000h | (R)98モードでの割り込みを発生させるための ルーチンのアドレスのオフセットがセットされる |
+0fh | WORD | 0000h | (R)同セレクタ部 |
割り込み発生のエミュレーションは alレジスタに98モードでの割り込みベクトルを 設定し上の+0dh,+0fhにセットされた番地をfar callする.これにより,98モード復帰時に リアルモードでの割り込み動作が行われる.
オフセット | 型 | 値 | 説明 |
---|---|---|---|
+00h | BYTE(8) | 'TIMER ' | (W)ASCII,モジュール名,固定 |
+08h | WORD | 0000h | (R)返値,0以外でエラー発生 |
+0ah | WORD | tkind | (W)タイマーの種類 値が0のとき1回で終了 1のとき自動的にカウンタが更新され連続動作 |
+0ch | WORD | count | (W)カウンタ初期値 msec単位 |
+0eh | WORD | cprog | (W)カウンタが0となったときに呼ばれる ルーチンのアドレスのオフセット部 |
+10h | WORD | code | (W)同セレクタ部 |