ATOK割り込み
ATOK割り込みとは
J-3100が発売された当時は、FM-RにはOAK、PC-9801にはNECDIC.SYSといった 各会社独自のFEPが搭載されていました。
なので、J-3100用のMS-DOSには東芝日本語変換システムみたいなのがついてくるか、というと そうではなく、ジャストシステムのATOK5をカスタマイズした、ATOK5Tが搭載されていました。
しかしながら、私はPC-9801も使っていましたが、NECDIC.SYSは使わずATOKを 使っていました。他にも最初からついてくるFEPを使わずATOKだけを使う人が多かったと思います。独自でFEPを開発せずにATOKを標準搭載させた東芝の判断は正しかったようにも思えます。
しかしながら、私はPC-9801も使っていましたが、NECDIC.SYSは使わずATOKを 使っていました。他にも最初からついてくるFEPを使わずATOKだけを使う人が多かったと思います。独自でFEPを開発せずにATOKを標準搭載させた東芝の判断は正しかったようにも思えます。
ATOK5/6用API
ATOK5/6用のAPIはJ-3100テクニカルマニュアルにも掲載されています。 呼び出し方も比較的簡単です。AHレジスタに機能番号をセットして、
INT 6FHを呼ぶだけです。
この機能が使えるのは、DCGA(J-3100モード)でATOK5/ATOK6が組み込まれている状態、あるいは、ATOK7に7TO5.COMを組み込んでいる場合のみです。VGAモードの時は、後述のATOK7/ATOK8割り込みを使ってください。
この機能が使えるのは、DCGA(J-3100モード)でATOK5/ATOK6が組み込まれている状態、あるいは、ATOK7に7TO5.COMを組み込んでいる場合のみです。VGAモードの時は、後述のATOK7/ATOK8割り込みを使ってください。
AH | 機能 |
---|---|
01H | ローマ字漢字モードに入る |
02H | かな漢字モードに入る |
03H | 半角英数モードに入る |
04H | 記号モードに入る |
05H | コード入力モードに入る |
0BH | ATOKをオフにする |
0FH | 学習機能をオンにする |
10H | 学習機能をオフにする |
11H | 漢字キーを無効にする |
12H | 漢字キーを有効にする |
66H | 現在のモードを求める |
ATOK5/6の常駐判断
0000:01BCにfarアドレスでATOKのAPIのエントリアドレスが格納されています。
0000:01BC ・・・オフセット
0000:01BE ・・・セグメント
ここに書かれたAPIエントリアドレス+3番地にATOKという文字が入っていたら、ATOK5/6が常駐しています。
0000:01BCにfarアドレスでATOKのAPIのエントリアドレスが格納されています。
0000:01BC ・・・オフセット
0000:01BE ・・・セグメント
ここに書かれたAPIエントリアドレス+3番地にATOKという文字が入っていたら、ATOK5/6が常駐しています。
AH=01H ローマ字漢字モードに入る
ATOKをオンにして、ローマ字漢字変換モードに入ります。既にATOKがオンならモードを変更します。
ATOKをオンにして、ローマ字漢字変換モードに入ります。既にATOKがオンならモードを変更します。
入力 | 出力 |
---|---|
AH 01H | なし |
AH=02H かな漢字モードに入る
ATOKをオンにして、かな漢字入力モードに入ります。既にATOKがオンならモードを変更します。
ATOKをオンにして、かな漢字入力モードに入ります。既にATOKがオンならモードを変更します。
入力 | 出力 |
---|---|
AH 02H | なし |
AH=03H 半角英数モードに入る
ATOKをオンにして、半角英数モードに入ります。既にATOKがオンならモードを変更します。
ATOKをオンにして、半角英数モードに入ります。既にATOKがオンならモードを変更します。
入力 | 出力 |
---|---|
AH 03H | なし |
AH=04H 記号モードに入る
ATOKをオンにして、記号モードに入ります。既にATOKがオンならモードを変更します。
ATOKをオンにして、記号モードに入ります。既にATOKがオンならモードを変更します。
入力 | 出力 |
---|---|
AH 04H | なし |
AH=05H コード入力モードに入る
ATOKをオンにして、コード入力モードに入ります。既にATOKがオンならモードを変更します。
ATOKをオンにして、コード入力モードに入ります。既にATOKがオンならモードを変更します。
入力 | 出力 |
---|---|
AH 05H | なし |
AH=0BH ATOKをオフにする
入力 | 出力 |
---|---|
AH 0BH | なし |
AH=0FH 学習機能をオンにする
入力 | 出力 |
---|---|
AH 0FH | なし |
AH=10H 学習機能をオフにする
入力 | 出力 |
---|---|
AH 10H | なし |
AH=11H 漢字キーを無効にする
入力 | 出力 |
---|---|
AH 11H | なし |
AH=12H 漢字キーを有効にする
入力 | 出力 |
---|---|
AH 12H | なし |
AH=66H 現在の状態を求める
入力 | 出力 |
---|---|
AH 66H | AL 00H ATOKオフ 01H あ連R漢 02H あ連カナ漢 03H 半英数 04H 記号 05H コード |
ATOK7/8用API
ATOK7では、従来のATOK5/6のようなINT割り込みでAPIを呼び出す方式から変更され、あらかじめメモリに引数のエリアを用意しておいて、far
callで呼び出す方式に変更になりました。
しかし、J-3100用に作られたアプリでは従来のようにINT 6FHを使ってFEP(ATOK)を操作するソフトも多かったので、日英DOS5.0に搭載されたJ-3100用のATOK7では7TO5.COMという常駐ドライバーが仲介する事で、従来のINT 6FHによるATOKの制御も可能にしていました。
ところが、ATOK8用にはそのような仲介ドライバーは作られなくなり、また東芝DOS/Vでは7TO5.COMはもともと動作しなかったため、VGA用アプリを作る際には別途ATOK7/ATOK8用のAPIを呼ぶ必要が出てきました。
ここからは、ATOK7/ATOK8のAPIを使ってATOKを制御する方法を説明します。
割り込みベクタアドレスを求める
ATOK7/ATOK8のAPIを呼ぶために、まず割り込みベクタアドレスを求める必要があります。DCGAの時はINT 6FH、VGAの時はINT 60Hです。日英DOS5.0でVEMモードの時はATOK自体はJ-3100用のためなのか、6FHだったという情報もあります。(残念ながら未検証です。)
割り込みベクタアドレスを取得するには、DOSコール(AH=35H INT 21H)を使います。
しかし、J-3100用に作られたアプリでは従来のようにINT 6FHを使ってFEP(ATOK)を操作するソフトも多かったので、日英DOS5.0に搭載されたJ-3100用のATOK7では7TO5.COMという常駐ドライバーが仲介する事で、従来のINT 6FHによるATOKの制御も可能にしていました。
ところが、ATOK8用にはそのような仲介ドライバーは作られなくなり、また東芝DOS/Vでは7TO5.COMはもともと動作しなかったため、VGA用アプリを作る際には別途ATOK7/ATOK8用のAPIを呼ぶ必要が出てきました。
ここからは、ATOK7/ATOK8のAPIを使ってATOKを制御する方法を説明します。
割り込みベクタアドレスを求める
ATOK7/ATOK8のAPIを呼ぶために、まず割り込みベクタアドレスを求める必要があります。DCGAの時はINT 6FH、VGAの時はINT 60Hです。日英DOS5.0でVEMモードの時はATOK自体はJ-3100用のためなのか、6FHだったという情報もあります。(残念ながら未検証です。)
割り込みベクタアドレスを取得するには、DOSコール(AH=35H INT 21H)を使います。
;--------------------------------------------------------- ; DOSVモードか? J3100モードか? ;--------------------------------------------------------- MODE_HANDAN = $ MOV AH,0FH INT 10H CMP AL,74H JE J31MODE CMP AL,64H JE J31MODE CMP AL,75H JE J31MODE CMP AL,65H JE J31MODE DOSVMODE = $ MOV [VECNO],BYTE PTR 60H JMP GET_ENTRY J31MODE = $ MOV [VECNO],BYTE PTR 6FH JMP GET_ENTRY ;--------------------------------------------------------- ; エントリーアドレス取得 ;--------------------------------------------------------- GET_ENTRY = $ MOV AH,35H MOV AL,[VECNO] INT 21H ADD BX,+20H MOV [ATOK_ENTRY],BX MOV [ATOK_ENTRY + 2],ES
AHレジスタに35H、ALレジスタに調べたい割り込み番号を入れてINT 21H割り込みをかけると、割り込みベクタアドレスはES:BXレジスタに返ってきます。これ+20HがATOKのAPI開始アドレスですので、
これを記録しておきます。ここで取得した割り込み ベクタアドレスは、後で CALL DWORD PTR ATOK_ENTRY という風にfarコールで使います。


