Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

Standardprozeduren

&pagelevel(5)&pagelevel

Ü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:

ProzedurnameFunktion
COMMANDEingeben von DAMP-Anweisungen aus einer Prozedur heraus
DMP_#REFRESHErneuern der Datenbereiche
DUMP_MEMORYSpeicherbereich auf SYSLST ausgeben
ENTER_MODULESchnittstelle zwischen PRODAMP-Prozeduren und Assembler-Modulen
EXTRACTManipulieren von Strings
INSERTManipulieren von Strings
LISTString auf SYSLST ausgeben
LIST_CONTROL_BLOCKKontrollblock auf SYSLST ausgeben
MESSAGEAusgeben einer Meldung
NEW_TASKEinstellen einer anderen 'aktuellen' Task
NEXT_WINDOWSchaltet in einer PRODAMP-Prozedur auf das nächste sichtbare Fenster des DAMP-Bildschirms
READLesen aus einem EDT-Bereich
READ_WINDOWUnterbricht eine PRODAMP-Prozedur und ermöglicht Eingaben bzw. Markierungen in einem Diagnosefenster
REFERENCEDefinition eines Symbols als Element einer Substruktur
SET_HEADERÜberschrift für die Listenausgabe erzeugen
UNSIGNED_ONVorzeichenlose Arithmetik einschalten
UNSIGNED_OFFVorzeichenlose Arithmetik ausschalten
WRITESchreiben 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“:

  • REPEAT-SESSION

  • RESUME-PRODAMP-PROGRAM

  • SHOW-LAST-STATEMENT

  • START-OPTION-DIALOG

  • START-PATTERN-SEARCH

  • START-PRODAMP-EDITOR

  • START-PRODAMP-PROGRAM

  • START-STATEMENT-SEQUENCE

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.
CURRENT.SEGMENT wird prozedurlokal geführt und mit „0“ voreingestellt.

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).
Gibt man für „relad“ einen negativen Wert an, werden keine relativen Adressen ausgegeben (von DAMP etwa für Ausgabe von Voll-Seiten 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.
Jeder Parameter muss Bezeichner einer PRODAMP-Variablen oder (allgemeiner) ein PRODAMP-Ausdruck sein. Diese Ausdrücke oder Variablen können von beliebigem Typ sein. Die Liste par1, par2, ... kann leer sein.

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.

  • Numerische Parameter und Parameter vom Typ Bitmuster haben dabei immer die Länge 4.

  • Die Länge eines Parameters vom Typ String hängt von seiner Definition in der PRODAMP-Prozedur ab (1-133 Bytes).

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.
„position“ gilt relativ zum Anfang des Zielstrings. Das erste Zeichen im Zielstring hat also Position 0.

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.
0 <= skiplines <= 15. Keine Angabe von skiplines bedeutet skiplines = 0.

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. 
Abhängig vom Adresstyp werden virtuelle (= Standardeinstellung), reale, absolute oder HSA Speicherbereiche oder Data-Space-Bereiche ausgegeben. Im Falle von großen realen und absoluten Adressen, kann für "address" nur ein Wert innerhalb eines 4 GB Segmentes angegeben werden. Das betreffende Segment muss unter CURRENT-SEGMENT angegeben werden. CURRENT.SEGMENT wird auf Basis der lokalen Prozedur versorgt und ist auf "0" voreingestellt. 
Hinweis: CURRENT ist eine lokale Referenz in DAMP, die dazu benutzt wird, auf Daten in einem DAMP-Programm zuzugreifen. Der mögliche Wertebereich für "address" umfasst  X'00000000' und X'FFFFFFFF'. Die maximale Länge des Feldes beträgt 4 Byte.

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:

DSECT : FAFG          + REL : 00000       = ADDR : BAD01400   LEN : 00170
000 TIME_STAMP        : 00000000 = 0      ! 004 CCAD              : BAD00000
008 FTAD              : BAD01570          ! 00C SPAD              : 00000000 = 0
010 FAMEMPTR          : F70DDE40          ! 014 SRB               : 81FB0270
018 COMB              : D14B0234          ! 01C ABTB              : 00000000 = 0
020+WAITBOID :
  020 WAITBOID(1)     : 81BD0263
  024 WAITBOID(2)     : 82060266
  028 WAITBOID(3)     : 8315023C
02C CMXB              : 00000000 = 0      ! 030 PWRD              : 00000000 = 0
034 TSN               : F0F6D9D3 = '06RL' ! 038 SW                : 00000000
03C DPRIM             : 00000240 = 576    ! 040 DSECOND           : 000000C0 = 192
044 DUSID             :'TSOS '            ! 04C IDUSID            :'        '
054 FGGILIST          : 00000000 = 0      ! 058 FN_GENERATED      : 01
059 TD_GENERATED      : 01                ! 05A TSK_GENERATED     : 01
05B+FLAGS :
  05B RESERVED        : 000006
05E IN_BUF_SIZE       : 0541 = 1345       ! 060 OUT_BUF_SIZE      : 0541 = 1345
062                   : 0000              ! 064 DBLISTPTR         : 00000000 = 0
068 FAHOSTLPTR        : 00000000 = 0      ! 06C CHARTEMPFILE      : 40 = ' '
06D BS2VERS           :'V18.0A0000'       ! 077 UNUSED            : 00 = ' '
078+TRACE             :
  078+HDR             :
    078 DEEP_OK           : 00
    079 RECORDING_POSITION: 00
    07A SS_NUMBER         : 00
    07B FILLER2           : 00
  07C RECORD          :'                                          '
  0BD                 :'                                          ' 
  0FE                 :'                                          ' 
  13F                 :'                                          '
16C INF_BUF_NUMBER    : 0004 = 4           ! 16E OF_BUF_NUMBER    : 0008 = 8

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.
1. Fehlerzeile -> 2. Bildschirmzeile
2. Fehlerzeile -> 3. Bildschirmzeile
Wird für line der Wert 0 festgelegt, entspricht dies dem Prozeduraufruf MESSAGE (text).

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.
Falls der numerische Ausdruck speziell ein Bezeichner einer numerischen Variablen ist, wird in ihr die eingestellte TID zurückgegeben. Auf diese Weise können Sie nacheinander alle aktiven Tasks durchgehen (siehe dazu das Beispiel 3, „Aktuelle Task ändern“ auf "Mit Prozeduren arbeiten (Spezialfenster PROC)").

map

gibt an, ob die bereits vorhandene Systemübersicht (CSECT-Map) um die Übersicht der nicht privilegierten Subsysteme der neuen Task erweitert werden soll.
Für den Parameter map können die Werte TRUE oder FALSE eingesetzt werden. Mit TRUE wird die zusätzliche CSECT-Map angefordert; keine Angabe ist gleichbedeutend mit FALSE.

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.
Maximal 133 Zeichen lang.

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 wird die PRODAMP-Prozedur wieder aktiv. In der Zwischenzeit kann in den DAMP-Bildschirmen beliebig gearbeitet werden.
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 <= skiplines <= 255.

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.
0 <= reservelines <= 255. Die Angabe „255“ erzwingt einen Seitenwechsel.

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.