N-yagi PC ManiaX

PC1066RIMM Part.1

FSB533のPentium4が発売され、またRIMMもPC800よりクロック周波数の高いPC1066規格の物も目にするようになりました。 FSB533の改造をしたDP400も、上手く行けばPC1066RIMMの動作が可能なはずです。
期待に胸を膨らませて、PC1066−32のメモリーを購入してきました。

DP400にセットしてみたところ、不安定に動く素振りも見せずに(笑)全く起動しません。
PCガイガーで、POSTコード番号をみると、

「C1h」→「00h」→「80h」

で停止しています。PC800のメモリーでも同じ状態で、メモリーのグレードに関係なく起動しません。 この原因としては、 等が考えられます。
現時点では、POSTコード番号のみが手がかりです。AWARD−BIOSでは、

C1:Detect memory: Auto detection of DRAM size, type and ECC, auto detection of L2 cache

となっております。AWARDでは基本的にメモリー認識関連のようです。 この後、圧縮されたBIOSを展開し起動を開始する為、メモリーチェックは電源投 入時&ハードウェアリセット時にしか行われないことになります。
ここを騙せば起動するかもしれません。

ちなみに、「00h」は割り当てなし、「80h」はリザーブでした。



解析開始

BIOSの起動プロセスには2通りあります。
まず1つは、電源投入時&ハードウェアリセット時で、PCは圧縮格納されているBIOSをメモリーに展開し起動します。
もう1つは、ソフトウェアリセットなどの再起動で、この場合は既にBIOSは展開済みですのでそこから起動します。

今回の解析すべき場所は、POSTコード番号の変化から前者の方であると考えられます。 この場合は、BIOS内に圧縮格納されている部分は一切関係なく、BIOSを展開する前の BOOTプログラムを解析する必要があることになります。
また、POSTコード番号から、コード番号が「C1h」の部分を重点的に解析する事にします。

リセット状態から、地道にプログラムを追っていった結果、それっぽいところを発見。
F000:0A2F B0B8            mov     al,B8		;SRAM b8h read
F000:0A31 BC370A          mov     sp,0A37
F000:0A34 E97EDB          jmp     E5B5
_uF000:e5b5
F000:E5B5 87DB            xchg    bx,bx
F000:E5B7 90              nop
F000:E5B8 E670            out     70,al
F000:E5BA E300            jcxz    E5BC
F000:E5BC E300            jcxz    E5BE
F000:E5BE 87DB            xchg    bx,bx
F000:E5C0 E471            in      al,71
F000:E5C2 E300            jcxz    E5C4
F000:E5C4 E300            jcxz    E5C6
F000:E5C6 C3              ret
_dwF000:a37
F000:0A37  0A39
_uF000:a39
F000:0A39 2430            and     al,30
F000:0A3B 0AC0            or      al,al
F000:0A3D 740E            jz      0A4D		;RDRAM Freq Auto
F000:0A3F 660FBAED1E      bts     ebp,1E
F000:0A44 3C10            cmp     al,10
F000:0A46 7405            jz      0A4D		;400MHz
F000:0A48 660FBAF51E      btr     ebp,1E	;300MHz
F000:0A4D 660FBAE51E      bt      ebp,1E	;ebp:30bit =1 ならば強制的に400MHz
F000:0A52 7214            jb      0A68
F000:0A54 BAF80C          mov     dx,0CF8	;RDRAM Freq 300MHz set
F000:0A57 66B850000080    mov     eax,80000050	;MCHCFG-MCH Configuration Register (Device 0)
F000:0A5D 66EF            out     dx,eax
F000:0A5F B2FC            mov     dl,FC
F000:0A61 ED              in      ax,dx
F000:0A62 25FFF7          and     ax,F7FF	;load Direct Rambus Freqency   0=300MHz 1=400MHz
F000:0A65 EF              out     dx,ax
F000:0A66 EB15            jmp     0A7D

F000:0A68 BAF80C          mov     dx,0CF8	;RDRAM Freq 400MHz set
F000:0A6B 66B850000080    mov     eax,80000050	;MCHCFG-MCH Configuration Register (Device 0)
F000:0A71 66EF            out     dx,eax
F000:0A73 B2FC            mov     dl,FC
F000:0A75 ED              in      ax,dx
F000:0A76 25FFF7          and     ax,F7FF	;load Direct Rambus Freqency   0=300MHz 1=400MHz
F000:0A79 0D0008          or      ax,0800	;set Direct Rambus Freqency   1=400MHz
F000:0A7C EF              out     dx,ax

