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

漢字ROM

漢字ROMとは

DOS/Vは、もともと日本語機能のないIBM PC/AT機にキーボード以外の追加ハードなしに日本語機能を追加するものです。なので、日本語フォントはフォントファイルというもので提供しています。

しかし、J-3100が登場した頃といえば、全ての漢字フォントをファイルとして提供できるほどハードディスクの容量は豊富ではなかったし、フォントを 全てメモリーに常駐させておけるほどメモリーも多くありませんでした。

そのため、J-3100発売当時に日本で発売されていたパソコンには、漢字ROMというものが搭載され日本語のフォントパターンはこの漢字ROMから読み出すのが一般的でした。

システム割り込みINT 60H

INT 60HはJ-3100独自のサブルーチンを使うための割り込みです。 したがって、この機能は東芝日本語DOS3.0および日英DOS5.0の日本語モードで、DCGAの時のみ使う事ができます。

英語モードの時やVGAモードの時には使ったことはありませんが、使えたとしてあまり意味はないでしょう。また、J-3100PV2以降のようなDCGAが削除された機種では使う事はできません。DOS/V環境では別途ディスプレイドライバ(INT 10H)から取得します。
漢字ROMメモリーアドレス

漢字ROMはメモリーアドレスE000:0000〜E000:FFFFの間にマッピングされます。

しかし、この64KBだけでは全てのフォントを格納できないため、実際には バンク0〜バンク15までの16バンクが同じアドレスにマッピングされ、バンクを切り替えて読み出す事になっています。 このエリアのメモリーは、読み込むとフォントパターンの読み出し、書き込むとバンクの切り替え、といった6809CPUのI/Oポートのような 機能が備わってします。


AH=03H 全角フォント格納アドレスの取得
入力 出力
AH 03H
AL 読み出すフォントと文字コード
 0 16ドットフォント シフトJISコードで指定
 1 16ドットフォント JISコードで指定
 2 24ドットフォント シフトJISコードで指定
 3 24ドットフォント JISコードで指定
DX 漢字コード
AL バンク
ES:SI 開始アドレス
読み出す時は、 E000:XXXX(XXXXは任に)の、 0〜4ビット目にバンク番号、7ビット目に1をセットします。つまり、
OR AL,80H MOV ES:[SI],AL
として、返ってきたバンク番号のビット7を立てて、ES:[SI]に書き込みます。 すると目的の漢字の入ったフォントがマッピングされますので、
MOV AH,ES:[SI]
MOV [DI],AH
をフォントのバイト分繰り返します。

じゃあ、rep movwを使えば高速じゃないのか?と思うかもしれませんが、 フォントがちょうどバンクの境目にさしかかった時、つまり、SIが FFFFHになった時は、バンクを1つ進めないといけないので、都度、 SIレジスタを繰り上げた時にキャリーフラグが立ったかをチェックする必要があります。

SIレジスターがFFFFHまでいって、0000Hに繰り上がった時は、ALレジスターに 入っているバンク番号を1つ進めた後、
MOV ES:[SI],AL
としてバンクを切り替えてください。

例)MOJIには目的の漢字コードの入ったアドレス、KANPATにはフォント格納バッファがセットされているものとします。
PUTK1	=	$
	MOV	SI,OFFSET MOJI
	MOV	DI,OFFSET KANPAT
	MOV	AH,03H
	MOV	AL,00H
	MOV	DX,[SI]
	XCHG	DH,DL
	INT	60H
	OR	AL,80H
	MOV	ES:[SI],AL

	MOV	CX,32
TENL	=	$
	MOV     AH,ES:[SI]
	MOV	[DI],AH
	ADD     DI,1
	ADD	SI,1
	JC	BAN
	LOOP	TENL
	JMP	PCLR
BAN	=	$
	ADD	AL,1
	MOV	ES:[SI],AL
	LOOP	TENL
