2300 abfa 0000 I ... FORTH-DOC WORDST
.pl72
..fuer Leporello pl72
..fuer Einzelblatt (Schreibmaschinenpapier) pl70
.mt4
.mb4
.po10
.op
..fuer diese Datei rechten Rand auf 65 einstellen !








                      Das Programmiersystem


                           ___________
                          |           |
                          | F O R T H |
                          |___________|



               fuer den Kleinrechner-Bausatz Z1013










bearbeitet: B.Schubert                       Leipzig, 11/1987
.pa
.pn1
.op
.he  Forth fuer Z1013         *** INHALT ***                   #

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
.pa
.he  Forth fuer Z1013         *** EINLEITUNG ***               #
0.   Einleitung
______________
Forth  ist  ein 1971 von Charles Moore  entwickeltes  Sprach- und 
Systemkonzept,   das  mit  wenigen   Betriebssystemschnittstellen 
arbeitsfaehig  ist  und sich daher besonders  fuer  Kleinrechner, 
Heimcomputer,  industrielle Steuerungen und aehnliche Anwendungs-
faelle 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-Computerclub 
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 Entwick-
lungssystem  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  ueber-
nommen 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 Konven-
tion  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 Betriebs-
system (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  Anpassungs-
bereich 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 waherend der Arbeit genutzte Speicherbereich 
ist in seiner Grundform auf 4000H d.h. 16kByte eingestellt. Damit 
wird  vielen  Anwendern die Moeglichkeit gegeben, ohne  Speicher-
erweiterung 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 berech-
net  (#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.
.he  Forth fuer Z1013         *** ABWEICHUNGEN ***             #

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.
.pa
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 Erforder-
nissen 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.
.pa
.he  Forth fuer Z1013         *** ERWEITERERUNGEN ***          #
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.
.pa
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.
.pa
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
.pa
.he  Forth fuer Z1013         *** SYSTEMDATENBEREICHE ***      # 
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.
.pa
.he  Forth fuer Z1013         *** LITERATURHINWEISE ***        #
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
.pa
.he  Forth fuer Z1013         *** GLOSSAR ***                  #
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'
.pa
 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
.pa
 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
.pa
 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
.pa
 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
.pa
 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)
$2@Hd