ATOK7/8の常駐判断
割り込みベクタアドレスの+30バイト目からATOK7という文字があればATOK7、+50バイト目にATOK8という文字があればATOK8がメモリに常駐しています。ATOK8専用APIを使うのであれば、+50番地にATOKという文字列が格納されているかどうかチェックする必要があります。
例)ATOK8の常駐を判断する。ES:BXレジスタには、割り込みベクタアドレス+20が入っているものとします。
割り込みベクタアドレスの+30バイト目からATOK7という文字があればATOK7、+50バイト目にATOK8という文字があればATOK8がメモリに常駐しています。ATOK8専用APIを使うのであれば、+50番地にATOKという文字列が格納されているかどうかチェックする必要があります。
例)ATOK8の常駐を判断する。ES:BXレジスタには、割り込みベクタアドレス+20が入っているものとします。
;---------ATOK存在判断 ATOK_HANDAN1 = $ MOV SI,BX CMP ES:[SI+30H],BYTE PTR "A" JNE ATOK_HANDAN2 CMP ES:[SI+31H],BYTE PTR "T" JNE ATOK_HANDAN2 CMP ES:[SI+32H],BYTE PTR "O" JNE ATOK_HANDAN2 CMP ES:[SI+33H],BYTE PTR "K" JNE ATOK_HANDAN2 JMP ATOK_HANDAN3 ;---------なかった ATOK_HANDAN2 = $ MOV CS:[SONZAI_F],BYTE PTR 0 JMP ATOK_HANDAN4 ;---------あった ATOK_HANDAN3 = $ MOV CS:[SONZAI_F],BYTE PTR 1 ATOK_HANDAN4 = $
引数エリアの確保
ATOK7/8のAPIでは、従来のAHレジスタに機能番号を入れる方式と異なり、引数のエリア40Hバイトを用いて機能を指定します。そこで、あらかじめ40Hバイトのエリアを確保しておきます。機能によっては入力する値がないものもありますが、入力がなくてもエラー情報や以前のモードの情報が帰ってきますので、メモリーは必ず確保しておきます。
ATOK7/8のAPIでは、従来のAHレジスタに機能番号を入れる方式と異なり、引数のエリア40Hバイトを用いて機能を指定します。そこで、あらかじめ40Hバイトのエリアを確保しておきます。機能によっては入力する値がないものもありますが、入力がなくてもエラー情報や以前のモードの情報が帰ってきますので、メモリーは必ず確保しておきます。
PACKET DB 40H DUP (0)
引数エリアはほとんどの場合2バイト単位で、値をワードで扱います。また、数値はリトルエンディアンで格納されるため、そのまま
MOV AX,[SI]
MOV [DI],AX
MOV WORD PTR [DI],0001H
のようにして扱う事ができます。(※ここで、DS:[SI]、ES:[DI]はともに引数エリアを示しているとします)
APIを呼ぶ
ATOKの常駐を確認し、引数エリアを確保したら、AXに機能番号、ES:BXに引数エリアをセットして、先に取得したアドレスATOK_ENTRYを FARアドレスコール(CALL DWORD PTR ATOK_ENTRY)で呼びます。
MOV AX,[SI]
MOV [DI],AX
MOV WORD PTR [DI],0001H
のようにして扱う事ができます。(※ここで、DS:[SI]、ES:[DI]はともに引数エリアを示しているとします)
APIを呼ぶ
ATOKの常駐を確認し、引数エリアを確保したら、AXに機能番号、ES:BXに引数エリアをセットして、先に取得したアドレスATOK_ENTRYを FARアドレスコール(CALL DWORD PTR ATOK_ENTRY)で呼びます。
AX | 機能 |
---|---|
AX=0001H AX=0002H AX=0003H AX=0004H AX=0005H AX=0006H AX=0007H AX=0008H AX=0009H AX=000AH AX=000CH AX=000EH AX=0010H AX=0014H AX=001CH AX=001DH AX=0020H AX=0021H AX=0024H AX=002AH AX=002BH AX=002CH AX=002DH AX=002EH AX=0050H AX=0090H AX=0180H AX=0100H AX=0150H AX=0200H AX=0480H AX=0481H AX=0482H AX=0483H AX=0484H AX=0485H AX=0496H AX=0497H AX=1001H |
ATOKをオンにする ATOKをオフにする モード変更 連文節/単文節の変更、読み出し コード入力時の文字コード変更、読み出し 学習機能の有効/無効 エコーモードの設定、読み出し 句読点モードの設定、読み出し 固定入力の設定/取得 辞書、外字ファイル名変更/読み出し 送り仮名モードの設定、読み出し 句読点切り替えモードの設定、読み出し 漢字キー/入力モード切り替えキーの有効無効 入力モード切り替えキーの有効無効 入力モードの設定/読み出し 入力文字種の設定/読み出し 辞書オープン 辞書クローズ 入力モードローテーションの設定/読み出し 辞書、外字ファイル名設定/読み出し システム辞書Noの設定/読み出し 自動学習種別の設定/読み出し スペースキー機能の設定/読み出し 英字入力モードの設定/読み出し 外字のロード ATOK内部コード変換 単語登録 変換処理 変換処理 変換後処理 アプリケーション接続モードの設定/読み出し アプリケーション接続サブモードの設定/読み出し アプリケーションとの接続開始 アプリケーションとの接続終了 アプリケーションとの接続時の入力文字数の設定 ATOKでの表示を禁止する 表示エリア格納エリアをATOKに通知する ATOKの表示データを得る 外字ファイル有効/無効の切り替え |
AX=0001H ATOKをオンにする
J-3100で用意されたATOK5/6用のAPIでは、あ連R漢に入る命令を発行すると自動的にATOKがオンになりましたが、ATOK7/8用APIではATOKをオフにしたままでもモードを切り替える事ができるようになっています。そのため、あ連R漢に入る場合、ATOKをオンにする命令と、あ連R漢にする命令を、それぞれ別々に発行します。
J-3100で用意されたATOK5/6用のAPIでは、あ連R漢に入る命令を発行すると自動的にATOKがオンになりましたが、ATOK7/8用APIではATOKをオフにしたままでもモードを切り替える事ができるようになっています。そのため、あ連R漢に入る場合、ATOKをオンにする命令と、あ連R漢にする命令を、それぞれ別々に発行します。
入力 | 出力 | |
---|---|---|
レジスタ | レジスタ | 引数エリア |
AX 0001H ES:BX 引数エリア |
ES:BX 引数エリア | +0モード(ワード) 0000H ATOKオフ 0001H ATOKオン |
;----------ATOKを有効にする MOV AX,0001H MOV BX,OFFSET PACKET CALL DWORD PTR ATOK_ENTRY
AX=0002H ATOKをオフにする
ATOKをオフにします。つまり、FEPをオフにして、最下段の「あ連R漢」みたいな表示を消します。
ATOKをオフにします。つまり、FEPをオフにして、最下段の「あ連R漢」みたいな表示を消します。
入力 | 出力 | |
---|---|---|
レジスタ | レジスタ | 引数エリア |
AX 0002H ES:BX 引数エリア |
ES:BX 引数エリア |
+0 モード(ワード) 以前のモード(「AX=0003H モード変更」を参照) |
;----------ATOKを消す MOV AX,0002H MOV BX,OFFSET PACKET CALL DWORD PTR ATOK_ENTRY
AX=0003H モード変更
モード変更はATOKオンの時でもオフの時でも行う事ができます。AXレジスタに0003Hを入れ、引数エリアに機能番号をセットします。
あらかじめES:BXで示したエリアの+0からワードでモードを指定します。FFFFHならモードの変更はせず、現在のモードを取得するだけです。どのモードを指定しても、引数エリア+0には従来のモードが返ります。また、FFFFHならエラーです。未確定の文字がある場合、モードの変更はできませんから、エラーになります。
連文節/単文節(あ連/あ単)の切り替えは、AX=0004Hで行います。
モード変更はATOKオンの時でもオフの時でも行う事ができます。AXレジスタに0003Hを入れ、引数エリアに機能番号をセットします。
あらかじめES:BXで示したエリアの+0からワードでモードを指定します。FFFFHならモードの変更はせず、現在のモードを取得するだけです。どのモードを指定しても、引数エリア+0には従来のモードが返ります。また、FFFFHならエラーです。未確定の文字がある場合、モードの変更はできませんから、エラーになります。
連文節/単文節(あ連/あ単)の切り替えは、AX=0004Hで行います。
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 0003H ES:BX 引数エリア |
+0 モード(ワード) 0001H あXR漢 0002H あXカナ漢 0003H 半英数 0004H 記号 0005H コード FFFFH 現在のモードの取得 |
ES:BX 引数エリア |
+0 モード(ワード) 以前のモード(入力と同じ) FFFFHならエラー |
;----------あ連R漢モードにする MOV AX,0003H MOV DI,OFFSET PACKET MOV [DI],WORD PTR 0001H MOV BX,OFFSET PACKET CALL DWORD PTR ATOK_ENTRY
AX=0004H 連文節/単文節の変更、読み出し
連文節(例えば「あ連R漢」)と、単文節(例えば「あ単R漢」)を切り替えます。R漢/かな漢の切り替えはAX=0003Hで行います。
連文節(例えば「あ連R漢」)と、単文節(例えば「あ単R漢」)を切り替えます。R漢/かな漢の切り替えはAX=0003Hで行います。
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 0004H ES:BX 引数エリア |
+0 モード(ワード) 0000H あ連X漢 0001H あ単X漢 FFFFH 現在のモードの取得 |
ES:BX 引数エリア |
+0 モード(ワード) 以前のモード(入力と同じ) FFFFHならエラー |
AX=0005H コード入力時の文字コード変更、読み出し
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 0005H ES:BX 引数エリア |
+0 モード(ワード) 0000H シフトJIS 0001H JIS 0002H 区点 FFFFH 現在のモードの取得 |
ES:BX 引数エリア |
+0 モード(ワード) 以前のモード(入力と同じ) FFFFHならエラー |
AX=0006H 学習機能の有効/無効
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 0006H ES:BX 引数エリア |
+0 モード(ワード) 0000H 学習機能無効 0001H 学習機能有効 FFFFH 現在のモードの取得 |
ES:BX 引数エリア |
+0 モード(ワード) 以前のモード(入力と同じ) FFFFHならエラー |
;--------------------------------------------------------- ; 学習機能ON ;--------------------------------------------------------- GAKUON = $ MOV AX,0006H MOV DI,OFFSET PACKET MOV [DI],WORD PTR 0001H MOV BX,OFFSET PACKET CALL DWORD PTR ATOK_ENTRY
AX=0007H エコーモードの設定、読み出し
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 0007H ES:BX 引数エリア |
+0 モード(ワード) 0000H システムライン 0001H エコーモード FFFFH 現在のモードの取得 |
ES:BX 引数エリア |
+0 モード(ワード) 以前のモード(入力と同じ) FFFFHならエラー |
AX=0008H 句読点モードの設定、読み出し
句読点モードを、1ワード(2バイト)で読み出し/設定します。設定したい場合以外を残す時は、いったん現在のモードを取得した後、ANDやORで設定したビットを操作した後再度この機能を呼びます。
句読点モードを、1ワード(2バイト)で読み出し/設定します。設定したい場合以外を残す時は、いったん現在のモードを取得した後、ANDやORで設定したビットを操作した後再度この機能を呼びます。
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 0008H ES:BX 引数エリア |
+0 モード(ワード) ビット3 0:, 1:、 ビット2 0:. 1:。 ビット1 0:[] 1:「」 ビット0 0:/ 1:・ FFFFH 現在のモードの取得 |
ES:BX 引数エリア |
+0 モード(ワード) 以前のモード(入力と同じ) FFFFHならエラー |
AX=0009H 固定入力の設定/取得
固A 固A 固カナ 固カナといった固定モードに入ります。
固A 固A 固カナ 固カナといった固定モードに入ります。
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 0009H ES:BX 引数エリア |
+0 モード(ワード) 0000H 固定モード解除 0001H 固定ひらがな(あ固) 0002H 固定全角カタカナ(ア固) 0003H 固定全角英文字(A固) 0004H 固定半角カナ(カナ固) 0005H 固定半角英数(A固) FFFFH 現在のモードの取得 |
ES:BX 引数エリア |
+0 モード(ワード) 以前のモード(入力と同じ) FFFFHならエラー |
;----------A固R漢にする MOV AX,0009H MOV DI,OFFSET PACKET MOV [DI],WORD PTR 0003H MOV BX,OFFSET PACKET CALL DWORD PTR ATOK_ENTRY
AX=000AH 辞書、外字ファイル名変更/読み出し
辞書、外字ファイル名を指定、もしくは読み出します。ファイル名エリアは事前に確保しておきます。フルパスで指定あるいはセットされますが、最大で64バイトです。それより長いパスにあると指定できません。
ここで指定した場所にファイルが存在するかどうかの判断は行っていません。辞書ファイルとして存在しないファイルが指定されると、変換時に「辞書ファイルが存在しません」とのメッセージが出ます。外字ファイルが存在しないと外字は以前の状態(初期状態なら空白)のままです。
辞書、外字ファイル名を指定、もしくは読み出します。ファイル名エリアは事前に確保しておきます。フルパスで指定あるいはセットされますが、最大で64バイトです。それより長いパスにあると指定できません。
ここで指定した場所にファイルが存在するかどうかの判断は行っていません。辞書ファイルとして存在しないファイルが指定されると、変換時に「辞書ファイルが存在しません」とのメッセージが出ます。外字ファイルが存在しないと外字は以前の状態(初期状態なら空白)のままです。
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 000AH ES:BX 引数エリア |
+0 モード(ワード) 0000H 辞書、外字ファイル名変更 8000H 辞書、外字ファイル名読み出し +2 種別(ワード) 0000H辞書 0001H外字 +4 ファイル名へのポインタ( farアドレス) |
ES:BX 引数エリア | +0 ステータス 0000H正常終了 FFFFHエラー +4 ファイル名へのポインタ( farアドレス) |
;--------------------------------------------------------- ; 外字ファイル名変更 ;--------------------------------------------------------- GNAME_HENKO = $ MOV AX,002AH MOV DI,OFFSET PACKET MOV [DI],WORD PTR 0000H MOV [DI+2],WORD PTR 0001H MOV BX,OFFSET GNAME MOV [DI+4],BX MOV BX,CS MOV [DI+6],BX MOV BX,OFFSET PACKET CALL DWORD PTR ATOK_ENTRY
;----------外字ファイル名読み出し MOV AX,002AH MOV DI,OFFSET PACKET MOV [DI],WORD PTR 8000H MOV [DI+2],WORD PTR 0001H MOV BX,OFFSET SFILE MOV [DI+4],BX MOV BX,CS MOV [DI+6],BX MOV BX,OFFSET PACKET CALL DWORD PTR ATOK_ENTRY
AX=000CH 送り仮名モードの設定、読み出し
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 000CH ES:BX 引数エリア |
+0 モード(ワード) 0000H 本則 0001H 省く 0002H 送る FFFFH 現在のモードの取得 |
ES:BX 引数エリア |
+0 モード(ワード) 以前のモード(入力と同じ) FFFFHならエラー |
AX=000EH 句読点切り替えモードの設定、読み出し
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 000EH ES:BX 引数エリア |
+0 モード(ワード) 0000H 反設定値 0001H 設定値 FFFFH 現在のモードの取得 |
ES:BX 引数エリア |
+0 モード(ワード) 以前のモード(入力と同じ) FFFFHならエラー |
AX=0010H 漢字キー/入力モード切り替えキーの有効無効
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 0010H ES:BX 引数エリア |
+0 モード(ワード) 0000H キー無効 0001H キー有効 FFFFH 現在のモードの取得 +2 調べるキー(ワード) 0023H(漢字キー) 0029H(入力ライン切り替えキー) |
ES:BX 引数エリア |
+0 モード(ワード) 以前のモード(入力と同じ) FFFFHでエラー |
;--------------------------------------------------------- ; 漢字キー有効 ;--------------------------------------------------------- KANYUKO = $ MOV AX,0010H MOV DI,OFFSET PACKET MOV [DI],WORD PTR 0001H MOV [DI+2],WORD PTR 0023H MOV BX,OFFSET PACKET CALL DWORD PTR ATOK_ENTRY
AX=0014H 入力モード切り替えキーの有効無効
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 0014H ES:BX 引数エリア |
+0 モード(ワード) 0000H 入力モード切り替えキー無効 0001H 入力モード切り替えキー有効 FFFFH 現在のモードの取得 |
ES:BX 引数エリア |
+0 モード(ワード) 以前のモード(入力と同じ) FFFFHでエラー |
AX=001CH 入力モードの設定/読み出し
次に漢字入力モードになった時に、R漢になるか、かな漢になるかを設定します。この機能はATOK8専用です。
次に漢字入力モードになった時に、R漢になるか、かな漢になるかを設定します。この機能はATOK8専用です。
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 001CH ES:BX 引数エリア |
+0 モード(ワード) 0000H R漢 0001H かな漢 FFFFH 現在のモードの取得 |
ES:BX 引数エリア |
+0 モード(ワード) 以前のモード(入力と同じ) FFFFHでエラー |
AX=001DH 入力文字種の設定/読み出し
この機能はATOK8専用です。
この機能はATOK8専用です。
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 001DH ES:BX 引数エリア |
+0 モード(ワード) 0001H 全角ひらがな 0002H 全角カタカナ 0003H 全角無変換 0004H 半角カタカナ 0005H 半角無変換 FFFFH 現在のモードの取得 |
ES:BX 引数エリア |
+0 モード(ワード) 以前のモード(入力と同じ) FFFFHでエラー |
AX=0020H 辞書オープン
入力 | 出力 | |
---|---|---|
レジスタ | レジスタ | 引数エリア |
AX 0020H ES:BX 引数エリア |
ES:BX 引数エリア | +0 0000H 正常終了 FFFFH エラー |
AX=0021H 辞書クローズ
入力 | 出力 | |
---|---|---|
レジスタ | レジスタ | 引数エリア |
AX 0021H ES:BX 引数エリア |
ES:BX 引数エリア | +0 0000H 正常終了 FFFFH エラー |
AX=0024H 入力モードローテーションの設定/読み出し
連/単、ローマ字/カナ、固定/非固定などは維持したまま、入力モードだけを切り替えます。この機能はATOK8専用です。
連/単、ローマ字/カナ、固定/非固定などは維持したまま、入力モードだけを切り替えます。この機能はATOK8専用です。
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 0024H ES:BX 引数エリア |
+0 モード(ワード) 0001H 漢字 0002H 半角 0003H コード 0004H 記号 FFFFH 現在のモードの取得 |
ES:BX 引数エリア |
+0 モード(ワード) 以前のモード(入力と同じ) FFFFHでエラー |
AX=002AH 辞書、外字ファイル名設定/読み出し
詳細の仕様はAX=000AHと同じですが、こちらはATOK8専用で、辞書ファイル名が複数選択できます。
詳細の仕様はAX=000AHと同じですが、こちらはATOK8専用で、辞書ファイル名が複数選択できます。
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 002AH ES:BX 引数エリア |
+0 モード(ワード) 0000H 辞書、外字ファイル名変更 8000H 辞書、外字ファイル名読み出し +2 種別(バイト) 00H辞書 01H外字 +3 辞書ファイルNo(バイト) ファイルNo.00H~09H 外字の場合は00Hに固定 +4 ファイル名へのポインタ( farアドレス) |
ES:BX 引数エリア | +0 ステータス 0000H正常終了 FFFFHエラー +4 ファイル名へのポインタ( farアドレス) |
AX=002BH システム辞書Noの設定/読み出し
この機能はATOK8専用です。
この機能はATOK8専用です。
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 002BH ES:BX 引数エリア |
+0 モード(ワード) 0000H~0009H システム辞書No. FFFFH 現在の辞書No.の取得 |
ES:BX 引数エリア |
+0 モード(ワード) 以前の辞書No. FFFFHでエラー |
AX=002CH 自動学習種別の設定/読み出し
引数エリア+0にある各ビットで学習機能のオン/オフを切り替えます。この機能はATOK8専用です。
引数エリア+0にある各ビットで学習機能のオン/オフを切り替えます。この機能はATOK8専用です。
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 002CH ES:BX 引数エリア |
+0 モード(ワード) ビット0 文節区切りの学習 ビット1 複合語の学習 ビット2 後変換の学習 ビット3 未登録語の学習 FFFFH 現在のモードの取得 |
ES:BX 引数エリア |
+0 モード(ワード) 以前のモード(入力と同じ) FFFFHでエラー |
AX=002DH スペースキー機能の設定/読み出し
引数エリア+0のビット0~4が、各モードに設定されています。それぞれビットを立てるとスペースキーが「スペース入力」となり、ビットを0にするとスペースキーが「機能キー」として働きます。この機能はATOK8専用です。
引数エリア+0のビット0~4が、各モードに設定されています。それぞれビットを立てるとスペースキーが「スペース入力」となり、ビットを0にするとスペースキーが「機能キー」として働きます。この機能はATOK8専用です。
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 002DH ES:BX 引数エリア |
+0 モード(ワード) ビット0 全角ひらがな ビット1 全角カタカナ ビット2 全角無変換 ビット3 半角カタカナ ビット4 半角無変換 FFFFH 現在のモードの取得 |
ES:BX 引数エリア |
+0 モード(ワード) 以前のモード(入力と同じ) FFFFHでエラー |
AX=002EH 英字入力モードの設定/読み出し
この機能はATOK8専用です。
この機能はATOK8専用です。
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 002EH ES:BX 引数エリア |
+0 モード(ワード) 0000H 英字入力オフ 0001H 英字入力オン FFFFH 現在のモードの取得 |
ES:BX 引数エリア |
+0 モード(ワード) 以前のモード(入力と同じ) FFFFHでエラー |
AX=0050H 外字のロード
外字をメモリーにロードします。プリンターにはロードしません。ATOKを組み込んだ後や、外字ファイル名を変更した後に最初に「漢字」キーを押すと自動的にメモリーにロードされますが、アプリでユーザーが何らかのキー操作をする前に外字を画面に出したい場合には、あらかじめ外字をメモリーにロードしておく必要があります。この機能はATOK8専用です。
外字をメモリーにロードします。プリンターにはロードしません。ATOKを組み込んだ後や、外字ファイル名を変更した後に最初に「漢字」キーを押すと自動的にメモリーにロードされますが、アプリでユーザーが何らかのキー操作をする前に外字を画面に出したい場合には、あらかじめ外字をメモリーにロードしておく必要があります。この機能はATOK8専用です。
入力 | 出力 | |
---|---|---|
レジスタ | レジスタ | 引数エリア |
AX 0050H ES:BX 引数エリア |
ES:BX 引数エリア | 0000H正常 FFFFHエラー |
;--------------------------------------------------------- ; 外字登録 ;--------------------------------------------------------- GAIJILD = $ MOV AX,0050H MOV BX,OFFSET PACKET CALL DWORD PTR ATOK_ENTRY
AX=0090H ATOK内部コード変換
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 0090H ES:BX 引数エリア |
+0 出力のためにリザーブ(4バイト) +4 SCANコード +6 JISコード +8 シフト状態 |
ES:BX 引数エリア | +0 ATOK内部コード(4バイト) |
AX=0180H 単語登録
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 0180H ES:BX 引数エリア |
+0 出力のためにリザーブ(2バイト) +2 品詞 0001H 名詞 0002H 名詞(サ変) 0003H 人名 0004H 地名 0005H 組織名 0006H 固有名詞 0007H その他 +4 リザーブ +6 表記文字列バイト数 +8 表記文字列アドレスへのポインタ(farアドレス) +C 読み文字列バイト数 +E 読み文字列へのポインタ(farアドレス) |
ES:BX 引数エリア | +0 結果 0000H 正常終了 0001H 登録単語文字数オーバー 0002H 登録単語に登録できない文字 0003H 読み文字数オーバー 0004H 読みに登録できない文字 0005H 登録数がいっぱい FFFFH その他のエラー |
AX=0100H 変換処理
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 0100H ES:BX 引数エリア |
+0 出力のためにリザーブ(2バイト) +2 入力キーコード |
ES:BX 引数エリア | +0 変換結果 0000H 出力なし 0001H 出力あり 処理なし 0002H 出力あり 処理あり 0003H リザーブ 0004H 出力あり undo 0005H 出力あり +4 出力キーコード +6 確定文字列バイト数 +8 確定文字列へのポインタ(farアドレス) |
AX=0150H 変換処理
AX=0100Hと似ていますが、こちらはシフト状態を指定する事ができます。この機能はATOK8専用です。
AX=0100Hと似ていますが、こちらはシフト状態を指定する事ができます。この機能はATOK8専用です。
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 0150H ES:BX 引数エリア |
+0 出力のためにリザーブ(2バイト) +2 入力キーコード(スキャンコード) +4 シフト状態 |
ES:BX 引数エリア | +0 変換結果 0000H 出力なし 0001H 出力あり 処理なし 0002H 出力あり 処理あり 0003H 出力あり undo +2 入力キーコード(スキャンコード) +4 シフト状態 +6 確定文字列バイト数 +8 確定文字列へのポインタ(farアドレス) |
AX=0200H 変換後処理
「AX=0100H 変換処理」の後に未表示部分の表示を行います。AX=0100Hの後に必ず1回呼びます。引数はAX=0100Hと同じです。
「AX=0100H 変換処理」の後に未表示部分の表示を行います。AX=0100Hの後に必ず1回呼びます。引数はAX=0100Hと同じです。
AX=0480H アプリケーション接続モードの設定/読み出し
引数エリア+0のビット0、ビット1に、それぞれ「キー先取りモード」「表示指定」が設定されています。ビットを立てるとアプリケーション側、ビットを0にするとATOK側に制御が移ります。アプリケーション側に制御がある時は、確定/未確定文字は表示されず、AX=0497H表示データー取得で取得します。この機能はATOK8専用です。
引数エリア+0のビット0、ビット1に、それぞれ「キー先取りモード」「表示指定」が設定されています。ビットを立てるとアプリケーション側、ビットを0にするとATOK側に制御が移ります。アプリケーション側に制御がある時は、確定/未確定文字は表示されず、AX=0497H表示データー取得で取得します。この機能はATOK8専用です。
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 0480H ES:BX 引数エリア |
+0 モード(ワード) ビット0 キー先取りモード ビット1 表示指定 FFFFH 現在のモードの取得 |
ES:BX 引数エリア | +0 モード(ワード) 以前のモード(入力と同じ) FFFFHでエラー |
AX=0481H アプリケーション接続サブモードの設定/読み出し
ATOK仮想アトビリュートを使うと、全機種共通で同じソースを使うことができます。実アトビリュートを使うと機種に依存するアトビリュートを設定する事ができますが、機種ごとにアトビリュートの変更が必要です。この機能はATOK8専用です。
ATOK仮想アトビリュートを使うと、全機種共通で同じソースを使うことができます。実アトビリュートを使うと機種に依存するアトビリュートを設定する事ができますが、機種ごとにアトビリュートの変更が必要です。この機能はATOK8専用です。
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 0481H ES:BX 引数エリア |
+0 モード(ワード) 0000H ATOK仮想アトビリュート 0001H 実アトビリュート FFFFH 現在のモードの取得 |
ES:BX 引数エリア | +0 モード(ワード) 以前のモード(入力と同じ) FFFFHでエラー |
AX=0482H アプリケーションとの接続開始
入力 | 出力 | |
---|---|---|
レジスタ | レジスタ | 引数エリア |
AX 0482H ES:BX 引数エリア |
ES:BX 引数エリア | +0 ステータス 0000H 正常終了 |
AX=0483H アプリケーションとの接続終了
入力 | 出力 | |
---|---|---|
レジスタ | レジスタ | 引数エリア |
AX 0483H ES:BX 引数エリア |
ES:BX 引数エリア | +0 ステータス 0000H 正常終了 |
AX=0484H アプリケーションとの接続時の入力文字数の設定
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 0484H ES:BX 引数エリア |
+0 入力文字数 | ES:BX 引数エリア | +0 ステータス 0000H 正常終了 |
AX=0485H ATOKでの表示を禁止する
入力 | 出力 | |
---|---|---|
レジスタ | レジスタ | 引数エリア |
AX 0485H ES:BX 引数エリア |
ES:BX 引数エリア | +0 ステータス 0000H 正常終了 |
AX=0496H 表示エリア格納エリアをATOKに通知する
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 0496H ES:BX 引数エリア |
+0 ステータスのためにリザーブ(2バイト) +2~+15未使用 +16 表示データー内カーソル位置 +18 未確定文字列表示データバイト数 +1A 未確定文字列表示データー格納アドレス(farアドレス) +1E 未確定文字列アトビリュート格納オフセット +20 モード表示データバイト数 +22 モード表示データ(farアドレス) +26 モード表示アトビリュート格納オフセット +28 システムライン表示データバイト数 +2A システムライン表示データ(farアドレス) +2E システムライン表示アトビリュートオフセット ※アトビリュートのセグメントはデーターと同じ |
ES:BX 引数エリア | +0 ステータス 0000H 正常終了 |
AX=0497H ATOKの表示データを得る
入力 | 出力 | |
---|---|---|
レジスタ | レジスタ | 引数エリア |
AX 0497H ES:BX 引数エリア |
ES:BX 引数エリア | +0 ステータス 0000H 正常終了 +2~+15未使用 +16 表示データー内カーソル位置 +18 未確定文字列表示データバイト数 +1A 未確定文字列表示データー格納アドレス(farアドレス) +1E 未確定文字列アトビリュート格納オフセット +20 モード表示データバイト数 +22 モード表示データ(farアドレス) +26 モード表示アトビリュート格納オフセット +28 システムライン表示データバイト数 +2A システムライン表示データ(farアドレス) +2E システムライン表示アトビリュートオフセット ※アトビリュートのセグメントはデーターと同じ |
AX=1001H 外字ファイル有効/無効の切り替え
この機能はATOK8専用です。
この機能はATOK8専用です。
入力 | 出力 | ||
---|---|---|---|
レジスタ | 引数エリア | レジスタ | 引数エリア |
AX 1001H ES:BX 引数エリア |
+0 モード 0000H 外字ファイル有効 0001H 外字ファイル無効 FFFFH 現在のモードの取得 |
ES:BX 引数エリア | +0 モード(ワード) 以前のモード(入力と同じ) FFFFHでエラー |
外字ファイルJFGAIJ.UFO
JFGAIJ.UFOとは
JFGAIJ.UFO(以下UFOファイル)は、ATOK7/8で採用された外字フォントファイルです。ATOK5/6まではGAIJという拡張子のないファイルで外字を管理してましたが、ATOK7/8からJFGAIJ.UFOに変更になりました。
この章ではJFGAIJ.UFOの構造について説明しますが、これに関してはテクニカルマニュアルに記載がなく、全てこちらで独自に解析したものであり、あまり正確ではない部分や解析し切れてない部分もあります。以下の説明について他方(メーカーや他サイト)に問い合わせるのはおやめください。
以下の説明で出てくる用語(ヘッダ領域、データー領域など)は、全てこちらで名づけたものであり、正式名称ではありません。
JFGAIJ.UFO(以下UFOファイル)は、ATOK7/8で採用された外字フォントファイルです。ATOK5/6まではGAIJという拡張子のないファイルで外字を管理してましたが、ATOK7/8からJFGAIJ.UFOに変更になりました。
この章ではJFGAIJ.UFOの構造について説明しますが、これに関してはテクニカルマニュアルに記載がなく、全てこちらで独自に解析したものであり、あまり正確ではない部分や解析し切れてない部分もあります。以下の説明について他方(メーカーや他サイト)に問い合わせるのはおやめください。
以下の説明で出てくる用語(ヘッダ領域、データー領域など)は、全てこちらで名づけたものであり、正式名称ではありません。
UFOファイルの構造
UFOファイルは全体を400Hバイトに分割して管理しています。そして、800Hまでをヘッダー領域、それ以降をデーター領域としています。

