ファミコンの FF3 の RTA 草案

アイテムの並びがわかってもピアノを弾くのが未だ現実的なのですが、いくつか調査しました. 結果は cheap さんが提案したピアノ演奏+かわのたての方法が有力だとわかりました.

ピアノ演奏の原理

移動画面の CPU address $0072 (ポインタ)の参照先に data 0xdd があればエンディングが始まります.

ねこふんじゃったのピアノ演奏では CPU address $0072 の内容が $b29c になります. 戦闘中の RAM 破壊により、上位バイトだけが破壊されてポインタの内容が $e49c になります. ポインタから順番に data が読まれて CPU address $e4a3 に達したとき、 data が 0xdd なのでエンディングが始まります.

ねこふんじゃったのピアノ演奏後のポインタの下位バイトが 0x9c であることがかなり重要で、踊り子の後の下位バイト 0x88 ではスクリプトが途中で止まってしまいます.

ポインタの上位バイトにかわのたて (0xe4) をつかう場合は、下位バイトは 0x9c 付近かつ 0xa3 以下であることが必須ですが、ウル周辺では都合のいい場所が見つかりませんでした.

他の組み合わせ, ポインタ上位バイトの値ごとの考察

自分の調査ではポインタの上位バイトはアイテム数量またはアイテムIDにすることはある程度は可能です.

○ 0x07 (数量)

実現可能. TAS で利用したもの.

会話でポインタ下位バイトを 0xf8 にして、 CPU address $07f8 から読ませて CPU address $0821 (mirror:$0021) のキー入力で data 0xdd を読み込ませる.

RTA としての欠点:

  • 戦闘後からエンディング開始に約30秒かかる.
  • data 0xdd を生成するためのキー入力(上下右スタートBA)がシビアで失敗したときのやり直しが長い.
    • 買い物後にセーブすれば再開はできる.
  • キー入力の失敗に気づくのも戦闘後で長い.

○ 0x08 (数量)

実現可能. TAS の説明に簡単に書いたもの.

FF3 のプログラムが address $00f9 を初期化しないので別のソフトで該当アドレスを data 0xdd に初期化して、ファミコンの電源を入れたままソフトを交換する.

ポインタ下位バイトは会話で同じ、CPU address $08f8 から読ませて CPU address $08f9 (mirror:$00f9) でエンディング. 利点は戦闘終了後の待ち時間がとても短い.

RTA としての欠点:

  • 上位バイト 0x07 と同様にやり直しが長い.
  • CPU address $00f9 を初期化する場合にキー入力バッファを使うのが常套手段なのだが、 1P のキー入力になっているソフトが少ない.
  • CPU address $00f9 が 2P のキー入力になっているソフトはかなり多いのだが、ファミコンの拡張端子で2Pのキー入力をいれられるデバイスの入手が困難.

☓ 0x06 (トンファー), 0x0e (つえ), 0x1e (ナイフ)

おそらく実現不可.

CPU address $06f8 から CPU address $07f8 または $0821 まで連続で読めないので使えない. CPU address $0700 付近は nametable buffer として使ってるらしいので戦闘開始場所次第はうまくいく可能性がある.

☓ 0x1f (ダガー), 0x24 (ロングソード)

おそらく実現不可.

CPU address $2000 以降は PPU への IO Port で data 0xdd が生成されることはないし、動作不安定であると予想される.

△ 0x62 (かわのぼうし)

実現可能. 戦闘後の待ちが異様に遅い.

CPU address $62f8 から順番に同 $641d (セーブデータ#1の所持金の bit 7:0) を読ませる. 特殊なキー入力はいらない.

RTA としての欠点:

  • ポインタの増加がおそすぎて約5分もかかる.
    • 計測時間ルールが違えば早くなる可能性がある
  • 金額調整後にセーブが必要.

☓ 0x72 (ふく), 0x73 (かわよろい)

おそらく実現不可.

何のバッファか不明だが CPU address $7200-$73ff 付近で data 0xdd が生成されるところをみかけなかった.

☓ 0x8b (どうのうでわ), 0xa6 (ポーション), 0xac(やまびこそう), 0xae (めぐすり), 0xaf (どくけし), 0xb2 (なんきょくのかぜ)

おそらく実現不可.

CPU address $8000-$bfff はポインタ読み込み時 ROM page 0x2c, CPU address $c000-$dfff はポインタ読み込み時 page 0x2d となる.
該当アドレス付近は正式なスクリプトデータなのか、 data 0xdd がほとんどないので使えない.

◎ 0xe4 (かわのたて)

実現可能. 2013年頃からつかわれている.

CPU address $c000-$ffff はポインタ読み込み時 ROM page 0x3e, 0x3f になる.

  • ピアノ演奏の時間が長い以外は安定しているし、操作が簡単である.
  • アイテムの並び次第で戦闘後のエンディング開始もかなり早くできる

かわのたてのアイテムとしての ID は 0x58 だが、 文字としての ID 0x58 は「ピ」を意味し、nametable buffer としてヒ (0xe4) と ゚(0xc1) に分離される. 結果、ポインタ上位バイトには data 0xe4 が書かれる.

△ 0xfa (ブリザド)

たぶん実現可能.

CPU address $fa77 と $fac0 に data 0xdd がある. ただしブリザドを手に入れるにはサスーン城の隠し部屋まで行く必要があり、ピアノ演奏より遅い.

☓ 0xfb (スリプル), 0xfc (ケアル)

おそらく実現不可.

CPU address $fb00-$fcff 付近に data 0xdd がない.