Layout-XML-Datei erstellen
Das Format der XML-Datei wird in der Datei layout.dtd (DTD = document type definition) wie folgt definiert:
<?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>
Dies bedeutet, dass in der XML-Layoutdatei zunächst ein Header (Titel) und die Gesamtlänge für das Layout angegeben werden, gefolgt von einer Liste von Unterelementen (FIELD), die durch einen Header (Namen), eine Längenangabe und einen primitiven Datentyp zur Festlegung der Standarddarstellung des Unterelements beschrieben werden.
Außerdem gibt es besondere Typen von Unterelementen:
Das folgende Beispiel definiert das Layout für die folgende Struktur der Programmiersprache 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;
Die XML-Datei, in der eine Baumstruktursicht der Struktur _test beschrieben wird und die diesem Format entspricht, sieht wie folgt aus:
<?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>
Mit den Attributen offset und offset_mode können Sie die genaue Position eines Feldes entweder im Verhältnis zum Anfang der Zuordnung (offset_mode=absolute) oder im Verhältnis zur aktuellen Adresse (offset_mode=relative) angeben. Im folgenden Beispiel werden für das Element mit dem Namen b für offset der Wert 10 und für offset_mode der Wert relative definiert. Ohne diese Attribute hätte dieses Element einen Offset von 80. Da aber ein Offset von 10 im Verhältnis zur aktuellen Position definiert wird, ist der Offset 90. Beachten Sie, dass die Länge von Element a hexadezimal definiert wird, da die Längenangabe mit dem Präfix 0x versehen ist. Im Allgemeinen können die Attribute length und offset hexadezimal (HEX) angegeben werden, indem ihnen 0x vorangestellt wird. Element c hat den Offset 4 und den Modus absolute. Dies bedeutet, dass sich der Offset dieses Elements 4 Byte vom Anfang des Layouts entfernt befindet. Die 10 Byte, die von Feld c zugeordnet werden, werden auch von Feld a abgedeckt:
<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>
Auffüllfelder definieren (PADDING)
Durch Auffüllen von Feldern können Strukturen mit Byteanordnung gehandhabt oder Datenbereiche in der Zuordnung, die in der Speicherzuordnung nicht definiert werden müssen, übersprungen werden. Beispielsweise könnten Sie für die oben definierte Struktur _test eine Zuordnung erstellen, bei der das Feld long_val ignoriert wird, aber der Typ string_val im Layout angezeigt wird. Die XML-Datei würde wie folgt aussehen:
<?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>
Sie könnten an dieser Stelle auch das Attribut offset zum Überspringen des Feldes long_val verwenden, indem Sie für string_val bei offset 4 und bei offset_mode den Wert relative angeben:
<FIELD Header="string_val" Type="ASCII" length="12" offset="4" offset_mode="relative"></FIELD>
Dies bedeutet, dass die Adresse des Feldes string_val im Verhältnis zum letzten Byte des Feldes ulong_val um vier Byte verschoben ist, sodass die vom Feld long_val verwendeten Byte übersprungen werden.
Strukturen definieren
Der folgende XML-Code zeigt die Verwendung von STRUCTURE-Feldern zur Zuordnung verschachtelter Strukturen. Das oberste Element einer Struktur hat keinen zugehörigen Wert und kann erweitert werden, um seine Unterelemente anzuzeigen. Während die Länge des STRUCTURE-Feldes zur Gesamtgröße des XML-Layouts zählt, sind die Größen der darin enthaltenen Felder nur für das Anzeigen bestimmt. In der folgenden Struktur werden zum Beispiel nur 344 Byte der Gesamtgröße des Layouts belegt.
<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>
Strukturen können für ein Layout intern oder extern definiert werden. Eine externe Struktur kann wie ein verschachteltes Layout erstellt werden, indem filename="<dateiname>" im Strukturfeld angegeben wird, wobei die als <dateiname> angegebene Datei die tatsächliche Definition der Struktur enthält.
Die Struktur MACHINE CHECK LOG OUT AREA kann zum Beispiel in einem Zuordnungslayout extern wie folgt angegeben werden: <FIELD Header="MACHINE CHECK LOG OUT AREA" Type="STRUCTURE" length="344" filename="machine.xml"></FIELD>.
Bitmaskenfelder definieren
Der folgende XML-Code ist ein Beispiel für die Beschreibung von BITMASK-Feldern. Die Länge der Bitmaske wird in Byte angegeben und sie enthält eine Gruppe von BIT-Feldern, deren Länge in Bit angegeben wird. Der für die BIT-Felder angegebene Offset ist eine relative Bitadresse innerhalb des BITMASK-Feldes. Während die Länge des Bitmaskenfeldes zur Gesamtgröße des XML-Layouts zählt, sind die Größen der einzelnen BIT-Felder nur für das Anzeigen bestimmt.
<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>
Unionen definieren
Im folgenden Beispiel wird das Layout der folgenden Union der Programmiersprache C definiert:
union my_union {
int my_intVal;
double my_doubleVal;
};
Im folgenden XML-Beispielcode wird die Union beschrieben. Beachten Sie, dass in der XML-Datei die Länge der Union der Größe des längsten ihrer Felder entspricht:
<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>
Verschachtelte Layouts definieren
Mit dem Feldtyp MAP können Sie, zusammen mit dem optionalen Feld 'layout', verschachtelte Layouts beschreiben, wie im folgenden Beispiellayout 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>
Dieses korrekt formatierte XML-Layout ist in einer Datei mit dem Namen DSA.XML gespeichert. Da Sie wissen, dass die Felder 3 und 4 Zeiger auf unterschiedliche Strukturen DSA enthalten, fügen Sie zwei verschachtelte Layoutdefinitionen hinzu.
Gruppen definieren
Mit der Gruppensyntax können Sie Felder in Zuordnungslayouts in Gruppen zusammenfassen, damit leichter mit ihnen gearbeitet werden kann. Geben Sie zum Definieren einer Gruppe <GROUP Name="gruppenname"></GROUP> am Anfang der Layoutdatei an. Die einzelnen Felder der vordefinierten Gruppe geben Sie dann wie folgt an: <FIELD Header="RESERVIERT" Type="HEX" length="12" Groups="gruppenname"></FIELD>.
Ein Feld kann zu mehreren Gruppen gehören. Wenn Sie mehrere Gruppen definieren möchten, geben Sie sie, durch Kommas getrennt, als Liste im Attribut Groups an. Jede Gruppe im Attribut Groups muss im Layout mit dem Tag <GROUP> definiert worden sein.
Der Gruppenname ALL hat eine spezielle Bedeutung. Wenn Sie ihn für ein Feld angeben, gehört das Feld zu allen Gruppen und es wird in allen Gruppen sichtbar sein. Der folgende Beispielcode enthält Gruppen:
<?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-Gruppen definieren
Sie können den Tag ORG_GROUP zum Definieren des Layouts eines zuvor definierten Speicherbereichs verwenden. Dies entspricht in etwa dem Verhalten der Instruktion ORG in Assembler. Sie können die Startadresse des neuen Layouts mithilfe des Attributs FIELD angeben. Im einfachen Fall kann es sich beim Wert des Attributs FIELD um den Namen eines zuvor definierten Feldes in der Zuordnung handeln. Sie können auch *NONE oder * als Werte verwenden. Dann bezieht sich das Layout auf die aktuelle Position im Speicher. Das Attribut Header ist lediglich ein Name für das neue Layout.
<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>
Dabei gilt Folgendes: