Skip to content

実機ROM化ガイド: DMG-A06-01 / DMG-A02-01 基板の マスクROM を SST39SF040 に載せ替える

自作ゲーム(gb_AIDopagaki)を実機ゲームボーイカラーで動かすため、MBC5 ドナー基板 (DMG-A06-01 / DMG-A02-01、欧州・北米版が手に入るなら DMG-A07-01)の 32 ピン SOP マスクROM をフラッシュに載せ替え、「外す→焼く→載せる→動く」の工程を検証する。

本書は実機作業前の下書きである。 「実測」と書いていない数値は一次資料の引用か推定で、 GB 実機での検証は未実施。作業のたびに日付入りで実測値へ置き換えること。

先に決めること — 2 つの経路と 2 つのジャンパ方式

本ガイドは 2 段構えで進める。順番を守ること。

工程検証(先にやる)完成形(後でやる)
経路経路 B経路 D
フラッシュ手持ちの PDIP-32SST39SF040-70-4C-PHETSOP-32SST39SF040-...-TU/-WHE または Am29F040B TSOP-32 E
実装UEW 30 本でパッドへ手配線**timville85 変換基板(0.8mm 厚)**に載せてからパッドへ
ジャンパ方式 1(pin1→GND / pin31→+5V)方式 2(pin1→パッド31 / pin31→Audio + 47kΩ)
使える ROM 容量256KiB まで512KiB 全域
シェル❌ 閉まらない。上面に角穴を開ける✅ 合計約 2.0mm で閉まる
目的工程を 1 枚潰して通す実際に遊べる形にする

経路 A(PLCC-32 + 0.4mm 変換基板)は保留。 合計 3.6〜4.0mm で、シェル内クリアランス (約 3.2〜3.5mm)に対して理論値では入らない側に倒れている。STEP 1 でシェル内寸を実測し、 3.8mm 以上が出たときだけ復活させる。

方式 1 と方式 2 を混ぜないこと。 既製の変換基板(timville85)は方式 2 で配線済みなので、 変換基板を使うなら方式 2 をそのまま採る。方式 1 で使うには基板側の改造が要る。

全体の流れ

ロードマップ

使う部材

詳細な価格・入手先・確度は docs/cart-mod.md の BOM(E-1〜E-4)を見ること。ここは持ち物チェック用。

工程検証(経路 B)に必要なもの

部材確認状況
ドナーカート(基板シルクに DMG-A06-01 / DMG-A02-01 / DMG-A07-01)×2〜3要確認(実物未入手)
SST39SF040 (512KB フラッシュ, 5V, PDIP-32) ×2 以上✅ 手持ちあり
Arduino Mega (ELEGOO) — フラッシュライターとして使用✅ NES 版で実績あり
3.8mm ガンドライバ(カートを開ける特殊ネジ用)要確認(未購入・価格未取得)
ジャンパ用ポリウレタン線 (UEW φ0.2mm 前後)要確認
積層セラミックコンデンサ 0.1µF(フラッシュのパスコン)要確認
シェル加工工具(ホビーナイフ / 小型ルーター)要確認
はんだごて・吸取線・フラックス・ヒートガン・拡大鏡✅ 一式あり
テスター(導通・電圧)
ノギス(STEP 1 のシェル内寸実測用)要確認

完成形(経路 D)に追加で必要なもの

