ファンタジーゾーン2の解析を支援してみる


 最近、ほぼ4STさんトコのネタばかりではありますが「ファンタジーゾーン2の最終ボスラッシュで$9720890手に入る」という話をちょっと深掘り。

--FANTASY ZONE 2 MONITOR
while (true) do
	local zz = memory.readbyte(0x0132);
	local yy = memory.readbyte(0x0133);
	local xx = memory.readbyte(0x0134);
	gui.text( 0,32,""..(xx-xx%16)/16);
	gui.text( 7,32,""..xx%16);
	gui.text(14,32,""..(yy-yy%16)/16);
	gui.text(21,32,""..yy%16);
	gui.text(28,32,""..(zz-zz%16)/16);
	gui.text(35,32,""..zz%16);
	gui.text(42,32,"0");
	FCEU.frameadvance();
end;

 とりあえず↑をコピペしてテキストエディタに貼り付けて「FZ2MON.LUA」とでも名前を付けて保存。
 ファミコンエミュレータFCEUX2.23でファンタジーゾーン2をロードして、File→Lua→New Lua Script Windowをオープン。
 Browse…で保存したFZ2MON.LUAをロードして[Run]ボタンを押すと…  
 こんな感じでボスラッシュ中に取得した金額をチェックすることができます。
 ちなみにメモリ上のデータレイアウトはこんな感じ↓

マネーの表示レイアウト $xxyyzz0
-addr-
0x0132 zz
0x0133 yy
0x0134 xx
$9720840加算= 84 20 97 の16進数をそのまま10進数として処理している。

 つまり「画面表示は10進数っぽく並べただけの16進数」ですね。
(上述のLuaスクリプトが16の除算や余数の計算をしているのはそのせい)

 どうしてボスが爆破した瞬間に 84 20 97 を加算しているのか詳細までは解析できていませんが、9720840ドルが加算される瞬間にブレークした結果は下記のとおりです。

コール元
 06:AC55:20 F4 BC  JSR $BCF4
 06:AC58:20 2C B6  JSR $B62C << ここをEAEAEA(nop)でお金増えなくなる
 06:AC5B:4C ED AB  JMP $ABED

コール先
 06:B62C:AD CC 00 LDA $00CC = #$00
 06:B62F:F0 01 BEQ $B632 << 加算ルーチンにジャンプ
 06:B631:60 RTS
 -----------------------------------------

加算ルーチン
 06:B632:AD 32 01  LDA $0132 = #$00
 06:B635:8D 88 01  STA $0188 = #$84 << 注目箇所
 06:B638:AD 33 01  LDA $0133 = #$00
 06:B63B:8D 89 01  STA $0189 = #$20 << 注目箇所
 06:B63E:AD 34 01  LDA $0134 = #$00
 06:B641:8D 8A 01  STA $018A = #$97 << 注目箇所
 06:B644:84 60     STY $0060 = #$90
 06:B646:86 61     STX $0061 = #$00
 06:B648:A0 00     LDY #$00
 06:B64A:B1 60     LDA ($60),Y @ $0090 = #$9A
 06:B64C:8D 8B 01  STA $018B = #$84
 06:B64F:C8        INY
 06:B650:B1 60     LDA ($60),Y @ $0090 = #$9A
 06:B652:8D 8C 01  STA $018C = #$BA
 06:B655:C8        INY
 06:B656:B1 60     LDA ($60),Y @ $0090 = #$9A
 06:B658:8D 8D 01  STA $018D = #$96
 06:B65B:20 71 B6  JSR $B671
 06:B65E:AD 88 01  LDA $0188 = #$84
>06:B661:8D 32 01  STA $0132 = #$00
 06:B664:AD 89 01  LDA $0189 = #$20
 06:B667:8D 33 01  STA $0133 = #$00
 06:B66A:AD 8A 01  LDA $018A = #$97
 06:B66D:8D 34 01  STA $0134 = #$00
 06:B670:60        RTS -----------------------------------------

 アドレス0188、0189、018Aの三連に[972084]の値が生成されているので、ここを追跡していくと真実が見えるかもですね。

ファンタジーゾーン2の解析を支援してみる」への2件のフィードバック

  1. プログラムコードが書かれているせいか、iPhoneの Safariさんが『安全ではありません』と軽く警告して来ますw

    • トレンドマイクロがウチのサイトをブラックリスト登録してるのが原因っす。
      クッソ迷惑なんすよねぇ…

Randy へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です