naomiのROMボード修理中につき、ある程度まとまった情報になったら随時ブログにまとめときます。
今回はシステムのテストから実行できるROM BOARD TESTの話。
このテスト、搭載ROMのチェックサムを確認してくれるのですが、肝心のチェックサムはIC22の中に入っているため、IC22が読めないとチェックできません。故障が多いらしい837-14114-01タイプのROMではバッファの故障が多いため、IC22自体が読めずにROMチェックがほとんど意味をなさないようです。IC22が正しく読めないと、TYPE、RESULTが?で埋まります。この状態で故障等のアタリを付けるのは大変なので、ひとまずIC22に書かれたメタ情報について調べてみました。
IC22は、各ROMについて以下のような6-Bytesのデータを保持します。
struct rom_entry { uint16_t type; uint16_t byte_sum; uint16_t word_sum; };
メンバーはlittle endianで格納されてます。typeについては
enum type { kRomType_16M = 0x0002, kRomType_32M = 0x0003, // maybe? kRomType 64M = 0x0004, kRomType_NotInstalled = 0xffff, };
って感じだと思います。NotInstalledだと検査自体されない。
で、IC22のオフセット0x0000015cから、
struct { struct rom_entry ic22; struct rom_entry ic1; struct rom_entry ic2; struct rom_entry ic3; struct rom_entry ic4; struct rom_entry ic5; struct rom_entry ic6; struct rom_entry ic7; struct rom_entry ic8; struct rom_entry ic9; struct rom_entry ic10; struct rom_entry ic11; struct rom_entry ic12; struct rom_entry ic13; struct rom_entry ic14; struct rom_entry ic15; struct rom_entry ic16; struct rom_entry ic17; struct rom_entry ic18; struct rom_entry ic19; struct rom_entry ic20; struct rom_entry ic21; };
といった感じでデータが並んでます。これを見てチェックサムを計算し、byteとwordともに期待値と一致していたらGOODを表示します。IC22自身についてはtypeは参考にするけどチェックサム自体は意味がないので無視して常に`----`を表示するようです。というか、ここは間違った値が入ってたので、単に無視してるのか別の用途で使ってるのか……。またtypeが未知だとTYPEとRESULTを`?`で埋めるんだと思います。GIGA WING2ではIC22が読めずにサイズがわからなくともbyteとwordについて正常時と同じ値が計算されるのは確認しました。ROMタイプが64M以外の時に正しい値になるかは不明です。
ちなみに応答するROMがなかった場合は0xFFではなく0x00が読み出されるようデータバスはpull-downされているようです。