10 REM JET 12/19/81 20 DIM S$(20),R(20),I$(10),W(10),L(10) 30 DIM D$(20),D(20) 40 PRINT 50 PRINT "BASIC-FORTH VERSION 5.0" 60 PRINT 70 PRINT "Written by: C. H. TING" 80 PRINT "Extended by: J. TRAVIS" 90 PRINT 100 LET SP=0:RP=0 110 REM ****** TEXT INTERPRETER ******* 120 LET IP=1:PRINT:INPUT I$(IP) 130 LET W(IP)=0:L(IP)=LEN(I$(IP)) 150 LET W(IP)=W(IP)+1 160 IF W(IP)>L(IP) GOTO 280 170 IF MID$(I$(IP),W(IP),1)=" " GOTO 150 180 LET X=W(IP):IF MID$(I$(IP),X,1)="'" GOTO 230 190 LET W(IP)=W(IP)+1 200 IF W(IP)>L(IP) GOTO 220 210 IF MID$(I$(IP),W(IP),1)<>" " GOTO 190 220 LET A$=MID$(I$(IP),X,W(IP)-X):GOTO 300 230 LET W(IP)=W(IP)+1 240 IF W(IP)>L(IP) GOTO 270 250 IF MID$(I$(IP),W(IP),1)<>"'" GOTO 230 260 LET SP=SP+1:S$(SP)=MID$(I$(IP),X+1,W(IP)-X-1):GOTO 150 270 LET A$=MID$(I$(IP),X):GOTO 300 280 IF IP=1 GOTO 120 290 LET I$(IP)="":IP=IP-1:GOTO 150 300 REM **** DEFINITION DICTIONARY **** 310 LET DP=1 320 IF D(DP)=0 GOTO 400 330 IF A$<>MID$(D$(DP),1,D(DP)) THEN DP=DP+1:GOTO 320 340 LET IP=IP+1:I$(IP)=MID$(D$(DP),D(DP)+2):GOTO 130 400 REM ******** FORTH NUCLEUS ******** 410 IF VAL(A$)=0 GOTO 430 420 LET SP=SP+1:S$(SP)=STR$(VAL(A$)):GOTO 2100 430 IF SP<2 GOTO 660 440 IF A$<>"+" GOTO 460 450 LET SP=SP-1:S$(SP)=STR$(VAL(S$(SP))+VAL(S$(SP+1))):GOTO 2100 460 IF A$<>"-" GOTO 480 470 LET SP=SP-1:S$(SP)=STR$(VAL(S$(SP))-VAL(S$(SP+1))):GOTO 2100 480 IF A$<>"*" GOTO 500 490 LET SP=SP-1:S$(SP)=STR$(VAL(S$(SP))*VAL(S$(SP+1))):GOTO 2100 500 IF A$<>"/" GOTO 530 510 IF VAL(S$(SP))=0 THEN PRINT S$(SP-1);" 0 /?":GOTO 100 520 LET SP=SP-1:S$(SP)=STR$(VAL(S$(SP))/VAL(S$(SP+1))):GOTO 2100 530 IF A$<>"^" GOTO 550 540 LET SP=SP-1:S$(SP)=STR$(VAL(S$(SP))^VAL(S$(SP+1))):GOTO 2100 550 IF A$<>"SWAP" GOTO 570 560 LET S$(SP+1)=S$(SP-1):S$(SP-1)=S$(SP):S$(SP)=S$(SP+1):GOTO 2100 570 IF A$<>"=" GOTO 600 580 LET SP=SP-1:IF S$(SP)=S$(SP+1) THEN S$(SP)=STR$(1):GOTO 2100 590 LET S$(SP)=STR$(0):GOTO 2100 600 IF A$<>">" GOTO 630 610 LET SP=SP-1:IF S$(SP)>S$(SP+1) THEN S$(SP)=STR$(1):GOTO 2100 620 LET S$(SP)=STR$(0):GOTO 2100 630 IF A$<>"<" GOTO 660 640 LET SP=SP-1:IF S$(SP)"0" GOTO 700 670 LET SP=SP+1:S$(SP)=STR$(0):GOTO 2100 700 IF SP<1 GOTO 860 710 IF A$<>"ABS" GOTO 730 720 LET S$(SP)=STR$(ABS(VAL(S$(SP)))):GOTO 2100 730 IF A$<>"INT" GOTO 750 740 LET S$(SP)=STR$(INT(VAL(S$(SP)))):GOTO 2100 750 IF A$<>"RND" GOTO 770 760 LET S$(SP)=STR$(RND(VAL(S$(SP)))):GOTO 2100 770 IF A$<>"SGN" GOTO 790 780 LET S$(SP)=STR$(SGN(VAL(S$(SP)))):GOTO 2100 790 IF A$<>"SQR" GOTO 820 800 IF VAL(S$(SP))<0 THEN PRINT S$(SP);" SQR?":GOTO 100 810 LET S$(SP)=STR$(SQR(VAL(S$(SP)))):GOTO 2100 820 IF A$<>"DROP" GOTO 840 830 LET SP=SP-1:GOTO 2100 840 IF A$<>">R" GOTO 860 850 LET RP=RP+1:R(RP)=VAL(S$(SP)):SP=SP-1:GOTO 2100 860 IF RP<1 GOTO 920 870 IF A$<>"R>" GOTO 900 880 LET SP=SP+1:S$(SP)=STR$(R(RP)):RP=RP-1:GOTO 2100 900 IF A$<>"RA" GOTO 920 910 LET SP=SP+1:S$(SP)=STR$(R(RP)):GOTO 2100 920 IF A$<>"PICK" GOTO 960 930 IF VAL(S$(SP))=0 GOTO 2100 940 IF VAL(S$(SP))>=SP THEN PRINT S$(SP);" PICK?":GOTO 100 950 LET S$(SP)=S$(SP-VAL(S$(SP))):GOTO 2100 960 IF A$<>"PI" GOTO 1000 970 LET SP=SP+1:S$(SP)=STR$(3.14159):GOTO 2100 1000 REM ****** STRING FUNCTIONS ****** 1010 IF SP<3 GOTO 1050 1020 IF A$<>"MID$" GOTO 1050 1030 LET SP=SP-2:X=VAL(S$(SP+1)):Y=VAL(S$(SP+2)) 1040 LET S$(SP)=MID$(S$(SP),X,Y):GOTO 2100 1050 IF SP<1 GOTO 1280 1060 IF A$<>"CHR$" GOTO 1100 1070 IF VAL(S$(SP))<0 THEN PRINT S$(SP);" CHR$?":GOTO 100 1080 IF VAL(S$(SP))>255 THEN PRINT S$(SP);" CHR$?":GOTO 100 1090 LET S$(SP)=CHR$(VAL(S$(SP))):GOTO 2100 1100 IF A$<>"LEN" GOTO 1120 1110 LET S$(SP)=STR$(LEN(S$(SP))):GOTO 2100 1120 IF A$<>"FRE" GOTO 1140 1130 LET S$(SP)=STR$(FRE(S$(SP))):GOTO 2100 1140 IF SP<2 GOTO 1200 1150 IF A$<>"CONCAT" GOTO 1200 1160 LET SP=SP-1:S$(SP)=S$(SP)+S$(SP+1):GOTO 2100 1200 REM ***** CONTROL STRUCTURES ***** 1210 IF A$<>"IF" GOTO 1280 1220 LET SP=SP-1:IF VAL(S$(SP+1)) GOTO 2100 1230 FOR I=W(IP) TO L(IP)-3 1240 LET X$=MID$(I$(IP),I,4) 1250 IF X$="ELSE" OR X$="THEN" GOTO 1270 1260 NEXT I:PRINT "IF?":GOTO 100 1270 LET W(IP)=I+4:GOTO 2100 1280 IF A$<>"ELSE" GOTO 1300 1290 GOTO 1230 1300 IF A$<>"THEN" GOTO 1320 1310 GOTO 2100 1320 IF A$<>"BEGIN" GOTO 1340 1330 LET RP=RP+1:R(RP)=W(IP):GOTO 2100 1340 IF SP<1 OR RP<1 GOTO 1390 1350 IF A$<>"UNTIL" GOTO 1390 1360 LET SP=SP-1:IF VAL(S$(SP+1)) GOTO 1380 1370 LET W(IP)=R(RP):GOTO 2100 1380 LET RP=RP-1:GOTO 2100 1390 IF SP<2 GOTO 1430 1400 IF A$<>"DO" GOTO 1430 1410 LET R(RP+1)=W(IP):R(RP+2)=VAL(S$(SP-1)):R(RP+3)=VAL(S$(SP)) 1420 LET RP=RP+3:SP=SP-2:GOTO 2100 1430 IF RP<3 GOTO 1500 1440 IF A$<>"LOOP" GOTO 1500 1450 LET R(RP)=R(RP)+1:IF R(RP-1)>R(RP) THEN W(IP)=R(RP-2):GOTO 2100 1460 LET RP=RP-3:GOTO 2100 1500 REM **** INPUT/OUTPUT SECTION **** 1510 IF A$<>"INPUT" GOTO 1530 1520 LET SP=SP+1:INPUT S$(SP):GOTO 2100 1530 IF A$<>"PEEK" GOTO 1560 1540 X=VAL(S$(SP)):IF X<0 OR X>65536 THEN PRINT X;" PEEK?":GOTO 100 1550 LET S$(SP)=STR$(PEEK(VAL(S$(SP)))):GOTO 2100 1560 IF A$<>"CLEAR" GOTO 1580 1570 LET SP=0:RP=0:GOTO 2100 1580 IF A$<>"." GOTO 1600 1590 PRINT S$(SP):SP=SP-1:GOTO 2100 1600 IF A$<>";" GOTO 1620 1610 PRINT S$(SP);:SP=SP-1:GOTO 2100 1620 IF A$<>"S?" GOTO 1640 1630 FOR I=1 TO SP:PRINT S$(SP-I+1):NEXT I:GOTO 2100 1640 IF A$<>"R?" GOTO 1660 1650 FOR I=1 TO RP:PRINT R(RP-I+1):NEXT I:GOTO 2100 1660 IF SP<2 GOTO 1720 1670 IF A$<>"POKE" GOTO 1720 1680 LET X=VAL(S$(SP-1)):Y=VAL(S$(SP)) 1690 IF X<0 OR X>65536 THEN PRINT X;Y;" POKE?":GOTO 100 1700 IF Y<0 OR Y>255 THEN PRINT X;Y;" POKE?":GOTO 100 1710 LET SP=SP-2:POKE X,Y:GOTO 2100 1720 REM *** DICTIONARY MAINTENANCE *** 1730 IF A$<>"FIND" GOTO 1780 1740 LET DP=1 1750 IF D(DP)=0 THEN S$(SP)="":GOTO 2100 1760 IF S$(SP)<>MID$(D$(DP),1,D(DP)) THEN DP=DP+1:GOTO 1750 1770 LET S$(SP)=D$(DP):GOTO 2100 1780 IF A$<>"DELETE" GOTO 1850 1790 LET DP=1 1800 IF D(DP)=0 THEN S$(SP)="":GOTO 2100 1810 IF S$(SP)<>D$(DP) THEN DP=DP+1:GOTO 1800 1820 LET D(DP)=D(DP+1):D$(DP)=D$(DP+1) 1830 IF D(DP+1)=0 THEN DN=DN-1:GOTO 2100 1840 LET DP=DP+1:GOTO 1820 1850 IF A$<>"ADD" GOTO 1900 1860 FOR I=1 TO LEN(S$(SP)) 1870 IF MID$(S$(SP),I,1)=" " GOTO 1890 1880 NEXT I 1890 LET DN=DN+1:D(DN)=I-1:D$(DN)=S$(SP):GOTO 2100 1900 IF A$<>"NEXT" GOTO 1950 1910 IF NP=0 THEN NP=1 1920 LET SP=SP+1:S$(SP)=D$(NP) 1930 IF D(NP)=0 THEN NP=0 1940 LET NP=NP+1:GOTO 2100 1950 IF A$<>"PRINTER" GOTO 2000 1960 IF PEEK(517)=0 GOTO 1980 1970 POKE 15,72:NULL 0:POKE 517,0:GOTO 2100 1980 POKE 15,40:NULL 6:POKE 517,255:GOTO 2100 2000 REM ***** SYSTEM GENERATION ****** 2010 IF A$<>"SPAWN" GOTO 2050 2020 POKE 20,0:POKE 21,0:POKE 22,0 2030 POKE 23,32:POKE 40,0:NP=0 2040 LET X=USR(X):PRINT:GOTO 40 2050 PRINT A$;"?":GOTO 100 2100 REM ****** FINAL PROCESSING ****** 2110 IF PEEK(57100)=222 GOTO 100 2120 IF SP<0 THEN PRINT "STACK EMPTY":GOTO 100 2130 LET X=SP+1 2140 IF S$(X)<>"" THEN S$(X)="":X=X+1:GOTO 2140 2150 GOTO 150 2160 END