ここで別の仮定をします。:
あるアダプターカードは 40 MHz のクロックで動作します。あるディスプレイは 30 KHz から37 KHz の範囲の水平同期信号で動作します。この時の1つの線当たり のドットの最小数は 40,000,000/37,000 = 1,081.081 より、約 1,081 ドット/線 となります。
この1本当たりのドット数をこれからの計算で使います。だから、ディスプレイ上 のそれぞれの線は最小で 1081 ドットあります。この数値を 8 で割り切れる数に 丸めて 1088 に切り上げます。ここでは水平同期信号長に 3.8 マイクロ秒を使う ことを仮定しています。 3.8 マイクロ秒の信号を作るのに何ドット必要なのかを 見つける必要があります。先ず1ドットが何マイクロ秒なのかを探しましょう。毎 秒 40,000,000 ドットなので、1/40,000,000 がドット当たりの秒数です。 つまり
1/40,000,000 = .000000025 = ドット当たり .025 マイクロ秒
となります。
この時 3.8 マイクロ秒の同期信号を構成するドット数 D は
3.8 マイクロ秒 = D ドット x .025 マイクロ秒/ドット
つまり
D ドット = (3.8 マイクロ秒) / (.025 マイクロ秒/ドット) = 152 ドット です。
線当たり 1088 ドットの時、152 ドットを同期信号に使用して、800 ドットが輝い て見えているわけです。(152 は 8 で割り切れることに注意して下さい。割り切 れない場合は割り切れるように切り上げて下さい。)ここでディスプレイのために 必要な同期信号の前後の時間を計算する仕事が残っています。
経験則により、防御時間の約 30 単位が必要です。詳しく述べると、32 ドットを 割り当てると都合が良いのは、他の全ての数値が 8 で割り切れているからです。 表示領域に 800 ドット、同期信号に 152 ドット使った結果、1088 - (800 + 152) = 136 となり、136 ドットが 2 つの時間の間を分けています。136 の半分の 68 ドットが輝いているドットと同期信号の間に置かれて、68 ドットが同期信号の後 に置かれています。Xconfig ファイルの水平方向の数値は次のように書きます。
800 (800+68) (800+68+152) (800+68+152+68)
つまり
800 868 1020 1088 となります。
今度は垂直方向の数値を計算しましょう。当初から垂直方向の数値にドットだとか ドット当たりのマイクロ秒とかの単位を使わずに線の数を使っていた事を思い出し て下さい。よって、1 本の線を表示するのにどれくらいの時間が掛かるかを計算す る必要があります。この計算はそれぞれの線が 1088 ドットでそれぞれのドットは .025 マイクロ秒なので簡単です。従って、それぞれの線は
(1088 ドット/線) x (.025 マイクロ秒/ドット) = 27.2 マイクロ秒/線 と計算できます。
線当たり 800 ドット表示可能を選択したので、アスペクト比が 4 対 3 になるよ うに線の数を選択しましょう。この時、800 は 4 x 200 なので縦方向の線の数は 3 x 200 = 600 になるでしょう。目標解像度は 800x600 です。
垂直同期信号の範囲は 50 から 300 マイクロ秒であることが分かっています。代 表的な同期信号として 150 マイクロ秒を選択した場合に、150 マイクロ秒を 27.2 マイクロ秒で割れば 1 同期信号当たりの本数が計算できます。
(150 マイクロ秒/同期信号) / (27.2 マイクロ秒/本) = 5.51 本/同期信号
これを 6 本/同期信号に切り上げることで(切り捨てはしないでください)、垂直 同期信号幅が求まりました。
フレームの線の(輝いている線と周囲にある輝いていない線を加えた)合計本数を ("ビデオ調整..." から)、表示可能な線の本数より 5% 増しの合計本数として予 測できます。よって、線の合計本数は次のように計算します。
(600 本) x (1.05) = 630 (フレーム当たりの合計本数)
さてここで、輝いている線 (以下、輝線) の終わりとフレームの終わりの間に同期 信号を置かないといけません。合計で 630 本、輝線が 600 本、同期信号に 6 本 あるので、
630 - 600 - 6 = 24 本残ります。
幾つかのディスプレイは輝線の直後に同期信号を発行しても問題ありませんが、他 の幾つかのディスプレイでは、輝線の最後と同期信号の最初の間に 1 本か 2 本分 間隔を置くべきでしょう。安全のために余裕を持って、輝線の最後と同期信号の最 初の間に 3 本分追加します。残りの本数を同期信号の後ろに追加します。垂直同 期調整の数値は次のようになります。
600 (600+3) (600+3+6) (600+3+6+21)
つまり
600 603 609 630
とにかく作業を行なう前に、線 1 本当たり 27.2 マイクロ秒の時にフレーム当た り 630 本をディスプレイが表示できることを確認しなければいけません。設定し ようとしている構成で毎秒何フレーム表示するか計算し、ディスプレイのマニュア ルの垂直同期速度に関する記載と見比べることによって確認できます。線 1 本当 たり 27.2 マイクロ秒の時にフレーム当たり 630 本表示するためには、630 x 27.2 = 17,136 マイクロ秒/フレーム 必要です。17,136 マイクロ秒/フレーム は 0.017136 秒/フレーム つまり 1/0.017136 フレーム/秒 です。
1 / (0.017136 秒/フレーム ) = 58.4 フレーム/秒
マニュアルに垂直同期速度が 58.4 Hz と書かれていた場合、若しくは 58.4 Hz が ディスプレイの垂直同期可能な周波数帯域にある場合は問題ありません。ディスプ レイがこの速度を扱えない場合は、全ての数字を比例させてフレーム当たりの線の 本数を変更しなければいけません。
さて Xconfig のテスト構成を作成するために解像度とクロックを合わせて水平と 垂直の調整数値を組合せましょう。定義する行は次のようになります。
"800x600" 40 800 868 1020 1088 600 603 609 630
これで XFree86 の構成が出来上がりました。ここでいくつか仮定したことがとて もふさわしくなくてうまく動作しない場合があるかもしれませんが、ほとんどの場 合少なくとも安定した表示ができるようになります。さあ、快適にするためにちょ っとした実験をやってみましょう。
実際の計算
私のアダプターカードが 40 MHz の水晶発信子を搭載しているので、周波数を 40 MHz から始めましょう。私のディスプレイの最高水平同期周波数が 37 KHz ならば、 線当りの最小ドットクロックは 40,000,000/37,000 = 1081 になります。私のディ スプレイの垂直同期周波数は 50 Hz から 90 Hz までの範囲です。
私のディスプレイのマニュアルによれば最大の水平同期信号は 3.92 マイクロ秒で す。ドット当り 0.025 マイクロ秒の場合、信号は
(3.92 マイクロ秒) / (.025 マイクロ秒/ドット) = 156.8 ドット になります。
これを最も近い 8 の倍数に切り上げて、160 ドットにしてください。
またマニュアルによれば最後に輝いたドットと同期信号の始まりの間に最低 0.67 マイクロ秒間隔を置くべきと解説しています。 40 MHz の時 0.67 マイクロ秒で出 せるドット数 D( 40 MHz は .025 マイクロ秒/ドットであることを覚えていてく ださい)は
D ドット = (0.67 マイクロ秒) / (.025 マイクロ秒/ドット) = 26.8 ドット になります。
26.8 は 8 の倍数ではないので、32 ドットに切り上げて下さい。
私のディスプレイのマニュアルによれば同期信号の後の間隔を 3.56 マイクロ秒か それ以上置くべきであると書いています。3.56 マイクロ秒でのドット数 D は
D ドット = (3.56 マイクロ秒) / (.025 マイクロ秒/ドット) = 142.4 ドット
8 の倍数になるように 142.4 を 144 に切り上げて下さい。
水平線のために 800 の輝くドット、輝くドットと同期信号の間に 32 ドット、同 期信号のための 152 ドット、同期信号の後に 144 ドットがあります。
800 + 32 + 160 + 144 = 1136
1 本の線に 1136 ドット使っています。これは前に計算した 1088 より大きいです が、1088 は線を作るドット数の *最小の* 数であることを思い出して下さい。で すから線当り 1136 ドットは第一歩としてはいいところでしょう。
Xconfig に記入する数値は、次のように
"800x?" 40 800 (800+32) (800+32+160) (800+32+160+144)...
または
"800x?" 40 800 832 992 1136... としましょう。
.025 マイクロ秒/ドットで 1136 ドットの線を引くということは 1136 x .025 = 28.4 マイクロ秒掛かることを表しています。
水平解像度に 800 ドット/本 を決めたので、垂直解像度に 600 本/フレームを決 めましょう。
私のディスプレイのマニュアルによると垂直同期信号は最低 64 マイクロ秒必要と 書いています。 64 マイクロ秒で線を引くと本数は
(64 マイクロ秒/同期信号) / (28.4 マイクロ秒/本) = 2.25 本/同期信号 となります。
垂直同期信号のために 2.25 を 3 本に切り上げて下さい。
マニュアルによれば最後に表示した線と同期信号の開始点の間に最低 318 マイク ロ秒、同期信号の終了後の遅延を最低 630 マイクロ秒の間隔を置くように書かれ ています。それぞれの区間で何本、線が引けるかを次に計算します。
(318 マイクロ秒) / (28.4 マイクロ秒/本) = 11.20 本
(630 マイクロ秒) / (28.4 マイクロ秒/本) = 22.18 本
同期信号の前の間隔を 12 本、後の間隔を 23 本に丸めます。これで垂直調整の数 値が決定しました。
600 (600+12) (600+12+3) (600+12+3+23)
すなわち
600 612 615 638 となります。
このフレーム周波数がディスプレイの能力に合っていることを確かめるため、フレ ーム周波数が、 28.4 マイクロ秒/本の時 638 本/フレームは 18,119 マイクロ秒/ フレームであり、55.19 フレーム/秒になることを確認してください。私のディス プレイは 50 Hz から 90 Hz までの全ての周波数を扱えるので問題ありません。
解像度、クロック、水平方向と垂直方向の調整数値を Xconfig ファイルのビデオ モードの行に次の様に記入して下さい。
"800x600" 40 800 832 992 1136 600 612 615 638
これが私が試した最初のビデオモードです。ちらつきがひどすぎて、とても満足で きるものではないので止めました。この設定の調整数値を上げたり下げたりする例 を次から説明します。ちらつきと解像度の間の折り合いをつけて最終的に "784x614" に設定しました。
ほとんど全てのクロックの周波数は 40 MHz であることに注意してください。実験 を通してより高い周波数は私のアダプターカードの能力を超えており、より低い周 波数は私の望む解像度を与えるものではないということが分かりました。
例 : 私が試した数値です :
# 次の行は動くけれど中心から右に寄っています。
"752x564" 40 752 784 944 1088 564 567 569 611
# 44.5 752 792 976 1240 564 567 570 600
#
# この行は前の行であった問題を修正したものです。
#"752x564" 40 752 816 976 1088 564 567 569 611
#
# 垂直方向の表示の大きさを増やしてみましょう、これは動作します。
#"752x614" 40 752 816 976 1088 614 617 619 661
#
# 水平方向の表示の大きさを増やしてみましょう、これは動作します。
#"784x564" 40 784 816 976 1088 564 567 569 611
#
# 次も動きますが、中心から右に寄っています。
#"784x614" 40 784 816 976 1088 614 617 619 661
#
# 直前の例の中心にきていない問題を修正したものです。
"784x614" 40 784 848 1008 1088 614 617 619 661
#
# 表示の大きさを増やしてみましょう
# 次も動きますが、中心からわずかに左に寄っています。
#"800x614" 40 800 864 1024 1088 614 617 619 661
#
# 直前の設定の中心にきていない問題を修正したものです。
"800x614" 40 800 864 1024 1104 614 617 619 661
#
# 表示の大きさを増やしてみましょう、これは動作します。
"816x614" 40 816 880 1040 1120 614 617 619 661
#
# 表示の大きさを増やしてみましょう、これは動作します。
"800x620" 40 800 864 1024 1104 620 623 625 661
#
# 表示の大きさを増やしてみましょう、これは動作します。
"816x620" 40 816 880 1040 1120 620 623 625 661
#
# 表示の大きさを増やしてみましょう、これは動作します。
"832x630" 40 832 896 1056 1136 630 633 635 661
#
# 表示の大きさを変えました、動きますが激しくちらつきます。
"848x618" 40 848 912 1072 1152 618 621 623 661