18.4.1993 Z80 Crossassembler V1.0 Copyright Jürgen Eder Hermann-Hesse-Weg 7 W-7316 Köngen (neue Postleitzahl: 73257 Köngen) Auf dieser Diskette befindet sich nur eine DEMO-Version. Das heißt: Es können nur Z80-Programme mit max. 50 Quellcode-Zeilen assembliert werden, alle anderen Funktionen sind in keinster Weise beeinträchtigt. Sie können also den Crossassembler vor dem Kauf zunächst testen. Wenn Sie die Vollversion möchten, schicken Sie bitte 30.- DM (z.B. per Verrechnungsscheck) an obige Adresse. Sie bekommen dann umgehend: - Die aktuelle Vollversion - Die ausgedruckte Anleitung (Rücksendeadresse bitte nicht vergessen !!!) Anleitung: 1.0 Hard- und Softwareanforderung: Hardwareanforderung: 512 k RAM, Diskettenlaufwerk Softwareanforderung: Amiga-OS 2.04 ASCII-Editor Bemerkung: Der Assembler sollte auch unter Amiga-OS 1.2 und 1.3 funktionieren, wenn er im CLI aufgerufen wird. (siehe "Aufruf des Assemblers") 1.1 Installation: Zur Installation klicken Sie das Verzeichnis Z80 an und schieben es dorthin, wo Sie es haben wollen. (Drag- und Drop-Prinzip). Wenn Sie das Icon über dem Ziel wieder los- lassen, wird der Assembler kopiert. (Anmerkung: Siehe auch Anleitung zum Amiga: "Kopieren von Verzeichnissen") Selbstverständlich kann auch die Originaldiskette bzw. die Sicherheitskopie zum Arbeiten verwendet werden. Bei Installation auf eine Diskette, ist es am besten, wenn Sie sich die Workbench-Diskette zuerst kopieren und dann nicht benötigte Dateien von dieser Diskette löschen (z.B. Zeichensätze...) um Platz zu schaffen. Dann braucht nur noch das Verzeichnis Z80 auf diese 'Arbeitsdiskette' ko- piert werden. (Vorgehen siehe oben) 1.2 Aufruf des Assemblers 1.2.1 Aufruf aus dem CLI Der Assembler wird durch Angabe des Programmnamens "Z80Ass" und der Parameter aufgerufen. Folgende Syntax muß dabei eingehalten werden: Z80Ass [-behl?] Quellendateiname Die Angaben in der rechteckigen Klammer müssen nur mit an gegeben werden, wenn eine Ausgabe erwünscht wird. Fehlen diese Angaben erfolgt keine Ausgabe. Es wird dann zwar der Assembler gestartet und die Quellendatei geladen aber der Quelltext wird nur auf Fehler überprüft und gegebenenfalls wird eine Fehlerdatei erzeugt. Fehlt auch die Angabe "Quellendateiname" so wird automatisch versucht ein Window auf der Workbench zu öffnen. Das weitere Vorgehen ist dann wie beim Aufruf von der Workbench. Das Ausgabeformat kann durch setzen verschiedener 'Schalter' angegeben werden. (Das Minuszeichen muß dann ebenfalls eingegeben werden!) Erklärung der Schalter: - ? Beschreibung aller möglichen Flags des Assemblers beim Aufruf. - b Es wird eine Binärdatei generiert. Diese Datei enthält den Maschinencode Ihres Programms. Der Dateiname ist derselbe wie der Name des Quellcodes, nur mit der Erweiterung ".bin". - e Es wird eine Epromdatei generiert. Diese Datei enthält den Maschinencode Ihres Programms und kann dann mit einem EPROM-Programmiergerät weiterverarbeitet werden. Der Da- teiname ist derselbe wie der Name des Quellcodes, nur mit der Erweiterung ".epr". - h Es wird eine Hexdatei generiert. Der Dateiname ist der selbe wie der Name des Quellcodes, nur mit der Erweiterung ".hex". Diese Datei enthält Ihr eingebenes Programm eben falls als Maschinencode. Aber der Aufbau ist anders als bei einer Binärdatei. Der Maschinencode ist hier erstens Hexadezimal im ASCII Code abgespeichert, und zweitens steht am Anfang jeder Zeile die 16-Bit Adresse, an der die Daten dann nachher stehen sollen. - l Es wird ein Listing generiert. Der Dateiname ist derselbe wie der Name des Quellcodes, nur mit der Erweiterung ".lst". Außerdem wird noch eine Symboltabelle generiert mit der Erweiterung ".sym". Bemerkung: Der Aufruf aus einer Shell (CLI) funktioniert auch unter Betriebssystemen kleiner als 2.04 solange nicht versucht wird das Window zu öffnen. Das heißt: der Aufruf des As- semblers ohne jegliche Parameter funktioniert erst ab OS-2.04. Beispiel: Z80Ass -lb Z80Test.asm Assembliert die Quellendatei "Z80Test.asm" und erzeugt ein Listing, eine Symboltabelle und eine Binärdatei. Z80Ass ? oder Z80Ass -? Test.asm Es wird eine kurze Erklärung zur Aufrufkonvention des As- sembler ausgegeben. Der Assemblerlauf wird nicht gestar- tet! Z80Ass Ab Amiga-OS 2.04 wird ein Window geöffnet, in dem Sie dann alle Eingaben komfortabel mit der Maus erledigen können. 1.2.2 Aufruf von der Workbench (ab Amiga-OS 2.04) Das Programm wird mit einem Doppelklick auf das Icon ge- startet und öffnet dann ein Window in dem alle notwendigen Einstellungen ganz einfach und komfortabel durch Anklicken der entsprechenden "Schalter" ein- und ausgeschaltet wer- den können. Sie entsprechen den Schaltern, die auch beim Aufruf aus dem CLI mit angegeben werden können und sind im Abschnitt 1.2.1 bereits erklärt worden. Durch den Menüpunkt "Projekt->Laden" kann die Quellendatei einfach durch Anklicken ausgewählt werden. Gestartet wird der Assembler dann durch Anklicken von "Start". 1.3 Zeilensyntax und Eingabeformat Die Quellendatei ist eine normale Textdatei, die mit jedem beliebigen Texteditor erzeugt werden kann. Die einzige Be- dingung ist, das der Editor die Ausgabedatei im ASCII-Code schreiben kann. (z.B.: Ed, der mit Amiga-OS 2.04 mitgelie- fert wird) Es wird die offizielle Z80-Mnemonik-Schreibweise unter stützt. Um die Assemblerbefehle des Z80 zu erlernen ver- wenden Sie bitte anderweitige Literatur zum Z80 bzw. sehen Sie sich das Programm "Z80-Hilfe" an. In diesem Programm werden alle Befehle des Z80 kurz erklärt. Aufbau einer typischen Assemblerzeile: [Label[:]] Z80-Befehl [Parameter1,Paramter2] [;Kommentar] Beispiel: Loop: LD A,B ;eine Beispielzeile Bemerkungen: - Die Zeilenlänge darf in der Version 1.0 die Länge von 255 Zeichen NICHT überschreiten ! - Bei Befehle mit ZWEI Parameter dürfen zwischen den Parametern KEINE Leerzeichen stehen! - Der Z80 kennt auch ein Register AF` (gesprochen: AF gestrichen). Das '`' befindet sich auf den deutschen Tastaturen über der Tabulator-Taste. 1.4 Ausdrücke 1.4.1 Symbolsyntax Ein Label beginnt mit einem Buchstabe oder einem Unter strich, die weitere Zeichenfolge ist dann beliebig. Ein Label kann beliebig lang sein, alle Zeichen sind dabei si- gnifikant zur Unterscheidung. Die Groß- und Kleinschrei- bung ist dabei gleichwertig. d.h.: Loop oder loOP bezeich- nen dieselbe Variable. Bemerkung: Variable dürfen nicht nach Z80-Befehle, oder den Direkti- ven benannt werden. Außerdem wird eine Variable Namens "PC" als Synonym für den "Programmcounter" verwendet. Der Zähler hat als aktuellen Wert immer den Counterinhalt, der am Beginn der aktuellen Zeile gültig war. Das gilt auch für die Direktiven. Insbesondere bei DB- und DW-Direktiven wird der Counter innerhalb einer Zeile nicht weiterge- zählt, sondern er hat konstant den Wert, den er am Anfang dieser Zeile hatte! 1.4.2 Rechenregeln Wenn z.B. Zahlen als Parameter verwendet werden, kann durch Anhängen eines Buchstabens das Zahlensystem angege- ben werden. Fehlt diese Angabe, wird das Dezimalsystem vorausgesetzt. Folgende Systeme können definiert werden: D oder kein Buchstabe : Dezimalzahl O : Oktalzahl H : Hexadezimalzahl B : Dualzahl Beispiel: 4dh ist eine Hexadezimalzahl, 10 oder 10d ist eine Dezi- malzahl, 10011b ist eine Dualzahl usw.. Weiterhin kann ein String als Folge von ASCII-Codes nach z.B. DB-Direktiven in doppelten Hochkommas angegeben wer- den. z.B. DB "Das ist ein String" ist eine gültige Zeile. Der Inhalt wird in die entsprechenden ASCII-Codes umgewan- delt. Außerdem kann statt einer Zahl auch EIN Zeichen in einfachen Hochkommas verwendet werden. (auf deutschen Ta- staturen ALT + ä) Der ASCII-Code dieses Zeichen wird dann behandelt wie eine Zahl. Man kann damit auch rechnen. Also 'a'+3*'j' ist ebenfalls ein gültiger Ausdruck. Bemerkung: Als Zahlen werden nur Zeichenketten erkannt, die auch mit einer Ziffer beginnen. Wenn also z.B. eine Hexadezimale Zahl F0H irgendwo in Ihrem Quellcode auftaucht, wird sie als Variable interpretiert, da das erste Zeichen ein Buch- stabe ist. In solchen Fällen muß eine "0" (Null) vorange- stellt werden. Hier in diesem Beispiel muß es dann also heißen: 0F0H. Der Assembler versteht die Grundrechenarten: Addition, Subtraktion, Multiplikation und Division außerdem weitere mathematische und logische Ausdrücke (siehe unten). Eine Formel wird nach Priorität ausgewertet, also die normale Punkt vor Strich Regelung. Durch Klammerung kann diese Re- gelung umgangen werden. Da aber eine normale runde Klammer '(' bzw. ')' bei manchen Befehlen für die indirekte Adres- sierungsart verwendet wird, sollte statt dessen in diesen Fällen die eckige Klammer verwendet werden, also '[' bzw. ']'. Um die Lesbarkeit eines Programmes zu erhöhen kann aber auch die eckige Klammer grundsätzlich immer verwendet werden. Der Assembler versteht beides. Beispiel: ld A,4*[3+2] oder ld B,'F'+3*2 usw. Hier die Auflistung aller mathematischen Ausdrücke, die der Assembler versteht. Sie ist nach der Priorität der einzelnen Operatoren sortiert. Die höchste Priorität hat der erste Operator in der Liste (Vorzeichen Plus). Die niedrigste Priorität hat der letzte Operator (Addition). Operator Bedeutung + Vorzeichen: Plus - Vorzeichen: Minus ~ Bitweises Negat < Low-Byte eines 16-Bit-Wertes (als Ergebnis bekommt man einen 8 Bit Wert) > High-Byte eines 16-Bit-Wertes (als Ergebnis bekommt man einen 8 Bit Wert) & Bitweises UND | Bitweises ODER ^ Potenzieren / Division * Multiplikation - Subtraktion + Addition Bemerkung: Leerzeichen innerhalb eines Ausdrucks sind verboten und führen zu einem falschen Ergebnis. Es wird jedoch nicht immer eine Fehlermeldung erzeugt! 1.5 Die Direktiven 1.5.1 Steuerungsdirektiven END Beendet den Assemblerlauf. Diese Direktive ist optional und muß nicht unbedingt angegeben werden. INCLUDE "Dateiname" Der Assembler unterbricht die Assemblierung der aktuellen Quelldatei und schiebt das Includefile "Dateiname" in den Assemblerlauf ein. Wenn diese neue Datei zu Ende ist, wird im alten Quellfile fortgefahren. SETLH Die DW-Direktive (siehe unten) generiert 16-Bit Werte. Die Anordnung der zwei Bytes, also ob z.B. zuerst Low-Byte und dann das High-Byte generiert wird, wird durch SETLH bzw. SETHL eingestellt. SETLH sorgt nun dafür, das zuerst das Low-Byte und dann das High-Byte generiert wird. SETHL Durch diese Direktive wird zuerst das High-Byte und dann das Low-Byte generiert. Dieses Verhalten ist auch beim Start Voreingestellt und wird auch benutzt, wenn weder SETHL noch SETLH im Quelltext verwendet werden. 1.5.2 Zuweisungsdirektiven ORG xxxx Damit wird die Startadresse angegeben, an der das Programm später liegen soll. Es sind beliebig viele ORG Anweisungen innerhalb einer Datei möglich. Die Adressen müssen nicht unbedingt in aufsteigender Reihenfolge sein. d.h.: es kann eine ORG 2000H - Anweisung vor ORG 1000H stehen. ROM xxxx Durch diese Direktive wird die Startadresse des EPROMs an gegeben und ist nur sinnvoll wenn eine EPROM-Datei erzeugt werden soll. Wenn also das EPROM später an der Adresse 0C000H liegt, wird hinter der ROM-Direktive diese Adresse geschrieben. Das Programm muß jedoch nicht unbedingt an 0C000H beginnen, sondern kann genauso auch erst bei z.B. 0CD00H beginnen. Normalerweise muß man beim Programmieren eines EPROMS die Startadresse des Programms genau kennen, damit man die Adresse des Programms an die Adresse des EPROMs anpassen kann. In diesem Fall darf das Programm nicht von Beginn an in das EPROM programmiert werden, sondern es muß um 00D00H Bytes verschoben werden. Das heißt es kommen erst 'leere' Bytes (im EPROM) und dann kommt das Programm. Das alles wird durch diese Direktive berücksichtigt! In der EPROM-Datei stehen nachher (in diesem Beispiel) zu nächst 00D00H 'leere' Bytes und dann kommt das Programm. (leere Bereiche zwischen einzelnen Programmteilen werden ebenfalls auf diese Weise aufgefüllt) Später beim Programmieren wird diese Datei einfach vom Be- ginn des EPROMs an eingeladen, die Startadresse des Pro- gramms ist dann damit bereits richtig berücksichtigt! EQU oder = Einem Label wird ein Wert zugewiesen. Dies kann aber pro Variable nur einmal verwendet werden! (Ansonsten Fehler meldung: "Label doppelt definiert") Beispiel: Start equ 10 Daten = 2*8+3 usw. DEF Einem Label wird ein neuer Wert zugewiesen. Die Variable muß aber bereits durch EQU (bzw "=") eingeführt worden sein. DEF kann beliebig oft verwendet werden, man sollte aber vorsichtig damit umgehen, da man damit sehr schnell logische Fehler in den Quelltext einbauen kann, die sich nur sehr schwer finden lassen. Beispiel: Start equ 10 ... Start def 92 ... DS xx oder DEFS xx Platz reservieren für xx Bytes. (Bem.: pro DS - Direktive können allerdings max. nur 255 Bytes reserviert werden.) DB oder DEFB Nach dieser Direktive folgen Datenbytes. (8-Bit) Beispiel: DB 0,1,2,3,4,5,... DB 2,"Das ist ein Text",10,'a',10*2,001000B DW oder DEFW Nach dieser Direktive folgen Datenwörter. (16-Bit) Beispiel: DW 0,1,2,4000,..... DW 2,"Text",'g',290,2FFFH,... usw. 1.5.3 Listingdirektiven NOLIST oder LISTOFF Da eine Listingdatei bedingt durch z.B.: Includefiles sehr groß werden kann, kann die Erzeugung des Listings durch diese Direktive ausgeschaltet werden. LIST oder LISTON Hiermit wird die Erzeugung des Listings wieder eingeschal- tet. Falls das Listing davor nicht ausgeschaltet wurde, ändert diese Direktive am Ablauf jedoch nichts, da das Li- sting bereits ausgegeben wird. 1.5.4 Bedingte Assemblierung IFDEF xxxx Wenn der Ausdruck hinter IFDEF ungleich Null ist, wird weiterassembliert, also alle Befehle nach dieser Direktive ausgeführt bzw. assembliert. Wenn der Ausdruck gleich Null ist, werden alle Zeilen bis zum ENDIF des Quellcodes über sprungen. IFNDEF xxxx Wenn der Ausdruck hinter IFNDEF gleich Null ist, wird wei- terassembliert. Falls der Ausdruck jedoch ungleich Null ist, werden alle Zeilen bis zum ENDIF übersprungen. ENDIF Nach jedem IFDEF bzw. IFNDEF sollte ein ENDIF folgen. Oder genauer gesagt, es sollten genau so viele ENDIF vorhanden sein wie IFDEF plus IFNDEF im Quelltext vorhanden sind. Ansonsten kommt es zu einer Fehlermeldung! Diese Direktiven sind rekursiv. Das heißt: es kann z.B. eine IFNDEF nach einer IFDEF Anweisung folgen. Sollte die IFDEF Direktive z.B. bereits ergeben, das nicht weiteras sembliert wird (Ausdruck gleich Null), dann wird zwar die IFNDEF Anweisung nicht ausgeführt, aber es sollten in die sem Fall trotzdem zwei ENDIF-Direktiven folgen. Beispiel: definition EQU 1 .... ld a,b ;Quelltext IFDEF definition .... ;wieder Quelltext (wird ausgeführt) IFNDEF definition ld b,a ;Text wird übersprungen .... ENDIF ;Ende von 'IFNDEF' ld c,a ;diese Zeile wird wieder assembliert ENDIF ;Ende von 'IFDEF' .... usw. 1.5.5 Makros Makros sind Zusammenfassungen mehrerer Quelltextzeilen, die nach ihrer Definition in den Assemblerlauf eingescho- ben werden. Sie können mit Parametern versehen werden, so daß Sie immer wiederkehrende Sequenzen von Quellzeilen nur einmal eingeben müssen, auch wenn diese kleine Unterschie- de aufweisen. Ein Makro wird aufgerufen, indem sein Name als 'Befehl' eingegeben wird. Dadurch kann der Quelltext kürzer und übersichtlicher gehalten werden. Aber wohlgemerkt, nur der Quelltext wird kleiner, das Programm selbst wird größer. Der Grund: bei jedem Makroaufruf wird die komplette Sequenz assembliert, genauso als wenn Sie die Zeilen dort stehen hätten. Um ein Makro verwenden zu können, muß es erst einmal defi- nert werden. Label MAKRO Durch diese Direktive ('MAKRO') wird das Makro definiert. Der Name muß vor dieser Anweisung, am Beginn der Zeile stehen. Alle folgenden Quelltextzeilen gehören dann zu diesem Makro und werden jedesmal, wenn der Makroname als Befehl im Quelltext steht dann assembliert. Dem Makro können später beim Aufruf maximal 10 Argumente als Parameter angegeben werden. In den Quelltextzeilen während der Definition müssen diese Parameter durch eine Zahl von 0 bis 9 und einem Vorangestellten Backslash ('\') angegeben werden. Innerhalb einer Makrodefinition kann nicht mit einer neuen Makrodefinition begonnen werden. Die Verschachtelung von diesen Direktiven ist also unzulässig. ENDM ENDM beendet dann die aktuelle Makroaufnahme. Das Makro kann von nun an verwendet werden. Beispiel: Text1 MAKRO DB "Hallo, das ist ein Text",0 ENDM Init MAKRO ;Makro mit 4 Parametern (0 bis 3) \3 ld a,\0 ;hinter '\' steht die Parameternummer ld b,\1 ld c,\2 ENDM Aufgerufen werden diese Makros dann folgendermaßen: .... Init 1,h,2,Lab1 call u1prg Init h,4,0fh,Lab2 call ... .... ;irgend ein Quelltext Text1 ;z.B. im Datenbereich 1.6 AREXX - Schnittstelle Durch eine AREXX-Schnittstelle läßt sich ein Programm so zusagen 'fernsteuern'. Ein anderes, gerade laufendes Pro gramm (z.B. ein Editor) kann dann dadurch z.B. die Ein stellungen vornehmen. (Datei angeben, Assembler starten usw.) Damit der Empfänger dieser 'Fernsteuerbefehle' eindeutig gekennzeichnet ist, wird ein Briefkasten benötigt. Dieser Briefkasten hat einen eindeutigen Namen und wird Port ge- nannt. Der Z80 Crossassembler legt solch einen Port an, nachdem das Window geöffnet wurde. Das heißt, das der AREXX-Port erst ab Amiga-OS 2.04 verfügbar ist. Der Portname hat folgenden Aufbau: "REXX_Z80_x" Das x bezeichnet eine Nummer. Beim ersten Start steht dort eine Null ('0'). Wenn der Assembler nun noch einmal ge- startet wird, so das zwei Assembler gleichzeitig aktiv sind, bekommt der als zweiter gestartete Assembler die Nummer eins ('1') usw.. Insgesamt kennt der Assembler 7 AREXX-Befehle, die Teil weise noch Parameter haben. Folgend Befehle werden erkannt: REQUESTS ON/OFF: Wenn Fehler im Quelltext sind, erscheint normalerweise ein Requester ("Fehler im Quellcode..."), der darauf aufmerk sam macht. Durch diesen Befehl kann der Requester unter drückt werden (OFF). Oder falls er unterdrückt war, kann man ihn wieder einschalten (ON). DATEINAME 'Name': Dadurch wird der Dateiname übergeben. START: Der Assemblerlauf wird gestartet. BEENDEN: Der Assembler wird beendet, genauso als wenn im Menü der Punkt Ende angewählt worden wäre. Die Ausgabeformate: ASCII ON/OFF: ASCII-datei erzeugen. BINAER ON/OFF: Binärdatei erzeugen ein- oder ausschalten. EPROM ON/OFF: Epromdatei erzeugen ein- oder ausschalten. LISTING ON/OFF: Listing und Symboltabelle erzeugen ein- oder ausschalten. Beispiel für eine Steuerung aus einer Shell: Zunächst muß der Assembler gestartet werden. Dann kann aus einer Shell z.B. folgendes Kommando eingegeben werden: rx "address REXX_Z80_0 DATEINAME XYZ.ASM" Als Ergebnis sollte jetzt dieser Dateiname im Assembler sichtbar werden. Als weitere Beispiele existieren im Verzeichnis die Datei en: Assemble.rexx und AssOut.rexx. Diese Dateien können aus dem Editor Ed aufgerufen werden und starten dann den Assembler (Assemble.rexx) bzw. schalten verschiedene Aus gabeformate ein und starten dann den Assembler. 1.7 Ausgabeformate 1.7.1 Fehlermeldungen: In die Datei "Z80Ass.err" (im gleichem Verzeichnis, in dem der Assembler steht) werden alle Fehlermeldungen geschrie- ben. In einer Zeile werden alle wichtigen Informationen zu einem Fehler ausgegeben. Also Datei, Zeile, Fehlernummer und Fehlerursache als Klartext. Beispiel: Z80Lab1.asm: Zeile 6: Error 6: Befehl unbekannt 1.7.2 Listing: Der Dateiname wird vom Quellfile abgeleitet, jedoch mit der Endung ".lst". Hier steht noch einmal Zeile für Zeile der Quelltext, die Zeilennummer und der Maschinencode. 1.7.3 Symboltabelle: Der Dateiname wird vom Quellfile abgeleitet, jedoch mit der Endung ".sym". Alle Label und Symbole werden mit den dazugehörigen Werten aufgelistet. Diese Datei kann dann z.B. in anderen Programmen wieder durch Include "xxx.sym" wieder eingeladen werden, wenn diese Symbole mit diesen Werten dort verwendet werden müssen. 1.7.4 (Hex.) ASCII Datei: Der Dateiname wird vom Quellfile abgeleitet, jedoch mit der Endung ".hex". Der Aufbau ist so gehalten, das z.B. ein Monitorprogramm im Z80-(Einplatinen-)Computer diese Datei eingeladen werden kann. Vorausgesetzt ein Monitor programm ist vorhanden und dieses Monitorprogramm kann dieses Format verarbeiten. Beispiel: ;0000cd4100....... ;001000c30000..... Durch ';' wird jede Zeile eingeleitet. Die nächsten 2 By- tes bezeichnen die Adresse für die darauffolgenden Daten. Dann folgen die Maschinendaten als Hexadezimale Zahlen (insgesamt 16 Bytes pro Zeile). 1.7.5 Binäre Datei: Der Dateiname wird vom Quellfile abgeleitet, jedoch mit der Endung ".bin". Diese Datei enthält den Maschinencode und eventuell auch Formatierungsanweisungen. 1.7.6 Eprom Datei: Der Dateiname wird vom Quellfile abgeleitet, jedoch mit der Endung ".epr". Diese Datei enthält nur den reinen Ma- schinencode. Es sind keinerlei Formatierungsanweisungen oder sonstige Daten vorhanden. Diese Datei kann in ein EPROM gebrannt werden. 1.8 Fehlermeldungen Fehlernummer: Bedeutung: 1 Org-Direktive ohne Parameter (es fehlt die Adresse) 2 EQU-Direktive ohne Parameter 3 EQU-Direktive ohne Label 4 QRG doppelt vorhanden (Die Adresse existiert zweimal) 5 Falscher Parameter 6 Befehl unbekannt 7 Bereichsüberschreitung bei 1-Byte Argument 8 Bereichsüberschreitung bei 2-Byte Argument 10 Parameterübergabe falsch 11 Label doppelt definiert 12 Ausdruck zu lang (es kann sich dabei eigentlich nur um eine Formel handeln. Kürzen Sie den Ausdruck auf max. 25 Zeichen) 13 Zu viele Argumente 14 Ausdruck falsch 15 Division durch NULL 16 Unerlaubtes Zeichen in Formel 17 Kann Variable nicht finden 19 Überlagerung der Binärdaten Abhilfe: Anpassung der Org-Anweisung, Beispiel siehe unten (Bemerkung: Dieser Fehler wird erst bei der nächsten ORG Anweisung bemerkt.) 20 Bufferüberlauf bei DS-Direktive (Es können pro DS Anweisung nur 255 Bytes reserviert werden. Sollen mehr Bytes reserviert werden müssen entsprechend viele DS Anweisungen angegeben werden) 21 Die Adresse, die bei der ROM-Direktive angegeben wurde, ist höher als die kleinste Programmadresse. Dadurch kommt es zu einem Konflikt mit dem Adressbereich des EPROMS. 22 Es gibt mehr ENDM-Anweisungen als MAKRO- Anweisungen! 23 Es wird versucht eine Makrodefinition in einer Makrodefinition zu beginnen. 24 Der Makroname existiert bereits. 25 undefinierter Makroparameter. Es existiert hinter einem BACKSLASH '\' innerhalb einer Makrodefinition ein unzulässiges Zeihen. Es sind nur die Zeichen '0' bis '9' erlaubt! Beispiel zum Fehler 19: Beispiellisting: org 1000H db 1,2,3,4,5,6,7,8,9 org 1005H ld a,... usw. org 2000H ld (Ix+0),10 usw. Dieses Listing führt zum Fehler 19. Die erste Anweisung beginnt bei 1000H und belegt 9 Bytes = bis Adresse 1009H (Tabelle 1 bis 9). Die nächste Org-Anweisung soll aber be- reits bei 1005H beginnen. Dort steht aber die Tabelle. (= Überlagerung der Binärdaten) Bemerkung: Dieser Fehler wird erst bei nächsten org-Anweisung bemerkt (bzw. bei Dateiende wenn keine Org-Anweisung mehr folgt) hier in diesem Beispiel wird dieser Fehler erst in der Zeile bemerkt, in der org 2000H steht. 2 Z80 Hilfesystem 2.1 Aufruf Das Programm wurde bei der Installation des Assemblers mit installiert. Gestartet wird dieses Programm durch Doppel klick auf das Icon Z80Hilfe. Es lädt dann die Datei Z80Hilfe.txt, das sich im selben Verzeichnis befinden muß, und öffnet dann ein Window. 2.2 Funktion Nachdem das Programm gestartet wurde, wird in einem Window eine Auswahl angezeigt. Zur Zeit wird zu fast allen Z80-Befehlen eine kurze Erklärung angezeigt. Dazu muß ein fach der Titel (Z80-Befehl) angeklickt werden, zu dem man fragen hat. Dieses Programm soll praktisch ein Nachschla- gewerk zumindest teilweise ersetzen, um die Z80-Befehle zu lernen, ist dieses Programm jedoch nicht geeignet! Wenn man sich die Informationen angesehen hat, kommt man durch Anklicken von OK wieder zurück zum Hauptmenü. 2.3 Aufbau der Z80Hilfe.txt-Datei Die Datei wurde durch einen normalen Editor erstellt und kann auch jederzeit von Ihnen ergänzt oder verbessert wer- den. Um die Menüstruktur zu erzeugen existieren vier Befehle. - \title\ - \subtitle\ - \text\ und - \newline\ Bemerkung: der Befehle \language\ wird noch nicht unter stützt, er steht jedoch bereits in der Z80Hilfe.txt-Datei! Jeder Befehl beginnt IMMER mit einem '\' und endet auch wieder mit einem '\'. Die Befehle \title\ und \subtitle\ untergliedern den Text wie in einem Buch mit einer 'großen' Überschrift und mit 'kleineren' Überschriften. Nach diesen beiden Befehlen muß die Überschrift in '{', '}' eingeschlossen werden. Der Befehl \text\ steht dann nach einem \title\- oder nach einem \subtitle\-Befehl. Nach dem \text\-Befehl steht dann wiederum der Text, der später nach dem Anklicken der Über schrift angezeigt werden soll. Die Nummerierung, die im Hauptmenü erscheint, wird automatisch generiert, und braucht nicht weiter beachtet werden. Da leere Zeilen ignoriert werden, muß der Befehl \newline\ verwendet werden, wenn eine Leerzeile eingeschoben werden soll. (Das gilt nur für den Text, und nicht für die Über- schriften!) Text, Befehle oder irgendwelche sonstigen Zei- chen nach dem \newline\-Befehl werden nicht beachtet! Bemerkung: - In einer Zeile darf maximal nur ein Befehl stehen! - Die TAB-Taste darf nicht verwendet werden! Beispiel: \title\{Das ist ein Test} \subtitle\{Das ist ein Untertitel} \text\{Hier könnte jetzt ein beliebiger Text stehen. \newline\ Nach einer Leerzeile geht der Text hier weiter.} \title\{Eine neue Überschrift} \text\{Auch nach 'title' darf ein 'text' stehen!} usw. 3 Editor 3.1 Aufruf Durch Doppelklick auf das Icon 'Editor' wird der Editor gestartet. Es handelt sich dabei jedoch nicht um einen mitgelieferten Editor, sondern es wird der Ed aufgerufen. Dieser Editor (Ed) wird mit dem Betriebssystem (Amiga-OS 2.04) geliefert. Eine genaue Anleitung zu diesem Editor kann deshalb der Anleitung zum Amiga entnommen wer- den. (Anleitung zur Workbench und Anleitung: AmigaDOS->Editoren) Selbstverständlich kann auch ein anderer (besserer) Editor verwendet werden. Bemerkung: Aus Ed können AREXX-Programme aufgerufen wer- den. Dazu existieren im Verzeichnis Examples zwei AREXX- Programme: Assemble.rexx und AssOut.rexx. Werden diese Programme aufgerufen, wird das derzeitig im Editor befind- liche Programm abgespeichert und wenn der Assembler be- reits aktiv ist, wird ein Assemblerlauf gestartet. 4 Anhang 4.1 Beispielprogramme Die Beispielprogramme befinden sich im Verzeichnis Ex- amples. Die Datei Test.asm enthält alle Befehle des Z80 und kann zum Testen des Crossassemblers verwendet werden. Die Datei TestIO.asm enthält ein Programm, das abwechselnd die Zahl 00HEX und FFHEX in die Adresse 0 im IO-Bereich schreibt. Wenn sich auf dieser Adresse eine 8-Bit Ausgabe mit LEDs befindet, erhält man ein Blinklicht. Die Datei TestIO2.asm enthält ein Lauflicht. Auch hier wird auf die Adresse 0 im IO-Bereich zugegriffen. Bemerkung: Die beiden Programme TestIO.asm und TestIO2.asm sind für einen Z80-Computer entworfen, der: 1. ein EPROM mit einem Adressbereich von 16 kByte hat. 2. das EPROM nach einem RESET an der Adresse 0 einblendet, und beim ersten Zugriff auf eine Adresse zwischen C000Hex und FFFFHex das EPROM dann dauerhaft auf diesen Adressbereich schaltet. 3. im IO-Bereich, Adresse 0 eine 8-Bit Ausgabe hat.