|
現: 2020-12-26 (土) 15:07:33 yuji  |
| + | *VESA General Timing Formula (GTF)とCoordinated Video Timings(CVT) [#r24e3025] |
| + | PCのグラフィックス規格を作成しているVESAに説明があります。~ |
| + | -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リスト |
| | | |
| + | **VBE関係情報 [#s06541f5] |
| + | -CRTInfoBlock |
| + | 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 |
| + | ~ |
| + | -CRTInfoBlock->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で算出されるリフレッシュレート| |
| + | |13~12|0011 0000 0000 0000b|>|LEFT:予約済(0にする。VBE/AF用)| |
| + | //|?|0010 0000 0000 0000b|>|LEFT:カスタムディスプレイタイミング使用フラグ?(動作せず。CRTCInfoBlock->Flagsの方なのか?)| |
| + | //|~|~|0|LEFT:既定のディスプレイタイミング| |
| + | //|~|~|1|LEFT:CRTCInfoBlockのディスプレイタイミング| |
| + | |14|0100 0000 0000 0000b|>|LEFT:フレームバッファの設定| |
| + | |~|~|0|LEFT:ウィンドウ| |
| + | |~|~|1|LEFT:リニア/フラット| |
| + | |15|1000 0000 0000 0000b|>|LEFT:フレームバッファのクリア| |
| + | |~|~|0|LEFT:する| |
| + | |~|~|1|LEFT:しない| |
| + | ~ |
| + | -ディスプレイタイミング |
| + | 画面外のディスプレイ信号について |
| + | ━━━━━━━━━━━━━━━━━━━━ H.Active |
| + | H.Active : H.Backporch ├─────┤ H.Frontporch |
| + | ├─────┤ : ├-┤ ├-┤ |
| + | ┬┌─────┐──┐┬ : ┌────────┐┬ ┬V.Back |
| + | ││//////////│ ││ : ┬│ ┌─────┐ ││ ┴ porch |
| + | V.Active││/表示画面/│ ││ : V.Active││ │//////////│ ││ |
| + | ││//////////│ ││V.Total : ││ │/表示画面/│ ││V.Total |
| + | ┴└─────┘ ││ : ││ │//////////│ ││ |
| + | │ ブランク・Sync ││ : ┴│ └─────┘ ││ ┬V.Front |
| + | └────────┘┴ : └────────┘┴ ┴ porch |
| + | ├────────┤ : ├────────┤ |
| + | H.Total : H.Total |
| + | |
| + | VBE用ディスプレイタイミングのイメージ図 |
| + | ━━━━━━━━━━━━━━━━━━━━━━━━ |
| + | ライン フロント バック |
| + | 描画開始 ポーチ ポーチ |
| + | ↓ )) ├───┤ ├───┤ |
| + | ┌────((────┐ ┌───┐ ┌────── ※信号の高低 |
| + | 信号 │//////// )) //////│ │ 同期 │ │(次のライン) はイメージ |
| + | ─┴…………((…………┴───┘ 信号 └───┴……………… です。 |
| + | ‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ |
| + | ├────-))-───────────────┤ ← HorizontalTotal |
| + | ├────((────┤ ← HorizontalActive |
| + | ├────-))-───────┤ ← HorizontalSyncStart |
| + | ├────((────────────┤ ← HorizontalSyncEnd |
| + | ※垂直方向も同様に。 |
| + | ~ |
| + | |
| + | **GTFやCVTなどをVESA BIOS Extensionで設定する方法 [#o0b6b52b] |
| + | いわゆるMS-DOS等リアルモードOSから,VGA BIOSを呼び出して設定する方法です。~ |
| + | VGA(VESA)BIOSの都合上,VBE3.0以上の必要があります。~ |
| + | |
| + | ***基本 [#p8e84472] |
| + | VBEファンクション02hを使用して画面モードを切り替える。 |
| + | 例: mov bx, 0102h ; ←画面モード番号 |
| + | mov ax, 4F02h ; ←Set VBE Modeファンクション |
| + | int 10h |
| + | こんな感じにする。~ |
| + | ~ |
| + | ***既定の画面モードのリフレッシュレートを変更する [#i2925b51] |
| + | 画面モードを設定する際に該当するビットを立て,リフレッシュレートを定義した構造体のポインタを指定して切り替える。~ |
| + | これで設定するとディスプレイに送られる信号は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,133420000,7502,0> |
| + | 構造体(CRTCInfoBlock)については上記参照。 |
| + | ~ |
| + | //リフレッシュレートを0.01Hz単位でCRTCInfoBlock->RefreshRateにセットしておく(59.94Hzなら5994をセット)。~ |
| + | //%%他の部分の値はこの設定では無視されるので問題なし。%%→全然無視されないみたい? テスト環境(RIVA TNT2)のせい?~ |
| + | //RefreshRate以外を0にして呼び出してみたら見事にNo Signal(ディスプレイに入力が無いと表示される)…~ |
| + | //試しに下記のサンプルパラメータで呼び出してみたら見事にその解像度で出力されてる・・・!?(これはこれでちょっと嬉しいw)~ |
| + | //~ |
| + | //もしかして別のファンクションでパラメータを取得してリフレッシュレートだけ書き換えて呼び出さないといけないのかも知れない。~ |
| + | //(ちゃんと仕様書読まないとダメだなぁ・・・。)~ |
| + | |
| + | CRTCInfoBlock->RefreshRateはBIOSでは使用されず、HorizontalTotalとVerticalTotal、PixelClockから算出されたリフレッシュレートが使用されるようです。~ |
| + | リフレッシュレートの計算方法は以下のようになっています。 |
| + | PixelClock |
| + | refreshRate = ───────────────── |
| + | HorizontalTotal×VerticalTotal |
| + | 例えば1024x768の画面モードではHTotalが1360、VTotalが802、正規化されたピクセルクロックが65MHzだとすると、このようになります。 |
| + | 65,000,000 |
| + | refreshRate = ─────── = 59.59 Hz |
| + | 1360× 802 |
| + | ~ |
| + | *** 既定の画面モードにない解像度設定に変更する [#i4d7f6f6] |
| + | 画面モード番号に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,133420000,7502,0> |
| + | // ;※もしかしたら4F0Bhファンクションを使用してピクセルクロックを補正する必要があるかも知れない。 |
| + | //CRTCInfoBlock->Flagsにセットするフラグの意味と画面モードフラグは上記参照。 |
| + | ~ |
| + | //基本は上記(リフレッシュレート指定)とほぼ同じで,CRTCパラメータも一緒にセットしておく。~ |
| + | //セットするべきパラメータの基準は上記GTFやCVTで計算する。~ |
| + | ~ |
| + | |
| + | **その他 [#f026186f] |
| + | なし |