6502tinymachines

較正カートリッジ: 組み立ての記録、進むままに

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 に押さえた
一枚目のボード: ブリッジ五つ、コンデンサ三つ、チップ二つカートリッジが一つ存在する2026-10-01 に組んだ。コンソールでは灰色の画面
一枚目のボードのあと、二つのチップがどちらも丸ごと読めた灰色の画面はチップのせいではない2026-10-01 に押さえた
二枚目のボードはんだ付けを疑わなくてよいカートリッジ2026-10-03 にソケット付きで組んだ。下のリーダーの吸い出しがそれを押さえる
コンソールのロックアウトが無効化されているロックアウトチップの無いカートリッジがそもそも動ける2026-10-03 に押さえた: ロックアウトチップの無いカートリッジが動く (下の行)。リセット線そのものはまだ測っていない (lockout.md)
リーダーの吸い出しコンソールが見るものは cal.nes である: 本体の crc32 は 21091B992026-10-03 に押さえた: リーダーは 21091B99 を示した。チップの面をリーダーの前に向け、5 V、マッパー 0、PRG 32 KB と CHR 8 KB を手で設定した (「Not Found」はリーダーのデータベースの話で、そこに自作のものは無い)
コンソールに差したカートリッジ取り込んだフレームから帯が読める (tools/cal.py grab)2026-10-03 に押さえた: 取り込んだフレーム 6 枚、フィールド 12 枚で、どの帯も読めた (画面 2 から 7 が順に、各フィールドのカウンタはもう片方より一つ先)。領域ごとの点数は最初の読みで、まだ判定ではない

プログラマはベンチの 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 の横のジャンパ

ボードの裏面

裏面のジャンパの組、表にある順に上から下へ

この接写は、裏面の 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/) とシルクスクリーンから。値は手引きのもので、どれも測っていない。

位置部品このカートリッジでは
U4prg.bin を持つ SST39SF040載せる: チップ 1
U3chr.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)空: このコンソールのロックアウトは無効化してあると言われていて、それを測る方法が lockout.md だ
U5, U6, U774'32、74'161、74'02空: UxROM 用、"all but NROM"、AxROM 用と記されている
C5, C6, C7それらのコンデンサそれらとともに空

コンデンサは、その日に撮った部品の山には無い。手持ちの在庫から出す。U3 と U4 に 32 ピンのソケットを一対付ければ、ROM を改訂したときにチップを プログラマへ戻せる。ソケットに挿したチップがシェルに収まるかどうかは、 確かめていない。

一枚目のボードは灰色の画面を出した。チップのせいではなかった

一枚目のボードは 2026-10-01 に組み、シェル無しの裸のままコンソールに入れた。 裸のボードはどちらを上にして入れるか: チップの面を上に。フロントローダー ではカートリッジはラベルを上にして入れ、"pins 01-36 are the top side of the connector" (ピン 01 から 36 がコネクタの上側)、そして NES のカートリッジでは "most chips and components appear on the label side" (チップと部品の大半は ラベルの側にある) (nesdev の Cartridge connector、2026-10-01 に読んだ)。この ボードもそれと合っている: 端子の番号はチップの面が 5 から 35、裏面が 40 から 70 だ。裸のボードには向きを決めるシェルが無いので、裏返しでも、ピン一本ぶん 左右にずれても入ってしまう。そしてピン 36 は +5 V で、その向かいの 72 が グラウンドだ。

電源を入れると、画面は灰色だった: 変わらない灰色で、点滅はしていなかった (翌日の持ち主の報告)。

そのあと二つのチップをどちらもボードから外し、プログラマへ戻した。どちらも 名乗り (0xBFB7)、どちらもイメージと 1 バイトも違わずに読めた: U4 にあった ものは prg.bin、U3 にあったものは chr.bin だった (実測 2026-10-01)。 つまりチップは正しく、正しい位置にあり、ボードにもコンソールにも傷められて いなかった。プログラムのイメージのリセットベクタは、16 ある写しのどの てっぺんでも $8000 と読める。コンソールが動き出す場所だ。

残るのは二つで、別々に片付けていく:

  • ボード。 組んだ本人の見立てでは、はんだ付けの出来が悪かった。二枚目の ボードを組んでいるところだ。プログラム ROM の横の二つのブリッジは、 できていなければプログラムがまったく読めなくなるものだ。
  • コンソール。 このカートリッジにはロックアウトチップが無いので、 ロックが邪魔をしないコンソールでしか動かない。そしてそこは、確かめずに 信じてきた。鍵の無いカートリッジにロックが何をするか、目でどう見分けるか、 そしてリセット線の測り方は lockout.md にある。変わらない灰色はロックの しるしではない: 生きているロックは点滅する。今回の灰色は変わらなかった ので、カートリッジを止めたのはロックではなく、ボードだ。

チュートリアルがコンソールの前に置いている段を、ここでは飛ばした。次は 飛ばすべきではない: リーダーの吸い出しは二つの半分を別々に読むので、 コンソールのコネクタを疑う余地が無くなる。

二枚目のボード、はんだ付けする順に

上の二つの表を、ベンチで上から順にたどる一つのリストにしたもの。新しい ことは何も無い。ジャンパの表と部品の表を作業が楽になる順に並べ、チップを 挿す前に済ませる確認を添えただけだ。

