top page > X Window System > here

PC-98 における X.Org 7 系 (driver)


概要

ここでは PC-98 のための各々の driver の使用例について詳しく述べます.


目次

1. PC-98 における X の特徴
2. mga
3. trident
4. cirrus
5. savage

1. PC-98 における X の特徴

ビデオボードの初期化などに関して PC-98 に共通する特徴は以下の通り.

  1. Video BIOS は動作しない.
    初期化や情報の取得に Video BIOS が使われる場合には,xorg.conf にて Int10off にする必要がある.
    それなしで済む場合もあるが,それは int 10 が使われていないとか幸運にも致命的なエラーに至らないからに過ぎない.
  2. console 画面はビデオボードの機能 (VGA) を使わずに表示している.
    (ビデオボードは,VGA を disable にできることが PC-98 で使える必要条件です.)

モニターとのデータのやり取りに関して PC-98 に共通する特徴は以下の通り.

  1. DDC2 は,Ra20 のように「抜いちゃダメ」な trident を介してモニターのケーブルを接続する場合には正しく動作しない.
    (console 画面は見られなくなりますが,mga の出力に直接モニターのケーブルを接続すると動作します.)
    Rv20 のように「抜いちゃダメ」なボードがない機種では,正常に動作する.
  2. Video BIOS Extension (vbe) は動作しない. module vbe が使われる状況では,xorg.conf にて Int10off にする必要がある. (これはあくまでエラー回避のためであり,vbe が動作しないことに変わりはない.)

2. mga

mga driver による表示画面の切り換えは DDC, VBE を実行した後に行なわれます. それを DDC, VBE の前 (MGAdoDDC() の直前) に行なうようにしても DDC2 は使えませんでした.

xorg.conf は次のようにします.

Section "Device"
   Identifier "MGA Millennium I"
   Driver     "mga"

#  Option     "NoDDC"       ← DDC 関連はあくまで試験用.
#  Option     "NoDDC1"
#  Option     "NoDDC2"

#  Option     "Int10"  "off""

   Option     "DRI"    "off""

   BusID      "PCI:0:14:0"  # for Rv20
#  BusID      "PCI:0:16:0"  # for Ra20
Endsection

Rv20 では DDC2 (xf86DoEDID_DDC2) によりモニターの情報が取得できています. この場合,Option "Int10" "off"" は不要です.

(WW) MGA(0): Could not retrieve video BIOS!    ← PC-98 なので,これで正しい.
(--) MGA(0): VideoRAM: 4096 kByte
(II) MGA(0): I2C bus "DDC" initialized.
(II) MGA(0): I2C device "DDC:E-EDID segment register" registered at address 0x60.
(II) MGA(0): I2C device "DDC:ddc2" registered at address 0xA0.
(II) MGA(0): I2C Monitor info: 0x2871e000
(ここで取得したモニターの情報が xf86PrintEDID() により出力される.)
(II) MGA(0): end of I2C Monitor info           ← この後に vbe は load されない.
(II) MGA(0): EDID vendor "ENC", prod id 6177   ← 以下,xf86SetDDCproperties() の出力が続く.
(II) MGA(0): Using hsync ranges from config file
(II) MGA(0): Using vrefresh ranges from config file
(II) MGA(0): Printing DDC gathered Modelines:
(II) MGA(0): Modeline "1280x1024"x0.0  108.00  1280 1328 1440 1688  1024 1025 1028 1066
    +hsync +vsync (64.0 kHz)
(xf86SetDDCproperties() の出力の終りまで略)
(==) MGA(0): Using gamma correction (1.0, 1.0, 1.0)

一方,Ra20 では DDC2 によりモニターの情報が取得できません. 次いでそれを VBE (vbeDoEDID()) によって試みますが,それも失敗します. Rv20 でも "NoDDC" にすれば同じ結果になります. この場合,Option "Int10" "off"" が必要ですが,それなしでも致命的なエラーにはなりません.

