エミュレーター確認手順
目的は、看板接触からクラッシュまでに最後に到達した境界ルーチンを特定し、修正後に遷移完了を確認することです。
本作は、ROMヘッダーに書かれたMBC1ではなく、非公認のNT-newマッパーによる特殊なバンク切替を必要とします。対応しないエミュレーターは、ゲームが指定した区画とは違うROM領域を読み込むため、白画面になったり、データを命令として実行してクラッシュしたりします。
このリポジトリで案内する実行環境はhhugboyとmGBAです。以下のデバッガー手順と修正版の動的確認にはmGBA 0.10.3を使用しています。EmuHawk 2.11.1のGambatteとSameBoyでは正常動作しませんでした。
未修正ROMは $240A に到達後、$241C の2回目のバンク呼び出しから復帰せず、$242A より前にクラッシュします。DE=1400 を与えた手動確認では呼び出し先から $FF9E へ正常復帰し、修正版ROMではステージ1から2への実際の遷移にも成功しました。
監視対象
可能なら書き込み監視(watchpoint)を設定します。
C21C: ステージ内状態。終了時に06 -> 07を期待C219: 全体状態。終了時に05 -> 06 -> 00を期待C21B: 各全体状態内のサブ状態C27D: 論理レベル番号。1面終了時に00 -> 01を期待
実行ブレークポイントは次の順に設定します。
240A— 終了演出の待機242A— レベル番号更新0C98— global mode 5 dispatcher0CA9— mode 5初期化0D9F— mode 5から6への移行0DA9— global mode 6 dispatcher0E64— 次レベルの内部ID選択
記録してほしい値
各ブレークポイントへ初めて到達したとき、以下を記録します。
- PC
- SP
- AF, BC, DE, HL
- 現在のROMバンク/マッパー状態(表示できる場合)
C219 C21B C21C C27Dの4 bytes
クラッシュ時には停止位置のPCと、その直前数命令も記録します。
期待される最短経路
240A -> 242A -> 0C98 -> 0CA9
-> 0D9F -> 0DA9 -> 0E64
1面終了時、242A 実行後は C27D=01, C21B=00, C219=05 が期待値です。0E64 では変換表により C21A=04 となり、その後 C219=00 へ戻るはずです。
修正版ROMでステージ1から2への画面遷移を確認済みです。画面記録はローカルの非公開検証資料として管理し、公開レポートには含めません。より長期の回帰確認を行う場合は、後続ステージのゴールでも同じ終了演出が正常に動くか確認します。