雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。
3: 2007-11-25 (日) 21:12:20 ソース バックアップ No.3 を復元して編集 現: 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アドレスに以下の情報が書き込まれる
Line 26: Line 34:
|0x9000|4バイト|「VESA」の文字。つまり0x56、0x45、0x53、0x41| |0x9000|4バイト|「VESA」の文字。つまり0x56、0x45、0x53、0x41|
|0x9004|2バイト|VESAのバージョンナンバー| |0x9004|2バイト|VESAのバージョンナンバー|
-|0x9006|4バイト|?? なにかの名前の文字が入っているアドレス?(どうも違うようだ。この4バイトの数値そのものがOEM番号?らしい。[[ここ:http://thebbl.hideyosi.com/modules/bwiki/index.php?VESA#n6902f3f]]参照のこと|+|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 41: Line 49:
***OEM Name [#n6902f3f] ***OEM Name [#n6902f3f]
-なんやらわからんがこの数字がどうもOEMのコードナンバーらしい?+この4バイトの数字がどこかを指し示すポインタらしい。そこにはメーカー名かなんかが入っていると思われる。 
ちなみに、qemuで試したら、 ちなみに、qemuで試したら、
Line 55: Line 64:
 +09 0xe0  +09 0xe0
-となった。これはどっちから読むのかな? qemuの場合、 +となった。 
-c0000078? それとも 780000c0?+ 
 +これが動作している時点では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ビットなんてややこしい方式でなければ・・・・