In der PC AMSTRAD INTERNATIONAL 3/87" wurde der folgende Artikel abgedruckt.
Ein Z80 Assembler geschrieben in Mallard-BASIC speziell für Basic DATA -Zeilen.
|
|
Joyce Z80-Assembler
Bislang sind Joyce-Besitzer weitgehend von Listings mit umfangreichen Maschinencode-Datawüsten verschont geblieben, doch das kann sich jetzt schnell ändern.
Der Joyce Z80-Assembler wurde speziell für die Zusammenarbeit mit Mallard-BASIC entwickelt.
Er beherrscht neben allen gängigen Assemblerdirektiven den vollen Z80-Befehlssatz, assembliert einen beliebig langen Quellcode direkt von Diskette und verwandelt das fertige Maschinenprogramm bei Bedarf in besagte DATA
-Zeilen.
Hinweise zum Abtippen:
Die Kommentarzeilen können entfallen, da sie keine Sprungziele darstellen.
Wichtig ist, daß insbesondere im Initialisierungsteil in den Befehls- und Registertabellen alle Leerzeichen korrekt mit eingegeben werden.
Die Eingabe des Quellcodes:
Das Quellprogramm muß als ASCII-Textfile auf Diskette vorliegen.
Es kann im Prinzip mit jedem Editor erstellt werden, wobei Groß- und Kleinschreibung erlaubt ist.
Auch der BASIC-Zeileneditor ist zur Eingabe oder Korrektur geeignet, das Programm wird dann mit
SAVE "Name",a
abgespeichert.
In einigen Fällen kann allerdings der Interpreter nicht der Versuchung widerstehen, auch noch seinen Senf hinzuzugeben!
Z.B. werden Binärzahlen wie
%11001100
durch ein nachgestelltes
#
als Realwert mit doppelter Genauigkeit markiert.
Das ist natürlich unerwünscht und führt bei der Assemblierung zu Fehlern.
Ein sicheres Gegenmittel stellt jedoch ein
REM
-Apostroph dar, der vom Assembler überlesen wird.
Die Eingabe erfolgt dann so:
10 'START LD A,(HL) ;Akku laden
Die Syntax:
Eine Zeile des Quellprogramms setzt sich aus folgenden Elementen zusammen:
- - - - - |
Zeilennummer Label Befehl Operand Kommentar |
Zu Beginn muß auf jeden Fall eine Zeilennummer im Bereich 1...32767 stehen.
Ein Label ist ein Name, der Zeilen als Sprungziele markiert und die relative oder absolute Adresse ersetzt.
Der Assembler merkt sich den Wert in einer Labeltabelle und baut ihn korrekt in das Maschinenprogramm ein.
Labels müssen mit einem Buchstaben beginnen und können maximal sechs Zeichen lang sein, der Rest wird erbarmungslos abgeschnitten.
Natürlich darf kein gültiges Befehlswort oder eine Registerbezeichnung wie HL als Name verwendet werden.
Zeilennummer, Label, Befehl und Operand müssen durch mindestens ein Leerzeichen getrennt sein.
Der Operand selbst darf auf keinen Fall Leerzeichen enthalten (außer als ASCII-Zeichen zwischen Anführungsstrichen)!
Falsch wäre z.B.
10 LD A,( HL )
Im Operanden können Werte in folgender Form auftauchen:
- binär durch ein vorangestelltes "
%
"
- oktal durch ein vorangestelltes "
&
"
- hexadezimal durch ein vorangestelltes "
#
" oder auch "
&H
"
- dezimal
- als ASCII-Zeichen (nur 1-Byte-Werte)
- als Label (nur 2-Byte-Werte)
Diese Beispiele addieren alle den Wert 48 zum Akkuinhalt:
10 ADD A,%110000
10 ADD A,#30
10 ADD A,48
10 ADD A,"0"
Bei Dezimalzahlen akzeptiert der Assembler auch negative Werte, die automatisch ins Zweierkomplement umgerechnet werden.
Der erlaubte Bereich ist also 0...255 (-128...127) bei 1-Byte-Werten und 0...65535 (-32768...32767) bei 2-Byte-Werten.
Der Offset bei indizierter Adressierung
(IX+Offset)
bzw.
(IX-Offset)
wird dezimal mit Vorzeichen angegeben.
Das Ziel bei relativen Sprüngen (
JR
,
DJNZ
) wird durch eine absolute Adresse (2-Byte-Wert oder Label) bestimmt;
der Assembler berechnet daraus automatisch die Sprungdistanz.
Auf Restart-Befehle muß die zugehörige Adresse folgen (z.B.
RST #18
).
ASCII-Zeichen werden grundsätzlich durch Anführungsstriche eingeschlossen.
Am Ende einer Quellprogrammzeile kann ein durch Semikolon abgetrennter Kommentar stehen.
Er wird bei der Assemblierung nicht weiter berücksichtigt.
Die Assemblerdirektiven:
Das sind Anweisungen, die nicht zum Z80-Befehlssatz gehören, sondern direkt vom Assembler ausgeführt werden.
Der Joyce Z80-Assembler versteht folgende Kommandos:
- ORG <Adresse>
Bestimmt die Startadresse des Maschinenprogramms.
Falls eine
ORG
-Anweisung fehlt, so setzt der Assembler
#F000
als Beginn.
Der Speicherbereich für den Objektcode wird durch eine entsprechende
MEMORY
-Anweisung automatisch geschützt.
Die Speicherobergrenze
(HIMEM
) liegt etwa bei
xF500
.
Diese Grenze sollte man auf keinen Fall mit einem Maschinenprogramm überschreiten, da sonst wichtige Teile des Betriebssystems überschrieben werden.
- <Label> EQU <Wert>
Weist einem Label einen Zahlenwert zu (nur 2-Byte-Werte).
- DB <Liste von 1-Byte-Werten>
Schreibt die angegebenen Bytes ins Maschinenprogramm.
Die Werte werden durch Komma getrennt.
Beispiel:
100 DB "z",#FF,0
- DW <Liste von 2-Byte-Werten>
Die angegebenen Werte werden ins Programm geschrieben.
Beispiel:
100 DW #A000,LABEL1,-10000
- DS <Speicherplatz in Bytes>
Reserviert einen Speicherbereich mit der angegebenen Länge für Variablen bzw. Tabellen.
- DM <"Text">
Erlaubt die Eingabe von Zeichenketten in das Maschinenprogramm.
Der Text muß in Anführungsstriche eingeschlossen sein.
Beispiel:
100 DM "CPC International"
-END
Bezeichnet das Ende des Quellprogramms.
In den meisten Fällen ist dieses Kommando überflüssig:
Falls keine END
-Anweisung erfolgt, übersetzt der Assembler bis zum Ende des Files.
Start des Assemblers:
Nach dem Programmstart wird zunächst nach dem Dateinamen des Quellcodes gefragt.
Wenn Sie hier nur <RETURN>
drücken, so erscheint das Inhaltsverzeichnis der Diskette, und die Frage wird wiederholt.
Anschließend erstellt der Assembler auf dem Bildschirm oder Drucker während der Übersetzung ein Listing des Quellprogramms.
Bei der Verwendung von Labels ist hierbei eine Besonderheit zu beachten:
Trifft der Assembler auf ein Label, das erst zu einem späteren Zeitpunkt definiert wird (bei Vorwärtssprüngen), so kann er den Maschinencode im Listing noch nicht vollständig angeben und setzt provisorisch Nullbytes ein.
Diese Zeilen sind durch einen Stern (*) gekennzeichnet.
Nach Abschluß der Übersetzung steht das Maschinenprogramm trotzdem lauffähig im Speicher, da die fehlenden Werte nachträglich eingesetzt werden.
Falls ein vollständiges Listing des Objektcodes erforderlich ist, kann ein zweiter Durchlauf (Pass) gestartet werden, bei dem der Assembler über die komplette Labeltabelle verfügt.
Fehlermeldungen:
Wurde ein Label im Programm benutzt, aber nicht definiert, so erfolgt nach Abschluß der Übersetzung eine Meldung.
Die Fehlermeldungen während der Assemblierung erscheinen in Deutsch und erklären sich weitgehend selbst.
Im Unterschied zum BASIC-Interpreter bricht der Assembler nach einer Fehlermeldung nicht ab.
Dadurch können zunächst alle in einem Programm enthaltenen Fehler ermittelt werden, ohne daß jedesmal ein Neustart notwendig wird.
Aufzeichnung:
Nach der Assemblierung kann der Maschinencode unter dem zu Beginn angegebenen Namen mit dem Zusatz .BLD
als BASIC-Lader gespeichert werden;
der Assembler übernimmt automatisch die Generierung der DATA
-Zeilen.
Dabei können Sie die Anfangszeilennummer und den Zeilennummernabstand frei wählen, so daß sich das Maschinenprogramm ohne Probleme mit MERGE
in andere Programme integrieren läßt.
Weitere Hinweise:
In der nächsten Ausgabe von PC International wird noch ein Anwendungsbeispiel mit Quellcode-Listing folgen, das unter Mallard-BASIC eine Software-Uhr zur Verfügung stellt.
(M.Uphoff/M.Schlöter)
Der Quelltext des Assemblers findet sich hier.
Eingescanned von
Werner Cirsovius
Juli 2003
© DMV-Verlag