半角(1バイト文字)のフォントをディスプレイドライバ(英語モード時はビデオカードのキャラクタジェネレータ RAM)に読み込ませます。
設定戻り値
- BL
- フォントを読み込ませるキャラクタジェネレータ RAM のテーブル番号 (日本語モードでは 0 のみ)
- BH
- フォントデータの1文字あたりのバイト数
- CX
- 設定する文字数
- DX
- 設定する最初の文字コード
- ES:BP
- 設定するフォントデータ(CX*BH バイト)へのポインタ
なし
$DISP.SYS (JDISP.SYS) のもっとも標準的なビデオモード(モード 03h, 80x25)では、フォントサイズは 8x19 ドットですので BH には 19 (13h) を設定することになります。
EGA 以上の英語テキストモードではビデオ RAM の特定領域にキャラクタジェネレータ RAM を設定し、ユーザがフォントを書き換えることが可能になっています。 $DISP.SYS (JDISP.SYS) では画面上の文字はすべてグラフィック RAM 上にソフトウェアで描画しており、ハードウェア的なフォント書き換えはできないのでこれを擬似的に再現しています。
$DISP.SYS に限らずほとんどの DOS/V ディスプレイドライバでは、表示の高速化のため(と思うのですが)ビデオモード切り換え直後に半角フォントデータをドライバ内部のバッファにあらかじめ読み込み、文字表示の際はこの中のデータを使って表示します。 日本語モードでの Int 10h, ax=1100h は、この内部バッファを書き換えるファンクションです。このファンクションを使用して内部フォントを書き換えた場合、どうやら画面全体を再描画しているらしく、その結果は画面上にただちに反映されますが、時間がかかります。 複数のフォントを書き換える時にはなるべくいちどに行うべきでしょう。
ディスプレイドライバの内部バッファから半角データを読み出す機能は(すくなくとも公式には)BIOS にはありません。 $DISP.SYS (JDISP.SYS) では、割り込みベクタ 43h で示されるアドレスから格納されているようです。 しかもこのアドレスも $DISP.SYS (JDISP.SYS) 以外のドライバや、IBM DOS/V Extension のビデオ拡張ドライバを使用している場合には無効です。
個人的な意見を言えば、このファンクションを使ってフォントの見た目を設定することは、あまりおすすめできません。 画面のフォントサイズが標準の 8x19 でない場合にどうするか、という問題があるためです。 V-TEXT、あるいは CGA や DCGA などでの DOS/V 環境を考慮した場合は特にそうです。 また、Windows や OS/2 の DOS プロンプト(ウィンドウ表示モード)でも同様の問題が起きるでしょう。 この場合のディスプレイドライバの処理は、ドライバによってまちまちです。 実際のフォントサイズとまったく同じサイズ指定がされている時だけ受け入れるもの、8x19 ドットのフォントが指定されている場合でも(拡大、縮小して)受け入れるもの、あるいはどのサイズでも受け入れない(っていうかまったくサポートしてない)、という形態があります。
このファンクションで設定したフォントデータは、ビデオモード(あるいは画面のテキスト解像度)が変更された時点で失われます。
Int 10h,ax=1801h
Int 15h,ax=5001h