DOS/V用アプリケーションの開発で英語・日本語モードを判別するルーチンを作るために調べたことをまとめておきます。

英語・日本語モードの判別に利用できるファンクションコール

英語・日本語モードの判別に利用できるファンクションコールは複数あります。

  1. DBCSベクターの取得(Int21h,AX=6300h) - 一般的な方法
  2. DBCSベクターの取得(Int21h,AX=6507h) - 1の代替方法、若干コードが増える
  3. ビデオ・バッファー・アドレスの読み取り(Int10h,AH=FEh) - 詳細は後述
  4. コードページ取得(Int21h,AX=6601h) - MS-DOS的には本来こちらを使うべきなのだと思う
  5. 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では次の手順で機種を判別していました。

  1. BIOS割り込み 現在のディスプレイ状況(Int10h,AH=0Fh) を実行してビデオモードを取得
  2. AL=-1(無効な関数呼び出し)ならPC-98
  3. AL=74h,64hならJ-3100
  4. AL=08hならPS/55モノクロディスプレイ
  5. AL=0EhならPS/55カラーディスプレイ
  6. AL=07hならIBM PCモノクロディスプレイ
  7. BIOS割り込み DBCSベクターの取得(Int21h,AX=6300h) を実行
  8. DBCSベクターを取得できなければIBM PC 英語モード
  9. BIOS割り込み ビデオ・バッファー・アドレスの読み取り(Int10h,AH=FEh) を実行
  10. 擬似ビデオバッファーのアドレスが返ってきた場合はDOS/V日本語モード
  11. BIOS割り込み Int10h,AH=50h を実行して、BX=0051hならAX日本語モード
  12. いずれの判定にも該当しなければ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年

comments powered by Disqus

※コメント欄が表示されない場合はdisqusについてJavascriptが有効であることを確認して下さい.

(C) 2008-2017 akm. This blog theme is based on sakmug. Hosted by Xdomain