Microsoft REL Dateiformat

Das REL-Format wird sowohl von dem Assembler M80 (Microsoft) als auch von RMAC (Digital Research, DR) sowie dem SLR erzeugt. Die folgende Beschreibung stammt aus dem Buch
Programmer's Utilities Guide for the CP/M TM Family of Operating Systems
von Digital Research; [Kommentare in Klammern beziehen sich auf die Syntax von RMAC].

Einige Produkte von Microsoft (COBOL, Fortran F80) erzeugen Rekords, die der LINK-80 von DR nicht verarbeiten kann.
Die von Microsoft erzeugten und von DR erkannten Rekords sind entsprechend gekennzeichnet.
Die von DR nicht erkannten Rekords sind ebenfalls gekennzeichnet.

REL-Dateien beinhalten Informationen in einem Bit-Strom, die der LINK-80 wie folgt interpretiert:
Wenn das erste Bit eine 0 ist, dann werden die folgenden 8 Bit entsprechend dem Wert des aktuellen Adresszeigers abgelegt.
Wenn das erste Bit eine 1 ist, dann werden die folgenden 2 Bits wie folgt interpretiert:
 00 Spezielles Element, siehe unten
 01 Programm relativ. Die nächsten 16 Bits werden abgelegt mit einem Offset des Programmsegments.
 10 Daten relativ. Die nächsten 16 Bits werden abgelegt mit einem Offset des Datensegments.
 11 Common relativ. Die nächsten 16 Bits werden abgelegt mit einem Offset des aktuellen Common-Blocks.

Spezielle Elemente

Ein spezielles Element besteht aus:
einem 4-Bit Kontrollfeld, das eins von 16 Elementen auswählt, wie unten beschrieben.
einem optionalen Wertefeld, das aus einer 2-Bit Adressfeld [Typ] und einem 16-Bit Adressfeld besteht. Das Adressfeld wird wie folgt interpretiert:
 00Absolut
 01Programm relativ
 10Daten relativ
 11Common relativ
einem optionalen Namenfeld, das aus einer 3-Bit Namenslänge besteht, gefolgt von einem Namen aus 8-Bit ASCII Zeichen.
Den folgenden Elementen folgt nur ein Namenfeld:
0000 ENTRY Symbol. Das im Namenfeld angegebene Symbol wird in diesem Modul definiert, so dass dieses Modul gelinkt wird, wenn diese Bibliothek durchsucht wird, wie mit der S-Option von LINK-80 angegeben. [PUBLIC Anweisung]
0001 Auswahl eines Common-Blocks. Weist LINK-80 an, den Adresszeiger für folgende Elemente mit Common-Zugriff zu verwenden, zu dem der Common-Block gehört, der im Namenfeld angegeben ist.
0010 Programm-Name. Der Name des relozierbaren Moduls.
0011 Aufruf einer Library. Dies geschieht z.B. mittels des Assemblerbefehls .request library
0100 Extension MS-LINK. Ein solches Element ist aufgebaut wie ein Element mit nur einem Namenfeld. Allerdings enthält es keine Symbole sondern es enthält ein Zeichen, das das Element definiert, gefolgt von einem bis sieben Zeichen mit zusätzlicher Information. Ein Extension MS-LINK-Element hat folgende Gestalt: 1 00 0100 lll s bbbbbb.
Mit:
lllDrei Bits, die die Länge des Feldes bbbbbb definieren.
sEin 8 Bit Extension MS-LINK-Element Typ.
bbbbbb1 bis 6 Bytes mit zusätzlicher Information.
Die aktuellen Extension MS-LINK-Element Typen sind:
5X'35'COBOL Overlay-Markierung
AX'41'Arithmetische Operation (Arithmetischer Operator). Das folgende Byte definiert die Operation:
OperatorDefinition OperatorDefinition
01 Byte vom Expession-Stack laden. 02 Wort (16 Bit) vom Expession-Stack laden.
03 Oberes Byte vom TOS (Top Of the Stack) auf den Stack laden. 04 Unteres Byte vom TOS auf den Stack laden.
05 Bitweise NOT: Einerkomplement bilden. 06 Negation: Zweierkomplement bilden.
07 Subtraktion: Differenz der beiden TOS-Werte auf dem Stack ablegen. 08 Addition: Summe der beiden TOS-Werte auf dem Stack ablegen.
09 Multiplikation: Produkt der beiden TOS-Werte auf dem Stack ablegen. 0A Division: Quotienten der beiden TOS-Werte auf dem Stack ablegen.
0B Modulo: Divisionsrest der beiden TOS-Werte auf dem Stack ablegen.
BX'42'Arithmetische Operation (Externe Referenz)
CX'43'Arithmetische Operation (Feldbasis + Offset)
Den folgenden Elementen folgt ein Wertefeld und ein Namenfeld:
0101 Definition der Common-Größe. Das Wertefeld beinhaltet die Anzahl reservierter Bytes für den im Namenfeld beschriebenen Common-Block. Der erste angegebene Wert eines gegebenen Blocks muss größer als oder gleich sein bezogen auf folgende Definitionen dieses Blocks in anderen zu linkenden Modulen.
0110 Externe Verkettung. Das Wertefeld beinhaltet das oberste Glied einer Kette, die mit einer absoluten 0 endet. Jeder Eintrag in der Kette wird ausgewechselt gegen das externe Symbol, das im Namenfeld angegeben ist. [benutzt bei EXTRN usw.]
0111 Definition eines ENTRY. Der Wert des Symbols im Namenfeld wird gesetzt durch das Wertefeld. [PUBLIC Anweisung]
Den folgenden Elementen folgt nur ein Wertefeld:
1000 Externer --Offset. Wird bei JP und CALL-Instruktionen auf externe Referenzen genutzt.
1001 Externer +-Offset. Die folgenden zwei Bytes im aktuellen Segment müssen mit dem Offset aus dem Wertefeld versehen werden, nachdem alle Verkettungen aufgelöst sind.
1010 Definition der Datengröße. Das Wertefeld beinhaltet die Anzahl Bytes im Datensegment des aktuellen Moduls.
1011 Setzen des Adresszeigers. Setzt den Adresszeiger auf den Wert, der im Wertefeld steht.
1100 Adresse einer Verkettung. Das Wertefeld beinhaltet das oberste Glied einer Kette, die mit einer absoluten 0 endet. Jeder Eintrag in der Kette wird ausgewechselt gegen den aktuellen Wert des Adresszeigers.
1101 Definition der Programmgröße. Das Wertefeld beinhaltet die Anzahl Bytes im Programmsegment des aktuellen Moduls.
1110 Modul-Ende. Definiert das Ende des aktuellen Moduls. Wenn das Wertefeld einen anderen Wert als absolut 0 enthält, dann wird der Wert genutzt als Startadresse für das gelinkte Programm. Im allgemeinen ist dann das aktuelle Modul das Hauptmodul. Das nächste Element in der Datei startet an der nächsten Byte-Grenze.
1111 Datei-Ende; ohne Werte- oder Namenfeld. Dieses Element folgt dem Element „Modul-Ende" im letzten Modul der Datei.