DOSVAXからMS-DOS 3.21をディスク起動せずに直接Windows 2.1を起動させると暴走するので、どうにかならんかと色々探ってみたがどうにもならなかった。暴走したポイントの前後では割り込みやI/Oポートへのアクセスはなく、MS-DOSから起動すると正常に動作するということは、ハードウェア的にはエミュレーションに問題ないだろう。内蔵DOSシェルの問題なのだろうが、あくまでゲームの動作が目的のDOSBoxではI/O周りで表面上動作していればあまり問題なく、DOS自体のエミュレーション精度は低いんだろう。

もう一つ、WINコマンドを実行するとWindowsの起動画面が表示される一瞬だけウィンドウが縦に長くなる問題があった。これは画面モード06h (CGA互換640x200)を使っているようなので、そのタイミングテーブルが間違っているかもしれない。この問題はDOSBoxの最新のソースコードにあるテーブルで書き換えたら直った。

ただ、別の問題が発生した。JEGAの日本語テキストモードである画面モード03hでカーソルの点滅速度が異常に速い。デバッグコンソールを見てみると、画面モードが変わったときに表示されるvtotalの値が異常に低く、逆にリフレッシュレート (FPS) が異常に高く計算されている。

どうも、タイミングテーブルでvtotal=525としたことが原因のようだ。タイミングはCRTコントローラー内の2つのレジスタにセットされる。Vertical Total Registerには下8ビット分がセットされ、それより上位ビットはCRT Controller Overflow Registerに入るのだが、VGAは2ビットあるのに対し、EGAは1ビットとなっている(もう1ビットの部分は未使用)。このため、vtotalに10ビット、すなわち512以上の値を指定するとオーバーフローする。

実際のJEGAボードもChips and Technologiesの82C435というEGA上位互換のチップを使用しているが、このデータシートを見てもvtotalは9ビット分しか入らない。となると、640x480の業界標準であるvtotal=525は指定できないわけだが、じゃあそれに代わるタイミングは何だったのか。これも、実機を調べないと解明できそうにない。Webで調べた限りでは、タイミングテーブルの一覧を載せたサイトに640x480でvtotal=509の画面モードがあった。信憑性は怪訝だが、動作すれば良いので取り敢えずこれを使わせてもらう。

今は他に優先することがあってデバッグや整理の時間を取れないので、落ち着いたらDOSVAXの更新版をアップする予定。

参考サイト


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