Franzis Computer-Praxis Rolf-Dieter Klein Basic-Interpreter Funktionsweise und Implementierung in 8080/z -80-Computern Mit 43 Abbildungen Franzis!l In der Reihe Franzis Computer-Praxis sind erschienen: Klein, Mikrocomputersysteme Klein, Mikrocomputer Hard- und Softwarepraxis Klein, Z-80-Applikationsbuch Plate, Pascal: Einführung - Programmentwicklung - Strukturen CIP-Kurztitelaufnahme der Deutschen Bibliothek Klein, Rolf-Dieter: Basic-Interpreter: Funktionsweise u. Implementierung in 8080/Z-80-Computern / Rolf-Dieter Klein. - München: Franzis, 1981. (Franzis-Computer-Praxis) ISBN 3-7723-6941-3 © 1982 Franzis-Verlag GmbH, München Sämtliche Rechte, besonders das Übersetzungsrecht, an Text und Bildern vorbehalten. Fotomechanische Vervielfältigungen nur mit Genehmigung des Verlages. Jeder Nachdruck - auch auszugsweise - und jegliche Wiedergabe der Bilder sind verboten. Satz: SatzStudio Pfeifer, Germering Druck: Franzis-Druck GmbH, Karlstraße 35, 8000 München 2 Printed in Germany . Imprime en Allemagne ISBN 3 -7723-6941-3 Vorwort Basic ist als Programmiersprache wohl je Einführung Über die unterschiedliche Ar dermann geläufig, der sich mit Mikrocom beitsweise von Interp~etern-undCompller putern beschäftigt. S~ho~bi~her wurde wlr(rdas';~RiYitBa'sjc,jaiinand eInes fT2"" vi~l Ü~erBasic gesc~ileben"'~'die'"A;t'd';r stings und Syntaxdiagramme ausführlich Piog~amm"ieiung;die ~'e~s~hied enen Dia behandelt. Dann folgt ein Abschnitt, der lekte, aber kaum ej}Vasjjber die Realisi~ insbesondere den Z80-Besitzern gilt: ein rung V()nB~~i~=rr;'terpret;;;~-Hie;:sorrntin 12-K Byte-Basic mit sehr leistungsfähigem -CintK16gHchkelr'gegeoen'werd en, hinter Befehlssatz, und schließlich für Z8000-Be die Kulissen zu sehen und nicht nur in der sitzer das RDK-Basic als Z8000-Variante, Lage zu sein, in Basic programmieren zu wobei hingegen der Rest des Buchs Über können, sondern auch einen Basic-Inter wiegend in 8080-Maschinensprache ge p~eter selbst zu~chreiDenoder~derthi~~ schrie ben ist. 'erwertern, DeschrTebe;:;'enjnt~rpreterzu Auch für Leser, die keinen der genann umzubaue'no~ereigine:laeenliTI1;rufUgen ten Prozessoren besitzen, ist es leicht, die zu"kÖ-;;~e~. 'D~~~h'da'~be~~ereVersÜindr1is Programme zu verstehen und ggf. für den der Wifkungsweise eines Interpreters wird eigenen Prozessor aufzubereiten. der Leser auch in der Lage sein, Basic-Pro Aber auch Leser, die sich "nur" in die gramme wirkungsvoller zu schreiben und Assem biersprache einarbeiten wollen, wer manche Eigenheiten besser zu verstehen. den in den Listings viele Tricks und Kniffe Das Buch gliedert sich im Prinzip in kennenlernen und Einblick in die Program vier Absclinitte: Nach einer prinzipiellen mierung gewinnen. Rolf-Dieter Klein 5 Wichtiger Hinweis Die in diesem Buch wiedergegebenen Schaltungen und Verfahren werden ohne Rück sicht auf die Patentlage mitgeteilt. Sie sind ausschließlich für Amateur- und Lehrzwecke bestimmt und dürfen nicht gewerblich genutzt werden. Alle Schaltungen und technischen Angaben in diesem Buch wurden vom Autor mit größter Sorgfalt erarbeitet bzw. zusammengestellt und unter Einschaltung wirksamer Kontrollrnaßnahmen reproduziert. Trotzdem sind Fehler nicht ganz auszuschließen. Der Verlag sieht sich deshalb gezwungen, darauf hinzuweisen, daß er weder eine Garantie noch die juristische Verantwortung oder irgendeine Haftung für Folgen, die auf fehler hafte Angaben zurückgehen, übernehmen kann. Für die Mitteilung eventueller Fehler sind Autor und Verlag jederzeit dankbar. 6 I Inhalt 1 Mikrocomputer und Basic ................................ . 9 2 RealisierungsmögIichkeiten von Basic . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.1 Der Interpreter ....................................... . 10 2.2 Der Compiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.3 Teilübersetzung als Komprorniß . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 29 3 RDK-Basic .......................................... . 31 3.1 Ein "Tiny Basic" und dessen Einsatz ......................... . 31 3.2 Hardware bei Z80 und Z8000 zum Betrieb des Tiny Basic ........... . 31 3.3 Realisierung des Basic-Interpreters . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.3.1 IjO-Routinen ........................................ . 66 3.3.2 Einfache zeichenverarbeitende Routinen ...................... . 67 3.3.3 Analyse von arithmetischen Ausdrücken . . . . . . . . . . . . . . . . . . . . . . . 70 3.3.4 Befehlsabarbeitung .................................... . 77 3.3.5 Basic-Programmbeispiele. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 3.3.6 ErweiterungsmögIichkeiten des Basic-Interpreters ................ . 93 3.3.6.1 FIießkomma-Arithmetik .................................. . 93 3.3.6.2 Floppy-Anschluß ...................................... . 101 3.3.6.3 Graphik-Erweiterungen .................................. . 101 4 12-KByte-Basic für Z80 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 103 4.1 Anpassung des Basic-Interpreters . . . . . . . . . . . . . . . . . . . . . . . . . . .. 115 4.2 12-KByte-Basic-Befehlsbeschreibung. . . . . . . . . . . . . . . . . . . . . . . . .. 116 4.3 Programmbeispiel ELIZA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 125 5 Anhang. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 129 5.1 Z8000-Basic. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 129 5.1 .1 Z 8000-Monitor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 163 5.1.2 Der Basic-Interpreter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 164 5.2 Literaturverzeichnis. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 164 5.3 Glossar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 165 Sachverzeichnis. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 177 7 1 Mikrocomputer und Basic B.A.S.LC. (Beginners All Purpose Symbol kamen sogar s12~:zi~pe Basic-R~chner wie ic Instruction Code) wurde 1962 von J ohn ~~Rl~J. .f .~It_.~~~~~XE~~§]~us~~h~;;us. Kemeny und Thomas Kurtz "e:funden". ~eiMi!cr9forn pute~-N ~uerlt\ViskluI1geI1 Wegen der leichten Erlernbarfiir'und~(re; gi~L.~~. . I1 ~e.fmf!t~i:s~h:9.n:~Shne)1 ~I~en:.dii einfachen Realisierung wurde es sehr zl!g~n<ir!g~!1 •.1 3.e.~iS-I.ßtt!IJ>E~ter. Basic be schnell bei Mikrocomputern als Program sitZt 'neben dem großen Vorteil der leich miersprache eingesetzt und ist jetzt in ten Erlernbarkeit auch den Vorteil, daß einer Vielzahl von Dialekten und Erweite Programmtests schnell durchgeführt wer rungen auf dem Markt. den können und mit wenig Aufwand ein lauffähiges Programm erstellt werden kann. g,~~lS~,~~.13~.gi!Jn;. .< !eE.Mikro com Pllter~e schIchte kamenB.a~ls-.Inte.I'PEet~r auf. Sie wareitzun1ichst sehr einfach und mit vie In den folgenden Kapiteln wird gezeigt, len Einschränkungen versehen. Basic wur wie es möglich ist, einen Basic-Interpreter de dann immer weiter ausgebaut, und es zu konstruieren. 9 2 Realisierungsmöglichkeiten von Basic Der Mikrocomputer hat die Aufgabe, die Basic", und es soll hier wirklich nur das eingegebenen Basic-Kommandos und Pro Prinzip verdeutlicht werden. gramme zu verstehen und auszuführen. Dafür gibt es im Prinzip drei Möglichkei- ten: ,.. "~=.,"~,,. ~ '.~ .,.,,,.·.o,"=,~~ Die Befehle lauten im einzelnen: Im ersten Fall versteht der Computer LOAD (adr) La Laden des auf der die Basic-Befehle unmittelbar und führt Adresse "adr" stehen- sofort, nachdem er~erne;"iraehl verstan den Wertes in den den hat, diesen aus. Dies nennt man Inter Akkumulator. pretation. Das dazugehörige Maschine!'ip";o STORE adr Sa Der Inhalt des Akku- gramrr!wird InterpEtl!tlE genannt. Dann gibt 'es noch die Möglichkeit die mulators wird auf die Adresse "adr" gespei- Basic-Befehle in ein Ma§cllinenprugramm cher( umzuvl'ande1fi··una dann auszuführen. Es ~lrdda~~ ein Compiler benötigt. Die dritte ADD (adr) Aa Zum Inhalt des Akku- Art stellt gewisse:;:maß~n eine Mischung aus mulators wird der In- In terp!~t.tl!'"1l!!.d.G2!!!r>gtl.r dar, d'IesasTc:·e halt des auf der Adres- " :sel'ehle werden in meist.ein ~xte langtlAb se "adr" stehenden kürzungen ("Token;;','int~rn~Darstellung) Wertes addiert. Das umgewandelt, und diese werden nach Ergebnis steht also "RUN" interpretiert. Im folgenden sollen im Akku. diese drei Arten anhand von kurzen Bei NEG Nd Der Inhalt des Akku- spielen weiter verdeutlicht werden. mulators wird bitwei- se komplementiert. "d" steht für "dummy" und be- 2.1 Der Interpreter sitzt keine Bedeutung, muß allerdings vor- Ein Basic-Befehl wird erkannt und dann handen sein. sofort ausgeführt. Um die Arbeitsweise eines Interpreters besser verstehen zu kön JUMP adr Ja Sprung auf die Adres- nen, soll eine kleine Programmiersprache se "adr" im Pro- erfunden werden, für die ein Interpreter gramm teil, dort wird gebaut wird. der nächste Befehl Die Programmiersprache besteht aus ausgeführt. einbuchstabigen Befehlen, die von einem JMPNZ adr Ia Falls der Inhalt des weiteren Byte, dem Operanden gefolgt Akkumulators un- sind. Sie ähnelt damit zwar mehr einer As gleich Null ist, wird sembiersprache für einen Prozessor, als ei auf die Adresse "adr" ner höheren Programmiersprache, doch im Programmteil ge- sonst wären wir ja schon bei dem "RDK- sprungen. 10 2.1 Der Interpreter OUTHEX (adr) Oa Der Inhalt der Spei und Programm teile auch vom Programm cherzelle auf "adr" fiernlchfeITeicl1bäfslrid:~DÖchdas ·is'fähn in sedezimaler (hexa lieh zuBasic, denn dort kann imNorr6'al~ dezimaler) Form auf (atlalicnrücht vom Progra~~aus~~fdas die Konsole ausgege P~ogr;~~~~ibst zugegrrtfenweraen~ Eln ben. Programm in unserer Programmsprache sieht z.B. wie folgt aus: GETHEX (adr) Ga Von der Konsole wird ein sedezimaler (hexa G~$ G~l L~~ A~l S$$ O~~ H$~ dezimaler) Wert geholt (Parameter in Sedezimal) und auf die Speicher zelle "adr" geschrie Ein Speicherauszug (sedezimal) sieht wie ben. folgt aus: CRLF Cd Es wird ein Carriage Return Line Feed 47 ~~ 47 $1 4C ~~ 41 ~l 53 ~~ 4F ~$ 48 ~~ (CRLF, Wagenrück laufjZeilenvorschub) Das Programm bewirkt das Einlesen zweier an die Konsole ausge Zahlen, addiert diese, dann wird die Summe geben. "d" steht ausgegeben und das Programm mit einem wieder für "dummy", Halt beendet. da bei CRLF keine Abb. }.1-1 zeigt die Hauptschleife des zusätzlichen Parame Interpreterprogramms. Als erstes wird der ter nötig sind. Programmzähler mit einem Startwert vor ZEICH(adr) Za Der Inhalt der Spei- besetzt. Von dieser Adresse wird nach dem cherzelle "adr" wird erstmaligen Start des Interpreters der erste als ASCII-Zeichen in Befehl geholt. terpretiert und dann Nun beginnt die eigentliche Schleife. Es auf der Konsole aus wird der Befehl vom Speicher geholt. Da gegeben. bei wird hier die Befehlskurzbezeichnung HALT Hd Das Programm ist be sowie der darauf folgende Datenwert gela endet und es wird den. Daher ist es auch nötig, im Programm ein Stop ausgeführt. immer einen Parameter mit anzugeben, "d" steht für auch wenn der Befehl selbst ihn gar nicht "dummy", da kein benötigt, zum Beispiel beim HALT-Befehl. weiterer Parameter Der Programmzähler wird dann erhöht - nötig ist. in unserem Fall um den Wert zwei, da ein Befehl zwei Speicheradressen belegt. Es folgt nun die Abfrage auf die einzelnen Be Die hypothetische Maschine mit dem obi fehle. Trifft einer der Fälle zu, so wird das gen Befehlssatz besitzt einen Akkumulator dazugehörige Teilprogramm angesprungen. und kann 256 Bytes Programm und 256 Wurde kein Befehl erkannt, so wird auf Bytes Daten adressieren. eine Fehlerroutine gesprungen. Ein Programm wird durch Hintereinan derschreiben der obigen Befehle gebildet. Abb. 2.1-2 zeigt die einzelnen Teilpro Dabei werden Parameter in binärer Form gramme. Bei LOAD zum Beispiel wird der direkt hinter das Befehlswort geschrieben. Parameter des Befehls als Adresse interpre Eine Besonderheit ist, daß Daten adreß tiert und der Inhalt dieser Speicherzelle mäßig vom Programm völlig getrennt sind wird in den Akkumulator geladen. Beim 11 2 Realisierungsmöglichkeiten von Basic Abb. 2.1-1 Hauptschleife des Interpreters lade Befehl Speichere Befehl Addieren Negieren Sprung unbedingt Abb. 2.1-2 Teilprogramme des Interpreters Sprung, wenn nicht 0 Hex Ausgabe STORE-Befehl ist es entsprechend umge kehrt. Beim Sprungbefehl JUMP wird der >-:....------ Hex Eingabe Parameter direkt in den Programmzähler gespeichert und damit der Sprung ausge führt. Beim bedingten Sprung wird zuvor noch der Akkumulatorinhalt auf Null ge Carriage return testet und der Sprung ausgeführt falls der Inhalt ungleich Null ist. Beim HALT-Befehl wird die Programm Zeichenausgabe ausführung gestoppt und eine Meldung auf der Konsole ausgegeben. Es wird an schließend gewartet bis eine Taste betätigt Halt der CPU wurde und dann der Interpreter von neuem gestartet (Rücksetzstart). Tritt ein Fehler auf, so geschieht genau das Gleiche. Es wird nur eine andere Meldung ausgegeben. 12