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つです。
- EmuHawkのGBコアへNT-newマッパーを実装します。
- ROMを再配置し、実際に使われる8 KiBバンクの組み合わせを標準MBC5の16 KiBバンクへ変換します。
1はエミュレーターのカスタムビルドが必要です。2は通常版EmuHawkで動かせる可能性がありますが、全バンク切替の追跡、ROM拡張、切替ルーチンの書き換え、全ステージの回帰確認が必要です。
現段階では、mGBA互換版を正式な修正版として維持し、MBC5版は実験用途に限定します。