Skip to content

実機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配線図

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

ブレッドボード配線

Mega挿し位置

手順(チップは基板に載せる前、ブレッドボード上でテストする):

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.bin
  • prg_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 へ ​

ジャンパ配線

はみ出し4ピンの実装イメージ

チップpin信号つなぐ先備考
1A18+5Vアドレス固定 (GNDでも可)
2A16+5Vアドレス固定 (GNDでも可)
31/WE+5V必須: 誤書き込み防止
32Vdd+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)