この前、ポケモンの中に「任意コード実行」という概念があるということを初めて知ったので、今回はそれについてちょっと書いてみます。
まあ、正直なところ、Youtube上にたくさん解説動画が上がっているので、それを見れば理解できると思うんですけどね。
ただ僕自身、かなり衝撃を受けた内容だったということもあり、記憶の整理も兼ねて、理解したことをまとめてみたくなったかんじです。
任意コード実行とは、その名の通り、任意のコード(命令文)をポケモン上で実行すること、あるいは、その方法について指します。
任意のコードって何なのかというと、例えば、
- 「ポケモン図鑑をすべて埋める」
- 「マスターボールを99個手に入れる」
- 「伝説のポケモンであるミュウで手持ちを一杯にしたい」
みたいなことですね。
こういった、本来なら相当な努力が必要なことであったり、どうやっても実現不可能なことを任意コード実行によって実現することができます。
中には、もっと複雑でたくさんのコードを実行するために、ゲーム内にエディタを導入して、ポケモン上で「テトリス」や「マインスイーパー」を遊べるようにしてしまう猛者もいるようです。
意味がわからないですよね^^;
そんな人は一度動画を検索してみて、実際にそういったゲームが動く姿を見てみてください。
びっくりすると思います。
まあ、ここまで来ると、「ポケモンを楽しむ」というよりは、「ポケモン上でのプログラミングを楽しむ」という方向になってしまってますが…。
じゃあ、なんでそんなことができてしまうのか?
それは、僕の理解の範囲でかんたんにまとめると、ゲームボーイのCPUが「セーブデータ領域」を「命令文領域」だと勘違いして読み込んでしまうことにあります。
ゲームボーイのメモリには、ゲームを動作させるための命令文を扱う領域と、セーブデータを扱う領域があります。
まあ、本当はもっとたくさんの領域あるみたいですが、そこは省略します。
で、命令文の領域というのは、例えば「じてんしゃに乗ったときのプログラムを呼び出して実行せよ」みたいなかんじのものです。
そうやってプログラムを読み込むことで、主人公がじてんしゃに乗って通常よりも速く移動できるようになるわけですね。
そして、この命令文領域はゲームの仕組みに関わる部分ですから、改変することはできません。
それができたらゲームとして成り立たなくなってしまいますからね。。
次に、セーブデータを扱う領域ですが、こちらは「手持ちのピカチュウのニックネームは”さとし”である」みたいなかんじのものですね。
ニックネームというのは、捕まえたポケモンに自分の好きな名前をつけられる仕組みです。
なので、命令文のときとは違って、こちらのデータは自由に改変できます。
で、僕らからすれば、
- 「じてんしゃに乗ったときのプログラムを呼び出して実行せよ」
- 「手持ちのピカチュウのニックネームは”さとし”である」
というのは区別可能なものです。
ただ、これらのデータは、コンピュータ内部では同じ2桁の16進数を用いた、1byteの情報で保存されているので、CPUからすると、両者の区別がつかないんですよね。
だから、本来こういった勘違いを起こさないため、CPUが命令文領域しか読み込まないように、ちゃんと設計されているのですが、なんとポケモンのゲーム内には、CPUにセーブデータの領域を読み込ませることが可能なバグアイテムがいくつか見つかっています。
つまり、なんとかしてこのバグアイテムを取得し、セーブデータ領域をCPUに命令文として読み込ませることができれば、僕らが思い描いたことを何でも自由にゲーム内で実現できるようになるわけです。
もし、通常プレイで手に入るアイテムで、このような挙動が起きたとしたら大問題ですが、存在しないはずのバグアイテムを利用するわけですから、こういった予定外の動作になるのも仕方ありませんね。
ちなみに、どうやって命令を下すのかというと、ポケモンのニックネームだったり、ポケモンを保管するボックスの名前を上手く機械語に対応させるわけです。
例えば、幻のポケモンであるセレヴィと出会いたいとしましょう。
その場合、まずはCPUに命令する際のアセンブリ言語で、セレビィと出会うための命令文を書いて、次に機械に理解できるように16進数に変換する。
最後に、その16進数の機械語に対応する文字をセーブデータ内に書き込んで、バグアイテムによってプログラムを実行し、計画どおりセレビィと遭遇する…みたいな流れになります。
実際には、以下のようなかんじですね。
- 命令文
- LD A, F4
- LD (D5AC), A
- RET
- 機械語
- 3E F4
- EA AC D5
- C9
- ゲーム内文字
- ぼォ
- ゥッゆ
- の
セーブデータ内に書き込んだ「ぼォゥッゆの」というテキストが、CPUでは「セレビィと遭遇する」という形の命令文として解釈されることで、こういった現象が起きるわけです。
そんなわけで、僕なりの説明は以上になります。
まあ正直なところ、手を動かして実行してない人間が書いているので、あまり参考にはならないと思いますが、「こんな世界があったのか」と衝撃を受けたので、ブログ記事として書いちゃいました。
本当はこれを知ったとき「自分でもやってみたいな」と思ったのですが、遠い昔にゲームを処分した以上、「またイチから3DSを買ってバーチャルコンソールからポケモンを始めるのも手間だな…」なんて考えているうちに、熱が冷めてしまったんですよね^^;
いずれにせよ、こういった方法を見つけた人はすごいと思います。
プログラムから逆算して、ある程度の予想を立ててから探っているんですかね?
少なくとも、手当たりしだいにゲームを遊んで見つけることは、無理なんじゃないかと思うのですが。。。
そして、いまでも僕らを熱中させてくれるポケモンは、やっぱり素晴らしいゲームなんだなって感じました。