Home > スポンサー広告 > TempAR - CWC/PSPAR形式ポインターコード1

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

コメント: -

Home > スポンサー広告 > TempAR - CWC/PSPAR形式ポインターコード1

Home > TempAR Usage > TempAR - CWC/PSPAR形式ポインターコード1

TempAR - CWC/PSPAR形式ポインターコード1

05/28 初稿
06/02 CWC形式のサンプルと早見表を画像で追加。


CWC形式のポインターコードはぱっと見で分かりにくいですよね。
ポインターコードが必要なゲームばっかりでもないので触れる機会そのものが
少なく不慣れというのも一因でしょう。

(これを書き始めたのは多重ポインターのあるゲームを久しぶりに見たからで
書き方をまるっきり忘れてたのが発端ですw)

CWC形式の場合、種類とは言っても一部のフラグが変わるだけなのですが。
シングルポインターでも(8/16/32)*(正/逆)で6種類もあります。

PSPAR形式なら1種類だけ覚えればOKです。(PMEtanも同様)
多重を表現するのも繰り返すだけなので簡単です。

欠点として少しコードが長くなることが挙げられますが
自分用にさっとコードを作りたいときはPSPAR形式だと
見た目も分かりやすく、メンテナンスしやすいのでおすすめです。

実アドレス表記というハードルがありますが、使っているうちに慣れますし
PSPLINKで解析する際は実アドレスしか使えないので何かと都合がいいのです。

他人に公開したいのであればその時にCWC形式に変換すればいいので
試してみてはどうでしょうか。

とはいってもポインターコード生成ツールを使う人が大半だと
思うのであまり出番は無いかも。orz





■Real Addressing

PSPAR形式では実アドレスしか読み込めません。
下準備としてアドレスを実アドレスに変換します。
仮想アドレスに0x08800000を加算するだけです。

_L 0x01234567 0x00000000 このようなコードの場合

→ 0x01234567+0x08800000 = 0x09A34567 が実アドレスです。
■Address vs Offset

PSPAR形式はアドレスをオフセット付きで表現するのが特徴です。
このため、ポインターアドレスでの加減算や条件判定などを行うことも可能です。
PMEtanは同様のことが可能な上、さらに柔軟なアドレスシフトが使用出来ます。
■CWC形式シングルポインターコード 32bit 正方向

wikiより。

_L 0x6aaaaaaa 0xvvvvvvvv
_L 0x00020001 0xiiiiiiii

1.アドレス0xaaaaaaaから読み込んだ値を基準アドレスとする。

2.基準アドレスにオフセット0xiiiiiiiiを加算したアドレスを目的アドレスとする。

3.目的アドレスに0xvvvvvvvvを書き込む。
  0x00020001の0002は32bit書き込み(0003なら逆方向8bit)、0001はポインター追跡回数。
■PSPAR形式ポインターコード

ポインターコードという決まった形式のものがある訳では無く、
オフセット操作コードや書き込みコードを組み合わせてポインターを表現します。


_M 0x6aaaaaaa 0x00000000 0x6 0xaaaaaaaの値が0xvvvvvvvvでなかったら~
_M 0xBaaaaaaa 0x00000000 0xB 0xaaaaaaaの値を基準アドレスとしてセット
_M 0xSbbbbbbb 0xvvvvvvvv 通常書込み
_M 0xD2000000 0x00000000 0xD2 フルターミネータ


1.0x6行 アドレス0xaaaaaaaが0x00000000でなかったら、以下のコードを実行(true)
  0x00000000なら0xD0/0xD2かコードの最終行に到達するまで実行しない(false)で下に進む。
  ポインターが空(0)の時に誤爆すると困るので安全装置の役割です。

2.0xB行 アドレス0xaaaaaaaから読み込んだ値を基準アドレスとする。

3.0xS行 基準アドレス+0xbbbbbbbに0xvvvvvvvvを書き込む。0xSは0=32bit 1=16bit 2=8bit
  この行は(Constant RAM Writes=通常書き込み)を組み込んでいるだけ。

4.0xD2行 コードブロック終端、コード実行ステータスクリア、オフセットクリア等
■PSPAR 0xDC

上のコードは下のようにも表現可能です

_M 0x6aaaaaaa 0x00000000
_M 0xBaaaaaaa 0x00000000
_M 0xDC000000 0xbbbbbbbb 0xbbbbbbbbを基準アドレスに加算 = 基準アドレスB
_M 0xS0000000 0xvvvvvvvv 基準アドレスB+0x0000000に0xvvvvvvvvを書き込む。
_M 0xD2000000 0x00000000

0xDCは多重ポインター(-オフセット)の時に使うものなのですがシングルでも使用出来ます。
勘のいい人なら気づいたと思いますが、0xB(+オフセだけの時)と0xDC(-オフセを含む時)を
組み合わせるだけで多重ポインターが作れます。

ー方向オフセットは補数表現で作ります。
-1なら0xFFFFFFFFを0xDCコード行に指定するだけです。
■サンプル

CWCとPSPARで同じ内容を表現すると次のようになります。
CWC形式はコンパクトですね。

_C0 CWC Pointer
_L 0x61000000 0x77777777
_L 0x00020001 0x00004444

_C0 PSPAR Pointer
_M 0x69800000 0x00000000
_M 0xB9800000 0x00000000
_M 0x00004444 0x77777777
_M 0xD2000000 0x00000000

_C0 PSPAR Pointer
_M 0x69800000 0x00000000
_M 0xB9800000 0x00000000
_M 0xDC000000 0x00004444
_M 0x00000000 0x77777777
_M 0xD2000000 0x00000000



Syntax of Pointer Commands for CWC


文字に着色してCWC用のチートシート(早見表)を作ってみました。
文章は【english:code:psp_types [CWCHEAT documentation]】のコピペです。
英語なので分かりやすいかどうか分かりません。





Sample(single) of Pointer Commands for CWC


以下は日本語によるサンプルです。
まずはシングルポインター。
qqqはあえて無視してます。




Sample(multi-level) of Pointer Commands for CWC


次にマルチレベルポインター。

『0xnnnnの回数だけ手順2を繰り返す』の部分は、
extraポインター行の0xSpppppppの羅列をどこまで実行するかということです。
日本語wikiで言う0xS000iiii 0xS000jjjj ... 0xS000yyyyの部分に相当します。




PSPARとの比較用に、と思ってチートシートを作っていたら
記事の内容のメインがPSPAR形式ではなくCWC形式になったような。

次回はPSPAR形式のマルチレベルポインターについて書きます。





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

コメント: -

Home > TempAR Usage > TempAR - CWC/PSPAR形式ポインターコード1

Return to page top

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。