F000:0A7D 6633DB          xor     ebx,ebx
F000:0A80 66F7C500000040  test    ebp,40000000	;400MHzか?
F000:0A87 7406            jz      0A8F		;300MHzならジャンプ
F000:0A89 66BB00001000    mov     ebx,00100000
F000:0A8F BA8040          mov     dx,4080
F000:0A92 66ED            in      eax,dx
F000:0A94 660D00001000    or      eax,00100000
F000:0A9A 660D00002000    or      eax,00200000
F000:0AA0 66EF            out     dx,eax
F000:0AA2 80C20C          add     dl,0C
F000:0AA5 66ED            in      eax,dx
F000:0AA7 6625FFFFEFFF    and     eax,FFEFFFFF
F000:0AAD 660D00002000    or      eax,00200000
F000:0AB3 660BC3          or      eax,ebx
F000:0AB6 66EF            out     dx,eax
i860のデータシートから、
MCHCFG-MCH Configuration Register (Device 0):50-51h:16Bits Size となっており、RDRAMのクロックとFSBの割合を決定しているようです。

引き続きプログラムを追ってゆくと、またそれらしい所を見つけました。
F000:0EFB BC010F          mov     sp,0F01
F000:0EFE E9671C          jmp     2B68
_uF000:2b68
F000:2B68 BB030A          mov     bx,0A03	;x3
F000:2B6B 66F7C500000040  test    ebp,40000000	;ebp:30bit x4
F000:2B72 7402            jz      2B76
F000:2B74 FEC3            inc     bl		;x4
F000:2B76 F6E3            mul     bl
F000:2B78 F6F7            div     bh
F000:2B7A 0AE4            or      ah,ah
F000:2B7C 7402            jz      2B80
F000:2B7E FEC0            inc     al
F000:2B80 FFE4            jmp     sp

F000:0F01 0FB6C0          movzx   ax,al
F000:0F04 03F8            add     di,ax
F000:0F06 83FF07          cmp     di,+07	;tRCD 7Rclk 以下なら問題ない
F000:0F09 7E1C            jle     0F27		;7clk 以下なら7clkで
F000:0F0B 660FBAE51E      bt      ebp,1E	;ebp:30bit x4
F000:0F10 720A            jb      0F1C

F000:0F12 B410            mov     ah,10		;永久ループ?
F000:0F14 BC1A0F          mov     sp,0F1A
F000:0F17 E9C117          jmp     26DB

