Übersicht
Die in PRODAMP enthaltenen Standardprozeduren sind nur innerhalb von Prozeduren aufrufbar. Die Syntax der Prozeduraufrufe entspricht der Pascal-Syntax.
In PRODAMP gibt es folgende Standardprozeduren:
Prozedurname | Funktion |
---|---|
COMMAND | Eingeben von DAMP-Anweisungen aus einer Prozedur heraus |
DMP_#REFRESH | Erneuern der Datenbereiche |
DUMP_MEMORY | Speicherbereich auf SYSLST ausgeben |
ENTER_MODULE | Schnittstelle zwischen PRODAMP-Prozeduren und Assembler-Modulen |
EXTRACT | Manipulieren von Strings |
INSERT | Manipulieren von Strings |
LIST | String auf SYSLST ausgeben |
LIST_CONTROL_BLOCK | Kontrollblock auf SYSLST ausgeben |
MESSAGE | Ausgeben einer Meldung |
NEW_TASK | Einstellen einer anderen 'aktuellen' Task |
NEXT_WINDOW | Schaltet in einer PRODAMP-Prozedur auf das nächste sichtbare Fenster des DAMP-Bildschirms |
READ | Lesen aus einem EDT-Bereich |
READ_WINDOW | Unterbricht eine PRODAMP-Prozedur und ermöglicht Eingaben bzw. Markierungen in einem Diagnosefenster |
REFERENCE | Definition eines Symbols als Element einer Substruktur |
SET_HEADER | Überschrift für die Listenausgabe erzeugen |
UNSIGNED_ON | Vorzeichenlose Arithmetik einschalten |
UNSIGNED_OFF | Vorzeichenlose Arithmetik ausschalten |
WRITE | Schreiben in einen EDT-Bereich |
Tabelle 13: Übersicht über PRODAMP-Standardprozeduren
Die aufgeführten Namen sollten nicht für eigene Prozeduren verwendet werden, da dies zu Fehlinterpretationen des Programms führen kann.
COMMAND
DAMP-Anweisungen eingeben
Mit der Standardprozedur COMMAND können Sie aus einer PRODAMP-Prozedur heraus DAMP-Anweisungen eingeben, beispielsweise um eine private Symboldatei zuzuweisen.
Prozeduraufruf
Operation | Operanden |
COMMAND | (text) |
Operandenbeschreibung
text | gibt den Text der DAMP-Anweisung an. „text“ muss ein String-Ausdruck sein und die Anweisung in der Form enthalten, wie sie im DAMP-Batch- bzw. Prozedurbetrieb eingeben würde. Nicht akzeptiert werden als „text“:
|
DMP_#REFRESH
Speicherbereich erneuern
Mit der Standardprozedur DMP_#REFRESH können Sie PRODAMP-interne Datenbereiche erneuern. Dies kann bei der Diagnose des aktiven Systems hin und wieder erforderlich sein.
Prozeduraufruf
Operation | Operanden |
DMP_#REFRESH |
DUMP_MEMORY
Speicherbereich ausgeben
Mit der Standardprozedur DUMP_MEMORY lässt sich ein Speicherbereich in einem der DAMP-üblichen Formate auf SYSLST ausgeben. Alle Parameter müssen numerische Ausdrücke sein.
Prozeduraufruf
Operation | Operanden |
DUMP_MEMORY | (address,relad,length) |
Operandenbeschreibung
address | bezeichnet die Anfangsadresse des Bereichs. Abhängig vom Wert von CURRENT.ATYPE wird virtueller- (Default), realer-, absoluter-, HSA- Speicher oder Bereiche aus Datenräumen ausgegeben. Bei großen realen und absoluten Adressen kann in „address“ nur ein Wert innerhalb eines 4 GB-Segments angegeben werden. Das zugehörige Segment ist in CURRENT.SEGMENT (siehe "Pseudostrukturen") zu spezifizieren. |
relad | gibt die Distanz zur Startadresse an. Setzt man „relad“ auf 0, werden Relativadressen zum Anfang des Bereichs ausgegeben (dieses Format wird von DAMP etwa zur Ausgabe des TCB benutzt). |
length | gibt die Länge des auszugebenden Bereichs an. |
Beispiel
A := .ETCBTFT; DUMP_MEMORY (A, 0, LENGTH ('IDMTFT','DS'))
Die erste TFT wird in der Länge der DSECT „IDMTFT“ auf SYSLST ausgegeben (siehe dazu auch die Standardfunktion LENGTH, "Standardfunktionen").
ENTER_MODULE
Aufruf von Modulen
Die Standardprozedur ENTER_MODULE dient als Schnittstelle zwischen PRODAMP-Prozeduren und Assembler-Modulen. Es können aber auch von anderen Sprachen erzeugte Module angesprungen werden, sofern diese die unten beschriebenen Konventionen beachten.
Prozeduraufruf
Operation | Operanden |
ENTER_MODULE | (modul, par1, par2, ...) |
Operandenbeschreibung
modul | verweist auf das modul, das aufgerufen werden soll. Dieses modul wird als R-Element in der als Objekt-Bibliothek definierten PRODAMP-Bibliothek erwartet. modul muss ein Ausdruck vom String-Typ sein, der den Namen von modul in Großschreibung enthält. Nur die ersten 8 Zeichen werden ausgewertet; enthält modul weniger als 8 Zeichen, so wird mit Leerzeichen auf 8 Zeichen aufgefüllt. |
par1, par2, ... | ist die Liste der Parameter, die dem aufgerufenen modul zum Zugriff verfügbar gemacht werden sollen. |
Beim Aufruf von modul sind die Register wie folgt gesetzt:
R1 | zeigt auf einen von PRODAMP versorgten Parameterbereich |
R13 | zeigt auf einen von PRODAMP angelegten Bereich von 18 Worten (72 Bytes), in dem die Register gesichert werden können |
R14 | enthält die Rücksprungadresse |
R15 | enthält die Ansprungadresse |
Zum Rücksprungzeitpunkt erwartet PRODAMP, dass die Register R1 bis R12 die Werte enthalten, die zum Zeitpunkt des Aufrufs gesetzt waren.
Der Parameterbereich hat folgendes Format:
Byte | 0-1 | Gesamtlänge des Parameterbereichs. |
Byte | 2-3 | Enthält den Wert 0. |
Byte | 4-11 | Name des angesprungenen Moduls. |
Byte | 12‑n | Enthält als Übertragungsbereich die Werte der Parameter par1, par2,... lückenlos aneinander gereiht.
|
Der gesamte Parameterbereich darf die Länge einer 4K-Seite (4096 Bytes) nicht überschreiten, d.h. die Gesamtlänge des Übertragungsbereichs darf nicht größer als 4084 Bytes sein.
Beim Rücksprung wird jede als Parameter übergebene Variable mit dem zugehörigen Wert aus dem Übertragungsbereich aktualisiert. Damit wird durch ENTER_MODULE also auch ein schreibender Zugriff auf PRODAMP-Variablen möglich.
Auch ein Modul, das auf andere Weise bereits geladen wurde, kann mit ENTER_MODULE gestartet werden. So kann über die PRODAMP-Prozedur COMMAND die DAMP-Anweisung LOAD-MODULE eingegeben werden, in der eine Ladebibliothek angegeben werden kann.
Ein angesprungenes Modul wird beim Rücksprung zur PRODAMP-Prozedur nur dann entladen, wenn er nicht mit LOAD-MODULE geladen wurde. Das Laden von Modulen mit der DAMP-Anweisung LOAD-MODULE (auch innerhalb von PRODAMP über die COMMAND-Anweisung möglich) kann die Laufzeit von PRODAMP-Prozeduren daher erheblich reduzieren, wenn ein Modul häufiger aufgerufen wird. Außerdem kann in der Anweisung LOAD-MODULE eine Ladebibliothek angegeben werden.
Beispiele
Beispiel einer PRODAMP-Prozedur, die den ASSEMBLER-Modul „TEST“ aufruft, von dem der String „EINGABE“ in „AUSGABE“ geändert wird:
PRODAMP-Prozedur
STR := 'EINGABE'; ENTER_MODULE ( 'TEST', STR ); MESSAGE ( STR );
ASSEMBLER-Modul TEST
TEST CSECT TEST AMODE ANY USING *,15 STM 14,12,12(13) MVC 12(3,1),='AUS' LM 14,12,12(13) BR 14 END
Das Beispiel zeigt auch, wie Sie Register retten und zurückladen können.
(Da TEST keine Register verändert, ist dies hier eigentlich unnötig.)
Beispiel einer PRODAMP-Prozedur zur Laufzeitreduzierung
COMMAND ('LOAD-MODULE *P-U-O-L(TEST)'); "Der Fehlerfall führt zum Laufzeitfehler (Abbruch)" MESSAGE ('Modul TEST wurde geladen'); "Bei ENTER_MODULE erfolgt nun kein Entladen" N := 0; STR := ' '*4; WHILE (N<100) DO ENTER_MODULE ('TEST',STR); N := N+1; END WHILE;
EXTRACT
Strings manipulieren
Die Standardprozedur EXTRACT überträgt aus einem Quellstring von einer anzugebenden Position an so viele Zeichen in einen Zielstring, wie in den Zielstring hineinpassen. Ist die Länge des Zielstrings größer als die Anzahl der zu übertragenden Zeichen, bleiben die restlichen Zeichen des Zielstrings unverändert.
Prozeduraufruf
Operation | Operanden |
EXTRACT | (ziel,quelle,position) |
Operandenbeschreibung
ziel | muss ein Bezeichner einer bereits initialisierten Variablen vom String-Typ sein. Diese Variable enthält den Zielstring. |
quelle | gibt den Quellstring (in Form eines Ausdrucks vom String-Typ) an. |
position | gibt die Position des ersten zu übertragenden Zeichens im Quellstring an. Das erste Zeichen des Quellstrings hat dabei die Position 0. |
Beispiele
A := 'XXXX' ; EXTRACT ( A, 'Ausgabe fuer TSN 1234 unter TSOS',17 );
Nach Ausführung der Anweisungen enthält A den Text „1234“.
A := 'funktionieren'; EXTRACT ( A, 'Das wird wohl nicht klappen.',20 );
Diese Anweisungsfolge ergibt „klappen.ieren“ als Inhalt von A.
In beiden Beispielen wird angenommen, dass A durch die jeweils angegebene Anweisung initialisiert wurde.
INSERT
Strings manipulieren
INSERT ersetzt die Zeichen eines Zielstrings ab einer anzugebenden Stelle durch die Zeichen eines Quellstrings.
Es werden solange Zeichen ersetzt, bis das letzte Zeichen aus dem Quellstring übertragen oder das letzte Zeichen des Zielstrings ersetzt wurde.
Prozeduraufruf
Operation | Operanden |
INSERT | (quelle,ziel,position) |
Operandenbeschreibung
quelle | gibt den Quellstring an. (Ausdruck vom Typ String) |
ziel | muss ein Bezeichner einer bereits initialisierten Variablen vom String-Typ sein. Diese Variable enthält den Zielstring. |
position | gibt die Position des Zeichens an, von dem ab der Zielstring überschrieben werden soll. |
Beispiele
A := 'Ausgabe fuer TSN XXXX unter der Kennung $$$$$$$$.'; INSERT ('1234',A,17); INSERT ('TSOS ',A,40);
Nach Ausführung der Anweisungen enthält A den Text:
„Ausgabe fuer TSN 1234 unter der Kennung TSOS.“
A := 'Das wird wohl nicht klappen.' INSERT ( 'funktionieren.',A,20 );
Diese Anweisungsfolge ergibt für A den Inhalt:
„Das wird wohl nicht funktion“
In beiden Beispielen wird angenommen, dass A durch die jeweils angegebene Anweisung initialisiert wurde.
LIST
Strings auf SYSLST ausgeben
Mit der Standardprozedur LIST können Sie einen String nach SYSLST ausgeben.
Prozeduraufruf
Operation | Operanden |
LIST | (string[,skiplines]) |
Operandenbeschreibung
string | gibt den auszugebenden String an. |
skiplines | legt fest, wie viele Leerzeilen vor dem String eingefügt werden sollen. |
LIST_CONTROL_BLOCK
Kontrollblock auf SYSLST ausgeben
Die Standardprozedur LIST_CONTROL_BLOCK kann für die Ausgabe der Daten des angegebenen Kontrollblocks der im Moment geöffneten Dialogfensters auf SYSLST in der symbolischen Maske verwendet werden (siehe dazu Beispiel im Abschnitt "Symbolische Ausgabe"). Alle Substrukturen und Arrays werden zum Stand “revealed” gebracht. Alle Parameter außer cbname müssen numerische Ausdrücke sein.
Prozeduraufruf
Operation | Operanden |
LIST_CONTROL_BLOCK | (cbname,address,relad,length) |
Operanden
cbname | Gibt den Namen des anzuzeigenden Kontrollblocks an (Ausdruck vom Typ String). Die Symboldatei, die den gewünschten Kontrollblock enthält, muss, falls es sich nicht um eine Standardsymbolbibliothek handelt, mit der Anweisung ADD-SYMBOLS geladen werden (siehe dazu Anweisung ADD-SYMBOLS ), bevor die Anweisung benutzt werden kann. |
address | Gibt die Startadresse des Bereiches für den Kontrollblock an. Falls eine falsche Adresse und/oder Distanz angegeben wird, wird der Kontrollblock mit falschen Werten angezeigt. |
relad | Gibt die Distanz von der Startadresse an. Falls “relad”auf 0 gesetzt ist, werden die Adressen relativ zum Anfang des Bereiches ausgegeben. Falls ein negativer Wert für “relad” angegeben wird, wird dieser automatisch auf 0 gesetzt. Mögliche Eingabewerte sind die gleichen wie unter "address". |
length | Gibt die Länge des auszugebenden Kontrollblocks an. |
Beispiel
LIST_CONTROL_BLOCK ('FAFG', X'BAD01400', 0, LENGTH ( 'FAFG', 'DS' ));
Nach erfolgreicher Ausführung der Anweisung enthält SYSLST folgende Informationen:
|
MESSAGE
Meldung am Bildschirm ausgeben
Die Standardprozedur MESSAGE ohne den optionalen, numerischen Parameter line bewirkt, dass ein angegebener Text in einer der beiden Meldungszeilen der DAMP-Bildschirmmaske (Zeilen 2 und 3) ausgegeben wird, sobald die PRODAMP-Prozedur verlassen und der Bildschirm aufgefrischt wird.
Werden dem Parameter line die Werte 1 oder 2 zugewiesen, wird der angegebene Text sofort in der Bildschirmmaske ausgegeben.
Parameter line wird nicht angegeben:
Sobald der Puffer für die beiden Meldungszeilen voll ist, werden weitere Meldungen ignoriert. Es empfiehlt sich daher, nach dem Aufruf von MESSAGE eine der Anweisungen INTERRUPT oder RETURN folgen zu lassen. Bei INTERRUPT können Sie nach der Kenntnisnahme des Textes die Prozedur ggf. mit RESUME fortsetzen. Soll es sich um eine Fehlermeldung handeln und die Prozedur abgebrochen werden, empfiehlt sich RETURN.
Parameter line wird angegeben:
Auf diese Weise können in länger laufenden PRODAMP-Prozeduren Zwischenmeldungen ausgegeben werden, die über den aktuellen Bearbeitungsstand der Prozedur Auskunft geben.
Prozeduraufruf
Operation | Operanden |
MESSAGE | (text[,line]) |
Operandenbeschreibung
text line | gibt den auszugebenden Text an. steht für einen numerischen Ausdruck, der 0, 1 oder 2 ergibt. Die Ziffern bezeichnen die Fehlerzeilen, in welche die Meldungen geschrieben werden sollen. |
NEW_TASK
Aktuelle Task einstellen
Mit der Standardprozedur NEW_TASK wird eine neue „aktuelle Task“ im Sinne von DAMP eingestellt. Dies ist nur für SLED-, SNAP-Dumps und das aktive System sinnvoll. Alle Zugriffe auf task-spezifische Tabellen (ETCB, EJCB etc.) oder auf Adressen im Benutzerspeicher beziehen sich anschließend auf die neue Task.
Prozeduraufruf
Operation | Operanden |
NEW_TASK | (task[,map]) |
Operandenbeschreibung
task | gibt die neue aktuelle Task an. task muss ein String-Ausdruck oder ein numerischer Ausdruck sein; für beide Möglichkeiten wirkt NEW_TASK unterschiedlich. Ist task ein String-Ausdruck, so muss er eine TSN enthalten (maximal 4 Zeichen). Gibt es eine Task mit dieser TSN, so wird sie als aktuelle Task eingestellt, andernfalls wird CURRENT.ERROR gesetzt. Ist task ein numerischer Ausdruck, so werden die letzten 3 Halbbytes des Wertes dieses Ausdrucks als ITN interpretiert. Existiert im Diagnoseobjekt eine aktive Task mit dieser ITN, so wird sie eingestellt. Andernfalls wird die (in der TLT) folgende aktive Task eingestellt. Nur wenn auf diese Weise keine Task gefunden wurde, wird CURRENT_ERROR gesetzt. |
map | gibt an, ob die bereits vorhandene Systemübersicht (CSECT-Map) um die Übersicht der nicht privilegierten Subsysteme der neuen Task erweitert werden soll. Die Zuweisung TRUE ist zum einen mit Performance-Einbußen verbunden und kann zum anderen bei Systemen mit sehr vielen aktiven Tasks leicht zum Speicherüberlauf führen. Der optionale Parameter map sollte also nur verwendet werden, wenn er wirklich benötigt wird. |
Beispiel
NEW_TASK ( '0A33' ); —————————————————————————————————————————————————— (1) TASK_ID := X'AB'; ————————————————————————————————————————————————————— (2) NEW_TASK ( TASK_ID );
(1) | Es wird zunächst die Task mit der TSN 0A33 eingestellt. Falls diese Task nicht existiert wird CURRENT.ERROR gesetzt. |
(2) | Dann wird die Task mit der ITN X'AB' als aktuelle Task eingestellt. Falls diese nicht existiert, wird die in der TLT folgende Task (etwa X'AE') eingestellt und deren TID in TASK_ID zurückgemeldet. Nur wenn X'AB' nicht aktiv ist und keine weiteren aktiven Tasks in der TLT vorhanden sind, wird CURRENT.ERROR gesetzt. |
NEXT_WINDOW
Schaltet auf das nächste sichtbare Fenster
Der Aufruf von NEXT_WINDOW setzt einen vorher erfolgten Aufruf von READ_WINDOW voraus und stellt die Pseudosymbole INFIELDS.xxx für das nächste Diagnosefenster des bei READ_WINDOW gelesenen Bildschirms zur Verfügung. Nähere Informationen unter READ_WINDOW.
Bietet der DAMP-Bildschirm kein weiteres sichtbares Fenster, wird das Pseudosymbol CURRENT.ERROR auf einen Wert ungleich 0 gesetzt.
Unabhängig vom gerade betrachteten Fenster kann auf die Anweisungszeile des DAMP-Bildschirms immer über das Pseudosymbol INFIELDS.COMMAND zugegriffen werden.
Prozeduraufruf
Operation | Operanden |
NEXT_WINDOW |
Beispiel
READ_WINDOW; —————————————————————————————————————————————————————————— (1) WHILE (CURRENT.ERROR = 0) DO —————————————————————————————————————————— (2) WRITE (DEC_STRING (INFIELDS.WNDNO)); ——————————————————————————————— (3) NEXT_WINDOW; ——————————————————————————————————————————————————————— (4) END WHILE;
(1) | Die Prozedur wird unterbrochen. Nach Drücken der Taste ist die Prozedur wieder aktiv und die Eingaben in den letzten Bildschirm sind intern abgespeichert worden. Das oberste Diagnosefenster des Bildschirms ist das aktuelle Diagnosefenster, auf welches sich INFIELDS.xxx bezieht. |
(2) | Abbruch, falls NEXT_WINDOW kein weiteres sichtbares Fenster anzeigt. |
(3) | Hier können die Pseudosymbole INFIELDS.xxx für das aktuelle Fenster ausgewertet werden. In dem Beispiel wird die Fensternummer in den EDT-Bereich geschrieben; da INFIELDS.WNDNO stets existiert, ist eine Auswertung von CURRENT.ER-ROR nicht nötig. |
(4) | Umschalten auf das nächste Fenster. |
READ
Aus einem EDT-Bereich lesen
Die Standardprozedur READ liest sequenziell aus dem aktuellen EDT-Bereich und ordnet den gelesenen Satz einer Stringvariablen text zu. Ist die Stringvariable noch nicht initialisiert, wird ein String maximaler Länge (133 Byte) eingerichtet. Ist die EDT-Zeile zu kurz, wird sie mit Leerzeichen aufgefüllt. Ist sie zu lang, werden überschüssige Zeichen ignoriert.
Neben dem Zugriff auf Diagnose-Daten, die nicht im Diagnoseobjekt zu finden sind (etwa der Repfile), können Sie diese Funktion z.B. auch dazu verwenden, Tabellen-Layouts in separaten Dateien zu hinterlegen und in die PRODAMP-Prozedur einzulesen. Damit erspart man sich aufwändige Initialisierungen.
Von einer abwechselnden Verwendung der Prozeduren WRITE und READ ist abzuraten, da durch WRITE eventuell die intern von EDT eingestellte aktuelle Zeilennummer verändert wird. Ein nachfolgendes READ kann unter Umständen eine falsche Zeile liefern.
Prozeduraufruf
Operation | Operanden |
READ | (text) |
Operandenbeschreibung
text | die Stringvariable, der der gelesene Text zugeordnet werden soll. |
READ_WINDOW
Unterbricht eine PRODAMP-Prozedur und ermöglicht Eingaben bzw. Markierungen in Diagnosefenstern
Die Standardprozedur READ_WINDOW führt zu einer Unterbrechung der PRODAMP-Prozedur. Erst nach Drücken der Taste
Nach Aktivierung durch die Taste werden die Eingaben in den letzten DAMP-Bildschirm nicht an den DAMP-Bildschirm, sondern an PRODAMP übertragen. Über die Pseudosymbole INFIELDS.xxx (siehe unten) werden Eingaben in das oberste Diagnosefenster des Bildschirms sowie Eingaben in der Kommandozeile verfügbar. Mithilfe der Standardprozedur NEXT_WINDOW kann auf die Eingaben eines eventuell nächsten Diagnosefensters (im gleichen Bildschirm) zugegriffen werden. Ein mehrmaliges Aufrufen der Prozedur NEXT_WINDOW stellt die Eingaben in allen Diagnosefenstern des Bildschirms (von oben nach unten) zur Verfügung.
Neben Eingaben können mittels READ_WINDOW einige Größen bestimmt werden, die den Fenstern zugeordnet sind (wie z.B. Fensternummer). Nicht alle Eingaben sind verfügbar, insbesondere Eingaben in die meisten Spezialfenster. Einzelheiten entnehmen Sie der folgenden Aufzählung, welche die zulässigen Pseudosymbole INFIELDS.xxx enthält.
Der Anwender hat die Möglichkeit, sich eine eigene Benutzeroberfläche für DAMP zu programmieren, indem er in eine PRODAMP-Prozedur READ_WINDOW bzw. NEXT_WINDOW Prozeduren einbaut und zur Datenübertragung stets die Taste
verwendet. Hiermit können neue, anwendereigene DAMP-Anweisungen realisiert werden.Prozeduraufruf
Operation | Operanden |
READ_WINDOW |
Auf folgende Pseudosymbole kann zugegriffen werden:
INFIELDS.ADDRESS
enthält eine eventuelle Eingabe in das Feld Absolutadresse in der Kopfzeile des betrachteten Fensters. Numerischer Wert der Länge 4.
INFIELDS.ASEL
enthält eine eventuelle Eingabe in das Feld ASEL (Address-Space-Selector) in der Kopfzeile des betrachteten Fensters. String der Länge 3.
INFIELDS.ASID
enthält eine eventuelle Eingabe in das Feld ASID (Address-Space-Identifier) in der Kopfzeile des betrachteten Fensters. String der Länge 17.
INFIELDS.COMMAND
enthält eine eventuelle Eingabe in der DAMP-Anweisungszeile. String der Länge 72.
INFIELDS.LAYOUT
enthält eine eventuelle Eingabe in das Feld Fenster-Layout in der Kopfzeile des betrachteten Fensters. String der Länge 3.
INFIELDS.LENGTH
enthält eine eventuelle Eingabe in das Feld Länge in der Kopfzeile des betrachteten Fensters. Numerischer Wert der Länge 1.
INFIELDS.MARK1 bis INFIELDS.MARK6
enthält eventuell Adressen, die im betrachteten Fenster markiert worden sind. Numerischer Wert der Länge 4 (pro Adresse).
INFIELDS.RELATIVE
enthält eine eventuelle Eingabe in das Feld Relativadresse in der Kopfzeile des betrachteten Fensters. Numerischer Wert der Länge 4.
INFIELDS.STACK
enthält eine eventuelle Eingabe in das Feld Stack-Nummer in der Kopfzeile des betrachteten Stack-Fensters (W3). Numerischer Wert der Länge 4.
INFIELDS.SYMBOL
enthält eine eventuelle Eingabe in das Feld Symbol in der Kopfzeile des betrachteten Fensters. String der Länge 31. (Aus Kompatibilitätsgründen wird das letzte (d.h. das 32ste) Zeichen des Feldes Symbol ignoriert.)
INFIELDS.TID
enthält eine eventuelle Eingabe in das Feld TID in der Kopfzeile des betrachteten Dumpfensters. Numerischer Wert der Länge 4.
INFIELDS.TSN
enthält eine eventuelle Eingabe in das Feld TSN in der Kopfzeile des betrachteten Dumpfensters. String der Länge 4.
INFIELDS.WNDNO
enthält die Fensternummer des betrachteten Fensters. Numerischer Wert der Länge 1.
INFIELDS.WNDTSK
enthält die TID, zu welcher die Daten des betrachteten Fensters gehören. Numerischer Wert der Länge 4.
Hinweise
Erfolgt eine Abfrage des Pseudosymbols, ohne dass eine Feldeingabe im DAMP-Bildschirm vorausging, wird das Pseudosymbol CURRENT.ERROR auf einen Wert ungleich 0 gesetzt. Die Pseudosymbole WNDNO und WNDTSK werden implizit gesetzt, wobei WNDNO immer und WNDTSK auf jeden Fall dann gültig ist, wenn das Fenster Daten einer Benutzertask enthält. Handelt es sich um Systemdaten, enthält WNDTSK einen ungültigen Wert (CURRENT.ERROR wird gesetzt).
Wird die mit READ_WINDOW unterbrochene PRODAMP-Prozedur mit der Anweisung RESUME-PRODAMP-PROGRAM fortgesetzt, führt jeder Zugriff auf eines der Pseudosymbole zum Abbruch der Prozedur. Eine entsprechende Meldung wird ausgegeben.
Die Daten, welche in den Pseudosymbolen abgespeichert sind, werden durch eine normale Unterbrechung der PRODAMP-Prozedur mit der Anweisung INTERRUPT nicht zerstört. Sie stehen nach einem Wiedereinstieg in die Prozedur (mit der Anweisung RESUME-PRODAMP-PROGRAM) weiterhin zur Verfügung.
Bei jedem Neustart einer PRODAMP-Prozedur wird jedoch der Datenbereich, auf den die Pseudobase INFIELDS zugreift, ungültig gesetzt. Dies ist auch der Fall, wenn zwischen den Anweisungen INTERRUPT und RESUME-PRODAMP-PROGRAM eine andere Prozedur gestartet wird.Unabhängig von der Anzahl der auf dem Bildschirm angezeigten Fenster, werden insgesamt nur 6 Markierungen übernommen und mit den Prozeduren READ_WINDOW bzw. NEXT_WINDOW dem jeweiligen Fenster zugewiesen. Über die Pseudosymbole INFIELDS.MARK1 bis INFIELDS.MARK6 sind die Markierungen in der PRODAMP-Prozedur verfügbar.
Beispiel
Die folgende Prozedur wartet im Hintergrund, dass ein Adressfeld markiert und mit der Taste
übertragen wird. Für diesen Fall gibt die Prozedur das erste an der markierten Adresse gelegene Wort in der Meldungszeile aus.ARRANGE .WORD : OFFSET = 0, LENGTH = 4, TYPE = NUMERIC; END ARRANGE; B := 0; WHILE B=B DO CURRENT.ERROR := 0; READ_WINDOW; WHILE CURRENT.ERROR = 0 DO A := INFIELDS.MARK1; MESSAGE ( HEX_STRING(A,8)+': '+HEX_STRING(A.WORD,8) ); NEXT_WINDOW; END WHILE; END WHILE;
REFERENCE
Lokalisierung eines Symbols, das Element einer Substruktur ist
Die Standard-Prozedur REFERENCE wird nur in Verbindung mit den Standardfunktionen ADDRESS und LENGTH verwendet. Sie dient zur Angabe von Referenzen, wenn es sich bei dem mit ADDRESS oder LENGTH zu behandelnden Symbol um das Element einer Substruktur handelt. Die Prozedur REFERENCE muss für jedes Symbol, das auf dem „Weg“ zum gesuchten Element liegt, in der entsprechenden Reihenfolge aufgerufen werden (siehe Beispiel). Symbole sind dabei als String der maximalen Länge 32 anzugeben. Sie werden durch die REFERENCE-Aufrufe gesammelt, jedoch nicht auf ihre Gültigkeit überprüft. Erst beim Aufruf der Funktionen ADDRESS bzw. LENGTH werden die Strings überprüft.
Alle REFERENCE-Aufrufe gelten nur lokal innerhalb einer Prozedur. Sind die Aufrufe beim Verlassen der Prozedur nicht durch Aufruf von ADDRESS oder LENGTH aufgelöst worden, wird der weitere Prozedurablauf abgebrochen. Nach einer Auflösung wird der referenzierte Weg gelöscht. Wird das Element später noch einmal benötigt, müssen neue REFERENCE-Aufrufe gegeben werden.
Prozeduraufruf
Operation | Operanden |
REFERENCE | (symbol) |
Operandenbeschreibung
symbol | gibt das zu lokalisierende Symbol an. String der Länge 31. |
Beispiel
NKLCB_MDL.COPY_PARAMETER.USER_ADMINISTRATION.WAIT_FACTOR —————————————— (1) REFERENCE ( 'NKLCB_MDL' ); REFERENCE ( 'COPY_PARAMETER' ); REFERENCE ( 'USER_ADMINISTRATION' ); —————————————————————————————————— (2) A := ADDRESS ( 'WAIT_FACTOR', 'RF' ); ————————————————————————————————— (3)
(1) | Dieses SPL-Strukturfeld ist auszuwerten. |
(2) | Die dreimalige Anwendung der Prozedur REFERENCE bezeichnet den Weg („NKLCB_MDL.COPY_PARAMETER.USER_ADMINISTRATION“), der zum Symbol WAIT_FACTOR führt. |
(3) | liefert die Adresse des Symbols WAIT_FACTOR, die relativ zum ersten Symbol (hier NKLCB_MDL) der bezeichneten Referenzkette berechnet wird. Mit der Angabe „RF“ wird angezeigt, dass zur Auffindung dieses Symbols REFERENCE-Aufrufe notwendig waren. |
SET_HEADER
Listenüberschrift erzeugen
Mit SET_HEADER lässt sich eine Überschrift für die Listenausgabe erzeugen. Die Überschrift wird erstmals nach Aufruf von SET_HEADER ausgegeben und dann bei jedem folgenden Seitenwechsel, bis der Text durch ein neues SET_HEADER geändert wird.
Prozeduraufruf
Operation | Operanden |
SET_HEADER | (string,skiplines,reservelines) |
Operandenbeschreibung
string | muss ein Ausdruck vom Typ „String“ sein und enthält den Text für die Überschrift. |
skiplines | muss ein numerischer Ausdruck sein und gibt die Anzahl der Zeilen an, die vor dem erstmaligen Ausdruck der Überschrift freigelassen werden sollen. 0 |
reservelines | muss ein numerischer Ausdruck sein und wirkt wie folgt: bleiben auf der aktuellen Seite der Liste weniger als „reservelines“ Zeilen bis zum nächsten Seitenwechsel, wird vor dem erstmaligen Ausdruck der Überschrift ein Seitenwechsel gemacht. |
Beispiel
SET_HEADER ('TEXT',0,255); ———————————————————————————————————————————— (1) SET_HEADER ('TFT FUER TASK'+CURRENT.TSN, 2, 20); —————————————————————— (2)
(1) | erzwingt einen Seitenwechsel vor der Überschrift. |
(2) | Es werden vor der Überschrift 2 Zeilen freigelassen (nach der Überschrift wird immer eine Zeile freigelassen). Wenn auf der aktuellen Seite weniger als 20 Zeilen frei sind, wird ein Seitenvorschub gemacht. |
UNSIGNED_ON und UNSIGNED_OFF
Vorzeichenlose Arithmetik ein- bzw. ausschalten
Wenn mit Adressen gerechnet werden soll, ist die vorzeichenbehaftete Arithmetik manchmal nachteilig. Für den numerischen Datentyp von PRODAMP kann durch Aufruf einer Standardprozedur zwischen vorzeichenbehafteter und vorzeichenloser Arithmetik gewählt werden.
Bei vorzeichenbehafteter Interpretation von 32-Bit-Daten hat das führende Bit die Wertig-keit -231, bei vorzeichenloser Interpretation die Wertigkeit 231.
Eine PRODAMP-Hauptroutine läuft zunächst mit vorzeichenbehafteter Arithmetik (UNSIGNED_OFF, Voreinstellung für PRODAMP). Vorzeichenlose Arithmetik muss mit der Prozedur UNSIGNED_ON eingeschaltet werden. Sie kann mit UNSIGNED_OFF wieder ausgeschaltet werden.
Bei Aufruf einer Unter-Routine wird dieser arithmetische Ausführungsmodus (vorzeichenbehaftet, vorzeichenlos) in die Unter-Routine vererbt. Eine Änderung des arithmetischen Ausführungsmodus in einer gerufenen Routine hat keine Auswirkung auf den arithmetischen Ausführungsmodus in der rufenden Routine.
Der arithmetische Ausführungsmodus beeinflusst nur das Rechnen mit dem arithmetischen Datentyp der Länge 4 (32-Bit-Daten). Das Adressieren von Datenobjekten wird nicht beeinflusst.
Vorzeichenbehaftete Arithmetik (UNSIGNED_OFF)
Das Rechnen in vorzeichenbehafteter Arithmetik wird in PRODAMP wie bisher durchgeführt. Im Fehlerfall (Überlauf bei Addition, Subtraktion und Multiplikation, Division durch null) wird der PRODAMP-Lauf mit Laufzeitfehler abgebrochen.
Vorzeichenlose Arithmetik (UNSIGNED_ON)
Ein Überlauf bei Addition, Subtraktion und Multiplikation wird ignoriert (das Ergebnis ist „modulo 232 “ korrekt), insbesondere führt ein Überlauf nicht zu einem Laufzeitfehler.
Bei Division durch null wird der PRODAMP-Lauf mit Laufzeitfehler abgebrochen. Vergleiche werden bei vorzeichenloser Arithmetik binär als „logische Vergleiche“ durchgeführt.
Bei den Standardfunktionen „DEC_BINARY - Dezimalzahl umwandeln“ und„DEC_STRING - Numerische Werte umwandeln“ wird das Einschalten der vorzeichenlosen Arithmetik mit UNSIGNED_ON ignoriert.
Prozeduraufruf
Operation | Operanden |
UNSIGNED_ON | |
UNSIGNED_OFF |
WRITE
In einen EDT-Bereich schreiben
Die Standardprozedur WRITE bewirkt, dass ein Text in einen EDT-Bereich (standardmäßig der Bereich 8) ausgegeben wird. Damit ist es möglich, z.B. eine tabellarische Aufbereitung von Systemgrößen in diesen EDT-Bereich schreiben zu lassen und anschließend im EDT auszuwerten.
Der EDT-Ausgabebereich lässt sich mit WRITE („@PROC nn“) jederzeit ändern.
Strings, die mit dem Symbol „@“ beginnen, werden als EDT-Anweisung interpretiert. Mit „@WRITE ''dateiname''“’ können Sie also den Inhalt des EDT-Bereiches in eine Datei sicherstellen.
In der WRITE-Prozedur können jedoch nur solche EDT-Anweisungen angegeben werden, die auch der F-Modus des EDT akzeptiert. Andere Anweisungen können nur über den Umweg einer EDT-Prozedurdatei eingegeben werden.
PRODAMP simuliert die EDT-Anweisungen @PROC und @END. Allerdings sind hierbei folgende Einschränkungen zu beachten:
Es können nur die Prozedurdateien 1 bis 9 verwendet werden.
Wird die Nummer einer gültigen Prozedurdatei erkannt, erfolgt keine weitere Syntaxprüfung. Der Rest der Kommandoeingabe wird ignoriert.
Das Kommando @END darf nicht abgekürzt werden.
Eine Kettung von @PROC und @END mit anderen EDT-Kommandos ist nicht möglich.
Werden alte PRODAMP-Prozeduren, die noch EDT-Kommandos des L-Modus verwenden, unter DAMP erneut übersetzt, sind sie nicht mehr ablauffähig.
Die Standardprozedur WRITE verändert unter Umständen die intern vom EDT eingestellte aktuelle Zeilennummer. Folgt später die Prozedur READ, erhalten Sie dann einen anderen Zeileninhalt als erwartet. Sie sollten daher WRITE und READ nicht abwechselnd verwenden.
Prozeduraufruf
Operation | Operanden |
WRITE | (text) |
Operandenbeschreibung
text | gibt den Stringausdruck an, der in den EDT-Bereich geschrieben werden soll. |