UFOファイルは全体を400Hバイトに分割して管理しています。そして、800Hまでをヘッダー領域、それ以降をデーター領域としています。

コントロール領域
E0H~の16バイトはコントロール領域で、どの領域がFAT、どの領域がマッピング領域であるかを示しています。

この00E0Hをベースに、+0がFAT領域の場所(ワード)、+2がFAT長(ワード)、+8がマッピング領域の場所(ワード)をしめしています。また、+C(バイト)に1がある事で、このファイルがUFOファイルである事を示しています。
UFOファイルを読むには、まず+Cを見て、01である事を確認します。続いて、+8をワードで読んで、マッピング領域のアドレスを得ます。
E0H~の16バイトはコントロール領域で、どの領域がFAT、どの領域がマッピング領域であるかを示しています。

この00E0Hをベースに、+0がFAT領域の場所(ワード)、+2がFAT長(ワード)、+8がマッピング領域の場所(ワード)をしめしています。また、+C(バイト)に1がある事で、このファイルがUFOファイルである事を示しています。
UFOファイルを読むには、まず+Cを見て、01である事を確認します。続いて、+8をワードで読んで、マッピング領域のアドレスを得ます。
マッピング領域
マッピング領域は、以下のようになっています。以下は、マッピング領域が0400Hから始まってるものとしますが、実際にはコントロール領域から取得してください。


