めも VBE 3.0 - 16bit protected mode entry point
注意してコーディングすれば、リアルモードと16ビットプロテクトモードのコードはある程度まで共用化できる。ということでなのかどうかは知らないが、VBE/Core 3.0 仕様では VBE ファンクションの16ビット・プロテクトモードのエントリが仕様として定義されていたりする。
16ビット・プロテクトモードエントリ経由のファンクションコールを使った場合の、従来からのリアルモード割り込み(int 10h)に対する利点は、
- (仮想86でない、真の)リアルモードに CPU の状態を戻して呼び出すよりは、マルチタスク関係処理との親和性が高そう。
- 仮想86タスクを作って呼び出すよりはシステムリソースに優しそう。
- すくなくともプロテクトモードから呼び出すぶんには、リアルモード BIOS を呼び出すより動作が速そう。
こんなぐらい?
もちろん欠点や懸念もいくつかある。たとえば、
- VBE 3.0 以上で定義されている。つまり 2.0 以前の BIOS では実装されていない。
- 実際に実装されてるかどうかは「VGABIOS 領域の先頭32Kバイト(C0000-C7FFFh)を自力でスキャンして PMInfoBlock 構造体を探す」という方法でしか確認できない。E0000h に VGABIOS がある場合や DOS の TSR なんかの実装はアウトオブ眼中らしい。
- 16ビット・プロテクトモードのセレクタ(BIOS 実行用のコードセグメント、BIOS データ格納用データセグメント、ビデオバッファの物理メモリを指すデータセレクタ3つ、BIOS コードセグメントと同位置を指すデータセレクタ、ローカルスタック用のスタックセグメント)を用意しないといけない。
- 使う前に初期化(BIOS コードを RAM に転送、16ビットセレクタ作成、PMInfoBlock 構造体設定、初期化ファンクション呼び出し)する必要がある。
- あくまで16ビットのコードなので、32ビットのデータセグメントからポインタを渡す場合は16ビットのセレクタとオフセットに変換しないといけない(これは vbe3.pdf に書いてある)。
- あくまで16ビットのコードなので、32ビットのコードセグメントから呼び出す場合はリターンアドレスのオフセットが16ビット内に収まってないとたぶんヤバい(これって vbe3.pdf に書いてあった?)。中継用のエントリ作るとかしないといけないかも。
- 「状態取得」系のファンクションは未サポート(必須サポートではないので、動作をアテにしてはいけない)。
- というかそもそも実装がこなれてなさそうな気がする。だって16ビット・プロテクトモードですよ? たしか APM とか PCI とかの16ビットプロテクトモード BIOS も腐った実装がけっこうあったりなかったり…という話をどこかで聞いた気がしましたがどうなんでしょうか?
ということで個人的には「報われない感」がいちばん強い仕様ではあります。
しかし家だとこんないっぱい書けないですヨ……