コードの見つけ方

090913_01.jpg
掲示板の方でエミュレーター使用時の
ゲームのメニューを開く速度を速くするコードを
探してほしいといわれ割と簡単にコードが見つかったので
そのやり方を書いておきます。


とりあえず下のファイルをダウンロードしてください。

  • Project64 v1.6用レジスタモニタ
  • 私が4年くらい前に自分用に作ったPJ64 v1.6用のレジスタモニタです。
    実行するとPJ64のメモリからレジスタ情報を取得し表示してくれます。
    === 探し方 ===
    例としてマリオストーリーでやってみましょう。
    このゲームはエミュレーターで動かすとゲーム中のメニューを開こうとすると
    一瞬止まったかのようになりメニューを開くのに時間がかかります。
    090913_02.jpg
    レジスタモニタを起動してもう一度メニューを開いてみると
    pcレジスタは802747C、raレジスタは8027B04で
    処理が重くなっているのがわかります。
    090913_03.jpg
    つぎに逆アセンブラで該当箇所を見てみましょう。
    PD2DISまたはNemu64で逆アセンブルして8027B04付近を見てみました。
    090913_04.jpg
    上記の処理を簡単に説明すると
    8027AFCへの処理から戻ってきた後、S2に1を加算、
    値が0x13Eより大きくなるまで処理をループ
    という流れになっています。
    おそらくこのループ部分で処理が重くなりメニューが開くのに
    時間がかかるようになっていると推測されるので
    強制的にループを抜けるようにするにするために
    80027B28を書き換えて
    80027B28: SLTI V0, S2, 0x013E
      ↓
    80027B28: SLTI V0, S2, 0x0000
    にしてしまえばすぐにループを抜けるようになるはずです。
    そんなわけでマリオストーリーのコードは
    81027B2A 0000
    になります。
    ※追記
    逆アセンブル結果をよく見てみたら80027B4Cにも分岐命令がありますね。
    80027B44: SLTI V0, S3, 0x00EF
    80027B48: ADDIU T0,T0, 0x0140
    80027B4C: BEZ V0,0x80027790
    最初のところと併せて二重ループになっているようなので
    これもき換えた方がいいのかな?と思ったんですが
    値をよく見てみると0xEFは10進法で219、0x13Eは318
    というわけで捜査線の数っぽいですね。
    つまり画面のエフェクトの処理をしている部分ではないかと推測されます。
    こんな処理の重いエフェクトは必要ないので、
    このエフェクト処理を呼び出している部分をつぶしてしまいましょう。
    Nemu64でやった場合をせつめいしますと、
    エフェクト処理が終わって元の処理に戻す部分
    80027B74: JR RA
    にブレイクポイントを仕掛けたあと、もう一度メニューを開いてブレイクさせたら
    逆アセンブルウィンドウのStepボタンを押すと逆アセンブルリストが切り替わって
    80027FD8付近のエフェクト処理の呼び出し部分に行くことが出来ます。
    090913_6.jpg
    少し上の80027FD0を見てみると
    80027FD0: JAL 0x80027984
    でエフェクト処理を呼び出しています。
    このエフェクト処理を呼び出しているのは1カ所しかないので
    ここを呼び出ししないようにすればOKとなりますので
    最終的なコードは
    81027FD0 2400
    となります。

    「コードの見つけ方」への5件のフィードバック

    1. いきなりの書き込みですみません。
      サイトでマリオストーリーの画像貼ってたのでねこかぶさんもやっていると思い一つ質問があるんですけど仲間の能力を使うボタン?ってどこなんですかね...
      いろいろ試してみたのですが出来なくて...

    2. >仲間の能力を使うボタン
      ちゃんとやったことないのでわかりません。
      適当にボタン押したら見つかると思いますけど

    3. ねこかぶさんって、すごいですね。
      ヨーヨーがお好きなようですし、パソコンにも、とても詳しいです。
      やっぱり、ねこかぶさんは工業高校とか大学の工学部卒なんでしょうか?

    4. コードだけでなく調べ方まで書いて頂けるなんて。
      快適にプレイできるようになりました。
      有り難うございました。

    5. >工業高校とか大学の工学部卒なんでしょうか?
      違います。物好きなだけですー

    コメントを残す

    メールアドレスが公開されることはありません。 が付いている欄は必須項目です