###   Projekte und Informationen rund um den KC85   ### 

Beschreibung LINK v1.31

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

Einleitung

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:

  • Symboltabelle
  • alle nicht aufgelösten Symbole
  • Memory Map (Speicherbelegung)
  • Use-Factor (Auslastung)

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.

LINK-80 Operationen

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:

  • dateiname1.COM
  • dateiname1.SYM

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.

Mehrfachzeilen-Kommandos

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.

LINK-80 Optionen

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]

Option A - zusätzlicher Speicher für Symboltabelle:

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.

Option B - BIOS einbinden:

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.

Option D - Startadresse Daten- und allgemeiner Bereich:

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.

Option G - Startadresse festlegen:

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.)

Option L - Ladeadresse festlegen:

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.)

Option M - Speichergröße:

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.

Option NL - kein Listing der Symboltabelle:

Wird die Option NL angegeben, so wird die Anzeige der Symboltabelle auf dem Bildschirm unterdrückt.

Option NR - keine Symboltabelle:

Durch Angabe der Option NR wird die Symboltabelle nicht in eine Datei auf Diskette geschrieben.

Option OC - COM-Datei erstellen (Standard):

Die Option OC bewirkt, daß LINK-80 eine COM-Datei erstellt. Dies ist die Standardeinstellung.

Option OP - PRL-Datei erstellen:

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.)

Option OR - RSP-Datei erstellen:

Mittels Option OR wird eine RSP-Datei (Resident System Process) erstellt, die unter MP/M ausgeführt werden kann.

Option OS - SPR-Datei erstellen:

Gibt man die Option OS an, dann wird eine SPR-Datei (System Page Relocatable) erstellt, die unter MP/M ausgeführt werden kann.

Option P - Startadresse Programmbereich:

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.

Option Q - Symbole mit Fragezeichen:

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.

Option S - Bibliothek durchsuchen:

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.

Option $ - Ein- und Ausgabesteuerung:

Ü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:

C
- Konsole
I
- Zwischencode
L
- Bibliothek
O
- Ausgabedatei
S
- Symboltabelle

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:

X
- Konsole
Y
- Drucker
Z
- keine Ausgabe

$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.

Spezifikationen für die Kommandozeile

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.

LINK-80 Fehlermeldungen

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.

CANNOT CLOSE
Eine Datei, die auf Diskette erstellt werden soll, kann nicht geschrieben werden. Möglicherweise ist die Diskette schreibgeschützt.

COMMON ERROR
Es erfolgte ein Bezug auf einen nicht definierten allgemeinen Block.

DIRECTORY FULL
Im Verzeichnis der Diskette ist nicht mehr genügend Platz, um die Ausgabe- oder Arbeitsdateien einzutragen.

DISK READ ERROR
Eine Datei kann nicht fehlerfrei von Diskette gelesen werden.

DISK WRITE ERROR
Eine Datei kann nicht fehlerfrei auf Diskette geschrieben werden. Möglicherweise ist die Diskette voll.

FIRST COMMON NOT LARGEST
Eine spätere Anweisung definiert einen allgemeinen Block größer als die erste Anweisung dies für den bezeichneten Block tat. Eventuell wurde eine falsche Reihenfolge der zu verarbeitenden Dateien angegeben oder die Bibliotheksmodule stehen nicht in der richtigen Reihenfolge.

INDEX ERROR
Der Index einer IRL-Datei enthält fehlerhafte Informationen.

INSUFFICIENT MEMORY
Es steht für LINK-80 nicht genügend Speicher für das Anlegen der Puffer zur Verfügung. Vielleicht schafft die Option A in diesem Fall Abhilfe.

INVALID REL FILE
Die bezeichnete Datei enthält ein fehlerhaftes Bit-Muster. Möglicherweise ist die angegebene Datei gar keine REL- oder IRL-Datei.

MAIN MODULE ERROR
LINK-80 ist auf ein zweites Hauptmodul gestoßen.

MEMORY OVERFLOW
Der verfügbare Arbeitsspeicher reicht für den Abschluß der Verarbeitung nicht aus. Vielleicht schafft die Option A in diesem Fall Abhilfe.

MULTIPLE DEFINITION
Das angezeigte Symbol wurde in mehr als einem der zu verarbeitenden Module definiert.

NO FILE
Die bezeichnete Datei konnte nicht gefunden werden.

OVERLAPPING SEGMENTS
LINK-80 hat versucht, ein Segment in einen Speicherbereich zu schreiben, der bereits von einem anderen Segment belegt ist. Wahrscheinlich wurde dieser Fehler durch falsche Werte der Optionen P und/oder D verursacht.

UNDEFINED START SYMBOL
Mit der Option G wurde ein Symbol bezeichnet, das in keinem Modul definiert ist.

UNDEFINED SYMBOLS
Alle nach dieser Meldung angezeigten Symbole wurden zwar benutzt bzw. darauf Bezug genommen, jedoch sind sie in keinem der verarbeiteten Module definiert.

UNRECOGNIZED ITEM
Ein unbekanntes Bit-Muster wurde von LINK-80 erkannt und ignoriert.