雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。
2: 2007-11-25 (日) 11:26:31 ソース バックアップ No.2 を復元して編集 現: 2024-01-06 (土) 22:39:11 ソース 編集
Line 7: Line 7:
  MOV AX,0x4f00      ;AXにファンクション番号である0x4f00を   MOV AX,0x4f00      ;AXにファンクション番号である0x4f00を
 + 
  MOV AX,0x9000      ;ここはようするに、ES:DIに0x9000:0を   MOV AX,0x9000      ;ここはようするに、ES:DIに0x9000:0を
  MOV ES,AX          ;書き込みたいだけ。ESは直接代入できない   MOV ES,AX          ;書き込みたいだけ。ESは直接代入できない
  MOV DI,0          ;のでこうしているだけ   MOV DI,0          ;のでこうしているだけ
 + 
  INT 0x10  ;BIOSコール!   INT 0x10  ;BIOSコール!
Line 21: Line 21:
--0x02 : VESAは存在するっぽいんだけど、BIOS設定等でカットされてて使えない? --0x02 : VESAは存在するっぽいんだけど、BIOS設定等でカットされてて使えない?
--0x03 : VESAは存在するっぽいんだけど、なんらかの理由でまともには使えない? --0x03 : VESAは存在するっぽいんだけど、なんらかの理由でまともには使えない?
 +-結果、
 + CMP        AX,0x004f
 + JNE        scrn320
 +等とすることでVESAを使うかVGAの元来の機能で我慢するかを分岐できる
 +
 +
 +
 +
さらに、例のES:DIアドレスに以下の情報が書き込まれる さらに、例のES:DIアドレスに以下の情報が書き込まれる
|0x9000|4バイト|「VESA」の文字。つまり0x56、0x45、0x53、0x41| |0x9000|4バイト|「VESA」の文字。つまり0x56、0x45、0x53、0x41|
-|0x9004|4バイト|VESAのバージョンナンバー。(ただし数値ではなく文字らしい)+|0x9004|2バイト|VESAのバージョンナンバー
-|0x9006|4バイト|?? なにかの名前の文字が入っているアドレス?|+|0x9006|4バイト|OEM名(メーカー名?)の文字が入っているアドレス?[[ここ:http://thebbl.hideyosi.com/modules/bwiki/index.php?VESA#n6902f3f]]参照のこと|
|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  | |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の文字列らしい| |0x900E|4バイト|サポートするモードの一覧表のアドレス(文字列のポインタ?)終端が  0xFFFFの文字列らしい|
Line 37: Line 45:
|0x901E|4バイト|製品のリビジョンナンバー?| |0x901E|4バイト|製品のリビジョンナンバー?|
|0x901F|225バイト|ここから0x9100まではメーカーの自由な領域???| |0x901F|225バイト|ここから0x9100まではメーカーの自由な領域???|
 +
 +----
 +
 +***OEM Name [#n6902f3f]
 +この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 [#o45e3a87]
 +上記、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
 +
 +***豆知識! [#nb8254f8]
 +-枝豆ってやぁ〜・・・大豆やねんでぇ(コラなぜ殴る痛いじゃないか)
 +
 +-COLOR(red){VESAではバンク切り替えのバンクをウィンドゥと呼称するらしい!!}
 +
 +
 +
 +
 +**戯言 [#d7a92b74]
 +むむむ・・・?
 +ウチのVESA1.2のボロノートは256パレットもリニアフレームバッファもサポートしていないのではりぼては動かせない・・・
 +ではこのモードで描画するにはどうしたらいいのか????
 +・・・どうも、バンク切り替え?というような方法で行うような感じがしてきた。
 +ようするに、赤青黄などの成分に分けて、色ごとになんらかの方法で切り替えを行って描画する・・・そんな方式のような気がしてきた・・・
 +
 +
 +もちろんこれはそれなりに煩雑なのだろうけど、なんか思ったより大変じゃないような気がしてくる・・・どうなんだろうか?
 +
 +少なくともVGAのように1ドットが1ビットなんてややこしい方式でなければ・・・・