まずフォントスロット1を見てみます。ここでは、0400Hをベースにします。
+0はワードで、8000H=有効であるを示しています。また、FFFFHなら無効な領域を示してします。
+2はバイトで、何ドットフォントなのかを示しています。この場合は10Hで16ドットフォントを示しています。
+8はワードで、ポインター領域の開始ブロックが記されています。ここでは、1ブロック目を示しています。
+32からこのフォントが作成された日、及び最終更新日が記録されています。
その他は不明です。おそらく、将来的に拡張できるように確保してあるFILLERと思われます。
次のフォントスロットを調べるには、ベースアドレスを64バイトすすめます。プリンタードライバーでは、24ドットフォントを使いますので、+2が18Hになるまで探します。(スロット16まで)
マッピング領域は、以下のようになっています。以下は、マッピング領域が0400Hから始まってるものとしますが、実際にはコントロール領域から取得してください。


まずフォントスロット1を見てみます。ここでは、0400Hをベースにします。
+0はワードで、8000H=有効であるを示しています。また、FFFFHなら無効な領域を示してします。
+2はバイトで、何ドットフォントなのかを示しています。この場合は10Hで16ドットフォントを示しています。
+8はワードで、ポインター領域の開始ブロックが記されています。ここでは、1ブロック目を示しています。
+32からこのフォントが作成された日、及び最終更新日が記録されています。
その他は不明です。おそらく、将来的に拡張できるように確保してあるFILLERと思われます。
次のフォントスロットを調べるには、ベースアドレスを64バイトすすめます。プリンタードライバーでは、24ドットフォントを使いますので、+2が18Hになるまで探します。(スロット16まで)
ポインター領域
ポインター領域は以下のようになっています。ここでは、2000Hから始まっているものとしますが、実際にはコントロール領域から取得してください。
この領域を『ポインター領域』と呼び、ここのフォントアドレスの場所を示す数値を『ポインター』と呼びます。また、そのポインターがどのサイズのものかを示すものが、+58Hの場所に格納されてあり、ここでは 18H=24ドットフォントであることがわかります。
この領域の目的は、主に
ポインター領域は以下のようになっています。ここでは、2000Hから始まっているものとしますが、実際にはコントロール領域から取得してください。

