10 DEFFNS="Knights" 20 ONERROR:MODE0:OSCLI"FX 4":REPORT:PRINTERL:END 30 DIM G%(65):REM Grid 40 DIM M%(65):REM Memory 50 C%=255 60 Z%=0 70 P%=1 80 X%=1 90 Y%=1 100 H%=88 110 A%=X% 120 B%=Y% 130 M%=0 140 PROCfill 150 MODE7 160 VDU23;8202;0;0;0; 170 PROCscreen 180 PROCdisp 190 REPEAT 200 VDU31,X%-1,Y%-1 210 REPEAT 220 REPEAT 230 VDUH%,8 240 FORD%=1TO250:NEXT 250 VDUG%(P%),8 260 FORD%=1TO250:NEXT 270 K%=INKEY(0) 280 UNTIL K%<>-1 290 IF K%=82:RUN 300 UNTIL K%=136 OR K%=137 OR K%=138 OR K%=139 OR K%=66 OR K%=68 OR K%=83 OR K%=76 OR K%=13 310 *FX21 320 IF M%=1:IF H%=88:VDUH%,8 330 IF M%=1:IF A%=X% AND B%=Y% VDU88 340 IF K%=136:IF X%>1:X%=X%-1:P%=P%-1:IF M%=1:H%=120 350 IF K%=137:IF X%<8:X%=X%+1:P%=P%+1:IF M%=1:H%=120 360 IF K%=138:IF Y%<8:Y%=Y%+1:P%=P%+8:IF M%=1:H%=120 370 IF K%=139:IF Y%>1:Y%=Y%-1:P%=P%-8:IF M%=1:H%=120 380 IF K%=66:IF M%<>0:PROCBack 390 IF K%=83:PROCchoose("Save"):PROCSave 400 IF K%=76:PROCchoose("Load"):PROCLoad 410 IF K%=13:PROCConfirm 420 IF K%=68:IFM%=1:PROCdemo 430 IF M%(64)<>0 IF Z%=0:PROCwon:Z%=1 440 UNTILFALSE 450 END 460 DEFPROCscreen 470 T$="Knights Tour" 480 PRINTTAB((39/2-LENT$/2)-2);"";T$ 490 PRINTTAB((39/2-LENT$/2)-2);"";T$ 500 PRINT'TAB(3);"Programmed By C.J.Richardson " 510 PRINT TAB(0,19);"Land on all of the positions in the" 520 PRINT"grid by moving in an 'L' shape using" 530 PRINT"the Arrow Keys. Press 'RETURN' to" 540 PRINT"commit to the square you are on." 550 PRINT"(B)ack a move. (S)ave game state." 560 PRINT"(L)oad game state. (R)estart (D)emo."; 570 PRINTTAB(15,7)"12345678" 580 PRINTTAB(14)"1" 590 PRINTTAB(14)"2" 600 PRINTTAB(14)"3" 610 PRINTTAB(14)"4" 620 PRINTTAB(14)"5" 630 PRINTTAB(14)"6" 640 PRINTTAB(14)"7" 650 PRINTTAB(14)"8" 660 VDU28,16,16,23,8 670 *FX4,1 680 ENDPROC 690 DEFPROCConfirm 700 IF M%(64)<>0:ENDPROC 710 F%=0 720 IF M%=0:M%=1:PROCok:ENDPROC 730 IF P%-E%=6 OR P%-E%=10 OR P%-E%=15 OR P%-E%=17:IF G%(P%)<>32:F%=1 740 IF E%-P%=6 OR E%-P%=10 OR E%-P%=15 OR E%-P%=17:IF G%(P%)<>32:F%=1 750 IF F%=0 ENDPROC 760 PROCok 770 ENDPROC 780 DEFPROCok 790 A%=X% 800 B%=Y% 810 H%=88 820 G%(P%)=32 830 L%=0 840 REPEAT 850 L%=L%+1 860 UNTILM%(L%)=0 870 M%(L%)=P% 880 E%=P% 890 PROCdisp 900 ENDPROC 910 DEFPROCdisp 920 VDU30 930 FORL%=1 TO 64 940 VDUG%(L%) 950 NEXT 960 VDU31,A%-1,B%-1,88 970 VDU31,X%,Y% 980 ENDPROC 990 DEFPROCBack 1000 Z%=0 1010 L%=65 1020 REPEAT 1030 L%=L%-1 1040 UNTILM%(L%)<>0 OR L%=1 1050 IF L%=1:ENDPROC 1060 G%(E%)=255 1070 P%=M%(L%-1) 1080 X%=(P% MOD 8) 1090 Y%=(P% DIV 8)+1 1100 IF X%=0 X%=8:Y%=Y%-1 1110 M%(L%)=0 1120 E%=M%(L%-1) 1130 A%=X% 1140 B%=Y% 1150 H%=88 1160 PROCdisp 1170 ENDPROC 1180 DEFPROCLoad 1190 I%=OPENIN F$ 1200 FORL%=1 TO 64 1210 INPUT#I%,G%(L%),M%(L%) 1220 NEXT 1230 INPUT#I%,X%,Y%,A%,B%,P%,M%,H%,E% 1240 CLOSE#I% 1250 PROCdisp 1260 ENDPROC 1270 DEFPROCSave 1280 I%=OPENOUT F$ 1290 FORL%=1 TO 64 1300 PRINT#I%,G%(L%),M%(L%) 1310 NEXT 1320 PRINT#I%,X%,Y%,A%,B%,P%,M%,H%,E% 1330 CLOSE#I% 1340 ENDPROC 1350 DEFPROCchoose(G$) 1360 VDU26 1370 CLS 1380 PRINT'"Type Filename to "+G$+" RETURN=KniDat "' 1390 *. 1400 INPUT "Filename:"F$ 1410 IF F$="" F$="KniDat" 1420 CLS 1430 PROCscreen 1440 PROCdisp 1450 ENDPROC 1460 DEFPROCfill 1470 FORL%=1 TO 64 1480 G%(L%)=C% 1490 NEXT 1500 ENDPROC 1510 DEFPROCdemo 1520 VDU30 1530 FORL%=1 TO 64 1540 VDU255 1550 NEXT 1560 L%=0 1570 REPEAT 1580 L%=L%+1 1590 A%=M%(L%) MOD 8 1600 B%=(M%(L%) DIV 8)+1 1610 IF A%=0 A%=8:B%=B%-1 1620 VDU31,A%-1,B%-1,32,8 1630 FOR IL%=1 TO 200 1640 VDU120,8,88,8 1650 NEXT 1660 VDU32,8 1670 UNTIL L%=64 OR M%(L%+1)=0 1680 VDU31,A%-1,B%-1,88,8 1690 ENDPROC 1700 DEFPROCwon 1710 RESTORE:S%=0 1720 ENVELOPE1,1,0,0,0,1,1,1,60,-4,-1,-1,120,90:B$="C D EF G A Bc d ef":C$="55551111555511555566661154321155":E$="88887777888877888899997A88357A88":D$="123475.A.86...9":T%=9:O%=6:READA$,N%:D%=TIME:Q%=0:U%=FALSE:R%=O%+4*INSTR(D$,LEFT$(C$,1)) 1730 REPEAT:IFINKEY(0)=32THENG%=32:UNTILTRUE:ENDPROC 1740 IFQ%<=0Q%=Q%+3:IFLENC$SOUND&11,1,R%-(S%-R%)*U%,-1:SOUND&12,1ANDU%,S%+12,-1:U%=NOTU%:R%=O%+4*INSTR(D$,LEFT$(C$,1)):S%=O%+4*INSTR(D$,LEFT$(E$,1)):C$=RIGHT$(C$,LENC$+U%):E$=RIGHT$(E$,LENE$+U%) 1750 Q%=Q%-N%:SOUND&13,1,O%+4*(INSTR(B$,LEFT$(A$,1))-(INSTR(A$,"#")>0)+12),-1:D%=D%+N%*T%:REPEATUNTILTIME>D%:READ A$,N%:UNTILA$="dne":ENDPROC 1760 DATAC,2,f,1,e,2,d,1,c,2,A#,1,A,2,G,1,F,3,A,3,F,6,dne,0