調査終わりといいつつ調査の続き。
https://www.nicovideo.jp/watch/sm35569028
https://www.nicovideo.jp/watch/sm35569011
動画のなぜ痛み分けの杖を使ってるのかとかその辺の解説。
ここの説明は全部文字だけになるので動画はないです。
・まず初めにバグが起こる原因になる直前の処理の解説
$033609 86 00 STX$00 Xレジスタを$00に書き込み
これだけじゃ意味が分からないと思うけど「Xレジスタ」が原因と思ってください。
後述で説明します。
・痛み分けの杖処理
$0320C4 E2 30
$0320C6 22 A9 84 C2 JSL S0284A9にジャンプ
$0320CA 60 RTS 処理終わり
$0284A9 08
$0284AA E2 30
$0284AC A5 00 LDA $00 $00からAレジスタに読み込み
$0284AE 8F A8 89 7E STA $7E89A8 Aレジスタの値を$7E89A8に書き込み
$0284B2 28
$0284B3 08 RTS 処理終わり
これ全部が痛み分けの杖処理です。
これも意味不明だと思いますが「Xレジスタ」が動いてないことはなんとなくわかってくれればいいです。
・この処理の前に「Xレジスタ」が最後に書き込みされた場所は?
$033606 BB TYX Yレジスタの値をXレジスタに書き込み
Yレジスタのようですね。
ではこのYレジスタはどこのものでしょうか?
$03350D A3 08 LDA $08,s スタック$08からAレジスタに読み込み
$0335DF A8 TAY Aレジスタの値をYレジスタに書き込み
スタック$08のようですね。
こいつは…って長いので省略。
正体は7E8B8C+XXのXX部分に該当するもの。
フロア内に存在するアイテムの何番目かをIDにして管理してる番号です。
こいつは7Fを起点として7E、7D…というようにアイテムが生成された順番から-1を引いたものです。
・つ、つまり・・・?
投げた痛み分け=存在するアイテムのID=「Xレジスタ」となります。
みんなついてこれてるかな・・・?
・というわけで
$022C3F BF 81 87 7E LDA $7E8781+"X" $7E8781+"Xレジスタ"のアドレスの値をAレジスタに読み込み
$022C43 F0 55 BEQ #$55 00ならばジャンプする
$022C45 BF F1 85 7E LDA $7E85F1+"X" $7E85F1+"Xレジスタ"のアドレスの値をAレジスタに読み込み
$022C49 F0 4F BEQ #$4F 00ならばジャンプする
$022C4B BF A1 85 7E LDA $7E85A1+"X" $7E85A1+"Xレジスタ"のアドレスの値をAレジスタに読み込み
$022C4Bのところの値が以下なら個別処理に移る
0x0A 0x09 トド、ミドロの分裂処理
0x18 がぼうれい武者ワープ処理
0x19 がマスターチキンレベルダウン処理
それ以外は処理終わり。
・動画の補足
$022C4Bの処理の値が重要なので最大HPやら現在HPの調整をして個別処理に移動させてバグらせてます。
とりあえずバグ調査終わり。
ネタが思い浮かぶか何か思いついたらまたやるかも・・・?
https://www.nicovideo.jp/watch/sm35569028
https://www.nicovideo.jp/watch/sm35569011
動画のなぜ痛み分けの杖を使ってるのかとかその辺の解説。
ここの説明は全部文字だけになるので動画はないです。
・まず初めにバグが起こる原因になる直前の処理の解説
$033609 86 00 STX$00 Xレジスタを$00に書き込み
これだけじゃ意味が分からないと思うけど「Xレジスタ」が原因と思ってください。
後述で説明します。
・痛み分けの杖処理
$0320C4 E2 30
$0320C6 22 A9 84 C2 JSL S0284A9にジャンプ
$0320CA 60 RTS 処理終わり
$0284A9 08
$0284AA E2 30
$0284AC A5 00 LDA $00 $00からAレジスタに読み込み
$0284AE 8F A8 89 7E STA $7E89A8 Aレジスタの値を$7E89A8に書き込み
$0284B2 28
$0284B3 08 RTS 処理終わり
これ全部が痛み分けの杖処理です。
これも意味不明だと思いますが「Xレジスタ」が動いてないことはなんとなくわかってくれればいいです。
・この処理の前に「Xレジスタ」が最後に書き込みされた場所は?
$033606 BB TYX Yレジスタの値をXレジスタに書き込み
Yレジスタのようですね。
ではこのYレジスタはどこのものでしょうか?
$03350D A3 08 LDA $08,s スタック$08からAレジスタに読み込み
$0335DF A8 TAY Aレジスタの値をYレジスタに書き込み
スタック$08のようですね。
こいつは…って長いので省略。
正体は7E8B8C+XXのXX部分に該当するもの。
フロア内に存在するアイテムの何番目かをIDにして管理してる番号です。
こいつは7Fを起点として7E、7D…というようにアイテムが生成された順番から-1を引いたものです。
・つ、つまり・・・?
投げた痛み分け=存在するアイテムのID=「Xレジスタ」となります。
みんなついてこれてるかな・・・?
・というわけで
$022C3F BF 81 87 7E LDA $7E8781+"X" $7E8781+"Xレジスタ"のアドレスの値をAレジスタに読み込み
$022C43 F0 55 BEQ #$55 00ならばジャンプする
$022C45 BF F1 85 7E LDA $7E85F1+"X" $7E85F1+"Xレジスタ"のアドレスの値をAレジスタに読み込み
$022C49 F0 4F BEQ #$4F 00ならばジャンプする
$022C4B BF A1 85 7E LDA $7E85A1+"X" $7E85A1+"Xレジスタ"のアドレスの値をAレジスタに読み込み
$022C4Bのところの値が以下なら個別処理に移る
0x0A 0x09 トド、ミドロの分裂処理
0x18 がぼうれい武者ワープ処理
0x19 がマスターチキンレベルダウン処理
それ以外は処理終わり。
・動画の補足
$022C4Bの処理の値が重要なので最大HPやら現在HPの調整をして個別処理に移動させてバグらせてます。
とりあえずバグ調査終わり。
ネタが思い浮かぶか何か思いついたらまたやるかも・・・?