FF3 の stack 関連のバグ

FF2 での技が FF3 で応用出来るか簡単に調べました.

stack の概要

  • 基本は FF2 と同じです。 FF3 の場合は stack push と pop で SE が異なるのでわかりやすいです。
  • vector table に書かれた NMI address は $0100, それに加え IRQ/BRK address $0103 になります。

push と pop がペアになっておらず push ばかりで進むのはサスーン城内部で、他にも多数有るようです。

push 28 回以上のバグ (0 クリアバグ)

サスーン城入ってすぐの扉を14回以上往復 (28 回 push) したあと、徒歩で城外へ出るかテレポやラッコのあたまで城外へ出るとプログラムが停まります。

徒歩とテレポでは挙動が異なるようですが、徒歩では下記のようでした。

  • stack area の address $010F-$017F までを data 0 でクリアする
  • stack pointer から底へ順番に履歴を参照しながら外に出る

FF2 は直接 stack の底を読んで移動画面へ復帰しますが、 FF3 は順番に読んでいます。28回 push すると stack pointer が $017f より上になり、外に出るとstack 参照より stack area の 0 クリアを先にやってしまうので(酷いバグだ)、0 クリア後の rts 命令で PC が $0001 になります。

$0001 から PC に移動した際には address $0000 から $0022 付近までの data は 0 でクリアされているので BRK 命令 と RTI 命令をひたすら実行します。 $0023 付近で RTI 命令が入るので stack pointer が 3 byte 下へ進み、 PC は $0001 に戻ります。

扉の移動では stack pointer が 5 byte 上へ進むため、暴走時の stack pointer が 3 と 5 の倍数の場合は stack の辻褄が一部有ってゲームは停まらず謎の場所へ移動することがあります(30階層で起きる)。この場合、プレイヤーは一切移動出来ないのでテレポで強制的に外に出ましたが、プログラムは停止しました。

それ以外の場合は移動時の 5 byte の data がずれた値が PC になっていて、PC がよく $1Bxx ぐらいになりますが、 $6000 付近にはなりませんでした。

push 40 回程度のバグ (stack 溢れバグ)

同様に40回ほど push したあとに左の塔で戦闘を起こすと $0100 付近を上書きして停まります。さほど stack が深くない場合は戦闘画面が一見正常に動きますが、攻撃回数などの計算で stack があふれて暴走します。

この場合はどういう暴走をするかは詳しく調査をしていません.

これは早いのか

2年ほど前に投稿された TAS がかなり早いです。これは戦闘中にアイテム欄が溢れることを利用して、結果的にシナリオポインタを強引にエンディングに持っていく RAM 破壊技法です。

よってサスーン城でバグを起こしてもその方法より早いのかはあまり自信がありません。