Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
tiny:software:forth [2022/08/04 06:38] – gelöscht - Externe Bearbeitung (Unknown date) 127.0.0.1 | tiny:software:forth [2024/12/05 13:20] (aktuell) – [Systembeschreibung] volkerp | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== FORTH ====== | ||
+ | |||
+ | * {{ : | ||
+ | * {{..: | ||
+ | * spezifische Beschreibung der Implementation s. [[# | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Das JU+TE-FORTH-System setzt das 4K-System ES1988 sowie 8 Kbyte RAM voraus. | ||
+ | Das FORTH-System wird von Kassette geladen und läßt sich ab %E000 über PROG oder BASIC starten. | ||
+ | |||
+ | Basic: einfach mit RUN (+) starten (Basic-Programm CALL %E00A ist im Forth enthalten)\\ | ||
+ | PROG: GE000, L | ||
+ | |||
+ | * Start auf %E000 | ||
+ | * ab %FC00 Magnetbandpuffer, | ||
+ | * Speichern von %E000 bis DP, am einfachsten bis %FBFF | ||
+ | * 173 Systemworte | ||
+ | |||
+ | |||
+ | Beim 6K-ES4.0 wird Forth auf Adresse %D000 geladen. Der Start erfolgt mit | ||
+ | M | ||
+ | Mon | ||
+ | JD000 | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Das FORTH für ES4.0 ist eine gepatchte Version des FORTH für ES1988. Die Tastaturabfragen erfolgen anders, z.B. haben QUERY und EXPECT neue Implementierungen. Dafür musste VIEW weichen. | ||
+ | |||
+ | Weitere Hinweise s.[[# | ||
+ | |||
+ | **Neue Version** Ich habe die Version fürs ES4.0 überarbeitet. Nun ist ein VIEW mit drin (Im Unterschied zum ES1988-VIEW wird VIEW beim Erreichen von CODE beendet, statt in den Monitor zu springen). Außerdem ist diese Version kürzer als das Original! | ||
+ | |||
+ | ===== Systembeschreibung ===== | ||
+ | |||
+ | aus JU+TE 01/1990, Seiten 70-73 | ||
+ | |||
+ | **FORTH-83-System für JU+TE-Selbstbau-Computer** | ||
+ | |||
+ | Mit der leistungsstarken Programmiersprache FORTH-83 erhält der JU+TE-Computer | ||
+ | neue Anwendungsmöglichkeiten. Mit diesem Beitrag wird ein von Kassette ladbares | ||
+ | FORTH-System beschrieben. Nur für Leser, die diese Sprache bereits kennen, ist es | ||
+ | allerdings in allen Einzelheiten sofort verständlich. Diejenigen, die zum | ||
+ | Beispiel mit unserem ABC den Einstieg beginnen (vgl. dazu S. 67 ff. in diesem | ||
+ | Heft), sollten diese Artikel in Griffnähe behalten, um sich gleichzeitig mit | ||
+ | FORTH-83 und der Handhabung des JU+TE-Systems vertraut zu machen. Die Redaktion | ||
+ | vermittelt übrigens gern das kostenlose Überspielen des JU+TE-FORTH auf | ||
+ | eingesandte Magnetbandkassetten (möglichst CrO2; Rückporto in Briefmarken bitte | ||
+ | nicht vergessen). | ||
+ | |||
+ | **Wichtige FORTH-Worte außerhalb des Standards** | ||
+ | |||
+ | VIEW ( -- ) Anzeige einer Wortdefinition: | ||
+ | LINK (adr -- ) Fortsetzung des Wörterbuchs ab Adresse adr. \\ | ||
+ | INPUT ( -- d) Zahleneingabe mit doppelt genauem Ergebnis. Die Variable DPL wird aktualisiert.\\ | ||
+ | BUSIN (adr -- n) Lesen des Registers mit der Adresse adr (untere acht Bit) in die unteren acht Bit von n.\\ | ||
+ | BUSOUT (n adr -- ) Laden des Registers mit der Adresse adr (untere acht Bit) mit unteren acht Bit von n.\\ | ||
+ | |||
+ | **Konzeption** | ||
+ | |||
+ | Der JUGEND+TECHNIK-Selbstbau-Computer ist durch geringen Hardwareaufwand | ||
+ | gekennzeichnet und bietet keinen großen Spielraum für höhere | ||
+ | Programmiersprachen. Er eignet sich eher für Steuerungsaufgaben als zur | ||
+ | Textverarbeitung oder Datenbankverwaltung. Unter diesen Bedingungen ist FORTH | ||
+ | die geeignetste Hochsprache, | ||
+ | allgemeine Formulierungen unterstützt. Sehr willkommen sind natürlich weitere | ||
+ | Vorzüge wie die gute Ausschöpfung der Rechenleistung zur Ausführung von | ||
+ | Anwenderprogrammen. Das JU+TE-FORTH System setzt 8 Kbyte RAM (voll bestückter | ||
+ | Speichermodul auf Platz 1) voraus. Die ersten fünf Kilobyte benötigt der FORTH- | ||
+ | Kern, für den Anwender bleiben die restlichen beiden Kilo bis %FC00, wo der | ||
+ | Magnetbandpuffer beginnt. Da FORTH deutlich weniger Speicherkapazität als BASIC | ||
+ | in Anspruch nimmt, bieten 2 Kbyte Anwender-RAM sehr viel Platz. | ||
+ | Das FORTH-System wird von Kassette geladen und läßt sich ab %E000 über PROG oder | ||
+ | BASIC starten. Beim Sichern (SAVE) von Anwenderprogrammen muß der Kern | ||
+ | mitgenommen werden, da hier z. B. die Systemvariable DP, die die Endadresse | ||
+ | speichert, enthalten ist. Am einfachsten ist es, stets den RAM Bereich von %E000 | ||
+ | bis %FBFF auf Kassette zu speichern. | ||
+ | |||
+ | Das JU+TE-FORTH-System ist ein FORTH-83- Standard-Subset mit | ||
+ | Standarderweiterungen für doppelt genaue Zahlen. Von den 132 Worten des | ||
+ | sogenannten notwendigen Wortschatzes fehlen die für die Screenarbeit | ||
+ | (Quelltextspeicherung) und für die Teilung des Wörterbuchs in Vokabulare nötigen | ||
+ | sowie die zwanzig in Abb. 1 aufgeführten. Diese werden zum größten Teil implizit | ||
+ | vom System realisiert, lassen sich aber nicht völlig standardgerecht in | ||
+ | Anwenderprogramme einbauen. | ||
+ | |||
+ | Abb 1: | ||
+ | < | ||
+ | ‘ , -TRAILING .( >BODY ABORT | ||
+ | ABORT" COMPILE CONVERT CREATE | ||
+ | DOES> EXECUTE IMMEDIATE LITERAL | ||
+ | PAD SPAN [ ['] [COMPILE] ] | ||
+ | </ | ||
+ | |||
+ | **Besonderheiten** | ||
+ | |||
+ | Auf die Screenarbeit wurde verzichtet, da mit der Bildschirmgröße und RAM- | ||
+ | Austattung des JU+TE-Computers zu enge Grenzen gesetzt sind. Statt dessen können | ||
+ | mit dem Wort VIEW alle Wörterbucheinträge rückübersetzt werden. | ||
+ | |||
+ | Die Vorsätze LIT und DLIT kennzeichnen dabei mit einfachen (16 bit) und mit | ||
+ | doppelter (32 bit) Genauigkeit gespeicherte Zahlen. Sonst erzeugt VIEW die | ||
+ | gleiche Anzeige, die für die Eingabe von Doppelpunktdefinitionen nötig ist. | ||
+ | Maschinenprogramme kennzeichnet VIEW mit CODE. Anschließendes Betätigen der | ||
+ | ENTER-Taste bringt den Maschinencode im DATA-Modus, der mit OFF wieder verlassen | ||
+ | werden kann, zur Anzeige. Jede andere Taste unterdrückt diese Ausgabe. | ||
+ | |||
+ | {{: | ||
+ | Die Übersicht über das Wörterbuch ist damit ganz einfach: WORDS bringt die Namen | ||
+ | (jeweils sieben untereinander) zur Anzeige, wobei mit der ENTER-Taste | ||
+ | fortgesetzt und mit jeder anderen abgebrochen werden kann. VIEW mit | ||
+ | anschließender Namenseingabe zeigt die Wortdefinition auf dem Bildschirm. Damit | ||
+ | kann der Quelltext mit Papier und Bleistift leicht verwaltet und sogar | ||
+ | nachträglich erzeugt werden. FORTH ist flexibel genug, um auch mit minimaler | ||
+ | Hardware auszukommen. Das JU+TE-FORTH-System speichert alles im Wörterbuch | ||
+ | (inline) und benötigt daher keine weiteren Dateien. Beim Übersetzen von Eingaben | ||
+ | entsteht direkt das entsprechende Maschinenprogramm, | ||
+ | üblichen Abstand zwischen der Spitze des Wörterbuchs und dem Pufferspeicher PAD | ||
+ | überflüssig macht. Das erste Byte eines Wörterbucheintrags enthält nur den | ||
+ | Count, die Kennzeichnung als normales (%00) oder als Immediate Wort (%01) folgt | ||
+ | als zusätzliches Byte dem Linkfeld. Es wurde zum Kennzeichnen von | ||
+ | Strukturwörtern (z. B. DO) und zur Steuerung des Rückübersetzens eingeführt. Der | ||
+ | Rumpf ist ein ausführbares Maschinen-Unterprogramm, | ||
+ | auch Parameterfeld realisiert (Abb. 2). Das Wort >BODY ist damit ohne Sinn. Zum | ||
+ | sofortigen Ausführen wird die Eingabe in einen solchen Rumpf an die Spitze des | ||
+ | Wörterbuchs übersetzt und anschließend gerufen. Wenn sich das Wörterbuch nach | ||
+ | vielen Erweiterungen einmal der oberen Anwender-RAM-Grenze %FBFF gefährlich | ||
+ | nähert, kann mit dem Wort LINK die Fortsetzung an beliebiger anderer Stelle (auf | ||
+ | einem weiteren Speichermodul) ausgelöst werden. LINK nimmt die | ||
+ | Fortsetzungsadresse vom Stack. Die aktuelle Endadresse des Wörterbuchs läßt sich | ||
+ | mit Hilfe von HERE jederzeit anzeigen (Abb. 3). | ||
+ | |||
+ | Abb 2: | ||
+ | <a2s> | ||
+ | # | ||
+ | | Countbyte 100XXXXX | ||
+ | # | ||
+ | | Name ASCII | | ||
+ | # | ||
+ | | Linkfeld (High, Low) | | ||
+ | # | ||
+ | | Kennbyte | ||
+ | # | ||
+ | | Maschinencode | ||
+ | | (Rumpf, = CFA = PFA) | | ||
+ | # | ||
+ | </ | ||
+ | |||
+ | Abb 3: Anzeige der Wörterbuchgrenze: | ||
+ | HEX HERE U. DECIMAL | ||
+ | | ||
+ | Für die Zahleneingabe gelten allgemein übliche Regeln: Die Ziffern werden mit | ||
+ | Hilfe der aktuellen Zahlenbasis (Variable BASE) in eine einfach genaue Dualzahl | ||
+ | gewandelt. Enthält das Zahlwort jedoch einen Dezimalpunkt, | ||
+ | Weiterverarbeitung mit doppelter Genauigkeit. Die Variable DPL erhält die Anzahl | ||
+ | der rechts vom Dezimalpunkt stehenden Ziffern (DPL := -1, wenn kein Punkt). Ein | ||
+ | Minuszeichen im Zahlwort bewirkt das Negieren des gewandelten Wertes. Die in | ||
+ | Standardprogrammen übliche Zahleneingabe mit SPAN und CONVERT läßt sich mit dem | ||
+ | JU+TE-FORTH-Kern nicht standardgerecht ausführen. Die Schwierigkeiten | ||
+ | resultieren aus der Nutzung des Bildwiederholspeichers als Eingabepuffer. Statt | ||
+ | dessen gibt es hier das Wort INPUT, das eine Zahleneingabe mit ENTER als | ||
+ | Abschluß fordert und als doppelt genaue Zahl auf dem Stack hinterläßt. | ||
+ | |||
+ | FORTH arbeitet mit Speicheradressen. Zum Standard gehören keine Worte, die sich | ||
+ | auf Register beziehen. Passend zum FIG-FORTH für die Kleincomputer KC 85 enthalt | ||
+ | das JU+TE-FORTH-System die Wörter BUSIN und BUSOUT, die wie @ und ! wirken, aber | ||
+ | mit Register- statt Speicheradressen arbeiten (KC: E/ | ||
+ | Stack in den Registern %20 bis %4F des Einchip-Mikrorechners befindet, muß auch | ||
+ | BUSIN statt @ für die Anzeige des Stackinhalts verwendet werden. Abb. 4 gibt | ||
+ | zwei dafür gut geeignete Definitionen. Das Zeichen @ wird übrigens mit SHIFT P | ||
+ | eingegeben. Das Reservieren von Freibereich im Wörterbuch läßt sich allgemein | ||
+ | mit n ALLOT (ENTER) ausführen. Bei n = 9 und n = 10 muß beim JU+TE-FORTH nach n | ||
+ | die ENTER-Taste zusätzlich betätigt werden, damit sich die compilierte Eingabe | ||
+ | und das zu verschiebende Linkfeld nicht gegenseitig stören. Das hängt damit | ||
+ | zusammen, daß als Eintritt für die Suche nach Wortdefinitionen an der Spitze des | ||
+ | Wörterbuchs (HERE) einfach die Adresse des zuletzt eingetragenen Wortnamens | ||
+ | (Linkfeld) steht. | ||
+ | |||
+ | Abb 4: Anzeige des Stackinhalts: | ||
+ | < | ||
+ | : S. 78 SP@ DO I | ||
+ | BUSIN I 1+ BUSIN | ||
+ | 256 UM* DROP + CR | ||
+ | 2 +LOOP ; | ||
+ | : STACK DEPTH 0> IF | ||
+ | S. ELSE ." LEER" | ||
+ | THEN ; | ||
+ | </ | ||
+ | FORTH lebt grundsätzlich vom Erweitern des Wörterbuchs. Fehlende Standardworte | ||
+ | sind kein großes Problem, da sie sich grundsätzlich nachtragen lassen. (Das | ||
+ | Überführen von TINY-BASIC in extended BASIC ist dagegen z. B. völlig unmöglich.) | ||
+ | Die in Abb. 1 aufgezählten Wörter werden zumindest im JU+TE-FORTH-System kaum | ||
+ | benötigt (vgl. INPUT für SPAN und CONVERT). Am ehesten wird CREATE vermißt. Es | ||
+ | läßt sich mit VARIABLE (name) -2 ALLOT ersetzen. Das in Verbindung mit CREATE | ||
+ | interessante Komma kann, wie in Abb. 5 dargestellt, | ||
+ | Wort J, das bei verschachtelten DO ... LOOP-Strukturen den Index der | ||
+ | nächstäußeren Schleife zum Stack kopiert, setzt voraus, daß die innere Schleife | ||
+ | als Wort definiert wurde und so nur mit dem Namen in der äußeren erscheint. Das | ||
+ | trägt den Stilforderungen Rechnung, die nur eine Struktur wie DO ... LOOP in | ||
+ | einer Doppelpunktdefinition zulassen. | ||
+ | |||
+ | Abb 5: Eintragen von TOS ins Wörterbuch (n --): | ||
+ | < | ||
+ | : , HERE 2 ALLOT ! ; | ||
+ | </ | ||
+ | |||
+ | **Maschinenprogramme** | ||
+ | |||
+ | Das Wort CODE gestattet Wortdefinitionen in Maschinensprache. Nach Eingeben des | ||
+ | Wortnamens und Betätigen der ENTER Taste ruft das JU+TE-FORTH-System das | ||
+ | Betriebsprogramm DATA mit dem ersten Byte des Rumpfes auf der Eingabeadresse. | ||
+ | Ab dort kann das Maschinenprogramm eingetragen werden. Der Registerpointer steht | ||
+ | beim Rufen von Maschinenprogrammen auf %10. Die Arbeitsregister r2 und r3 | ||
+ | speichern den TOS. Zum Rechnen stehen r4 bis r11 zur Verfügung. Auch die | ||
+ | Register %02 bis %0F (einschließlich der Ports) dürfen benutzt werden. Beim | ||
+ | Zugriff auf den Bereich ab %50 ist das Betriebssystem zu berücksichtigen. Die | ||
+ | Register %20 bis %4F bleiben für den Stack reserviert und damit tabu. | ||
+ | Stackpointer ist das Arbeitsregister r15. Diese Aufteilung gestattet das | ||
+ | Verwenden der allgemein nutzbaren Betriebs-Unterprogramme (vgl. JU+TE 5/89 S. | ||
+ | 380) auch für das FORTH-System. | ||
+ | |||
+ | Nach Eingabe des letzten Bytes des Maschinen-Unterprogramms (meist AF) wird die | ||
+ | Definition mit OFF abgeschlossen. Dabei verwendet das FORTH-System die aktuelle | ||
+ | Eingabeadresse als HERE (Adresse des ersten freien Bytes). Es ist daher nicht | ||
+ | gleichgültig, | ||
+ | automatische Adreßberechnung (Binden) zum Einsatz kommen, müssen die | ||
+ | betreffenden Operandenbytes bei der Eingabe zunächst frei bleiben (z.B. %FF). | ||
+ | Nach Eingabe dieses unfertigen Programms unter FORTH kann es mit VIEW angezeigt | ||
+ | werden. Über RESET und PROG ist das Nachtragen der Marken und schließlich das | ||
+ | Binden nötig. Nach dem Neustart des FORTH-Systems steht das neue Wort dann zur | ||
+ | Verfügung. Die Adresse der Markentabelle sollte bei diesem Verfahren vor Beginn | ||
+ | der Definition des Maschinenprogramms bereits vereinbart sein, damit PROG gleich | ||
+ | zur richtigen Adresse führt. | ||
+ | |||
+ | **Anwendung** | ||
+ | |||
+ | Das JU+TE-FORTH-System besitzt eine hohe Ausführungsgeschwindigkeit. Im | ||
+ | Vergleich zu anderen FORTH-Systemen dauert jedoch die DO-LOOP-Schleife länger, | ||
+ | da das erforderliche Verwalten von Index und Grenze im Return-Stack beim | ||
+ | Einchip-Mikrorechner größere Umstände macht. Das Übersetzen von Eingaben | ||
+ | erledigt ein Interpreter. Die hier spürbaren Laufzeiten beeinträchtigen aber | ||
+ | nicht die Geschwindigkeit beim Ausführen auf diese Weise erzeugter | ||
+ | Maschinenprogramme (im Rumpf). | ||
+ | |||
+ | Die Übertragbarkeit von FORTH-Programmen auf andere Rechner setzt voraus, daß in | ||
+ | den Definitionen ausschließlich der Standardwortschatz verwendet wird. | ||
+ | Maschinenprogramme, | ||
+ | Übertragbar ist stets der Quelltext, nicht jedoch das auf Kassette speicherbare | ||
+ | Wörterbuch. Das hat auf anderen Rechnertypen mit Sicherheit Abweichungen, | ||
+ | wenn das gleiche FORTH-Programm kompiliert wurde. | ||
+ | |||
+ | Viel Spaß beim Programmieren in FORTH! | ||
+ | |||
+ | Dr. Helmut Hoyer | ||
+ | |||
+ | **HINWEIS** | ||
+ | |||
+ | JU+TE 01/1990, Seiten 70-73 | ||
+ | |||
+ | Zunächst noch ein Hinweis zum | ||
+ | FORTH-System, | ||
+ | JU+TE eingesandte Magnetbandkassetten | ||
+ | geladen wird: | ||
+ | Dieses Programm nutzt den | ||
+ | RAM-Modus des 4-K-Betriebssystems | ||
+ | zur Anzeige | ||
+ | und zur Eingabe von Maschinenprogrammen | ||
+ | in FORTH-Wörtern. | ||
+ | Befindet sich das | ||
+ | Betriebssystem in einem U | ||
+ | 2732 C oder U 2764 C, gilt die | ||
+ | Startadresse %1352. Ist das | ||
+ | Betriebssystem in zwei U 2716 | ||
+ | C geteilt, beginnt der RAM-Modus | ||
+ | jedoch auf %2352. In | ||
+ | diesem Fall müssen im | ||
+ | FORTH-System die Bytes auf | ||
+ | den Adressen %EBEB und | ||
+ | %EDD3 von %13 auf %23 | ||
+ | geändert werden, damit die | ||
+ | Anwendung des Wortes CODE | ||
+ | klappt. Für diese Änderung | ||
+ | eignet sich der RAM-Modus, | ||
+ | nach Laden des FORTH-Systems | ||
+ | aus dem Resetmenü gestartet, am besten. | ||
+ | |||
+ | ===== Einstieg ===== | ||
+ | |||
+ | Als kleines " | ||
+ | |||
+ | < | ||
+ | : MALFOLGE 11 1 DO DUP I * . LOOP DROP ; | ||
+ | </ | ||
+ | |||
+ | Damit hat man ein Programm (eine neues FORTH-Wort) " | ||
+ | |||
+ | 3 MALFOLGE | ||
+ | 9 MALFOLGE | ||
+ | -2 MALFOLGE | ||
+ | 111 MALFOLGE | ||
+ | |||
+ | Als weiteren Einstieg kann ich das auch Handbuch zum KC85-Forth empfehlen. Es ist sehr gut geschrieben. Über weite Teile kann man das auch für den TINY nehmen, z.B. " | ||
+ | |||
+ | ===== ES4.0 ===== | ||
+ | |||
+ | * angepasstes FORTH, Laden mit LD000 | ||
+ | * Starten mit JD000, entspricht im wesentlichen dem FORTH des 4K-Systems, | ||
+ | * Befehl VIEW existiert nicht | ||
+ | * Befehl CODE ruft den MON auf, in Register %20/21 steht, wo man mit Eintragen des Codes beginnen kann, vor Rueckkehr mit Q in %20/21 die Adresse | ||
+ | * Nutzt den 80-Zeichen-Modus des EDI | ||
+ | * Vor einer Eingabezeile braucht kein so merkwuerdiges Zeichen stehen wie bei 4K-Version | ||
+ | * Letzte Position der Eingabezeile wird normalerweise nicht genutzt, wenn dort aber ein \ Zeichen steht, wird noch die Eingabe der naechsten Zeile abge wartet, bevor sie verarbeitet wird. Das kann man bis zu 2 mal machen, beim 3. mal erscheint \#MSG als Fehler | ||
+ | * %F300-F3FF wird als Zeilenpuffer genutzt. | ||
+ | |||
+ | |||