03/21 初稿
04/01 ショートカットキーと演算子を追加。その他加筆修正。
04/02 calcとスクリプトサンプルを追加。その他加筆修正。
04/03 スクリプト修正。exresumeについて追加。
04/03 スクリプト4ヶ追加。コマンド echo chdir ls cp rm iena irel 追加。
04/07 コマンド並べ替え。cd、スクリプト文言修正。リンク追加。
04/10 スクリプト1ヶ追加。
04/14 コマンド別名(Synonym)とバックトレース追加。
【TempAR 1.59 の使い方 【後編】 rev 8 - God is in the details】
にてPSPLinkを扱っていますがPSPLinkのreadme.txtだけだと
とっつきにくいと思われるので簡易的なコマンド表を作ってみました。
コマンドはゲーム解析で使用する主立ったものだけを抜き出しています。
半分は自分の備忘録的意味合いなのデス。
必要なファイルは上部のメニューのToolsか、ツール置き場からDL出来ます。
凡例など
[ ]内オプションは省略可、それ以外は省略不可、| (パイプ)はorの意味、
num = 数字 val = 値 addr = アドレス $reg = レジスタ名
filename = ファイル名 .ext = 拡張子 intno = 正の整数 Path = パス
source = 元 destination = 先
b=Binary (2進数) d=Decimal (10進数) o=Octet (8進数) x=heX (16進数)
f=Float(浮動小数点)
b=8bit/1byte h=16bit/2byte/Half word w=32bit/4byte/Double word
アドレスは表記も入力値もReal Address。
Virtual Addressの場合はアドレス入力の際に足し算させても良い。
bpset 0x08923456 w
↓これをこのように置換可能。
bpset 0x00123456+0x08800000 w
なお、アドレス入力は加算だけでなく減算等も可能。
DOSのようにキーボードカーソル↑を押すとコマンド履歴が出る。
↓を入れると履歴の新しい側へ。
一部のコマンドでは未実装のオプションを指定しても無視される。(エラーが出ない)
つまり、コマンド履歴から下記のようにコマンド指定しても機能する。
bpset 0x00123456+0x08800000 w Enter
↑を押して履歴を表示させる
bpset 0x00123456+0x08800000 w 表示
←でカーソル移動、BackSpaceで不要文字を削除
bpdel 0x00123456+0x08800000 w Enter
オプションはwは無視されて、bpdelが実行される。
PSPLink 簡易コマンド表
機能 | コマンド (別名) | オプション | 使用例/備考 |
---|---|---|---|
メモリ保存 | savemem (sm) | addr size path |
savemem 0x08800000 0x01800000 filename.ext ファイル保存先はpspsh.exeのあるディレクトリ。 開始アドレスとサイズはたいていこれしか使わない。 定型なのでsave.txtを作るといいかも。中身↓ savemem 0x08800000 0x01800000 hogehoge.bin % save.txt と打つと、batで実行。 保存したらすぐ改名した方が良い。 |
メモリ表示 | memdump (dm) | [addr|-] [b|h|w] | memdump 0x08800000 (省略時=b) b/h/w = 8/16/32bit表示。 前回の表示アドレスを記憶しており、 2回目以降はアドレス省略で続きを表示出来る。 -(マイナス)を付けると、現在アドレス-0x0100から。 |
ディスアセンブル | disasm (di) | addr [count] | disasm 0x08800000 10(省略時=1) 表示範囲はcount*4byte。count=行数。 PS2disで(cop1_s) $020cb03eと表示される行も、 c.le.s $f22,$f12と正しく表示される。 |
ブレークポイント設置 | bpset (bp) | addr [h|1] | bpset 0x08800000 bpset 0x01400000+0x08800000 オプションは同時指定可能。 h…ハードウェア 1…ワンタイム |
ブレークポイントex1 改造版のみ使用可能 | bpset (bp) | addr [r|w|h|1] | bpset 0x08800000 wh bpset 0x01400000+0x08800000 wh オプションは複数指定可能。 省略…アクセス r…読み w…書き h…ハードウェア 1…ワンタイム |
ブレークポイントex2 改造版のみ使用可能 | bpset (bp) | addr [r|w|h|1|v] size | bpset 0x08800000 w 0x7 0x08800000~0x08800007が対象アドレス範囲で 書き込もうとした場合にブレーク sizeはアドレスマスク。 |
ブレークポイントex3 改造版のみ使用可能 | bpset (bp) | addr [r|w|h|1|v] size val | bpset 0x08800000 wv 0x7 0x0 0x08800000~0x08800007が対象アドレス範囲で 値0x0を書き込もうとした場合にブレーク valは値。 |
ブレークポイントex4 改造版のみ使用可能 | bpset (bp) | addr [r|w|h|1|v] size val range | bpset 0x08800000 wv 0x7 0x0 0xF 0x08800000~0x08800007が対象アドレス範囲で 値0x0~0xFを書き込もうとした場合にブレーク rangeはvalueマスク。 |
バックトレース 改造版のみ使用可能 | backtrace (bt) | なし | backtrace bpsetでブレークさせた後にコマンドを入力する。 バックトレース機能追加版ではbpprintのエイリアスは使用不可。 |
ブレークポイント無効 | bpdis (bd) | num|addr | bpdis 0x08800000 アドレス指定の場合 4byte単位でブレークすることに注意。 bpset 0x08800001 w の場合 0x08800000 でブレークする。 当然、bpdis 0x08800000と入力しないと解除できない。 bpprintで確認するのが吉。 |
ブレークポイント有効 | bpena (be) | num|addr | bpena 0 bpprintで表示される番号でも指定可能 |
ブレークポイント削除 | bpdel (bc) | num|addr | bpdel 0 再利用するならdisを使う |
ブレークポイント表示 | bpprint (bt) | なし | bpprint フラグ R…Read(読み) W…Write(書き) D…Disable(無効) H…Hardware(ハードウェアブレークポイント) O…プログラムカウンタ(EPCレジスタ) |
ステップ実行 | step (s) | なし | step bp解除して使う。 |
ステップ実行 | skip (k) | なし | skip stepと違い、j/jalを実行しない。 |
メモリRead 8bit | peekb (kb) | addr [o|d|x] | peekb 0x08800000 (省略時=x) 8/10/16 進数表示 省略時16進数 |
メモリRead 16bit | peekh (kh) | addr [o|d|x] | peekh 0x08800000 (省略時=x) 8/10/16 進数表示 省略時16進数 |
メモリRead 32bit | peekw (kw) | addr [o|d|x|f] | peekw 0x08800000 (省略時=x) 8/10/16/浮 進数表示 省略時16進数 help peek系で表示されるオプションbはdの間違いです。 |
メモリWrite 8bit | pokeb (pb) | addr val1 [val2..valn] | pokeb 0x08800000 0xFF 値は10/16進数可 |
メモリWrite 16bit | pokeh (ph) | addr val1 [val2..valn] | pokeh 0x08800000 0xFFFF 65535 値は10/16進数可 |
メモリWrite 32bit | pokew (pw) | addr val1 [val2..valn] | pokew 0x08800000 0xFFFFFFFF 値は10/16進数可 解析中はこれで書き換える方が数段早い。 プラグインのメモリエディタで書き換えようとするなら デバッガに制御が移っていると呼び出せるわけが無いので BP解除→ゲーム復帰→エディタ呼び出し→操作→書き込み のステップが必要。 |
メモリFill 8bit | fillb (fb) | addr size val | fillb 0x08800000 4 0x01 値は10/16進数可 主にフラグ書き換え用。同じ数値で埋めたい時に。 |
メモリFill 16bit | fillh (fh) | addr size val | fillh 0x08800000 2 0x0101 値は10/16進数可 主にフラグ書き換え用。 |
メモリFill 32bit | fillw (fw) | addr size val | fillw 0x08800000 1 0x01010101 値は10/16進数可 主にフラグ書き換え用。 |
メモリサーチ 16bit | findh (nh) | addr size val1 [val2..valn] | findh 0x08800000 8 0x0101 値は10/16進数可 |
メモリサーチ 32bit | findw (nw) | addr size val1 [val2..valn] | findw 0x08800000 8 0x01010101 値は10/16進数可 |
汎用レジスタ表示 | exprint (ep) | [ex] | exprint ゲーム解析なら主にこれ。 リダイレクト(>)が利用出来るので exprint >hogehoge.txt と打つことでpspsh.exeのディレクトリに レジスタの数値をテキストで保存可能。 |
FPUレジスタ表示 | exprfpu (ef) | [ex] | exprfpu c.le.sやlwc1を追うならこれ リダイレクト(>)が利用出来るので exprint >hogehoge.txt exprfpu >>hogehoge.txt と打つことで、テキストに追記出力可能。 |
VFPUレジスタ表示 | exprvfpu (ev) | [s|c|r|m|e] [ex] | exprvfpu |
COP0レジスタ表示 | cop0 (c0) | なし | cop0 |
デバッグレジスタ表示 | hwprint (hwprint) | なし | hwprint |
レジスタに値セット | setreg (str) | $reg value | setreg $a0 0xFFFFFFFF ロード先の値を書き換えるより早い。 対象に指定可能なレジスタは汎用レジスタ、 プログラムカウンタのEPCレジスタ($epc)、 浮動小数点コンディションレジスタ($fsr) |
ゲームに戻る | exresume (c) | [addr] | exresume 例外が発生し無ければ復帰可。 すぐにBPで止まる場合はBP解除を忘れずに。 アドレスが未アライメントだったり オーバーフロー等で例外が発生すると 例外を解除しない限り復帰不可。 |
シェルリセット | reset (r) | [key] | reset pspshリセット後、VSHに戻る。 ゲームはリセットされる。(sceKernelExitGame()をcall) エラーが発生し、解決出来ない場合はresetで 素早くVSHに復帰できる。 |
シェル閉じる | close (close) | なし | close pspshウィンドウを閉じる ゲームはリセットしない。 |
シェルリセット+閉じる | exit (quit) | なし | exit pspshリセット+ウィンドウを閉じた後、VSHに戻る。 ゲームはリセットされる。 |
クロック変更 | clock (clock) | cpu ram bus | 数字を間違えた際の危険性が不明のため未使用 |
SS撮影 | scrshot (ss) | filename[.ext] [pri] | scrshot filename.bmp スクリーンショットをpspsh.exeのディレクトリに BMP形式で保存 |
スクリプト実行 | % (%) | filename.ext | % filename.ext よく使う定型文をテキストファイルに保存しておけば %で呼び出してバッチ処理出来ます。 メモリダンプを定型処理したり、 広い範囲をまとめてパッチしたり、 ブレーク後のゲーム復帰までを自動化したり ポインタ等複数アドレスの中を同時表示したり 非常に便利です。 |
計算機 | calc (calc) | val [o|d|x] | calc 0x16<<4 (省略時=x) 8/10/16 進数表示 省略時16進数表示 valには数値だけで無く、各種演算子が使用可能です。 |
テキスト表示 | echo (echo) | [args] | echo hogehoge 引数に画面表示したい文字を指定します。 DOSのechoと同じです。(標準で@echo off状態) 主にスクリプトで使用します。 |
カレント変更 | chdir (cd) | path | chdir script chdir ..(1階層上がる) 相対パスの指定方法はDOSと同じです。 ただし環境変数の%var%は理解しません。 コマンドpwdとcd .は等価ですので pwdを覚える必要ありません。 |
ディレクトリ表示 | ls (dir) | [Path1.PathN] | ls ms0:/seplugins/TempAR/cheats/ 指定したパスにあるファイルとdirをリスト表示します。 コマンドはUNIXライクにlsですがDOSのdirと同じです。 |
ファイルコピー | cp (copy) | source destination | cp ms0:/seplugins/TempAR/cheat.db host0:/ source(元)からdest(先)へ強制上書きコピーします。 sourceにはファイルを指定します。 ワイルドカードは使えません。 destにはディレクトリかファイル名を指定します。 元とは違うファイル名を指定することも可能です。 |
ファイル削除 | rm (del) | filename.ext | rm ms0:/seplugins/TempAR/dump0.ram ファイルを削除します。 |
ブレークポイント追加 | iena (iena) | d|e intno [sub] | iena e 2 Disable or Enable an interrupt or sub-interrupt |
ブレークポイント解放 | irel (irel) | intno [sub] | irel 2 追加したブレークポイントを解放します。 |
ショートカットキー
ショートカットキー | 機能 |
---|---|
ALT+R | リセット (= reset) |
ALT+S | ステップ実行 (= step) |
ALT+K | ステップ実行 (= skip) |
演算子
Operator | 意味 |
---|---|
+ | 加算 |
- | 減算 |
* | 乗算 |
^ | 除算 |
& | ビット演算 - 論理積 |
| | ビット演算 - 論理和 |
^ | ビット演算 - 排他的論理和 |
~ | ビット演算 - 否定 |
<< | ビット演算 - 左シフト |
>> | ビット演算 - 右シフト |
&& | 論理演算 - 論理積 |
|| | 論理演算 - 論理和 |
== | 関係演算 - 等号 |
!= | 関係演算 - 不等号 |
< | 関係演算 - 小なり |
> | 関係演算 - 大なり |
<= | 関係演算 - 以下 |
>= | 関係演算 - 以上 |
() | 括弧 |
$レジスタ名 | レジスタの中の数値 |
演算子はアドレスと数値双方に適用可能です。
また、ブレークさせた際にコマンドのアドレスや数値を
レジスタで置き換えることも可能です。
disasm $epc-0x16 10
(ブレークした箇所の4行前から10行分ディスアセンブル表示)
memdump $a0+0x1679-0x16
(a0レジスタの指すアドレス+オフセット0x1679の箇所の少し手前-0x16からメモリダンプする)
peekw $v0
(v0レジスタが指すアドレスの中身を見る)
pokew $v0+0x1679 0x16<<4
(v0レジスタの値+オフセット0x1679に0x16を左シフト4回した数値で書き込む)
pokew $v0+0x1679 $s0||$s1
(v0レジスタの値+オフセット0x1679にレジスタs0とs1を論理ORした数値を書き込む)
などのように記述することも出来ます。
PSPLINKの演算評価は単純に左結合です。
PSPLINKでは1+1*2=4になります。
四則演算に従うなら1+(1*2)と表記する必要があります。
exresumeについて
exresumeでゲームに戻る際には、次のような手順で実行します。
1 . bpdelかbpdisでブレークポイントを解除する。
2 . stepを1回実行する。
3 . exresumeを実行する。
1は当然で、ブレークポイントを解除しないとstepやexresumeの際に同じ箇所でブレークし続けます。
2を実行しない場合は、一部のゲームでFPU Exceptionのエラーが発生することがあります。(要検証)
3でゲームに戻れます。
一連の手順はスクリプトを利用した方が楽が出来ます。
スクリプトサンプル
スクリプトにはファイル名、拡張子を自由に付けることが出来ます。
ファイル名を付ける際に拡張子を削除しておくと、スクリプトを呼ぶ際に
ファイル名だけで実行することが可能になり打鍵数を減らすことが出来ます。
スクリプトファイルだけを別のディレクトリに管理しておきたい場合は
ディレクトリ名を1文字にしておくとタイプする実行の際に楽になります。
(スクリプトのサーチパスはカレントディレクトリではなく、pspsh.exeが存在する
ディレクトリ決め打ちみたいなので)
名前 @sv
機能 メモリ保存
備考 setlocalなどを使用してファイル名に自動でyyyymmdd-hhmmss等を付けたいところですが
DOSコマンドが使えない為高度なことは出来ません。
savemem 0x08800000 0x01800000 hogehoge.bin
名前 @e
機能 次の箇所でブレーク
bpdis 0 step bpena 0 exresume
名前 @s
機能 bpdisを自動化。
bpdis 0 step exresume
名前 @d
機能 bpdelを自動化。
備考 安定して動くなら bpdel 0 → step → exresumeでも良い。
bpdis 0 step bpdel 0 exresume
名前 ゲーム略称+α等
機能 現在のゲームのポインターアドレスなどをまとめて表示
備考 監視機能の代わりに、アドレスをpeekwで読み出し、echoで分かりやすくするだけ。
パイプで標準入力を受け取れないので高度なことは出来ません。
echo ポインターアドレス peekw ポインターアドレス echo 残り時間数値 peekw 残り時間のアドレス
名前 @cp0
機能 TempARでメモリダンプしたファイルをMSからPCに転送
備考 host0:/ はpspsh.exeのあるディレクトリを指す。
上書き確認せずに強制的に上書きするので注意。
cp ms0:/seplugins/TempAR/dump0.ram host0:/
名前 @rm0
機能 TempARでメモリダンプしたファイルdump0.ramをMS上から削除
rm ms0:/seplugins/TempAR/dump0.ram
名前 @dldb
機能 TempARのチートデータベースファイルをMSからPCに転送
備考 host0:/ はpspsh.exeのあるディレクトリを指す。
上書き確認せずに強制的に上書きするので注意。
cp ms0:/seplugins/TempAR/cheats/ULJM-XXXXX.db host0:/
名前 @updb
機能 TempARのチートデータベースファイルをPCからMSに転送
備考 host0:/ はpspsh.exeのあるディレクトリを指す。
上書き確認せずに強制的に上書きするので注意。
cp host0:/ULJM-XXXXX.db ms0:/seplugins/TempAR/cheats/
名前 @trc
機能 自動でstepさせて通過したアドレスをログに出力する。トレース。
備考 ブレークさせたら、bpdisかbpdelで解除してから使用。
disasmだとリダイレクト出来ないのでcalcかexlistを使用する。
calc $epc >>psplink_trace.log step calc $epc >>psplink_trace.log step 以下好きなだけ繰り返し記述。
必要最低限のコマンド
初めて触る人向けに最低限必要なコマンドだけ抜き出してみる。
コマンド | 理由 |
---|---|
savemem | PS2disで読み込ませる場合に必要。 |
disasm | PS2disを使わない場合はこちら。 |
bpset | ブレークポイント設置。これが無いと始まらない。 |
bpdis | ブレークポイント無効化。 |
bpdel | ブレークポイント削除。 |
bpena | ブレークポイント有効化。 |
bpprint | ブレークポイント表示。 |
exresume | ゲームに復帰。 |
reset | exresumeで復帰出来ない場合のリセット。 |
- 関連記事
-
- PMEtanでプログラムサーチ? (2012/02/07)
- PSP用MIPS資料URL (2012/01/02)
- FINAL FANTASY 零式 - ショップアイテム全開コードの作り方 後編 (2011/12/30)
- FINAL FANTASY 零式 - ショップアイテム全開コードの作り方 前編 (2011/12/29)
- 多重変動(多重ポインター)アドレスサーチ - PointerSachiko (2011/10/11)
- PSVita ARM® Cortex™-A9 core (2011/08/22)
- PMEtanのリスト付き書式がいいですよね (PMEtanはじめました) (2011/04/19)
- MIPSハンドアセンブル c.cond.fmt (2011/04/15)
- PSPLINKバックトレース機能追加版 (2011/04/11)
- PSPLINK 3.0 OE (2011/04/06)
- PSPLink 簡易コマンド表 rev 7 (2011/04/03)
- Newer: gdipp さようなら。
- Older: 積みゲーの歴史がまた1ページ