BitBltの開発を始めて11日目。JDOSの$BITBLT.SYSには矩形範囲をブロック転送するファンクションがある事が分かり、その処理を解析してビットシフトやアドレスの計算方法をどうにか見いだすことができた。

それをまたエミュレーターに実装して上手く動かすには時間が掛かったが、ついにWindows 3.0は高解像度ドライバーで表示できるようになった。下のスクリーンショットは意図的に画面外のビデオメモリーのデータも表示させている。

Image: Windows 3.02 on DOSVAX

これで安堵するも束の間、Windows 3.1では同等仕様の高解像度ドライバーを使用しているにもかかわらず、表示がぶっ壊れる。

Image: Windows 3.1 on DOSVAX

これはI/Oポートに特定のレジスターへ値を代入する処理をセットアップしたら、8割方正常に動くようになった。テキスト表示がなんか変。

Image: Windows 3.1 on DOSVAX

これも「ワケ分からん!」と言いたくなる話だが、VGAもディスプレイ・アダプターも内部レジスターへのアクセス方法が色々あって面倒くさい。

例えば、ある内部レジスターのインデックス番号01にデータFFh(16進数)を書き込む方法は、

  1. I/OポートAに01を出力し、I/OポートBにFFを出力。
  2. I/OポートAにワード単位でFF01を出力。
  3. I/OポートAに01を出力し、同じくI/OポートAにFFを出力。(ラッチ切り替え処理)
  4. I/OポートCにFFを出力。(このポート自体がインデックス01のデータポート?)

この4通りがあることが分かっている。JDOSやWindowsのバージョンが変わると、知らないI/Oポートやレジスターへのアクセスが出てきて、コード実装も私の頭の中もスパゲッティ化していく。

今回問題のテキスト表示にはBitBltは使われていない。従来のJDOS上でのグラフィックの書き込み方法と同じで、EGAのプレーン同時書き込みと同じような方法が使われている。ディスプレイ・アダプターにはEGAのGraphics Controller Registerと同等の機能があるが、今回はそれにはない追加のインデックスのレジスターへの書き込みが影響していると疑っている。ROPがAND演算の時だけ何かのビットフラグが設定されているが、その意味を解かないと解決できないだろう。


※コメント欄が表示されない場合はdisqusについてJavascriptが有効であることを確認して下さい。コメントはスパム防止フィルターによる承認制のため、投稿してもすぐに反映されない場合があります。

管理人 : Akamaki (akm)

は、PCとVTuberに夢中になっている電気技術者です。

私はレトロコンピューティングの愛好家ですが、そのようなリグはもう収集していません。

私の活動はトップページで見ることができます。読んでくれてありがとう!