較正カートリッジ: 組み立ての記録、進むままに
2026-09-30、フラッシュのチップがベンチに届いた晩に始めた。計画は
calibration-plan.md (C0 の部品の側)、手順は build-the-cal-cart.md の
第 8 節、空のボードは cart-blanks.md にある。このページは組み立てそのものの
記録だ: 何を、どの順でやり、各段が何と答え、何がまだ開いているか。組み立てが
進むにつれて伸びていく。ある段を「押さえた」と記すのは、何かを測ったとき
だけだ。
組み立ての現在地
| 段 | 何を示すか | 状態 |
|---|---|---|
| プログラマが応える | このベンチでそもそもチップに書ける | 2026-09-30 に押さえた |
| チップ 1 が名乗り、空である | 部品は SST39SF040 で、貼り替えた物ではない | 2026-09-30 に押さえた |
チップ 1 が prg.bin を持つ | プログラムのイメージが、丸ごと部品の上にある | 2026-09-30 に押さえた |
チップ 2 が名乗り、空であり、chr.bin を持つ | タイルのイメージも同じく | 2026-09-30 に押さえた |
| ボード: ブリッジ五つ、コンデンサ三つ、チップ二つ | カートリッジが存在する | 開いている |
| リーダーの吸い出し | コンソールが見るものは cal.nes である: 本体の crc32 は 21091B99 | 開いている |
| コンソールに差したカートリッジ | 取り込んだフレームから帯が読める (tools/cal.py grab) | 開いている |
プログラマはベンチの Pi につなぎ、minipro で動かす
チュートリアルはメーカーの Windows 用ソフトを前提に書かれていた。実際に
使ったのは minipro で、すでにベンチにある Pi の上で動かした。プログラマの
USB ケーブルが届くのがそこで、焼く作業が、あとから読み返せるコマンドとして
残るからだ。
- プログラマは TL866II Plus として認識される (実測 2026-09-30、USB
ディスクリプタから)。ファームウェアは 04.2.83。
miniproは 04.2.132 を 期待していて、走らせるたびにそう言う。これは警告で、以下の読み書きは どれも古いファームウェアのまま通った。 miniproは 0.7.4 で、gitlab.com/DavidGriffith/miniproから Pi の上で ビルドした。GitHub にある同名のリポジトリは古いツリーで (自分では 0.2-dev と名乗る)、このプログラマもこのチップも知らない。ビルドもインストールも 通り、そのうえで "Unknown device" と答えるので、ベンチの故障のように 見える。- デバイス名は、何も付かない
SST39SF040だ。接尾辞の付いた名前は PLCC と TSOP のパッケージを指す。
minipro -p SST39SF040 -D # チップの ID。この部品なら 0xBFB7
minipro -p SST39SF040 -b # 空かどうかの検査、チップ全体
minipro -p SST39SF040 -w prg.bin # 消去、書き込み、照合
minipro -p SST39SF040 -r readback.bin # それから sha256sum でイメージと並べる
minipro -t はプログラマの自己診断で、ソケットを空にして走らせなければ
ならない: 書き込み電圧をピンに一本ずつ掛けるからだ。ここではチップ 1 を
座らせたまま走らせてしまった。警告がパイプの中で失われたためだ。チップは
そのあとも名乗り、消去でき、書き込めて、照合も通ったので、何の痕も見えない。
だがそれは運であって、手順ではない。
一つ目のチップ: 二度の座らせ損ない、それから部品自身の ID
最初に座らせたときは、ID を読むたびにプログラマの過電流保護が働いた (四回中 四回、実測 2026-09-30)。一度だけ先へ進んだ空の検査は、ID を 0x0000 と 読んだ。座らせ直すと過電流は消え、ID は三回とも 0xFFFF と読めた。チップ全体を 読むと、0xFF が 524,288 バイト返ってきた。もう一度座らせ直すと、ID は二回 0xBFB7 と読め、空の検査はチップ全体で通った。
ここから残しておく価値のあることが二つ:
- 全部が 0xFF という読み取りでは、空のチップと空のソケットを区別 できない。 区別できるのは ID だけだ。部品は空であろうとなかろうと ID の コマンドに答えるからだ。まず ID を読み、それが正しくなるまでは他の何も 信じないこと。
- ID の読み取りで過電流が出たら、そうでないと分かるまでは座らせ方の 問題だ。 四回それを起こしたチップが、いまプログラムを持っているチップだ。 それぞれの座らせ方の何が悪かったのかは記録していない。それを終わらせた 決まりはチュートリアルのものだ: チップはレバーから最も遠い 32 箇所に、 切り欠きをレバーの側に向け、レバーに近い 8 箇所は空ける。
一つ目のチップはプログラムのイメージを持っている
tools/nesprep.py roms/cal.nes が二つのイメージを書き出し、その sha256 は
チュートリアルの表にあるものと同じだ (何かを書き込む前に確かめた)。チップ 1
には prg.bin を書き込んだ: プログラマ自身の照合が通り、別にチップ全体を
読んだもののハッシュがイメージと一致し (実測 2026-09-30)、そのあとの ID は
0xBFB7 と読めた。これが PRG のチップで、U4 に入る。
最初の 32 KiB ではなくチップ全体を比べる理由: イメージはチップを満たすよう 16 回敷き詰めてあるので、容量の足りないダイや貼り替えたダイは、低いページ では照合が通り、もっと上でだけ失敗する。
二つ目のチップはタイルのイメージを持っている
チップ 2 は一度目で正しく座った: ID は 0xBFB7、チップ全体が空で、それから
chr.bin を書き込み、プログラマの照合が通り、別にチップ全体を読んだものが
イメージと 1 バイトずつ一致して、ハッシュもチュートリアルの値になり、その
あとの ID は 0xBFB7 と読めた (すべて実測 2026-09-30)。これが CHR のチップで、
U3 に入る。こちらはイメージを 64 回敷き詰めてあるので、チップ全体を比べる
ことは、プログラムのときよりも大事だ。
これで二つのチップはどちらも、チュートリアルの表が言うとおりのものになった。 見た目は同じなので、プログラマから外す前にそれぞれに印を付ける: PRG は U4、CHR は U3。
NROM にするには、ボードにはんだブリッジを五つ作る

