VESAから帰ってくる情報の情報
VESA BIOSが搭載されているのかいないのか。また、搭載されていた場合、どこまで使えるのか。そういう手の情報はある程度BIOSから返される。ではどんなものなのか??
最初の一手
16bit(リアルモード)時、以下のBIOSコールを行うといろいろ調べることができる。
MOV AX,0x4f00 ;AXにファンクション番号である0x4f00を MOV AX,0x9000 ;ここはようするに、ES:DIに0x9000:0を MOV ES,AX ;書き込みたいだけ。ESは直接代入できない MOV DI,0 ;のでこうしているだけ INT 0x10 ;BIOSコール!
このコールの結果、各レジスタやES:DIで指定したアドレスに情報が帰ってくる
- AL : 0x4Fが帰ってきたら成功。(とりあえずVESA BIOSは存在する?)
- AH : 各種詳細情報
- 0x00 : 成功。問題なし
- 0x01 : 明確に「ダメ」。(VESAはない?あっても使えない?)
- 0x02 : VESAは存在するっぽいんだけど、BIOS設定等でカットされてて使えない?
- 0x03 : VESAは存在するっぽいんだけど、なんらかの理由でまともには使えない?
- 結果、
等とすることでVESAを使うかVGAの元来の機能で我慢するかを分岐できる
CMP AX,0x004f JNE scrn320
さらに、例のES:DIアドレスに以下の情報が書き込まれる
0x9000 | 4バイト | 「VESA」の文字。つまり0x56、0x45、0x53、0x41 |
0x9004 | 2バイト | VESAのバージョンナンバー |
0x9006 | 4バイト | OEM名(メーカー名?)の文字が入っているアドレス?ここ参照のこと |
0x900A | 4バイト | 性能? Bit 0 Set if the DAC can switch width, clear if it is fixed 6bits per primary color 1 (VBE2) non-VGA controller 2 (VBE2) Programmed DAC with blank bit |
0x900E | 4バイト | サポートするモードの一覧表のアドレス(文字列のポインタ?)終端が 0xFFFFの文字列らしい |
0x9012 | 2バイト | VRAMの大きさ・・・かな? |
以降はVESA 2.0以降の場合。
0x9014 | 2バイト | ソフトウェアのバージョン?なんの? |
0x9016 | 4バイト | 製造業者の名前のアドレス(やっぱポインタかな?) |
0x901A | 4バイト | 製品名のアドレス |
0x901E | 4バイト | 製品のリビジョンナンバー? |
0x901F | 225バイト | ここから0x9100まではメーカーの自由な領域??? |
OEM Name
この4バイトの数字がどこかを指し示すポインタらしい。そこにはメーカー名かなんかが入っていると思われる。
ちなみに、qemuで試したら、
+06 0x78 +07 0x00 +08 0x00 +09 0xc0
ボロノート(DynaBook GT475)(VGA Chips 65520?)だと、
+06 0xdf +07 0x33 +08 0x00 +09 0xe0
となった。
これが動作している時点では16bitモードなので、4バイト(32ビット)でのアドレス指定は出来ないはずなので、例の[セグメント:オフセット]形式として使うものと思われる。
実験の結果、qemuの場合は 0xc0078番地から文字が。終端は0で終わる文字列だった。 Bochs VBE v2.0という名前だった。
0x4f01
上記、0x4f00ファンクションの後に行うらしい。VESAの有無を確認したら、望みのビデオモードが動くかどうかを確認するものらしい。
MOV AX,0x4f01 ;AXにファンクション番号である0x4f01を MOV CX,0x101 ;使いたいモード番号を代入 MOV AX,0x9000 ;ここはようするに、ES:DIに0x9000:0を MOV ES,AX ;書き込みたいだけ。ESは直接代入できない MOV DI,0 ;のでこうしているだけ INT 0x10 ;BIOSコール!
このコールの結果、各レジスタやES:DIで指定したアドレスに情報が帰ってくる
- AL : 0x4Fが帰ってきたら成功。(とりあえずVESA BIOSは存在する?)
- AH : 各種詳細情報
- 0x00 : 成功。問題なし
- 0x01 : 明確に「ダメ」。(VESAはない?あっても使えない?)
- 結果、
等とすることでVESAを使うかVGAの元来の機能で我慢するかを分岐できる
CMP AX,0x004f JNE scrn320
さらに、例のES:DIアドレスに以下の情報が書き込まれる
- 0x90000
- 2バイト:各種モードのフラグ。
- bit 0: mode supported if set
- 1: optional information available if set
- 2: BIOS output supported if set
- 3: set if color, clear if monochrome
- 4: set if graphics mode, clear if text mode
- 5: (VBE2) non-VGA mode
- 6: (VBE2) No bank swiotching supported
- 7: (VBE2) Linear framebuffer mode supported
- 2バイト:各種モードのフラグ。
- 0x90002:1バイト: window A の属性
- bit 0: exists if set
- 1: readable if set
- 2: writable if set
- bits 3-7 reserved
- 0x90003:1バイト:window B の属性。上記Aと同じフォーマット
04h WORD window granularity in K 06h WORD window size in K 08h WORD start segment of window A 0Ah WORD start segment of window B 0Ch DWORD -> FAR window positioning function (equivalent to AX=4F05h) 10h WORD bytes per scan line
- remainder is optional for VESA modes, needed for OEM modes---
- 0x90012:2バイト: 画面のX方向のサイズ(ピクセル単位)
- 0x90014:2バイト: 画面のY方向のサイズ(ピクセル単位)
- 0x90016:1バイト: 1文字のX方向のサイズ(ピクセル単位)。高解像度テキスト用?
- 0x90017:1バイト: 1文字のY方向のサイズ(ピクセル単位)。高解像度テキスト用?
- 0x90018:1バイト: プレーンの数?(たとえば4なら赤青黄輝とか?)
- 0x90019:1バイト: 画面の1ピクセルが何ビットで構成されているか?
- 0x9001A:1バイト: バンクの数。 ??
- 0x9001B
- 1バイト:メモリーモデルタイプ。0x04だと256色パレットタイプ。0x06だとダイレクトカラー?
- 0 Text
- 1 CGA graphics
- 2 Hercules Graphics
- 3 EGA 16 color
- 4 Packed pixels
- 5 Non chain 4 256 color modes
- 6 Direct 15/16/24 bit
- 7 YUV (luminance-chrominance, alos called YIQ)
- 8-0Fh Reserved for VESA
- 10h-0FFh Reserved for OEM
- 1バイト:メモリーモデルタイプ。0x04だと256色パレットタイプ。0x06だとダイレクトカラー?
- 0x9001C:1バイト: バンクの大きさ(KB単位)
1Dh BYTE number of image pages
- 0x9001E:1バイト: 予約らしい。常に1になっているらしい
- VBE v1.2+ --------------------------
1Fh BYTE Red mask size 20h BYTE Red mask position 21h BYTE Green mask size 22h BYTE Green mask position 23h BYTE Blue mask size 24h BYTE Blue mask position 25h BYTE Reserved mask size 26h BYTE Reserved mask position 27h BYTE Direct Screen mode info Bit 0 If set the color ramp is programmable, if clear fixed 1 If set the reserved field (as defined by Bytes 25-26h) can be used by the application, if clear the field is truly reserved.
- VBE v1.2+ --------------------------
- VBE v2.0 ---
- 0x90028:4バイト:リニアフレームバッファ時のVRAMの開始番地。
The buffer is defined as 256bytes
2Ch DWORD Pointer to start of offscreen memory 30h WORD Offscreen memory in Kbytes
戯言
むむむ・・・? ウチのVESA1.2のボロノートは256パレットもリニアフレームバッファもサポートしていないのではりぼては動かせない・・・ ではこのモードで描画するにはどうしたらいいのか???? ・・・どうも、バンク切り替え?というような方法で行うような感じがしてきた。 ようするに、赤青黄などの成分に分けて、色ごとになんらかの方法で切り替えを行って描画する・・・そんな方式のような気がしてきた・・・
もちろんこれはそれなりに煩雑なのだろうけど、なんか思ったより大変じゃないような気がしてくる・・・どうなんだろうか?
少なくともVGAのように1ドットが1ビットなんてややこしい方式でなければ・・・・