この領域を『ポインター領域』と呼び、ここのフォントアドレスの場所を示す数値を『ポインター』と呼びます。また、そのポインターがどのサイズのものかを示すものが、+58Hの場所に格納されてあり、ここでは 18H=24ドットフォントであることがわかります。
この領域の目的は、主に
- 登録数
- 削除数
- ポインター
この3つを格納することにあります。
1.登録数
+AAHにあります(ワード)。ここでは55H個登録されています。
2.削除数
+ACHにあります(ワード)。ここでは、0個削除されています。
※『削除』は、ATOK8以降でできたルールで、ATOK7までは「削除」という概念はなく、単にそこのフォントが空白になるだけでした。
3.ポインター
フォントは、アドレス順ではなく、登録された順でファイルに記録されます。したがって、読む出す際に、どの順番で記録されているかがわからなくてはなりません。それを解決したのが「ポインター」です。
+B0Hから、(シフトJISコードで)F040Hから始まる外字データーが、何番目に登録されているかを示しています(バイト)。たとえば、+B0Hの値が01なら、F040Hのフォントは1番目に入っているという意味になります。また、ここにFFHが入っている場合、そのフォントは未登録であることを示しています。
2バイト目は、削除されたものかどうかを示します。2バイト目のビット7が1なら、そのフォントは削除されたものであることを示します。(ただし、ATOK8以降)3バイト目は不明です。おそらく、後に拡張するためのFILLERと思われます。
1.登録数
+AAHにあります(ワード)。ここでは55H個登録されています。
2.削除数
+ACHにあります(ワード)。ここでは、0個削除されています。
※『削除』は、ATOK8以降でできたルールで、ATOK7までは「削除」という概念はなく、単にそこのフォントが空白になるだけでした。
3.ポインター
フォントは、アドレス順ではなく、登録された順でファイルに記録されます。したがって、読む出す際に、どの順番で記録されているかがわからなくてはなりません。それを解決したのが「ポインター」です。
+B0Hから、(シフトJISコードで)F040Hから始まる外字データーが、何番目に登録されているかを示しています(バイト)。たとえば、+B0Hの値が01なら、F040Hのフォントは1番目に入っているという意味になります。また、ここにFFHが入っている場合、そのフォントは未登録であることを示しています。
2バイト目は、削除されたものかどうかを示します。2バイト目のビット7が1なら、そのフォントは削除されたものであることを示します。(ただし、ATOK8以降)3バイト目は不明です。おそらく、後に拡張するためのFILLERと思われます。
FAT領域
一番やっかいなのが、フォント領域の発見です。フォント領域がどのブロックにあるかを示したものが「FAT領域」です。FAT領域の場所は、コントロール領域から取得してください。
第1FATの発見
フォント領域の先頭ブロックを探すために、第1FATを取得します。ここでは、『フォント領域の先頭ブロックを示した場所』の事を、『第1FAT』と呼びます。

