Allgemeines
Anwendungsgebiet: | Binden und Laden; siehe "Binden und Laden" |
Makrotyp: | S-Typ, MF-Format 2: Standardform/C-/D-/L-/E-/M-Form; siehe "S-Typ-Makroaufrufe" |
Anwendungsgebiet: Binden und Laden; siehe "Binden und Laden"
Makrotyp: S-Typ, MF-Format 2: Standardform/C-/D-/L-/E-/M-Form siehe "S-Typ-Makroaufrufe"
Zum dynamischen Bindelader DBL siehe auch Handbuch „BLSSERV“ [4].
Makrobeschreibung
Mit dem Makroaufruf ETABLE übergibt das Benutzerprogramm dem DBL eine Symboltabelle, die in die Symboltabelle des angegebenen Kontextes eingemischt wird. Die übergebene Tabelle informiert den DBL über Namen und Attribute von CSECTs, ENTRYs und COMMON-Bereichen des Benutzerprogramms.
Der Makroaufruf ist nicht kompatibel zu dem früheren Makroaufruf TABLE.
Makroaufrufformat und Operandenbeschreibung
ETABLE |
MF=S / D / C / E / L / M ,ACTION=*CREATE / *UPDATE / *DELETE ,CONTEXT_NAME= ,CONTEXT_STATE=*DBL-OPTIONS / *ANY / *NEW / *OLD ,TABLE_ADDRESS=NULL-1 / <var: pointer> ,TABLE_LENGTH=0 / <integer 0..2147483647> ,PARAM=<var: pointer> / (reg: pointer>) ,PREFIX=P / p ,MACID=BEI / macid |
In der nachfolgenden Operandenbeschreibung sind die Operanden alphabetisch geordnet.
ACTION=
Aktion, die für die einzelnen Symbole in der übergebenen Tabelle ausgeführt werden soll.
*CREATE
Die Symbole werden in die Symboltabelle des Kontextes eingetragen. Sie dürfen darin noch nicht enthalten sein.
*UPDATE
Die Symbole werden mit den neuen Eigenschaften in die Symboltabelle des Kontextes eingetragen. Sie müssen bereits darin enthalten sein. Hierbei wird auch die Sichtbarkeit von Symbolen geändert, die nicht mit einem vorangegangenen Aufruf des ETABLE
Makros eingetragen wurden.
*DELETE
Die Symbole sind aus der Symboltabelle des Kontextes zu löschen.
CONTEXT_NAME=' '
/ <char 1..32>
Name des Kontextes, dem die Symbole zugeordnet werden. Das erste Zeichen muss ein Buchstabe sein.
CONTEXT_STATE=
Status des bei CONTEXT_NAME angegebenen Kontextes
*DBL-OPTIONS
Der Operandenwert wird aus dem letzten Aufruf des Kommandos MODIFY-DBL-DEFAULTS übernommen. Falls für den betreffenden Operanden mit MODIFY-DBL-DEFAULTS noch kein Wert festgelegt wurde, gilt der Wert, der in der Makro-Syntaxbeschreibung auf *DBL-OPTIONS folgt.
*ANY
Wenn der Kontext bereits existiert, wird dieser verwendet; ansonsten wird ein neuer Kontext erzeugt.
*NEW
Der Kontext wird angelegt. Er darf noch nicht existieren.
*OLD
Der Kontext existiert bereits.
MF=
Zur allgemeinen Beschreibung des Operanden MF, der dazugehörenden Operandenwerte und der evtl. angegebenen Operanden PARAM, PREFIX und MACID siehe Abschnitt „S-Typ-Makroaufrufe“. Die gültigen MF-Werte sind zu Beginn der Makrobeschreibung bei „Makrotyp“ angegeben und aus dem Aufrufformat ersichtlich.
Bei der C-Form, D-Form oder M-Form des Makroaufrufs kann ein Präfix PREFIX und bei der C-Form oder M-Form zusätzlich eine Macid MACID angegeben werden (siehe AAbschnitt „S-Typ-Makroaufrufe“).
TABLE_ADDRESS=NULL-1 / <var: pointer>
Adresse einer Tabelle von Symbolen, die an DBL übergeben werden soll.
TABLE_LENGTH=0 / <integer 0..2147483647>
Tatsächliche Länge der Tabelle (in Byte)
Hinweise zum Makroaufruf
Typ und Name eines Symbols können mit ETABLE nicht geändert werden.
Die Adresse im Feld LOAD_ADDR muss eine gültige Klasse-6-Speicher-Adresse sein.
Ein Symbol, das mit ETABLE in die Symboltabelle des Kontextes eingetragen wurde, kann nicht mit dem Makro UNBIND aus der Symboltabelle gelöscht werden. Symbole, die mit den Kommandos LOAD-/START-EXECUTABLE-PROGRAM (oder LOAD-/ START-PROGRAM) oder mit den Makros BIND und TABLE eingeführt wurden, können dagegen nicht mit ETABLE ACTION=*DELETE gelöscht werden.
Bei ACTION=*DELETE wird der Operand CONTEXT_STATE ignoriert. Nur die Symbolnamen werden beachtet.
Symbole, die mit ETABLE in die Symboltabelle eingetragen wurden, liegen in der Verantwortung des Benutzers und sind nur für die aktuelle Task sichtbar.
Wenn ein COMMON-Bereich mit ETABLE eingeführt wird, geht der DBL davon aus, dass der COMMON-Bereich bereits geladen ist und das Feld LOAD_ADDR auf einen zugewiesenen Speicherbereich verweist.
Wenn ACTION=UPDATE auf ein Symbol angewandt wird, das nicht von ETABLE erzeugt wurde, werden bei der Bearbeitung nur Symbolname, Symboltyp und das Attribut INVISIBLE berücksichtigt.
Für ein Symbol, das nicht von ETABLE erzeugt wurde, kann nur die Sichtbarkeit aktualisiert werden.
Da die Sichtbarkeit auch für Symbole aktualisiert werden kann, die nicht von ETABLE erzeugt wurden, wird grundsätzlich die Sichtbarkeit des ersten gefundenen Symbols aktualisiert.
Format der Symboltabelle
Die bei TABLE_ADDRESS angegebene Adresse zeigt auf eine Symboltabelle, die mehrere Einträge haben kann. Ein einzelner Eintrag hat folgendes Format:
Byte | Länge | Feldname | Bedeutung und/oder Wert |
0 | 8 | HDR | Standardheader |
8 | 1 | TYPE | / CSECT (X'F0') oder |
9 | 7 | ATTRIBUTE | Attribute wie bei CSECTs (je 1 Byte pro Attribut mit folgender
|
16 | 4 | LOAD_ADDR | Ladeadresse des Symbols |
20 | 2 | LEN | Länge der CSECT / des COMMON-Bereiches |
22 | 32 | SYMBOL_NAME | Name des Symbols |
54 | 1 | HSI_CODE | 390 (X'01') oder |
55 | 1 | MMODE | TU_4K_DEPENDENT (X'02') oder |
Die DSECT für einen solchen Symboleintrag wird mit ETABIT MF=D
erzeugt.
Behandlung von Namenskonflikten
Die folgende Tabelle zeigt, wie Namenskonflikte zwischen Symbolen behandelt werden, die durch die Makros ETABLE, TABLE und BIND eingeführt wurden:
Existierendes Symbol wurde eingeführt durch | |||
ACTION | ETABLE | TABLE | BIND |
*CREATE | 1. | 2. | 2. |
*UPDATE | 3. | 4. | 4. |
*DELETE | 5. | 6. | 6. |
Ein vorhandenes ETABLE-Symbol hat den gleichen Namen.
Folgender Returncode wird übergeben: ETABLE_SYMB_DUPLICATEEin Namenskonflikt tritt auf. Folgender Returncode wird übergeben: ETABLE_NAME_-COLLISION
Das Symbol wird geändert (kein Namenskonflikt).
Nur die Sichtbarkeit (visibility) des Symbols ist aktualisierbar.
Das Symbol wird gelöscht (kein Namenskonflikt).
Unzulässige Aktion.
Rückinformation und Fehleranzeigen
Wenn bei der Verarbeitung der Tabelleneinträge ein Fehler auftritt, wird im HDR-Feld des fehlerhaften Tabelleneintrags ein entsprechender Returncode eingetragen. Im Standardheader der Parameterliste wird der Returncode FUNCTION_PARTIALLY_PROCESSED übergeben und die Verarbeitung der Tabelleneinträge wird fortgesetzt.
Das Feld PROCESSED_ITEMS der Parameterliste enthält die Anzahl korrekt bearbeiteter Einträge.
Standardheader:
+---------------+ | | | | | |c|c|b|b|a|a|a|a| +---------------+
Über die Ausführung des Makros ETABLE wird im Standardheader folgender Returncode übergeben (cc=Subcode2, bb=Subcode1, aaaa=Maincode):
X'cc' | X'bb' | X'aaaa' | Erläuterung |
X'00' | X'00' | X'0000' | Der Makro wurde normal ausgeführt. |
X'01' | X'00' | X'0000' | Die Funktion wurde bereits ausgeführt. |
X'02' | X'00' | X'0001' | Die Funktion wurde teilweise ausgeführt. |
X'60' | X'01' | X'0001' | Ungültiger Operand TABLE_LENGTH |
X'60' | X'01' | X'0002' | Ungültige Angaben bei TABLE_ADDRESS oder TABLE_LENGTH. |
X'60' | X'01' | X'0008' | Ungültiger Operand ACTION |
X'60' | X'01' | X'000A' | Interner ETABLE-Fehler. |
X'60' | X'01' | X'0019' | Ein reserviertes Feld enthält keine binären Nullen. |
X'60' | X'01' | X'0040' | Der Kontext ist noch nicht vorhanden und es wurde CONTEXT_STA- |
X'60' | X'01' | X'0048' | Der Kontext ist bereits vorhanden und es wurde CONTEXT_STA- |
X'60' | X'01' | X'0134' | Ungültiger Parameter CONTEXT_STATE |
X'60' | X'01' | X'0148' | Ungültiger Kontextname |
X'60' | X'40' | X'0158' | Maximale Anzahl von Benutzerkontexten ist erreicht. |
X'60' | X'20' | X'0200' | Interner DBL-Fehler |
X'60' | X'20' | X'0300' | Systemfehler |
X'00' | X'01' | X'FFFF' | Die Funktion wird nicht mehr oder noch nicht unterstützt. |
X'00' | X'03' | X'FFFF' | Die Version der Schnittstelle wird nicht unterstützt. |
Weitere Returncodes, deren Bedeutung durch Konvention makroübergreifend festgelegt ist, können der Tabelle „Standard-Returncodes“ (Standardheader) entnommen werden.
Beispiel
Dieses Beispiel soll die Anwendung der ETABLE/ETABIT-Schnittstellen verdeutlichen:
* DSECT of ETABLE item * ETABIT MF=D ... * Inititialisierung der ETABLE Parameterliste * MVC ETAPL(PBEI#),ETAPLI LA 1,ETATAB LA 2,ETATABL ETABLE MF=M,TABLE_ADDRESS=(1),TABLE_LENGTH=(2) * * Initialisierung der Eintraege * USING PBETDS,1 reg 1 = Adresse des ersten Eintrags * PBETDS = DSECT fuer den Eintrag * * Erster Eintrag * MVC 0(PBET#,1),ETAITEMI Eintrag initialisieren ETABIT MF=M,SYMBOL_NAME=CS1NAM,LEN=CS1L, LOAD_ADDR=CS1@,SYMBOL_TYPE=*COMMON * * Zweiter Eintrag * LA 1,PBET#(1) reg 1 = Adresse des zweiten Eintrags L 2,CS2@ MVC 0(PBET#,1),ETAITEMI Eintrag initialisieren ETABIT MF=M,SYMBOL_NAME='CS2',LEN=200, LOAD_ADDR=(2),SYMBOL_TYPE=*CSECT * * ETABLE aufrufen * ETABLE MF=E,PARAM=ETAPL * * Returncode-Auswertung * ... * * ETABLE-Tabelle * ETATAB DS XL(2*PBET#) Tabelle fuer zwei Eintraege ETATABL EQU *-ETATAB Tabellenlaenge DS 0F CS1@ DS F Adresse des ersten eingefuegten Symbols
CS1NAM DS CL32 Name des ersten eingefuegten Symbols CS1L DS Y Laenge des ersten eingefuegten Symbols CS2@ DS F Adresse des zweiten eingefuegten Symbols * ETAPL ETABLE MF=C Parameterliste * * Struktur zur Initialisierung der ETABLE-Parameterliste * ETAPLI ETABLE MF=L,ACTION=*CREATE,CONTEXT_STATE=*NEW, CONTEXT_NAME='ETACTX' * * Struktur zur Initialisierung eines ETABLE-Eintrags * ETAITEMI ETABIT MF=L