Allgemeines
Anwendungsgebiet: | Binden und Laden; siehe "Binden und Laden" |
Makrotyp: | 24-Bit-Schnittstelle: R-Typ; siehe "R-Typ-Makroaufrufe"; 31-Bit-Schnittstelle: S-Typ; (Stan-dardform/E-Form/L-Form/C-Form/D-Form); siehe "S-Typ-Makroaufrufe" Für 31-Bit-Schnittstelle zu beachten: Im Standardheader wird kein Returncode übergeben. |
TABLE wird durch die Makros ETABLE und ETABIT abgelöst.
Makrobeschreibung
Mit dem TABLE-Makro übergibt das Benutzerprogramm dem dynamischen Bindelader DBL eine Tabelle mit Einträgen. Diese informieren den DBL über Namen und Adressen von Programmabschnitten (CSECT), Einsprungstellen (ENTRY) und COMMON-Bereichen des Benutzerprogramms, sodass der DBL beim Befriedigen von Externverweisen usw. die ihm übergebenen Werte verwenden kann.
Insbesondere kann ein vom Binder TSOSLNK gebundenes und mit dem Lader ELDE geladenes Benutzerprogramm, das den LINK-Makro verwendet, mit dem TABLE-Makro den DBL (der durch den LINK-Makro aufgerufen wurde) über den Programmaufbau informieren. Dadurch vermeidet man, dass der DBL erneut Moduln lädt, die bereits vom TSOSLNK in das Programm eingebunden wurden.
Während der Makroausführung wird für jeden Tabelleneintrag geprüft, ob der Name eines Ladepunkts schon bekannt ist durch einen vorherigen Ladevorgang oder TABLE-Aufruf. Im Ja-Fall wird eine Warnung ausgegeben und die Makroausführung normal fortgesetzt.
Makroaufrufformat 1 und Operandenbeschreibung
TABLE |
{adr / (r) }, {länge / (r)} [,PARMOD=24 / 31] [,MF=L / (E,..) / C / D] |
Format 2
PBTABD |
[,MF=(D,p) / (C,p)] |
adr
symbolische Adresse der Tabelle (Aufbau siehe am Ende der Operandenbeschreibung).
(r)
r = Register mit dem Adresswert adr. Für die 24-Bit-Schnittstelle muss Register R1 verwendet werden.
Bei Verwendung der 31-Bit-Schnittstelle wird Register R1 mit der Adresse des Datenbereichs geladen und kann vom Anwender nicht verwendet werden.
länge
Länge der Tabelle in Byte.
(r)
r = Register mit der Längenangabe. Für die 24-Bit-Schnittstelle muss Register R0 verwendet werden.
PARMOD=
steuert die Makroauflösung. Es wird entweder die 24-Bit- oder die 31-Bit-Schnittstelle generiert.
Wenn PARMOD nicht spezifiziert wird, erfolgt die Makroauflösung entsprechend der Angabe für den Makro GPARMOD oder der Voreinstellung für den Assembler (= 24-Bit-Schnittstelle).
24
Die 24-Bit-Schnittstelle wird generiert. Datenlisten und Befehle benutzen 24-Bit-Adressen (Adressraum <= 16 MB).
31
Die 31-Bit-Schnittstelle wird generiert. Datenlisten und Befehle benutzen 31-Bit-Adressen (Adressraum <= 2 GB). Datenlisten beginnen mit dem Standardheader.
MF=
Nur für die 31-Bit-Schnittstelle: Die C-/D-Form wird aufgerufen mit MF=C/D bzw.
MF=(C,p)/(D,p).
p = Präfix (max. 3 Zeichen); Voreinstellung: p = I. Das Präfix verändert nur die Feldnamen (nicht die symbolischen Namen bei den Equates). Bei Angabe p = * werden die symbolischen Namen ohne Präfix erzeugt. Bei dynamischer Versorgung des Datenbereichs sollten die Initialisierungswerte für den Standardheader aus einem mit MF=L erzeugten Datenbereich übernommen werden.
Zur allgemeinen Beschreibung des Operanden MF, der dazugehörenden Operandenwerte und der evtl. nachfolgenden Operanden (z.B. für einen Präfix) siehe Abschnitt„S-Typ-Makroaufrufe“. Die gültigen MF-Werte sind zu Beginn der Makrobeschreibung bei „Makrotyp“ angegeben und aus dem Aufrufformat ersichtlich.
Der Makro PBTABD generiert für die 31-Bit-Schnittstelle eine Beschreibung der Tabelle als DSECT oder Datenabschnitt. Es bedeuten:
MF=
gibt an, ob eine DSECT oder eine Datenliste erzeugt wird.
p = Präfix (max. 3 Zeichen), mit dem alle in der Liste vorkommenden symbolischen Namen beginnen. Bei Angabe p = * werden die Namen ohne Präfix erzeugt.
D
eine DSECT wird erzeugt; Voreinstellung.
C
ein Datenabschnitt wird erzeugt.
Aufbau der Tabelle für den DBL
bei Verwendung der 24-Bit-Schnittstelle:
Distanz | Länge | Eintrag/Funktion |
0 | 1 | X'02': kennzeichnet CSECT oder ENTRY |
1 | 8 | Name des ENTRY, COMMON oder CSECT (8 Zeichen) |
9 | 3 | errechnete Adresse |
12 | 3 | Länge des COMMON (gilt nur für COMMON) |
bei Verwendung der 31-Bit-Schnittstelle:
Distanz | Länge | Eintrag/Funktion |
0 | 1 | X'F0': kennzeichnet CSECT |
1 | 8 | Name des ENTRY, CSECT oder COMMON (8 Zeichen) |
9 | 1 | Attribute: |
10 | 2 | X'00' (wird für Ausrichtung benötigt) |
12 | 4 | Ladeadresse (31-Bit-Adresse) |
16 | 4 | Länge des COMMON: sonst 4 X'00' |
Der Makro PBTABD generiert das Layout dieser Tabelle.
Rückinformation und Fehleranzeigen
Über die Ausführung des Makros TABLE wird im Register R15 ein Returncode übergeben. Es ist aber zu unterscheiden, ob die 24-Bit- oder die 31-Bit-Schnittstelle aufgerufen wurde (Operand PARMOD oder Makro GPARMOD).
bei PARMOD=24:
R15:
+---------------+ | | | | | | | | | | | |a|a| +---------------+
Über die Ausführung des Makros TABLE wird im rechtsbündigen Byte des Registers R15 ein Returncode übergeben.
Ret.Code | Erläuterung |
X'00' | Makroaufruf erfolgreich. |
X'04' | Makroaufruf nicht erfolgreich; in diesem Fall wird Register R1 gelöscht. |
bei PARMOD=31:
R15:
+---------------+ | | | | | |c|c|b|b|a|a|a|a| +---------------+
Über die Ausführung des Makros TABLE wird im Register R15 ein gegliederter Returncode übergeben (cc=Subcode2, bb=Subcode1, aaaa=Maincode)
Es bedeuten:
cc=00: Funktion normal ausgeführt.
cc=0C: Funktion nicht ausgeführt.
Register R1 wird mit der Adresse des Datenbereichs geladen.
cc | bb | aaaa | Erläuterung |
00 | 00 | 0000 | Normale Ausführung. |
0C | 00 | 0004 | Datenbereich ist nicht ausgerichtet. |
0C | 00 | 0008 | Datenbereich nicht zugewiesen oder Adresse in Register R1 liegt außerhalb |
0C | 00 | 0014 | Es wurde eine Registernummer > 15 angegeben. |
0C | 00 | 0018 | Unerlaubte Benutzung eines reservierten Feldes. |
0C | 00 | 0100 | Fehlerhafte Längenangabe (Operand länge). |
0C | 00 | 0104 | Falscher Name angegeben (Tabelleneintrag; Distanz 1). |
0C | 00 | 0108 | Falsche Typangabe (Tabelleneintrag; Distanz 0). |
0C | 00 | 010C | Angabe für AMODE nicht korrekt (Tabelleneintrag). |
0C | 00 | 0110 | ungültige Ladeadresse angegeben (Tabelle Ladeadresse). |
0C | 00 | 0200 | Systemfehler. |
0C | 00 | 0300 | Interner Fehler bei Speicheranforderung ($REQM) oder Speicherfreigabe |
00 | 01 | FFFF | Ungültige Angabe für UNIT/FUNCTION im Standardheader. |
00 | 03 | FFFF | Ungültige Angabe für VERSION im Standardheader. |