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. | ||
| + | |||
| + | |||