0800 8c9f 0000 I ... Z1013-FORTH.DOC
 Das Programmiersystem




        ___________
       |           |
       | F O R T H |
       |___________|

fuer den Kleinrechner-Bausatz Z1013

bearbeitet: B.Schubert                       Leipzig, 11/1987

0.   Einleitung

1.   Speicherkonzept

2.   Abweichungen vom FIG-Standard
2.1. Reihung, Sprachumfang
2.2. Kassettenarbeit mit FCB
2.3. Abweichungen im wortinternen Aufbau

3.   Erweiterungen des Wortschatzes
3.1. Worte aus dem F79-Standard und Hilfsworte
3.2. Editor
3.3. Case-Struktur
3.4. Dump
3.5. Disco

4.   Systemdatenbereiche
4.1. Cold-Start-Area
4.2. Anpassungs-Area

5.   Literaturhinweise
6.   Glossar


0.   Einleitung
_______________

Forth  ist  ein 1971 von Charles Moore  entwickeltes  Sprach-
und  Systemkonzept,   das  mit  wenigen Betriebssystemschnitt-
stellen  arbeitsfaehig  ist  und sich daher besonders  fuer 
Kleinrechner,  Heimcomputer,  industrielle Steuerungen und aehnliche
Anwendungsfaelle eignet.
In  der  DDR ist Forth im Vergleich zu anderen Hochsprachen  noch 
relativ wenig verbreitet.
Die  vorliegende Forth-Version entstand aus einer  Arbeitsversion 
eines Forth-Systems fuer den KC 85/1 (Z9001), die an der Wilhelm
Pieck-Universitaet entwickelt wurde und dem Robotron-Computer-
club zur Verfuegung stand. Nach der Konvertierung auf einen Z1013
wurde  das  System  nahezu ausschliesslich mit  sich  selbst  neu 
erstellt. Dabei wurden zunaechst die Schnittstellen angepasst und 
vorhandene Adressfehler in einigen Worten beseitigt.
Als Vorbild fuer die Erweiterungen zu einem komfortablen
Entwicklungssystem  diente  vorwiegend eine  Version  von  "Microsystems 
Laboratory  Los Angeles",  in der DDR bekannt als  "FORTHLE.COM". 
Von  diesem System wurden einige Funktionen dem Sinn nach 
uebernommen und fuer das vorliegende System zugeschnitten.


1.   Speicherkonzept
____________________

