10 REM TEST PROGRAM 20 REM Mike Bostock 30 REM (c) CET 1983 Published by BBC Publications 40 REM version 2.0 50 : 60 ?&FE62 = 31 : REM 00011111 0-4 out 5-7 in 70 port = &FE60 : REM user port 80 ?port = 16 : REM pen down, motors on 90 : 100 REM user variables 110 speedfactor=1 : REM higher value makes buggy slower 120 LDR=100 : BCR=500 : REM sensitivities 130 : 140 *FX 4,1 150 REM detect arrow keys 160 ON ERROR GOTO 230 170 : 180 MODE7 190 PROCoff : REM cursor off 200 : 210 PROCsetup : REM global variables 220 : 230 REPEAT 240 PROCtoggle_pen(down) 250 PROCmenu 260 REM Flush buffers 270 *FX 15,0 280 answer$ = FNinput (1,"12345") 290 IF answer$ = "1" THEN PROCpen 300 IF answer$ = "2" THEN PROCline 310 IF answer$ = "3" THEN PROCrotate 320 IF answer$ = "4" THEN PROCsensors 330 UNTIL answer$="5" 340 CLS 350 PROCdouble (CHR$ 131 +"Mission completed",-1,10) 360 PROCend 370 END 380 : 390 : 400 DEF PROCbeep (pitch) 410 SOUND 1,-15,pitch,2 420 PROCdelay(200) 430 PRINT TAB(5,16) SPC(2) : PRINT TAB(33,16) SPC(2) 440 ENDPROC 450 : 460 DEF PROCbumpers 470 LOCAL value 480 value = (?port AND 192) 490 IF value = 192 THEN PRINT TAB(5,16) CHR$255 ; CHR$255 : PRINT TAB(33,16) CHR$255 ; CHR$255 : PROCbeep (149) : ENDPROC 500 IF value = 128 THEN PRINT TAB(5,16) CHR$255 ; CHR$255 : PROCbeep (53) : ENDPROC 510 IF value =64 THEN PRINT TAB(33,16) CHR$255 ; CHR$255 : PROCbeep(101) 520 ENDPROC 530 : 540 DEF PROCcircle_right 550 LOCAL index% 560 direction=right 570 PROCcentre ("CIRCLE RIGHT",12) 580 FOR index% = 1 TO 360 590 ?port = direction OR pen : PROCdelay (speedfactor) 600 ?port= (direction OR 2 OR pen) : PROCdelay (2) 610 PRINT TAB(13,15) ((count-1)*360+index%) " degrees" 620 NEXT index% 630 ENDPROC 640 : 650 DEF PROCdelay (delay) 660 LOCAL count 670 FOR count = 1 TO delay : NEXT count 680 ENDPROC 690 : 700 DEF PROCend 710 REM Switches motors off, resets cursor, EDIT & ESCAPE keys, buffers, and PRINT format 720 PROCmotors_off 730 PROCon 740 *FX 4 750 *FX 229 760 *FX 15 770 @% = 10 780 ENDPROC 790 : 800 DEF PROCline 810 CLS : PROCtitle (8) 820 PROCcentre (CHR$(134)+"STRAIGHT LINE TEST ",19) 830 PROCcentre ("Use arrow keys to drive buggy",21) 840 PROCcentre ("Press ESCAPE to end test",22) 850 PROCmanual 860 ENDPROC 870 : 880 DEF PROCmanual 890 LOCAL I$ 900 REM Disable ESCAPE key 910 *FX 229,1 920 REPEAT 930 I$ = FNwait1 940 IF INKEY (uparrow) THEN PROCmove (forward,uparrow,"FORWARD") 950 IF INKEY (downarrow) THEN PROCmove (backward,downarrow,"BACKWARD") 960 IF INKEY (leftarrow) THEN PROCmove (left,leftarrow,"LEFT") 970 IF INKEY (rightarrow) THEN PROCmove (right,rightarrow,"RIGHT") 980 UNTIL INKEY (escape) 990 REM Re-enable ESCAPE key 1000 *FX 229 1010 ENDPROC 1020 : 1030 DEF PROCmenu 1040 CLS 1050 PROCtitle (8) 1060 PRINT TAB(6,17) "1 pen test (if fitted)" 1070 PRINT TAB(6,18) "2 straight line test" 1080 PRINT TAB(6,19) "3 rotation test" 1090 PRINT TAB(6,20) "4 sensor test" 1100 PRINT TAB(6,21) "5 end" 1110 PRINT TAB(5,23) CHR$ 134 "Now choose ." CHR$ 135 : PRINT TAB(17,23); 1120 ENDPROC 1130 : 1140 DEF PROCmotors_off 1150 ?port = pen OR 8 1160 ENDPROC 1170 : 1180 DEF PROCmotors_on 1190 ?port = pen 1200 ENDPROC 1210 : 1220 DEF PROCmove (direction,key,text$) 1230 PROCcentre (text$,12) 1240 REPEAT 1250 ?port = direction OR pen : PROCdelay (speedfactor) 1260 ?port= (direction OR 2 OR pen) : PROCdelay (2) 1270 UNTIL INKEY(key) = FALSE 1280 PROCcentre (" ",12) 1290 ENDPROC 1300 : 1310 DEF PROCpen 1320 CLS : PROCtitle (8) 1330 PROCcentre (CHR$(134)+"PEN TEST ",19) 1340 PROCcentre ("Press the SPACE BAR to operate pen,",21) 1350 PROCcentre ("Press ESCAPE to end test",22) 1360 REM Disable ESCAPE key 1370 *FX 229,1 1380 REPEAT 1390 PROCcentre (pen$,12) 1400 IF FNwait1 = " " THEN PROCtoggle_pen(down-pen) 1410 UNTIL INKEY (escape) 1420 REM Re-enable ESCAPE key 1430 *FX 229 1440 ENDPROC 1450 : 1460 DEF PROCrotate 1470 LOCAL count 1480 count = 0 1490 CLS : PROCtitle (8) 1500 PROCcentre (CHR$(134)+"ROTATION TEST ",19) 1510 PROCcentre ("Press SPACE once for each rotation,",21) 1520 PROCcentre ("ESCAPE to unwind cable and end test.",22) 1530 REM Disable ESCAPE key 1540 *FX 229,1 1550 REM escape off 1560 REPEAT 1570 IF FNwait1=" " THEN count = count + 1 : PROCcircle_right 1580 UNTIL INKEY (escape) 1590 IF count > 0 THEN PROCunwind (count) 1600 REM Flush buffers 1610 *FX 15 1620 REM Re-enable ESCAPE key 1630 *FX 229 1640 REM escape on 1650 PROCdelay (1000) 1660 ENDPROC 1670 : 1680 DEF PROCsensors 1690 PROCmotors_off 1700 CLS 1710 PROCcentre (CHR$(134)+"SENSOR TEST",19) 1720 PROCcentre (CHR$(130)+"LEFT BUMPER RIGHT BUMPER",14) 1730 PROCcentre (CHR$(129)+"LDR BCR"+CHR$(130),14) 1740 PROCcentre ("Adjust the height of the BCR until",4) 1750 PROCcentre ("the signal changes significantly when",5) 1760 PROCcentre ("the background changes from black to",6) 1770 PROCcentre ("white or vice-versa.",7) 1780 PROCcentre ("Check the LDR by shading it momentarily",9) 1790 PROCcentre ("Adjust resistor to obtain a good range.",10) 1800 PROCcentre ("Press ESCAPE to end test",23) 1810 REM Disable ESCAPE key 1820 *FX 229,1 1830 REPEAT 1840 IF ?port >= 64 THEN PROCbumpers 1850 PRINT TAB(12,16) ADVAL(1) DIV LDR TAB(21,16) ADVAL(2) DIV BCR 1860 PROCdelay (100) 1870 UNTIL INKEY (escape) 1880 REM Re-enable ESCAPE key 1890 *FX 229 1900 ENDPROC 1910 : 1920 DEF PROCsetup 1930 REM keyboard INKEY values 1940 uparrow = -58 : forward = 0 1950 downarrow = -42 : backward = 5 1960 leftarrow = -26 : left = 4 1970 rightarrow = -122: right = 1 1980 space = -99 : escape =-113 1990 : 2000 down= 16 : up = 0 : REM pen states 2010 pen = down : pen$ = "PEN DOWN" 2020 end = 0 2030 @%=&404 2040 ENDPROC 2050 : 2060 DEF PROCtitle(line%) 2070 PROCdouble (CHR$ 130 +"TEST PROGRAM" + CHR$ 135,-1,line%) 2080 ENDPROC 2090 : 2100 DEF PROCtoggle_pen (state) 2110 pen=state 2120 IF pen=down THEN pen$="PEN DOWN" ELSE pen$="PEN UP " 2130 PROCmotors_on 2140 ENDPROC 2150 : 2160 DEF PROCunwind (number_of_times) 2170 LOCAL circles,degrees 2180 direction=left 2190 PRINT TAB(0,21) SPC(38) 2200 PRINT TAB(0,22) SPC(38) 2210 PROCcentre (" UNWINDING ",12) 2220 FOR circles=number_of_times TO 1 STEP-1 2230 FOR degrees=360 TO 0 STEP-1 2240 ?port = direction OR pen : PROCdelay (speedfactor) 2250 ?port= (direction OR 2 OR pen) : PROCdelay (2) 2260 PRINT TAB(13,15) (circles-1)*360+degrees ; " degrees" 2270 NEXT degrees 2280 NEXT circles 2290 PROCcentre (" ",10) 2300 ENDPROC 2310 : 2320 REM utilities 2330 : 2340 DEF PROCcentre (text$,line%) 2350 PRINT TAB(FNcentre(text$),line%) text$ 2360 ENDPROC 2370 : 2380 DEF FNcentre (x$) = 19-LEN(x$) DIV 2 2390 : 2400 DEF PROCdouble (text$,X,Y) 2410 IF X<0 THEN X=FNcentre (text$) 2420 PRINT TAB(X-1,Y ) CHR$ 141;text$ 2430 PRINT TAB(X-1,Y+1) CHR$ 141;text$ 2440 ENDPROC 2450 : 2460 : 2470 DEF FNinput (length,allowed$) 2480 LOCAL input$,ascii 2490 PRINT STRING$(length,".");STRING$(length,CHR$ 8); 2500 PROCon:*FX 15 2510 REPEAT ascii = ASC FNwait1 2520 IF ascii=127 AND LEN(input$)>0 THEN input$ = LEFT$(input$,LEN(input$)-1):VDU ascii 2530 IF INSTR(allowed$,CHR$ ascii) AND LEN(input$)13 AND ascii<>127 THEN ascii = 7 2540 IF ascii=13 AND LEN(input$)<1 THEN ascii = 7 2550 IF ascii=127 THEN VDU 46,8 ELSE VDU ascii 2560 UNTIL ascii=13:PRINT:PROCoff 2570 =input$ 2580 : 2590 DEF PROCoff VDU23;11,0;0;0;0 : ENDPROC 2600 DEF PROCon VDU23;11,255;0;0;0 : ENDPROC 2610 : 2620 DEF FNwait1 2630 LOCAL I$ 2640 *FX 4,1 2650 REPEAT 2660 I$=INKEY$(10000) 2670 IF I$="" THEN PROCtoggle_pen(down) : PROCmotors_off ELSE PROCmotors_on 2680 UNTIL I$<>"" OR pen=down 2690 *FX 4 2700 =I$ 2710 :