24ドットフォントが「フォントスロット2」に格納されている場合、第1FATは例1のように、+26H(ワード)にあります。

24ドットフォントが「フォントスロット1」に格納されている場合、第1FATは+1AH(ワード)にあります。
第2FATの発見
よほど登録数が少なくない限り、フォント領域は1ブロックでは収まりません。そこで、2番目のブロックが格納されている場所(第2FAT)を探します。
24ドットフォントが「フォントスロット1」に格納されている場合、
このように、第2FATは+28Hにあります。
24ドットフォントが「フォントスロット2」に格納されている場合、

このように、第2FATは+2AHにあります。
例外1)
「スロット2」に格納されているフォントは、第1FATが+26Hで、第2FATが+2AHなのですが、「スロット1の第2FAT」が作成される前に、「スロット2」のフォントを増やしてしまった場合を考えます。
例えば、先にプリント用フォントをまとめて登録してから、画面用フォントをまとめて登録した場合に起こります。

この場合、「スロット1の第2FATが入るべき場所(+28H)」を「スロット2の第2FAT」として使ってしまいます。
そこで、スロット1の第1FATと第2FATの大きさを比較します。

この場合、第1FAT<第2FATなので「例外ではない」とします。

この場合、第1FAT>第2FATなので「例外」とします。
例外が発生した場合、スロット2の第2FATが+28Hになり、スロット1の第2FATは、+2C以降に格納されます。
第3FAT以降の発見
第3FAT以降(あるいは例外時のスロット1の第2FAT)は、+2C以降にあります。+2C以降はスロットにかかわらず、まず24ドットフォントが格納されています。ただし、途中にFFFFHがあると16ドットフォントのエリアに変わります。

