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 ??? 未使用?

私が確認したバグ


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 ってのはごあいきょうってことで勘弁してください。 この他にもバグ満載でお届けします。 むっちゃ遅いけど お試しくださいな
ちなみに(はなからインチキくさいプログラムなので)バグのレポートは読みますけど、善処しません。

hanimar@reocities.com