10 MODE4 20 VDU23,1,0;0;0;0; 30 PRINTTAB(14,13);"Logo Subset" 40 PRINTTAB(14,30);"Press Space" 50 REPEAT:UNTIL INKEY$(0)=" " 60 MODE4 70 PROCinitialise 80 REPEAT 90 PROCprocessline 100 UNTIL FALSE 110 END 120 DEFPROCgetnextsymbol 130 LOCAL j 140 IF MID$(line$,linep,1)=" " THEN REPEAT : linep=linep+1 : UNTIL MID$(line$,linep,1)<>" " 150 IF INSTR("[!]:",MID$(line$,linep,1)) THEN symbol$=MID$(line$,linep,1):linep=linep+1 : ENDPROC 160 j=linep 170 REPEAT 180 j=j+1 190 UNTIL INSTR("[!]: ",MID$(line$,j,1)) 200 symbol$=MID$(line$,linep,j-linep) 210 linep=j 220 ENDPROC 230 DEFPROCinitialise 240 DIMvar$(100),val(100) 250 DIM procname$(10),start(10),finish(10),procline$(10) 260 DIM params(10),paramstart(10),paramname$(30) 270 lastproc=0:lastline=0 280 lastpn=0 290 stackp=0 300 VDU24,0;128;1279;1023; 310 VDU28,0,31,39,28 320 PROCclearscreen 330 ENDPROC 340 DEFPROCclearscreen 350 CLG 360 x=642 : y=578 : MOVE x,y 370 xdir=0 : ydir=1 : angle=90 : penup=TRUE 380 ENDPROC 390 DEFPROCprocessline 400 PROCgetline("Line: ") 410 linep=1 : PROCgetnextsymbol 420 IF symbol$="TO" THEN PROCdefineproc ELSE PROCprocessgroup("!") 430 ENDPROC 440 DEFPROCgetline(prompt$) 450 REPEAT : PRINT prompt$; : INPUT LINE ""line$ 460 UNTIL line$<>"" 470 line$=line$+"!" 480 ENDPROC 490 DEFPROCprocessgroup(terminator$) 500 failed=FALSE 510 REPEAT 520 PROCprocesscommand 530 PROCgetnextsymbol 540 UNTIL symbol$=terminator$ OR failed 550 ENDPROC 560 DEFPROCprocesscommand 570 LOCAL procfound,proc 580 IF symbol$="PENDOWN" OR symbol$="PDWN" THEN penup=FALSE:ENDPROC 590 IF symbol$="PENUP" OR symbol$="PUP" THEN penup=TRUE:ENDPROC 600 IF symbol$="CLEARSCREEN" OR symbol$="CLS" THEN PROCclearscreen:ENDPROC 610 IF symbol$="FORWARD" OR symbol$="F" THEN PROCforward:ENDPROC 620 IF symbol$="BACK" OR symbol$="B" THEN PROCback:ENDPROC 630 IF symbol$="LEFT" OR symbol$="L" THEN PROCleft:ENDPROC 640 IF symbol$="RIGHT" OR symbol$="R" THEN PROCright:ENDPROC 650 IF symbol$="REPEAT" OR symbol$="REP" THEN PROCrepeat :ENDPROC 660 IF symbol$="WHITE" THEN PROCwhite :ENDPROC 670 IF symbol$="BLACK" THEN PROCblack :ENDPROC 680 IF symbol$="quit" THEN CLS:CLG:END 690 PROClookup 700 IF procfound THEN PROCcall(proc):ENDPROC 710 PROCfail(1) 720 ENDPROC 730 DEFPROCforward 740 LOCAL d 750 d=FNgetvalue 760 IF failed THEN ENDPROC 770 x=x+d*xdir 780 y=y+d*ydir 790 IF penup THEN MOVE x,y ELSE DRAW x,y 800 ENDPROC 810 DEFPROCback 820 LOCAL d 830 d=FNgetvalue 840 IF failed THEN ENDPROC 850 x=x-d*xdir 860 y=y-d*ydir 870 IF penup THEN MOVE x,y ELSE DRAW x,y 880 ENDPROC 890 DEFPROCleft 900 LOCAL a 910 a=FNgetvalue 920 IF failed THEN ENDPROC 930 angle=(angle+a) MOD 360 940 xdir=COS(RAD(angle)) 950 ydir=SIN(RAD(angle)) 960 ENDPROC 970 DEFPROCright 980 LOCAL a 990 a=FNgetvalue 1000 IF failed THEN ENDPROC 1010 angle=(angle-a) MOD 360 1020 xdir=COS(RAD(angle)) 1030 ydir=SIN(RAD(angle)) 1040 ENDPROC 1050 DEFFNgetvalue 1060 PROCgetnextsymbol 1070 IF symbol$=":" THEN =FNvarvalue 1080 value=VAL(symbol$) 1090 IF value=0 THEN PROCfail(2) 1100 =value 1110 DEFPROCfail(errorno) 1120 PRINT"Error ";errorno 1130 PRINTLEFT$(line$,LEN(line$)-1)'TAB(linep-2);"" 1140 failed=2 1150 ENDPROC 1160 DEFPROCrepeat 1170 LOCAL start,no,loop 1180 no=FNgetvalue 1190 IF failed THEN ENDPROC 1200 PROCgetnextsymbol 1210 IF symbol$<>"["THEN PROCfail(3) 1220 start=linep:loop=0 1230 REPEAT 1240 loop=loop+1 1250 linep=start 1260 PROCgetnextsymbol 1270 PROCprocessgroup("]") 1280 UNTIL loop=no OR failed 1290 ENDPROC 1300 DEFPROCdefineproc 1310 PROCgetnextsymbol 1320 lastproc=lastproc+1 1330 procname$(lastproc)=symbol$ 1340 PROCgetparamname 1350 start(lastproc)=lastline+1 1360 PROCgetline("TO line: ") 1370 REPEAT 1380 lastline=lastline+1 1390 procline$(lastline)=line$ 1400 PROCgetline("TO line: ") 1410 UNTIL line$="END!" 1420 finish(lastproc)=lastline 1430 ENDPROC 1440 DEFPROClookup 1450 IF lastproc=0 THEN procfound=FALSE : ENDPROC 1460 proc=0 1470 REPEAT 1480 proc=proc+1 1490 procfound=procname$(proc)=symbol$ 1500 UNTIL procfound OR proc=lastproc 1510 ENDPROC 1520 DEFPROCcall(proc) 1530 PROCgetparamvals :IF failed ENDPROC 1540 LOCAL line$,linep,count 1550 count=start(proc) 1560 REPEAT 1570 line$=procline$(count) 1580 linep=1:PROCgetnextsymbol 1590 PROCprocessgroup("!") 1600 count=count+1 1610 UNTIL count>finish(proc) OR failed 1620 stackp=stackp-params(proc) 1630 ENDPROC 1640 DEFPROCgetparamname 1650 params(lastproc)=0 1660 PROCgetnextsymbol 1670 IF symbol$<>":" THEN ENDPROC 1680 paramstart(lastproc)=lastpn+1 1690 REPEAT 1700 params(lastproc)=params(lastproc)+1 1710 PROCgetnextsymbol 1720 lastpn=lastpn+1 1730 paramname$(lastpn)=symbol$ 1740 PROCgetnextsymbol 1750 UNTIL symbol$<>":" 1760 ENDPROC 1770 DEFPROCgetparamvals 1780 LOCAL pn,nextpn,v 1790 IF params(proc)=0 ENDPROC 1800 pn=paramstart(proc) 1810 nextpn=pn+params(proc) 1820 REPEAT 1830 v=FNgetvalue 1840 stackp=stackp+1 1850 var$(stackp)=paramname$(pn) : val(stackp)=v 1860 pn=pn+1 1870 UNTIL pn=nextpn OR failed 1880 ENDPROC 1890 DEFFNvarvalue 1900 LOCAL varfound,sp 1910 PROCgetnextsymbol 1920 IF stackp=0 THEN PROCfail(5): =0 1930 sp=stackp+1 : varfound=FALSE 1940 REPEAT 1950 sp=sp-1 1960 varfound=var$(sp)=symbol$ 1970 UNTIL varfound OR sp=1 1980 IF varfound THEN =val(sp) 1990 PROCfail(5) 2000 =0 2010 DEFPROCblack 2020 GCOL0,0:ENDPROC 2030 DEFPROCwhite 2040 GCOL0,7:ENDPROC