240113 PS/55エミュ製作 [27]1040×725グラフィックモード
ここ1週間、寝ても起きても、仕事の時以外ずっとこのことを考えていた。WindowsのディスプレイドライバーがBitBLTのレジスターに代入する値をテーブルにしてみると、ある程度法則は分かったが、ビットシフトやソース、デスティネーションのアドレスが期待する表示結果とうまく合わない。結果的にアイコンがずれて表示されたり、一部が黒塗りになってしまう。最初にJDOSの$BITBLT.SYSを解析したときは全く意味が分からなかったが、このテーブルと照らし合わせるとアドレスの計算方法が分かってきた。しかし、上手くいくかどうか先行きは見えない。
そんなことより、今回の調査で最大の発見はJDOSが持つディスプレイ・アダプターの画面モードに1040×725グラフィックモードが存在したことだろうか。
モード | 種類 | 表示文字数 | ボックスサイズ | アドレス | 面数 | 画面解像度 | |
---|---|---|---|---|---|---|---|
08h | 単色文字 | 80×25 | 13×29 | E0000h | 1 | 1040×725 | |
0Eh | カラー文字 | 80×25 | 13×29 | E0000h | 1 | 1040×725 | |
03h | VGAモード3互換? | 80×25 | 13×29 | B8000h | 1 | 1040×725 | |
0Ah | 単色グラフィック | 78×25 | 13×29 | A0000h | 1 | 1024×768 | |
0Dh | 16色グラフィック | 78×25 | 13×29 | A0000h | 4 | 1024×768 | |
0Fh | 256色グラフィック | 78×25 | 13×29 | A0000h | 8 | 1024×768 | |
45h | 16色グラフィック | 80×25 | 13×29 | A0000h | 4 | 1040×725 | (NEW!) |
この画面モード45hはJDOS上でInt 10h, AH=00hファンクションによって切り替えることは可能だが、ビデオ信号タイミングなどのCRTCのパラメーターが設定されるのみで、他のモードと違ってDOS画面は何も表示されなくなる。
Windowsのディスプレイドライバーもこの画面解像度を使うので、最初はエミュレーターの不具合かレジスターに値を補正する特殊な仕様でもあるのかと色々調べたが、原因が分からなかった。$BITBLT.SYSの画面モード判別ルーチンに画面モード45hがあり、テキスト画面と同じ1040×725のグラフィックモードが存在することが分かった。