PC-9821 PCI-BIOSの改造


概説

 1994年辺り以降のNEC PC-9821シリーズにはPCIスロットが装備され、PC-9821用で動作しうるオプションがAT互換機業界の恩恵にあずかる形で膨大に増えてきていました。ただし、いわゆる複合ボードに用いられるような、バス番号を増やすPCI-PCIブリッヂであるとか、同じデバイス番号内に複合機能を盛り込むボードに至ると、当初そうしたデバイスが世の中に存在しなかったせいもあるかとは思いますが、リソースの割り当てが不正になるとか、さまざまな不具合がchanpon2以降明らかになり続けました。その原因がPC-98のBIOS-ROM中にあるPCI-BIOSな訳です。そしてそうした問題の原因究明と解決に尽力されてきたのがまりもさんで、深く感謝する次第であります。

さて、この記事では原因が明らかな問題点をいくつか取り上げて、解説してみようと思います。検証にはRa266/W30RのPCI-BIOSを取り上げ、断らない限り、ITF書き換えによる改造です。PCI-BIOSはまりもさんのGETITF98ではBANK0.BINにあります。

マルチファンクション 特にNEC USB2.0コントローラ

CHANPON3が世の中に出てきた頃からUSB2.0コントローラが98ユーザーに身近なものになりました。ところが、NECのD720100やD720101のうちEHCIコントローラ、つまりFunc.#2にあるデバイスが無視されるという不具合が報告されてきました。この問題に関しては当時ピンポイントでFeldlotosさんが対応されたのは記憶に新しい所です。

最近になって玄人志向から複合ボードUSB5+eSATA-PCIが出ました。ところが、良く似たデバイス構成で、BuffaloからもIFC-PCI7ESAU2というボードも直前に出ています。端的に言うと、いずれも同一デバイス番号内でファンクションを割り当てて複合機能化するボードです。そうであるのに、前者は拙作BIOSでブートできなくて後者はブートできるという状況が現れたため、この問題を解析しました。

型番USBコントローラSATAコントローラブリッヂチップの有無PC-9821でのブート可否
USB5+eSATA-PCID720101(NEC)SiI3512(Silicon Image)謎のチップが3個不可
IFC-PCI7ESAU2VT6214L(VIA)SiI3512(Silicon Image)VT6214L内蔵

パッチ当て

結論から言うと、Func.#2以降が無視されるか否かは、Func.#1としてアクセスしたFunctionがマルチファンクションだと申告するかどうかによっていました。つまり、NECのUSBチップの場合、Func.#0だけがマルチファンクションデバイスだと申告し、Func.#1,#2がそのことを申告しないためです。多分2つ目の箇所を直すだけでも良いのかもしれませんが、一応私がITF書き換えの際に直した箇所を全箇所挙げます。なお、これを行ってもSiI3512のBAR0にFFFChが割り当てられるのみで正常に動作しない場合があります。うちでこの症状が出たとき、翌日になったら治っていたので、接触不良の類が原因だと思っていたのですが、まりもさんのところではずっとこの症状が出たままだそうです。なんだか良く分かりません。9821V7/S5KA(山猫)ではITF書き換えではなく、PCI-BIOSへの動的パッチ当てをするためにslot#1にパッチ当て用のSCSIボードを挿して、空きパターンだったslot#2にUSB5+eSATA-PCIを挿したところ、これまた正常に動作しております。現在のところ不具合自体が再現できていないため、そう言う現象が出る原因が特定できておりませんが、同じパッチ当てで同じ不具合が起きる可能性は多いにあります。

PCI-PCI bridge検索ルーチン
41B2 53			PUSH	BX
41B3 8A3EEF00		MOV	BH,[00EF];★!!PATCH!!
41B7 8A1EF000		MOV	BL,[00F0]
41BB B00E		MOV	AL,0E;HEADER TYPE
41BD 0FB6F8		MOVZX	DI,AL
41C0 B808CC		MOV	AX,CC08;B108 = READ BYTE
41C3 E8702E		CALL	7036;144E
41C6 5B			POP	BX
41C7 F6C180		TEST	CL,80;複合機能デバイス
41CA 7410		JZ	41DC

☆☆☆パッチ当て後☆☆☆
41B3 BF0E00		MOV	DI,0Eh
41B6 8B1EEF00		MOV	BX,[00EFh]
41BA 86DF		XCHG	BL,BH
41BC 80E3F8		AND	BL,0F8h;Func.#0から得る
41BF 90			NOP
デバイス検索とリソース割り当てのルーチン
5ACC 53			PUSH	BX
5ACD 8A3E2501		MOV	BH,[0125]
5AD1 8A1E2601		MOV	BL,[0126]
5AD5 B00E		MOV	AL,0E;★!!PATCH!!
5AD7 0FB6F8		MOVZX	DI,AL
5ADA B808CC		MOV	AX,CC08
5ADD E85615		CALL	7036;144E
5AE0 5B			POP	BX

