100 REM **************************** 110 REM * * 120 REM * FORTH-COMPILER * 130 REM * * 140 REM * FUER * 150 REM * * 160 REM * COMMODORE-64 * 170 REM * * 180 REM **************************** 190 REM * * 200 REM * ALEXANDER SCHINDOWSKI * 210 REM * * 220 REM * 6000 FRANKFURT/MAIN 50 * 230 REM * * 240 REM * RUDOLF-HILFERDING-STR.49 * 250 REM * * 260 REM **************************** 270 REM * * 280 REM * TELEPHON:(069)/570520 * 290 REM * * 300 REM **************************** 310 : 320 : 330 : 340 IF A=0 THENA=1:LOAD"VOCABULARY",8,1 350 DEF FNH(X)=(INT(X/256)) 360 DEF FNL(X)=(X-256*FNH(X)) 370 POKE 53272,23:PRINT"[147][154]";CHR$(8); 380 VOC=6*4096:BE=VOC:SP=0:Z1=0 390 POKE 55,FN L(BE):POKE 56,FN H(BE) 395 DIM ST(20),SC$(24),WO$(100),AD(100) 400 PRINT TAB(14);"[198]ORTH-[195]OMPILER" 410 PRINT TAB(17);"FUER DEN" 420 PRINT TAB(15);"[195]OMMODORE-64" 430 PRINT"----------------------------------------"; 440 PRINT" [214]ON [193]LEXANDER [211]CHINDOWSKI 1985" 450 DATA 38 460 DATA "+",49563 470 DATA "CLS",49158,"DEPTH",49968 480 DATA "@",50012,"DROP",49236 490 DATA "EMIT",49855,"EXPECT",49936 500 DATA "=",49410,"I",49766 510 DATA "KEY",49880 520 DATA "+LOOP",49821,"MOD",49733 530 DATA "NOT",49458,"OVER",49284 540 DATA ".",49163,"-",49578 550 DATA "SWAP",49248,">R",49751 560 DATA "AND",49497,"CR",49384 570 DATA "/",49721,"DO",49757,"!",49977 580 DATA "DUP",49239,"XOR",49541 590 DATA "GET",49862,">",49434 600 DATA "<",49452,"LOOP",49811 610 DATA "*",49596,"OR",49519 620 DATA "C@",50030,"C!",49996 630 DATA "R>",49745,"TYPE",49915 640 DATA "PICK",50062,"CALL",50047,"ROT",50085 650 READ AN 660 FOR I=1 TO AN 670 READ WO$(I),AD(I) 680 NEXT I:POKE 2,0:POKE 252,0 690 GOSUB 3830 693 : 695 REM ************************** 700 REM *** BEFEHLS-AUSWERTUNG *** 705 REM ************************** 708 : 710 GOSUB 2630 715 : 720 IF BE$=":" THEN 1540 725 : 730 FOR I=AN TO 1 STEP -1 740 IF BE$=WO$(I) THEN 760 750 NEXT I:GOTO 770 760 SYS AD(I):GOTO 700 765 : 770 GOSUB 3030 780 IF OK=0 THEN 830 790 POKE 781,FN L(XX) 800 POKE 780,FN H(XX) 810 SYS 49194 820 GOTO 700 825 : 830 IF BE$="RESET" THEN RUN 835 : 840 IF BE$="BASIC" THEN END 845 : 850 IF BE$<>"VLIST" THEN 900 860 PRINT:FOR I=AN TO 1 STEP-1 870 PRINT WO$(I)" "; 880 NEXT:PRINT 890 GOTO 700 895 : 900 IF BE$<>"FORGET" THEN 950 910 GOSUB 2630:FOR I=AN TO 1 STEP-1 920 IF BE$<>WO$(I) THEN NEXT I 930 IF I>AN THEN PRINT BE$" [201] CAN'T FIND":GOTO 700 935 : 940 VOC=AD(I):AN=I-1:GOTO 700 950 IF BE$<>"(" THEN 980 960 IF BE$<>")" THEN GOSUB2630:GOTO960 970 GOTO 700 975 : 980 IF BE$<>"EDIT" THEN 1020 990 GOSUB 2630 :SC=VAL(BE$) 1000 PRINT"[211]CREEN:";SC:GOSUB 3280 1010 IF BE$="-->"THEN ZE$="":SC=SC+1:GOTO1000 1012 GOTO 700 1015 : 1020 IF BE$<>"LOAD" THEN 1050 1030 GOSUB 2630:SC=VAL(BE$) 1040 BLOCK=1:Z1=0:GOSUB 3110:GOTO 700 1050 IF BE$<>"-->" THEN 1070 1060 SC=SC+1:GOSUB3110:COMP=1:BLOCK=1:Z1=0:GOTO 700 1070 : 1080 IF BE$<>"VARIABLE" THEN 1145 1085 GOSUB 2630:AN=AN+1:WO$(AN)=BE$ 1090 AD(AN)=VOC:XX=VOC+8 1095 GOSUB 3470:POKE VOC,169 1100 POKE VOC+1,FN H(XX) 1105 POKE VOC+2,162 1110 POKE VOC+3,FN L(XX) 1115 POKE VOC+4,32:POKE VOC+5,42 1120 POKE VOC+6,192:POKE VOC+7,96 1125 POKE VOC+8,FN L(X) 1130 POKE VOC+9,FN H(X) 1135 VOC=VOC+10 1140 GOTO 700 1145 : 1150 IF BE$<>"MEMORY" THEN 1220 1155 GOSUB 2630:AN=AN+1:WO$(AN)=BE$ 1160 AD(AN)=VOC 1165 GOSUB 3470:POKE VOC,169 1170 POKE VOC+1,FN H(VOC+12) 1175 POKE VOC+2,162 1180 POKE VOC+3,FN L(VOC+12) 1185 POKE VOC+4,32:POKE VOC+5,42 1190 POKE VOC+6,192:AD=VOC+12+XX 1195 POKE VOC+7,96 1200 POKE VOC+8,FN L(AD):POKE VOC+9,FN H(AD) 1205 POKE VOC+10,FN L(XX):POKE VOC+11,FN H(XX) 1210 VOC=AD:GOTO 700 1220 : 1230 IF BE$<>"CONSTANT" THEN 1280 1240 GOSUB 2630:A$=": "+BE$+" " 1250 GOSUB 3470 1260 ZE$=A$+STR$(X)+" ;"+ZE$ 1270 GOTO 700 1280 : 1290 IF BE$<>"CLEAR" THEN 1350 1300 GOSUB 2630:SC=VAL(BE$) 1310 FOR ZE=0 TO 24 1320 SC$(ZE)="" 1330 NEXT ZE:GOSUB3220 1340 GOTO700 1350 : 1360 IFBE$="SAVE-SYSTEM"THEN3510 1365 : 1370 IFBE$="LOAD-SYSTEM"THEN3720 1380 : 1390 IF BE$<>"FLOPPY" THEN 1420 1400 GOSUB2630 1410 OPEN1,8,15,BE$:CLOSE1:GOTO 700 1420 : 1430 IFBE$<>"LIST" THEN 1520 1440 GOSUB2630:SC=VAL(BE$):GOSUB3110 1450 INPUT"[193]UF [196]RUCKER (Y/N)";A$:A=3:IFA$="Y"THENA=4 1460 OPEN4,A,-7*(A=4) 1470 FOR Z=0 TO 23 1480 PRINT#4,RIGHT$(STR$(Z),2)":"SC$(Z) 1490 NEXT Z:CLOSE4 1500 IFA=3THENPOKE198,0:WAIT198,1 1510 COMP=0:GOTO700 1520 : 1530 PRINTBE$" [201] CAN'T FIND":GOTO 700 1533 : 1535 REM ************************* 1540 REM *** COMPILER *** 1545 REM ************************* 1548 : 1550 GOSUB2630:AN=AN+1:WO$(AN)=BE$ 1560 AD(AN)=VOC:COMP=1 1570 : 1580 GOSUB 2630 1590 FOR I=1 TO ANZ 1600 IF BE$<>WO$(I) THEN NEXT I 1610 AD=AD(I) 1615 : 1620 IF BE$<>"BEGIN" THEN 1640 1630 ST(SP)=VOC:SP=SP+1:GOTO 1570 1635 : 1640 IF BE$<>"UNTIL" THEN 1730 1650 POKE VOC,32 1660 POKE VOC+1,180:POKE VOC+2,194 1670 POKE VOC+3,176:POKE VOC+4,3 1680 POKE VOC+5,76 1690 SP=SP-1:AD=ST(SP):IF SP<0 THEN65535 1700 POKE VOC+6,FN L(AD) 1710 POKE VOC+7,FN H(AD) 1720 VOC=VOC+8:GOTO 1570 1725 : 1730 IF BE$=";" THEN POKE VOC,96:VOC=VOC+1:COMP=0:GOTO 700 1735 : 1740 GOSUB 3030 1750 IF OK=0 THEN 1800 1760 POKE VOC,169:POKE VOC+1,FN H(XX) 1770 POKEVOC+2,162:POKEVOC+3,FN L(XX) 1780 POKE VOC+4,32:POKE VOC+5,42 1790 POKE VOC+6,192:VOC=VOC+7:GOTO 1570 1800 : 1810 IF BE$<>"IF" THEN 1870 1820 POKE VOC,32:POKE VOC+1,180 1830 POKE VOC+2,194:POKE VOC+3,176 1840 POKE VOC+4,3:POKE VOC+5,76 1850 ST(SP)=VOC+6:SP=SP+1 1860 VOC=VOC+8:GOTO 1570 1870 : 1880 IF BE$<>"ENDIF" THEN 1930 1890 SP=SP-1:AD=ST(SP) 1900 POKE AD,FN L(VOC) 1910 POKE AD+1,FN H(VOC) 1920 GOTO 1570 1930 : 1940 IF BE$<>"ELSE" THEN 2010 1950 AD=ST(SP-1) 1960 ST(SP-1)=VOC+1 1970 POKE VOC,76:VOC=VOC+3 1980 POKE AD,FN L(VOC) 1990 POKE AD+1,FN H(VOC) 2000 GOTO 1570 2010 : 2020 IF BE$="WHILE" THEN 1820 2030 : 2040 IF BE$<>"REPEAT" THEN 2110 2050 AD=ST(SP-1):A2=ST(SP-2) 2060 SP=SP-1 2070 POKE VOC,76 2080 POKE VOC+1,FN L(A2) 2090 POKE VOC+2,FN H(A2) 2100 VOC=VOC+3:GOTO 1980 2110 : 2120 IF BE$<>"."+CHR$(34) THEN 2225 2125 A$="":ZE$=MID$(ZE$,2) 2130 IF LEFT$(ZE$,1)<>CHR$(34) THEN A$=A$+LEFT$(ZE$,1):ZE$=MID$(ZE$,2):GOTO2130 2135 ZE$=MID$(ZE$,2):A$=A$+CHR$(0) 2140 AD=VOC+10 2145 POKE VOC,169 2150 POKE VOC+1,FN H(AD) 2155 POKE VOC+2,162 2160 POKE VOC+3,FN L(AD) 2165 POKE VOC+4,32:POKE VOC+5,234 2170 POKE VOC+6,194:POKE VOC+7,76 2175 AD=VOC+10+LEN(A$) 2180 POKE VOC+8,FN L(AD) 2185 POKE VOC+9,FN H(AD) 2190 VOC=VOC+10 2200 FOR I=0 TO LEN(A$)-1 2205 POKE VOC+I,ASC(MID$(A$,I+1,1)) 2210 IF LEFT$(ZE$,1)=" " THEN ZE$=MID$(ZE$,2):GOTO 2210 2215 NEXT I 2220 VOC=AD:GOTO 1570 2225 : 2230 IF BE$<>"TEXT"+CHR$(34) THEN2320 2235 A$="":ZE$=MID$(ZE$,2) 2240 IF LEFT$(ZE$,1)<>CHR$(34) THEN A$=A$+LEFT$(ZE$,1):ZE$=MID$(ZE$,2):GOTO2240 2245 ZE$=MID$(ZE$,2):A$=A$+CHR$(0) 2250 AD=VOC+10 2255 POKE VOC,169 2260 POKE VOC+1,FN H(AD) 2265 POKE VOC+2,162 2270 POKE VOC+3,FN L(AD) 2273 POKE VOC+4,32:POKE VOC+5,42:POKE VOC+6,192 2275 POKE VOC+7,76 2280 AD=VOC+10+LEN(A$) 2285 POKE VOC+8,FN L(AD) 2290 POKE VOC+9,FN H(AD) 2295 VOC=VOC+10 2300 FOR I=0 TO LEN(A$)-1 2305 POKE VOC+I,ASC(MID$(A$,I+1,1)):NEXT 2310 IF LEFT$(ZE$,1)=" " THEN ZE$=MID$(ZE$,2):GOTO 2310 2315 VOC=AD:GOTO 1570 2320 : 2330 IF BE$<>"DO" THEN 2390 2340 POKE VOC,32 2350 POKE VOC+1,FN L(AD) 2360 POKE VOC+2,FN H(AD) 2370 VOC=VOC+3:ST(SP)=VOC 2380 SP=SP+1:GOTO 1570 2390 : 2400 IF BE$<>"LOOP" AND BE$<>"+LOOP" THEN 2500 2410 POKE VOC,32 2420 POKE VOC+1,FN L(AD) 2430 POKE VOC+2,FN H(AD) 2440 POKE VOC+3,176:POKE VOC+4,3 2450 SP=SP-1:AD=ST(SP) 2460 POKE VOC+5,76 2470 POKE VOC+6,AD-256*INT(AD/256) 2480 POKE VOC+7,INT(AD/256) 2490 VOC=VOC+8:GOTO 1570 2500 : 2510 IF BE$<>"(" THEN 2540 2520 GOSUB 2630:IF BE$<>")" THEN 2520 2530 GOTO 1570 2540 : 2550 IF BE$=";S" THEN POKE VOC,96:VOC=VOC+1:GOTO 1570 2560 : 2570 IF I>AN THEN PRINT BE$" [201] CAN'T FIND":COMP=0:GOTO 700 2575 : 2580 POKE VOC,32 2590 POKE VOC+1,AD-256*INT(AD/256) 2600 POKE VOC+2,INT(AD/256) 2610 VOC=VOC+3:GOTO 1570 2615 : 2620 REM ************************ 2630 REM ** HOLE BEFEHL IN BE$ ** 2635 REM ************************ 2637 : 2640 IF ZE$="" THEN GOSUB 2750 2650 IF LEFT$(ZE$,1)=" "THEN ZE$=MID$(ZE$,2):GOTO 2650 2660 BE$="":FOR I=1 TO LEN(ZE$) 2670 IF LEFT$(ZE$,1)=" " THEN 2710 2680 BE$=BE$+LEFT$(ZE$,1) 2690 ZE$=MID$(ZE$,2) 2700 NEXT I 2710 RETURN 2720 : 2730 REM ************************* 2740 REM *** HOLE ZEILE IN ZE$ *** 2750 REM ************************* 2755 : 2760 IF BLOCK=1 THEN 2880 2770 IF COMP=0 THEN PRINT" OK." 2780 SYS 42336 2790 ZE$="" 2800 FOR Z=512 TO 600 2810 A=PEEK(Z) 2820 IF A=0 THEN 2850 2830 ZE$=ZE$+CHR$(A) 2840 NEXT Z 2850 IF LEFT$(ZE$,1)=" "THEN ZE$=MID$(ZE$,2):GOTO 2850 2860 IF ZE$="" THEN 2770 2870 RETURN 2880 ZE$=SC$(Z1):PRINT RIGHT$(STR$(Z1),2);":";ZE$ 2890 IF LEN(ZE$)<2 THEN ZE$="( )" 2900 Z1=Z1+1 2910 IF Z1=24 THEN BLOCK=0 2920 RETURN 2980 : 2990 REM ************************** 3000 REM ** WANDELE ZAHL UM ** 3010 REM ** IN XX ** 3020 REM ************************** 3030 : 3040 OK=1:X=1 3050 IF LEFT$(BE$,1)="-" AND VAL(BE$)<0 THEN BE$=MID$(BE$,2):X=-1:GOTO 3080 3060 IF LEFT$(BE$,1)>="0" AND LEFT$(BE$,1)<="9" THEN 3080 3070 OK=0:RETURN 3080 XX=VAL(BE$)*X 3090 IF XX<0 THEN XX=(256*256)+XX 3100 RETURN 3103 : 3105 REM ************************* 3110 REM ***** LADE SCREEN ***** 3115 REM ************************* 3118 : 3120 OPEN1,8,15 3130 OPEN 2,8,2,"SCR"+STR$(SC)+",S,R" 3140 INPUT#1,A 3150 IF A<>0 THEN CLOSE2:CLOSE1:FOR I=0TO24:SC$(I)="":NEXT I:RETURN 3160 FOR ZE=0 TO 24:B$="" 3170 POKE251,2:SYS830 3180 FOR I=512 TO 600:X=PEEK(I):IF X THEN B$=B$+CHR$(X):NEXT I 3190 SC$(ZE)=B$ 3200 NEXT ZE 3210 CLOSE2:CLOSE1:RETURN 3213 : 3215 REM ************************** 3220 REM ***** SAVE SCREEN ***** 3225 REM ************************** 3228 : 3230 OPEN 1,8,2,"@:SCR"+STR$(SC)+",S,W" 3240 FOR ZE=0 TO 24 3250 PRINT#1,SC$(ZE) 3260 NEXT ZE 3270 CLOSE1:ZE$="":PRINT"[147]";:RETURN 3273 : 3275 REM *********************** 3280 REM **** EDIT A SCREEN **** 3285 REM *********************** 3288 : 3290 GOSUB 3400 3300 PRINT"";:COMP=1 3310 GOSUB 2750 3315 IF LEFT$(ZE$,1)="N" THEN GOSUB2630:GOSUB2630:SC=VAL(BE$):GOSUB3420:GOTO3300 3320 IF LEFT$(ZE$,1)="E" THEN ZE$="":COMP=0:GOTO 3220 3321 IF LEFT$(ZE$,1)<>"I" THEN 3330 3322 GOSUB 2630:GOSUB 2630:Z=VAL(BE$):IF Z<0 OR Z>23 THEN GOSUB 3420:GOTO 3300 3323 GOSUB 2630:A=VAL(BE$):IF A<0 OR A>23 THEN GOSUB 3420:GOTO 3300 3324 FOR I=22-A TO Z STEP-1:SC$(I+A)=SC$(I):SC$(I)="":NEXT 3325 GOSUB 3420:GOTO 3300 3330 IF LEFT$(ZE$,1)="S" THEN ZE$="":PRINT"[147]";:COMP=0:RETURN 3331 IF LEFT$(ZE$,1)<>"D" THEN 3337 3332 GOSUB 2630:GOSUB 2630:Z=VAL(BE$):IF Z<0 OR Z>23 THEN GOSUB3420:GOTO 3300 3333 GOSUB 2630:A=VAL(BE$):IF A<0 OR A>23 THEN GOSUB 3420:GOTO 3300 3334 FOR I=Z TO 22-A:SC$(I)=SC$(I+A):SC$(I+A)="":NEXT 3335 GOSUB 3420:GOTO 3300 3337 IF LEFT$(ZE$,1)="L" THEN GOSUB 3420:GOTO 3300 3340 ZE=VAL(ZE$) 3350 ZE$=MID$(ZE$,3) 3360 IF ZE>9 THEN ZE$=MID$(ZE$,2) 3370 SC$(ZE)=ZE$ 3380 GOSUB 2630:IF BE$="-->" THEN GOTO 3220 3390 GOTO 3310 3393 : 3395 REM ************************* 3400 REM ***** LIST SCREEN ***** 3405 REM ************************* 3408 : 3410 GOSUB 3110 3420 PRINT"[147]"; 3430 FOR ZE=0 TO 23 3440 PRINT RIGHT$(STR$(ZE),2);":"; 3450 PRINT LEFT$(SC$(ZE),38) 3460 NEXT ZE:RETURN 3463 : 3465 REM *********************** 3470 REM ** HOLE WERT VOM TOS ** 3475 REM *********************** 3480 AD=52992+PEEK(2) 3490 X=PEEK(AD-1)+256*PEEK(AD-2) 3500 POKE 2,PEEK(2)-2:RETURN 3503 : 3505 REM *********************** 3510 REM *** SAVE-SYSTEM *** 3515 REM *********************** 3518 : 3520 GOSUB 2630 3530 OPEN1,8,15,"S:"+BE$+".*":CLOSE1 3540 OPEN2,8,2,BE$+".VOC,P,W" 3550 PRINT#2,AN:PRINT#2,VOC 3560 FOR ZE=39 TO AN 3570 PRINT#2,WO$(ZE) 3580 PRINT#2,AD(ZE) 3590 NEXT ZE 3600 CLOSE 2:BE$=BE$+".CODE" 3610 POKE 187,FN L(720):POKE 188,FN H(720) 3620 FOR I=1 TO LEN(BE$) 3630 POKE 719+I,ASC(MID$(BE$,I,1)) 3640 NEXT I:POKE 183,LEN(BE$) 3650 POKE 186,8:POKE 185,1 3660 POKE 251,FN L(BE):POKE 252,FN H(BE) 3670 POKE 780,251 3680 POKE 781,FN L(VOC) 3690 POKE 782,FN H(VOC) 3700 SYS 216+256*255 3710 GOTO 700 3713 : 3715 REM *************************** 3720 REM **** LOAD SYSTEM **** 3725 REM *************************** 3728 : 3730 GOSUB 2630 3740 OPEN 2,8,2,BE$+".VOC,P,R" 3750 INPUT#2,AN,VOC 3760 FOR ZE=39 TO AN 3770 INPUT#2,WO$(ZE) 3780 INPUT#2,AD(ZE) 3790 NEXT ZE:CLOSE 2 3800 SYS 50139,BE$+".CODE",8 3810 GOTO 700 3813 : 3815 REM *************************** 3820 REM *** DATA *** 3825 REM *************************** 3828 : 3830 DATA166,251, 32,198,255,160, 0, 32,207,255,201, 13,240, 7,153, 0 3840 DATA 2,200, 76, 69, 3,169, 0,153, 0, 2, 76,204,255 3850 FOR I= 830TO 858:READ A:POKE I,A:Z=Z+A:NEXT I 3860 IF Z<>3379 THEN PRINT"[198]EHLER IN [196]ATA[146]":END 3870 RETURN