Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

Vordefinierte Variablen

&pagelevel(5)&pagelevel

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:

INST     DSECT  
INSTTYPE DS    X           INSTRUCTION TYPE
INSTNO   EQU   0              NO VALID INSTRUCTION
INSTRR   EQU   4              RR INSTRUCTION
INSTRX   EQU   8              RX INSTRUCTION
INSTRS   EQU   12             RS INSTRUCTION
INSTSI   EQU   16             SI INSTRUCTION
INSTSS   EQU   20             SS INSTRUCTION
INSTUN   EQU   24             UNKNOWN INSTRUCTION TYPE
INSTFLAG DS    X           FLAG
INSTPRIV EQU   X'80'          PRIVILEGED OPERATION
INSTSVAL EQU   X'40'          SUBFUNCTION VALID/AVAILABLE
INSTSVMN EQU   X'20'          SUBFUNCTION MNEMONIC VALID
INSTPSMN EQU   X'10'          PSEUDO MNEMONIC AVAILABLE
INSTFPI  EQU   X'08'          FLOATING POINT INSTRUCTION
INSTSPEC EQU   X'04'          SPECIAL OPERATION
INSTADW  EQU   X'03'          ACCESS DOUBLE WORD
INSTAWD  EQU   X'02'          ACCESS WORD
INSTAHW  EQU   X'01'          ACCESS HALFWORD
INSTXCPT DS    X           EXCEPTIONS
INSTOP1  EQU   X'80'          OPERAND 1 EXCEPTION
INSTOP1M EQU   X'40'          OPERAND 1 = MASK/R0=0 IF RR,RX
INSTOP1E EQU   X'20'          OPERAND 1 = EVEN/EXTENDED
INSTOP2  EQU   X'10'          OPERAND 2 EXCEPTION
INSTOP2M EQU   X'08'          OPERAND 2 = MASK/R0=0 IF RR
INSTOP2E EQU   X'04'          OPERAND 2 = EVEN/EXTENDED
INSTOP3  EQU   X'02'          OPERAND 3 EXCEPTION
INSTOP3M EQU   X'01'          OPERAND 3 = MASK
INSTOPC  DS    X           OPERATION CODE
INSTSVC  EQU   X'0A'          OPERATION CODE = SVC
INSTRS2  EQU   X'20'          RS INSTRUCTION WITH 2 SIZES 

INSTOMN  DS    CL5         INSTRUCTION MNEMONIC 
INSTO2M  DS    X           MASK FOR OPERAND 2
INSTFCT  DS    0XL6        SUBFUNCTION
INSTFCD  DS    X           FUNCTION DISPLACEMENT
INSTMSK  DS    X           FUNCTION MASK
INSTFCU  EQU   X'F0'          FUNCTION CODE IN UPPER HALFBYTE
INSTFCL  EQU   X'0F'          FUNCTION CODE IN LOWER HALFBYTE
INSTFCF  EQU   X'FF'          FUNCTION CODE IN FULL BYTE
INSTPTR  DS    A           FUNCTION POINTER
         ORG   INSTFCT
INSTFPT  DS    X           FUNCTION PSEUDO TYPE (RR ONLY)
INSTFTM  EQU   X'FC'          FUNCTION MASK FOR PSEUDO TYPE
INSTFTD  EQU   X'03'          FUNCTION MASK FOR DISPLACEMENT
INSTFMN  DS    CL4         FUNCTION MNEMONIC
INSTILEN EQU   *-INST      ITEM LENGTH

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;