. . . 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