10 REM ************** 20 REM Turtle 30 REM By Tim Surtell 40 REM ************** 50 REM NC200 Version 1.1 : 5/97 60 REM Downloaded from Tim's NC Users' Site 70 REM http://www.ncus.org.uk 80 REM Version 1.1 : 5/97 90 *ESC OFF 100 ONERRORCLOSE#0:EFLAG=0:PROCerror_mess:GOTO170 110 VDU26:CLS:VDU28,0,15,79,12 120 MOVE0,33:PLOT101,479,127:VDU24,1;34;478;126;:CLG 130 X=240:Y=80:A=0:PEN=5:PD=TRUE:SHOW=TRUE:LL=0:TA=4:HY=((127-(TA*8+2))DIV2)+TA*8+2:R=8:LOP$="":AN=1 140 PROCturtle 150 DIM L$(2,500),LOOP(5,10):REM (1)SLINE (2)SPOS (3)COUNTER (4)ELINE (5)EPOS 160 PRINTCHR$17 " *** TURTLE ***"CHR$18'" Version 1"' 170 VDU27,16:PRINT;:INPUTTAB(1)COMM$ 180 IF COMM$="" GOTO170 190 EFLAG=0:EPOS=0:PROCcheck_format 200 IF IMFLAG=FALSE AND EFLAG=0 L$(AN,L)=COMM$ 210 IF IMFLAG=FALSE AND EFLAG=0 AND LEN(COMM$)<5 L$(AN,L)="" 220 IF EFLAG>0 PROCerror_mess 230 IF EFLAG=0 AND IMFLAG=TRUE I=1:LOOP=0:OP$=COMM$:L=0:LOP$=OP$:PROCone_liners 240 IF WORD$="RUN" IMFLAG=FALSE:PROCrun 250 GOTO170 260 DEF PROCturtle 270 IF SHOW=FALSE ENDPROC 280 MOVEX+R*SIN(RAD(A+150)),Y+R*COS(RAD(A+150)):MOVEX+R*SIN(RAD(A-150)),Y+R*COS(RAD(A-150)):PLOT86,X+R*SIN(RAD(A)),Y+R*COS(RAD(A)) 290 ENDPROC 300 DEF PROCcheck_format 310 I=1:IMFLAG=TRUE:DUM$="":PEXP=FALSE:SPOS=FALSE:LFLAG=TRUE:L=0 320 REPEAT 330 IF MID$(COMM$,I,1)=" " I=I+1:GOTO360 340 WORD$="" 350 IF ASC(MID$(COMM$,I,1))>47 AND ASC(MID$(COMM$,I,1))<58 PROCnumber ELSE PROCstring 360 UNTIL I>LEN(COMM$) OR EFLAG>0 370 IF EFLAG>0 ENDPROC 380 IF PEXP=TRUE AND SPOS=FALSE EFLAG=3:EPOS=I:ENDPROC 390 COMM$=DUM$ 400 ENDPROC 410 DEF PROCnumber 420 IF I>1 AND PEXP=FALSE AND SPOS=FALSE EFLAG=6:EPOS=I:ENDPROC 430 REPEAT 440 WORD$=WORD$+MID$(COMM$,I,1) 450 I=I+1 460 UNTIL ASC(MID$(COMM$,I,1))<48 OR ASC(MID$(COMM$,I,1))>57 OR I>LEN(COMM$) 470 DUM$=DUM$+WORD$+" " 480 IF VAL(WORD$)=0 EFLAG=7:EPOS=I-LEN(WORD$) 490 IF LFLAG=TRUE L=VAL(WORD$):LFLAG=FALSE:IMFLAG=FALSE:IF L>500 EFLAG=2:EPOS=1:L=0 500 PEXP=FALSE:SPOS=FALSE 510 IF L>LL LL=L 520 ENDPROC 530 DEF PROCstring 540 LFLAG=FALSE 550 IF PEXP=TRUE AND SPOS=FALSE EFLAG=3:EPOS=I-1:ENDPROC 560 CFLAG=FALSE 570 REPEAT 580 WORD$=WORD$+MID$(COMM$,I,1) 590 IF WORD$="FD" OR WORD$="FORWARD" DUM$=DUM$+"FORWARD ":CFLAG=TRUE:PEXP=TRUE 600 IF WORD$="BK" OR WORD$="BACK" DUM$=DUM$+"BACK ":CFLAG=TRUE:PEXP=TRUE 610 IF WORD$="LT" OR WORD$="LEFT" DUM$=DUM$+"LEFT ":CFLAG=TRUE:PEXP=TRUE 620 IF WORD$="RT" OR WORD$="RIGHT" DUM$=DUM$+"RIGHT ":CFLAG=TRUE:PEXP=TRUE 630 IF WORD$="PU" OR WORD$="PENUP" DUM$=DUM$+"PEN-UP ":CFLAG=TRUE 640 IF WORD$="PD" OR WORD$="PENDOWN" DUM$=DUM$+"PEN-DOWN ":CFLAG=TRUE 650 IF WORD$="RP" OR WORD$="REPEAT" DUM$=DUM$+"REPEAT ":CFLAG=TRUE:PEXP=TRUE 660 IF WORD$="ER" OR WORD$="ENDREPEAT" DUM$=DUM$+"END-REPEAT ":CFLAG=TRUE 670 IF WORD$="-" DUM$=DUM$+"- ":CFLAG=TRUE 680 IF WORD$="H." OR WORD$="HOME" DUM$=DUM$+"HOME ":CFLAG=TRUE 690 IF WORD$="CL." OR WORD$="CLEAR" DUM$=DUM$+"CLEAR ":CFLAG=TRUE 700 IF WORD$="CT" OR WORD$="CTEXT" DUM$=DUM$+"CLEAR-TEXT ":CFLAG=TRUE 710 IF WORD$="TA" OR WORD$="TEXT-AREA" DUM$=DUM$+"TEXT-AREA= ":CFLAG=TRUE:PEXP=TRUE 720 IF WORD$="TO" DUM$=DUM$+"TEXT-AREA= 4 ":CFLAG=TRUE 730 IF WORD$="SHOW" DUM$=DUM$+"SHOW ":CFLAG=TRUE 740 IF WORD$="HIDE" DUM$=DUM$+"HIDE ":CFLAG=TRUE 750 IF (WORD$="LA." OR WORD$="LAST") AND SPOS=FALSE DUM$=DUM$+LOP$:CFLAG=TRUE 760 IF (WORD$="LA." OR WORD$="LAST") AND SPOS=TRUE DUM$=DUM$+"LAST":CFLAG=TRUE 770 IF WORD$="PEN" DUM$=DUM$+"PEN ":CFLAG=TRUE:PEXP=TRUE 780 IF IMFLAG=FALSE GOTO920 790 IF WORD$="L." OR WORD$="LIST" DUM$=DUM$+"LIST ":CFLAG=TRUE:SPOS=TRUE 800 IF WORD$="L." AND IMFLAG=FALSE EFLAG=1:EPOS=I-1:I=LEN(COMM$) 810 IF WORD$="LIST" AND IMFLAG=FALSE EFLAG=1:EPOS=I-3:I=LEN(COMM$) 820 IF WORD$="R." OR WORD$="RUN" DUM$=DUM$+"RUN":I=LEN(COMM$):CFLAG=TRUE 830 IF WORD$="R." AND IMFLAG=FALSE EFLAG=4:EPOS=I-1:I=LEN(COMM$) 840 IF WORD$="RUN" AND IMFLAG=FALSE EFLAG=4:EPOS=I-2:I=LEN(COMM$) 850 IF WORD$="SAVE" DUM$=DUM$+"SAVE ":CFLAG=TRUE 860 IF WORD$="LOAD" DUM$=DUM$+"LOAD ":CFLAG=TRUE 870 IF WORD$="REN" OR WORD$="RENUMBER" DUM$=DUM$+"RENUMBER":CFLAG=TRUE 880 IF WORD$="QUIT" DUM$=DUM$+"QUIT ":CFLAG=TRUE 890 IF WORD$="NEW" DUM$=DUM$+"NEW ":CFLAG=TRUE 900 IF WORD$="HELP" DUM$=DUM$+"HELP ":CFLAG=TRUE:SPOS=TRUE 910 GOTO930 920 IF WORD$="L." OR WORD$="LIST" OR WORD$="R." OR WORD$="RUN" OR WORD$="SAVE" OR WORD$="LOAD" OR WORD$="QUIT" OR WORD$="NEW" EFLAG=1:EPOS=I-LEN(WORD$)+1:I=LEN(COMM$) 930 I=I+1 940 UNTIL CFLAG=TRUE OR I>LEN(COMM$) 950 IF I>LEN(COMM$) AND CFLAG=FALSE AND EFLAG=0 AND SPOS=FALSE EFLAG=5:EPOS=I-LEN(WORD$) 960 ENDPROC 970 DEF PROCerror_mess 980 IF EFLAG=0 AND ERR=222 VDU27,15:PRINT" File '";f$"' is not in the memory.":ENDPROC 990 IF EFLAG=0 AND ERR>0 AND ERR<>17 OSCLI("ESCON"):END 1000 IF SPOS=TRUE ENDPROC 1010 PRINTTAB(EPOS+1)"^" 1020 IF EFLAG=1 VDU27,15:PRINT" "WORD$" cannot be used within a program." 1030 IF EFLAG=2 VDU27,15:PRINT" Line numbers can not be greater than 500." 1040 IF EFLAG=3 VDU27,15:PRINT" Command parameter is missing." 1050 IF EFLAG=4 VDU27,15:PRINT" TEXT-AREA parameter must be between 1 and 15 inclusive." 1060 IF EFLAG=5 VDU27,15:PRINT" Mistake." 1070 IF EFLAG=6 VDU27,15:PRINT" Syntax error." 1080 IF EFLAG=7 VDU27,15:PRINT" Silly!" 1090 IF EFLAG=8 VDU27,15:PRINT" There is no REPEAT to end!" 1100 IF EFLAG=9 VDU27,15:PRINT" There is no program to RUN!" 1110 IF EFLAG=10 VDU27,15:PRINT" Please supply a filename!" 1120 IF EFLAG=11 VDU27,15:PRINT" The filename is too long. Please limit it to 8 characters." 1130 IF EFLAG=12 VDU27,15:PRINT" There is no program to SAVE!" 1140 IF EFLAG=13 VDU27,15:PRINT" The file is not a TURTLE program." 1150 IF EFLAG=99 AND IMFLAG=FALSE VDU27,15:PRINT" STOP at line ";L;"." 1160 IF EFLAG=99 AND IMFLAG=TRUE VDU27,15:PRINT" STOP!" 1170 ENDPROC 1180 DEF PROCone_liners 1190 SFLAG=FALSE 1200 REPEAT 1210 PROCget_word 1220 IF WORD$="LEFT" PROCget_word:PROCturtle:A=A-VAL(WORD$):PROCturtle:GOTO1460 1230 IF WORD$="RIGHT" PROCget_word:PROCturtle:A=A+VAL(WORD$):PROCturtle:GOTO1460 1240 IF WORD$="FORWARD":PROCdraw(1):GOTO1460 1250 IF WORD$="BACK":PROCdraw(-1):GOTO1460 1260 IF WORD$="LIST" PROClist:I=LEN(OP$) 1270 IF WORD$="TEXT-AREA=" PROCtext_area 1280 IF WORD$="CLEAR-TEXT" CLS 1290 IF WORD$="CLEAR" CLG:X=240:Y=HY:A=0:PROCturtle 1300 IF WORD$="REPEAT" PROCget_word:LOOP=LOOP+1:LOOP(1,LOOP)=L:LOOP(2,LOOP)=I+1:LOOP(3,LOOP)=VAL(WORD$) 1310 IF WORD$="END-REPEAT" AND LOOP(3,LOOP)>0 LOOP(4,LOOP)=L:LOOP(5,LOOP)=I:LOOP(3,LOOP)=LOOP(3,LOOP)-1:L=LOOP(1,LOOP):I=LOOP(2,LOOP)-1:SFLAG=FALSE 1320 IF WORD$="END-REPEAT" AND LOOP(3,LOOP)=0 L=LOOP(4,LOOP):I=LOOP(5,LOOP):LOOP=LOOP-1 1330 IF WORD$="SHOW" AND SHOW=FALSE SHOW=TRUE:PROCturtle 1340 IF WORD$="HIDE" AND SHOW=TRUE PROCturtle:SHOW=FALSE 1350 IF WORD$="HOME" PROCturtle:X=240:Y=HY:PROCturtle 1360 IF WORD$="PEN-UP" PD=FALSE 1370 IF WORD$="PEN-DOWN" PD=TRUE 1380 IF WORD$="PEN" PROCget_word:PEN=VAL(WORD$) 1390 IF WORD$="RUN" SFLAG=TRUE 1400 IF WORD$="NEW" :FORZ=1 TO LL:L$(AN,Z)="":NEXT:LL=0 1410 IF WORD$="HELP" PROChelp:SFLAG=TRUE 1420 IF WORD$="RENUMBER" PROCrenumber 1430 IF WORD$="SAVE" PROCsave 1440 IF WORD$="LOAD" PROCload 1450 IF WORD$="QUIT" PROCquit 1460 IF LOOP>0 :IF INKEY(1)=32 EFLAG=99:EPOS=I 1470 I=I+1 1480 UNTIL SFLAG=TRUE OR EFLAG>0 1490 IF EFLAG>0 VDU27,16:PRINT" ";OP$:PROCerror_mess 1500 ENDPROC 1510 DEF PROCrun 1520 IF LL=0 EFLAG=9:EPOS=I-4:PROCerror_mess:ENDPROC 1530 L=0:LOOP=0 1540 REPEAT 1550 REPEAT:L=L+1:UNTILL$(AN,L)<>"" OR L=LL 1560 OP$=L$(AN,L):I=1:PROCone_liners 1570 UNTIL L=LL OR EFLAG>0 1580 ENDPROC 1590 DEF PROCget_word 1600 WORD$="" 1610 REPEAT 1620 WORD$=WORD$+MID$(OP$,I,1) 1630 I=I+1 1640 UNTIL MID$(OP$,I,1)=" " OR I>LEN(OP$) 1650 IF I=>LEN(OP$) SFLAG=TRUE 1660 ENDPROC 1670 DEF PROClist 1680 IF SFLAG=TRUE L=1:ZZ=LL 1690 IF SFLAG=FALSE PROCget_word:L=VAL(WORD$):ZZ=L:IF L=0 EFLAG=6:EPOS=I-LEN(WORD$):ENDPROC 1700 IF SFLAG=FALSE PROCget_word:ZZ=LL:IF WORD$<>" -" EFLAG=6:EPOS=I-LEN(WORD$):ENDPROC 1710 IF LL=0 VDU27,15:PRINT" There is no program to LIST!":ENDPROC 1720 Z=1 1730 FORI=L TO ZZ 1740 IF L$(AN,I)="" GOTO1770 1750 IF I<10 PRINT" ";L$(AN,I) ELSE IF I<100 PRINT" ";L$(AN,I) ELSE PRINT" ";L$(AN,I) 1760 IF Z=TA-1 G=GET:Z=1 ELSE Z=Z+1 1770 NEXT 1780 ENDPROC 1790 DEF PROCtext_area 1800 PROCget_word:N=VAL(WORD$):IF N<1 OR N>15 EFLAG=4:EPOS=I-LEN(WORD$):ENDPROC 1810 VDU26:CLS 1820 VDU28,0,15,79,16-N:TA=N 1830 MOVE0,N*8+1:DRAW479,N*8+1:DRAW479,127:DRAW0,127:DRAW0,N*8+1 1840 VDU24,1;N*8+2;478;126; 1850 HY=((127-(TA*8+2))DIV2)+TA*8+2:X=240:Y=HY:A=0:PEN=5:PD=TRUE:SHOW=TRUE:PROCturtle 1860 ENDPROC 1870 DEF PROCdraw(D) 1880 PROCget_word:Z=VAL(WORD$) 1890 PROCturtle 1900 MOVEX,Y:X=X+Z*SIN(RAD(A))*D:Y=Y+Z*COS(RAD(A))*D:IF PD=TRUE PLOTPEN,X,Y 1910 PROCturtle 1920 ENDPROC 1930 DEF PROCrenumber 1940 FORZ=1 TO LL 1950 IFZ<10 L$(AN,Z)=MID$(L$(AN,Z),2) ELSE IF Z<100 L$(AN,Z)=MID$(L$(AN,Z),3) ELSE L$(AN,Z)=MID$(L$(AN,Z),4) 1960 NEXT 1970 Z=1:ZZ=10 1980 REPEAT 1990 IF L$(AN,Z)<>"" AND AN=1 L$(2,ZZ)=STR$(ZZ)+L$(1,Z):ZZ=ZZ+10 2000 IF L$(AN,Z)<>"" AND AN=2 L$(1,ZZ)=STR$(ZZ)+L$(2,Z):ZZ=ZZ+10 2010 Z=Z+1 2020 UNTILZ=LL+1 2030 FORZ=1 TO LL:L$(AN,Z)="":NEXT 2040 LL=ZZ:IFAN=1 AN=2 ELSE AN=1 2050 ENDPROC 2060 DEF PROCsave 2070 IF LL=0 EFLAG=12:EPOS=I-4:ENDPROC 2080 VDU27,16:PRINT" Please type in the filename : ";:INPUTTAB(31)f$ 2090 IF f$="" EFLAG=0:ENDPROC 2100 IF LEN(f$)>8 EFLAG=11:EPOS=31:PROCerror_mess:GOTO2080 2110 K=OPENOUT(f$+".TUR") 2120 PRINT#K,"*TURTLE FILE*" 2130 FORL=1 TO LL 2140 IF L$(AN,L)="" GOTO2160 2150 PRINT#K,L,L$(AN,L) 2160 NEXT 2170 CLOSE#0 2180 ENDPROC 2190 DEF PROCload 2200 VDU27,16:PRINT" Please type in the filename : ";:INPUTTAB(31)f$ 2210 IF f$="" ENDPROC 2220 K=OPENIN(f$+".TUR") 2230 INPUT#K,DUM$:IF DUM$<>"*TURTLE FILE*" CLOSE#0:EFLAG=13:EPOS=31:PROCerror_mess:GOTO2200 2240 Z=0 2250 REPEAT 2260 INPUT#K,L 2270 REPEAT 2280 Z=Z+1 2290 L$(AN,Z)="" 2300 UNTILZ=L 2310 INPUT#K,L$(AN,Z) 2320 UNTILEOF#K 2330 FORI=Z+1 TO LL:L$(AN,I)="":NEXT:LL=Z 2340 CLOSE#0 2350 ENDPROC 2360 DEF PROChelp 2370 I=I+1:PROCget_word 2380 PRINTCHR$218STRING$(78,CHR$196)CHR$191 2390 IF WORD$="FORWARD" PRINTCHR$179"'FORWARD "CHR$17"nn"CHR$18"' will move the turtle forwards by "CHR$17"nn"CHR$18" pixels. Quick-type : FD "CHR$179 2400 IF WORD$="BACK" PRINTCHR$179"'BACK "CHR$17"nn"CHR$18"' will move the turtle backwards by "CHR$17"nn"CHR$18" pixels. Quick-type : BK "CHR$179 2410 IF WORD$="LEFT" PRINTCHR$179"'LEFT "CHR$17"nn"CHR$18"' will move the turtle anti-clockwise by "CHR$17"nn"CHR$18" degrees. Quick-type : LT "CHR$179 2420 IF WORD$="RIGHT" PRINTCHR$179"'RIGHT "CHR$17"nn"CHR$18"' will move the turtle clockwise by "CHR$17"nn"CHR$18" degrees. Quick-type : RT "CHR$179 2430 IF WORD$="PEN-UP" PRINTCHR$179"'PEN-UP' lifts the turtle's pen so that no line is drawn. Quick-type : PU "CHR$179 2440 IF WORD$="PEN-DOWN" PRINTCHR$179"'PEN-DOWN' allows the turtle's pen to draw. Quick-type : PD "CHR$179 2450 IF WORD$="REPEAT" PRINTCHR$179"'REPEAT "CHR$17"nn"CHR$18"' starts a loop. This means that all instructions after REPEAT "CHR$179CHR$179"and up to END-REPEAT will be executed "CHR$17"nn"CHR$18" times. Quick-type : RP "CHR$179 2460 IF WORD$="END-REPEAT" PRINTCHR$179"'END-REPEAT' ends the loop started by REPEAT. Once the loop is complete the "CHR$179CHR$179"next instruction executed will be the one after END-REPEAT. Quick-type : ER "CHR$179 2470 IF WORD$="HOME" PRINTCHR$179"'HOME' moves the turtle back to the centre of the screen. Quick-type : H. "CHR$179 2480 IF WORD$="CLEAR" PRINTCHR$179"'CLEAR' clears the screen and moves the turtle back to the centre. "CHR$179CHR$179"The turtle is placed at a 0 degree angle. Quick-type : CL. "CHR$179 2490 IF WORD$="CLEAR-TEXT" PRINTCHR$179"'CTEXT' clears the text screen. Quick-type : CT "CHR$179 2500 IF WORD$="TEXT-AREA=" PRINTCHR$179"'TEXT-AREA "CHR$17"nn"CHR$18"' specifies the size of the text screen in lines. "CHR$17"nn"CHR$18" must be "CHR$179CHR$179"between 1 and 15 inclusive. Quick-type : TA "CHR$179 2510 IF WORD$="SHOW" PRINTCHR$179"'SHOW' places the turtle arrow on screen so it's position can be seen. "CHR$179 2520 IF WORD$="HIDE" PRINTCHR$179"'HIDE' removes the turtle arrow from the screen. "CHR$179 2530 IF WORD$="LAST" PRINTCHR$179"'LAST' is substituted by the commands given in the previous line. "CHR$179CHR$179"Quick-type : LA. "CHR$179 2540 IF WORD$="PEN" PRINTCHR$179"'PEN "CHR$17"nn"CHR$18" selects a new pen colour determined by the PLOT number "CHR$17"nn"CHR$18". "CHR$179CHR$179"Black -- 5 White -- 7 Dotted -- 21 "CHR$179 2550 IF WORD$="LIST" PRINTCHR$179"'LIST' produces a listing of the program in memory. If a number is included "CHR$179CHR$179"after LIST, only that line will be shown. If a '-' is placed after the number"CHR$179 2560 IF WORD$="LIST" PRINTCHR$179"all lines following this line will be shown. Quick-type : L. "CHR$179 2570 IF WORD$="RUN" PRINTCHR$179"'RUN' executes the program lines in order. Press SPACEBAR to interupt. "CHR$179 2580 IF WORD$="NEW" PRINTCHR$179"'NEW' clears the program from memory. "CHR$179 2590 IF WORD$="SAVE" PRINTCHR$179"'SAVE' stores the program. TURTLE filenames have the extension TUR. "CHR$179 2600 IF WORD$="LOAD" PRINTCHR$179"'LOAD' loads in a program. TURTLE filenames have the extension TUR. "CHR$179 2610 IF VAL(WORD$)>0 PRINTCHR$179"Line numbers -- These must be less than 500. " 2620 IF WORD$<>"" PRINTCHR$192STRING$(78,CHR$196)CHR$217:ENDPROC 2630 I=1:OP$="15":PROCtext_area 2640 PRINT'"* Welcome to "CHR$17"TURTLE!"CHR$18''"The following list gives all the commands that TURTLE understands."'"To recieve more help, type HELP followed by the command you need help on..." 2650 PRINT'" ","BACK",,"FORWARD",,"LEFT",,"RIGHT",,"PENUP",,"PENDOWN"'" ","SHOW",,"HIDE",,"PEN",,"HOME",,"CLEAR",,"CTEXT"'" ","TEXT-AREA",,"TO",,"REPEAT",,"END-REP",,"LIST",,"RUN" 2660 PRINT" ","NEW",,"LOAD",,"SAVE",,"QUIT"' 2670 ENDPROC 2680 DEF PROCquit 2690 VDU27,15:PRINT;" Are you sure you want to quit ? (Y/N)":REPEAT:G$=GET$:UNTILG$="Y" OR G$="N" 2700 IF G$="N" ENDPROC 2710 *ESC ON 2720 VDU26:CLS