5AE1 F6C180		TEST	CL,80
5AE4 7410		JZ	5AF6

5AE6 A02601		MOV	AL,[0126]
5AE9 24F8		AND	AL,F8
5AEB 3C07		CMP	AL,07;ハァ?(どうかとは思うが動作上害にはならない)
5AED 7407		JZ	5AF6

5AEF FE062601		INC	BYTE PTR [0126]
5AF3 E9D1FA		JMP	55C7

☆☆☆パッチ当て後☆☆☆
5ACD BF0E00		MOV	DI,0Eh
5AD0 8B1E2501		MOV	BX,[0125h]
5AD4 86DF		XCHG	BL,BH
5AD6 80E3F8		AND	BL,0F8h;Func.#0から得る
5AD9 90			NOP
直接関係ないけどついでに直した
74E5 50			PUSH	AX
74E6 50			PUSH	AX
74E7 50			PUSH	AX
74E8 50			PUSH	AX
74E9 50			PUSH	AX
74EA 50			PUSH	AX
;FROM 4502 ONLY
74EB 6653		PUSH	EBX
74ED 8B9D8001		MOV	BX,[DI+0180]
74F1 668987CBC3		MOV	[BX+C3CB],EAX
74F6 FF858201		INC	WORD PTR [DI+0182]
74FA 665B		POP	EBX
74FC 50			PUSH	AX;★!!PATCH!! -> RETに
74FD 50			PUSH	AX
74FE 50			PUSH	AX
74FF 50			PUSH	AX
7500 50			PUSH	AX
7501 50			PUSH	AX
7502 C3			RET
NO-AT機能として実装しているのはこれ
7049 2666813E1C0050+	CMP	DWORD PTR ES:[001C],38394350;'PC98'
7053 0F851300		JNZ	706A;★!!PATCH!! -> 0F852600へ

7057 1F			POP	DS
7058 800E23A901		OR	BYTE PTR [A923],01
705D 1E			PUSH	DS
705E 33C9		XOR	CX,CX
7060 8ED9		MOV	DS,CX
7062 C706AC042000	MOV	WORD PTR [04AC],0020;INIT 1
7068 EB06		JMP	7070

706A C706AC040300	MOV	WORD PTR [04AC],0003;PC/AT互換機初期化ルーチン
;FROM 4068
7070 8C06AE04		MOV	[04AE],ES
7074 06			PUSH	ES
7075 56			PUSH	SI
7076 90			NOP
7077 FF1EAC04		CALL	FAR PTR [04AC]
707B 5E			POP	SI
707C 07			POP	ES
;AT互換機用BIOSのときはここへ飛んでくるようにする
707D 1F			POP	DS
707E 5A			POP	DX

PCILIST出力比較

まりもさんのPCILISTの出力の比較です。上記改造によりUSB5+eSATA-PCI接続のHDDをPC-9821で拙作BIOSを用いてブート可能になります。

☆☆☆パッチ適用前☆☆☆
PC-9821 PCI device list  [ PCIlist ] Version 1.33   Copyright(C) 2003-05 まりも 
PCI BIOS Version 2.10,  Last bus number(BIOS)=0, Configuration mechanism #1 

Bus Dev Func Class      Vendor   IRQ INT B/M P/E I/O MEM MWI SER PED DPD SED CL
[0]:[ 0]     PCI--HOST  Intel     --     Yes  No  No Yes  No Yes  o   -   -   -
[0]:[ 6]     98C-Bus B  NEC       --     Yes  No Yes Yes  No Yes  -   -   -   -
[0]:[ 7]     98 VIDEO   NEC       --      No  No Yes Yes  No  No  -   -   -   -
[0]:[ 8]     VGA-VIDEO  Trident   ** [A]  No  No  No Yes  No  No  -   -   -   -
[0]:[11]     EtherNet   Intel      3 [A] Yes Yes Yes Yes  No Yes  -   -   -   -
[0]:[13]:[0] USB        NEC        6 [A] Yes Yes  No Yes Yes Yes  -   -   -   -
[0]:[13]:[1] USB        NEC        9 [B] Yes Yes  No Yes Yes Yes  -   -   -   -
[0]:[13]:[2] USB        NEC       -- [C]  No  No  No  No  No  No  -   -   -   -
[0]:[13]:[3] Storage    SiI.(CMD) -- [A]  No  No  No  No  No  No  -   -   -   -


PC-9821 PCI device list  [ PCIlist ] Version 1.33   Copyright(C) 2003-05 まりも 
PCI BIOS Version 2.10,  Last bus number(BIOS)=0, Configuration mechanism #1 

