Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

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.1tiny:software:forth [2024/12/05 13:20] (aktuell) – [Systembeschreibung] volkerp
Zeile 1: Zeile 1:
 +====== FORTH ======
 +
 +  * {{ :tiny:software:tiny_forth.zip |}} JU+TE-FORTH für 4K ES1988 und 6K ES4.0, incl. Assembler-Quellcodes
 +  * {{..:forth-83.pdf}} (allg.) FORTH-Lehrgang aus Jugend+Technik, von Dr. H. Hoyer
 +  * spezifische Beschreibung der Implementation s. [[#Systembeschreibung|]] (Auszug aus {{:tiny:jutecomp3.pdf|JU+TE 01/1990}})
 +
 +{{:tiny:unickel_tiny_v12.jpg?200}} {{:tiny:forth_4k.gif?150|}} 
 +
 +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, bis dahin frei für Prg. (ca. 2KByte)
 +  * 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
 +
 +{{:tiny:forth_6k_start.gif|}} {{:tiny:forth_6k_words.gif|}}
 +
 +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.[[#es40|]].
 +
 +**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: VIEW (name)\\
 +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, da sie sowohl maschinennahe Programmierung als auch
 +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:
 +<code>
 +  ‘ , -TRAILING .( >BODY ABORT
 +  ABORT" COMPILE CONVERT CREATE
 +  DOES> EXECUTE IMMEDIATE LITERAL
 +  PAD SPAN [ ['] [COMPILE] ]
 +</code>
 +
 +**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.
 +
 +{{:tiny:forth_4k_view.gif?150 |}} 
 +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, was sogar den sonst
 +ü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, das sowohl Codefeld als
 +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) |
 +#----------------------#
 +</a2s>
 +
 +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, erfolgt die
 +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/A-Adressen). Da sich der
 +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:
 +<code>
 +: S. 78 SP@ DO I
 +  BUSIN I 1+ BUSIN
 +  256 UM* DROP + CR
 +  2 +LOOP ;
 +: STACK DEPTH 0> IF
 +  S. ELSE ." LEER"
 +  THEN ;
 +</code>
 +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, nachgetragen werden. Das
 +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 --):
 +<code>
 +  : , HERE 2 ALLOT ! ;
 +</code>
 +
 +**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, in welchem Zustand der DATA-Modes verlassen wird. Soll die
 +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, die mit CODE erfaßt wurden, zählen grundsätzlich nicht dazu.
 +Übertragbar ist stets der Quelltext, nicht jedoch das auf Kassette speicherbare
 +Wörterbuch. Das hat auf anderen Rechnertypen mit Sicherheit Abweichungen, auch
 +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, das auf an
 +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 "Programm" zum Einstieg kann man die Malfolge nehmen
 +
 +<code>
 +: MALFOLGE 11 1 DO DUP I * . LOOP DROP ;
 +</code>
 +
 +Damit hat man ein Programm (eine neues FORTH-Wort) "MALFOLGE" definiert. Mit einer Zahl davor wird die Malfolge 1*n .. 10*n ausgegeben:
 +
 +  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. "Elefanten füttern"! http://www.mpm-kc85.de/dokupack/M026_FORTH.pdf
 +
 +===== ES4.0 =====
 +
 +  * angepasstes FORTH, Laden mit LD000
 +  * Starten mit JD000, entspricht im  wesentlichen dem FORTH des 4K-Systems,  wurde aber auf %D000 verschoben
 +  *  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  hinter dem Code eintragen
 +  *  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  also max. 237 Zeichen pro Zeile
 +  *  %F300-F3FF wird als Zeilenpuffer genutzt.
 +
 +