ボードは v3.3 のディスクリートマッパーのボードだ。その文字の意味はボード自身の 裏面に凡例として書かれている: A は AxROM、B は BNROM、U は UxROM (この三つは CHR RAM)、C は CNROM、G は GNROM、N は NROM (この三つは CHR ROM)。較正 ROM は NROM なので、ラベルに N を含むジャンパはすべてつなぎ、含まないものはすべて 開けておく。2026-09-30 にシルクスクリーンから読んだもので、部品の上ではまだ 証明されていない。それを証明するのはリーダーの吸い出しだ。
| 面 | ジャンパ、ラベルのとおり | このカートリッジでは |
|---|---|---|
| 表 | H, V (ミラーリング) | 中央のパッドを H へ |
| 表 | B/C/G/N/U (パッド二つ) | つなぐ |
| 表 | U と A/B/C G/N (パッド三つ) | 中央のパッドを A/B/C G/N の側へ |
| 表 | BRIDGE IF 28-PIN (U4 の輪郭の内側にあるパッド二つ、星印付き) | 開けておく: チップは 32 ピンだ |
| 表 | A (パッド二つ、CHR の上) | 開けておく |
| 表 | G, G (パッド四つ、PRG の上) | 開けておく |
| 表 | EXP0 | 開けておく |
| 裏 | C/G/N と A/B/U、パッド三つの列が二本 | 中央のパッドを C/G/N の側へ、二本とも |
| 裏 | C/G, A/B, U (パッド二つのジャンパ三つが二組) | 六つとも開けておく |
| 裏 | A/B と U (CHR の行のそばの組) | 開けておく |
| 裏 | A (ピン 32 のそばのパッド二つ) | 開けておく |
| 裏 | R0 から R7 | 配線はそのままにしておく |

ミラーリングの文字は逆になっていて、ボードは言葉でそう言っている。
cal.nes のミラーリングは垂直だ。H と記されたパッドの横には "VERTICAL
Mirroring" と印刷され、V と記されたパッドの横には "HORIZONTAL Mirroring" と
ある。ボードの手引きもそれを認めている: "Solder the middle pad to either H
(for vertical mirroring) or V (for horizontal mirroring). Yes, I know it's
backwards" (中央のパッドを、垂直ミラーリングなら H へ、水平ミラーリングなら
V へはんだ付けすること。逆なのは分かっている)。だから H だ。文字ではなく、
言葉に従う。絵はスクロールせず、ネームテーブルを一つしか使わないので、
間違ったパッドでも同じ画面が映る。それでもボードとファイルは一致している
べきだ。



