DSに合わせて最近の任天堂製GBAソフトにつくようになった、「警告-健康と安全のために」という題名の警告メッセージ。最初の一回だけとはいえ、イライラします。確実に興ざめです。消すべく解析してみました。
■共通のパッチャーは・・・作れない!
RTCの時計無効化パッチや、セーブパッチ(って何やってるのか知りませんけど)は共通のパッチ用プログラムがあって、なかなか便利です。これはハードウェアである以上使用方法が一緒だからだと思いますが、そうなるとハードウェアとはあまり関係が無い警告メッセージは共通パッチャは作れません。個別に解析する必要があります。
いや、当初は作れるかなと思っていたんです。このプログラムはどうせ同じプログラムを使いまわしてると思ってたので。しかし・・・。警告メッセージのプログラムは共通ではありません。
わかりやすい違いは、たとえばポケモン不思議のダンジョンです。ほかのゲームの警告メッセージは、「ボタンを押してください」の点滅がフェードイン、フェードアウトを繰り返す滑らかな点滅なのに対し、このゲームだけはフェードインもフェードアウトもせず、いきなり黒文字がでて、いきなり消えます。
なめらかな点滅のもの同士でも、逆アセンブルリスト上、ずいぶん異なります。ここまで違うのはコンパイルオプションの最適化の影響ではないと思います。
■BitGenerationsだけは共通パッチャ作れそう
BitGenerationsの「Orbital」を解析して発見した特徴的なビット列を「Coloris」でも発見しました。これらはさすがに同じプログラムを使いまわしているようです。
そのすぐ後に出た「リズム天国」も調べてみたところ、発見できませんでした。やはり開発プロジェクトごとにこのプログラムを作っているようです。まあそんなに難しくもないですしね。
■BitGenerationsのメッセージプログラムの特徴
- 0x04000006のIOレジスタを何度も用いたウェイトコード。なぜか関数に纏めずに毎回毎回直に書いてるので検索すればすくにわかる。
- その周辺で0x04000130のキー入力を読んでる。普通は専用関数に飛ばすし、その関数はひとつだけ。(ドクマリパネポンは例外として共通メニュー、ゲーム本編*2、お試し版*2で合計5つ存在します)
これだけだと不十分で一瞬表示されてしまうこともあるので、一部のループも回避しないと駄目っぽいです。
■解析のためのヒント
まずはキー入力だと思います。BitGenerationsは制御コードに直に描いてあったので、見つけやすいです。何かひとつでもボタンを押しているかどうかのチェックを行っているというのもヒントだと思います。
それを見つけたらあとは周辺のadd r0,#0x1とか、レジスタとの条件分岐とか、丁寧に読むのが面倒だったらそこらへんのを適当につぶしてれば見つかると思います。フェードイン用、文字が点滅し始めるまで用、文字の点滅用、フェードアウト用で4つくらいはカウントと条件分岐があるはずです。
ジャンプ命令を使って飛ばそうというのは若干無謀です。大人しくちょこまかいじった方が安定しているようです。
■BitGenerations用のパッチャ作ってくるノシ
やっぱJavaかな。特定の環境でしか動かないプログラムはできるだけ作りたくない。まあ動かすまでが面倒ですが、こんなのを使う人間ならすでにJavaの実行環境くらい持ってる気がw