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

cheap氏が記載したディストの洞窟の44階層での現象が起きるかためしたら再現できた。

  • いまのところ闇雲にやっているのだが、再現確率が低く、大半は前述の jmp $4c47 か jmp $7a79 で停まる。
  • トレースログは取っていたけど、よく停まる現象ではないことを確認してからとったので、どうやって停まらずに抜けたか不明。
  • 「カーズの本を使用した」とあるが、停まり方は普通の魔法詠唱と同じなので自分はミンウのケアルを使用した(複数かけで成功したが、必須条件か不明)。自分の所ではターン即終了は起きてない。

理由はわからんが、$0102 から $0100 の stack を積み、1周して $01ff から $01fb まで stack を積む。以下トレースログ。

8F7B: pha <- 0101
8F7C: txa
8F7D: pha <- 0100
8F7E: ldx $02
8F80: stx $00
8F82: ldy $03
8F84: sty $01
8F86: ldy $02
8F88: lda ($04),y
8F8A: sta $08
8F8C: ldy $03
8F8E: cpy $02
8F90: bcc $8fd8
8F92: lda ($04),y
8F94: cmp $08
8F96: bcs $8f9b
8F9B: sty $03
8F9D: ldy $02
8F9F: lda ($04),y
8FA1: cmp $08
8FA3: beq $8faa
8FAA: sty $02
8FAC: ldy $03
8FAE: cpy $02
8FB0: bcc $8fd8
8FB2: lda ($04),y
8FB4: tax
8FB5: lda ($06),y
8FB7: sta $09
8FB9: ldy $02
8FBB: lda ($04),y
8FBD: ldy $03
8FBF: sta ($04),y
8FC1: ldy $02
8FC3: lda ($06),y
8FC5: ldy $03
8FC7: sta ($06),y
8FC9: ldy $02
8FCB: lda $09
8FCD: sta ($06),y
8FCF: txa
8FD0: sta ($04),y
8FD2: dec $03
8FD4: inc $02
8FD6: bcs $8f8c
8F8C: ldy $03
8F8E: cpy $02
8F90: bcc $8fd8
8F92: lda ($04),y
8F94: cmp $08
8F96: bcs $8f9b
8F9B: sty $03
8F9D: ldy $02
8F9F: lda ($04),y
8FA1: cmp $08
8FA3: beq $8faa
8FA5: bcc $8faa
8FA7: iny
8FA8: bcs $8f9f

   (loops for 3 instructions)

8FAA: sty $02
8FAC: ldy $03
8FAE: cpy $02
8FB0: bcc $8fd8
8FD8: ldx $02
8FDA: cpy $00
8FDC: beq $8fe8
8FDE: bcc $8fe8
8FE0: lda $00
8FE2: sta $02
8FE4: tya
8FE5: jsr $8f74 <- $01ff,$01fe
8F74: sta $03
8F76: lda $00
8F78: pha <- $01fd
8F79: lda $01
8F7B: pha <- $01fc
8F7C: txa
8F7D: pha <- $01fb
8F7E: ldx $02
8F80: stx $00
8F82: ldy $03
8F84: sty $01
8F86: ldy $02
(以下は有用に見えなかったので略。ログが欲しい人は連絡ください)

このあと、割り込みルーチン終了時に $0100,$0101,$0102 へ命令が書き直されるのでプログラムは正常に動く。

戦闘が終わった時点で、スタックは $01fb-$01ff が破壊された状態になっている。

ここで破壊された RAM に注目して欲しい。 $01f9 にある 0xcaf2 は階層が戻るときに実行される PC で、$01fb は階層が戻るときに代入する X 座標。デジョンで第1階層に戻ると X 座標がずれている、ということになる。*1

(この条件で第1階層に戻ると壁の中にいる)

さらにもう1度デジョンを使うと一番奥のスタック $01fa の値を PC として実行する。正常な場合は $caf1 が入っているので、外に出る。今回はここも破壊されているので、$0608 + 1 を実行する。

$0609 自体はマップデータらしく、有用な命令はなかった。洞窟をでるまで更新もないのでここを操作するのは難しそう。今回の再現条件でスタックの底近くへ($01fa)書かれる値を操作することができれば、任意の命令が実行できるわけなので、この現象の再現条件なり、スタックへの書き込む値を研究すべきだと思う。

*1:テレポは使用してみたが、スタックを参照せずに強制的にスタックポインタを直して外に出るだけなので、今回のスタック破壊後に参照に有用なのはデジョンのみ。