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