von Christoph Bach Von BASIC zu Forth. Hinweis:-KA- steht im folgenden Text für den Klammeraffen (SHIFT 8). So unterschiedlich diese beiden Spra- chen auch sind, so haben sie doch Gemeinsamkeiten. Wer in BASIC pro- grammieren kann wird auch in Forth Altvertrautes finden. Besonders das Turbo BASIC XL von Frank Ostrowski hat durch seine bessere Struktur eine gewisse Ähnlichkeit mit Forth. Die Arithmetik + - * / MOD In Basic schreibt man 5+3, in Forth schreibt man 5 3 + . Zuerst werden die beiden Zahlen auf den Stack gelegt, anschließend wird die Addition durchgeführt. Statt 5 und 3 liegt dann nur noch das Ergebnis, eine 8, auf dem Stack. Man tut sich leichter mit dieser Schreibweise, wenn man sich vorstellt, daß das + zwischen den Zahlen herausgezogen wurde. ===> 5 3 + Bei Berechnungen in Forth sollte man sich immer vor Augen halten, daß es in Forth keine Fließkommafunktionen gibt. Deshalb entspricht das / auch dem DIV in Turbo BASIC. Es legt den ganzzah- ligen Anteil der Division auf den Stack, MOD legt nur den Rest der Division auf den Stack. Durch die UPN-Schreibweise erspart man sich die runden Klammern. C*(A+B) schreibt man in Forth C A B + * Nach C A B ist B das oberste Element auf dem Stack. Durch + wird es zu A addiert und das Ergebnis auf dem Stack abgelegt. Der Stack sieht dann so aus: C Summe Jetzt wird durch das Wort * die Summe (von A+B) mit C multipliziert. Auf dem Stack liegt jetzt nur noch das Ergebnis (von C*(A+B)). Um es sich anzeigen zu lassen gibt man einfach einen . ein. Neue Worte Ein Unterprogramm das ein Rechteck zeichnet sieht in Turbo Basic so aus: PROC BOX Programmcode ENDPROC In Forth ersetzt man PROC durch : und ENDPROC durch (SEMIKOLON) und erhält: : BOX Programmcode (SEMIKOLON) Will man in Turbo Basic sein Unter- programm BOX aufrufen so schreibt man EXEC BOX. Vorher muß man die Koordi- naten in globalen Variablen gespeichert haben. In Forth schreibt man einfach BOX und ruft mit seinem Namen das Wort auf. Die Parameter werden in Forth über den Stack übergeben. Für ein Rechteck mit den Koordinaten x1=9, y1=18, x2=302, y2=55 schreibt man in Forth: 9 18 302 55 BOX Das Wort BOX kann selbst wieder Bestandteil einer Definition eines neuen Wortes sein. Speichermanipulationen POKE PEEK DPOKE DPEEK in Turbo Basic C! C-KA- ! -KA- in Forth Wenn Forth den Namen einer Variablen antrifft, legt es die Adresse der Variablen auf den Stack. -KA- nimmt die Adresse vom Stack und legt den Inhalt dieser Speicherzellen auf den Stack. Kontrollstruckturen IF ELSE ENDIF Die Verzweigung die aus Turbo Basic bekannt ist gibt es auch in Forth. In Forth wird die Abfrage aber vor das IF verlegt. In Turbo Basic: IF A>B Code1 ELSE Code2 ENDIF In Forth: A -KA- B -KA- > IF Code1 ELSE Code2 ENDIF In FIG-Forth schreibt man THEN statt ENDIF. Der ELSE-Teil kann entfallen. A legt nur die Adresse der Variablen A auf den Stack. Das folgende -KA- holt den Inhalt von A auf den Stack. FOR NEXT in Turbo Basic DO LOOP in Forth FOR I=3 TO 20 : Code : NEXT I 20 3 DO Code LOOP Will man eine andere Schrittweite, so ersetzt man das LOOP durch +LOOP und schreibt die Schrittweite direkt davor. FOR I=-9 TO 9 STEP 3 : Code : NEXT I 9 -9 DO Code 3 +LOOP Den Schleifenzähler legt man mit I auf den Stack. 8 2 DO I LOOP hinterlässt auf dem Stack: 2 3 4 5 6 7 8 REPEAT UNTIL in Turbo Basic BEGIN UNTIL in Forth POKE 764,255 REPEAT UNTIL PEEK(764)<>255 255 764 C! BEGIN 764 C-KA- 255 <> UNTIL Dieses Beispiel wartet auf einen Tastendruck. WHILE WEND in Turbo Basic DO EXIT LOOP in Turbo Basic BEGIN WHILE REPEAT in Forth Wenn die Bedingung vor WHILE falsch ist wird die Schleife verlassen, sonst wer- den die Worte zwischen WHILE und REPEAT ausgeführt und wieder zu BEGINN ge- sprungen. Setzt man zwischen BEGIN und WHILE nur die Abfrage, so entspricht das der WHILE WEND Schleife in Turbo Basic. Stehen nach BEGIN noch zusätz- liche Worte, so entspricht das der DO EXIT LOOP Schleife in Turbo Basic. WHILE A<9 : A=A+1 : WEND BEGIN A -KA- 9 < WHILE A -KA- 1+ A ! REPEAT DO : A=A+1 : IF A>9 : EXIT : ENDIF : B=B+1 : LOOP BEGIN A -KA- 1+ A ! A -KA- 10 < WHILE B -KA- 1+ B ! REPEAT Basic: Forth: ===================== 1+2 1 2 + 1-2 1 2 - 1*2 1 2 * 1 DIV 2 1 2 / 1 MOD 2 1 2 MOD 9+1 9 1+ 9-1 9 1- 9+2 9 2+ 9-2 9 2- 9*2 9 2* 9/2 9 2/ ABS(-3) -3 ABS 3*-1 3 MINUS (IF) 1=2 1 2 = (Vergleich) 1>2 1 2 > 1<2 1 2 < 1=0 1 0= 1<0 1 0< 1>0 1 0> NOT 1 1 NOT 1 AND 2 1 2 AND 1 OR 2 1 2 OR PROC : ENDPROC (SEMIKOLON) POKE 82,0 82 0 C! PEEK (82) 82 C-KA- DPOKE 19,0 19 0 ! DPEEK (19) 19 -KA- MOVE (0,1,2) 0 1 2 CMOVE -MOVE (0,1,2) 0 1 2