レイアウト XML ファイルの作成
以下に示すように、XML ファイル・フォーマットは、layout.dtd 文書タイプ定義 (DTD) ファイルの中に定義されます。
<?xml version="1.0"?>
<!ELEMENT LAYOUT (FIELD)+>
<!ATTLIST LAYOUT Header CDATA #REQUIRED length CDATA #REQUIRED>
<!ELEMENT GROUP EMPTY>
<!ATTLIST GROUP Name CDATA #REQUIRED>
<!ELEMENT FIELD (FIELD)*>
<!ATTLIST FIELD
Header CDATA #REQUIRED
Type (16_BIT_INT|16_BIT_UINT|16_BIT_HINT|32_BIT_INT|32_BIT_UINT|32_BIT_HINT|32_BIT_FLOAT|64_BIT_INT|64_BIT_FLOAT|CHARACTER|HEX|ASCII|EBCDIC|STRUCTURE|PADDING|BIT|BITMASK|MAP) #REQUIRED
length CDATA #REQUIRED
layout CDATA #IMPLIED
filename CDATA #IMPLIED
Groups CDATA #IMPLIED>
これは、XML レイアウト・ファイルが最初にヘッダー (タイトル) およびレイアウトの全長を指定し、 それに続いて、サブエレメント (FIELD) のリストを指定することを意味します。 サブエレメントは、ヘッダー (名前)、長さ、および、そのサブエレメントのデフォルト表記を決めるのに使用される基本タイプによって記述されています。
以下のような特殊なサブエレメント・タイプもあります。
以下の例は、 次のような C 言語構造体のレイアウトを定義します。
typedef struct {
unsigned short ushort_val;
short short_val;
unsigned long ulong_val;
long long_val;
char string_val[12];
char char_val;
} _test;
_test 構造体のツリー・ビューを記述していて、このフォーマットに準拠している XML ファイルは次のとおりです。
<?xml version="1.0"?>
<LAYOUT Header="A Layout" description="Tree view" length="25">
<FIELD Header="ushort_val" Type="16_BIT_UINT" length="2"></FIELD>
<FIELD Header="short_val" Type="16_BIT_INT" length="2"></FIELD>
<FIELD Header="ulong_val" Type="32_BIT_UINT" length="4"></FIELD>
<FIELD Header="long_val" Type="32_BIT_INT" length="4"></FIELD>
<FIELD Header="string_val" Type="ASCII" length="12"></FIELD>
<FIELD Header="char_val" Type="ASCII" length="1"></FIELD>
</LAYOUT>
offset 属性と offset_mode 属性を使用すると、マップの開始を基準とする (offset_mode=absolute) か、現行アドレスを基準として (offset_mode=relative) フィールドの正確なロケーションを指定できます。 次の例の b という要素では、offset に 10 が指定され、offset_mode は relative として定義されています。これらの属性がない場合は、この要素のオフセットは 80 になります。ただし、オフセットは、現在位置を基準とする 10 として定義されているため、オフセットは 90 です。要素 a の長さには接頭部 0x が付いているため、長さは 16 進数で定義されることに注意してください。一般に、length 属性および offset 属性は接頭部 0x の付いた 16 進数で指定できます。 要素 c のオフセットは 4 で、モードは absolute です。これは、この要素のオフセットが、レイアウトの開始から 4 バイト離れていることを意味します。フィールド c によってマップされる 10 バイトは、フィールド a によってもカバーされます。
<Header="offset_Test" length="190">
<FIELD Header="a" Type="HEX" length="0x64"></FIELD>
<FIELD Header="b" description="offset = 90" Type="HEX" length="80" offset="10" offset_mode="relative"></FIELD>
<FIELD Header="c" Type="HEX" length="10" offset="4" offset_mode="absolute"></FIELD>
</LAYOUT>
埋め込みフィールドの定義
バイト位置合わせ構造を処理したり、メモリー・マップでの定義が不要なマップ内のデータ領域をスキップするために、埋め込みフィールドを使用できます。 例えば、上で定義された _test 構造の場合、long_val フィールドを無視し、string_val タイプをレイアウトに表示するマップを作成できます。 XML ファイルは次のようになります。
<?xml version="1.0"?>
<LAYOUT Header="A Layout" description="Tree view" length="0x19">
<FIELD Header="ushort_val" Type="16_BIT_UINT" length="2"></FIELD>
<FIELD Header="short_val" Type="16_BIT_INT" length="2"></FIELD>
<FIELD Header="ulong_val" Type="32_BIT_UINT" length="4"></FIELD>
<FIELD Header="" Type="PADDING" length="4"></FIELD>
<FIELD Header="string_val" Type="ASCII" length="12"></FIELD>
<FIELD Header="char_val" Type="ASCII" length="1"></FIELD>
</LAYOUT>
string_val の offset に 4 を指定し、offset_mode に relative を指定することにより、offset 属性をここで使用して long_val フィールドをスキップすることもできます。
<FIELD Header="string_val" Type="ASCII" length="12" offset="4" offset_mode="relative"></FIELD>
これは、string_val フィールドのアドレスが実際には ulong_val フィールドの最終バイトを基準にして 4 バイトであり、そのため string_val フィールドで使用されるバイトをスキップすることを意味します。
構造体の定義
以下の XML の一例は、ネストされた構造体をマップするための STRUCTURE フィールドの使用法を示しています。 構造体トップ・エレメントは、関連付けられた値をもちません。 それは、そのサブエレメントを示すために展開できます。 STRUCTURE フィールドの長さは XML レイアウトの合計サイズに加えられますが、インクルードされたフィールド・サイズについては、表示のためだけを意図しています。 例えば、以下の構造体は合計レイアウト・サイズの中の 344 バイトのみを意味します。
<FIELD Header="MACHINE CHECK LOG OUT AREA" Type="STRUCTURE" length="344">
<FIELD Header="reserved" Type="HEX" length="16"></FIELD>
<FIELD Header="FLCSID" Type="HEX" length="4"></FIELD>
<FIELD Header="FLCIOFP" Type="HEX" length="4"></FIELD>
<FIELD Header="reserved" Type="HEX" length="20"></FIELD>
<FIELD Header="FLCESAR" Type="HEX" length="4"></FIELD>
<FIELD Header="FLCCTSA" Type="HEX" length="8"></FIELD>
<FIELD Header="FLCCCSA" Type="HEX" length="8"></FIELD>
<FIELD Header="FLCMCIC" Type="HEX" length="8"></FIELD>
<FIELD Header="reserved" Type="HEX" length="8"></FIELD>
<FIELD Header="FLCFSA" Type="HEX" length="4"></FIELD>
<FIELD Header="reserved" Type="HEX" length="4"></FIELD>
<FIELD Header="FLCFLA" Type="HEX" length="16"></FIELD>
<FIELD Header="FLCRV110" Type="HEX" length="16"></FIELD>
<FIELD Header="FLCARSAV" Type="STRUCTURE" length="64">
<FIELD Header="AR0" Type="HEX" length="4"></FIELD>
<FIELD Header="AR1" Type="HEX" length="4"></FIELD>
<FIELD Header="AR2" Type="HEX" length="4"></FIELD>
<FIELD Header="AR3" Type="HEX" length="4"></FIELD>
<FIELD Header="AR4" Type="HEX" length="4"></FIELD>
<FIELD Header="AR5" Type="HEX" length="4"></FIELD>
<FIELD Header="AR6" Type="HEX" length="4"></FIELD>
<FIELD Header="AR7" Type="HEX" length="4"></FIELD>
<FIELD Header="AR8" Type="HEX" length="4"></FIELD>
<FIELD Header="AR9" Type="HEX" length="4"></FIELD>
<FIELD Header="AR10" Type="HEX" length="4"></FIELD>
<FIELD Header="AR11" Type="HEX" length="4"></FIELD>
<FIELD Header="AR12" Type="HEX" length="4"></FIELD>
<FIELD Header="AR13" Type="HEX" length="4"></FIELD>
<FIELD Header="AR14" Type="HEX" length="4"></FIELD>
<FIELD Header="AR15" Type="HEX" length="4"></FIELD>
</FIELD>
<FIELD Header="FLCFPSAV" Type="HEX" length="32"></FIELD>
<FIELD Header="" Type="PADDING" length="64"></FIELD>
<FIELD Header="" Type="PADDING" length="64"></FIELD>
</FIELD>
構造体は、レイアウトの内部にも外部にも 定義できます。外部構造体は、 構造体フィールドに filename="<file name>" を指定することによって、 ネストされたレイアウトのように作成できます。ここで、<file name> が指すファイルは、 構造体の実際の定義を含みます。
例えば、MACHINE CHECK LOG OUT AREA 構造体をマッピング・レイアウトに外部的に指定するには、 <FIELD Header="MACHINE CHECK LOG OUT AREA" Type="STRUCTURE" length="344" filename="machine.xml"></FIELD> のように指定します。
ビット・マスク・フィールドの定義
以下の XML の一例は、BITMASK フィールドを記述しているサンプルです。 BITMASK の長さはバイト数で指定されます。 それには、長さがビット数で指定される BIT フィールドのセットが含まれます。 BIT フィールドに対して表示されるオフセットは、BITMASK フィールド内のビット・オフセットです。 ビット・マスク・フィールドの長さは XML レイアウトの合計サイズに加えられるが、個別の BIT フィールド・サイズについては、表示のためだけを意図しています。
<FIELD Header="BITMASK" Type="BITMASK" length="1">
<FIELD Header="BIT 1" Type="BIT" length="1"></FIELD>
<FIELD Header="BIT 2" Type="BIT" length="1"></FIELD>
<FIELD Header="BIT 3" Type="BIT" length="1"></FIELD>
<FIELD Header="BIT 4" Type="BIT" length="1"></FIELD>
<FIELD Header="BIT 5" Type="BIT" length="1"></FIELD>
<FIELD Header="BIT 6" Type="BIT" length="1"></FIELD>
<FIELD Header="BIT 7" Type="BIT" length="1"></FIELD>
<FIELD Header="BIT 8" Type="BIT" length="1"></FIELD>
</FIELD>
共用体の定義
次の例では、以下の C 言語共用体のレイアウトを定義します。
union my_union {
int my_intVal;
double my_doubleVal;
};
以下のサンプル XML では、共用体の記述方法を説明します。XML では、共用体の長さは最大フィールドのサイズであることに注意してください。
<LAYOUT Header="UNIONS" length="8">
<FIELD Header="my_union" Type="UNION" length="8">
<FIELD Header="my_intVal" Type="HEX" length="4" description="value within the union"></FIELD>
<FIELD Header="my_doubleVal" Type="HEX" length="8"></FIELD>
</FIELD>
</LAYOUT>
ネストされたレイアウトの定義
MAP フィールド・タイプとオプションのレイアウト・フィールドを一緒に使用すれば、 以下の DSA レイアウト例のように、ネストされたレイアウトを記述できます。
<?xml version="1.0"?>
<!DOCTYPE LAYOUT SYSTEM "Layout.dtd">
<LAYOUT Header="DSA" length="72">
<FIELD Header="FLAGS" Type="HEX" length="2"></FIELD>
<FIELD Header="junk" Type="HEX" length="2"></FIELD>
<FIELD Header="Back Chain" Type="MAP" length="4" layout="dsa.xml"></FIELD>
<FIELD Header="Forward Chain" Type="MAP" length="4" layout="dsa.xml"></FIELD>
<FIELD Header="R14" Type="HEX" length="4"></FIELD>
<FIELD Header="R15" Type="HEX" length="4"></FIELD>
<FIELD Header="R0" Type="HEX" length="4"></FIELD>
<FIELD Header="R1" Type="HEX" length="4"></FIELD>
<FIELD Header="R2" Type="HEX" length="4"></FIELD>
<FIELD Header="R3" Type="HEX" length="4"></FIELD>
<FIELD Header="R4" Type="HEX" length="4"></FIELD>
<FIELD Header="R5" Type="HEX" length="4"></FIELD>
<FIELD Header="R6" Type="HEX" length="4"></FIELD>
<FIELD Header="R7" Type="HEX" length="4"></FIELD>
<FIELD Header="R8" Type="HEX" length="4"></FIELD>
<FIELD Header="R9" Type="HEX" length="4"></FIELD>
<FIELD Header="R10" Type="HEX" length="4"></FIELD>
<FIELD Header="R11" Type="HEX" length="4"></FIELD>
<FIELD Header="R12" Type="HEX" length="4"></FIELD>
</LAYOUT>
この整形式 XML レイアウトは、DSA.XML という名前のファイルに保管されます。 お気付きのように、フィールド 3 および 4 には異なる DSA 構造体を指すポインターが入っているので、2 つのネストされたレイアウト定義を追加することになります。
グループの定義
グループ構文を使用すると、マッピング・レイアウトのフィールドを グループに編成することができるため、操作がしやすくなります。グループを定義するには、 レイアウト・ファイルの先頭に <GROUP Name="groupName"></GROUP> を 置く必要があります。次に、 <FIELD Header="RESERVED" Type="HEX" length="12" Groups="groupName"></FIELD> と指定して、事前定義されたグループにフィールドが属していることを示します。
1 つのフィールドが複数のグループに 属すことができます。複数のグループを定義するには、 Groups 属性で、コンマで区切ったリストに指定してください。Groups 属性内の各グループは、<GROUP> タグを使用してレイアウトで定義されている必要があります。
ALL グループ名は 特別なグループです。これをフィールドに指定すると、すべてのグループに属する ことになり、このフィールドはすべてのグループから見えるようになります。次の コードのサンプルに、グループが入っています。
<?xml version="1.0"?>
<!DOCTYPE LAYOUT SYSTEM "Layout.dtd">
<LAYOUT Header="GROUP_EXAMPLE" length="32">
<GROUP Name="GroupA"></GROUP>
<GROUP Name="GroupB"></GROUP>
<FIELD Header="FIELD_A" Type="HEX" length="8" Groups="GroupA"></FIELD>
<FIELD Header="FIELD_B" Type="HEX" length="8" Groups="GroupB"></FIELD>
<FIELD Header="FIELD_AB" Type="HEX" length="8" Groups="GroupA,GroupB"></FIELD>
<FIELD Header="FIELD_ALL" Type="HEX" length="8" Groups="ALL"></FIELD>
</LAYOUT>
ORG グループの定義
ORG_GROUP タグを使用して、メモリーの以前に定義した部分のレイアウトを定義できます。これは、アセンブラーでの ORG 命令の動作と似ています。FIELD 属性を使用して、新規レイアウトの開始位置を指定できます。単純なケースでは、FIELD 属性の値に、マップで以前に定義したフィールドの名前を指定できます。*NONE または * を値として使用することもできます。これは、メモリー内の現在位置のレイアウトを意味します。Header 属性は、単に新規レイアウトの名前です。
<LAYOUT Header="SW00SR" length="271">
<ORG_GROUP FIELD="*NONE" Header="ORG_GROUP1">
<FIELD Header="A" length="4" Type="HEX"></FIELD>
<FIELD Header="B" length="4" Type="HEX"></FIELD>
<FIELD Header="c" length="4" Type="HEX"></FIELD>
</ORG_GROUP>
<ORG_GROUP FIELD="A" Header="my_custom_header">
<FIELD Header="F" length="4" Type="HEX" description="address of F == address of A"></FIELD>
<FIELD Header="G" length="4" Type="HEX"></FIELD>
<FIELD Header="H" length="4" Type="HEX"></FIELD>
<ORG_GROUP FIELD="*+4" Header="another_org">
<FIELD Header="J" length="2" Type="HEX" description="address of J = current location + 4"></FIELD>
</ORG_GROUP>
</ORG_GROUP>
<FIELD Header="R" length="4" Type="HEX"></FIELD>
<FIELD Header="Z" length="4" Type="HEX"></FIELD>
</LAYOUT>
説明: