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)