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)