Nascom Journal |
Dezember 1981 · Ausgabe 11/12 |
: READSCR RFLAG PEEKW DUP 48 EQ
IF POP 13 ONE RFLAG POKEW
ELSE INC RFLAG POKEW
CURSADR PEEKW PEEKB THEN ;
CADR READSCR CONSTANT RSCR
Nun kann endlich der EDITOR compiliert werden:
: EDITOR REPEAT CIN DUP 16 EQ UNTIL
COUT LOOP
POP RSCR INVAR POKEW
INTERPRETER
BLADR INVAR POKEW
ONE ONE SCREEN ;
In den EDITOR-Modus kann man ebenfalls mit ENTRY einsteigen. Man kann nun beliebig auf den Bildschirm schreiben und dabei auch die Cursor-Befehle des Betriebssystems (NAS-SYS!) benutzen. Dabei sollte stets die erste Position einer Zeile freibleiben, ebenso die letzte (obwohl man dies vermeiden kann, wenn man in der Definition von READSCR den Wert 48 durch 49 ersetzt), Mit „CTRL P“ kann der Interpreter aufgerufen werden. Der Cursor muß dabei immer am Anfang der Zeile stehen, die ausgeführt bzw. compiliert werden soll. Nach Ausführung des Befehls kehrt das Programm wieder in die EDITOR-Schleife zurück, wobei der Cursor an den Anfang der ersten Zeile gesetzt wird. Es kann zwar der ganze Bildschirm benutzt werden, doch man sollte die erste Zeile als Kommandozeile freihalten (besonders, wenn man Befehle mehrfach ausführen will). Wenn man die 15. Zeile benutzt, wird der Bildschirminhalt nach oben geschoben. Wenn das nicht gewollt wird, muß man auch diese Zeile freihalten, Nach einiger Uebung kann man mit dem EDITOR sehr schnell arbeiten und wird dann kaum noch den Interpretermodus benutzen.
Die folgenden Ein- und Ausgaberoutinen für Cassettenrecorder und Drucker sind auf den EDITOR-Modus abgestimmt. Zunächst brauchen wir einige Hilfsroutinen, die teilweise in Maschinencode geschrieben sind und auf das Betriebssystem zurückgreifen:
MCODE OUTC XXXX 21 7A 07 22 73 0C. MCODE OUTD XXXX 21 7E 07 22 73 0C 21 80 XXXX 0C 22 78 0C.
(Bei C80H liegt bei mir das Treiberprogramm für den Hofer-Drucker)
MCODE OUTN XXXX 21 7F 07 22 73 0C 21 2F
XXXX 00 22 78 0C. : DELAY 1 FOR LOOP ; : MOTOR 95 NAS-SYS 5000 DELAY ; CADR NORMIN CONSTANT NIN
Die Verzögerungsroutine DELAY besteht aus einer einfachen Schleife und erwartet den Endwert der Schleife auf dem Stack. Es sind Verzögerungen bis zu einer halben Minute möglich. MOTOR schaltet den Recorder ein oder aus. Für die Ausgabefunktionen brauchen wir die Routine OUTLINES:
: OUTLINES SWAP LINE ONE FOR
REPEAT CIN DUP COUT
13 EQ UNTIL
LOOP LOOP ;
Diese Funktion wird folgendermaßen aufgerufen: (Startzeile) (Zeilenzahl) OUTLINES. Nun kann der Bildschirminhalt (im EDITOR-Modus!) auf einfache Weise ausgegeben werden:
: WRITEC MOTOR OUTC 193 COUT BACKSPACE
OUTLINES 197 COUT BACKSPACE
OUTN 5000 DELAY MOTOR ;
: PRINT OUTD OUTLINES OUTN ;
WRITEC schreibt als Startzeichen den Wert des Zeichens „A“ + 128, d.h. mit gesetztem Bit 7 aufs Band und als Schlußzeichen den Wert von „E“ + 128. Ich hatte es erst ohne Startzeichen versucht und dabei häufig Lesefehler erhalten, Nun müssen die auf Cassette geschriebenen Programme (oder auch Text, wie dieser Artikel) noch eingelesen werden können mit der folgenden Funktion:
: READC NIN INVAR POKEW MOTOR
REPEAT CIN DUP 193 EQ UNTIL POP LOOP
REPEAT COUT CIN DUP 197 EQ UNTIL LOOP
COUT CIN COUT MOTOR ;
Was kann man damit anfangen? In den bisherigen Beiträgen wurde vor allem der innere Aufbau dieser FORTH-Version behandelt. Wir wollen sie nun einmal von der Anwenderseite her betrachten. Wenn man das Programm gestartet hat, wartet es auf Eingaben. Dies können Zahlen (in unserem Fall auschließlich 16-Bit-Integer/Dezimalzahlen) oder Worte sein. Als „Wort“ gilt jede Folge von Zeichen, die von Leerzeichen eingeschlossen ist. Die Zahlen werden in ihr binäres Äquivalent umgewandelt und auf den Stack gegeben. Worte werden im Dictionary gesucht. Jedes Wort im Dictionary bezeichnet eine Funktion. (Auch Konstante und Variable gelten als Funktion; sie geben den Wert der Konstanten bzw. die Adresse des
| Seite 4 von 55 |
|---|