Das  vorliegende  System benutzt einen RAM-Bereich ab  100H.  Der 
Kaltstart beginnt auf der Adresse 334H.  Entsprechend der
Konvention  fuer CP/M ist fuer eine uebersichtliche  Programmgestaltung 
der  Kaltstart  auf  die Adresse 100H  mit  einem  Zwischensprung 
vorverlegt.  Der Bereich von 100H bis 200H ist frei und kann fuer 
Anpassungen   (z.B.:fuer  Save/Load-Routinen   anderer   Formate) 
genutzt werden.  Im KC 85/1 ist dieser Bereich vom Betriebssystem 
belegt.
Ab 200H beginnen die Routinen fuer die Anpassung an das
Betriebssystem (Anpassungsarea),  der Bereich der User-Variablen und  der 
Returnstack.Die Primitivworte fuer die Schnittstellenanpassung an 
das  Betriebssystem wurden voellig neu gestaltet bzw.  beseitigt. 
Das System wurde so umgearbeitet,  dass alle hardwarespezifischen 
Routinen  fuer  Ein/Ausgaben auf  diesen  speziellen 
Anpassungsbereich zugreifen.
Auf  Adresse  300H  steht ein Sprung zum  Warmstart  des  Systems 
(339H)  und dahinter das zugehoerige Aufrufwort entsprechend  dem 
Format fuer den KC 85/1 (WFORTH).
Gegenueber  anderen Sprachkonzepten (z.B.CAOS-FORTH fuer KC 85/2) 
ist dieses Forth so aufgebaut,  dass es Hilfsmittel besitzt, sich 
selbst  zu  vervielfaeltigen (SAVE).  Dadurch kann  die  aktuelle 
Laenge des Forth beim Abspeichern jeweils verschieden  sein.  Die 
Endadresse  des  abzuspeichernden  Systems wird immer  auf  XXFFH 
aufgerundet.
Der vom Forth-System waerend der Arbeit genutzte
Speicherbereich  ist in seiner Grundform auf 4000H d.h. 16kByte eingestellt. Damit 
wird  vielen  Anwendern die Moeglichkeit gegeben, ohne 
Speichererweiterung arbeiten zu koennen. Einschraenkungen des vorhandenen 
Wortschatzes treten dadurch nicht auf.  Bei Speichererweiterungen 
kann  durch  Aendern der Konstanten 'LIMIT' auf die  erste  nicht 
mehr  verfuegbare  Speicheradresse der Bereich fuer  die  Screen-
Puffer  beliebig  geaendert werden.  Ueber einen  anschliessenden 
COLD- oder WARM-Aufruf wird die Anzahl der SCR-Puffer neu
berechnet  (#BUFF).  Beim  Abspeichern  eines  so  geaenderten  Systems 
enthaelt das System die neuen Parameter!
Eine  Verschiebung des Datenstacks und der  Woerterbuchobergrenze 
fuer groessere Erweiterungen obliegt den jeweiligen Anforderungen 
und den Systemkenntnissen des Anweders.


2.   Abweichungen vom FIG-Standard
__________________________________

2.1. Reihung, Sprachumfang

Forth  stellt  eine sogenannte "offene"  Sprache  dar,  d.h.  ihr 
Sprachumfang  ist  theoretisch unbegrenzt und wird  vom  Anwender 
staendig  erweitert.  Daher  muss  bei  der  Implementierung  des 
Systems eine fuer den Anwender sichtbare Grenze geschaffen werden 
die kennzeichnet, wo der systembedingte Grundwortschatz endet und 
die  Anwenderworte beginnen.  Diese Grenze stellt im  allgemeinen 
das Wort 'TASK' dar, welches aus einer Leerdefinition besteht.
Unterhalb  dieses  Wortes wird das Forth ueblicherweise mit Hilfe 
eines Assemblers uebersetzt.  Dabei werden Assemblerworte
(Primi- tive) direkt uebersetzt und Forth-Worte (Secondarys) mit DA  (De-
finiere  Adresse)  aufgebaut.  Bei dieser Vorgehensweise  ist  es 
nicht  zwingend  notwendig  in allen Faellen  die  Forth-typische 
Arbeitsweise ein Wort nur aus vorangegangenen zu erstellen
einzu- halten.  Im vorliegenden System wurde darauf geachtet, die Forth-
Reihung weitgehend einzuhalten und die Anzahl an
Vorwaertsverwei- sen zu hoeheren Worten zu minimieren.Aus diesem Grund wurden alle 
Worte oberhalb '(' neu geschrieben.  Das hoechste mit 
Vorwaerts- verweis  addressierte Wort ist 'MESSAGE'.  Fuer den Programmierer 
gilt die Woerterbuchgrenze 'TASK',  der erfahrene
Systemprogram- mierer  hat  die  Moeglichkeit alle Worte oberhalb  'MESSAGE'  zu 
vergessen ohne einen Absturz befuerchten zu muessen.


2.2. Kassettenarbeit mit FCB

Forth  ist  ein Sprachsystem  das  normalerweise  Diskettenarbeit 
beinhaltet.  Die  Diskette kann vom Forth als virtueller Speicher 
ueber ein Fenster (Screen-Puffer) verwaltet werden.  Meisst  wird 
dabei die gesamte Diskette fuer Screens verwendet. Bei der Arbeit 
mit  CP/M  ist das mitunter ein Nachteil,  der bei  "FORTHLE.COM" 
durch die Vergabe von Screen-File-Namen behoben wird.  So ist
ein  uebersichtliches  Sortieren von Screens fuer verschiedene  Anwen-
dungsfaelle und deren Verwaltung vom Betriebssytem aus moeglich.
In Anlehnung daran wurde das Kassetten-Screen-Konzept entwickelt. 
Ein Screen beinhaltet 1/2kByte,  die mit einem Kopfblock zusammen 
auf der Kassette abgelegt werden.  Der im Screen-Kopf  verwendete 
Name  wird beim Kalt- und beim Warmstart in der  Systemausschrift 
angegeben und kann mit dem Wort "USING" dem System neu zugewiesen 
werden.  Der  Aufbau des Kopfblockes entspricht vollstaendig  dem 
des  Header-Save/Load  fuer den Z1013.  Als  Anfangsadresse  wird 
standardmaessig  die  Bildschirmadresse 'EC00H'  eingetragen,  so 
dass ein Screen auch mit Hilfe des HS/L-Programmes ohne Laden des 
Forth schnell gesichtet bzw. kopiert werden kann.


2.3. Abweichungen im wortinternen Aufbau

Bei einigen implementierten Worten weicht der wortinterne  Aufbau 
etwas  von der Empfehlung der FIG ab.  So wurden unter anderem in 
einzelnen  Worten eigene Worte und F79-Worte  verwendet,  um  die 
Implementierung effektiver zu gestalten.  In anderen Worten wurde 
die  innere Stuktur  so geaendert,  dass sich eine  effektvollere 
Bedienung ergibt. Das betrifft  insbesondere die folgenden Worte:

- EMPTY-BUFFERS    dieses  Wort berechnet zusaetzlich die  Anzahl 
                   der  moeglichen Screen-Puffer  zwischen  FIRST 
                   und LIMIT auch wenn LIMIT willkuerlich
veraen-                    dert  wurde  und traegt diese Anzahl in  #BUFF 
                   ein
- FLUSH            dieses  Wort  ist  so  veraendert,  dass  auch 
                   Screens oberhalb 8000H erreicht werden
- +BUF             dieses  Wort weist in Abhaengigkeit von  LIMIT 
                   auch  Puffer  oberhalb 8000H  zu,  LIMIT  muss 
                   nicht mehr direkt auf Pufferobergrenze
berech-                    net  werden.  Das wird von  EMPTY-BUFFERS  und 
                   +BUF uebernommen.
- VLIST            damit  der  Bildschirm  uebersichtlich  bleibt 
                   wurde VLIST in 3 Funktionen veraendert
                   - Auflisten in 2 Kolonnen mit Angabe der NFA
                   - Anhalten und Fortsetzen des Listens mit der
                     Leertaste, andere Tasten brechen ab
                   - Analog FORTH83 wird nur das jeweils aktuelle
                     Vokabular ausgelistet
- LIST             dieses  Wort  erkennt die eingegebene  SCR-nr. 
                   stets als Dezimalwert an,  solange sie 2
Stel-                    len nicht ueberschreitet,  auch wenn eine  an-
                   dere  Zahlenbasis  eingestellt  wurde.  Werden 
                   Hexazahlen (Buchstaben) eingegeben,  so werden 
                   sie in Dezimalzahlen umgerechnet. Alles
darue-                    ber Hinausgehende wird mit Fehler quittiert
- .S               die Darstellung erfolgt so,  dass der TOS oben 
                   ist
- BYE              ist unteteilt in eine innere Routine (BYE) die 
                   den  Sprung zum Betriebssystem  enthaelt(F000) 
                   und eine Verkleidung
- QUIT/COLD/ABORT  wurden  weitgehend den Routinen des  "FORTHLE" 
                   nachgebildet.  So kann auf Adresse 2AH +ORIGIN 
                   die   CFA  einer  Anwenderwortes   eingetragen 
                   werden,  welches  beim Eintritt in das  System 
                   durch ABORT aktiviert wird. Eine zweite
Start-                    routine kann auf der Adresse 2CH +ORIGIN  ein-
                   getragen  werden,  die  stets durch  das  Wort 
                   'QUIT' aktiviert wird (z.B.Einstellen HEX)
- FORGET           dieses  Wort weist oft erhebliche 
Einschraen-                    kungen oder Fehler auf.  Es wurde so erstellt, 
                   dass  ein Vergessen ueber  mehrere  Vokabulare 
                   moeglich ist. Die Vokabularzeiger werden dabei 
                   so  korrigiert,  dass  es nicht zu  Abstuerzen 
                   kommt
- BLOCK,BUFFER,R/W,BLK-READ,BLK-WRITE,SET-IO wurden den
Erfordernissen an die Kassettenarbeit mit dem Wort 'SAVE'
angepasst. Alle  Worte wurden nur soweit veraendert,  dass die Uebergabe der 
Parameter  beim  Aufruf und beim Verlassen den  Konventionen  des 
FIG-Standards entsprechen.
Der Wiedereintritt in das FORTH-System ueber Adresse 300H erfolgt 
so, dass die Screen-Puffer erhalten bleiben.


3.   Erweiterung des Wortschatzes
_________________________________

3.1. Worte aus dem F79-Standard und Hilfsworte

Aus  dem  Standard  des  FORTH-79 wurden  zur  Erleichterung  der 
Implementierung folgende Worte uebernommen:
2-   2*   2/   Arithmetik mit 2
PICK           n-tes Element vom Stack auf TOS (2 PICK=OVER)
ROLL           n-tief Stack rotieren (2 ROLL=SWAP, 3 ROLL=ROT)
DEPTH          uebergibt Tiefe der Stacknutzung
EXIT           Vorzeitiges Verlassen eines Wortes vor ;S
ASCII          legt Wert des folgenden Zeichens auf Stack
FREEZE         Einfrieren der Systemdaten auf derzeitigen Stand


Weiterhin wurden zusaetzlich folgende Worte implementiert:

USING     - Aenderung der Zuweisung des Filenamens fuer Screens
QX        - Quick-Index,  es  werden die  1.Zeilen  (Indexzeilen) 
            aller  im Speicher befindlichen Screens  aufgelistet. 
            Bearbeitete  Screens  (Update) werden mit  einem  '*' 
            gekennzeichnet
BSPACES   - loescht  die letzten Ausgaben durch Backspace in  der 
            Laenge entsprechend 'OUT'
SAVE      - ohne  Parameter  legt das FORTH-System von  100H  bis 
            'HERE' auf Kassette ab.  Zur Erleichterung beim Laden 
            wird zuvor Anfangs- und Endadresse auf dem Bildschirm 
            angezeigt  und  auf Bestaetigung mit ENTER  gewartet, 
            andere Tasten brechen die Funktion ab.  Die  hoechste 
            abzuspeichernde Adresse wird auf XXFFH aufgerundet.
          - mit   Namenangabe  wird  zusaetzlich  ein   Kopfblock 
            erzeugt,   der   dem  Aufbau  fuer   Header-Save/Load 
            entspricht.

3.2. Editor

Der  Editor  ist als ein zusaetzliches Vokabular  vereinbart.  Er 
gehoert  also nicht zum Grundwortschatz des Systems.  Er ist  mit 
minimalem Aufwand fuer eine zeilenorientierte Eingabe von Screens 
ausgelegt. Fuer den Nutzer sind nur folgende Worte von Bedeutung:
n P  Eingabe des folgenden Textes in Zeile n
n D  loeschen der Zeile n , alle anderen Zeilen ruecken nach oben
n I  Einfuegen  des  Folgenden Textes in Zeile n ,  alle  anderen 
     Zeilen ruecken nach unten

  L       listen des aktuellen Screens
n CLR     loeschen des Screens n mit Leerzeichen und listen, es
          erfolgt kein laden des Screens
alt neu
RENUMBER  umnummerieren des betreffenden Screen-Puffers im  Spei-
          cher, gegebenenfalls wird der Screen geladen


3.3. Case-Struktur

Die  Case-Struktur  stellt eine Erweiterung der  strukturierenden 
Worte   dar  und  erleichtert  das  Testen  eines    Wertes   auf 
verschiedene Bedingungen.  Die vorliegende Version testet nur auf 
Gleichheit  des  TOS mit den Testwerten,  was fuer  viele  Zwecke 
schon  eine  grosse Erleichterung ist.  Die Anwendung  sieht  wie 
folgt aus:
     .
     .
     . Wert x auf TOS
CASE
n ON ...Anweisungen... OFF
o ON ...Anweisungen... OFF
p ON ...Anweisungen... OFF
q ON ...Anweisungen... OFF
     .
     .
     .
ENDCASE
     .
     .
Der Wert x bleibt auf dem TOS erhalten wenn keine der Bedingungen 
n...q zutrifft.


3.4. Dump

Der Dump ist eine Funktion zur Anzeige des Speichers.  Es erfolgt 
eine  Anzeige  in 2 Zeilen,  erst die Hexadezimaldarstellung  des 
Speicherinhaltes,  dann  die zugehoerige Darstellung  als  ASCII-
Zeichen,  soweit moeglich. Steuerzeichen und Grafikzeichen werden 
als Punkt dargestellt. Der Aufruf erfolgt:

anfang laenge DUMP

Jede  Tastenbetaetigung  laesst  den Dump um 8  Adressen 
weiter- laufen, wobei die Enter-Taste einen Abbruch erzwingt.


3.5. Disco

Die  Funktion  Disco stellt einen Dis-Compiler fuer minimale 
An- sprueche dar.  Disco ermoeglicht das Betrachten des inneren  Auf-
baus  von Forth-Woertern. Der Aufruf erfolgt:
DISCO 'WORT'
Es erscheint auf dem Bildschirm die Namenfeldadresse des  Wortes, 
das  Wort  selbst und die Codefeld-Adresse.  Wird das Wort  nicht 
gefunden, erscheint eine Fehlermeldung. Unter den Kopfangaben des 
Wortes wird die Parameterfeld-Adresse mit anschliessendem
Doppel- punkt ausgegeben.  Hier muss der Bediener entscheiden wie  weiter 
analysiert werden soll.  Durch Druecken der Taste 'N' fuer 'next' 
wird  zeichenweise der Speicherinhalt mit moeglicher
ASCII-Inter- pretation  angezeigt.  Das Gleiche gilt fuer die  Eingabe  von'B' 
fuer 'back'.  Das Betaetigen der Leertaste bewirkt ein wortweises 
Interpretieren  des Parameterfeldinhaltes mit Anzeige des jeweils 
hineincompilierten Wortes bzw. Textes.
Ist die PFA identisch mit dem Inhalt der CFA,  so handelt es sich 
um  ein  Primitivwort und 'DISCO' bricht ab.  Durch druecken  der 
ENTER-Taste   kann der DISCO jederzeit verlassen werden.  Ist  es 
von Bedeutung welche CFA in einem Wort enthalten sind  bzw. 
wel- chen Wert eine Konstante oder eine Variable besitzt,  so kann der 
Inhalt  des Parameterfeldes durch Druck einer beliebigen  anderen 
Taste wortweise (adressweise) angezeigt werden.
Da  'DISCO'  aus Aufwandsgruenden die Worte nicht nach ihrer  Art 
unterscheidet, liegt es in der Hand des Bedieners, zu entscheiden 
wie ein Wort analysiert werden soll.  Anhand der angezeigten  CFA 
kann  der  Bediener erkennen um welche Art Wort es sich  handelt. 
Bei  normalen Secondary-Worten bricht 'DISCO' bei  Erreichen  des 
Semis (;S) am Wortende ab.  Bei Worten ohne Abschluss
(zB.Endlos- schleifen  im System wie 'INTERPRET') ist es ratsam,  die  Laenge 
des  Wortes vorher im Dump anzusehen oder die Interpretation  des 
Parameterfeldes zu vermeiden.  Das gilt auch fuer die Analyse von 
Worten  wie Konstanten,  Variablen,  Uservariablen und Worten mit 
Headerless-Code.  In solchen Faellen versucht 'DISCO' den  Inhalt 
des  Parameterfeldes vergeblich zu interpretieren,  findet jedoch 
kein zugehoeriges Namenfeld.  Die Folge ist oftmals ein
Programm- absturz. Ist der Wortaufbau (durch adressweise Anzeige oder Dump) 
bekannt,  so  kann bis zur kritischen Stelle analysiert und  dann 
mit ENTER abgebrochen werden.


Zusammenfassung der Bedienung:
N    next Charakter
B    back Charakter
Space     Interpretation
ENTER     Abbruch
andere    adressweise Inhaltsanzeige


4.   Systemdatenbereiche
________________________

4.1. Cold-Start-Area

Die Cold-Start-Area beginnt bei dieser Forth-Version gemaess FIG-
Standard am Programmbeginn auf der Adresse 0C +ORIGIN. Das ist in 
diesem  Fall 30CH.  Sie beginnt mit dem Eintrag von 'LATEST'  und 
reicht  bis  328H  wo der aktuelle Zeiger  fuer  den  Returnstack 
steht.  Von  diesem  Bereich werden beim Kaltstart die Daten  von 
312H  bis 322H in den Userdatenbereich  kopiert.  Dieser  beginnt 
dann wie ueblich mit den Eintragungen fuer:
- Stack
- Returnstack
- Textinputbuffer (TIB)
- WIDTH
- WARNING
usw.
Die  Speicherplaetze 32AH und 32CH innerhalb  des 
Systemdatenbe- reiches  werden  nach dem Vorbild 'FORTHLE' fuer den Eintrag  von 
Kaltstartroutinen genutzt. Ebenso wird die Adresse 32EH abgefragt 
welcher  Rechnertyp vorliegt und danach die Systemausschrift  und 
die Saveroutine modifiziert. Der Inhalt dieser Zelle sollte nicht 
veraendert werden, das ist einer Anpassung fuer den KC85/x
vorbe- halten.


4.2. Anpassungs-Area
____________________

Die   Anpassungs-Area  ist  ein  neu  ins  System   aufgenommener 
Programmbereich  der  es dem Systemprogrammierer ermoeglicht, mit 
relativ  geringem Aufwand eine Anpassung an  andere  Rechnertypen 
unter Beibehaltung aller Worte und Systemroutinen vorzunehmen. In 
diesem  Speicherbereich sind die direkten Einspruenge in das 
je- weilige Betriebssystem des Rechners implementiert und mit Header-
lessbezuegen  oder  Spruengen  aus Primitivworten an  das  Forth-
System angebunden.  Die Adressbezuege zu den ausfuehrenden
Routi- nen  sind geschlossen ab der Adresse 200H abgelegt.  Sie bedeuten 
im Einzelnen:

Add.    Bezug  Routine (Assembler)
___________________________________
200H      DA   EMIT
202H      JR   KEY (mit Warten)
204H      JR   ?TERMINAL (Status)
206H      JR   CR (Carridge-return)
208H      DA   OPEN for READ
20AH      DA   READ (Kassette)
20CH      DA   OPEN for WRITE
20EH      DA   WRITE (Kassette)

Ab  Adresse  210H  beginnen dann die  Anpassungsroutinen  an  das 
Betriebssystem. Bei Aenderungen und Ergaenzungen ist zu beachten, 
dass  der Bereich bis 300H noch vom Forth-System durch den 
User- datenbereich  2C0H bis 2FFH aufwaerts und den Returnstack ab 2C0H 
abwaerts  genutzt wird.  Die derzeitig  implementierten  Routinen 
belegen  einen Raum bis 250H,  ein Stackkonflikt wuerde erst  bei 
einer  Verschachtelung von mehr als 50 Funktionen ineinander
auf- treten.  Diese Stacktiefe reicht fuer allgemeine Anwendungsfaelle 
aus.  Aenderung der Stackadresse bzw. des Userdatenbereiches kann 
gegebenenfalls  durch  Aenderung der Systemdaten (30CH bis  322H) 
von erfahrenen Systemprogrammierern vorgenommen werden.


5.   Literaturhinweise
______________________

Ekkehard Floegel
Forth on the Atari
Hofacker-Verlag Holzkirchen 1983


Ronald Zech
Die Programmiersprache FORTH
Franzis-Verlag  Muenchen  1983


Gyoergy Varga, Michael Krapp
FORTH - eine interessante Programmiersprache
Wissenschaftliche Zeitschrift der TH Ilmenau
30 (1984) H.3


Verschiedene Beitraege
Zeitschrift Mikroprozessortechnik
VEB Verlag Technik Berlin
1 (1987) H.7          


Zur Einarbeitung in die Problematik der Programmiersprache  sowie  
zur  Erarbeitung des Systems fuer Z1013 wurde weiterhin folgendes 
Lehrmaterial verwendet:


M.Balig
Forth kurz und knapp, Unterrichtsmaterial, Literaturrecherche
TH Leipzig 1987


Dokumentation zum System Pop-Forth
WPU Rostock 1987


5.   Glossar
____________
 
Die hauefigsten FORTH - Befehle

Operanden:  n, n1       16-Bit-Zweierkomplementzahlen
            d, d1       32-Bit-Zweierkomplementzahlen
            u, u1       vorzeichenlose 16-Bit-Zahlen
            ud          vorzeichenlose 32-Bit-Zahlen
            addr        Adresse
            b           8-Bit-Byte
            c           7-Bit-ASCII
            f           Boolsches Flag (16 Bit, # 0 = wahr)

Stackbewegungen:                 (  a   b   c   -->   d   e  )
                                    ^   ^   ^         ^   ^
                                Third   |   |    Second   |
                                   Second   |           TOS
                Beispiel:                 TOS
                                  |-----------|      |------|
                                   vor          und     nach
                                   Abarbeitung des FORTH-Wortes

- Ein- und Ausgaben immer von links nach rechts
- der Top-Of-Stack (TOS) ist stets rechts aussen dargestellt
- Second = Zahl unter dem TOS
- Third  = Zahl unter dem Second


 Terminal Eingabe / Ausgabe
 __________________________

.       ( n --> )        druckt  die Zahl auf dem TOS aus (zerstoe-
                         rend)
.R      ( n Feldweite --> )               druckt die Zahl  (rechts 
                                          adjustiert in Feld)
D.      ( d --> )        druckt doppelt genaue Zahl

D.R     ( d Feldweite --> )               druckt       32-Bit-Zahl 
                                          rechts   adjustiert   in 
                                          Feld
CR      ( )              Ausgabe eines Carridge-Return / Line-Feed

SPACE   ( )              Ausgabe eines Space-Character

SPACES  ( n --> )        Ausgabe von n Space-Characters

."      (  )             druckt   einen  nachfolgenden  Text  aus, 
                         welcher mit " beendet wird
TYPE    (  addr u --> )  druckt  u Zeichen,  startend  ab  Adresse 
                         addr
COUNT   ( addr --> addr+1 u  )  wandelt length-Byte-String in  die 
                         TYPE-Form
?       ( addr --> )     druckt den Inhalt der Adresse

?TERMINAL ( --> f )      uebergibt  den Tastatur-Status  ("bestae-
                         tigt"<>0)
KEY     (  --> c )       wartet auf Tastatur-Eingabe und legt  den 
                         Char. auf den Stack (ASCII)
EXPECT  ( addr  n  --> ) erwartet  n Character (oder bis  CR)  und 
                         bringt sie nach addr
EMIT    ( c --> )        gibt Character c aus

WORD    ( c --> )        liest  ein Wort (bis zum Delimeter c)  im 
                         gueltigen Eingabe-Buffer
 Zahlensysteme
 _____________

DECIMAL   ( --> )        deklariert Dezimal-System

HEX       ( --> )        deklariert hexadezimales Zahlensystem

BASE      ( --> addr )   System-Variable, welche die Zahlenbasis
                             enthaelt

 Eingabe - Ausgabe - Formatierung
 ________________________________

NUMBER  ( addr --> d )   wandelt  einen String in addr um  in  32-
                         Bit-Zahl
<#      ( )              eroeffnet   Zahlenwandlung   fuer   Ausgabe 
                         (String)
#       ( d --> d )      wandelt naechste Stelle der Zahl und  fuegt 
                         dem Ausgabe-String eine Ziffer hinzu (32-
                         Bit-Zahlen !)
#S      ( d --> 00 )     wandelt alle signifikanten Stellen um  in 
                         String
SIGN    ( n d --> d )    fuegt das Vorzeichen von n in den Ziffern-
                         string ein
#>      ( d --> addr u ) beendet   Umwandlung  in   Ziffern-String 
                         (String hat passende Form fuer TYPE)
HOLD    ( c --> )        Einfuegung  eines ASCII Characters in  den 
                         String


 Massenspeicher ( Diskette/Kassette )
 ____________________________________

LIST    ( screen --> )   Ausdrucken eines Screen von Disk

LOAD    ( screen --> )   Laden  eines  Screen  (Compilation   oder 
                         Interpret.)
BLOCK ( block --> addr ) liest Disk-Block nach Adresse addr

B/BUF   ( --> n )        Systemkonstante (Blockgroesse in Bytes)

BLK     ( --> addr )     Systemvariable (aktuelle Block-Nummer)

SCR     ( --> addr )     Systemvariable   (haelt  aktuelle  Screen-
                         Nummer)

UPDATE  (  )             markiert  zuletzt  benutzten  Buffer  als 
                         'updated'

FLUSH   (  )             schreibt  alle 'updated' Buffer  auf  die 
                         Disk

EMPTY-BUFFERS (  )       markiert alle Buffer als 'leer'

 Stack - Manipulationen
 ______________________

DUP  ( n --> n n )       kopiert (dupliziert) den TOS

-DUP ( n --> n ? )       dupliziert nur dann, wenn ungleich Null

DROP ( n --> )           beseitigt den (aktuellen) TOS

SWAP ( n1 n2 --> n2 n1 ) vertauscht die beiden oberen Zahlen des
                         Stacks

OVER ( n1 n2 --> n1 n2 n1 )  kopiert den Second zum (neuen !) TOS

ROT  ( n1 n2 n3 --> n2 n3 n1 )  rotiert den Third zum TOS

>R   ( n --> )           bringt    den   TOS   zum  Return-Stack
                         (Zwischenspeicherung,  
                         Gebrauch  mit Vorsicht !)

R>   ( --> n )           holt den Wert vom Return-Stack zum TOS 
                         zurueck

R    ( --> n )           kopiert den Return-Stack-Top zum TOS


 Speicherbezogene Befehle
 ________________________

@    ( addr --> n )      ersetzt Zellen-Adresse durch ihren Inhalt

C@   ( addr --> b )      wie  @, jedoch wird auf  ein Byte
zuge-                          griffen

!    ( n addr --> )      speichere Second in die Adresse auf dem
                         TOS

C!   ( b addr --> )      wie !, jedoch wird ein Byte abgespeichert

+!   ( n addr --> )      addiere Second zum  Inhalt der  Adresse 
                         auf dem TOS

CMOVE ( from to u --> )  verschiebe u Bytes im Adressraum

FILL ( addr u b --> )    fuelle u Bytes im Speicher ab addr mit b

ERASE ( addr u --> )     fuelle  u  Bytes im Speicher ab addr mit
                         Null

BLANKS ( addr u --> )    fuelle  u  Bytes im Speicher ab addr mit
                         Blanks (20H)

TOGGLE (addr b --> )     EXOR das Byte in Adresse addr mit 
                         Maske b

SP@  (--> addr )         uebergibt aktuelle Pos. des Stack-Pointers

 Arithmetik
 __________

+    ( n1 n2 --> Summe )      Addition von 16-Bit-Zahlen 
                              (16-Bit-Summe)

D+   ( d1 d2 --> Summe )      Addition von 32-Bit-Zahlen 
                              (32-Bit-Summe)

-    ( n1 n2 --> Diff. )      Differenz n1-n2

*    ( n1 n2 --> Produkt )    16-Bit-Produkt zweier 
                              16-Bit-Zahlen

/    ( n1 n2 --> Quotient)    16-Bit-Division mit 
                              16-Bit-Ergebnis

MOD  ( n1 n2 --> Rest )       Modulo-Division 
                              (uebergibt Teiler-Rest)

/MOD ( n1 n2 --> Rest Quot.)  Division mit Rest und Quotient  
                              als Resultat

*/MOD ( n1 n2 n3 --> Rest Quot.) 
                              Multiplikation und anschliessende 
                              Division   mit  32-Bit-genauem  
                              Zwischenergebnis ( n1*n2 / n )

*/   ( n1 n2 n3 --> Quot. )   wie  */MOD,   jedoch   lediglich
                                  Quotient

M/MOD ( ud1 u2 --> u3 ud4)    Division einer vorzeichenlosen
                              32-Bit-Zahl mit Uebergabe des 
                              16-Bit-Restes  und des 
                              32-Bit-Quot.

MIN  ( n1 n2 --> Minimum )  
                         uebergibt die kleinere von zwei Zahlen

MAX  ( n1 n2 --> Maximum )  
                         uebergibt die groessere von zwei Zahlen

ABS  ( n --> u )         bildet Absolutwert einer 16-Bit-Zahl

DABS ( d --> ud )        bildet Absolutwert einer 32-Bit-Zahl

MINUS ( n --> -n )       wechselt das Vorzeichen einer 16-Bit-Zahl

DMINUS ( d --> -d )      wechselt das Vorzeichen einer 32-Bit-Zahl

1+   ( n --> n+1 )       incrementiert den TOS mit 1

2+   ( n --> n+2 )       incrementiert den TOS mit 2

 Vergleichsoperatoren
 ____________________

<    ( n1 n2 --> f )     Flag = 1, falls n1 kleiner n2

>    ( n1 n2 --> f )     Flag = 1, falls n1 groesser n2

=    ( n1 n2 --> f )     Flag = 1, falls n1 gleich n2

0<   ( n -->     f )     Flag = 1, falls TOS negativ ist

0=   ( n -->     f )     Flag  = 1,  falls der TOS gleich Null ist 
                         (negiert auch Wahrheitswert von Flags)


 Logische Befehle
 ________________

AND  ( n1 n2 --> UND )   bitweise logische UND-Verknuepfung

OR   ( n1 n2 --> ODER )  bitweise logische ODER-Verknuepfung 

XOR  ( n1 n2 --> EXOR )  bitweise Exclusiv-ODER-Verknuepfung


 Strukturierende Worte
 _____________________

DO ... LOOP              ( n1 n2 --> )    Schleife, Index laeuft
                                          von   n2  bis  n1-1  mit 
                                          Increment=1
DO ... +LOOP             ( n1 n2 --> )    wie DO ...  LOOP, jedoch
                                          ist  das Index-Increment 
                                          hier  (statt 1) nun 
be-                                           liebig (wird als zusaetz-
                                          licher   Parameter    an 
                                          +LOOP uebergeben)

I                        ( --> Index )    Loop-Index --> TOS

LEAVE                    (   )            erzwingt   Abbruch   der 
                                          Schleife   bei  naechster 
                                          Gelegenheit
IF ...(wahr)... ENDIF    ( f --> )        (Erreichen von LOOP oder 
                                          +LOOP)
IF ...(wahr)... ELSE  ( f -> )            fuehrt Befehle aus, falls 
                                          das Flag = 1 ist
 ...(falsch)... ENDIF                      dto.,  jedoch wird  bei 
                                          f=0  der FALSE-Teil
aus-                                           gefuehrt
BEGIN ... UNTIL          ( --> f --> )    Schleife   mit  Abbruch, 
                                          falls Flag fuer UNTIL = 1
BEGIN ... WHILE ... REPEAT ( --> f --> )  wie  BEGIN  ...   UNTIL, 
                                          jedoch  Abbruch-Test  am 
                                          Anfang  des   Schleifen-
                                          Kernes; REPEAT schliesst 
                                          die Schleife
bedingungs-                                           los nach BEGIN
BEGIN ... AGAIN                           Endlos-Schleife

 Definitionsworte
 ________________

: xyz   (  )             Begin  einer Colon-Definition  mit  Namen 
                         xyz
;       (  )             Abschluss der Colon-Definition
                         (SEMI-COLON)
VARIABLE xxx ( n --> )   erzeugt  eine  Variable xxx,  die  mit  n 
                         initialisiert ist
                         (xxx uebergibt die Adresse bei Aufruf)
CONSTANT yyy ( n --> )   erzeugt  eine  Konstante yyy mit  Wert  n 
                         (bei Aufruf von yyy wird Wert uebergeben)
CREATE zzz (  )          eroeffnet  die Definition eines  Primitive 
                         mit   dem   Namen  zzz   (Assembler- bzw. 
                         Maschinencode)
;CODE    (  )            Abschluss einer Colon-Definition, wenn es 
                         sich um die Definition eines
Definitions-                          wortes handelte, wobei die runtime-Execu-
                         tive  in Assembler definiert werden  soll 
                         (Code hinter ;CODE)
<BUILDS ... DOES>        does :  ( --> addr ) wird zur  Definition 
                         neuer  Definitionsworte  benutzt,   wobei 
                         jedoch  im  Gegensatz zu ;CODE  die  run-
                         time-Executive  in  high-level  definiert 
                         wird

 Vokabulare
 __________


CONTEXT ( --> addr )     uebergibt  die Adresse eines Pointers  zum 
                         Context-Vokabular  (das zuerst  abgesucht 
                         wird)
CURRENT ( --> addr )     uebergibt  die Adresse eines Pointers  zum 
                         Current-Vokabular  (das  z.Z.   erweitert 
                         wird)
FORTH   (  )             Name des Haupt-Vokabulars (setzt CONTEXT)

EDITOR, ASSEMBLER etc. ( )    weitere   Vokabular-Namen    (setzen 
                         CONTEXT)
DEFINITIONS  (  )        macht  das Current-Vokabular zum Context-
                         Vokabular
VOCABULARY xyz  (  )     deklariert  ein neues Vokabular  mit  dem 
                         Namen xyz
VLIST    (  )            druckt  die Namen aller Worte im Context-
                         Vokabular

 Systemworte und Diverses
 ________________________


(       (  )             eroeffnet Kommentar,  der mit " ) "  abge-
                         schlos
sen wird; nach " ( " muss ein Space 
                         kommen
FORGET abc  (  )         vergisst   alle  neuen  Definitionen   ab 
                         (inclusive) abc
ABORT   (  )             erzwingt Fehler-Abbruch einer Operation

' xxx ( --> addr )       findet  die Adresse (PFA) des Wortes  xxx 
                         im  Dictionary (in  Definitionen: 
compi-                          liert die Adresse)
HERE   ( --> addr )      uebergibt die Adresse des naechsten  freien 
                         Platzes im Dictionary
PAD    ( --> addr )      uebergibt die Startadresse eines Zwischen-
                         spei
chers,  meist  68 Bytes oberhalb  von 
                         HERE
IN     ( --> addr )      System-Variable, haelt Input-Buffer-Offset 
                         fuer WORD
ALLOT  ( n --> )         hinterlaesst  eine  ungenutzte  Luecke   (n 
                         Bytes) im Dictionary

'      ( n --> )         compiliert  eine  Zahl in das  Dictionary 
                         (HERE)