ÿ€ Å:Ì ë:É:Ÿ: '1€A$ï"Der Z80-Assembler"`€Lï(Pòÿ’(A$))ü:‘ÛL);A$:‘ÛL);ã(ÿ’(A$),"-")²€(‘"Der Assembler erzeugt den, zu einem in Assemblersprache geschriebenen Pro-"2‘"gramm (source program bzw. Quellprogramm), dazugehoerigen Maschinencode"O<‘"(Objektcode bzw Objektprogramm). Dabei werden z.B. die Sprungdistanzen"½F‘"automatisch berechnet.":‘"Fuer die Z80 Assemblerprogramme gelten bestimmte Regeln. Eine Assemblerzeile"ðP‘"fuer diesen Assembler hat folgendes Format:"5‚Z‘:‘" ZN ' Marke Befehl Operand ; Kommentar"‰‚d‘:‘"Da zur Eingabe der Programme der BASIC-Editor dient, wird jeder Assembler-"½‚n‘"anweisung eine Zeilennummer (ZN) zugeordnet."ƒx‘"Im Folgenden wird das Eingabeformat des Assemblers definiert."!ƒ‚‘:½:‘"Marke (Label)";:½jƒŒ‘Û);"- Am Anfang einer Zeile kann eine Marke (Label) stehen. Eine"¯ƒ–‘Û);"Marke ist eine Variable. Die Laenge des Variablennamens "òƒ ‘Û);"(Markennamens) darf nicht mehr als 6 Zeichen betragen."<„ª‘Û);"Markennamen muessen mit einem Buchstaben beginnen. Assembler-"„„´‘Û);"befehle duerfen nicht als Markennamen benutzt werden. Durch"Å„¾‘Û);"die Verwendung von Marken, vereinfacht sich die Pro-"î„È‘Û);"grammierung von Spruengen:":‘…Í‹ DR$ðî"j" Ú Pà :Ÿ<…Ò‘Û);"ANF LD A,B ; ANF ist eine Marke"Q…Ü‘Û);" ."f…æ‘Û);" ."š…ð‘Û);" jr ANF ; Springe nach ANF":‘â…ú‘Û);"Der Assembler berechnet automatisch die richtige Distanz.":‘†½:‘"Befehl (Mnemonik)";:½ I†‘Û);"- Nach einer eventuell vorhandenen Marke muss ein Befehl"Œ†‘Û);"folgen. Marke und Befehl werden durch Leerzeichen von-"ʆ"‘Û);"einander getrennt. Der Befehl muss ein gueltiges "ó†,‘Û);"Assemblerbefehlswort sein.":‘ ‡6½:‘"Operand";:½ Z‡@‘Û);"- Auf das Befehlswort folgt, wieder durch Leerzeichen getrennt, der"§‡J‘Û )"Operand. Bei Spruengen kann die Sprungadresse als Marke angegeben"ó‡T‘Û );"werden. Die Existenz dieser Marke ist dafuer allerdings Voraus-"Bˆ^‘Û );"setzung. Anstelle von Konstanten oder Distanzen koennen Variablen-"sˆh‘Û );"namen oder Marken eingesetzt werden."½ˆr‘Û );"Innerhalb des Operanden duerfen keine Leezeichen stehen !!!":‘׈|‹ DR$ðî"j" Ú Pà :Ÿðˆ†½:‘"Kommentar";:½?‰‘Û );"- Am Ende der Zeile kann, durch Lerzeichen und ein Semikolon abge-"‰‰š‘Û );"trennt, ein Kommentar folgen. Alle auf ein Semikolon folgende"Õ‰¤‘Û );"Zeichen einer Zeile werden bei der Uebersetzung nicht beachtet."#Š®‘Û );"Es kann auch eine Kommentarzeile eingefuegt werden. Das Semikolon"}Џ‘Û );"muss dann am Anfang der Zeile unmittelbar dem ";ÿ–(");"'";ÿ–(");" folgen.":‘Ҋ‘"Waehrend der Uebersetzung erzeugt der Assembler ein Assemblerlisting, das auf"$‹Ì‘"den Drucker bzw. den Bildschirm ausgegeben werden kann. Ausserdem kann der"j‹Ö‘"erzeugte Code auf Kassette oder Diskette abgespeichert werden."¨‹à‘"Das erzeugte Assemblerlisting hat folgenden Aufbau :":‘ï‹ê‘" HexAdr. HexCodes BASIC Marke Befehl Operand ; Kommentar"Œô‘" Zeilennr.":‘[Œþ‘" C000 36CC 50 WEITER LD (HL);Mask ; ADRESSE.."¨Œ‘" C002 23 60 INC HL ; HL erhoehen":‘:‘ûŒ‘"Zusaetzlich zu den Z80 Befehlen, kennt der Assembler eine Reihe von Pseudo-"M‘"befehlen. Sie sind Anweisungen an den Assembler wie z.B. END. END bedeutet"£&‘"fuer den Assembler, nicht mehr nach weiteren Befehlen zu suchen und die Ueber-"Â0‘"setzung abzuschliessen."Ž:‘"Eine weitere wichtige Anweisung fuer den Assembler ist EQU (engl. equate:"ZŽD‘"gleichsetzen). Mit EQU wird der Wert einer Variablen definiert:"tŽN‹ DR$ðî"j" Ú Pà :Ÿ¤ŽX‘:‘" Variablenname EQU Wert":‘ðŽb‘"(Weist dem voranstehende Variablennamen den hinter der EQU-Anweisung" l‘" stehenden Wert zu)"`v‘"Die Anweisung ORG (Organisation) gibt an, ab welcher Adresse das nachfolgende"´€‘"Programm gespeichert werden soll. Es sollte guenstigerweise die Startadresse"ÿŠ‘"&HDB80, die der Assembler auch automatisch vergibt, benutzt werden."`”‘:‘"Bei der Angabe von Zahlen, sind folgende Vereinbarungen getroffen worden:":‹ DR$ï"j" Ú ‘Éž‘" - Hexadezimale Zahlen werden durch das Voranstellen von ";ÿ–( ");"&H";ÿ–( ");" gekennzeichnet.")‘¨‘" - Dualzahlen werden durch das Voranstellen von ";ÿ–( ");"&B";ÿ–( ");" gekennzeichnet."Š‘²‘" - Oktalzahlen werden durch das Voranstellen von ";ÿ–( ");"&O";ÿ–( ");" gekennzeichnet."ᑼ‘" - Werden Zahlen ohne eines dieser Zeichen angegeben, so werden diese als Dezi-"’Æ‘" malzahlen interpretiert."V’Б:‘"Die Standardvereinbarungen fuer Z80 Assembler sind ein 'H' am Ende einer"­’Ú‘"Hex-Zahl, ein 'B' am Ende einer Binaerzahl und ein 'O' am Ende einer Oktalzahl."“ä‘"Hier werden jedoch die oben angegebenen Konventionen mit &H, &B und &O benutzt."\“î‘:‘"Probieren Sie doch den Assembler durch Eingabe eines kleinen Programms einfach"o“ø‘"einmal aus."Å“‘"Das Assemblersourceprogramm (Ausgangsprogramm) kann unabhaengig vom Assembler-"è“ ‘"programm eingegeben werden." ”‹ DR$ðî"j" Ú Pà :Ÿ::¡ ‘:‘#” ‘" 10 ' ; Slot PEEK"N”*‘" 20 ' ; Format: USR1(Adresse),Slot"…”4‘" 30 ' illfc equ &h4740 ; Illegal funktion call"¹”>‘" 40 ' cint equ &h2c0a ; Convertiert INTEGER"å”C‘" 50 ' getbyt equ &h51f3 ; Holt Byte"-•H‘" 60 ' slotrd equ &h000c ; Liest Byte von Slot , Adresse "^•R‘" 70 ' pos1 equ &h4fa9 ; in FAC laden"Ž•\‘" 80 ' fac equ &hf6bc ; Startadresse FAC"ž•f‘" 90 ' ;"ç•p‘" 100 ' call cint ; convertiert nach INTEGER und laed Wert nach HL"þ•z‘" 110 ' ex de,hl"(–„‘" 120 ' pop bc ; Ruecksprungadresse"M–Ž‘" 130 ' pop hl ; BASIC Pointer"|–˜‘" 140 ' push hl ; Stack wiederherstellen"’–¢‘" 150 ' push bc"»–¬‘" 160 ' push de ; Wert der Adresse"Ý–¶‘" 170 ' rst &h08 ; Test auf"—À‘" 180 ' db $h2c ; ASCII(',')"*—Ê‘" 190 ' call getbyt ; Holt Slot Nr."O—Ô‘" 200 ' cp 4 ; Slot NR. >= 3 ?"‰—Þ‘" 210 ' jp nc,illfc ; ja, dann Illegal funktin call"Ò—è‘" 220 ' ex (sp),hl ; zu lesende Adresse mit BASIC Pointer tauschen"ì—ò‘" 230 ' call slotrd"˜ü‘" 240 ' call pos1 ; Akku in FAC laden"2˜‹ DR$ðî"j" Ú Pà :ŸW˜‘" 250 ' pop hl ; BASIC Pointer"z˜‘" 260 ' pop bc ; Ruecksprung"¥˜$‘" 270 ' pop de ; alter BASIC Pointer"ј.‘" 280 ' push hl ; neuer BASIC Pointer"õ˜8‘" 290 ' push bc ; Ruecksprung" ™B‘" 300 ' ld hl,fac ; Startadresse FAC"c™L‘" 310 ' ; A enthaelt bereits Typ 2 (siehe Routine ab &h4fa9)"u™V‘" 320 ' ret"‡™`‘" 330 ' end"Þ™j‘:‘"Bei der Eingabe koennen Sie sowohl Klein- als auch Grossschrift benutzen. Die"0št‘"Schriften werden jedoch intern nicht unterschieden, sondern automatisch in"Qš~‘"Grossschrift umgewandelt."§šˆ‘"Beachten Sie, dass hinter jeder Zeilennummer mit einem Leerzeichen Abstand ein" ›’‘ÿ–(");"'";ÿ–(");" eingegeben werden muss. Vergessen Sie dieses Zeichen, kann die jeweilige"[›œ‘"Zeile spaeter nicht vom Assembler uebersetzt werden, und es erscheint die"q›¦‘"Fehlermeldung:"º›°‘" ";ÿ–(");"Der ' fehlt in Zeile ...";ÿ–(")œº‘:‘"Folgt ein Kommentar in einer Zeile, so ist er durch Semikolon abgetrennt."cœÄ‘"Wichtig ist, dass vor dem Semikolon ein Leerzeichen steht. Leerzeichen bedeu-"¹œÎ‘"ten fuer den Assembler, dass z.B. ein Label endet und darauf ein Befehl folgt."؜؋ DR$ðî"j" Ú Pà :Ÿ::¡ ‘/â‘"Deswegen muessen zwischen Label, Befehl, Operand und Kommentar immer (!!) Leer-"…ì‘"zeichen stehen, und duerfen z.B. innerhalb eines Operanden keine (!!) Leerzei-"±ö‘"chen verwendet werden.":‹ DR$ï"j" Ú ‘‘"Beispiel:"ÿ ‘" ld a,( hl ) FALSCH !!!":‘<ž‘" ld a,(hl) RICHTIG !!!":‘ž‘"Am Ende des Programms sollte der Pseudobefehl END stehen. Dieser bedeutet"åž(‘"fuer den Assembler, dass die Uebersetzung hier beendet werden kann. Der Assem-"7Ÿ2‘"bler belegt die Zeilennummer ab 10000 und die Zeile 1. Diese Zeilennummern"~Ÿ<‘"duerfen folglich nicht von den Sourceprogrammen benutzt werden."ΟF‘"Speichern Sie das eingegebene Sourceprogramm als ASCII-Datei, also durch"B P‘">SAVE";ÿ–(");"name.TXT";ÿ–(");",a< oder >SAVE";ÿ–(");"CAS:name";ÿ–(");"<. Da das Laden von ASCII-Dateien"˜ Z‘"laenger dauert , als das von normal abgespeicherten Programmen, laden Sie dann"ó d‘"zuerst den Assembler. Danach wird dann mit >MERGE";ÿ–(");"name.TXT";ÿ–(");"< oder":¡n‘">MERGE";ÿ–(");"CAS:name";ÿ–(");"< das Sourceprogramm geladen."f¡x‘:‘"Nun starten Sie einfach mit >RUN<."¾¡‚‘:‘"Der Assembler fragt dann nach dem Namen des Programms, ob ein Assemblerlisting"¢Œ‘"der Uebersetzung gewuenscht wird, und ob dieses Listing gedruckt werden soll."d¢–‘"Die vorgegebenen Antworten koennen Sie durch >ENTER< waehlen. Waehlen Sie"‹¢ ‘"zunaechst die Standardeingaben."ª¢ª‹ DR$ðî"j" Ú Pà :Ÿ :¡ ‘Ý¢´‘"Jetzt beginnt die eigentliche Uebersetzung:"4£¾‘"Das Ihnen bekannte Assemblerlisting wird auf dem Schirm ausgegeben. Bei Fehler-"ˆ£È‘"auftritt werden die entsprechenden Meldungen vor der jeweiligen Zeile ausge-"Ý£Ò‘"geben. Am Ende des Listings werden, falls vorhanden, die undefinierten Labels"/¤Ü‘"und Variablen angezeigt. Darauf folgt der Programmname, Startadresse, End-"ƒ¤æ‘"adresse, Programmlaenge und die Fehlerzahl. Sind Fehler aufgetreten, koennen"¿¤ð‘"in der entsprechenden BASIC-Zeile korrigiert werden."¥ú‘"Am Schluss des Listings wird eine Tabelle aller Labels und Variablen mit ihren"j¥‘"Werten in der Reihenfolge ihres Auftretens ausgegeben. Zu guterletzt wird ge-"¿¥‘"fragt, ob der Maschinencode gespeichert werden soll. Bei Eingabe von 'j' wird"¦‘"der erzeugte Code als Binaerdatei unter dem eingegebenen Namen abgespeichert."i¦"‘"Nach der Assemblierung befindet sich das Maschinenprogramm an der angegebenen"¼¦,‘"Stelle im Speicher und kann mit der Funktionstaste 1 aufgerufen werden. Die"§6‘"Startadresse wurde mit >DEFUSR1< dem >USR1< Befehl zugeordnet. Die Funktions-"O§@‘"taste 1 wurde ausserdem mit 'X=USR1(1)'+>ENTER< belegt.p§J‹ DR$ðî"j" Ú Pà :Ÿ :¡ ‘:‘Ÿ§T‘"Beispiel: Komplettes Assemblerlisting":‘ǧ^‘" DB80 10 ; Slot PEEK"¨h‘" DB80 20 ; Format: USR1(Adresse),Slot"L¨r‘" DB80 30 ILLFC EQU &H4740 ; Illegal funktion call"–¨|‘" DB80 40 CINT EQU &H2C0A ; Convertiert INTEGER"Ö¨†‘" DB80 50 GETBYT EQU &H51F3 ; Holt Byte"2©‘" DB80 60 SLOTRD EQU &H000C ; Liest Byte von Slot , Adresse "y©š‘" DB80 70 POS1 EQU &F4FA9 ; in FAC laden"À©¤‘" DB80 80 FAC EQU &HF6BC ; Startadresse FAC"Þ©®‘" DB80 90 ;"Cª¸‘" DB80 CD0A2C 100 CALL CINT ; convertiert nach INTEGER und laed Wert nach HL"qªÂ‘" DB83 EB 110 EX DE,HL"ºªÌ‘" DB84 C1 120 POP BC ; Ruecksprungadresse"þªÖ‘" DB85 E1 130 POP HL ; BASIC Pointer"K«à‘" DB86 E5 140 PUSH HL ; Stack wiederherstellen"v«ê‘" DB87 C5 150 PUSH BC"½«ô‘" DB88 D5 160 PUSH DE ; Wert der Adresse"ü«þ‘" DB89 CF 170 RST &H08 ; Test auf"=¬‘" DB8A 2C 180 DB &H2C ; ASCII(',')"¬‘" DB8B CDF351 190 CALL GETBYT ; Holt Slot Nr."Ǭ‘" DB8E FE04 200 CP 4 ; Slot NR. >= 3 ?"á¬&‹ DR$ðî"j" Ú Pà :Ÿ5­0‘" DB90 D24047 210 JP NC,ILLFC ; ja, dann Illegal funktin call"™­:‘" DB93 E3 220 EX (SP),HL ; zu lesende Adresse mit BASIC Pointer tauschen"È­D‘" DB94 CD0C00 230 CALL SLOTRD"®N‘" DB97 CDA94F 240 CALL POS1 ; Akku in FAC laden"T®X‘" DB9A E1 250 POP HL ; BASIC Pointer"–®b‘" DB9B C1 260 POP BC ; Ruecksprung"à®l‘" DB9C D1 270 POP DE ; alter BASIC Pointer"*¯v‘" DB9D E5 280 PUSH HL ; neuer BASIC Pointer"l¯€‘" DB9E C5 290 PUSH BC ; Ruecksprung"³¯Š‘" DB9F 21BCF6 300 LD HL,FAC ; Startadresse FAC"°”‘" DBA2 310 ; A enthaelt bereits Typ 2 (siehe Routine ab &h4fa9)"+°ž‘" DBA2 C9 320 RET"„°¨‘:‘"-------------------------------------------------------------------------------"œ°²‘:‘"Programm :DEMO"ð¼‘"Start : &hDB80 Ende : &hDBA2"â°Æ‘"Laenge : &h23= 35 Bytes"ô°Ð‘"Fehler : 0"±Ú‘"Variablentabelle :"Y±ä‘"ILLFC 4740 CINT 2C0A GETBYT 51F3 SLOTRD 000C POS1 4FA9"l±î‘"FAC F6BC"±ø‹ DR$ðî"j" Ú Pà :Ÿ :¡ ‘:‘:‘㱑"Um Ihnen die Eingabe von laengeren Sourceprogrammen zu erleichtern, enthaelt"9² ‘"diese Diskette das Programm 'AUTOZN.BAS', das den >AUTO< Befehl so veraendert,"—²‘"dass zusaetzlich zur Zeilennummer auch noch der ";ÿ–(");"'";ÿ–(");" ausgegeben wird."ê² ‘:‘"Nach dem Laden der Erweiterung mit >RUN< ist diese automatisch aktiviert."0³*‘"Wollen Sie den >AUTO< Befehl wieder normal benutzen, geben Sie"f³4‘:‘" >POKE &HFF14,&HC9<"º³>‘:‘"ein. Diese Erweiterung ist ab &hE000 an aufwaerts abgespeichert. Damit ist"´H‘"dieser Bereich nicht mehr fuer eigene Maschinenprogramme frei."%´ü&‹ DR$ðî"j" Ú Pà :Ÿ :¡ ‘ÿ–( )<´'˜ Ìý, É:Ì•:É:Ÿ:Œ´':æ**************************** Initialisierung ***************************’´'Ÿ·´$'‚Iï ôß Ù ÿß:‡A$:˜I,ÿ”("&H"ñA$):ƒÕ´.'„ F5,3A,27,F5,32,DC,F2,F1ç´8'„ CD,4d,01,C9ý´B'˜ Íý, ô:˜ Îý, ßµL'Ø,:‘"n";1µV'Ø,:…"Drucker (j/n) ";DR$:Ÿ_µ`'‹(ÿ•(DR$)÷ )ïj Ú ~':˜ Ìý, Ã:DR$ï"j"gµj'‘:Ž·µt':æ********************* Druckerinitialisierung ***************************þµ~'ÿ–();ÿ–(@);::æ---------- Drucker initialisieren ---E¶ˆ'ÿ–();ÿ–(9);::æ---------- Papierende-Fhler aktivieren ---ж’'ÿ–();ÿ–(!);ÿ–(A)::æ-- Druckmodi-Kombinationen ---ζ¦'ÿ–();ÿ–(l);ÿ–( );::æLinken Rand auf 15 Zeichen setzen ---·°'ÿ–();ÿ–(R);ÿ–();::æ-- Deutscher Zeichensatz ---·º'Ž!·PÃXïè?·UÃØ ,<,:½:‘"";U·ZË ìðîÿ–() Ú ZÃs·dÃØ ,<,:½ :‘" ";}·iÃØ X,ƒ·nÃŽchensatz ---·º'Ž!·PÃXïè?·UÃØ ,<,:½:‘"";U·ZË ìðîÿ–() Ú ZÃs·dÃØ ,<,:½ :‘" ";}·iÃØ X,ƒ·n