  Linux XFree-to-Xinside mini-HOWTO
  by Marco Melgazzi, marco@techie.com
  v1.3, September 1997
  JF Project, JF@linux.or.jp
  v1.3j, September 1997

  XFree86 のモードラインを XInside/XiGraphics のモードラインに変換する方
  法。
  ______________________________________________________________________

  目次

  1. はじめに
  2. モード変換がなぜ必要か？
  3. やってみよう！
  4. Fixing up things
  5. 最後に...
  6. 手順の自動化
  7. 謝辞
  8. 著作権について
     8.1 日本語訳について

  ______________________________________________________________________

  1.  はじめに

  1996年の春、ニュースグループ comp.os.linux.x には XFree86 と X の商用
  版である XInside との間でビデオモードをどのように変換すればいいかとい
  う質問が数多く投稿されていました (XInside は現在 XiGraphics という名称
  に変更されています。ただ、この文書では古い商品名の方を使っています。私
  が解説しているのは主に XInside の方だからです)。

  XInside が製品として発表される前に私はモニターをやっていたので、その評
  価版がまだ私のハードディスク上に残っていました。問題を解決するのが好き
  な私は、この問題に取り組んでみようと思い、2, 3 時間いろいろいじって計
  算をし、ある程度の成果が出たことから、それをすぐにニュースグループに投
  稿しました。

  モードライン変換についての議論自体は間もなく消えてしましましたが、それ
  でも私は自分の投稿に対する一通の感謝のメールを受取りました。それゆえ、
  おそらくこの先、また他の誰かがこの情報を必要とするかもしれないと思い、
  その時の投稿を mini-HOWTO にまとめようと決意しました。それが、いまあな
  たの読んでいるこの文書です。

  まず最初にいくつか述べさせてください。私は、XInside の関係者ではありま
  せん。私が使ったのは XInside の Linux 用評価版 v1.2 だけですが、最近で
  は (1997年5月現在)、AccelX のバージョンは 3.1 になっています。ただ、こ
  の文書に記載した情報は、たとえ最新版にそのまま当てはまるわけではなくて
  も、今も有効だと思っています。

  この HOWTO は非常に古い XInside のバージョンに基づいて解説しているの
  で、記載した情報の一部は現在では必ずしも正確でないかもしれません。後述
  するように、XFree 3.2 が出たおかげで、私は商用の X サーバを購入しませ
  んでした。商用サーバを購入された方で、本書に不正確な情報があることに気
  づかれた方は、是非私にメールで教えてください。

  注意すべきなのは、モニタのタイミングをいじるというのは思わぬ事故や故障
  につながるということです。それゆえ、私としては一切の保証はできません。
  上手くいけば問題ないですが、コンピュータが火を噴いたとしても私はその責
  任を負いません。

  私の名前から推測がつくかと思いますが、私の母国語は英語ではありません。
  おそらく英語の誤りがあちことにあるはずです。それについてはお詫びすると
  同時に、英語に関する叱責で私のメールボックスが溢れてしまうことがないよ
  う大目に見ていただければと思います。

  2.  モード変換がなぜ必要か？

  評価版 (および商用版 AFAIK) において、ビデオモードを自動で検出する
  (xvidtune のような) ユーティリティや、既存の XFree サーバのビデオモー
  ドをインポートするユーティリティを提供しない Xinside の方針は、理解に
  苦しみます。その作業を(手動で)行うのに、私は 3 時間掛りました (作業の
  ヒント： VESA 1024x768@70Hz のエントリに関する両者のフォーマットを比較
  します (電子工学のエンジニアみたい ;-) )。3 時間もあれば、Xinside のプ
  ログラマがきちんとした文書を書けるはずなのですが....

  私はバージョン 1.3 以降の評価版をダウンロードしていませんが、Xinside
  の関係者には是非こうした文書の不備を改善してほしいと考えています。とは
  いえ、そうした文書が出来たならばこの mini-HOWTO は無用になるとも思えま
  すが、それでも動作の仕組みに関して多少の理解を促進するものにはなるかと
  思われます。

  3.  やってみよう！

  既にあれこれいじり回した XFree86 モードがあり、それを Xinside にそのま
  ま移したいという状況であるとします。その場合、以下の手順を踏めば、それ
  を実現することが出来ます。ここでは私のデフォルトのビデオモードを実例と
  して、そのモードの変換方法を解説します。

  XFree86 のエントリは次のようになっています。

       Modeline "blahblah" DOTCLK  A B C D  a b c d

  A から D および a から d にはそれぞれ個別の意味があります。詳しくは、
  「The Hitchhiker's Guide to X386/XFree86 Video Timinig」
  (/usr/lib/X11/doc/VideoModes.doc) を見て欲しいのですが、基礎理論を知ら
  なくても変換自体は問題なく行うことが出来ます。

  私の /usr/lib/X11/XF86Config のモードラインは次のようなものです。

       Modeline "1168x876" 105  1168 1256 1544 1640  876 877 891 900
                            |     |    |    |    |    |   |   |   |
                         DOT_CLK  A    B    C    D    a   b   c   d

  Xinside では、エントリを Xtimings ファイルに追加して、そのファイルを
  etc/ に置く必要があります (ここからは、/usr/X11/lib/X11/AcceleratedX
  といった Xaccel のトップディレクトリを起点にして話を進めます)。

  !    Somewhere in the file, put here the name you want

  [PREADJUSTED_TIMING]
      PreadjustedTimingName = "1168x876 @ 72Hz";

  !
  !    These four are obvious
  !
      HorPixel          = 1168;         // pixels
      VerPixel          = 876;          // lines
      PixelWidthRatio   = 4;
      PixelHeightRatio  = 3;

  !
  !   hsync: DOT_CLK / D * 1000 [KHz]
  !
  !   hsync = 105 / 1640 * 1000 = 64.024 KHz
  !
  !   vsync: ( 1 / (( D / DOT_CLK ) * d) ) * 1,000,000 [Hz]
  !
  !   vsync: ( 1 / (( 1640 / 105 ) * 900) ) * 1,000,000
  !           ( 1 / 14057.1428571 ) * 1,000,000 = 71.138 Hz
  !

      HorFrequency      = 64.180;        // kHz
      VerFrequency      = 71.138;        // Hz

  !   Obvious

      ScanType          = NONINTERLACED;

  !
  !   Put here the +/-hsync +/-vsync XFree86 options
  !
      HorSyncPolarity   = POSITIVE;
      VerSyncPolarity   = POSITIVE;

  !   Shouldn't change

      CharacterWidth    = 8;             // pixels

  !   DOT_CLK here

      PixelClock        = 105.000;       // MHz
  !
  !
  !   horizontal timings section: [usec]
  !
      HorTotalTime  = D / DOT_CLK                  = 15.619;
      HorAddrTime   = A / DOT_CLK                  = 11.124;
      HorBlankStart = A / DOT_CLK                  = 11.124;
      HorBlankTime  = HorTotalTime - HorBlankStart =  4.495;
      HorSyncStart  = B / DOT_CLK                  = 11.962;
      HorSyncTime   = C / DOT_CLK - HorSyncStart   =  2.743;

   !
   !  vertical timings section:    [msec]
   !

      VerTotalTime  = ( HorTotalTime * d ) / 1000  = 14.057;
      VerAddrTime   = ( HorTotalTime * a ) / 1000  = 13.682;
      VerBlankStart = ( HorTotalTime * a ) / 1000  = 13.682;
      VerBlankTime  = VerTotalTime - VerBlankStart =  0.375;
      VerSyncStart  = ( HorTotalTime * b ) / 1000  = 13.698;
      VerSyncTime   = ( HorTotalTime * ( c - b ) ) / 1000
                                                   = 0.219
   ! Finished !

  。。。。

  4.  Fixing up things

  以下の記述の -> 記号は変更を施した個所を示しています。ファイルには書き
  込まないでください。

  Monitor エントリ (私の場合、monitors/mfreq/mfreq64.vda です)

           [ESTABLISHED_TIMINGS]
               "640x480 @ 60Hz",
               "640x480 @ 72Hz",
               "640x480 @ 75Hz",
               "800x600 @ 56Hz",
               "800x600 @ 60Hz",
               "800x600 @ 72Hz",
               "800x600 @ 75Hz",
               "1024x768 Interlaced",
               "1024x768 @ 60Hz",
               "1024x768 @ 70Hz",
               "1024x768 @ 75Hz",
           "1152x900 Interlaced",
               "1152x900 @ 60Hz",
               "1152x900 @ 67Hz",
       ->      "1168x876 @ 72Hz",
               "1280x1024 Interlaced",
               "1280x1024 @ 60Hz",
           "1600x1200 Interlaced";

  ビデオカード情報ファイル (私の場合は boards/s3/764-2.xqa ですが、
  Hercules カードはほとんど全部を対応しているのに、どうして私の
  Terminator 64/Dram だけが抜けているのか不思議です)

  [VISUAL]
      BitsPerPixel   = 8;
      MemoryModel    = Packed;
      ColorModel     = Indexed;
      BitsRGB        = 6;
      NumberOfColors = 256;

      [RESOLUTIONS]
      640x480,
      800x600,
      1024x768,
  ->  1168x876,
      1152x900,
      1280x1024

      [DESKTOPS]
      640x480,
      800x600,
      1024x768,
      1152x900,
  ->  1168x876,
      1280x1024,
      1600x1200

  もしドットクロックが充分低いなら (私のビデオカードはそれほど低くないの
  ですが)、エントリーを 16bpp と 32bpp sections に置くこともできます。

  /etc/Xaccel.ini は以下のようになっているでしょう。

       --------------------------------------------------------------
           Board   = "s3/764-2.xqa";
           Monitor = "mfreq/mfreq64.vda";
           Depth   = 8;
       ->  Desktop = 1168x876;

           [RESOLUTIONS]
       ->      1168x876,
               1024x768;

  etc/Xtimings にある実際の Xinside モードエントリは次のようなものです。

  --------------------------------------------------------------
  [PREADJUSTED_TIMING]
      PreadjustedTimingName = "1168x876 @ 72Hz";

      HorPixel          = 1168;          // pixels
      VerPixel          = 876;           // lines
      PixelWidthRatio   = 4;
      PixelHeightRatio  = 3;
      HorFrequency      = 64.024;        // kHz
      VerFrequency      = 71.138;        // Hz
      ScanType          = NONINTERLACED;
      HorSyncPolarity   = POSITIVE;
      VerSyncPolarity   = POSITIVE;
      CharacterWidth    = 8;             // pixels
      PixelClock        = 105.000;       // MHz
      HorTotalTime      = 15.619;        // (usec) =  205 chars
      HorAddrTime       = 11.124;        // (usec) =  146 chars
      HorBlankStart     = 11.124;        // (usec) =  146 chars
      HorBlankTime      =  4.495;        // (usec) =   59 chars
      HorSyncStart      = 11.962;        // (usec) =  157 chars
      HorSyncTime       =  2.743;        // (usec) =   36 chars
      VerTotalTime      = 14.057;        // (msec) =  900 lines
      VerAddrTime       = 13.682;        // (msec) =  876 lines
      VerBlankStart     = 13.682;        // (msec) =  876 lines
      VerBlankTime      =  0.375;        // (msec) =   24 lines
      VerSyncStart      = 13.698;        // (msec) =  877 lines
      VerSyncTime       =  0.219;        // (msec) =   14 lines

  Xinside サーバが走っている間、パラメータ無しで vgaset プログラムを走ら
  せて、あなたの変換をチェックすることができます：これで、XFree の時のよ
  うなラインを出力してくれるでしょうし、もし全てうまく行っていれば、この
  ラインはあなたの最初のラインと等しいでしょう(ただし、もし b と c が等
  しければ、私は Xinside でこの状況を確認することができませんでした：最
  も良い場合は c=b+1 の時でした)

  5.  最後に...

  これで全部です。この文書があなたの役に立つことを期待しています。近い将
  来、私が XiGraphics サーバを買うことはないでしょう。というのも、
  XFree86 3.2 がリリースされたことで、私が使っている Trio 64 ビデオカー
  ドでも充分なテキスト表示速度が出るようになったからです。

  とはいえ、XiGraphics サーバがサポートするチップセットとビデオカードは
  XFree86 よりもずっと幅広いので、商用サーバを使うしか手がない場合もある
  でしょう。そうした場合、XiGraphics サーバを購入したなら、この文書の情
  報が役に立ったか、難しすぎたか等の感想を知らせていただけたらと思いま
  す。

  6.  手順の自動化

  以下のスクリプトを使うと、手順の大半を自動化出来ます。ScanType と 2 つ
  の Polarity line には充分注意してください。このスクリプトはそれらの設
  定は行わないので、適切な訂正をしないとモニタが火を噴く可能性が高まりま
  す。

  私は Xinside において "Doublescan" フラグが意味を持っているかどうか知
  りません。それゆえ、もし低解像度の doublescan モードに変換しようとする
  場合は、注意してください。リフレッシュレートが二倍になってしまうので、
  モニタがすぐに壊れてしまいます (実際、私の場合 400x300@72Hz が
  400x300@144Hz になってしまいました！)。

       #!/bin/sh
       ##########################################################################
       # XF2XInside
       #
       # このスクリプトは、XF86Config フォーマットの modeline を XInside の
       # フォーマットに変換するものです。これは etc/Xtiminig ファイルで必要
       # とされるものです。
       #
       # やっつけ仕事なので、エラーチェックはほとんどしません
       # (ユーザフレンドリでないなどと言わないでください)。
       #
       # 引数なしで実行すると、使い方を表示します。
       #
       #                               ( July 1996, hcz@tazlwurm.bb.bawue.de)
       #
       # Btw: この HOWTO の記載どおりに作成された新しいモードは、問題なく
       # 機能するのですが、Xsetup のメニューが表示されません。
       # なぜだか知ってる人います？
       #
       ##########################################################################
       #----------------------------------------------- ここから：
       # 以下をあなたの modeline ファイルの置場所に応じて編集してください
       XF=/usr/X11/lib/X11/XF86Config
       if [ $# -ne 1 ] ; then
         echo "usage: ${0##*/} <mode>"
         echo " example: ${0##*/} 1024x764"
         echo -e " function: converts $XF modeline entry into\n Xinside Format (stdout)"
         exit 1
       fi
       egrep -i "^[\t ]*modeline.+\"$1\""  /usr/X11/lib/X11/XF86Config |
       gawk '
       NF < 11  { print "! invalid Modeline:\n! " $0 "\n!"; next }
       {
         print "//", $0  ":"
         name = $2
         DOT_CLK = $3;
         A = $4;
         B = $5;
         C = $6;
         D = $7;
         a = $8;
         b = $9;
         c = $10;
         d = $11;
         VerFrequency =  1000000 / ((D / DOT_CLK) * d)
         print "[PREADJUSTED_TIMING]"
         printf "  PreadjustedTimingName = \"%dx%d @ %.0dHz\";\n", A, a, VerFrequency
         print "  HorPixel\t\t= " A ";"
         print "  VerPixel\t\t= " a ";"
         print "  PixelWidthRatio\t= 4;\n  PixelHeightRatio\t= 3;"
         print "  HorFrequency\t\t= " DOT_CLK / D * 1000 ";\t// kHz"
         print "  VerFrequency\t\t= " VerFrequency  ";\t// Hz"
         print "  ScanType\t\t= NONINTERLACED;\t\t// *CHECK*"
         print "  HorSyncPolarity\t= NEGATIVE;\t\t\t// *CHECK*"
         print "  VerSyncPolarity\t= NEGATIVE;\t\t\t// *CHECK*"
         print "  CharacterWidth\t= 8;"
         print "  PixelClock\t\t= " DOT_CLK ";"
         HorTotalTime = D / DOT_CLK
         print "  HorTotalTime\t\t= " HorTotalTime ";"
         print "  HorAddrTime \t\t= " A / DOT_CLK ";"
         print "  HorBlankStart\t\t= " A / DOT_CLK ";"
         print "  HorBlankTime\t\t= " D / DOT_CLK - A / DOT_CLK ";"
         print "  HorSyncStart\t\t= " B / DOT_CLK ";"
         print "  HorSyncTime\t\t= " C / DOT_CLK - B / DOT_CLK ";"
         VerTotalTime  = ( HorTotalTime * d ) / 1000
         print "  VerTotalTime\t\t= " VerTotalTime ";"
    print "  VerAddrTime\t\t= " ( HorTotalTime * a ) / 1000 ";"
    VerBlankStart = ( HorTotalTime * a ) / 1000
    print "  VerBlankStart\t\t= " VerBlankStart ";"
    print "  VerBlankTime\t\t= " VerTotalTime - VerBlankStart ";"
    print "  VerSyncStart\t\t= " ( HorTotalTime * b ) / 1000 ";"
    print "  VerSyncTime\t\t= " ( HorTotalTime * ( c - b ) ) / 1000
    print ""
  }'

  7.  謝辞

  o  Heike Claudia Zimmerer, <hcz@tazlwurm.bb.bawue.de> は、記述の矛盾を
     指摘すると同時に、作業の大半を自動化するスクリプトを送ってくれまし
     た。

  o  Bartosz Maruszewski, <B.Maruszewski@zsmeie.torun.pl> は、この文書を
     ポーランド語に翻訳するとともに、typo の指摘をしてくれました。

  8.  著作権について

  (c)opyright 1996-7 by Marco Melgazzi (marco@techie.com) -

  この文書には、GPL (GNU Public License) が適用されます。GPL のコピーを
  入手するには、Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
  MA 02139, USA に手紙を書いてください。

  各商標は、その所有者が権利を有しています。この文書に記載した情報につい
  ては、その正確さ・有用性について如何なる保証もありません。

  8.1.  日本語訳について

  日本語訳：はら <hara@access.co.jp> (1997/01/27)
  校正    ：千旦裕司 <ysenda@pop01.odn.ne.jp> (2001/10/06)

