In PRODAMP stehen zwei vordefinierte Variablen OPC_TABLE und SVC_TABLE zur Verfügung, mit denen ein Zugriff auf DAMP-interne Tabellen geregelt werden kann. Zunächst können diese Variablen wie normale numerische Variablen eingesetzt werden, d.h. es können ihnen Werte zugewiesen werden und sie können in arithmetischen Ausdrücken verwendet werden. Es ist jedoch zu beachten, dass die Länge dieser Variablen kleiner als die von normalen numerischen Variablen ist und damit nicht jeder numerische Wert zugewiesen werden kann.
Ein zugewiesener Wert dient aber gleichzeitig auch als Index zur Lokalisierung eines Eintrages innerhalb einer DAMP-Tabelle, mit dem sich dann Symbole, die diesen Eintrag beschreiben, adressieren lassen.
OPC_TABLE
Diese Variable ist 2 Bytes lang und dient als Index für einen Eintrag in der DAMP-Tabelle, die den Befehlscode beschreibt und intern zur Disassemblierung verwendet wird. Ist der Inhalt von OPC_TABLE kleiner als 256 (nur 1 Byte belegt), so wird dieser als Operationscode eines Befehls aufgefasst. Ist der Inhalt größer als 255 (2 Bytes belegt), werden hierunter die ersten beiden Bytes eines Befehls verstanden, von denen das zweite ein Subcode ist.
Ein Eintrag in der Befehlstabelle wird durch folgende DSECT beschrieben:
|
Das folgende Beispiel soll verdeutlichen, wie durch die Variable OPC_TABLE Einträge in der entsprechenden DAMP-Tabelle angesprochen werden können. Voraussetzung ist, dass eine Disassemblierungstabelle zugewiesen ist, wie es beim Öffnen eines Diagnoseobjekts geschieht. Ist dies nicht der Fall, sollte eine solche Tabelle mit der Anweisung MODIFY-OBJECT-ASSUMPTIONS bekannt gegeben werden.
Beispiel zu OPC_TABLE
OPC_TABLE := X'B223'; MNEMO := ' '*7; PSEUDO := 'none'; INSTSVAL := P'40'; INSTSVMN := P'20'; INSTTYPE := OPC_TABLE.INSTTYPE; IF CURRENT.ERROR <> 0 THEN MESSAGE ( 'Keine Befehlstabelle verfuegbar.' ); RETURN; END IF; IF INSTTYPE = 0 THEN MNEMO := 'invalid'; ELSIF INSTTYPE = 24 THEN MNEMO := 'unknown'; ELSE MNEMO := OPC_TABLE.INSTOMN; END IF; IF INSTSVAL + INSTSVMN IN OPC_TABLE.INSTFLAG THEN IF OPC_TABLE > 255 THEN PSEUDO := OPC_TABLE.INSTFMN; ELSE PSEUDO := ' '; END IF; END IF; MESSAGE ( 'Mnemonic: '+MNEMO+' Pseudo: '+Pseudo );
SVC_TABLE
Diese Variable ist 1 Byte lang und dient als Index für einen Eintrag in der DAMP-internen SVC-Tabelle, die für jeden SVC eine 8 Bytes lange Mnemonic enthält. Für diese Einträge ist in der Symboldatei keine DSECT verfügbar. Die Einträge müssen mittels einer ARRANGE-Anweisung beschrieben werden, wie folgendes Beispiel verdeutlicht:
Beispiel zu SVC_TABLE
SVC_TABLE := X'5C'; ARRANGE .MNEMO : TYPE = STRING, LENGTH = 8, OFFSET = 0; END ARRANGE; MNEMO := ' '*8; MNEMO := SVC_TABLE.MNEMO; IF CURRENT.ERROR <> 0 THEN MESSAGE ( 'Keine SVC-Tabelle verfuegbar.' ); ELSE MESSAGE ( 'SVC ' + HEX_STRING(SVC_TABLE,2)+' = '+MNEMO ); END IF;