部品位置注記
32 ピンのソケット、それから PRG のチップU4切り欠きを輪郭の切り欠きに合わせる
32 ピンのソケット、それから CHR のチップU3切り欠きを輪郭の切り欠きに合わせる
約 22 uF の電解コンデンサ、10 V 以上C1長い足を + と記された穴へ
0.1 uF のセラミックコンデンサC3CHR の横
0.1 uF のセラミックコンデンサC4PRG の横
何も載せないU2, U5, U6, U7, C2, C5, C6, C7空のまま

作るブリッジは五つ:

面ジャンパ、ラベルのとおりすること
表H, V中央のパッドを H へ
表B/C/G/N/U二つのパッドをつなぐ
表U と A/B/C G/N中央のパッドを A/B/C G/N の側へ
裏C/G/N と A/B/U、左の列中央のパッドを C/G/N のパッドへ
裏C/G/N と A/B/U、右の列中央のパッドを C/G/N のパッドへ

開けておくもの: U4 の輪郭の内側にある星印付きの BRIDGE IF 28-PIN のパッド、 表の A と G G のパッド、EXP0、そして裏面のほかのジャンパの組すべて。何も 切らない。R0 から R7 の配線はそのままにしておく。

順番:

  1. まず五つのブリッジ。 ボードが平らに置けるうちにやる。先へ進む前に、 U4 の輪郭の内側の星印付きのパッドを見ておくこと: ソケットがその上に かぶさるので、きれいでなければならない。
  2. 二つのセラミックコンデンサ。
  3. ソケット。 対角の角のピンを二本仮止めし、ソケットが浮かずに座って いて切り欠きの向きが正しいことを確かめてから、残りをはんだ付けする。
  4. 電解コンデンサは最後。 長い足を + へ。
  5. チップを挿す前に、テスター。 各ソケットのピン 32 とピン 16 の間は +5 V とグラウンドの間で、開いていなければならない。五つのブリッジは どれも閉じていて、パッド三つのジャンパではどれも、作らなかった側が 開いていること。
  6. チップを挿す。 PRG を U4 に、CHR を U3 に。それからコンソールの前に リーダーへ。

パッド三つのジャンパでは、両方のパッドにフラックスを塗り、小さなはんだの 粒を一つだけ使って、三つ目のパッドから離しておく。粒がすき間をまたげない なら、切り取った部品の足を渡してはんだ付けすれば届く。

はんだごてについて。ここで何かを測ったわけではなく、助言として: 温度調節の できる 60 から 70 W のこてで、はんだガンではないもの (ワット数は、この ボードの銅を相手に温度を保つためで、もっと熱くするためではない)。有鉛の 63/37 のやに入りはんだなら 320 から 350 度、無鉛なら 350 から 380 度。 小さな平たいこて先、およそ 1.6 から 2.4 mm のもの。針のように尖った先は 熱をうまく伝えないからだ。はんだは 0.6 から 0.8 mm。一つの接合に二、三秒。 パッドとピンを一緒に温め、はんだは接合部へ送り込む。

山の残りは別の組み立てのためのもの

品刻印何であるかどこのものか
マッパー 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 ピンのチップAX5904SxROM のボードがマッパーの位置に、MMC1 と並べて名指ししている部品SxROM のボードの U5
黒いアダプタTL866, mousebitelabs v3.240 ピンと 42 ピンの EPROM をプログラマに座らせる要らない: 32 ピンのチップはプログラマ自身のソケットに収まる
緑のアダプタNES CARTRIDGE ROM ADAPTER, NES MASK ROM27C や 39SF の部品を、元のボードのマスク ROM の位置に載せるドナーのボードを使う組み立て用で、これではない
40 ピンのチップWDC W65C02S6TPG-14CMOS の 6502 プロセッサNES の部品ではない。65C02 のコンピュータのもの
40 ピンのチップWDC W65C22S6TPG-1465C22 インターフェースアダプタ: ポート二つとタイマ二つ同じコンピュータのもの
28 ピンのチップCY62256NL-70PC32 KiB のスタティック RAM、70 nsCHR RAM のボードの CHR の位置 (紫のボードは二枚ともそこに 62256 を挙げている)。タイルが ROM であるこのカートリッジではない
14 ピンのチップSN74LS00N2 入力 NAND ゲートが四つこれらのボードのどれでもない: ディスクリートのボードが取るのは '02、'161、'32 だ

65C02 の上に 65C22

スタティック RAM と NAND

AX5904

マスク ROM のアダプタ

プロセッサ、インターフェースアダプタ、RAM、NAND は、ブレッドボードで組む 65C02 のコンピュータによくある一式だ (山を見ての読みで、誰かがそう言った わけではない)。W65C02 は CMOS の部品で、シミュレータがそのダイを走らせている NMOS の 6502 ではない。

まだ開いていること

  • リセット線から読んだロックアウト: 目では答えが出ていて、 tools/lockout-check.py がそれを記録にする (lockout.md)。
  • 二枚目のボード: 五つのブリッジ、コンデンサ、二つのチップ。
  • 完成したカートリッジをリーダーで吸い出したもの。その本体の crc32 は 21091B99 でなければならない。上のジャンパの表を証明するのもこれだ。
  • コンソールに差したカートリッジと、取り込んだフレームから読んだ帯。

ビルド時に nes-bench/docs/cal-cart-build.md から取り込まれる。リポジトリが唯一の写しだ。報告書は独自の作業用語をいくつか使っている: 報告書で使われる言葉。