図のように、FFFFHが来るたびに24ドットフォントと16ドットフォントが入れ替わります。そこで、途中FFFFH~FFFFHに囲まれた部分を読み飛ばしたものが、24ドットフォント用のFATだという事になります。
このように、ややこしくなってしまった原因は「登録できる外字の数」が、DOS5.0から拡張されたために、互換性を維持しながらルールを追加したためだと思われます。
一番やっかいなのが、フォント領域の発見です。フォント領域がどのブロックにあるかを示したものが「FAT領域」です。FAT領域の場所は、コントロール領域から取得してください。
第1FATの発見
フォント領域の先頭ブロックを探すために、第1FATを取得します。ここでは、『フォント領域の先頭ブロックを示した場所』の事を、『第1FAT』と呼びます。

24ドットフォントが「フォントスロット2」に格納されている場合、第1FATは例1のように、+26H(ワード)にあります。

24ドットフォントが「フォントスロット1」に格納されている場合、第1FATは+1AH(ワード)にあります。
第2FATの発見
よほど登録数が少なくない限り、フォント領域は1ブロックでは収まりません。そこで、2番目のブロックが格納されている場所(第2FAT)を探します。
24ドットフォントが「フォントスロット1」に格納されている場合、

このように、第2FATは+28Hにあります。
24ドットフォントが「フォントスロット2」に格納されている場合、

