最近、ほぼ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]の値が生成されているので、ここを追跡していくと真実が見えるかもですね。