はりぼてではVESA2.0でないと高解像度化できない。 ・・・なんでじゃぁ??? というわけで。
(まぁ、よーするに。ウチで実験に使ってるボロノートがVESA1.2なんだよねぇ。なので、コイツで高解像度化ってできないもんかと思って・・・)
はりぼて上のチェック
はりぼてでは、asmhead.nas内で起動時にVESAのチェックを行っている。 (つまり、ただ単にVESA2.0かどうかだけをチェックしてるわけじゃないんだよね)
えっと・・・コードを読んでみると・・・
- 0x4f00でBIOSコール
- そもそもこれが不成功ならscrn320へジャンプ
- VESAのバージョンチェック。2.0以下(1.02とか)ならscrn320へジャンプ
- 0x4f01でBIOSコール。(CXに要求の画面モード)
- そもそもこれが不成功ならscrn320へジャンプ
- 帰ってきた情報のうち、0x19バイト目をチェック。これは画面の1ピクセルが何ビットで構成されているのかという情報。これが8じゃなかったらscrn320へジャンプ
- 次に0x1bバイト目をチェック。これはメモリーモデルタイプ?を表す。これが4(Packed pixels)でなければscrn320へジャンプ
- 最後に0x00バイト目をチェック。ここのbit7が立っているかどうか。つまり、(Linear framebuffer mode supported)かどうかをチェック。ダメだったらscrn320へジャンプ
・・・っとまぁ、こういうチェックをしているわけだね。
画面モードの切り替え
はりぼてでは全てのチェックを終え、正常だといよいよ画面の切り替えを行う。 この場合、AXに0x4f02をセット。さらにBXに画面モードをセットするんだけど、 単純にそのままセットではない。
BXにセットする値はビットごとに意味があるようだ。
- 0〜13ビットまでが画面モード。ここに0x101(640x480x256)だの0x105(1024x768x256)だのをセットする。
- 14ビット目はリニアアクセスモード要請(1で要請) -- ただし VESA 2.0以降
- 15ビット目がVRAMクリア省略(1で省略)
はりぼてではBXに対し、0x4000 + 画面モード という値をセットしている。つまり、
画面モード101(640x480x256)にしたい場合 ビット0〜13 0000000100000001 0x101 モード番号 ビット14 0100000000000000 0x4000 リニアアクセスを要請する ビット15 0000000000000000 0x0000 VRAMクリアを省略しない
こういうことのよーでする・・・
Linear framebuffer mode
リニアフレームバッファモードと読む。リニアフレームバッファとはなにかというと、えーーっと。ようするに、「普通にデータを書き込めるフレームバッファ」ということらしい。
普通とはなにかというと、はりぼてで全般的に採用されている方式。つまり、0xa0000に0x08を書き込むと、画面の左上にポツンと赤い点が表示されるような動作をするもの。
分かりやすくするために普通ではないモード。つまりノンリニアなものを説明。 プレーンと呼ばれる下敷きがあって、そこに別々にデータを打ち込むことで画面に点が表示される。よくあるパターンは、赤青黄等の3色以上に分かれているパターン。こういうのに点を打ちたい場合、まず赤のプレーンに点を打ち、次に青のプレーンに切り替えてからまた点を打ち・・・と、プレーンを切り替えて色を表現するようなパターン。 比較的遅く、またプログラムも煩雑になるのはわかるだろう。