解説ページにあったコードから一つ自作しました。
// 改変元とアセンブリ翻訳 // >どうぐポケット1番目の個数を0個に // >@MAIL // >ョゥッゆの 0xAF xor a 0xEA ld (yyxx), a 0xAC xx 0xD5 yy 0xC9 ret
// 改変後とアセンブリ翻訳 // どうぐポケット1番目の個数を1つ増やす // @MAIL // ぜッがゆどの 0x2E ld l, xx 0xAC xx 0x26 ld h, xx 0xD5 xx 0x34 inc (hl) 0xC9 ret
改変と言ってもアドレスとretしか残ってない。
でも最初に考えていたのは"xor a; inc a;"で1を作ってaddしてldしてっていう元コードに忠実なものだったんです。
いくらなんでも回りくどいし流石にアドレス指定で操作できるだろうと思って探したら0x34を見つけて。
コードにスマートさが全くないのは文字的な問題で、"ld hl, yyxx"の命令コードは「0x21=あ゛」なので普通には使えないんですね。
他のコードを見直してみると「が○ぜ×」で始まる記述が多く、僕の書き方も間違いじゃなかったと安心しました。
しかし他の16bitの記法に従うなら「ぜ×が○」と書いたほうがわかりやすいのでは・・・?
とまぁ、一番短いコードではありますが辞書が通用することを確認するには十分でした。
で、このコードの使い道ですが、普通にはありません。
これだけだと「道具無限化コード」から「道具1つ追加コード」を作るという無意味な行為です。
しかしながら、これを応用することで「任意のアドレスにインクリメントする」ということができるようになりました。
暇になったら1つ下にずらして、つまり「ぜャがゆどの」にしてどこが変化するか確認してみたいです。
「2個目の個数が増える」だと面白くないんですが、「1個目or2個目の道具の種類が内部コードに従って変化する」といいなぁとか。
最終的にはVCから7世代への輸送に便利なレベル99まで一気に上げるとか、1ボタンでポケモンの増殖とかをできるようにしたいんですが
そのためにまずはいろんなアドレスを特定していくところからということで今回下調べを兼ねてこのコードを書いてみました。
参考サイト:
理解できなくても出来る任意コード実行解説【ポケモン金銀ver】 - nakayoshibaddi’s blog様(任意コード実行全般)
POKeMON Bug HiSTORiA様(内部コード)
ぽけもんばぐ・りっちーず様(GameBoyマシン語全般)