VESA General Timing Formula (GTF) と Coordinated Video Timings (CVT)

日本語で分かりやすいものが見つからなかったのでそのうち整理して簡単に使えるようにしたい。
(これらの本当の資料は無料ではないらしいので無料で分かる範囲で。)

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にセットするフラグの意味はこちら。

ビット番号ビット位置フラグ(を立てた時)の値と意味
00001bダブルスキャンを有効にする(グラフィックモード)
10010bインタレースモードにする(グラフィックモード)
20100b水平同期信号の極性
0ポジティブ(+)
1ネガティブ(-)
31000b垂直同期信号の極性
0ポジティブ(+)
1ネガティブ(-)

ちなみに、画面モード番号とフラグについてはこちら。

ビット番号ビット位置ビットの値の意味
8~00000 0001 1111 1111b画面モード番号(6Ahや102hなど)
10~90000 0110 0000 0000b予約済(0にする)
110000 1000 0000 0000bリフレッシュレート
0既定のリフレッシュレート
1CRTCInfoBlock->RefreshRateで指定するリフレッシュレート
13~120011 0000 0000 0000b予約済(0にする。VBE/AF用)
140100 0000 0000 0000bフレームバッファの設定
0ウィンドウ
1リニア/フラット
151000 0000 0000 0000bフレームバッファのクリア
0する
1しない


基本は上記(リフレッシュレート指定)とほぼ同じで、CRTCパラメータも一緒にセットしておく。
セットするべきパラメータの基準は上記GTFやCVT、他のサイトなどを参考にすると良いだろう。

(このまま実行するとVBEがエラーを返してきたので、やっぱり何か自前に準備する必要があるみたい。
 そりゃあ、アクティブピクセル数の設定が無いのに単独で呼び出しても使えないよね・・・。)

(そのうち追記予定) 2008年4月10日追記: 検索から来られる人が意外と多いので追記します。
現在VESA3.0に対応したグラボを使用しているPCをweb鯖として使用しているため、実質的に確認することができなくなってしまいました。なので間違った(=正常に動作しない)まましばらく放置することになります。申し訳ありません。(やっぱり日本語に訳された資料が欲しい・・・)

コメント欄  


コメントお名前NameLink

[リロード]   [トップ] [一覧] [単語検索] [最終更新]   [最終更新のRSS]