部材確認状況
SST39SF040 TSOP-32-TU / -WHE、8×14mm)要確認(EOL。流通在庫のみ
代替: Am29F040B TSOP-32 Standard(発注記号 EF=Reverse は番号逆順で使用不可要確認
SOP-32 ↔ TSOP-32 変換基板(timville85 TSOP-32 版 Gerber を 0.8mm 厚で発注)要確認(未発注。Gerber の実在は確認済み)
TSOP-32 → DIP-32 書込みアダプタ(Mega で焼くため)要確認(入手性そのものが未検証
抵抗 47kΩ 1/6W(方式 2 の /WE プルアップ)要確認

保留(経路 A)— シェル実測で GO が出たときだけ

部材確認状況
SST39SF040 PLCC-32-NHE要確認
SOP-32 ↔ PLCC-32 変換基板(timville85 PLCC-32 版 Gerber を 0.4mm 厚で発注)要確認(Tindie では売っていない。GitHub の Gerber のみ)
PLCC32 → DIP32 変換ソケット(PLCC 品を焼くとき)要確認

秋月の「SST39VF040-70」(¥150) を掴まないこと。 これは 2.7〜3.6V の 3.3V 品で、 GB のカートスロット (5V) では動かない。必要なのは SST39SF040SFVF ではない)。


STEP 1: ドナーを選別する

この工程で何をするか: カートを開け、基板シルクの型番を読み、ROM のピン数を数えて当たりかを判定する。ついでにシェル内寸を測る。 失敗するとどうなるか: TSOP-II 44 ピンのドナーを掴むと本手順が一切適用できない。カートを 1 枚無駄にする。 所要時間目安: 1 枚あたり 5 分

ドナーの見分け方

  • カートは 3.8mm ガンドライバでないと開かない。普通のドライバでは舐めるだけ
  • 基板シルクの型番を読む。DMG-A06-01 / DMG-A02-01 が当たりDMG-A07-01 も当たりだが日本版では稀)
  • 外れの型番を先に覚える: DMG-A08-01/-10DMG-A03-01/-10DMG-A09-01/-10DMG-A18-01DMG-A04-01 は ROM が細ピッチ TSOP なので本手順の対象外。特に DMG-A08 は日本版 50 件で最も遭遇しやすい外れ
  • 「GBC 専用ソフトだから CGB- 基板」ではない。 GBC 世代でも基板型番は DMG- のまま。 CGB- で始まるのは CGB-A32-01(MBC6) だけ
  • ROM のピンを数える。片側 16 本 × 2 = 32 本なら当たり(SOP-32・ピッチ 1.27mm)。 片側 22 本 × 2 = 44 本なら TSOP-II で本手順の対象外(ピッチ 0.80mm)
  • ROM 容量では判定できない。 DMG-A04-01(ポケモンピンボール日本版)はシルクが 4M/8M MROM で 8Mbit だが、載っている MX23C8006-12 は細ピッチ TSOP。MX23C8005(SOP-32) と MX23C8006(TSOP) は 末尾 1 桁違い。判定は ①基板シルクの型番 → ②片側 16 本 × 2 を数える の 2 段構えで行う
  • ROM のシルクは通常 U12M/4M/8M -MROM の印字がある
  • SRAM・電池・電池監視 IC が載っていても構わない。 DMG-A02-01 / DMG-A06-01 の ROM フットプリントは DMG-A07-01 と同一。セーブ不要なので余分な実装は無視してよい
  • 外す前にスマホで基板の両面を撮影しておく(ROM の切り欠き/●印の向き、シルク、MBC5 の pin1 位置)
  • 🚧 シェル上半分の内側深さをノギスで実測し、日付入りで記録する。 この 1 数値で経路 A(PLCC-32)の可否が決まる(3.8mm 以上なら復活、未満なら経路 D 確定

買い方: 日本では「指名買い」が正解

ジャンクまとめ売りからの選別は日本では成立しない。 gbhwdb の日本版登録 149 件のうち SOP-32 の MBC5 基板は 14 件(9.4%)、DMG-A07-01 単独では 3 件(2.0%)しかない。 ジャンク 1 本が ¥22〜¥180 でも、A07 狙いなら実効単価は 10〜50 倍になる。 基板型番が判明している安価タイトルを指名買いするほうが安く確実。

タイトル型番基板駿河屋 掲載価格(2026-09-02)
なかよしペットシリーズ1 かわいいハムスターDMG-B7HJ-JPNDMG-A06-01¥480〜¥1,500
サンリオタイムネット 未来編DMG-ATFJ-JPNDMG-A02-01¥800〜¥2,210
ビートマニア GB2 ガッチャミックスDMG-A2GJ-JPNDMG-A07-01¥900〜¥3,480
がんばれゴエモン 天狗党の逆襲DMG-AGUJ-JPNDMG-A06-01¥1,620〜¥4,260
ポケットボウリングDMG-AVBJ-JPNDMG-A07-01¥1,680〜¥5,200

ゼルダの伝説 夢をみる島 DX(DMG-AZLJ / DMG-A02-01)は基板としては合致するが、人気作なので潰さない。gbhwdb の登録は個体単位。 同一タイトルでも別リビジョンがありうるので、届いたら必ず開けて確認する。


STEP 2: マスクROM を外す

この工程で何をするか: U1 の 32 ピン SOP マスクROM だけを外し、パッド 32 箇所を平らにならす。 失敗するとどうなるか: パッドが剥がれる。その信号は MBC5 のピンから引き直せるが難度が跳ね上がる。MBC5 を飛ばすと基板ごと廃棄。 所要時間目安: 15〜30 分

ROM 除去

  • 外すのは U1 の 32 ピン SOP マスクROM のみ
  • SOP は 1.27mm ピッチなので、ヒートガンで温めてピンセットで持ち上げるのが速い。NES の DIP のような足切り工法は不要
  • 吸取線でパッド 32 箇所を平らにならす。フラックスは多めに
  • MBC5・エッジコネクタ・パスコンには触らない
  • パッド剥がれ注意。 剥がれたら、その信号を MBC5 のピンから直接引く(docs/cart-mod.md の MBC5 ピン対応表)
  • 剥がれやすいのは端の pin 1 / 16 / 17 / 32 付近
  • 🚧 経路 D(方式 2)に進むなら、この時点で基板を観察して 「カートエッジ pin 31(VIN / Audio In)にビアかテストパッドでアクセスできるか」を確認する。 無ければエッジフィンガーへ直付けすることになる

STEP 3: .gbc と書き込みイメージを作る

この工程で何をするか: ROM ヘッダを整え、エミュレータで動作を確認し、512KB 充填イメージを生成する。 失敗するとどうなるか: ヘッダが壊れているとブート ROM がその場でハングする。実機で真っ白になり、原因が配線かROMか分からなくなる。 所要時間目安: 30 分

  • .gbcrgbfix 済みであること。ブート ROM は $0104-$0133 の任天堂ロゴと $014D のヘッダチェックサムを検証し、合わないとその場でハングする

    bash
    rgbfix -C -m 0x19 -r 0x00 -v -p 0xFF build/aidopagaki.gbc

    -v -p 0xFF だけでは足りない。 -v(= -f lhg) と -p が触るのは $0104-0133 / $014D / $014E-014F / $0148 だけで、$0143 / $0147 / $0149 は 別フラグ(-C / -m / -r)が要る

  • ヘッダの値を確認する: $0143 = $C0(CGB 専用)/ $0147 = $19(MBC5・RAM なし)/ $0149 = $00

  • 方式 1(経路 B)を採るなら $0148$02(128KB)か $03(256KB)でなければならない。$04(512KiB)は方式 1 の配線では原理的に動かない

  • 書き込み用 bin は 512KB 全域に同一データを繰り返した形で生成する(256KB×2 回、または 128KB×4 回)。 ⚠ ただしこれは pin 1 → GND のジャンパ 1 本が失敗したときの保険でしかない。 A17(パッド 30)の配線ミスは充填では救えない

  • PyBoy で最後まで動くことを先に確認する。 実機で映らないとき「ROM が悪いのか配線が悪いのか」を分離できる

bash
python3 tools/make_gb_flash_bin.py build/aidopagaki.gbc build/flash/gb_512k.bin
# → input 262144 bytes (256 KiB) x2 -> 524288 bytes

STEP 4: Arduino Mega で SST39SF040 に書き込む

この工程で何をするか: フラッシュをブレッドボードに挿し、ID 読み出しで配線を確認してから焼く。 失敗するとどうなるか: 基板に載せてからでは書き直せない。載せ替えからやり直しになる。 所要時間目安: 配線 30 分 + 書き込み・ベリファイ 約 40 分

NES 版のライター(issue #7 で実装済み)をそのまま使う。 ファームウェア nes_aiDopagaki/firmware/mega-writer/mega-writer.ino + ホスト CLI nes_aiDopagaki/tools/flashnes.py無改造で流用できる。配線・手順・トラブルシュートの正典は docs/writer.md

Mega 配線図

PLCC-32 品を焼く場合は PLCC32→DIP32 変換ソケットを噛ませる(ピン番号は DIP-32 と完全一致)。 TSOP-32 品(経路 D)を焼く場合は TSOP32→DIP32 書込みアダプタが要る。 ⚠ TSOP-32 のピン番号は DIP-32 と一致しないTSOP = ((DIP+7) mod 32)+1 の巡回シフト)ので、 アダプタ無しでブレッドボードに直挿しはできない。

変換基板の載せ方とシェル収まり

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

bash
PORT=/dev/tty.usbmodem1101
FLASHNES=../nes_aiDopagaki/tools/flashnes.py

# 1. ID読み出し = 配線チェック (0xBF 0xB7 が返れば配線OK)
python3 $FLASHNES --port $PORT id

# 2. 書き込み (消去→書き込み→リードバックベリファイまで自動)
python3 $FLASHNES --port $PORT write build/flash/gb_512k.bin
  • --ines は付けない。 .gbc に iNES ヘッダは無い。付けると not an iNES file (missing 'NES\x1a' magic) で落ちる
  • ID が読めない時は docs/writer.md の切り分け手順に従う (まずハーネス/コネクタブロックの挿し直し → 変換アダプタ → 電源 → 向き → 制御3線 → データ → アドレス)。 NES 版 2026-08-13 の実機検証では、配線が全部正しいのに 2×18 コネクタブロックの半挿しで 0xFF 0xFF になっていた
  • 512KB フル書き込みはベリファイ込みで 40分前後かかる(約240B/s、NES 版 2026-08-13 実測。GB では未計測)。 書き込み中は配線・ケーブルに触れない
  • ⚠ ファームウェアは 2026-08-13 の修正版(受信バッファ溢れ対策)以降を使うこと。 旧版は ERR rx timeout で必ず失敗する

STEP 5a: フラッシュを載せる(ピン 1 と 31 が命)

この工程で何をするか: 30 本の一致するピンをパッドへ接続する。pin 1 と pin 31 は繋がず STEP 5b へ回す。 失敗するとどうなるか: 1 本違うだけで起動しない。まとめて配線してから確認すると原因が特定できなくなる。 所要時間目安: 経路 B(手配線)2〜4 時間 / 経路 D(変換基板)1〜2 時間

SOP-32 パッド ↔ フラッシュのピン対応

GB マスクROM と JEDEC フラッシュのピン配置は、32 本中 30 本が一致する。違うのは 2 本だけ。

パッドマスクROM 側フラッシュ側
1A19A18❌ 不一致
31A18/WE❌ 不一致
その他 30 本✅ 一致
  • フラッシュの pin 1 と pin 31 はパッドにそのまま繋がない。 STEP 5b で方式 1 / 方式 2 のどちらかへ回す
  • 残り 30 本を同番号のパッドへ接続する
  • 経路 B(手配線・PDIP-32): UEW 30 本でパッドへ配線する。 ⚠ pin 16(VSS) と pin 32(VDD) → pin 22(/CE) と pin 24(/OE) → アドレス → データの順で進め、 10 本ごとにテスターで導通と隣接ショートを確認する。32 本まとめてからでは原因を特定できない
  • 経路 D(変換基板・TSOP-32): TSOP-32 品を 0.8mm 厚の変換基板にはんだ付けし、 変換基板の castellated via をパッドへ載せる。 ⚠ 既製基板(timville85)は方式 2 で配線済みなので、pin 1 / pin 31 の処理は基板が済ませている。 残る作業は /WE のテストパッドを Audio pin へ引き、47kΩ でプルアップすることだけ
  • SST39SF040 には半月ノッチが無いロットがある(NES 版 2026-08-13 検証の個体がそう)。 その場合はパッケージ端寄り・幅中央の丸いくぼみ(●)がある端が pin1/pin32 側。 端から離れた丸マークは成形跡なので向き判定に使わない
  • TSOP-32 のピン番号は DIP-32 と一致しない(巡回シフト)。変換基板のシルクに従うこと

パッケージとシェル内クリアランス

実クリアランスは 約 3.2〜3.5mm、上限でも 4mm 未満。 根拠は gbdev フォーラム #252 での Tauwasser の実測証言 "the top shell is definitely < 4 mm" / "A regular CR2032 is already a tight fit"(CR2032 = 3.2mm)。

パッケージ実高+ 変換基板合計判定
TSOP-32(8×14mm)1.0〜1.2mm0.8mm約 2.0mm完成形の第 1 候補
PLCC-323.18〜3.56mm0.4mm3.6〜4.0mm🚧 要実測(0.8mm 基板なら 4.15mm でアウト)
PDIP-324.32〜5.08mm(全長 41.8mm)確実に不可。経路 B はシェル加工前提
  • DIP-32 はシェルに確実に入らない。 経路 B ではシェル上面に角穴を開けてチップを逃がす
  • PLCC-32 も変換基板を足すと入らない可能性が高い。 STEP 1 の実測で 3.8mm 以上が出るまで採用しない
  • ジャンパ配線(STEP 5b)が終わるまで実機に挿さない

STEP 5b: ピン 1 と 31 を処理する(方式 1 / 方式 2)

この工程で何をするか: 不一致の 2 本を、選んだ方式に従って引き直す。 失敗するとどうなるか: 本改造で唯一の致命傷ポイント。 pin 31 を間違えるとフラッシュが常時書き込みモードに入り、内容が壊れる。/CE を GND 固定にすると本体側が壊れる。 所要時間目安: 15 分

ジャンパ 2 本

方式 1(経路 B / 工程検証・実効 256KiB 上限

フラッシュ pin信号パッド側の信号つなぐ先備考
1A18A19 (MBC5 RA19) または未接続GND(パッド 16)入力を浮かせない
31/WEA18 (MBC5 RA18) または未接続+5V(パッド 32)必須。忘れると常時書き込みモード

+5V はパッド 32、GND はパッド 16 から取るのが最短。

この方式の実効 ROM 上限は 256KiB($0148$03)。 MBC5 のバンク上位はフラッシュに届く RA14〜RA17 の 4 本だけになる。 RA18 は /WE に明け渡すため切断され、A18 は GND 固定なので、 $0148 = $04(512KiB)の ROM は原理的に動作しない。 対象 ROM は 128/256KB なので実害はないが、将来 512KiB へ拡張するなら方式 2 へ移行するしかない。

方式 2(経路 D / 完成形・512KiB 全域 + 挿したまま書き換え可

フラッシュ pin信号つなぐ先備考
1A18パッド 31(MBC5 RA18)へクロス配線RA18 をフラッシュの A18 として使う
31/WEカートエッジ pin 31(VIN / Audio In) + 47kΩ で +5V へプルアップ通常時は H(書き込み禁止)
パッド 1(RA19)は未接続のまま512KiB では RA19 以上を使わない

これが業界標準の手法である。根拠: insideGadgets の GBxCart 対応表『SST39SF040 – 512KByte / Audio pin as WE』、 timville85 / MBC1-Flash README『WE via Audio (Cartridge Pin 31)』、 sillyhatday / GAMEBOY-MBC5-2MB

既製の変換基板(timville85 PLCC-32 / TSOP-32)は方式 2 で配線済み。 穴 31 → フラッシュ pin 1、フラッシュ pin 31(/WE) はテストパッド経由で Audio へ、穴 1 は未接続。 方式 1 で使うには基板側の /WE 引き回しを +5V へ振り替える改造が要るので、 既製基板を使うなら方式 2 をそのまま採るのが正解。

/WR(カートエッジ pin 3)を /WE に使ってはいけない。 SST39SF040 のコマンドアドレス $5555 / $2AAA が MBC5 のバンク切り替えレジスタ $2000-2FFF と衝突し、書き込み中に勝手にバンクが切り替わる。

やってはいけないこと(両方式に共通)

  • pin 31 を GND に落としてはいけない。 /WE はアクティブ Low なので、GND = 書き込み許可の つけっぱなしになる。gbdev フォーラムの gekkio の指示: "This MUST be connected to +5V"
  • pin 31 をパッド 31 に繋いだままにしてはいけない。 パッド 31 には MBC5 の RA18 が来ており、 256KB 以下の ROM では常に L。つまり常時書き込みモードと同じことになる
  • /CE(パッド 22) を GND 固定にしてはいけない。 /RD は本体 WRAM の読み出しでも L になるため、 フラッシュと WRAM がデータバスを同時に駆動して本体を壊しうる。/CE はカートエッジの A15 が 駆動する既存配線のまま使う(何もしない)

STEP 6: 実機で動作確認

この工程で何をするか: 通電前にテスターで配線を確認し、GBC / GBA に挿して起動を見る。 失敗するとどうなるか: 確認を飛ばして通電すると、最悪 /CE のバス衝突で本体側が壊れる。 所要時間目安: 30 分

信号の流れ

  • 通電前にテスターで確認する(優先順):
    1. pin 32 ⇔ パッド 32 (+5V)、pin 16 ⇔ パッド 16 (GND)
    2. 方式 1: pin 31 が +5V に落ちている / pin 31 ⇔ パッド 31 が切れている / pin 1 が GND に落ちている / pin 1 ⇔ パッド 1 が切れている 方式 2: pin 1 ⇔ パッド 31 が導通 / pin 31 ⇔ カートエッジ pin 31 が導通 / pin 31 が 47kΩ 経由で +5V に上がっている / pin 1 ⇔ パッド 1 が切れている
    3. パッド 30 (A17) ⇔ pin 30 の導通。⚠ 方式 1・256KiB ではここがバンク最上位。 切れていると上位 8 バンクが読めず「128KiB 相当の挙動」になり、切り分けが難しい
    4. pin 22 ⇔ パッド 22、pin 24 ⇔ パッド 24
    5. 隣接ピン間のショートがないこと(32 箇所全部)
    6. 🚧 パッド絶対番号の裏取り: パッド 32 ⇔ VCC / パッド 16 ⇔ GND / パッド 22 ⇔ カートエッジ A15(pin21) / パッド 24 ⇔ カートエッジ /RD(pin4)
  • シェルに入れる前に基板のまま挿して電源 ON
  • 実機確認は GBC か GBA から始める。 本 ROM は CGB 専用($0143 = $C0)だが、DMG / MGB のブート ROM は $0143 を見ない (検証するのはロゴと $014D だけ。Pan Docs は $C0 について "hardware ignores bit 6 … functions the same as $80" とも書いている)。 DMG で起動するかどうかはゲーム側の CGB 判定次第で、CGB 専用のパレット・VRAM バンク・倍速コードは DMG では正しく動かない。「動かない」の原因を増やさないため、確認は GBC / GBA から始める
  • 映らない場合は docs/writer.md の 「ベリファイまで通ったのに実機で映らない」の順に確認する
  • 🚧 実装後に必ず読み戻してベリファイする。 はんだ付けの熱で書き込み済みの内容が失われるかは未検証
  • 起動したらシェルに戻す(経路 B は角穴を開けてから)

その後の展開

経路 B(PDIP-32 手配線 + 方式 1 + シェル加工)で工程検証が済んだら、 **経路 D(TSOP-32 + 0.8mm 変換基板 + 方式 2)**でシェルが閉まる完成形を作る。

殻が閉まる実例があるのは TSOP 系だけ(JRodrigo の TSOP-48 アダプタ、Timville の TSOP-40/48)。 完成形は TSOP-32 を第一候補とする。 PLCC-32(経路 A)を採る場合は 0.4mm 変換基板を指定し、STEP 1 で測ったシェル内寸が 3.8mm 以上であることを確認してから本採用する。

変換基板は timville85 の Gerber(Apache-2.0)を JLCPCB / PCBWay に発注する。 ⚠ Tindie で売られているのは TSOP-40/48 アダプタで、PLCC-32 版は販売されていない。

⚠ 改造とは切り離して ROM 単体が実機で動くことを先に確認したい場合は、 市販の MBC5 フラッシュカート (insideGadgets "Gameboy 512KB/32KB (ROM only) Flash Cart"、$11〜$14・価格は要確認

  • GBxCart RW を使う。実機作業に着手する前にこれを済ませておくと、切り分けが劇的に楽になる。

実機作業の記録(🚧 未実施)

作業したら日付入りで埋めること。この表が本ガイドで最も価値のある情報になる。

項目結果日付
ドナーの実基板シルクと ROM ピン数📋
シェル上半分の内側深さ(ノギス実測)📋
→ 経路 A(PLCC-32)の可否判定📋
パッド絶対番号の導通確認(32/16/22/24)📋
カートエッジ pin 31 へのアクセス可否📋
実装後の読み戻しベリファイ(熱で消えていないか)📋
実機(GBC)起動確認📋

画像の再生成: python3 tools/gen_gb_hardware_guide.py && python3 tools/gen_gb_wiring_diagram.py(出力先はスクリプト内 OUT