DOS/Vファンクションコールによる英語・日本語モードと機種の判別
DOS/V用アプリケーションの開発で英語・日本語モードを判別するルーチンを作るために調べたことをまとめておきます。
英語・日本語モードの判別に利用できるファンクションコール
英語・日本語モードの判別に利用できるファンクションコールは複数あります。
- DBCSベクターの取得(Int21h,AX=6300h) - 一般的な方法
- DBCSベクターの取得(Int21h,AX=6507h) - 1の代替方法、若干コードが増える
- ビデオ・バッファー・アドレスの読み取り(Int10h,AH=FEh) - 詳細は後述
- コードページ取得(Int21h,AX=6601h) - MS-DOS的には本来こちらを使うべきなのだと思う
- BILING.SYS動作モード取得(Int2Fh,AX=4F01h) - MS-DOS/Vのみ使用可
MS-DOS的にはコードページ(4)を使うべきなのでしょうが、これはCOUNTRY.SYSを組み込んでいないと正しく動作しません。COUNTRY.SYSはPC DOSやMS-DOS/Vの標準構成では組み込まれていますが、カスタマイズして組んだDOS環境では入れていない場合がよくあります。
日本IBMの解説書では1、4、5の3つの方法が紹介されています。一般には1の方法が使われているようですが、MS-DOS、PC DOS、DR-DOS以外の互換DOSではDBCSベクターを正常に取得できない場合があるようです。
英語・日本語モードの判別方法
VZ Editor DOS/V版のソースコード(VZSEL.ASM)を覗いてみると、DOS/V日本語モードの判定には1と3の方法が使われていました。次はそれを参考にJWasm用に書き直したアセンブリコードです。
; ---DOS/V英語・日本語モード判定(1) PC DOS
mov si,0
mov ah,063h
int 21h
test si,0ffffh
jz US_ENV
test @word[si],0ffffh
jz US_ENV
; ---DOS/V英語・日本語モード判定(3)PC DOS and MS-DOS
mov bx,0b800h
mov es,bx
mov di,0
mov ah, 0feh
int 10h
mov ax,es
cmp ax,bx
jne JP_ENV
; ---VZ EditorではここにAX互換機の判定が入ります
jmp US_ENV
PC DOSでは(1)の判定で英語モード、日本語モード英語環境、日本語モード日本語環境をきっちり判別できました。しかし、Windows 98日本語版MS-DOS環境の英語モードでは(1)は日本語モードとして判定されてしまいました。(3)の方法ではいずれもただしく判別できました。
デバイスドライバ以外の一般的なアプリケーションは4の方法を使うのが安全だと思うのですが、どうなんでしょうね。結局、用途次第といったところでしょうか。
機種の判別方法
機種判別については興味なかったのですが、先の件でソースコードを見ていて興味を持ったので、少し調べてみました。
VZ Editorでは次の手順で機種を判別していました。
- BIOS割り込み 現在のディスプレイ状況(Int10h,AH=0Fh) を実行してビデオモードを取得
- AL=-1(無効な関数呼び出し)ならPC-98
- AL=74h,64hならJ-3100
- AL=08hならPS/55モノクロディスプレイ
- AL=0EhならPS/55カラーディスプレイ
- AL=07hならIBM PCモノクロディスプレイ
- BIOS割り込み DBCSベクターの取得(Int21h,AX=6300h) を実行
- DBCSベクターを取得できなければIBM PC 英語モード
- BIOS割り込み ビデオ・バッファー・アドレスの読み取り(Int10h,AH=FEh) を実行
- 擬似ビデオバッファーのアドレスが返ってきた場合はDOS/V日本語モード
- BIOS割り込み Int10h,AH=50h を実行して、BX=0051hならAX日本語モード
- いずれの判定にも該当しなければIBM PC 英語モード
日本語モードにおけるディスプレイモード一覧
これらの他に英語モード(CGA,EGA,VGA)やV-Textなどを含めるとたくさんあります。
AL | モード | 表示文字 | 画面サイズ |
---|---|---|---|
02 | AX 日本語テキスト(グラフィック重ね) | 80x25 | 640x480 |
03 | AX 日本語テキスト | 80x25 | 640x480 |
03 | DOS/V 16色文字モード (エミュレートCGAテキスト・モード) |
80x25 | 640x480 |
07 | IBM PC モノクロ | 80x25 | 720x350 |
08 | PS/55 モノクロ | 80x25 | 1040x725 |
0E | PS/55 カラー | 80x25 | 1024x768 |
11 | DOS/V 2色カラー・グラフィック | 80x30 | 640x480 |
12 | DOS/V 16色カラー・グラフィック | 80x30 | 640x480 |
52 | AX 日本語グラフィック(テキスト重ね) | 80x25 | 640x480 |
53 | AX 日本語グラフィック | 80x25 | 640x480 |
64 | J-3100 DCGA モノクロ | 80x25 | 640x400 |
72 | DOS/V 16色カラー・グラフィック | 80x25 | 640x480 |
73 | DOS/V 16色文字モード (エミュレートCGA拡張テキスト・モード) |
80x25 | 640x475 |
74 | J-3100 DCGA モノクロ | 80x25 | 640x400 |
ところでディスプレイモード03hと73hはどう違うのかとずっと疑問に思っていたのですが、日本IBMの解説書によると文字単位でアトリビュートを指定できるか否かの違いのようです。
参考サイト
- DOS系私的リファレンスみたいな何か - int10h,AH=FEh
- http://wiki.fdiary.net/dos/?i10fe.htm
- DOS系私的リファレンスみたいな何か - int21h,AH=6507h
- http://wiki.fdiary.net/dos/?i216507.htm
- ウー!オールドPC:ウー!ダイナ:ビデオBIOS (東芝J-3100シリーズ資料)
- http://software.aufheben.info/ooholdpc/video2.html
参考文献
- VZ Editor DOS/V Version 1.57a ソースコード VZSEL.ASM、兵藤嘉彦/ビレッジセンター、1992年
- IBM DOSバージョンJ5.0/V BIOSインターフェース技術解説書、日本アイ・ビー・エム、1991年