Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

The cursor (caret) disappears in some text-modes

8 views
Skip to first unread message

Masanori HATA

unread,
Mar 27, 2006, 7:27:49 AM3/27/06
to
畑です。

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

0 new messages