日本語で分かりやすいものが見つからなかったのでそのうち整理して簡単に使えるようにしたい。
(これらの本当の資料は無料ではないらしいので無料で分かる範囲で。)
分かったことまとめ(書きかけにつき誤情報の可能性あり)
いわゆるMS-DOS等リアルモードOSからVGA BIOSを呼び出して設定する方法です。
VGA(VESA)BIOSの都合上、VBE3.0以上の必要があります(たぶん)。
VBEファンクション02hを使用して画面モードを切り替える。
例: mov bx, 0102h ; ←画面モード番号 mov ax, 4F02h ; ←Set VBE Modeファンクション int 10h
これは基本なのであえて説明はしない。
画面モードを設定する際に該当するビットを立て、リフレッシュレートを定義したバッファ(構造体)のポインタを指定して切り替える。
これで設定するとディスプレイに送られる信号はGTF基準となる。
例: mov bx, 0902h ; ←モード番号とフラグ push ds pop es mov di, offset [CRTCInf] ; ES:DI←構造体へのポインタ mov ax, 4F02h ; ←Set VBE Modeファンクション int 10h ; (中略) CRTCInf CRTCInfoBlock <1904,1520,1672,934,903,909,4,133417000,7502,0>
構造体(CRTCInfoBlock)についてはこちら。
CRTCInfoBlock struc HorizontalTotal dw ? ; Horizontal total in pixels HorizontalSyncStart dw ? ; Horizontal sync start in pixels HorizontalSyncEnd dw ? ; Horizontal sync end in pixels VerticalTotal dw ? ; Vertical total in lines VerticalSyncStart dw ? ; Vertical sync start in lines VerticalSyncEnd dw ? ; Vertical sync end in lines Flags db ? ; Flags (Interlaced, Double Scan etc) PixelClock dd ? ; Pixel clock in units of Hz RefreshRate dw ? ; Refresh rate in units of 0.01 Hz Reserved db 40 dup (?) ; remainder of ModeInfoBlock CRTCInfoBlock ends
リフレッシュレートを0.01Hz単位でCRTCInfoBlock->RefreshRateにセットしておく(59.94Hzなら5994をセット)。
他の部分の値はこの設定では無視されるので問題なし。→全然無視されないみたい? テスト環境(RIVA TNT2)のせい?
RefreshRate以外を0にして呼び出してみたら見事にNo Signal(ディスプレイに入力が無いと表示される)…
試しに下記のサンプルパラメータで呼び出してみたら見事にその解像度で出力されてる・・・!?(これはこれでちょっと嬉しいw)
もしかして別のファンクションでパラメータを取得してリフレッシュレートだけ書き換えて呼び出さないといけないのかも知れない。
(ちゃんと仕様書読まないとダメだなぁ・・・。)
画面モード番号に81FFhを使用して画面モードを切り替える。
上記と同様に構造体にあらかじめ信号のパラメータをセットしておき、そのアドレスをES:DIに入れて呼び出す。
例: mov bx, 81FFh push cs pop es mov di, offset CRTCInf mov ax, 4F02h int 10h ; (中略) CRTCInf CRTCInfoBlock <1904,1520,1672,934,903,909,4,133417000,7502,0> ;※もしかしたら4F0Bhファンクションを使用してピクセルクロックを補正する必要があるかも知れない。
CRTCInfoBlock->Flagsにセットするフラグの意味はこちら。
ビット番号 | ビット位置 | フラグ(を立てた時)の値と意味 | |
0 | 0001b | ダブルスキャンを有効にする(グラフィックモード) | |
1 | 0010b | インタレースモードにする(グラフィックモード) | |
2 | 0100b | 水平同期信号の極性 | |
0 | ポジティブ(+) | ||
1 | ネガティブ(-) | ||
3 | 1000b | 垂直同期信号の極性 | |
0 | ポジティブ(+) | ||
1 | ネガティブ(-) |
ちなみに、画面モード番号とフラグについてはこちら。
ビット番号 | ビット位置 | ビットの値の意味 | |
8~0 | 0000 0001 1111 1111b | 画面モード番号(6Ahや102hなど) | |
10~9 | 0000 0110 0000 0000b | 予約済(0にする) | |
11 | 0000 1000 0000 0000b | リフレッシュレート | |
0 | 既定のリフレッシュレート | ||
1 | CRTCInfoBlock->RefreshRateで指定するリフレッシュレート | ||
13~12 | 0011 0000 0000 0000b | 予約済(0にする。VBE/AF用) | |
14 | 0100 0000 0000 0000b | フレームバッファの設定 | |
0 | ウィンドウ | ||
1 | リニア/フラット | ||
15 | 1000 0000 0000 0000b | フレームバッファのクリア | |
0 | する | ||
1 | しない |
基本は上記(リフレッシュレート指定)とほぼ同じで、CRTCパラメータも一緒にセットしておく。
セットするべきパラメータの基準は上記GTFやCVT、他のサイトなどを参考にすると良いだろう。
(このまま実行するとVBEがエラーを返してきたので、やっぱり何か自前に準備する必要があるみたい。
そりゃあ、アクティブピクセル数の設定が無いのに単独で呼び出しても使えないよね・・・。)
(そのうち追記予定)
2008年4月10日追記: 検索から来られる人が意外と多いので追記します。
現在VESA3.0に対応したグラボを使用しているPCをweb鯖として使用しているため、実質的に確認することができなくなってしまいました。なので間違った(=正常に動作しない)まましばらく放置することになります。申し訳ありません。(やっぱり日本語に訳された資料が欲しい・・・)
コメント | お名前 | NameLink | |