F000:0F1A EB0B            jmp     0F27
F000:0F1C 83FF09          cmp     di,+09	;tRCD 9Rclk以上で異常?(ぉぃ
F000:0F1F 7FF1            jg      0F12
F000:0F21 66BF00000009    mov     edi,09000000
F000:0F27 FEC1            inc     cl
F000:0F29 660FC9          bswap   ecx
F000:0F2C BC320F          mov     sp,0F32
F000:0F2F E9641D          jmp     2C96

F000:0F32 660FC9          bswap   ecx
F000:0F35 38E1            cmp     cl,ah
F000:0F37 0F86A3FE        jbe     0DDE
F000:0F3B 660FC9          bswap   ecx
F000:0F3E 66F7C500000001  test    ebp,01000000
F000:0F45 7409            jz      0F50
F000:0F47 FEC1            inc     cl
F000:0F49 80F904          cmp     cl,04
F000:0F4C 0F827FFE        jb      0DCF
F000:0F50 660FCF          bswap   edi
F000:0F53 B340            mov     bl,40		;tRCD 7Rclk
F000:0F55 83FF07          cmp     di,+07
F000:0F58 7402            jz      0F5C
F000:0F5A B380            mov     bl,80		;tRCD 9Rclk
F000:0F5C B708            mov     bh,08		;tCAC 8Rclk
F000:0F5E 660FBAE518      bt      ebp,18
F000:0F63 7302            jnb     0F67
F000:0F65 B70E            mov     bh,0E		;tCAC 14clk???
F000:0F67 0ADF            or      bl,bh
F000:0F69 BAF80C          mov     dx,0CF8
F000:0F6C 66B8BC000080    mov     eax,800000BC	;RDRAM timeing?
F000:0F72 66EF            out     dx,eax
F000:0F74 B2FE            mov     dl,FE
F000:0F76 8AC3            mov     al,bl
F000:0F78 EE              out     dx,al		;Reg 0BEh
F000:0F79 BAF80C          mov     dx,0CF8
F000:0F7C 66B890000080    mov     eax,80000090
F000:0F82 66EF            out     dx,eax
F000:0F84 B2FC            mov     dl,FC
F000:0F86 66B800180018    mov     eax,18001800
F000:0F8C 66EF            out     dx,eax
F000:0F8E 66BBE13B8801    mov     ebx,01883BE1
F000:0F94 BC9A0F          mov     sp,0F9A
F000:0F97 E9FD1F          jmp     2F97
データシートより抜粋

RDTR-RDRAM* Device Timing Register (Device 0):BEh:8 Bits Size データシートから、ここでRDRAMのアクセスタイミングを設定している模様。 ここでは、tRCDが9クロック以上になると、エラーとなり永久ループ?ルーチンに飛ばされてしまうようです。


早速、データを書き換えてみましょう。
F000:0F53 B340            mov     bl,40		;tRCD 7Rclk
F000:0F55 83FF07          cmp     di,+07
F000:0F58 7402            jz      0F5C
F000:0F5A B380            mov     bl,80		;tRCD 9Rclk
F000:0F5C
F000:0F53 の「mov bl,40」を「mov bl,80」にすれば、SPDによらず9クロックになります。 PC1066−32のメモリーをPC1066−35と認識させる事が出来そうです。

逆に、F000:0F5A の「mov bl,80」を「mov bl,40」にすれば、SPDによらず7クロックになります。 この時は、PC800−45のメモリーをPC800−40と認識させる事が出来そうです。


データを改変し、UniFlash.exeのアドバンストメニューで、ブートブロックごと書き換え。 が、エラーが出て書き換えできません。どうやら、FFFF0000〜FFFFFFFFの最後の64kバイトにプロテクトがかかっている様子。
i860のデータシートにも、これに関する情報が記載されていますが、自力でフラッシュプログラムを作るのが面倒(むしろ、まだ資料を理解できていない)であった為、 FWH(82802AB)を直接剥がすという強行手段を取りました。(ぉぃ

格闘の傷跡。「64BitPCIスロット」と「FDDコネクタ」が・・・
ついでに、PLCCの左下のパターン(NCで良かった)が取れてしまいました。

故障したわけでもないのに、無残にピンを斬られたFWH。熱でシールがへろへろに。

半田付けの苦労が窺える(笑)32ピンPLCCソケット。秋葉原ガード下の電気街では何故か見つからなかった。ラジオデパートで発見。

最初は、P3DREをNEX6420のBIOSで起動し(この環境でないとFWHの全領域を正常に焼けない)正常なBIOS−ROMを作成。 ついでに、「ROM焼き大丈夫」にも焼きこみ。まずは、PC800の状態で、正常に起動する事を確認。 ソケットの貼り付けは上手くいっているようです。



先ほどの、データシートからの抜粋「RDTR-RDRAM* Device Timing Register (Device 0):BEh:8 Bits Size」に、 「[4:0]:RDRAM Total CAS Access Delay (tRDRAM).」と言う項目があります。
BIOSでは、ここが8クロックに設定されていますが、ここを増やしてマージンを稼いでみましょう。
F000:0F5C B708            mov     bh,08		;tCAC 8Rclk
F000:0F5D の「08h」を、09hや0Ahなど大きくするのです。 また、「RDTR-RDRAM* Device Timing Register (Device 0):BEh:8 Bits Size」にアクセスしているところはもう一箇所あり、そこも書き換えます。
F000:1F17 B108            mov     cl,08		;tCAC 8Rclk
F000:1F19 66F7C500000001  test    ebp,01000000	;MRH-R flag
F000:1F20 7402            jz      1F24
F000:1F22 B10E            mov     cl,0E		;tCAC 14Rclk
F000:1F24 02CB            add     cl,bl
F000:1F26 BAF80C          mov     dx,0CF8
F000:1F29 66B8BC000080    mov     eax,800000BC	;RDRAM timeing??
F000:1F2F 66EF            out     dx,eax
F000:1F31 B2FE            mov     dl,FE
F000:1F33 EC              in      al,dx		;Reg 0BEh
F000:1F34 24C0            and     al,C0
F000:1F36 8AD9            mov     bl,cl
F000:1F38 80E3FF          and     bl,FF
F000:1F3B 0AC3            or      al,bl
F000:1F3D EE              out     dx,al
F000:0F5D と F000:1F18 を、8以上の値に書き換え。まずは、0Ahにしてみましょう。

起動後、PCIレジスタチェックツールで、チップセットのレジスタを見てみたところ、 意図した値になっていませんでした。前述の箇所を、いくら書き換えても値が変化しません

この他にもレジスタ書き換えルーチンが存在するようです。



N-yagi PC ManiaX