- 追加された行はこの色です。
- 削除された行はこの色です。
#contents
* VESA General Timing Formula (GTF) と Coordinated Video Timings (CVT)
日本語で分かりやすいものが見つからなかったのでそのうち整理して簡単に使えるようにしたい。~
(これらの本当の資料は無料ではないらしいので無料で分かる範囲で。)~
~
-http://www.vesa.org/
--本家
-http://gtf.sourceforge.net/
--Linux GTFコマンドのソースが置いてある
-http://www.uruk.org/~erich/projects/cvt/
--同じくCVTコマンドのソースが置いてある
-http://www.vesa.org/Public/GTF/GTF_V1R1.xls
--GTFスプレッドシート
-http://www.vesa.org/Public/CVT/CVTd6r1.xls
--CVTスプレッドシート
-http://www.delorie.com/djgpp/doc/rbinter/ix/10/4F.html
--参考になりそうなVESA関係のAPIリスト
** xlsファイルとC/C++ソースから読む タイミング算出方法
分かったことまとめ(書きかけにつき誤情報の可能性あり)~
-なし
** GTFやCVTなどをVESA BIOS Extensionで設定する方法
いわゆる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にセットするフラグの意味はこちら。
|ビット番号|ビット位置|>|LEFT:フラグ(を立てた時)の値と意味|
|0|0001b|>|LEFT:ダブルスキャンを有効にする(グラフィックモード)|
|1|0010b|>|LEFT:インタレースモードにする(グラフィックモード)|
|2|0100b|>|LEFT:水平同期信号の極性|
|~|~|0|LEFT:ポジティブ(+)|
|~|~|1|LEFT:ネガティブ(-)|
|3|1000b|>|LEFT:垂直同期信号の極性|
|~|~|0|LEFT:ポジティブ(+)|
|~|~|1|LEFT:ネガティブ(-)|
ちなみに、画面モード番号とフラグについてはこちら。
|ビット番号|ビット位置|>|LEFT:ビットの値の意味|
|8~0|0000 0001 1111 1111b|>|LEFT:画面モード番号(6Ahや102hなど)|
|10~9|0000 0110 0000 0000b|>|LEFT:予約済(0にする)|
|11|0000 1000 0000 0000b|>|LEFT:リフレッシュレート|
|~|~|0|LEFT:既定のリフレッシュレート|
|~|~|1|LEFT:CRTCInfoBlock->RefreshRateで指定するリフレッシュレート|
|13~12|0011 0000 0000 0000b|>|LEFT:予約済(0にする。VBE/AF用)|
|14|0100 0000 0000 0000b|>|LEFT:フレームバッファの設定|
|~|~|0|LEFT:ウィンドウ|
|~|~|1|LEFT:リニア/フラット|
|15|1000 0000 0000 0000b|>|LEFT:フレームバッファのクリア|
|~|~|0|LEFT:する|
|~|~|1|LEFT:しない|
~
基本は上記(リフレッシュレート指定)とほぼ同じで、CRTCパラメータも一緒にセットしておく。~
セットするべきパラメータの基準は上記GTFやCVT、他のサイトなどを参考にすると良いだろう。~
~
(このまま実行するとVBEがエラーを返してきたので、やっぱり何か自前に準備する必要があるみたい。~
そりゃあ、アクティブピクセル数の設定が無いのに単独で呼び出しても使えないよね・・・。)~
~
(そのうち追記予定)
~
** コメント欄 [#commentarea]
#comment