AVG32の命令解析(2)

こないだは選択肢と条件分岐の目星が付いた。よく見ると選択肢と条件分岐と思われる箇所に同じ2バイトの値がある。なるほど、ふつーに考えれば選択した結果は何らかの変数に入るんだから、次に変数の値によって分岐してるんじゃないのか?これは。
すると、他のSEEN.TXT見ながら薄々感づいてたけど、選択肢は22「"」と23「#」で囲まれてて、条件分岐は28「(」と29「)」で囲まれてないか?前者はともかく、後者はそのまんまカッコやん。すると、SEEN002.TXTで見た「)&(」って箇所はカッコ内の式同士のANDじゃなかろーか?(汗)うわ、アスキーコードそのまんまかよ。(まあ、仮定は置いといて)
何にしてもカッコ内が式だと判り、式に含まれる変数も判れば、前と後ろの1バイトずつは前が演算子で、後ろが比較する値かな?
と、ここまで判ったところで変数を示す番号(と思われる)について調べるため、GAMEEXE.INIに書かれている名前が入った文字変数がどんな番号で示されるか名前入力のSEENファイルを解析してみる。
名前入力はテキストの前がFF、末尾が00と選択肢と同じで合間に2バイトの値が挟まってる。これがたぶん変数だろう。3つの名前を入力する意味を示すであろう03って値がこれらのデータの手前に、すると後は命令の前後関係から61 24で始まるのが名前入力命令だと判る。
ここではGAMEEXE.INIでAAとして定義された変数が2B 01、ABとして定義された変数が2C 01、BBとして定義された変数が26 03だと判る・・・。関連性を見出すのが難しい。ふと、前にKOEファイルを示す数値が先頭4ビットを飛ばしてリトルエンディアンで組み立ててたのを思い出して、AAを示す2B 01を01B、ABを示す2C 01を01C、BBを示す26 03を036と見立ててみる。最初の01B、01Cからアスキーコードが彷彿されたのでちょっと並べてみた。00〜3Fぐらいまで書いて、空いた部分にはA〜Zの繰り返しとなるように適当にあてはめてみた。

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
    A  B  C  D  E  F  G  H  I  J  K  L  M  N  O
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
 P  Q  R  S  T  U  V  W  X  Y  Z AA AB AC AD AE
20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
AF AG AH AI AJ AK AL AM AN AO AP AQ AR AS AT AU
30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
AV AW AX AY AZ BA BB BC BD BE BF BG BH BI BJ BK

ドンピシャ!文字変数AA、AB、BBの位置がピッタリ合ったので、これで間違いなさげ。すると飛ばした先頭4ビットに規則性が見えてきた。もしかして、これってバイト数を表してる?KOEファイルの指定数値は4バイトだから先頭4ビットが4、今回の文字変数だと2バイトだから先頭4ビットが2だった??
これまで解析した命令を片っ端から、値になりそうな箇所を同様な方法で見てみるとバッチリ。waitのパラメータにあった20 7Dは最初の2で2バイトであることを表し、残りの0と7Dを合わせた7D0が値!これを10進数に直すと2000!!をを、何か良いカンジ。他の命令でも丁度いい数値が出てきたから間違いないと思う。
つまり、AVG32では文字列はシフトJISコードで末尾は00で終わり、数値は上位4ビットがバイト数を示す長さで、リトルエンディアン、ただし1バイト目のみ下位4ビットしか値として使われない。