このエントリーをはてなブックマークに追加
スポンサーリンク

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を標準搭載させた東芝の判断は正しかったようにも思えます。

ATOK5/6用API

ATOK5/6用のAPIはJ-3100テクニカルマニュアルにも掲載されています。 呼び出し方も比較的簡単です。AHレジスタに機能番号をセットして、 INT 6FHを呼ぶだけです。

この機能が使えるのは、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が常駐しています。
AH=01H ローマ字漢字モードに入る
ATOKをオンにして、ローマ字漢字変換モードに入ります。既にATOKがオンならモードを変更します。 
入力 出力
AH 01H なし
AH=02H かな漢字モードに入る
ATOKをオンにして、かな漢字入力モードに入ります。既にATOKがオンならモードを変更します。 
入力 出力
AH 02H なし
AH=03H 半角英数モードに入る
ATOKをオンにして、半角英数モードに入ります。既にATOKがオンならモードを変更します。
入力 出力
AH 03H なし
AH=04H 記号モードに入る
ATOKをオンにして、記号モードに入ります。既にATOKがオンならモードを変更します。
入力 出力
AH 04H なし
AH=05H コード入力モードに入る
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)を使います。
;------------------------------------------------------------------------------
;	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が入っているものとします。
;---------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バイトのエリアを確保しておきます。機能によっては入力する値がないものもありますが、入力がなくてもエラー情報や以前のモードの情報が帰ってきますので、メモリーは必ず確保しておきます。
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)で呼びます。
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漢にする命令を、それぞれ別々に発行します。
入力 出力
レジスタ レジスタ 引数エリア
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漢」みたいな表示を消します。
入力 出力
レジスタ レジスタ 引数エリア
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で行います。
入力 出力
レジスタ 引数エリア レジスタ 引数エリア
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で行います。
入力 出力
レジスタ 引数エリア レジスタ 引数エリア
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で設定したビットを操作した後再度この機能を呼びます。
入力 出力
レジスタ 引数エリア レジスタ 引数エリア
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 固カナ 固カナといった固定モードに入ります。
入力 出力
レジスタ 引数エリア レジスタ 引数エリア
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バイトです。それより長いパスにあると指定できません。

ここで指定した場所にファイルが存在するかどうかの判断は行っていません。辞書ファイルとして存在しないファイルが指定されると、変換時に「辞書ファイルが存在しません」とのメッセージが出ます。外字ファイルが存在しないと外字は以前の状態(初期状態なら空白)のままです。
入力 出力
レジスタ 引数エリア レジスタ 引数エリア
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専用です。
入力 出力
レジスタ 引数エリア レジスタ 引数エリア
AX 001CH
ES:BX 引数エリア
+0 モード(ワード)
 0000H R漢
 0001H かな漢
 FFFFH 現在のモードの取得 
ES:BX 引数エリア
+0 モード(ワード)
 以前のモード(入力と同じ)
 FFFFHでエラー
AX=001DH 入力文字種の設定/読み出し
この機能は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専用です。
入力 出力
レジスタ 引数エリア レジスタ 引数エリア
AX 0024H
ES:BX 引数エリア
+0 モード(ワード)
 0001H 漢字
 0002H 半角
 0003H コード
 0004H 記号
 FFFFH 現在のモードの取得 
ES:BX 引数エリア
+0 モード(ワード)
 以前のモード(入力と同じ)
 FFFFHでエラー
AX=002AH 辞書、外字ファイル名設定/読み出し
詳細の仕様は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専用です。
入力 出力
レジスタ 引数エリア レジスタ 引数エリア
AX 002BH
ES:BX 引数エリア
+0 モード(ワード)
 0000H〜0009H システム辞書No.
 FFFFH 現在の辞書No.の取得 
ES:BX 引数エリア
+0 モード(ワード)
 以前の辞書No.
 FFFFHでエラー
