PSDIS 1.2 のキーアサイン
キー | 説明 |
一般的なもの
|
Ctrl-N |
新規作成
|
Ctrl-O |
開く
|
Ctrl-S |
上書き保存
|
Ctrl-C |
選択範囲をコピー。(テキストエディタ等にペースト可能)
|
Ctrl-F |
検索
|
F3 |
下に検索
|
Shift-F3 |
上に検索
|
PageDown |
1ページ下に移動
|
PageUp |
1ページ上に移動
|
UP |
カーソル移動。
|
DOWN |
カーソル移動
|
ダイアログ表示
|
Ctrl-A |
「逆アセンブル表示方法の設定」ダイアログ表示
(メニューでは Ctrl-D となっている。)
|
Ctrl-W |
逆アセンブラウィンドウを開く。
|
Ctrl-D |
16進ウィンドウを開く
|
Ctrl-H |
ヘッダ情報を表示
|
レジスタ関連
|
Ctrl-R |
レジスタ値の変更
|
R |
選択行を実行しレジスタ値に反映させる
|
行の表示方法
|
Shift-B |
未決定行の表示方法を .byte とする
|
Shift-H |
未決定行の表示方法を .half とする
|
Shift-W |
未決定行の表示方法を .word とする
|
Shift-C |
未決定行の表示方法を code とする
|
B |
カーソル行の表示方法を .byte として決定。
|
H |
カーソル行の表示方法を .half として決定。
|
W |
カーソル行の表示方法を .word として決定。
|
C |
カーソル行の表示方法を code として決定。
|
U |
カーソル行の表示方法を未決定とする。
|
S |
カーソル行の表示方法がセミコロンになる。なんじゃこりゃ
|
アドレスによる移動
|
G |
アドレスを指定してジャンプ。
|
F10 |
アドレスを指定してジャンプ。(G と同じ)
|
Ctrl-G |
ラベルを指定してジャンプ
|
マーク
|
SPACE |
カーソル行をマーク。
|
Ctrl-UP |
上のマークに移動
|
Ctrl-DOWN |
下のマーク位置に移動
|
行の修正
|
RETURN |
行の修正。カーソルを Label に設定。
|
Shift-RETURN |
行の修正。カーソルを Comment に設定。
|
スタック
|
INSERT |
カーソル行をスタックにプッシュ
|
DELETE |
スタックからポップし、捨てる。
|
LEFT |
スタックからポップして移動。
|
RIGHT |
カーソル行をスタックにプッシュし、参照行にジャンプ。
|
範囲指定
|
Shift-DOWN |
カーソル移動。移動範囲を選択。
|
Shift-UP |
カーソル移動。移動範囲を選択。
|
Shift-PageDown |
1ページ下に移動して、移動範囲を選択。
|
Shift-PageUp |
1ページ上に移動して、移動範囲を選択。
|
Shift-RIGHT |
カーソル行をスタックにプッシュし参照行にジャンプ。移動範囲を選択。
|
Shift-LEFT |
スタックからポップして移動。移動範囲を選択。
|
不明
|
Ctrl-V |
??? 未使用?
|
F6 |
??? 未使用?
|
Shift-F6 |
??? 未使用?
|
Shift-F1 |
??? 未使用?
|
私が確認したバグ
- sllv,srlv,srav のオペランド(ていうんだっけ)の順序がおかしい。
- 開始アドレスを 00000000 として逆アセンブラウィンドウを作成し検索、
検索結果が該当なしであったときに 00000000 に移動し、その後落ちる。
- メニューの「表示」-「逆アセンブルの設定」のアクセラレータが Ctrl-D
と表示されているが実際は Ctrl-A。
2000-08-19
PSDIS 1.2 のセーブファイルのフォーマット
ファイルヘッダ 16bytes
+00 シグネチャ "PsDis100"
+08 未使用 ゼロ x8
以後はチャンク(GIF のチャンクみたいなんでこう呼びます)の羅列ですが、
HEADER CHUNK,IMAGE CHUNK,ATTRIBUTE CHUNK, LABEL CHUNK, COMMENT CHUNK, REGISTER CHUNK の順番に1つずつ並んでいます。同種のチャンクを複数指定したら前のデータが消えました。残念。
チャンク
+00 WORD type; アスキー2バイト
+02 DWORD size; チャンク固有データのバイト数
+06 チャンク固有データ
HEADER CHUNK
チャンクタイプ: 50h 48h (PH: PS-X EXE HEADER?)
+000 PS-X EXE HEADER がそのまま
+800
IMAGE CHUNK
チャンクタイプ: 4dh 49h (MI: Memory Image?)
+00 DWORD addr; 先頭アドレス
+04 DWORD size; バイト数
+08 BYTE[] img; メモリイメージ
ATTRIBUTE CHUNK
チャンクタイプ: 41h 54h (AT: ATtribute?)
+00 DWORD addr; 先頭アドレス
+04 DWORD size; バイト数
+08 BYTE[] flg; フラグの配列
これは説明が必要なんで少しだけ。
flg のサイズは size ではなくて、 size / 4 になります。というか (size + 3)/4 かもしれません。addr とか size はメモリイメージと同じく、データの有効範囲を示しています
それに対してフラグはワード(4bytes)に対して1バイトが割り当てられています。
フラグの意味は bit 0-2 がそのアドレスの属性を表しています。
00: undef
01: byte
02: half
03: word
04: 意味不明のセミコロン
05: code
bit 3 は該当する場所にコメントがあるとき 1 となります。(該当する場所が4箇所あるわけですが、どこかにあるとフラグが立つみたいです。)検索時に使ってるんだと思います。
bit 4-7 はラベルがあるかどうかです。こちらは4箇所のどこにあるかまでわかるように4ビット使ってます。例えばフラグが 0x80010000 をあらわしてる場合、フラグが 0x39 だったら、
xxxx x001 80010000 の属性は byte で、
xxxx 1xxx コメントが 80010000 から 80010003 のなかにあって、
0011 xxxx 80010000 と 80010001 にラベルが設定されてる。
ということになります。
LABEL CHUNK
チャンクタイプ: 4ch 42h (LB: LaBel?)
+00 BYTE[8] sig; 必ず "PSDISL00"
+08 {
+00 DOWRD address; アドレス
+04 BYTE length; 文字列のバイト数
+05 CHAR string[length]; 文字列
} がひらすら続く。
+08 からのブロック数はチャンクのサイズでわかります。
ハッシュというか CMap に放り込んでるんだと思います。
COMMENT CHUNK
チャンクタイプ: 43h 4dh (CM: CoMment?)
構造は LABEL と同じです。
REGISTER CHUNK
チャンクタイプ: 52h 56h (RV: Register Value?)
+00 DWORD r00; zero
+04 DWORD r01; at
...
+7c DWORD r31; ra
ちなみに zero にゼロ以外の値を書いてみましたが無視されました(笑
てなわけで実験プログラム
psdis の .pef ファイルを読み込んで勝手なコメントとかを付けるプログラムを作ってみました。私がたまに解析するときにいっつも同じような作業をしてるのが無駄っちいので自動化したもんです。使い方は基本的に、
prepsdis <in> <out>
です。 in には pef ファイルを指定します。できればメモリイメージを取り込んだだけの pef ファイルを指定してください。編集済みのファイルでも動くようにしたつもりですが、自信ありません。out は書き出す pef ファイルの名前です。 in と out を同じにしても動作しますが責任は持てません。
caetla なんかだと gp が 1f800000 固定になってますが、そういう場合は
prepsdis <in> <out> gp=1f800000
なんてことをすると結構ナイスなコメントを付けてくれます。
WIN32 コンソールプログラムのくせに動作には mfc の DLL が必要です。
なお、ソースはゲロ吐きそうなくらいばっちいので隠します(笑。
どんなんが出るかというと、
8001d0d4 a4600000 LOOP> sh zero,$0000(v1) >spuCh0 vol-L
8001d0d8 a4600002 sh zero,$0002(v1) >spuCh0 vol-R
8001d0dc a4660004 sh a2,$0004(v1) >spuCh0 pitch
8001d0e0 a4650006 sh a1,$0006(v1) >spuCh0 wavAddr
8001d0e4 a4600008 sh zero,$0008(v1) >spuCh0 attack,decay,sus lv
8001d0e8 a460000a sh zero,$000a(v1) >spuCh0 sus,rel rate
8001d0ec 24840001 addiu a0,a0,#$0001 00000001
8001d0f0 28820018 slti v0,a0,#$0018
8001d0f4 1440fff7 bne v0,zero,$8001d0d4:(LOOP>) -8Λ
8001d0f8 24630010 addiu v1,v1,#$0010 spuCh1 vol-L
8001d0fc 3411ffff ori s1,zero,#$ffff 0000ffff
8001d100 3c028006 lui v0,#$8006
てことになったりします。ループで v1 が 0x10 ずつ増えてくわけですが、表示は ch0 ってのはごあいきょうってことで勘弁してください。
この他にもバグ満載でお届けします。
むっちゃ遅いけど
お試しくださいな
ちなみに(はなからインチキくさいプログラムなので)バグのレポートは読みますけど、善処しません。
[email protected]