今日は OSZ で FM TOWNS のテキスト表示を改良しました。
FM TOWNS はとても興味深いアーキテクチャで、 FMR シリーズとの互換を考慮しつつ 386 に特化されています。
TOWNS 固有のメモリマップは 32bit の 4GB 空間にざっくりとマップされているので実際にはかなりスカスカです。16bit の狭い空間にいろんなものがひしめいていた IBM PC や NEC-98 シリーズとは大違いです。
もしもメインメモリが GB 単位あたりまえの現在まで生き残っていたら I/O 領域邪魔すぎとかいろいろ叩かれそうなざっくり感ですが、幸か不幸かその時代がくる前に終息してしまいました。。
FMR との互換性を重視していたので大半のアプリケーションはそのまま動作したようですが、 TOWNS にはテキスト VRAM がありません。
いずれテキストベースの環境は滅びて GUI の時代が来ると予測してテキスト VRAM を乗せなかったのかどうかは定かではありません。
しかし、FMR も TOWNS も DOS ベースマシンなのでテキスト表示が必要です。いったいどうやって実現されいるのでしょうか?
なんと、 BIOS がグラフィックス VRAM にフォントパターンを直接描画することでテキスト表示を実現しています。
「それ、 DOS/V じゃん」
本質的には DOS/V と同じことをそれより前にしれっと実現していたわけです。
しかし TOWNS の BIOS は曲者で、 BIOS によって提供されているといわれている機能のほとんどが実際にはベアメタル環境だと提供されません。
ぼくが調べた限り BIOS ROM で提供されている機能は OS が起動できる最低限程度の機能しかなく、それ以上の機能は IO.SYS 等の OS 側にある感じがします。
そこで OSZ は自力でフォントを VRAM に書き込まなければならないわけですが、ここで TOWNS のメモリマップを思い出してください。
OSZ はリアルモードの 16bit OS なので 1MB 以下の空間しか見えていませんが、 TOWNS の VRAM は遥か天井の先にあります。
リアルモードから見える FMR 互換の VRAM もあるにはあるのですがテキスト処理には向いていない感じだったのでやっぱり TOWNS ネイティブの VRAM が使いたいです。
このジレンマを解消するため Unreal mode という手法を使いました。*1
その後はフォントパターンを 16 色に展開する処理に手こずってなかなか正しい文字が表示されなかったりもしましたが、無事にテキスト表示できるようになりました。
前回まで使用していた BIOS 機能のテキスト描画は FMR 互換 VRAM 上に描画しているようでスクロールもできませんでしたが、今回からネイティブの VRAM に書き込んでるのでスクリーンショットにあるようにグラフィックス画面と重ね表示しながらスクロールもできるようになりました。
TOWNS は純粋なリアルモードの OS で使うにはあまり向いてないようです。