(WW) MGA(0): Could not retrieve video BIOS!
(--) MGA(0): VideoRAM: 4096 kByte
(II) MGA(0): I2C bus "DDC" initialized.
(II) MGA(0): I2C device "DDC:E-EDID segment register" registered at address 0x60.
(II) MGA(0): I2C device "DDC:ddc2" registered at address 0xA0.
(II) MGA(0): I2C Monitor info: 0x0     ← ddc2 が失敗したので 0 である.
(II) MGA(0): end of I2C Monitor info   ← 即座に終わる.
PC-98 では xf86DoEDID_DDC1() は実行されない.
(II) Loading /usr/local/lib/xorg/modules//libvbe.so
(II) Module vbe: vendor="X.Org Foundation"
        compiled for 1.6.0, module version = 1.1.0
(II) Loading /usr/local/lib/xorg/modules//libint10.so   ← vbe が使う.
(II) Module int10: vendor="X.Org Foundation"
        compiled for 1.6.0, module version = 1.0.0
(II) MGA(0): initializing int10
Int10 が off ならば,以下の 3 行は出力されない.
(==) MGA(0): Write-combining range (0xa0000,0x20000) was already clear
(==) MGA(0): Write-combining range (0xc0000,0x40000) was already clear
(EE) MGA(0): Cannot read V_BIOS (3) Function not implemented
Int10 の on/off に依らず,vbe もモニターの情報の取得に失敗する.
xf86SetDDCproperties() からも,何も実行されずに戻る.
(==) MGA(0): Using gamma correction (1.0, 1.0, 1.0)

mga driver 1.6.2 (そしておそらくそれ以後) においては,xorg.conf に以下の内容を加える必要があります.

Section "Module"   ← 既に存在するなら,新設する必要はない.
   Load  "xaa"
EndSection

そうでないと,log に以下のように出力されて X server が終了してしまいます.

/libexec/ld-elf.so.1: /usr/local/lib/xorg/modules/drivers/mga_drv.so: Undefined symbol "XAACreateInfoRec"
xinit: giving up

3. trident

trident driver は DDC2 が使えない,PC-98 では DDC1, VBE が使えない,というわけでモニター情報の取得はできません. vbe, int10 は必ず load されるので,Option "Int10" "off"" は必須です.

trident driver を TGUI9682 にて用いる場合,以下に赤い文字で示した Option を書き加える必要があります.

Section "Device"
   Identifier "NECTrident"
   Driver     "trident"

   Option     "Int10"  "off""

   Option     "NoPciBurst"
   Option     "XaaNoScreenToScreenCopy"
   Option     "XaaNoCPUToScreenColorExpandFill"
   Option     "XaaNoScanlineCPUToScreenColorExpandFill"
   Option     "XaaNoScreenToScreenColorExpandFill"

   BusID      "PCI:0:8:0"
Endsection

これらの意味に関しては,X on PC-98 の 3 節README98 の 4.4.1 を御覧下さい.(4.4.2 も併せて.)
(注 : これはあくまで XFree86 の文書であり,X.Org 7 系にはこれに対応する文書はありません.)

log の関連部分は次のようになります.

(II) Loading /usr/local/lib/xorg/modules//libvbe.so
(II) Module vbe: vendor="X.Org Foundation"
        compiled for 1.6.0, module version = 1.1.0
(II) Loading /usr/local/lib/xorg/modules//libint10.so
(II) Module int10: vendor="X.Org Foundation"
        compiled for 1.6.0, module version = 1.0.0
(II) TRIDENT(0): initializing int10
("Int10" "off" しないと,以下の 2 行を出力した時点で server が止まります.)
(==) TRIDENT(0): Write-combining range (0xa0000,0x20000) was already clear
(==) TRIDENT(0): Write-combining range (0xc0000,0x40000) was already clear

4. cirrus

環境は FreeBSD 4.10 + XFree86 4.4.0 です.
XF86Config は次のようにします. module vbe, int10 は load されないので Option "Int10" "off" は不要です.

