[ Home ]
von Jörg Linder
Bei der Erzeugung der SYS-Datei für ML-DOS sind viele User erstmalig mit LINK 1.31 von Digital Research Inc. in Berührung gekommen, dabei gehört er doch zum standardmäßigen Lieferumfang eines jeden CP/M Systems. Da wir KC-User aber nicht mit einem (ordentlichen) CP/M System bedacht wurden, gab's auch keine Standardsoftware dazu. Zwar haben sich viele die von Robotron in Umlauf gebrachten Clones besorgt, jedoch ist die Bedienung - sprich die Syntax - vollkommen anders.
Aus eigener, telefonseelsorgerischer Erfahrung weiß ich, das der größte Stolperstein beim Nachvollziehen der Arbeitsschritte zur Erstellung des Systems, wie sie in den KC-News veröffentlicht wurden, die Eingabe der eckigen Klammern war. Hier ist die Lösung ganz einfach: Da wir mit gutem alten ISO-7-Bit Code arbeiten, sind die länderspezifischen Sonderzeichen mehrfach belegt. Was beim deutschen Zeichensatz das große Ä ist, erscheint im amerikanischen Zeichensatz als linke eckige Klammer ,,[``. Man braucht also vor Eingabe der Kommandozeile nur auf den amerikanischen Zeichensatz umzuschalten (siehe D004 Manual, D004 Handbuch für den Bediener, Veröffentlichungen zu ZAS) oder man gibt in der Kommandozeile statt der Zeichen aus dem amerikanischen Satz die deutschen Entsprechungen ein.
Hier sind diese nochmal im Kurzüberblick:
| amerikanisch | deutsch |
[, linke eckige Klammer |
Ä, Großbuchstabe A-Umlaut |
\, Backslash |
Ö, Großbuchstabe O-Umlaut |
], rechte eckige Klammer |
Ü, Großbuchstabe U-Umlaut |
{, linke geschweifte Klammer |
ä, Kleinbuchstabe a-Umlaut |
|, senkrechter Strich (Pipe) |
ö, Kleinbuchstabe o-Umlaut |
}, rechte geschweifte Klammer |
ü, Kleinbuchstabe u-Umlaut |
~, Tilde |
ß, Doppel-S-Laut |
Sicherlich interessieren sich einige Anwender für eine vollständige Beschreibung der Kommandos und Optionen dieses recht leistungsfähigen Linkers. Deshalb habe ich mich an die Übersetzung der originalen CP/M Unterlagen gemacht, die an dieser Stelle veröffentlicht wird:
LINK-80 ist ein Utility, mit dem relokatible Programmodule zu einer absoluten, ausführbaren Datei zusammengefügt werden können. Die erzeugten Programme sind unter CP/M oder MP/M II lauffähig.
Relokatible Programmodule können in zwei verschiedenen Arten vorliegen. Zum einen als REL- Datei, die mittels PL/I-80, RMAC oder dem Übersetzungsprogramm einer anderen Sprache im Microsoft-REL-Format erstellt wurde. Zum anderen als IRL-Datei, die vom CP/M Bibliotheksverwaltungsprogramm LIB-80 erzeugt wurde. Eine IRL-Datei enthält dieselben Informationen wie eine REL-Datei und außerdem einen zusätzlichen Index, mit dessen Hilfe Suchvorgänge in großen Bibliotheken erheblich beschleunigt werden können.
Nachdem LINK-80 alle Operationen erfolgreich abgeschlossen hat, sind folgende Informationen auf dem Bildschirm zu lesen:
Die Memory Map zeigt Größe und Anfangsadresse der verschiedenen Segmente. Der Use Factor spiegelt den von LINK-80 benötigten Speicher im Verhältnis zum gesamten freien Speicher als hexadezimale Prozentzahl wider.
LINK-80 schreibt die Symboltabelle in eine SYM-Datei, die vom CP/M Symbolic Instruction Debugger (SID) direkt verarbeitet werden kann. Die erzeugte COM- oder PRL-Datei ist unter CP/M oder MP/M II ausführbar.
Die allgemeine Kommandosyntax von LINK-80 lautet:
LINK dateiname1,dateiname2,...,dateinameN
Hierbei stehen ,,dateiname1,...,dateinameN`` für die Dateinamen der zu verbindenden Programmodule. Wird kein Dateityp angegeben, so geht LINK-80 automatisch von ,,REL`` aus.
Von LINK-80 werden zwei Dateien erstellt:
Ein anderer Dateiname für die COM- und SYM-Datei kann mit einem Kommando in folgender Form festgelegt werden:
LINK Neuerdateiname=dateiname1,dateiname2,...,dateinameN
Zur Steuerung der Linkoperationen stellt LINK-80 eine Reihe von Optionen zur Verfügung. Diese werden weiter unten beschrieben.
Während der Verarbeitung erzeugt LINK-80 bis zu acht temporäre Dateien auf dem Standardlaufwerk mit folgenden Dateinamen:
XXABS.$$$ XXPROG.$$$ XXDATA.$$$ XXCOMM.$$$
YYABS.$$$ YYPROG.$$$ YYDATA.$$$ YYCOMM.$$$
Nach erfolgreich abgeschlossener Verarbeitung werden diese Dateien von LINK-80 gelöscht. Mitunter kann es jedoch bei Auftreten eines Fehlers vorkommen, daß sie auf der Diskette verbleiben.
Reicht der Platz einer Kommandozeile (126 Zeichen) für ein LINK-80 Kommando nicht aus, besteht die Möglichkeit, die Zeile mit einem Ampersand (&) abzuschließen und das Kommando in der nächsten Zeile fortzusetzen. Das Ampersand kann auf ein beliebiges Zeichen folgen und muß nicht zwingend hinter einem Dateinamen stehen.
LINK-80 zeigt mit einem Asterix (*) in der nächsten Zeile die Bereitschaft an, wo das Kommando fortgesetzt werden kann. LINK-80 erlaubt eine beliebige Anzahl mit Ampersand abgeschlossener Zeilen. Die letzte Zeile des Kommandos wird mit <ENTER> abgeschlossen, wie im Beispiel zu erkennen ist.
A>LINK main, iomod1, iomod2, iomod3, iomod4, iomod5, &
LINK 1.31
*lib1[s], lib2[s], lib3[s], lib4&
*[s], lastmod[p.&
*,d200]
...
...
A>
Anstelle der Punkte erscheinen auf dem Bildschirm Symboltabelle, Memory Map usw.
In der Kommandozeile können diverse Optionen angegeben werden, die die Linkoperationen während der Laufzeit beeinflussen. Die LINK-80 Optionen werden in eckige Klammern eingeschlossen und durch Komma voneinander getrennt. In der Kommandozeile folgen sie direkt nach einem oder mehreren Dateinamen.
Mit Ausnahme der Option S können die Optionen hinter einem beliebigen Dateinamen stehen. Die Option S hingegen muß auf den Namen der Datei folgen, auf die sie sich bezieht. Ein Beispiel:
A>LINK test[l4000],iomod,testlib[s,nl,gstart]
Die Größe der von LINK-80 intern benutzten Puffer wird verringert, um zusätzlichen Platz für die Symboltabelle zu schaffen. Diese Option sollte nur dann benutzt werden, wenn dies unbedingt notwendig ist und durch die Fehlermeldung ,,MEMORY OVERFLOW`` (Speicherüberlauf) angezeigt wird. Durch die Option A wird LINK-80 veranlaßt, die internen Puffer auf Diskette auszulagern, was die Erstellung größerer Programme erlaubt, aber den Verarbeitungsprozeß erheblich verlangsamt.
Mit der Option B kann ein BIOS für gebankte CP/M 3 Systeme erstellt werden. LINK-80 legt dazu das Datensegment an die Seitengrenze und trägt die Länge des Codesegmentes im Dateiheader ein. Die erzeugte Datei ist vom Typ SPR.
Normalerweise werden die Daten- und allgemeinen Bereiche von LINK-80 unmittelbar nach dem Programmsegment plaziert. Mittels Option D kann man für die Daten- und allgemeinen Segmente eine andere Startadresse festlegen.
Die Syntax für die Option D lautet:
Dnnnn
wobei ,,nnnn`` die hexadezimale Startadresse ist.
Durch die Option G wird das Symbol bezeichnet, ab dem die Programmausführung beginnen soll, sofern nicht das erste Byte des Programmsegmentes der Programmbeginn ist. Die Option G veranlaßt LINK-80, auf der Ladeadresse einen Sprung zum Symbol einzufügen.
Die Syntax für die Option G lautet:
G<symbol>
(Die spitzen Klammern werden nicht eingegeben.)
Die Ladeadresse legt die Basisadresse der von LINK-80 erzeugten COM-Datei fest. Standardmäßig ist die Ladeadresse auf 100H (Basisadresse des TPA - Transient Program Area) festgelegt, so daß die erzeugten Programme unter einem standardmäßigen CP/M System lauffähig sind. Durch Benutzung der Option L wird auch die Startadresse des Programmsegmentes auf die angegebene Adresse gesetzt, sofern sie nicht durch die Option P definiert wurde.
Die Syntax für die Option L lautet:
Lnnnn
wobei ,,nnnn`` die hexadezimale Ladeadresse ist.
(COM-Dateien, deren Ladeadresse nicht 100H ist, können unter einem standardmäßigen CP/M System nicht ausgeführt werden.)
Mit der Option M wird bei der Erstellung einer PRL-Datei angezeigt, daß das Programm zur Ausführung zusätzlichen Datenspeicher benötigt.
Die Syntax für die Option M lautet:
Mnnnn
wobei ,,nnnn`` die Größe des zusätzlich benötigten Speichers (als Hexadezimalzahl) ist.
Wird die Option NL angegeben, so wird die Anzeige der Symboltabelle auf dem Bildschirm unterdrückt.
Durch Angabe der Option NR wird die Symboltabelle nicht in eine Datei auf Diskette geschrieben.
Die Option OC bewirkt, daß LINK-80 eine COM-Datei erstellt. Dies ist die Standardeinstellung.
Bei Angabe der Option OP wird anstelle der COM-Datei von LINK-80 eine PRL-Datei erzeugt. (Im Abschnitt 7.1 des MP/M II Operating System Programmer's Guide sind weitere Informationen zu PRL-Dateien zu finden.)
Mittels Option OR wird eine RSP-Datei (Resident System Process) erstellt, die unter MP/M ausgeführt werden kann.
Gibt man die Option OS an, dann wird eine SPR-Datei (System Page Relocatable) erstellt, die unter MP/M ausgeführt werden kann.
Normalerweise ist die Startadresse des Programmsegmentes auf 100H festgelegt, so daß das Programm unter einem standardmäßigen CP/M System ausgeführt werden kann. Durch die Option P kann eine andere Startadresse für den Programmbereich festgelegt werden.
Die Syntax der Option P lautet:
Pnnnn
wobei ,,nnnn`` die hexadezimale Startadresse ist.
In den Subroutinen vieler Laufzeitbibliotheken werden Symbole verwendet, die mit einem Fragezeichen (?) beginnen, um Konflikte mit anwenderseitigen Symbolen zu vermeiden. Von LINK-80 wird die Ausgabe dieser Symbole auf Bildschirm und Diskette normalerweise unterdrückt.
Die Angabe der Option Q veranlaßt LINK-80 auch diese Symbole in die Symboltabelle aufzunehmen, so daß sie im Bildschirmlisting und in der Datei erscheinen.
Mit der Option S wird angezeigt, daß es sich bei der bezeichneten Datei um eine Bibliothek handelt. LINK-80 durchsucht die Bibliothek(en) nach Symbolen und Referenzen, die in bereits gelinkten Modulen definiert, aber nicht gefunden wurden. Die entsprechenden Module aus der/den Bibliotheken werden in das Programm eingefügt.
Über die Option $ werden die Ein- und Ausgabeoperationen von LINK-80 gesteuert. Die allgemeine Form der Option $ lautet:
$td
Dabei bezeichnet ,,t`` den Typ und ,,d`` das Laufwerk.
LINK-80 unterscheidet fünf Typen:
Für die Laufwerksbezeichnung kann ein Buchstabe zwischen A und P angegeben werden, mit dem das entsprechende logische Laufwerk ausgewählt wird. Darüberhinaus stehen folgende spezielle Zeichen zur Verfügung:
$Cd - Konsolemeldungen: Im Normalfall werden alle Meldungen von LINK-80 auf der Konsole (Bildschirm) ausgegeben. Durch Angabe der Option $CY können sie jedoch auf den Drucker umgelenkt oder mittels $CZ unterdrückt werden. Nachdem die Einstellung durch $CY oder $CZ geändert wurde, kann man die Ausgabe durch ein späteres $CX wieder zur Konsole umleiten.
$Id - Zwischencode: Standardmäßig legt LINK-80 alle Arbeitsdateien auf dem aktuellen Laufwerk an. Mit der Option $Id kann ein anderes Laufwerk bestimmt werden.
$Ld - Bibliothek: Enthält eine REL-Datei Symbole oder Referenzen, deren Module automatisch aus Bibliotheken eingefügt werden, so sucht LINK-80 standardmäßig auf dem aktuellen Laufwerk nach den Bibliotheksdateien. Die Option $Ld veranlaßt LINK-80 auf dem angegebenen Laufwerk nach den Bibliotheksdateien zu suchen.
$Od - Ausgabedatei: Wird in der Kommandozeile kein Laufwerk für die Ausgabedatei (COM, PRL, RSP oder SPR) angegeben, so legt LINK-80 sie auf dem Laufwerk an, von dem die erste REL-Datei geladen wurde. Mit der Option $Od wird die Ausgabe auf das bezeichnete Laufwerk veranlaßt. Neben den Buchstaben von A bis P für die logischen Laufwerke kann auch ein Z als Bezeichnung angegeben werden. Dadurch wird die Erstellung einer Ausgabedatei unterdrückt.
$Sd - Symboltabelle: Ebenso wie die Ausgabedatei wird auch die Symboltabelle auf dem Laufwerk der ersten REL-Datei erstellt, sofern in der Kommandozeile keine andere Festlegung getroffen wurde. Bei Angabe der Option $Sd wird die Symboltabellendatei auf dem bezeichneten Laufwerk (A bis P) erstellt. Darüberhinaus kann die Ausgabe der Symboltabelle mit der Option $SY auf den Drucker umgelenkt oder mit der Option $SZ unterdrückt werden.
Die Optionen zur Ein-/Ausgabesteuerung - allgemeine Form $td - müssen untereinander nicht durch Komma getrennt werden. Eine Gruppe von Optionen zur Ein-/Ausgabesteuerung muß jedoch von anderen Optionen durch Komma getrennt werden. Das folgende Beispiel soll die Wirkungsweise veranschaulichen:
A>LINK teil1[$sz,$od,$lb,q],teil2
A>LINK teil1[$szodlb,q],teil2
A>LINK teil1[$sz od lb],teil2[q]
Die Funktionsweise der drei Kommandozeilen ist identisch.
Eine Option $I, mit der das Laufwerk für die Arbeitsdateien bestimmt wird, bezieht sich auf die gesamte Operation. Alle anderen Optionen zur Ein-/Ausgabesteuerung hingegen wirken sich bis zur nächsten Option - in der Kommandozeile von links nach rechts gesehen - desselben Typs auf die Datei(en) aus, d. h. diese Option verändert die Funktionsweise dann bis zum nächsten Auftreten dieses Optionstyps. Insbesondere bei der Verarbeitung von Overlays kann diese Eigenschaft sehr hilfreich sein:
A>LINK root (ov1[$szcz])(ov2)(ov3)(ov4[$sacx])
In diesem Beispiel würden die Ausgabe der Symboltabelle und der Konsolemeldungen während der Verarbeitung der Overlays OV1, OV2 und OV3 unterdrückt werden. Hingegen würden bei der Verarbeitung der Overlaydatei OV4 hingegen die Symboltabelle in eine Datei auf Laufwerk A geschrieben und die Konsolemeldungen ausgegeben werden.
Erkennt LINK-80 einen Fehler im Kommando, so wird die Kommandozeile bis zum fehlerverursachenden Zeichen mit einem anschließenden Fragezeichen ausgegeben:
A>LINK a, b, c; d
A, B, C;?
A>LINK langerdateiname
LANGERDAT?
Tritt während der Verarbeitung ein Fehler auf, so gibt LINK-80 eine entsprechende Fehlermeldung aus. Diese und die möglichen Ursachen werden nachfolgend erläutert.