2012年12月19日水曜日

tsxbinのシンボル機能

今回は、tsxbinのシンボル機能を使うためのマクロの基本を紹介したい。tsxbinのマクロについては、ネットで探してもあんまり書かれていない。
特にマクロ言語の癖というか仕様的な部分のtipsは見た事ない。今回は基本的なところをまとめてみる。

1)シンボル記述のヘルプ
シンボル自体に関しての説明があまりないので、最初はシンボル≒マクロだとわからず、ヘルプも何を見ればいいのか自分はわからなかった。
実際にはシンボル表示に使用するのはマクロそのものなので、マクロのヘルプを見ればほぼわかる。ただし、マクロヘルプはtsxbinのメニューの「ヘルプ」にはなく、「マクロ」の中の「マクロヘルプ」を開く。
ヘルプを一通り読めば、Cを知っている人や実際に解析している人だったらすぐ使えるようになるだろう。

2)言語仕様概略
  • 演算子仕様、typedef、フロー制御文なんかは概ねC準拠。
  • 変数は、char、int、short、long、float、double、stringが利用できる。unsignedも利用可能。
  • 配列は1次元配列のみ。構造体も定義可能。
  • プリプロセッサでエンディアン指定ができる。
  • ループ処理は最大数が決まっていて、増やしたい場合はプリプロセッサで指定。
  • 関数はヘルプに記載されているものしか使えない。
  • ユーザ定義関数も利用可能。
詳しくはヘルプ参照のこと。

3)シンボルファイル
エディタ上でシンボル表示を可能にするシンボルファイルは、tsxbinインストールフォルダ内に、拡張子SYMというファイル名で作成する。
この時ファイル名に対象ファイルの拡張子をそのままつけると、対象ファイルを読み込んだ時に自動的に対象となるシンボルファイルを適用してくれる。
例えば、*.dat というファイルのシンボルを dat.sym というファイルでtsxbinのフォルダに作成しておけば、.datファイルを読み込むと毎回自動的にdat.symを適用してくれる。

4)ファイル記述変数
シンボルを利用する場合に一番利用するもの。このファイル記述変数をマクロに書くとその宣言部分で読み込んだデータを指定された型に従ってエディタの画面上で表示する。
記述の仕方は、通常の変数宣言文の型名に「$」をつけるだけ。例えば、次のようなint変数をファイル記述変数として宣言する。
$int Magic;
上記のように宣言すると、対象ファイルの現在の位置から型分のデータを読み込んでエディタ上で表示され、読み込んだ分ファイルの位置が進む。また、宣言後は、普通に読み出し専用変数のとしても利用できる。例えば以下のような感じ。

$int Magic;
if (Magic == 1) {
    $int Version;
} else {
    $int Unknown;
}
ただし、通常の変数宣言では、同じスコープ内で同名の変数を複数回宣言することはできないが、ファイル記述変数ではシンボル表示をしたいところで何回も同じ名前で宣言することが可能。変数として使用した場合は、最後のファイル記述変数の宣言時の値が使用される。

5)関数
関数は、ファイル記述変数として読み出すポジションを必要としたり、読み出す文字数を先に確認するなどのためにファイルアクセス系の関数を比較的よく使う。関数で読み出した場合は、ファイルの読み出しポジションは変わらないので関数を使用してもその後のファイル記述変数には影響しない。

6)サンプル
Baldur's Gateのtlkファイルのフォーマットをシンボルファイルで作成するとこんな感じ。(以前BGEEの二有志翻訳の人がツールを探してたときに作成したもの)

// tlk file for Baldur's Gate
#maxloop 100000

struct Entry
{
 short Type;
 char  Resource[8];
 int   Volume;
 int   Pitch;
 int   Offset;
 int   Length;
};

$char magic[4];
$char version[4];

$short LangID;
$int Count;
$int Offset;

$Entry entry[Count];

for(int i = 0; i < Count; i++)
{
 if(entry[i].Length > 0)
  $char String[entry[i].Length];
}

短いけど、構造体やループなどが入っているので分かりやすいかなと思う。tsxbinで実際にdialog.tlkに適用するとこうなる。



次は、マクロ作成時のtips的なことを書くかも。

0 件のコメント:

コメントを投稿