雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。

VESAから帰ってくる情報の情報 anchor.png

VESA BIOSが搭載されているのかいないのか。また、搭載されていた場合、どこまで使えるのか。そういう手の情報はある程度BIOSから返される。ではどんなものなのか??

Page Top

最初の一手 anchor.png

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は存在するっぽいんだけど、なんらかの理由でまともには使えない?
  • 結果、
    CMP        AX,0x004f
    JNE        scrn320
    等とすることでVESAを使うかVGAの元来の機能で我慢するかを分岐できる

さらに、例のES:DIアドレスに以下の情報が書き込まれる

0x90004バイト「VESA」の文字。つまり0x56、0x45、0x53、0x41
0x90042バイトVESAのバージョンナンバー
0x90064バイトOEM名(メーカー名?)の文字が入っているアドレス?ここ参照のこと
0x900A4バイト性能? 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
0x900E4バイトサポートするモードの一覧表のアドレス(文字列のポインタ?)終端が 0xFFFFの文字列らしい
0x90122バイトVRAMの大きさ・・・かな?

以降はVESA 2.0以降の場合。

0x90142バイトソフトウェアのバージョン?なんの?
0x90164バイト製造業者の名前のアドレス(やっぱポインタかな?)
0x901A4バイト製品名のアドレス
0x901E4バイト製品のリビジョンナンバー?
0x901F225バイトここから0x9100まではメーカーの自由な領域???

Page Top

OEM Name anchor.png

この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という名前だった。

Page Top

0x4f01 anchor.png

上記、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はない?あっても使えない?)
  • 結果、
    CMP        AX,0x004f
    JNE        scrn320
    等とすることでVESAを使うかVGAの元来の機能で我慢するかを分岐できる

さらに、例の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
  • 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
  • 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 v2.0 ---
  • 0x90028:4バイト:リニアフレームバッファ時のVRAMの開始番地。
    2Ch   DWORD    Pointer to start of offscreen memory
    30h   WORD     Offscreen memory in Kbytes
    The buffer is defined as 256bytes
Page Top

豆知識! anchor.png

  • 枝豆ってやぁ〜・・・大豆やねんでぇ(コラなぜ殴る痛いじゃないか)
  • VESAではバンク切り替えのバンクをウィンドゥと呼称するらしい!!
Page Top

戯言 anchor.png

むむむ・・・? ウチのVESA1.2のボロノートは256パレットもリニアフレームバッファもサポートしていないのではりぼては動かせない・・・ ではこのモードで描画するにはどうしたらいいのか???? ・・・どうも、バンク切り替え?というような方法で行うような感じがしてきた。 ようするに、赤青黄などの成分に分けて、色ごとになんらかの方法で切り替えを行って描画する・・・そんな方式のような気がしてきた・・・

もちろんこれはそれなりに煩雑なのだろうけど、なんか思ったより大変じゃないような気がしてくる・・・どうなんだろうか?

少なくともVGAのように1ドットが1ビットなんてややこしい方式でなければ・・・・


Last-modified: 2012-10-22 (Mon) 22:05:10 (GMT) (2818d) by