見出し画像

初めてのスーファミ解析

こんばんは。チョコボの不思議なダンジョン2RTA走者です。趣味で内部解析に手を出してみましたがPS1のCPUというのは中々に手強いですね。

本業から離れて

PS1ソフトを走っているものですから、それを内部解析してRTAを優位に進めようという魂胆だったのですが、縁だとか何だとかまぁ色々ありましてスーパーファミコンのソフトを解析する運びとなりました。
その名も

スーパーワギャンランド2です。2023年の夏にRTAinJAPANでも採用されたタイトルですね。経緯は置いておいてこのコを解析したのでアレコレ綴っていきます。

下調べ

スーファミのCPUは65C816というそうです。ファミコンのCPUと互換性があるだとかなんだとか、スーファミ機体でファミコンソフトを遊べるようにしようという構想の名残りだとかなんだとか。
で、まぁCPU命令の一覧が書かれたサイトを見つけて辞書は用意できたなと。
以上。
本当にね、内部解析する者にしては下調べをやらなすぎたと思います。後々にこれが響いてくる場面も訪れます。しかし、命令については殆ど調べることなくすんなりサクサクと解析を進めることができました。これらはPS1のCPU、R3000を調べている内に得たノウハウといえます。アセンブリの特徴、リトルエンディアン、メモリのパラメータや命令との関係性、などなど。

スーファミの特徴

驚いたことがいくつかあります。まず命令のバイト長が一律ではないということ。なんと1~3バイトで命令が構成されるのです。今まで一律4バイトで命令が構成されているという印象だったのでこれにはまいりました。何より、メモリだけを見たときに到底読める代物ではないというのが手強い印象。しかし今回の解析にはデバッグツールが強力なものを使っていたので1命令ごとの実行やそれによるトレースで挙動を追いかけました。
勿論トレースの前にはパラメータのメモリマップを多少は調べましたが、あまりそこは作り込まずに命令解析に手を着けました。
特徴としてもうひとつ、パラメータも3バイト区切りのものもあるという点もありました。これのせいで頭をひねりました。今まで自分がやっていた常識が通用しなかったのでかなり面食らいました。事前にCPUについて調べていればそうはならなかったでしょう。

調べたこと

大きくは2つです。ワギャンのミニゲームであるしりとりと神経衰弱のパネル配置関係です。RTAにおいてはこれらによるタイムのブレが大きいのでこれらを解析、チャート化することによってタイム短縮が図れるのではといった狙いです。

神経衰弱

はじめに手を着けたのは神経衰弱です。

規則的に並んだパネルたち

配置パネルのメモリアドレスを調べて、そのメモリアドレスに対してwrite breakを仕込んで挙動を追いかけました。ワギャンの解析しやすかった点として、「24のパネルを配置する」というループ処理を使っているんだろうなという部分のルーチンを覗いたというところ。write breakで止まった後、1命令ずつ実行していけばパネル配置の挙動をしっかりと追いかけることができるわけです。実際、それにより1パネルにつき3バイト使用、サブルーチンを使ってレジスタの値を変更、変更したレジスタを使用してパネルのアドレスにストア(代入)ということが分かりました。案外命令が読めているというのが第一印象でした。命令そのものについてはあまり調べていません。多分ロードだろうな多分ストアだろうなとかそんな風に読み進めることが大体でした。条件式に関しては調べましたがフラグレジスタの取り扱いが難しくあまり理解できませんでした。なので、なんとなくで進めた方が良いだろうという判断でした。
解析の結果、乱数を使用してパネル配置が決まるのだろう、その乱数を固定したりするのは難しそうだという至極当たり前の結論に至りました。しかしこれでワギャンの中身に触れてこの後に大きく役立ってきます。

しりとり

いよいよしりとりの解析です。これまでの解析でパネル配置のメモリアドレス、1パネルに対して3バイトそれぞれの振る舞い、パネルのIDなどが分かっている状況です。それに加えて先の神経衰弱のアセンブリをトレースしたものをExcelに貼り付けて挙動を追いかけたというデータも残っています。神経衰弱と同様のサブルーチンがしりとりにも使われていた部分があったのでそれにより「どういうときに呼びたいサブルーチンなのか」「このRAM領域を引数と取っているから高級言語に書き換えるとこうだな」といった全体的な把握をするための意識に非常に助かりました。

トレースした命令を実行順とルーチンごとに振り分け視覚化

結果、乱数テーブルの値の配置、乱数取得からパネルIDや配置場所の値を取得するまでの変換法則、しりとりの順番マスターテーブルなどが判明しました。しかもそこからしりとり2巡目のパネル出現法則を掴み、既に判明していた表読みパーフェクトルートと組み合わせて2巡目のパーフェクトルートを構築することができました。これによりRTA走者のみならず通常プレイヤーも苦しめていた緑ガルゴンに対して100%の勝率を叩き出せるまでに至りました。運ゲー回避です。解析の勝利です。

解析による実績を上げた

相当な数の実機検証があれば、別段内部解析をしなくとも今回の研究報告と同様の成果は得られたと思います。しかし、実機検証とは別角度から、内部解析というアプローチからこのような成果を上げられたことが本当に嬉しいのです。今までチョコボの解析が思うようにいかなかったからなおのこと。
勝因としてはスーファミの使用レジスタが少なかったこと。レジスタの値はとっととどこかのRAM領域に置いて必要になったらまたロードして、といった挙動だったのでストア命令のすぐ近くにロード命令もあり値の取得と代入が直感的に分かりやすい配置になっていたからです。もう一つの理由にはPS1のCPUがテクニカルだということ。R3000では1命令1クロックの実行と更なる効率化のため、1つ先の命令を先読みしているという特徴があります。このせいでロードした値をすぐにストアしたい場合でもnop(何もしない)を挟む必要があり、メモリを切り詰める都合上そのnopタイミングで別の値を別のレジスタにロードさせてだとか使えるレジスタの数が多いだとか様々な問題に見舞われていたわけです。スーファミは本当に分かりやすくて良かった。同じサブルーチンを目にしたときにもすんなりと理解できたというのも良い点でした。

チョコボ解析のノウハウがワギャンで活かせたように、今回のワギャン解析で得たノウハウを今度はチョコボに還元する番です。ひとつの成果を上げるまでに至ったので道のりなどはなんとなく分かってきました。手探りで始めた内部解析が自分でも分かるくらいにレベルアップできたというのが素直に嬉しい、そんな気持ちです。

いいなと思ったら応援しよう!