このように、第2FATは+2AHにあります。
例外1)
「スロット2」に格納されているフォントは、第1FATが+26Hで、第2FATが+2AHなのですが、「スロット1の第2FAT」が作成される前に、「スロット2」のフォントを増やしてしまった場合を考えます。
例えば、先にプリント用フォントをまとめて登録してから、画面用フォントをまとめて登録した場合に起こります。

この場合、「スロット1の第2FATが入るべき場所(+28H)」を「スロット2の第2FAT」として使ってしまいます。
そこで、スロット1の第1FATと第2FATの大きさを比較します。

この場合、第1FAT<第2FATなので「例外ではない」とします。

この場合、第1FAT>第2FATなので「例外」とします。
例外が発生した場合、スロット2の第2FATが+28Hになり、スロット1の第2FATは、+2C以降に格納されます。
第3FAT以降の発見
第3FAT以降(あるいは例外時のスロット1の第2FAT)は、+2C以降にあります。+2C以降はスロットにかかわらず、まず24ドットフォントが格納されています。ただし、途中にFFFFHがあると16ドットフォントのエリアに変わります。

図のように、FFFFHが来るたびに24ドットフォントと16ドットフォントが入れ替わります。そこで、途中FFFFH~FFFFHに囲まれた部分を読み飛ばしたものが、24ドットフォント用のFATだという事になります。
このように、ややこしくなってしまった原因は「登録できる外字の数」が、DOS5.0から拡張されたために、互換性を維持しながらルールを追加したためだと思われます。
フォント領域
フォント領域は、24ドットフォントの格納されたスロット(スロット1、またはスロット2)の、「第1FAT」「第2FAT」「第3FAT」……が示すブロックにあります。

この場合、フォント領域は、FATの示すように、「0D → 0F」に格納されています。したがって、
第1フォント領域=0800H + (第1FAT - 1) × 400H = 3800H
になります。このようにして、第2FAT、第3FAT……と読み、そこからフォント領域を算出して、それらを連結させたものがフォント領域全体になります。
フォント領域は、24ドットフォントの格納されたスロット(スロット1、またはスロット2)の、「第1FAT」「第2FAT」「第3FAT」……が示すブロックにあります。

この場合、フォント領域は、FATの示すように、「0D → 0F」に格納されています。したがって、
第1フォント領域=0800H + (第1FAT - 1) × 400H = 3800H
になります。このようにして、第2FAT、第3FAT……と読み、そこからフォント領域を算出して、それらを連結させたものがフォント領域全体になります。
フォント領域の連結
プリンタードライバーのような常駐ドライバーでは、フォント領域全体をメモリーに取り込むのは、コンベンショナルメモリーの無駄遣いですので、フォント領域の必要な部分だけを算出して読み込みます。
その場合、ブロックをまたがる、境目の部分には注意が必要です。
1024 - ( (ポインタ - 1) × 72 ÷ 1024 の余り) < 72
の場合、(例えば、ポインターが 0Fhの場合)には、とりあえず、はみ出さない所までを読んで、残りは次のFATの示すフォント領域から、
72 - (1024 - ( (ポインタ - 1) × 72 ÷ 1024 の余り))
の分だけ読み込んで、そこに継ぎ足さなくてはならないわけです。
プリンタードライバーのような常駐ドライバーでは、フォント領域全体をメモリーに取り込むのは、コンベンショナルメモリーの無駄遣いですので、フォント領域の必要な部分だけを算出して読み込みます。
その場合、ブロックをまたがる、境目の部分には注意が必要です。
1024 - ( (ポインタ - 1) × 72 ÷ 1024 の余り) < 72
の場合、(例えば、ポインターが 0Fhの場合)には、とりあえず、はみ出さない所までを読んで、残りは次のFATの示すフォント領域から、
72 - (1024 - ( (ポインタ - 1) × 72 ÷ 1024 の余り))
の分だけ読み込んで、そこに継ぎ足さなくてはならないわけです。
フォントの格納形式の変更
24ドットフォントは、元来プリンター用のフォントなのですが、作成するときは画面で作成する関係上、横8ドットが1バイトになっています。そこで、プリンターに転送するために、縦8ドットを1バイトに変換します。

一番メジャーな方法としては、キャリーフラグを使ったローテート命令を使って変換する方法が良いでしょう。まず、+0バイトを左シフトしておいて、キャリーを含んでプリント用フォントの1バイト目をシフトするのです。この繰り返しで、変換することができます。
NEC系のプリンターでは上が下位ビットであるため、右にシフトする必要がありますが、ESC/P FM TOSHIBA SHARP系では上が上位ビットのため、左にシフトすることに注意してください。
24ドットフォントは、元来プリンター用のフォントなのですが、作成するときは画面で作成する関係上、横8ドットが1バイトになっています。そこで、プリンターに転送するために、縦8ドットを1バイトに変換します。

一番メジャーな方法としては、キャリーフラグを使ったローテート命令を使って変換する方法が良いでしょう。まず、+0バイトを左シフトしておいて、キャリーを含んでプリント用フォントの1バイト目をシフトするのです。この繰り返しで、変換することができます。
NEC系のプリンターでは上が下位ビットであるため、右にシフトする必要がありますが、ESC/P FM TOSHIBA SHARP系では上が上位ビットのため、左にシフトすることに注意してください。
参考文献
『J-3100解析ハンドブック』 1989年 土屋勝著 ナツメ社
『DOS/Vテクニカル・リファレンス・マニュアル』 1993年 芦達剛著 ソフトバンク
『J-3100シリーズ・テクニカルマニュアル』 1994年 南部武彦著 ソフトバンク
『ATOK読本』 1994年 山田祥平 ジャストシステム
『東芝パソコンハンドブック94年版』 平成6年3月1日
『J-3100解析ハンドブック』 1989年 土屋勝著 ナツメ社
『DOS/Vテクニカル・リファレンス・マニュアル』 1993年 芦達剛著 ソフトバンク
『J-3100シリーズ・テクニカルマニュアル』 1994年 南部武彦著 ソフトバンク
『ATOK読本』 1994年 山田祥平 ジャストシステム
『東芝パソコンハンドブック94年版』 平成6年3月1日

広告