全体の構成は次のようになります.
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)同セレクタ部 |