あなたが探している情報は、この日記には記されていない可能性が高いです。(検索で来た人用)
にらどんは一杯500円。尚、出前は承っておりません。ご了承下さい。

金銀VC 任意コード実行

解説ページにあったコードから一つ自作しました。

// 改変元とアセンブリ翻訳
// >どうぐポケット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マシン語全般)