Overlays aus .SPR Dateien

Das DRI Programm LINK.COM1 erlaubt zwar das Erzeugen von Overlay-Dateien2, jedoch wird nach dem Linken ausgegeben, dass zwei Labels fehlen, nämlich ?ovlay und ?ovla0. Dies sind zwei Entry-Punkte, die aus der PL/I Bibliothek stammen. Im Public Domainbereich gab es eine alternative Quelle in der SIG/M Vol. 2363. (Später habe ich die Bibliothek PLILIB.IRL gefunden, in der sich das gesuchte Modul befand4).

Da ich die SIG/M Quelle anfangs nicht kannte und auch nicht wusste, welche Parameter für den Aufruf zu den PL/I Bibliotheks-Routinen übergeben werden mussten, habe ich eine andere Lösung gesucht. Die Idee war, das von LINK.COM erzeugte PRL bzw. SPR-Format zu verwenden. Im vorliegenden Fall werden SPR-Module vorausgesetzt, die mit dem Kommando “LINK Datei [OS]” erzeugt werden.

Dazu habe ich zwei Hilfsprogramme und das eigentliche Lademodul geschrieben, das aus einer Overlay-Datei das entsprechende Modul lädt.

Beschreibung der Programme und des Moduls:

NameAufrufBeschreibung
PRL2OVR PRL2OVR prl_file [ovm_file] Dieses Hilfsprogramm verkleinert den Header der .SPR-Datei. Ursprünglich ist diese 256 Bytes lang und beinhaltet lediglich die Länge des Programmcodes. PRL2OVR kopiert nur die ersten 128 Bytes des Headers und hängt daran den Programmcode an.
OVLBLDPR OVLBLDPR [-] ovr_file list_of_ovm_files Dieses Hilfsprogramm erstellt aus den Overlay-Modulen das komplette Overlay. Weiterhin wird eine Textdatei erstellt, in der die Länge und der Startrekord des jeweiligen Moduls definiert sind. Diese Datei kann dann in das Hauptprogramm übenommen werden (z.B. mit INCLUDE). Mit der Option “–” kann die Erzeugung dieser Datei unterdrückt werden.
LDPRL Diverse Parameter Dies ist das Modul, das in einem Programm ein Overlay-Modul in den Speicher lädt. Im Assembler muss dazu das Symbol LODOVL als EXTERN deklariert werden. Die Parameter werden unten genauer erklärt.

Beschreibung der Parameter für das Modul LDPRL:

Aufruf
ParameterÜbergabe im RegisterBeschreibung
Startrekord L Gibt den Startrekord für das zu ladende Modul im Overlay an
Modullänge H Gibt die Länge für das zu ladende Modul im Overlay an
Externe Tabelle ^BC Adresse einer Tabelle, die Zugriff auf Routinen ausserhalb des Moduls erlaubt
Ladeadresse und FCB ^DE Adresse eines Parameterblocks mit
  1. Zeiger auf den File Control Block des Overlays
  2. Erste freie Ladeadresse für das Modul
Rücksprung
ParameterRegister/Carry-FlagBeschreibung
Ergebnis Carry Im Fehlerfall ist die Carry-Flag gesetzt
Ladeadresse ^HL Wirkliche Ladeadresse, beginnend mit einer Seitengrenze (0xPP00)
Endadresse ^DE Erste freie Adresse nach dem Modul

Aufbau eines Overlay-Modules:

Das erste Byte in einem Overlay-Modul definiert, ob externe Routinen verwendet werden oder nicht:

Ohne externe AufrufeMit externen AufrufenBeschreibung
       NOP
       JP   START
       JP   EXT_1
       JP   EXT_2
        ...
       JP   EXT_n
       NOP
START:..........
  1. Ein NOP als erste Anweisung zeigt an, dass der folgende Code einfach geladen werden kann.
  2. Beginnt die erste Anweisung mit einem “JP addr”, dann werden die folgenden JP-Anweisungen bis zum NOP als externe Sprünge behandelt. Die Adressen der JP-Anweisungen sind relativ zur externen Tabelle, die im Register BC übergeben wird.


1. Im Handbuch findet sich eine Beschreibung von LINK.COM
2. Im Anhang E wird die Erzeugung von Overlay-Dateien beschrieben
3. Die Gruppe SIG/M (Special Interest Group/Microcomputers), ein Teil des Amateur Computer Clubs aus New Jersey, hatte zur regulären Ausgabe von Public Domain Software diese auf Disketten zusammengestellt. Die SIG/M Disketten entstanden ab 1980 und die Ausgaben 000 bis 310 sind hier zu finden.
4. Das PL/I Paket besteht aus pli80_13 (beinhaltet PLILIB.IRL) und plm80x80 (mit PLMLANG.DOC (PL/M-80 Language Summary)). Ich habe das Modul zum Laden aus einem Overlay disassembliert und hier zur Information ausgestellt.

Werner Cirsovius 1989, zusammengestellt August 2009, erweitert November 2012