AX=002CH 自動学習種別の設定/読み出し
引数エリア+0にある各ビットで学習機能のオン/オフを切り替えます。この機能はATOK8専用です。
入力 出力
レジスタ 引数エリア レジスタ 引数エリア
AX 002CH
ES:BX 引数エリア
+0 モード(ワード)
 ビット0 文節区切りの学習
 ビット1 複合語の学習
 ビット2 後変換の学習
 ビット3 未登録語の学習
 FFFFH 現在のモードの取得 
ES:BX 引数エリア
+0 モード(ワード)
 以前のモード(入力と同じ)
 FFFFHでエラー
AX=002DH スペースキー機能の設定/読み出し
引数エリア+0のビット0〜4が、各モードに設定されています。それぞれビットを立てるとスペースキーが「スペース入力」となり、ビットを0にするとスペースキーが「機能キー」として働きます。この機能はATOK8専用です。
入力 出力
レジスタ 引数エリア レジスタ 引数エリア
AX 002DH
ES:BX 引数エリア
+0 モード(ワード)
 ビット0 全角ひらがな
 ビット1 全角カタカナ
 ビット2 全角無変換
 ビット3 半角カタカナ
 ビット4 半角無変換
 FFFFH 現在のモードの取得 
ES:BX 引数エリア
+0 モード(ワード)
 以前のモード(入力と同じ)
 FFFFHでエラー
AX=002EH 英字入力モードの設定/読み出し
この機能はATOK8専用です。
入力 出力
レジスタ 引数エリア レジスタ 引数エリア
AX 002EH
ES:BX 引数エリア
+0 モード(ワード)
 0000H 英字入力オフ
 0001H 英字入力オン
 FFFFH 現在のモードの取得 
ES:BX 引数エリア
+0 モード(ワード)
 以前のモード(入力と同じ)
 FFFFHでエラー
AX=0050H 外字のロード
外字をメモリーにロードします。プリンターにはロードしません。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 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=0480H アプリケーション接続モードの設定/読み出し
引数エリア+0のビット0、ビット1に、それぞれ「キー先取りモード」「表示指定」が設定されています。ビットを立てるとアプリケーション側、ビットを0にするとATOK側に制御が移ります。アプリケーション側に制御がある時は、確定/未確定文字は表示されず、AX=0497H表示データー取得で取得します。この機能はATOK8専用です。
入力 出力
レジスタ 引数エリア レジスタ 引数エリア
AX 0480H
ES:BX 引数エリア
+0 モード(ワード)
 ビット0 キー先取りモード
 ビット1 表示指定
 FFFFH 現在のモードの取得
ES:BX 引数エリア +0 モード(ワード)
 以前のモード(入力と同じ)
 FFFFHでエラー
AX=0481H アプリケーション接続サブモードの設定/読み出し
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専用です。
入力 出力
レジスタ 引数エリア レジスタ 引数エリア
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の構造について説明しますが、これに関してはテクニカルマニュアルに記載がなく、全てこちらで独自に解析したものであり、あまり正確ではない部分や解析し切れてない部分もあります。以下の説明について他方(メーカーや他サイト)に問い合わせるのはおやめください。

以下の説明で出てくる用語(ヘッダ領域、データー領域など)は、全てこちらで名づけたものであり、正式名称ではありません。
UFOファイルの構造

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

コントロール領域

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まで)
ポインター領域

ポインター領域は以下のようになっています。ここでは、2000Hから始まっているものとしますが、実際にはコントロール領域から取得してください。


この領域を『ポインター領域』と呼び、ここのフォントアドレスの場所を示す数値を『ポインター』と呼びます。また、そのポインターがどのサイズのものかを示すものが、+58Hの場所に格納されてあり、ここでは 18H=24ドットフォントであることがわかります。

この領域の目的は、主に
  1. 登録数
  2. 削除数
  3. ポインター
この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と思われます。
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から拡張されたために、互換性を維持しながらルールを追加したためだと思われます。
フォント領域

フォント領域は、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 の余り))

の分だけ読み込んで、そこに継ぎ足さなくてはならないわけです。
フォントの格納形式の変更

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日
スポンサーリンク