概要
対象は次のようなものです.
- PC-98 (とはいえ AT 互換機と共通の情報も多いです.)
- XFree86 の 4 系,X.Org の 6 系,7 系
- FreeBSD は 4 系までは FreeBSD(98),5 系以降は FreeBSD/pc98
概要
対象は次のようなものです.
目的は次のようなものです.
目次
修正の必要性の有無にかかわらず,先ず ports/packages そのままの状態で install しておく方が合理的です. 少なくともソース等の修正を要する部分だけは packages でなく ports を使って install します.
ここで言う「修正」とは,X のソースだけでなく,FreeBSD の側が設定した種々の選択の変更も含みます. X のソースの修正は,その動作に問題がある場合に必要になります. また設定の変更は,導入されるものを変えたい場合などに必要になります.
PC-98 にて動作する X Window System の状況は,ソース等に添付される文書 README98 に書かれています. これは本来は install の際に /usr/X11R6/lib/X11/doc/Japanese/ に置かれます. しかし,FreeBSD の X Window System のメンテナーの方が ports/packages を作成する際にこれを意識的に収録するような選択をしない場合,このファイルはありませんし Japanese という directory すら作成されません. 収録の状況は以下の通りです.
このファイルを得るためには,次の節にて配布する patch を取得していただき,そこに記された修正を加え,ports を使って X Window System の一部を再度 install する必要があります. (当然,X.Org 7 系を除く.)
先にも書きましたが,FreeBSD 独自の修正がされている可能性があります. ports を利用すれば,それも自動的に反映されます.
ここに修正作業に必要なマニュアルとファイルを置きます.
→ x98patch.tgz
この中には以下の 5 組の patch が入っています.
(X.Org 7.7 用のものはさらに小分けしています.)
通信環境の差異も含めて作業の手順は同封の文書 (README) に書いておきました.
X.Org 7 系は FreeBSD 7.2 を導入したのを契機に使い始めたのですが,うちではこれを PC-9821 La13 に導入できません.[1] したがって,X.Org 7.4, 7.5 用の cirrus のための patch は動作試験なしのものです.[2]
[1] FreeBSD/pc98 の 5 系あたりからですが,network card が使えなくなりました. (もちろん,その気になれば他に手段はあります.) そのことと,うちに余分の HDD がないことから,PC-9821 La13 は FreeBSD(98) 4.10 を使い続けています.
[2] 2011.10.22 に,X.Org に送っていた patch が採用されました. 変更は xf86-video-cirrus-1.4.0 にて反映されます. ただし,これも動作試験なしのものです. (試験は行う予定ですが,そのためには先ず OS を更新しないと...)
ソースは大量にありますが,注目すべきは driver でしょう. XFree86 や X.Org 6 系では,以下のところにあります.
xc/programs/Xserver/hw/xfree86/drivers/*/*_driver.c
これらのうち PC-98 をサポートしているものは,次のようにして探せます.
% grep IsPc98 */*_driver.c
また,X.Org 7 系では,ports/x11-drivers/ の各々の driver にて make すれば,そのソースが得られます.
動作するしないは,driver だけでなく server 側の問題である場合もあるので御注意下さい.
FreeBSD による独自の修正は,XFree86 や X.Org 6 系では
/usr/ports/x11-servers/XFree86-4-Server/files/ /usr/ports/x11-servers/xorg-server/files/
等にある patch file(s) により行なうので,ここから修正の有無や内容を知ることができます.
また,X.Org 7 系では,それは ports の各々の driver のところにあります.
PC-98 に関連する部分は,それらを % grep IsPc98 で見れば状況が分かります.
PC-98 にて X を動かす場合には,AT 互換機用のソースに次のような操作を追加する必要があります.
XFree86 3 系から 4 系に移行する際に,driver の諸関数の機能の分け方や名前の付け方に指針ができ,ソースが見易くなりました. ただし,細かい部分までは統一されていないので,複数の driver のソースを比較しながらの解読はなおも容易ではありません.
基幹となる driver のソースは *_driver.c のように命名されています. 少なくともこのファイルに対しては PC-98 のための修正が必要になります. mga_driver.c では次のようになっています. (提示するのは話題にしている部分だけです.)
MGAModeInit() { vgaHWProtect(pScrn, FALSE); if (xf86IsPc98()) { if (pMga->Chipset == PCI_CHIP_MGA2064) outb(0xfac, 0x01); ← mga2064w (Millennium) else outb(0xfac, 0x02); ← mga1064sg (Mystique) } } MGALeaveVT() { MGARestore(pScrn); vgaHWLock(hwp); if (xf86IsPc98()) outb(0xfac, 0x00); } MGACloseScreen() { if (xf86IsPc98()) outb(0xfac, 0x00); }
console 画面も担っている「抜いちゃダメ」なボードのいくつかは,もう一手間かけないと X の画面の真ん中に console の画面が残ってしまいます.(trident, cirrus) その「一手間」はここでは提示しませんが,たいていは一つの関数にまとめられています.
trident_driver.c では次のようになっています.
TRIDENTModeInit() { vgaHWProtect(pScrn, FALSE); if (xf86IsPc98()) PC98TRIDENTEnable(pScrn); ← ここから outb(0xfac,2) を実行する. } TRIDENTLeaveVT() { TRIDENTRestore(pScrn); vgaHWLock(hwp); if (xf86IsPc98()) PC98TRIDENTDisable(pScrn); ← ここから outb(0xfac,0) を実行する. } TRIDENTCloseScreen() { if (xf86IsPc98()) PC98TRIDENTDisable(pScrn); ← ここから outb(0xfac,0) を実行する. }
alp_driver.c (cirrus) では次のようになっています.
AlpModeInit() { vgaHWProtect(pScrn, FALSE); if (xf86IsPc98()) PC98CIRRUS755xEnable(pScrn); ← ここから outb(0xfac,2) を実行する. } AlpLeaveVT() { AlpRestore(pScrn); vgaHWLock(hwp); if (xf86IsPc98()) PC98CIRRUS755xDisable(pScrn); ← ここから outb(0xfac,0) を実行する. } AlpCloseScreen() { if (xf86IsPc98()) PC98CIRRUS755xDisable(pScrn); ← ここから outb(0xfac,0) を実行する. }
使用する driver のソースに最低でもこれらの追加部分がなければ,それは PC-98 では正常に動作しません. 従って,ここを見れば PC-98 に対応しているか否かを判別することができます.
(注) 上に示した例は PC-98 にとって必須の部分のみであり,これを追加しただけで PC-98 に未対応の driver が動作するようになるわけではありません.
XFree86 4 系または X.Org 6 系の以下のファイル. (これは X.Org 7 系では配布されていないようで,困ったものです.)
/usr/X11R6/lib/X11/doc/DESIGN