Section "Device"
   Identifier "CLGD7555"
   Driver     "cirrus"

   BusID      "PCI:0:3:0"
Endsection

二箇所で (EE) が出ていますが,動作への影響はありません.

(--) PCI:*(0:3:0) Cirrus Logic GD 7555 Flat Panel GUI Accelerator rev 0, Mem @ 0xfe000000/24

(EE) CIRRUS(0): No valid MMIO address in PCI config space   ← Option "noMMIO" はここに間に合わない.
(--) CIRRUS(0): Not Using MMIO

(II) Loading /usr/X11R6.7/lib/modules/libi2c.a   ← I2C の load を抑制する Option はない.
(--) CIRRUS(0): Not Using MMIO
(II) Module i2c: vendor="The XFree86 Project"
        compiled for 4.4.0, module version = 1.2.0
(II) Loading /usr/X11R6.7/lib/modules/libddc.a
(II) Module ddc: vendor="The XFree86 Project"
        compiled for 4.4.0, module version = 1.0.0
(EE) CIRRUS(0): I2C initialization failed

(**) CIRRUS(0): *Mode "800x600": 49.5 MHz, 46.9 kHz, 75.0 Hz
(**) CIRRUS(0):  Mode "800x600H": 56.3 MHz, 53.7 kHz, 85.1 Hz

5. savage

一般に配布されている savage driver は PC-98 では動作しません. 以下の記述は,当方で独自にソースを修正した driver を用いたものです.

現在の到達点は以下の通り. ビデオボードに関しては,対応できているのは I-O Data 製のものだけです.

  1. GA-SV408/PCI (savage4, VRAM 8MB), GA-STV8/PCI (savage4, VRAM 8MB) は動作している.
  2. GA-SV432/PCI (savage4, VRAM 32MB) は動作している.
  3. GA-S2K32/PCI (savage2000, VRAM 32MB) は動作している.

PC 側から VRAM の情報を取得することができないので,VRAM が二通りある savage4 のボードに対しては私の手持ちのボードから得られる諸々の情報からそれを推測しております. (この推測がうまく行かない場合には,driver の中で VRAM を規定すれば済む話ですが.)

また PC 本体に関しては,「抜いちゃダメ」なボードの有無で動作が少し異なります.

  1. 「抜いちゃダメ」なボードを持たない Rv20 では問題なく動作している.
  2. 「抜いちゃダメ」な Trident ボード を持つ Ra20, Ra40 では,depth 24 にすると画面が真っ黒になります. これは表示の問題であり,X 等は落ちておりません.
    (先ず Windows を起動し,「再起動」のような電源を off にしないやり方で Windows を終了し,「固定ディスク起動メニュー」等を利用して FreeBSD を起動すれば,この問題は生じません. すなわち,driver によるボードの初期化の何かが間違っているまたは足りないということです.)
  3. 「抜いちゃダメ」な Mystique ボードを持つ ValueStar 等は,所持していないので動作を確認できない.

xorg.conf は次のようにします.

Section "Device"
   Identifier "GA-SV408/PCI"
#  Identifier "GA-SV432/PCI"
#  Identifier "GA-S2K32/PCI"
   Driver     "savage"

   Option     "Int10"   "off"
   Option     "UseBIOS" "off"
   Option     "DRI"     "off"

   Option     "sw cursor"

   BusID      "PCI:0:14:0"  # for Rv20   ← どの PCI Bus に挿しているかによります.
#  BusID      "PCI:0:16:0"  # for Ra20
Endsection

"UseBIOS" "off" を指定しなくても,PC-98 では video BIOS は使えないため,同じ結果になります.

(EE) SAVAGE(0): Failed to fetch any BIOS modes.  Disabling BIOS.

この出力の直後に自動的に UseBIOSoff にされます.

Rv20 では DDC2 (xf86DoEDID_DDC2) によりモニターの情報が取得できています.