Bus Dev Func  Class      Base address
[0]:[ 0]     PCI--HOST 
[0]:[ 6]     98C-Bus B 
[0]:[ 7]     98 VIDEO  
[0]:[ 8]     VGA-VIDEO   20000000h  20400000h  20800000h  ROM(21000000h)
[0]:[11]     EtherNet    20410000h  6000h  20500000h  ROM(22000000h)
[0]:[13]:[0] USB         20411000h
[0]:[13]:[1] USB         20412000h
[0]:[13]:[2] USB       
[0]:[13]:[3] Storage     0000h  0000h  0000h  0000h  0000h


PC-9821 PCI device list  [ PCIlist ] Version 1.33   Copyright(C) 2003-05 まりも 
PCI BIOS Version 2.10,  Last bus number(BIOS)=0, Configuration mechanism #1 

[ IRQ routing by PCI-C(ISA) bridge ]
PIRQ#0 ==> ***
PIRQ#1 ==> IRQ 6 
PIRQ#2 ==> IRQ 9 
PIRQ#3 ==> IRQ 3 

Bus :Device   Class    IRQ   INT#A    INT#B    INT#C    INT#D    SLOT
[ 0]:[ 8]   VGA-VIDEO   **    ---      ---      ---      ---     Onboard
[ 0]:[11]   EtherNet     3   PIRQ#3    ---      ---      ---     Onboard
[ 0]:[12]    ***        **   PIRQ#0   PIRQ#1   PIRQ#2   PIRQ#3   PCI SLOT#1
[ 0]:[13]   USB          6   PIRQ#1   PIRQ#2   PIRQ#3   PIRQ#0   PCI SLOT#2
☆☆☆パッチ適用後☆☆☆
PC-9821 PCI device list  [ PCIlist ] Version 1.33   Copyright(C) 2003-05 まりも 
PCI BIOS Version 2.10,  Last bus number(BIOS)=0, Configuration mechanism #1 

Bus Dev Func Class      Vendor   IRQ INT B/M P/E I/O MEM MWI SER PED DPD SED CL
[0]:[ 0]     PCI--HOST  Intel     --     Yes  No  No Yes  No Yes  o   -   -   -
[0]:[ 6]     98C-Bus B  NEC       --     Yes  No Yes Yes  No Yes  -   -   -   -
[0]:[ 7]     98 VIDEO   NEC       --      No  No Yes Yes  No  No  -   -   -   -
[0]:[ 8]     VGA-VIDEO  Trident   ** [A]  No  No  No Yes  No  No  -   -   -   -
[0]:[11]     EtherNet   Intel      3 [A] Yes Yes Yes Yes  No Yes  -   -   -   -
[0]:[13]:[0] USB        NEC        6 [A] Yes Yes  No Yes Yes Yes  -   -   -   -
[0]:[13]:[1] USB        NEC        9 [B] Yes Yes  No Yes Yes Yes  -   -   -   -
[0]:[13]:[2] USB        NEC        3 [C] Yes Yes  No Yes Yes Yes  -   -   -   -
[0]:[13]:[3] Storage    SiI.(CMD)  6 [A] Yes Yes Yes Yes  No Yes  -   -   -   -


PC-9821 PCI device list  [ PCIlist ] Version 1.33   Copyright(C) 2003-05 まりも 
PCI BIOS Version 2.10,  Last bus number(BIOS)=0, Configuration mechanism #1 

Bus Dev Func  Class      Base address
[0]:[ 0]     PCI--HOST 
[0]:[ 6]     98C-Bus B 
[0]:[ 7]     98 VIDEO  
[0]:[ 8]     VGA-VIDEO   20000000h  20400000h  20800000h  ROM(21000000h)
[0]:[11]     EtherNet    20410000h  6000h  20500000h  ROM(22000000h)
[0]:[13]:[0] USB         20411000h
[0]:[13]:[1] USB         20412000h
[0]:[13]:[2] USB         20413000h
[0]:[13]:[3] Storage     6020h  6028h  6030h  602Ch  C000h  20414000h  ROM(23000000h)


PC-9821 PCI device list  [ PCIlist ] Version 1.33   Copyright(C) 2003-05 まりも 
PCI BIOS Version 2.10,  Last bus number(BIOS)=0, Configuration mechanism #1 

[ IRQ routing by PCI-C(ISA) bridge ]
PIRQ#0 ==> ***
PIRQ#1 ==> IRQ 6 
PIRQ#2 ==> IRQ 9 
PIRQ#3 ==> IRQ 3 

Bus :Device   Class    IRQ   INT#A    INT#B    INT#C    INT#D    SLOT
[ 0]:[ 8]   VGA-VIDEO   **    ---      ---      ---      ---     Onboard
[ 0]:[11]   EtherNet     3   PIRQ#3    ---      ---      ---     Onboard
[ 0]:[12]    ***        **   PIRQ#0   PIRQ#1   PIRQ#2   PIRQ#3   PCI SLOT#1
[ 0]:[13]   USB          6   PIRQ#1   PIRQ#2   PIRQ#3   PIRQ#0   PCI SLOT#2

Valid HTML 4.01 Strict