この接写は、裏面の ROM の行の間を上から下へたどる: A/B と U の組、 C/G、A/B、U の組が二つ、そして一番下が、ここで肝心な C/G/N と A/B/U の 組だ。その二本の列はどちらも、中央のパッドを上のパッドにつなぐ。
裏面の抵抗の位置 R0 から R7 には注意書きがある: スプライトが乱れるなら、 中央の配線を切って 100 オームの抵抗を足すこと。まだ見ていない不具合のための 修理なので、何も切らない。
このカートリッジのためにボードに載せる部品
ボードの手引き (https://mousebitelabs.com/2020/09/11/nes-reproduction-quick-guide-custom-pcb/) とシルクスクリーンから。値は手引きのもので、どれも測っていない。
| 位置 | 部品 | このカートリッジでは |
|---|---|---|
| U4 | prg.bin を持つ SST39SF040 | 載せる: チップ 1 |
| U3 | chr.bin を持つ SST39SF040 | 載せる: チップ 2 |
| C1 | 約 22 uF の電解コンデンサ、10 V 以上、極性あり (+ が記されている) | 載せる |
| C3, C4 | 約 0.1 uF のセラミックコンデンサ、10 V 以上、各 ROM の横に一つずつ | 載せる |
| C2 | 約 0.1 uF のセラミックコンデンサ、ロックアウトチップの位置の横 | 載せる、または U2 とともに空ける |
| U2 | ロックアウトチップ (CIC、または CIC として書き込んだ ATtiny13) | 空: このコンソールのロックアウトは無効化してある |
| U5, U6, U7 | 74'32、74'161、74'02 | 空: UxROM 用、"all but NROM"、AxROM 用と記されている |
| C5, C6, C7 | それらのコンデンサ | それらとともに空 |
コンデンサは、その日に撮った部品の山には無い。手持ちの在庫から出す。U3 と U4 に 32 ピンのソケットを一対付ければ、ROM を改訂したときにチップを プログラマへ戻せる。ソケットに挿したチップがシェルに収まるかどうかは、 確かめていない。
山の残りは別の組み立てのためのもの
| 品 | 刻印 | 何であるか | どこのものか |
|---|---|---|---|
| マッパー 30 のボード | NES CART PCB (MAPPER 30) v1.2 | フラッシュと CHR RAM のボード | このカートリッジではない (cart-blanks.md) |
| SxROM のボード | NES CART PCB (SxROM) v3.1 | セーブ RAM 付きの MMC1 のゲーム用ボード | このカートリッジではない (cart-blanks.md) |
| 24 ピンのチップ | AX5904 | SxROM のボードがマッパーの位置に、MMC1 と並べて名指ししている部品 | SxROM のボードの U5 |
| 黒いアダプタ | TL866, mousebitelabs v3.2 | 40 ピンと 42 ピンの EPROM をプログラマに座らせる | 要らない: 32 ピンのチップはプログラマ自身のソケットに収まる |
| 緑のアダプタ | NES CARTRIDGE ROM ADAPTER, NES MASK ROM | 27C や 39SF の部品を、元のボードのマスク ROM の位置に載せる | ドナーのボードを使う組み立て用で、これではない |
| 40 ピンのチップ | WDC W65C02S6TPG-14 | CMOS の 6502 プロセッサ | NES の部品ではない。65C02 のコンピュータのもの |
| 40 ピンのチップ | WDC W65C22S6TPG-14 | 65C22 インターフェースアダプタ: ポート二つとタイマ二つ | 同じコンピュータのもの |
| 28 ピンのチップ | CY62256NL-70PC | 32 KiB のスタティック RAM、70 ns | CHR RAM のボードの CHR の位置 (紫のボードは二枚ともそこに 62256 を挙げている)。タイルが ROM であるこのカートリッジではない |
| 14 ピンのチップ | SN74LS00N | 2 入力 NAND ゲートが四つ | これらのボードのどれでもない: ディスクリートのボードが取るのは '02、'161、'32 だ |




プロセッサ、インターフェースアダプタ、RAM、NAND は、ブレッドボードで組む 65C02 のコンピュータによくある一式だ (山を見ての読みで、誰かがそう言った わけではない)。W65C02 は CMOS の部品で、シミュレータがそのダイを走らせている NMOS の 6502 ではない。
まだ開いていること
- 五つのブリッジ、コンデンサ、ボードに載せる二つのチップ。
- 完成したカートリッジをリーダーで吸い出したもの。その本体の crc32 は
21091B99でなければならない。上のジャンパの表を証明するのもこれだ。 - コンソールに差したカートリッジと、取り込んだフレームから読んだ帯。
ビルド時に nes-bench/docs/cal-cart-build.md から取り込まれる。リポジトリが唯一の写しだ。報告書は独自の作業用語をいくつか使っている: 報告書で使われる言葉。