EmuHawk互換化の実験

標準MBC5への単純変換と、その結果

結論

ROMヘッダーを標準MBC5へ変更するだけでは、EmuHawkでプレイ可能にはなりませんでした。

実験版ROMはEmuHawk 2.11.1のGambatteとSameBoyでMBC5として読み込まれました。しかし、1800フレーム実行し、StartとAの入力も加えた結果、表示は白一色のままでした。CPUも正常なゲームループへ入りませんでした。

したがって、このリポジトリで案内する範囲では、本作の実行にはNT-new対応の hhugboyまたはmGBAを使用してください。修正版の動作確認済み環境はmGBA 0.10.3です。

警告実験版はプレイ用ではありません

--experimental-mbc5 で生成するROMとIPSは、ヘッダー変換と再現試験のための成果物です。正常動作版として配布・使用しないでください。

仮説

mGBA 0.10.3は、このROMをヘッダーCRC32 8628A287 によって GB_UNL_NT_NEW と認識します。mGBAの実装では、NT-newは通常のMBC5動作に加え、$1400-$14FF への書き込み後に8 KiB単位の分割バンク切替を行えます。

一方、EmuHawk 2.11.1の標準GBコアにはNT-newマッパーがありません。MBC5へ単純変換すると、$4000-$5FFF$6000-$7FFF を独立して選ぶ動作を表現できません。この差が白画面の有力な原因です。

実験方法

ステージ遷移修正に加え、次のヘッダー変更を行いました。

項目 元ROM 実験版
カートリッジ種別 $0147 $01(MBC1) $19(MBC5)
ヘッダーチェックサム $014D $22 $0A
グローバルチェックサム $014E-$014F $4B10 $46E7
ヘッダーCRC32 8628A287 31194C44

生成には次のコマンドを使用します。

node tools/build-stage-transition-patch.mjs `
  pokemon_jade_pikachu.gb `
  build/pokemon_jade_pikachu_stage_transition_fixed_experimental_mbc5.gb `
  build/pokemon_jade_pikachu_stage_transition_fix_experimental_mbc5.ips `
  --experimental-mbc5

生成処理は、ヘッダーとグローバルの両チェックサム、IPSの再適用結果を検査します。

EmuHawkでの結果

環境 認識 1800フレーム後
EmuHawk 2.11.1 / Gambatte MBC5 白画面、正常なゲームループへ入らず
EmuHawk 2.11.1 / SameBoy MBC5 ROM 白画面、正常なゲームループへ入らず
EmuHawk 2.11.1 / GBHawk BIOS要求のため今回の自動試験では未完了 未確認

Gambatteでは終了時に PC=$0040、SameBoyでは PC=$FFFF となりました。いずれも画面制御レジスターは更新されていましたが、表示内容は白一色でした。

次に必要な対応

現実的な選択肢は次の2つです。

  1. EmuHawkのGBコアへNT-newマッパーを実装します。
  2. ROMを再配置し、実際に使われる8 KiBバンクの組み合わせを標準MBC5の16 KiBバンクへ変換します。

1はエミュレーターのカスタムビルドが必要です。2は通常版EmuHawkで動かせる可能性がありますが、全バンク切替の追跡、ROM拡張、切替ルーチンの書き換え、全ステージの回帰確認が必要です。

現段階では、mGBA互換版を正式な修正版として維持し、MBC5版は実験用途に限定します。