FF2 を調べてみたことを書いてみる

最終目的への解法にはならないけど、将来的に使えるかもしれないネタを書いてみる。

stack の data

エリア移動履歴は 5 byte の data が stack につまれる。

byte 0.1 $f2ca (戻る処理のPC)
byte 2 area 番号
byte 3 area 内 Y 座標
byte 4 area 内 X 座標
  • byte 0.1 を任意のアドレスを書く方法があればそれは最適だが、そんな方法は見つかっていない。
  • byte 2 は1フロアの番号で停まる番号も多いが、好きな場所に行ける。 0xf9 はシェイドの皇帝がいる。
  • byte 3, 4 はちゃんと指定しないと壁にうまるので移動できなくなる。
  • 移動できなくなる stack pointer の値が 0x011d なので (0x200 - 0x11d) / 5 を計算すると 45 がでる。


エリア移動履歴の先頭(stack の末尾)は 2 byte らしい。

byte 0.1 $f2c1 (戻る処理のPC)

外に出るだけ。引数はないっぽい。

本当にテレポ不可,デジョン不可?

パラメキア城は設定し忘れているエリアがあるので、stack を積むダンジョンにも設定し忘れがあればでかい。すべて確認した方がいい。

stack が進む場所

反乱軍のアジトの入り口と出口も stack を積む。ほかにもあるかも。

PC を $60bf に飛ばす方法

MMC1 には固定バンクモードというものがあって、これを設定できると、ROM の 0x00000-0x07fff を CPU の $8000-$ffff に張れる。この場合、reset,nmi,brk/irq のベクタが全て変わるのだが、 brk/irq のベクタが $60bf になる。
brk 命令は 0x00 なので、誤って実行しやすい。$60bf はアイテム覧の近くなのでRAMを操作しやすい可能性が高いし、名前欄に近い。
ただし、MMC1 を設定するには5回の書き込みが必要。通常処理に復帰させるのも大変かも。

この現象はたまたまトレースログを取っていたら発見できたが、それまでに CPU が PPU の IO port を命令として何度も実行していたので実機で本当に起こせるか不明。同じエミュでも再現できなかった。

PC を $4c47 か $7a79 に飛ばす方法

  • 階層を上限の1個前にして戦闘を開始する
  • 熟練度3以上の攻撃か回復の魔法を唱える
  • $0101, $0102 を破壊して jmp $4c47 か jmp $7a79 になる場合が多い

階層を上限の1個前にすることでちょっとした計算で $0102 まで破壊することはなくなったし、攻撃だけ使えば戦闘は正常に終了できる。その状態で計算時間が長い(熟練度が低いとだめみたい)魔法を唱えると、発生できる。魔法書を道具として使う場合も可。

jmp $4c47 はなにもない領域なので使えない。 jmp $7a79 は RAM だが見る感じ、PPU tilemap へ転送するバッファに見える。いまのところここから便利な命令は生成できていないので、$7a79 の書き込まれる状態を解析した方がよい。

攻撃/回復魔法では熟練度3で発生するが、補助魔法では発生しないみたいで、武器攻撃も熟練度が10程度でもだめ(16を越えた不正値なら起きるかも). 魔法の本を武器として使う場合でも試してみた方がいいかもしれない。
計算時間が長ければいいので、敵キャラの行動も利用できると思う。
妙な間といえば、おたからの画面の切り替えの処理時間も使えるかも?

また処理落ちの原理と $0101, $0102 の破壊原因をしっかり追ってないので、ここも詳細な調査が必要。 JSR だけではなく NMI 発生のデータも書いている気がする。(PC トレースに S レジスタも書いて出してくれると調査の手間が減るのに...)