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 に押さえた
ボード: ブリッジ五つ、コンデンサ三つ、チップ二つカートリッジが存在する開いている
リーダーの吸い出しコンソールが見るものは 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 の横のジャンパ

ボードの裏面

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

この接写は、裏面の 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)空: このコンソールのロックアウトは無効化してある
U5, U6, U774'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 ピンのチップ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 ではない。

まだ開いていること

  • 五つのブリッジ、コンデンサ、ボードに載せる二つのチップ。
  • 完成したカートリッジをリーダーで吸い出したもの。その本体の crc32 は 21091B99 でなければならない。上のジャンパの表を証明するのもこれだ。
  • コンソールに差したカートリッジと、取り込んだフレームから読んだ帯。

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