SYSLIB und ASM/LINK
von Mario Leubner und Jörg Linder
Ich hoffe ja, daß ich nicht der einzige bin, der sich an den Funktionen der SYSLIB versucht hat, die Jörg Linder in den KC-News 1/96 im Zusammenhang mit seinem Konvertierungsprogramm UNIKON vorgestellt hat. Es gibt nämlich Probleme, wenn nicht mit dem Assembler und Linker von SLR gearbeitet wird.
Die meisten verwenden sicher den Assembler M80.COM und den Linker L80.COM bzw. die robotron-Versionen ASM.COM und LINK.COM. Für alle, die es nicht geschafft haben, mit Hilfe der SYSLIB das Programm UNIKON10.COM zu erzeugen, möchte ich mal aufzeigen was es alles zu beachten gibt.
Als erstes probierte ich es mit den Kommandos, die für M80 angegeben waren. Also
A>ASM =UNIKON10/R/Z
eingetippt und die einzige Reaktion war:
?File not found.
Natürlich war mir sofort klar, daß ASM.COM nach einer Datei UNIKON10.MAC gesucht hat und nicht nach UNIKON10.Z80. Also der zweite Versuch mit
A>ASM =UNIKON10.Z80/R/Z
Die Datei wurde gefunden, aber zwei Befehlszeilen werden beanstandet, die wie folgt zu ändern sind:
add 9 zu add a,9
add a zu add a,a
ASM.COM verlangt bei der Addition und Subtraktion die vollständige Angabe, auch wenn es immer das Register A sein kann. Der dritte Versuch glückte und zeigte 'No fatal error(s)' an.
So weit so gut, nun muß noch der Linker von der SYSLIB überzeugt werden. Also zunächst mal die Befehlszeile aus den KC-News abgetippt und abgewartet, was passiert:
A>LINK UNIKON10,SYSLIB/S,UNIKON10/N/E LINK 1520(SCPX) V1.0 Data 0103 09E1 < 2270> -FI0$CLO 041B -FI0$OPE 0389 -FO$CLO 0428 -FO0$OPE 0391 -LUCLOSE 03E7 5 Undefined Global(s) 38202 Bytes Free [0000 09E1 9]
Der Linker konnte 5 der 10 externen Funktionen nicht in der SYSLIB finden. Was auffällt: Statt nach der Funktion FI0$CLOSE zu suchen, wird nur FI0$CLO angezeigt. Der Assembler hat also nicht den gesamten Funktionsnamen übergeben, wenn dieser länger als 7 Zeichen ist. Aber auch die Funktion LUCLOSE wurde nicht gefunden, obwohl der Name scheinbar vollständig erscheint. An dieser Stelle mußte ich erst mal im Handbuch vom Assembler nachlesen und fand folgendes:
"Bei allen externen Symbolnamen werden nur die ersten 6 Zeichen an den Programmverbinder übergeben. Zusätzliche Zeichen werden intern abgeschnitten."
Ganz scheint dies allerdings auch nicht zu stimmen, denn immerhin kennt der Linker noch 7 Zeichen!? Jedenfalls habe ich im Quelltext UNIKON10.Z80 alle externen Bezüge auf 6 Zeichen verkürzt, also z.B. FI0$CL geschrieben, wenn vorher FI0$CLOSE stand. Dabei auch die Aufrufstellen mit beachten!
Außerdem fällt noch auf, daß der ausgegebene Adreßbereich bei 103H beginnt. Dies liegt noch daran, daß LINK.COM den Code standardmäßig ab 103H ablegt, um vorher einen Sprungbefehl zum Programmstart eintragen zu können. Wenn im ersten oder einzigen Modul die Startadresse direkt am Programmanfang liegt, kann man ab 100H linken. Dies muß dem Linker aber mit dem Schalter /P angegeben werden. Die Kommandozeilen sehen damit endgültig so aus:
A>ASM =UNIKON10.Z80/R/Z A>LINK /P:100,UNIKON10,SYSLIB/S,UNIKON10/N/E
Damit funktionierte die Übersetzung mit Einbeziehung der SYSLIB. Ein Vergleich meiner Datei UNIKON10.COM mit der von Jörg Linder ergab immer noch Unterschiede. Dies kann nur noch daran liegen, daß die beiden SYSLIB-Varianten (SYSLIB.REL für M80, SYSLIBS.REL für SLR) doch nicht ganz identisch sind. Beide Programme funktionieren aber - darauf kommt es an!
Ich hoffe, ich konnte mit der Weitergabe meiner Erfahrungen eine kleine Hilfe bei der Fehlersuche geben. Die SYSLIB ist wirklich eine prima Sache, da man viele der immer wieder benötigten Routinen einfach nutzen kann. In diesem Sinne wünsche ich Euch viel Spaß beim weiteren Untersuchen der SYSLIB.
Mario Leubner
Ergänzungen
An dieser Stelle möchte ich mich als Verursacher dieser Probleme nochmal zu Wort melden. Mit Bedacht hatte ich für die M80/L80-Befehlszeilen das Wort "müßten" gewählt. Da ich weder Erfahrung mit diesen Programmen noch mit den zahllosen umbenannten robotron-Clones habe, konnte ich keine Gewähr für fehlerfreies Funktionieren übernehmen.
Für die Änderungen in Bezug auf die ADD-Befehle muß ich mich entschuldigen, möchte aber dazu einen Auszug aus dem Handbuch des SLR-Assemblers wiedergeben:
"Um eine einfache Handhabung zu gewährleisten, erlaubt SLR180 bei 8-Bit Operationen sowohl eine kurze als auch eine lange Schreibweise. Zum Beispiel wird laut Zilog Mnemonik "ADD A,5" geschrieben, um 5 zum Akkumulatorinhalt zu addieren - logisch. Um mit dem Carry-Bit zu addieren, schreibt man "ADC A,5" - immer noch logisch. Ebenso verhält es sich bei der Subtraktion mit Carry-Bit. Ohne Carry-Bit ist das aber anders. Dann wird "SUB 5" geschrieben.
Das ist doch nicht konsequent! Und dann soll man sich auch noch merken, welche Form gerade die richtige ist. SLR180 vermindert die Fehlermöglichkeiten hierbei, indem beide Formen für alle 8-Bit Operationen akzeptiert werden."
Ohne mich jetzt allzu negativ über eine Firma äußern zu wollen, deren Abkürzung ebenso lautet wie die einer ganz schlimmen Krankheit, muß ich sagen, daß die Linkerprobleme wohl eher dem Format der REL-Dateien anzulasten sind als der SYSLIB. Wenn der Linker intern alle weiteren Zeichen "abschneidet", warum dann nicht überall - dann müßte es nämlich wieder funktionieren. Über die Anzahl der verwendeten Zeichen (6 oder 7) haben auch die klugen Köpfe von SLR-Systems gegrübelt. Offiziell sind es nur 6, vermutlich wegen Kompatibilität zu FORTRAN. Doch in Wirklichkeit werden, wie von Mario beobachtet, 7 Zeichen verwendet.
Allerdings wird dieses Geheimnis wie auch viele andere aus dem Hause Microsoft wohl niemals gelüftet werden. Vielleicht, weil es dort auch niemand weiß!?
Jörg Linder