211211 PS/55エミュ製作 [9]DAにVGA互換のテキストモードが存在した!?
DOS J5.0のセットアップ画面がバグる原因を調べた所、途中でBIOS割り込みINT 10Hによって画面モード03Hに切り替わっていることが判明。何と、この画面モードはVGA互換のテキストモードだった。エミュ開発していて最大の驚き😳
技術解説書によれば、ディスプレイアダプターⅡでは画面モード08H, 0AH, 0DH, 0EH, 0FHがサポートされている。このうち8とEはテキストモードで、A, D, Fはグラフィックモード。テキストモードでのアトリビュートの解釈はDBCS/SBCSの判別や罫線表示のためVGAとは異なり、以下のようになっている。
// [Attributes]
// Int 10h Video mode 08h:
// 7 6 5 4 3 2 1 0
// Blink |Under |HGrid |VGrid |HLight|Revers|FntSet|DBCS |
//
// Int 10h Video mode 0Eh:
// -Blue |-Green|HGrid |VGrid |-Red |Revers|FntSet|DBCS |
偶数アドレスに文字コード、奇数アドレスに属性コードが入る点はVGAと同じ。VGAは文字色と背景色それぞれにIRGBを指定するが、DAでは文字色のみでビットのイチゼロや順番は逆 (BGR) になっている。ビデオメモリのベースアドレスもVGAで使われているB8000hではなく、E0000hに配置されている。
しかし、DOS J5.0のセットアップでは画面モード03hが使われていることが判明。この画面モードはアトリビュートの解釈がVGAのテキストモードと同様に文字色と背景色を指定でき、ベースアドレスもB8000hとなっている。DOS K3.3では使用できないため、ハードウェアとしては実装されていたが、ソフトウェアとしては後からサポートされたんだろう。DOS J5.0の技術解説書には載っているのかもしれない。
問題はDBCSをどうやって表示するかという点だが、メモリダンプして調べた所、画面モード8やEと同じく、SBCSはそのままJISコードを使い、DBCSはシフトJISコードの余白を切り詰めた独自の内部コードを使用していることが分かった。しかし、この独自のコードは1Fhまでに割り当てられている半角罫線文字などと重複し、これだけではコードからSBCSとDBCSの判断ができない。
もっと調べてみると、ベースアドレスB0000hにも同じサイズのビデオメモリがあり、こちらにDBCSかどうかを示す情報が含まれていることが分かった。
仕組みが分かったのは良いのだが、これを実装するのがすごく面倒。ビデオメモリの解釈手順が違ってくるので既存のコードを流用できないし、メモリ上の2箇所のアドレスを参照するためにバンク切り替えを実装するかリニアに参照するかで悩む。最終的に動けばどっちでも良いか。