Home > スポンサー広告 > MIPSハンドアセンブル c.cond.fmt

スポンサーサイト

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

コメント: -

Home > スポンサー広告 > MIPSハンドアセンブル c.cond.fmt

Home > PSP memo > MIPSハンドアセンブル c.cond.fmt

MIPSハンドアセンブル c.cond.fmt


『CWC カメラ サーチ』『PSP R4000』『c.le.s』みたいな
検索キーワードが多いので書いてみた。

サーチは32bitでZ座標を最初に割り出す。
X座標とY座標は通常、隣かすぐ近くのアドレスに配置されている。
なのでZ座標の傍のメモリを直接エディタで開いて確認すればいい。

浮動小数点(IEEE754)を少し知れば分かることだが、
最上位ビット1が立った時点で(0x80000000以降のこと)
符号がマイナスになる。
TempARでGreaterやLessを使う場合は注意が必要。
CMFには比較小数というサーチ方法が用意されている。
0x00000000 = +0.0
0x3F800000 = +1.0
0x40000000 = +2.0
0x50000000 = +8589934592.0
0x70000000 = +158456325028528680000000000000.0
0x80000000 = -0.0
0xBF800000 = -1.0
0XF0000000 = -158456325028528680000000000000.0




サーチだけで制限解除をどうにかしたいなら
最大値と最小値を割り出し、最小値と最大値が格納されている
アドレスを書き換える。
ゲームによっては数字が微妙に動き続ける場合があるので
そういう場合は難しいかも。
値は10進数に変換した際にキリの良い数字が
入っている場合が多いのでその辺は勘で。
最大値などが直接プログラムにしか書かれていない場合もあるので
そういう場合はサーチでは不可能。


後は解析するパターン。


フォーマット
c.cond.fmt fs,ft (R4000リファレンス P669)

cはfloating-point Compare (比較)
condはcondition (条件判定)
fmtはformat (精度)

condにはleやeqなどが入る (R4000リファレンス P201)
fmtはs(単精度)かd(倍精度) (R4000リファレンス P659)

ニーモニック マシン語
c.le.s $f12,$f13 0x460D603E

16進数 0x460D603E
2進数 0b01000110000011010110000000111110

分解
010001 10000 01101 01100 00000 11 1110
6bit 5bit 5bit 5bit 5bit 2bit 4bit
cop1 fmt ft fs 0 fc cond

cop1 0b010001 固定
fmt 0b10000=16 単精度浮動小数点 (R4000リファレンス P659)
ft f13=13=0b1101
fs f12=12=0b1100
0 0b00000 固定
fc+cond 0b111110 Opcode Bit Encoding (R4000リファレンス P712)

FPU Instruction Opcode Bit Encodingの見方
命令 c.le
5...3 7=0b111
2...0 6=0b110
連結 0b111110
c.eq.s / c.le.s / c.lt.s はPS2disでも
MARS MIPS simulator】でも【QSPIM Simulator】でも変換可能。
ただし、PS2disでは c.lt.s / c.le.sを変換すると、c.olt.s / c.ole.sになる。(oはordered)




c.f.s $f0,$f0 = 0x46000030
c.f.sはPS2disでも【QSPIM Simulator】でも変換可能。




んで本題。
c.lt.s	$f0,$f1
nop
bc1f $08800000

みたいなのがあったら

c.eq.s $f0,$f0
c.le.s $f0,$f0

のどちらかを使えば
FPU Control/Status Register (FCR31)のC Field(上から9bit目)
Condition bitに1(C=1)が必ず立つので

C=0の方へ行かせたければ → bc1f
C=1の方へ行かせたければ → bc1t


Condition bitに0(C=0)を必ず入れたい場合は

c.f.s $f0,$f0

beq $zr,$zr,offsetとやってることは同じ。




例:お姉チャンバラSPECIALのPROFILEでキャラZ座標制限(近距離側)を外す。
0x013B0E9C	PROFILEキャラZ座標
0x088C9D54 ブレークしたアドレス(他にread/writeが数カ所ある)

ブレークしたアドレスから追いかけると
+0x0158、86行先に目的の判定がある。

0x088C9EAC:4602003C c.lt.s $f0,$f2
0x088C9EB0:00000000 nop
0x088C9EB4:45000002 bc1f $088C9EC0

書き換える。
0x088C9EAC:46000030 c.f.s $f0,$f0

CWCコード化
_C0 PROFILE Z POS Limitless
_L 0x200C9EAC 0x46000030



もちろん、ディレイスロットの要/不要に注意しつつ
条件分岐やディレイスロットをNOPしたり、jumpで書き換えてもよい。

遠距離側判定は0x088c9de4だったかな。
ズームアウトでキャラが豆粒になっても
楽しくないのでどーでもいいが。




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

コメント: -

Home > PSP memo > MIPSハンドアセンブル c.cond.fmt

Return to page top

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