AVG32の命令解析(4)

普通、数値と言えばCPUが扱いやすい8ビット幅や16ビット幅で扱われるが、AVG32では先頭1ビットがフラグ、続く3ビットが何バイトのデータであるかを表す為、1バイトなら4ビット幅、2バイトなら12ビット幅、4バイトなら28ビット幅になる。
つまり、普通に8ビット幅や16ビット幅のデータを格納すると、2x 0x や 4x xx 0x 00 もしくは Ax 0x や Cx xx 0x 00 のようなパターンになる。4ビット幅の 1x や 9x ってパターンはあるが、3バイトや5バイト以上の例は稀なのか見たことが無いので、絶対にない 0x に加えて、3x、5x…8x、Bx、Dx…Fx はシフトJISにして文字列に見えなければ何バイトかで構成される値か、命令と考えて良さげ。
他にも命令内でカッコで囲むように使われる28と29や、22と23があるし、セパレータや終端記号として00が使われたり、文字の開始前にFFやFEが出てくることが多い。また、文字列の後にはそれに対応する付加パラメータとして数値が付く場合も多い。特に画像系にはパラメータが沢山付く場合がある(領域の指定にx1、y1、x2、y2など)。
あと命令は1バイトよりも2バイト命令が多いようで、命令によっては直後に以後に続くパラメータの数が1バイトで示されている場合もある。
こんなカンジで見ていくと命令ごとの区切りが見えてくる。
・・・てな具合でAVG32の命令を視覚化するコンバータを作ってみた。未知の命令は命令コードとパラメータがある場合は数値は10進数で、文字列はそのまま出力ってな具合。
なんつーのか、バイナリデータからソースっぽいものになるだけで前後関係やプログラム全体の動きから、これまで動作が不明だった命令(コマンド)がかなり理解できた。
マウス位置の取得や、変数への代入、IF文の中で使われる演算子、他に裏画面へ画像をロードして、表画面の一部に転送する命令などなど。
久々にNScripterへのコンバータも作ってみた。今回のAVG32命令視覚化コンバータを元に作ったことでかなりソースがブラッシュアップされたし、変換効率も高くなった。