AX=1000H 半角フォントの読み出し
入力 出力
AX 1000H ES:BX 8×16半角文字セットの先頭アドレス
半角英数字のフォントは、AXレジスタに1000HをセットしてINT 60H割り込みをかけると ES:BXレジスタに半角フォントセットの先頭アドレスが返るので、 目的のフォントは (文字コード)*(1文字あたりのバイト数)+BXで求めます。

例)[INJI1]には読み出す文字コードが入ってるものとします。
PUTK3		=  	$
		MOV	AH,10H
		MOV	AL,00H
		INT	60H
		MOV	AL,[INJI1]
		MOV	AH,0

		SHL	AX,1
		SHL	AX,1
		SHL	AX,1
		SHL	AX,1

		ADD	BX,AX
		MOV	SI,BX

		MOV	DI,OFFSET KANPAT
		MOV	CX,16
TENL2		=  	$
		MOV	AL,ES:[SI]
		MOV	[DI],AL
		MOV	[DI+1],BYTE PTR 0
		ADD	SI,1
		ADD	DI,2
		LOOP	TENL2

半角カナの読み出し

半角英数フォントを取得する方法では、半角のカナと¥マークを取得できません。 半角カナや半角¥マークは漢字ROM格納されているためです。つまり、ベースとなったIBM-PCには半角カナや半角の¥マークは用意されていないので、別途漢字ROMにて提供されているわけです。

半角カナは、JISコード2920H+(文字コード-0A0H)を取得して、 漢字フォントと同様に取得します。 ただし、半角フォントは、 アア イイ ウウ エエ という風に同じパターン2つずつ続いて入っているので、 半分(16ドットフォントなら8ビット)に切って使います。

例) [INJI1]には目的のキャラクターコード KANPTにはバッファアドレスが 入っているものとします。
PUTK4		=  	$
		MOV	DH,0
		MOV	DL,[INJI1]
		SUB	DL,0A0H
		ADD	DX,2920H
		MOV	DI,OFFSET KANPAT
		MOV	AH,03H
		MOV	AL,01H
		INT	60H

		MOV	CX,16
TENL3		=  	$
		MOV	AL,ES:[SI]
		MOV	[DI],AL
		MOV	[DI+1],BYTE PTR 0
		ADD	SI,2
		ADD	DI,2
		LOOP	TENL3

半角¥マークの読み出し

半角の¥マークは他の半角フォントと同じ計算方式で取得すると、バックスラッシュになってしまいます。そのため、半角の¥マークだけは特別な方式で取得しなければなりません。

半角の¥マークは、漢字ROMのバンク0、 アドレスE000:0780Hから取得します。 この0780Hというのはテクニカルマニュアルには見当たらなかったので ・・・というか、どこかには書いてあるとは思うんですけど見つかりませんでしたので、 自分で漢字ROMの中を総当りで調べて見つけました。 半角の¥マークも半角カナと同じく、\\と同じものが2つ続いて入っているので、 半分に切って使います。

例)KANPTにはバッファアドレスが入っているものとします。
PUTK5		=  	$
		MOV	AX,0E000H
		MOV	ES,AX
		MOV	SI,780H
		MOV	AL,80H
		MOV	ES:[SI],AL
		MOV	DI,OFFSET KANPAT

		MOV	CX,16
TENL4		=  	$
		MOV	AL,ES:[SI]
		MOV	[DI],AL
		MOV	[DI+1],BYTE PTR 0
		ADD	SI,2
		ADD	DI,2
		LOOP	TENL4

参考文献
『J-3100解析ハンドブック』 1989年 土屋勝著 ナツメ社
『DOS/Vテクニカル・リファレンス・マニュアル』 1993年 芦達剛著 ソフトバンク
『J-3100シリーズ・テクニカルマニュアル』 1994年 南部武彦著 ソフトバンク
『ATOK読本』 1994年 山田祥平 ジャストシステム
『東芝パソコンハンドブック94年版』 平成6年3月1日
スポンサーリンク