Home > TempAR Usage > TempAR - 0xC2 でカメラ操作コード

TempAR - 0xC2 でカメラ操作コード


TempAR 1.63に搭載された0xC2コードタイプを使用して
実際にカメラ操作コードを作ってみる。

ワークで操作するだけなので可動範囲が設定されていれば
その範囲内でしか動かすことは出来ない。

制限解除は別の話。


■用意する物

・TempAR 1.63 Beta
・動かしたいカメラ座標のアドレス
・TempAR 同梱 Readme.html
・【PSPAR形式のパッドコード】の理解

・浮動小数点数変換ツール → 【IEEE754 - Vecotr】など
・16進数が計算出来る電卓 → Windows付属の関数電卓か、【うさみみハリケーン - Vector】など
・【CodeMaker for CWCheat】(無くても良い)
■0xC2 書式

_N 0xC2000000 0x000000rr
_N 0x******** 0x********
_N 0x03E00008 0x00000000

1. rrにコードの長さをバイトで指定する。
  rrの次の行から始まるプログラム部分のことを指している。
  上記の例では0x*******~0x00000000まで2行なので
  2(行)*2(左右)*4(1命令4byte)=16(10進数)=0x10(16進数)

2. **に命令を記述する。この部分はアセンブラの知識が必要。

3. 最後に0x03E00008(jr ra)を入れる。

4. ディレイスロットにNOPなどを入れる。swなどにすれば無駄が無い。

5. _N 0x******** 0x03E00008 のような形で終わった場合
  ディレイスロットには何かを入れると、下記のようになるがコードとしては不正。
  _N 0x******** 0x03E00008
  _N 0x00000000
  左と右で1セットにする必要があるので次のようにする。(0x00000000はnop)
  _N 0x******** 0x03E00008
  _N 0x00000000 0x00000000
■カメラ操作コードテンプレート 1方向
※見やすいように空白行を入れていますが、使用の際は空白行は詰めてください。

_N 0x9A000000 0x00008000 ※1 □ボタンを押したとき
_N 0xC2000000 0x00000020 以下の0x20byte分のコードを実行

_N 0x3C04rrrr 0x3484qqqq ※2
_N 0xC4800000 0x3C08ssss ※3
_N 0x44880800 0x46010000
_N 0x03E00008 0xE4800000 ここまで0x20byte分

_N 0xD2000000 0x00000000 終端コード


赤字部分が可変部分です。他の部分は固定です。
■可変部分の説明

※1 パッド値を入れる。
   CodeMaker for CWCheatを使うか、TempAR同梱のReadme.htmlのButton Activatorsを参照。
   同時押しは加算するだけ。例(セレクト(=1)+スタート(=8) = 0x00000009 )

※2 カメラ座標を使用可能な形式へ変換

   カメラ座標が_L 0x01234567 ~のような場合、+0x08800000を加算する。
   0x01234567+0x08800000 = 0x09A34567

   これを上下2バイトずつに分解する。
   上側 09A3
   下側 4567

   上側をrrrrへ、下側をqqqqへ代入する。

※3 ボタンを押したときにカメラが動く増分を浮動小数点数で入力する。
   適切な数値はゲームによって異なる。
   まず、+0.1を入れてみて増減してみるといいかもしれない。

   +0.10 = 0x3dcccccd
   +0.01 = 0x3c23d70a

   -0.01 = 0xbc23d70a -は逆方向へカメラが動く
   -0.10 = 0xbdcccccd

   この数値の上位2byteだけを使用する。0.1なら3DCC。
   この2byteをssssへ代入する。
■カメラ操作コードテンプレート 2方向
使用例) □ボタンを押している間ズームイン、△ボタンを押している間ズームアウト


_N 0x9A000000 0x00008000 □ボタンを押している間
_N 0xC2000000 0x00000020
_N 0x3C04rrrr 0x3484qqqq
_N 0xC4800000 0x3C08ssss
_N 0x44880800 0x46010000
_N 0x03E00008 0xE4800000
_N 0xD2000000 0x00000000

_N 0x9A000000 0x00001000 △ボタンを押している間
_N 0xC2000000 0x00000020
_N 0x3C04rrrr 0x3484qqqq
_N 0xC4800000 0x3C08tttt
_N 0x44880800 0x46010000
_N 0x03E00008 0xE4800000
_N 0xD2000000 0x00000000

赤字部分が可変部分です。他の部分は固定です。
■テンプレート2方向の注意点

・1方向コードをつなげるだけでいくらでも増やせます。
・パッドはお好きな物からどうぞ。
・rrrrとqqqqは正方向と逆方向なら前後で同じ物が入ります。当たり前ですね。
・ssssが正ならttttはssssの負の数字を入れます。
 ssss=0.1ならtttt=-0.1という感じで。


最後に

操作コードと銘打ってるけどやってることは
座標アドレスに浮動小数点数で加算しているだけ。
CWCheat形式のIncrementを浮動小数点数でやらせていることと等価。
アセンブラが読める人なら笑ってしまうくらい簡単なコード。

0xC2コードタイプのすごいところはユーザーが
空きメモリアドレスの確保や使用アドレスの衝突、
空きレジスタの確保などを全く気にする必要が無いこと。

それゆえにアドレスと増分を入れ替えるだけで
カメラXYZ座標操作のすべてに対応することが出来る。

一応、CWCheatの0x3(Inc/Dec)コードでも同じことは出来るが、
数字が浮動小数点でないため、カメラの動きがぎこちない。

本来ならカメラ操作コードはカメラ関数部分にフックし
アドレスを入れ替えて本来操作出来ない部分を操作が可能に
なるように作るわけですが、アセンブラが読めなくても
カメラ座標さえサーチ出来れば簡単にコードが作れてしまう
お手軽さは悪くないかと。





関連記事
スポンサーサイト



コメント: -

Home > TempAR Usage > TempAR - 0xC2 でカメラ操作コード

Return to page top