AVG32のSEEN.TXTを解凍&圧縮

AVG32の解析は順調だけど、SEEN.TXTをいじって実際の命令の動作を変更できれば確認しやすいと思ったので、下記のSEENファイルの構造を解説してくれているサイトを参考に自分でSEEN.TXTの展開および再結合ツールを作ってみた。バグあったので修正(2007/08/09)。ついでにSEEN.TXTを展開すると出てくるSEEN124.TXTなどのシナリオファイルからテキスト部分のみを抽出する簡易ツールも追加。

SEENファイルのフォーマット
http://www.geocities.jp/hiko_bae/seenfileformat.html

pactools 0.01 seentools 0.0.1

15:52+09:00">pactools 0.01 seentools 0.0.1 for SLシリーズZaurus:http://www.areanine.gr.jp/~nyano/archives/slzaurus/seentools_0.0.1-1_arm.ipk
15:52+09:00">pactools 0.01 seentools 0.0.1 for Windows:http://www.areanine.gr.jp/~nyano/archives/nikki/seentools001.zip

AVG32のSEEN.TXTなどで使われているPACL形式&PACK形式のファイルを解凍、再圧縮するツール群。Windows用はGCC 3.3.3からなるMinGW日本語版(mingw-jp-20040224)で、Zaurus用はGCC 2.95.1からなるdev-img.bin パッケージ化群(dev-3)でコンパイルした。ソースは共通でWindows用パッケージに含まれている。
エラーチェックは一切行ってないし、同名のファイルは上書きされるし、再圧縮は各ファイルを無圧縮で格納するので以前よりファイルサイズが大きくなるし、逆にファイルサイズが小さくなった場合の動作が考慮されていないので使う際には注意。
「x0 SEEN.TXT」「unpacl SEEN.TXT」で含まれるファイルをカレントディレクトリに解凍。「u0 SEEN.TXT」「udpacl SEEN.TXT」で含まれるファイルをカレントディレクトリから持ってきて再圧縮ってな具合。当然、後者はSEEN.TXTが更新されるのでオリジナルは残しておくのが吉。「seentxt SEEN124.TXT log.txt」でシナリオファイルをテキスト化してlog.txtに出力できる。

SEEN.TXTの構造

AVG32のシナリオデータ「SEEN.TXT」はテキストファイルではなく、複数のファイルが圧縮されたもの。

ヘッダ部
  1. 先頭32バイトはヘッダ部。
  2. 最初の16バイトは0x00で終わる文字列。識別用文字列で「PACL」と書かれている。
  3. 次の4バイトはリトルエンディアンの数値。含まれているファイルの数を示す。
  4. 残り12バイトは0x00で埋められており、未使用エリアだと思われる。
ファイル情報
  1. 続く32バイトはファイル情報。ファイルの数だけ32バイトずつ続く。
  2. 最初の16バイトは0x00で終わる文字列。これはファイル名。
  3. 次の4バイトはリトルエンディアンの数値。データ本体が先頭から何バイト目にあるかを示す。
  4. 次の4バイトもリトルエンディアンの数値。データ本体の大きさを示す。
  5. 次の4バイトもリトルエンディアンの数値。データ本体の解凍後の大きさを示す。
  6. 次の4バイトもリトルエンディアンの数値。よく知らないが1以外の数値を見たことはない。
データ本体(ヘッダ部)
  1. ファイル情報に続いてデータ本体がファイルの数だけ続く。
  2. データ本体の先頭16バイトはヘッダ部。
  3. 最初の8バイトは0x00で終わる文字列。識別用文字列で「PACK」と書かれている。
  4. 次の4バイトはリトルエンディアンの数値。データ本体の解凍後の大きさを示す。ファイル情報と同じ値のはず。
  5. 次の4バイトはリトルエンディアンの数値。データ本体の大きさを示す。これも、ファイル情報と同じ値のはず。
データ本体(実際のデータ)
  1. ヘッダ部の後からが実際のデータとなる。
  2. 1バイト取り出して、上位ビットから順番に1なら続く1バイトをそのまま出力、0なら続く2バイトをリトルエンディアンの数値として上位12ビット+1が「既に出力したデータ」の何バイト前から、下位4ビット+2で示した数だけ繰り返し出力することを示す。この時、繰り返し出力したデータも「既に出力したデータ」に含まれる。
  3. 上記のデータ展開をデータ本体の解凍後の大きさになるまで繰り返せばデータを解凍できる。