Z80-Assembler Version 1.0 ========================= Jens Mller 04.04.1992 Nr.66 O-6501 Frankenau 1. Urheberschaft und Rechte Der Assembler ist Puplic Domain und kann somit von jedem fr nichtkommerzielle Zwecke kopiert und benutzt werden. Die Rechte fr dieses Programm liegen allein beim Autor. Eine fehlerfreie Software kann ich nicht garantieren, aužerdem bernehme ich auch keinerlei Haftung fr evtl. Sch„den, die durch die Benutzung des Programms entstehen. Kommerzielle Nutzung oder Vertrieb ist nur nach meiner schriftlichen Zustimmung gestattet. Wer den Assembler weiterentwickeln m”chte oder aus anderen, ebenfalls nichtkommerziellen Grnden den Assemblerquelltext gern h„tte, kann ihn durch Zusendung einer formatierten Diskette, eines ausreichend frankierten Rckumschlages und einer Spende von DM 20.- oder mehr bei mir erhalten. 2. Allgemeines Der Assembler wurde geschrieben, um kleinere Programme fr einen Z80-Rechner auf dem ATARI ST entwickeln zu k”nnen. Er untersttzt Zilog-Mnemonik sowie mehrere Arten der Pseudo- befehle. Aužerdem werden auch undokumentierte Befehle bersetzt. Nicht m”glich sind Macros und Include-Dateien. Der Z80-Assembler selbst wurde in Assembler geschrieben (DevpacST 2.08 von HiSoft), die šbersetzungsgeschwindigkeit betr„gt etwa 7000 bis 8000 Zeilen pro Minute und ist damit kein Spitzenwert. Auf eine Kaffepause muž man aber in den meisten F„llen trotzdem verzichten. Das Programm arbeitet nach dem klassischen 2-Pass-Modell. In Pass 1 wird die Markentabelle angelegt und alle Befehle, soweit m”glich, vollst„ndig assembliert. Dadurch werden die meisten Fehler schon jetzt erkannt. W„hrend des zweiten Passes entsteht das Listing (Option -L), anchliežend die Symboltabelle (-S) und falls keine Fehler auftraten, auch noch die Bin„rdatei. Bei fehlerhaftem Assemblieren wird die Nummer der ersten fehler- haften Zeile an das aufrufende Programm zurckgeliefert, ansonsten Null. 3. Aufruf In der Kommandozeile sind zuerst alle gewnschten Optionen anzugeben (beginnend mit "-") und danach der vollst„ndige Dateiname. Wird dies nicht getan, so fragt der Assembler nach. Veralbert man das Programm jetzt nocheinmal, so erscheint eine kleine Hilfestellung. Folgende Optionen sind m”glich: -A Der zweite Pass wird erzwungen, auch wenn in Pass 1 Fehler auftraten. So kommt man trotzdem an ein (wahrscheinlich falsches) Listing heran. -B Es erfolgt keine Ausgabe der Bin„rdatei (erzeugter Code). Diese Datei hat immer die Extension ".BIN" und wird auch nur bei Fehlerfreiheit erzeugt. -C Die Marken werden auch nach Grož- und Kleinschreibung unterschieden. -J Bei allen relativen Sprngen entsteht der Code fr absolute. DJNZ wird in "DEC B, JP NZ,.." assembliert. Dann ist z.B. auch "JR PE,.." m”glich. -L W„hrend des zweiten Passes wird ein Assemblerlisting erzeugt und auch gleich geschrieben (immer Extension ".LST"). Das kann bei Disketten etwas dauern, daher sollte man lieber eine RAM-Disk benutzen! -S Die Symboltabelle (ebenfalls immer ".LST", evtl. mit dem Listing in einer Datei zusammen) wird ausgegeben. Das Assemblieren kann mit der UNDO-Taste jederzeit abgebrochen werden. 4. Dateiformate Der Quelltext muž im ASCII-Format vorliegen, wobei das Zeilen- ende durch CRLF (0D0A), nur LF (0A) oder NL (1E) gekennzeichnet sein kann. Das Byte EOT (1A) im Quelltext wird als Dateiende interpretiert. Die Symboltabelle ist alphabetisch sortiert, wobei in jeder Zeile immer nur ein Symbol steht. M”chte jemand die Marken dem Wert nach sortiert haben, so kann er einen Texteditor mit Zeilensortierfunktion benutzen, denn es steht in der Zeile der Wert vor dem Namen. 5. Zeilenformat Eine Quelltextzeile kann beliebig lang sein, es ist nur zu beachten, daž pro Zeile max. 254 Bytes erzeugt werden. Leerzeilen sind zul„ssig. Die beliebig langen Marken mssen in der ersten Spalte und mit einem Buchstaben oder Unterstrich beginnen und drfen zus„tzlich noch Ziffern enthalten sowie mit einem Doppelpunkt abgeschlossen sein. Marken drfen auch ohne einen Befehl in einer Zeile stehen und sind auf volle L„nge signifikant. Zwischen Grož/klein-Schreibung wird nicht unterschieden, es sei denn, die Option "-C" wurde angegeben. Ein Befehl darf logischerweise nicht in der ersten Spalte stehen, dafr kann man ihn aber grož oder klein schreiben. Bei der Operandenspalte ist zu beachten, das alle Zeichen zusammenh„ngend ohne Space und Tabs geschrieben werden mssen. Zum Schluž noch zum Semikoleon, welches in jeder Lebenslage (aužer in Strings) einen Kommentar bis zum Zeilenende einleitet. 6. Syntax In mathematischen Ausdrcken sind die vier Grundrechenarten sowie beliegige Klammerung zul„ssig. Aužerdem gibt es die zwei Funktionen: L(Ausdruck) ergibt Low-Byte von Ausdruck H(Ausdruck ergibt High-Byte. Ein šberlauf wird nicht gemeldet. Achtung! Beginnt ein Operand mit einer Klammer, so inter- pretiert der Assembler das immer als indirekte Adressierung, z.B. "LD A,(2+3)*4" ist nicht etwa "LD A,20" sondern ergibt eine Fehlermeldung, da zuerst "LD A,(5)" bersetzt wird, anschliežend kann dann der Assembler mit "*4" nichts mehr anfangen. Anders dagegen ist es mit "LD A,4*(2+3)", das ergibt "LD A,20". Dieses gilt nicht fr EQU und ORG. Literale haben folgenden Syntax: 123 Dezimalzahl 0ABCH Hexzahl, muž so immer mit einer Ziffer beginnen! #ABC Hexzahl $A98 Hexzahl %101 Bin„rzahl 'A' ASCII-Wert "A" ASCII-Wert Zu den blichen Befehlen entsprechend der Zilog-Mnemonik bersetzt der Assembler auch noch undokumentierte und Pseudobefehle. In Verbindung mit den meisten 8-Bit-Befehlen, jedoch nicht mit HL, IX oder IY, ist der 8-Bit Zugriff auf die Indexregister m”glich (z.B "LD A,IXH"). Aužerdem wird SLE bersetzt ($ED$30 bis $ED$37). Der Befehl entspricht SLA, es wird aber eine "1" hineingeschoben. Pseudobefehle: M1 EQU WERT Der Marke M1 wird WERT zugewiesen. ORG ADDR Aktuelle Adesse neu setzen. Wenn zurckgesetzt wird, so erscheint eine Warnung. Es ist nicht gestattet, diese Zeile mit einer Marke beginnen zu lassen, da man streiten k”nnte, ob die Marke noch den alten oder schon den neuen Wert haben soll. ORG kann beliebig oft benutzt werden, allerdings werden die erzeugten Bytes der Reihe nach ihrer Erzeugung in die Bin„rdatei geschrieben. DEFS, DS Anzahl_Bytes Es werden keine Bytes erzeugt, sondern nur die Adressen weitergez„hlt (Speicher reservieren). DEFB, DB Byte1,"String1",'String2',.. Datenbytes definieren DEFW, DW Wort1,Wort2,.. Datenw”rter definieren DEFM, DM 'String' Genau einen String als Bytes definieren. Ein String kann in Hochkomma oder G„nzefže eigeschlossen sein. DEFA, DA ... entspricht DEFW. Wenn ein 16-Bit-Wert dort zugewiesen wird, wo ein 8-Bit-Wert verlangt ist, so erscheint eine Warnung, und es sind die unteren 8 Bit relevant, besser man nehme "L(..)". 7. Schluž Zum Schluž bleibt mir nichts anderes mehr brig, als den Nutzern dieses Z80-Assemblers, falls es berhaupt welche gibt, viel Glck zu wnschen. Sollte jemand Fehler feststellen, so bitte ich, diese mir mitzuteilen. Viel Spaž Jens Mller