(--) SAVAGE(0): No DDC signal
(II) SAVAGE(0): I2C bus "I2C bus" initialized.
(II) SAVAGE(0): I2C device "I2C bus:E-EDID segment register" registered at address 0x60.
(II) SAVAGE(0): I2C device "I2C bus:ddc2" registered at address 0xA0.

(II) SAVAGE(0): Manufacturer: ENC  Model: 1821  Serial#: 16843009

(--) SAVAGE(0): Detected current MCLK value of 150.341 MHz
(EE) SAVAGE(0): Failed to fetch any BIOS modes.  Disabling BIOS.

(==) SAVAGE(0): Using video BIOS to set modes
(II) Loading /usr/local/lib/xorg/modules//libvbe.so
(II) Module vbe: vendor="X.Org Foundation"
        compiled for 1.6.0, module version = 1.1.0
        ABI class: X.Org Video Driver, version 5.0
(II) Loading /usr/local/lib/xorg/modules//libint10.so
(II) Module int10: vendor="X.Org Foundation"
        compiled for 1.6.0, module version = 1.0.0
        ABI class: X.Org Video Driver, version 5.0
(II) SAVAGE(0): initializing int10
(**) SAVAGE(0): Option "int10" "off"

(II) Reloading /usr/local/lib/xorg/modules//libint10.so
(II) SAVAGE(0): initializing int10
(**) SAVAGE(0): Option "int10" "off"

Ra20 では DDC2 によりモニターの情報が取得できていません. GA-SV408 の出力にモニターを直接繋げば,DDC2 に関しては Rv20 と同じ動作になります. (当然ですが,そうした場合には console 画面は表示されません.)

GA-S2K32/PCI はデジタル出力端子から信号が出ておりません.[1] マニュアルにも「DVI 端子は PC-98 シリーズでは使用できません」と明記されておりますから,当然と言えば当然ですが. ただまあ,どこかのフラグを立てれば X の画面だけはデジタルでも出力される気がします. とはいえ,console 画面はアナログでしか出力されませんから運用が面倒そうです. モニターにアナログ,デジタルの二系統の入力端子があって,それらをモニター側で手動で切り換えられるような環境とかになれば,追求する気になるのですが.

他のボードは,デジタル出力端子のコネクタに合うケーブルを所持していないので試せません. そのうち調達します.

なお,この savage driver は VRAM が 8MB でも 32MB でも,X server と合わせて PC の RAM を 100MB 以上使用します. (参考までに,mga driver なら 30MB 程です.)

[1] AT 互換機においては console, X ともにデジタル信号も出ています.

(補足) ごく稀にですが,X server を立ち上げると,今まではうまく行っていたのに突然

(EE) device not fond

となって失敗することがあります. このエラーは本来は driver の指定を誤った際に生じるものです. 一度この状態になると,何度やり直しても同じエラーが繰り返されるだけです.

こうなった場合には,その PC-98 で Windows を立ち上げるか,そのボードを AT 互換機に挿し換えて X.Org を立ち上げるかすれば,元のように PC-98 + X.Org で使えるようになります. (自前の修正におけるボードの初期化の部分に何かが足りないことが原因でしょう.)

Savage 2000 と Savage 4 とを比較すると,総じて前者が速いです. ただし動画に関しては,Savage 2000 の方は driver がハードウェア再生をサポートしていないので,Savage 4 の方が滑らかです. いずれにしても,動画の再生は PC-98 ではかなり苦しいです.
(注) Savage 2000 は,ハードウェアとしては動画再生機能を持っております. 今の driver からはそれを使うことができないのです. この先,driver がそれをサポートしてくれればうれしいのですが.

% man savage
NAME
       savage - S3 Savage video driver
(中略)
      savage  is  an  Xorg  driver for the S3 Savage family video accelerator
       chips.  2D, 3D, and Xv acceleration is supported on  all  chips  except
       the  Savage2000  (2D only).