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にあります。
CHANPON3が世の中に出てきた頃からUSB2.0コントローラが98ユーザーに身近なものになりました。ところが、NECのD720100やD720101のうちEHCIコントローラ、つまりFunc.#2にあるデバイスが無視されるという不具合が報告されてきました。この問題に関しては当時ピンポイントでFeldlotosさんが対応されたのは記憶に新しい所です。
最近になって玄人志向から複合ボードUSB5+eSATA-PCIが出ました。ところが、良く似たデバイス構成で、BuffaloからもIFC-PCI7ESAU2というボードも直前に出ています。端的に言うと、いずれも同一デバイス番号内でファンクションを割り当てて複合機能化するボードです。そうであるのに、前者は拙作BIOSでブートできなくて後者はブートできるという状況が現れたため、この問題を解析しました。
型番 | USBコントローラ | SATAコントローラ | ブリッヂチップの有無 | PC-9821でのブート可否 |
---|---|---|---|---|
USB5+eSATA-PCI | D720101(NEC) | SiI3512(Silicon Image) | 謎のチップが3個 | 不可 |
IFC-PCI7ESAU2 | VT6214L(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の出力の比較です。上記改造により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