Appearance
実機ROM化ガイド: NROM基板の PRG を SST39SF040 に載せ替える
自作ゲーム(nes_AIDopaGaki)を実機ファミコンで動かすための第一歩として、 マッパー0(NROM)ドナー基板 HVC-NROM-256K-01 の PRG マスクROMをフラッシュに 載せ替え、「外す→焼く→載せる→動く」の工程を検証する。
全体の流れ

使う部材
| 部材 | 写真での確認状況 |
|---|---|
| ドナー基板 HVC-NROM-256K-01 (PRG/CHR マスクROM搭載) | ✅ |
| SST39SF040 (512KB フラッシュ, DIP-32) ×複数 | ✅ |
| 秋月 28P ICソケット (AXS202811K) | ✅ |
| Arduino Mega (ELEGOO) — フラッシュライターとして使用 | ✅ |
| はんだごて・はんだ吸取線 or 吸取器 | 要確認 |
| ジャンパ用の細い線 (ポリウレタン線/単線) | 要確認 |
STEP 1: PRG マスクROMを外す

- 外すのは エッジコネクタ寄りの下側チップ「HVC-SC-O PRG」(LH235604)。基板シルクにも
PRGと印字がある - 外す前にスマホで基板を撮影しておく(チップの切り欠き/●印の向きの記録)
- 28ピン全部のはんだを除去してから、ゆっくり持ち上げる。パターン剥がれ注意
- 上側の CHR は今回は触らない
STEP 2: 28Pソケットをはんだ付け
- マスクROMが付いていた向きと同じ向き(切り欠きをシルクの切り欠きマークに合わせる)で28Pソケットを取り付ける
- はんだブリッジがないか目視確認
STEP 3: テストROM + 書き込み用binの生成 (Claude担当)
- 現行のゲームは UNROM (Mapper 2, PRG 128KB, CHR-RAM) のため NROM ではそのまま動かない
- NROM 用に PRG 32KB + CHR-ROM 8KB のマッパー0テストROM をビルドする
- 書き込みbinは 512KB 全域に同一データを繰り返した形で生成する (PRG: 32KB×16回)。これにより A15〜A18 がどのレベルに固定されていても正しく読める
STEP 4: Arduino Mega で 39SF040 に書き込み
リポジトリ既存のライター(issue #7 で実装済み)を使う。 ファームウェア firmware/mega-writer/mega-writer.ino + ホストCLI tools/flashnes.py。 配線・手順・トラブルシュートの正典は docs/writer.md。

ブレッドボードの穴位置ベースの配線図と、Mega 側 2×18 ヘッダの挿し位置(外側=奇数列):


手順(チップは基板に載せる前、ブレッドボード上でテストする):
bash
# 1. ファームウェア書き込み (ポート名は arduino-cli board list で確認)
arduino-cli compile --fqbn arduino:avr:mega firmware/mega-writer
arduino-cli upload -p /dev/cu.usbmodemXXXX --fqbn arduino:avr:mega firmware/mega-writer
# 2. ID読み出し = 配線チェック (0xBF 0xB7 が返れば配線OK)
python3 tools/flashnes.py --port /dev/cu.usbmodemXXXX id
# 3. 書き込み (消去→書き込み→リードバックベリファイまで自動)
python3 tools/flashnes.py --port /dev/cu.usbmodemXXXX write build/flash/prg_512k.binprg_512k.bin(512KB繰り返しイメージ)をそのまま全域に書くこと。 32KBだけ書くと未書き込み領域($FF)が残り、オーバーハング実装でA15-A18が どのバンクを指しても動く前提が崩れる- ID が読めない時は docs/writer.md の切り分け手順(まずハーネス/コネクタブロックの挿し直し→電源→向き→制御3線→データ→アドレス)に従う。 2026-08-13 の実機検証では、配線が全部正しいのに 2×18 コネクタブロックの半挿しで
0xFF 0xFFになっていた - 512KB フル書き込みはベリファイ込みで40分前後かかる(約240B/s)。書き込み中は配線・ケーブルに触れない
- ファームウェアは 2026-08-13 の修正版(受信バッファ溢れ対策)以降を使うこと。 旧版は
ERR rx timeoutで必ず失敗する(詳細は docs/writer.md)
STEP 5a: フラッシュをソケットに載せる(向きが命)

- 39SF040 は 32ピン、ソケットは 28ピン → 下端(GND側)を揃えて挿し、上4ピン(1・2・31・32)をはみ出させるのが正しい状態
- チップの 切り欠き(ノッチ)は元のマスクROMと同じ向き
- ⚠ SST39SF040 には半月ノッチが無いロットがある(2026-08-13 検証の個体がそう)。 その場合はパッケージ端寄り・幅中央の丸いくぼみ(●)がある端が pin1/pin32 側 = ノッチ相当。端から離れた丸マークは成形跡なので向き判定に使わない
- 対応確認: チップ pin3 → ソケット pin1 / チップ pin16 → ソケット pin14
- ⚠ 向きを逆にすると通電した瞬間に破損する
- ⚠ ジャンパ配線(STEP 5b)が終わるまでファミコンに挿さない
STEP 5b: はみ出した4ピンをジャンパで +5V へ


| チップpin | 信号 | つなぐ先 | 備考 |
|---|---|---|---|
| 1 | A18 | +5V | アドレス固定 (GNDでも可) |
| 2 | A16 | +5V | アドレス固定 (GNDでも可) |
| 31 | /WE | +5V | 必須: 誤書き込み防止 |
| 32 | Vdd | +5V | 必須: 電源。忘れると動かない |
- +5V は pin30 の足(ソケット pin28 = +5V に刺さっている)から取るのが最短
- 4本ともまとめてはんだ付けしてOK
STEP 6: 実機で動作確認
- カートリッジシェルに入れる前に基板のままファミコンに挿して電源ON
- テストROMのタイトル画面が出れば工程検証成功
- 映らない場合: ①ノッチの向き ②ジャンパ4本(特に Vdd) ③ソケットのはんだ を順に確認
その後の展開
NROM での工程検証が済んだら、本命の UNROM 青カートリッジ(LS161/LS32 + PRG 128KB + CHR-RAM = 現行ビルドと同一構成)の PRG を同じ手順で載せ替えて、 aidopagaki 本編を実機で動かす。
画像の再生成: python3 tools/gen_hardware_guide.py(出力先はスクリプト内 OUT)