Linux のフレームバッファに感動したのがきっかけで、テキスト画面の高解像度
化に凝っています。それで、今でも時々古いゲームなどをするために MS-DOS を
使う機会があるので、MS-DOS でもできるんじゃないかと思い、色々と情報収集
したりして試してみました。
# 特に、液晶モニタ(それも DVI 接続)を使っているため、解像度がピッタリ
# 合わないと見苦しくて仕方がないのが理由です。このモニタは低解像度の場合
# 拡大表示し、小さいまま中央に表示するような機能がありません。
問題点:
一応、解像度は変更することが出来たのですが、カーソル(キャレット)が表示
されなくなってしまいます。今日一日ハマッてしまいましたが、どうにもなりま
せん。どなたかお知恵を拝借願えませんでしょうか?
以下、状況説明:
環境は、
・PC/AT 互換機(PIII)
・nVidia GeForceFX 5700
・Eizo L567(DVI 接続)最適な解像度は 1280x1024
・MS-DOS 7.1(Win98 の DOS)
BIOS コール(INT 10h)を使ってモードを設定できることがわかりました。AX
レジスタに 4F02h をセットし、BX レジスタにモード番号をセットして、INT 10h。
モード番号は Linux のフレームバッファを使った経験から既にわかっていたの
でそれを使いました。106h/107h/11Bh でそれぞれ 1280x1024 の色深度 8/16/32
bit のモードです。
MS-DOS の debug コマンドで
mov ax,4F02
mov bx,106
int 10
てな具合です。
また、実際にモードをセットしてから、逆にモード情報を(ah=fh を使って)取
得すると、106h/107h/11Bh の代わりに 5Ah/6Bh/79h が実際には使われているこ
とがわかりました(Linux のフレームバッファをいじった時点ではこれらのモー
ドは知らなかったのですが 5Ah/6Bh/79h でモードセットしても同じ効果のよう
です)。
# 当然、このモード番号の割当ては nVidia 特有のものだと思います。
ah=1h を使って ch と cl にカーソルの上端・下端の Y 座標を指定することが
できるのもわかりました。デフォルトの画像モードではこの数値を変更すると
ちゃんとカーソルが太くなったりします。
ところが、画像モードを変更した状態では、カーソルは消えたままであり、また
カーソルの上下端の値をセットしても、何の変化もありません。さらに、ah=3h
を使うと、マウスカーソルの上下端の設定値を cx レジスタで見ることができる
のですが、ah=1h でセットしたにもかかわらず、cx レジスタは 0000h のまま
(デフォルトの画像モードではちゃんと ah=1h の結果が反映されています)。
Linux のフレームバッファではちゃんとカーソルが表示されているので、できな
いはずはないと思って、さらにムキになって情報を探しました。
# Linux フレームバッファ(vesafb.c 等)のソースはちょっと見ましたが、
# C プログラムはイマイチよくわかりません。
それで I/O ポート 3D4h/3D5h 経由で VGA のレジスタにアクセスできることが
わかりました。それでカーソルの上下端の値を書き換えました。──やはり、デ
フォルトの画像モードでは上手く行くのに、画像モードを変更すると上手く行き
ません。ah=3h の結果はやはり cx=0000h のまんま。
# と、このあたりで力尽きたという次第です。
参照にしたサイトの一部:
<http://www.ctyme.com/intr/int-10.htm>
<http://www.osdever.net/FreeVGA/vga/crtcreg.htm>
--
Masanori HATA