1000 REM ALFRED ROBOT TEST PROGRAMME 5/2/86 1010 REM VERSION M2.5, BBC Basic, for use with B/W monitor and user port to parallel interface 1020 REM COPYRIGHT ROBOT CITY TECHNOLOGY LTD. 1986 1030 REM AUTHOR A.J. CAVES 1040 1050 DIM PV%(7):DIM OV%(7):DIM S%(8,50) 1060 P%=&FE60:PROCenable(0) 1070 *FX229,1 1080 *FX12,15 1090 MO%=1:SN%=1 1100 *FX229,1 1110 VDU23,1,0;0;0;0; 1120 *FX4,1 1130 1140 PROCinit 1150 PROCwelcome 1160 PROCprog 1170 *FX151,98,0 1180 *FX4,0 1190 VDU 23,1,1;0;0;0; 1200 PROCenable(0) 1210 CLS 1220 *FX12,0 1230 *FX229,0 1240 END 1250 1260 DEF PROCmanual 1270 PROCman_disp 1280 REPEAT 1290 PROCkeya 1300 KEY%=ASC(K$) 1310 PRINT TAB(20,24);SN%;SPC(16); 1320 IF KEY%=9 PROCmovement:GOTO 1390 1330 IF KEY%>135 AND KEY%<140 PROCstep:GOTO 1390 1340 IF K$="E" THEN PROCenable(1):PRINT TAB(0,1);H7$ 1350 IF K$="F" THEN PROCenable(0):PRINT TAB(0,1);H6$ 1360 IF K$="S" THEN PROCsize:GOTO 1390 1370 IF K$="C" THEN PROCcent 1380 IF KEY%=135 THEN PROCstore 1390 UNTIL KEY%=13 1400 PROCenable(0) 1410 ENDPROC 1420 1430 DEF PROCinit 1440 *FX151,98,255 1450 *FX151,96,0 1460 FOR J%=0 TO 7 1470 PV%(J%)=128 1480 OV%(J%)=234 1490 NEXT 1500 FOR J%=0 TO 7 1510 PROCdata(J%,8,OV%(J%)) 1520 PROCdata(J%,0,PV%(J%)) 1530 NEXT 1540 FOR J%=1 TO 50:S%(8,J%)=-1:FOR K%=0 TO 7:S%(K%,J%)=128:NEXT:NEXT 1550 M1$="Waist [" 1560 M2$="Upper Arm ^" 1570 M3$="Forearm ^" 1580 M4$="Wrist Rotate [" 1590 M5$="Wrist Up/Dn ^" 1600 M6$="Gripper ^" 1610 P1$=" " 1620 P2$=" " 1630 P4$=" C Centralise (Position=128)" 1640 P5$="RET Return to Menu" 1650 P6$="COPY Store sequence" 1660 H2$="Movement" 1670 H3$="Position" 1680 H4$="No." 1690 H5$="STEP SIZE= 'S' to change" 1700 H6$="ˆFROZEN 'E' to energise servos" 1710 H7$=" ENERGISED 'F' to freeze servos " 1720 ENDPROC 1730 1740 DEF PROCdata(cn%,off%,d%) 1750 Un%=d% DIV 16 1760 Ln%=d% MOD 16 1770 x%=128+cn%+off% 1780 ?P%=128+Un% 1790 ?P%=144+Un% 1800 ?P%=144+Ln% 1810 ?P%=128+Ln% 1820 ?P%=x% 1830 ?P%=x%+32 1840 FOR j%=1 TO 38:NEXT 1850 ?P%=x% 1860 ENDPROC 1870 1880 DEF PROCenable(en) 1890 ?P%=128+en 1900 ?P%=192+en 1910 ?P%=128+en 1920 ENDPROC 1930 1940 DEF PROCwelcome 1950 CLS:PRINT''' 1960 VDU141:PRINT TAB(10);"WELCOME TO" 1970 VDU141:PRINT TAB(10);"WELCOME TO" 1980 PRINT''' 1990 VDU141,136:PRINT TAB(4);"ROBOT CITY TECHNOLOGY" 2000 VDU141,136:PRINT TAB(4);"ROBOT CITY TECHNOLOGY" 2010 PRINT''''''" Press any key to continue" 2020 PROCkeya 2030 ENDPROC 2040 2050 DEF PROCmenu 2060 CLS:PROCenable(0) 2070 VDU141:PRINT TAB(17);"MENU" 2080 VDU141:PRINT TAB(17);"MENU" 2090 PRINT''" 1. Manual Mode" 2100 PRINT'" 2. Run a Sequence" 2110 PRINT'" 3. Save a Sequence" 2120 PRINT'" 4. Load a Sequence" 2130 PRINT'" 5. Delete Sequence" 2140 PRINT'" 6. Exit" 2150 PRINT' 2160 PRINT''" Press Number Required"; 2170 REPEAT 2180 PROCkeya:M%=VAL(K$) 2190 UNTIL M%>0 AND M%<10 2200 ENDPROC 2210 2220 DEF PROCprog 2230 REPEAT 2240 PROCmenu 2250 IF M%=1 THEN PROCmanual 2260 IF M%=2 THEN PROCrunseq 2270 IF M%=3 THEN PROCsave 2280 IF M%=4 THEN PROCload 2290 IF M%=5 THEN PROCdelete 2300 *FX15,1 2310 UNTIL M%=6 2320 ENDPROC 2330 2340 REM Manual Mode Display Form 2350 2360 DEF PROCman_disp 2370 CLS 2380 VDU31,2,3:PRINT H2$ 2390 VDU31,19,3:PRINT H3$;" ";H4$ 2400 PRINT'TAB(2);M1$ 2410 PRINT TAB(2);M2$ 2420 PRINT TAB(2);M3$ 2430 PRINT TAB(2);M5$ 2440 PRINT TAB(2);M4$ 2450 PRINT TAB(2);M6$ 2460 FOR J=1 TO 6:VDU31,30,4+J,48+J,31,16,4+J,135,156,31,25,4+J,135,156,31,32,4+J,135,156:NEXT 2470 FOR J=1 TO 6:VDU31,21,4+J:PRINT RIGHT$(" "+STR$(PV%(J)),3):NEXT 2480 PRINT TAB(0,1);H6$ 2490 PRINT TAB(0,15);H5$ 2500 PRINT'P4$''P5$'''P6$ 2510 SS%=0:PROCsize 2520 MO%=6:PROCmovement 2530 PRINT TAB(0,24);"Current Sequence No.";SN%;TAB(25,24);" "; 2540 ENDPROC 2550 2560 DEF PROCmovement 2570 VDU31,0,MO%+4,32,32 2580 IF MO%<4 OR MO%>4 THEN VDU31,19,MO%+4,32,32,31,28,MO%+4,32,32 2590 MO%=MO%+1:IF MO%=7 THEN MO%=1 2600 VDU31,0,MO%+4,157,132,31,19,MO%+4,157,132,31,28,MO%+4,157,132 2610 IF MO%=4 THEN VDU31,19,MO%+5,157,132,31,28,MO%+5,157,132 2620 IF MO%=6 THEN VDU31,19,MO%+2,32,32,31,28,MO%+2,32,32 2630 ENDPROC 2640 2650 DEF PROCstep 2660 CN%=MO% 2670 IF MO%=4 OR MO%=5 THEN V1%=PV%(4) ELSE V1%=PV%(CN%) 2680 V2%=PV%(5) 2690 IF MO%=1 AND KEY%=136 THEN V1%=V1%+SS% 2700 IF MO%=1 AND KEY%=137 THEN V1%=V1%-SS% 2710 IF MO%=2 AND KEY%=138 THEN V1%=V1%+SS% 2720 IF MO%=2 AND KEY%=139 THEN V1%=V1%-SS% 2730 IF MO%=3 AND KEY%=138 THEN V1%=V1%-SS% 2740 IF MO%=3 AND KEY%=139 THEN V1%=V1%+SS% 2750 IF MO%=4 AND KEY%=138 THEN V1%=V1%-SS%:V2%=V2%+SS% 2760 IF MO%=4 AND KEY%=139 THEN V1%=V1%+SS%:V2%=V2%-SS% 2770 IF MO%=5 AND KEY%=136 THEN V1%=V1%-SS%:V2%=V2%-SS% 2780 IF MO%=5 AND KEY%=137 THEN V1%=V1%+SS%:V2%=V2%+SS% 2790 IF MO%=6 AND KEY%=138 THEN V1%=V1%+SS% 2800 IF MO%=6 AND KEY%=139 THEN V1%=V1%-SS% 2810 IF V1%<0 OR V1%>255 THEN ENDPROC 2820 IF V2%<0 OR V2%>255 ENDPROC 2830 IF MO%=4 AND V1%-V2%>96 THEN VDU7:ENDPROC 2840 IF MO%=4 AND V2%-V1%>96 THEN VDU7:ENDPROC 2850 IF MO%=5 AND V1%-V2%>96 THEN VDU7:ENDPROC 2860 IF MO%=5 AND V2%-V1%>96 THEN VDU7:ENDPROC 2870 IF MO%=5 THEN PV%(4)=V1% ELSE PV%(CN%)=V1% 2880 PV%(5)=V2% 2890 PROCstep_disp 2900 ENDPROC 2910 2920 DEF PROCstep_disp 2930 D1$=RIGHT$(" "+STR$(V1%),3) 2940 IF MO%=5 THEN VDU31,21,8 ELSE VDU31,21,MO%+4 2950 PRINT D1$ 2960 D2$=RIGHT$(" "+STR$(V2%),3) 2970 IF MO%=4 OR MO%=5 VDU31,21,9:PRINT D2$ 2980 PROCdata(CN%,0,PV%(CN%)) 2990 IF MO%=4 THEN PROCdata(5,0,PV%(5)) 3000 IF MO%=5 THEN PROCdata(4,0,PV%(4)) 3010 ENDPROC 3020 3030 DEF PROCsize 3040 SS%=SS%+1 3050 IF SS%=10 THEN SS%=1 3060 PRINT TAB(10,15);SS% 3070 ENDPROC 3080 3090 DEF PROCcent 3100 CN%=MO%:V1%=128:V2%=128 3110 IF MO%=4 OR MO%=5 THEN PV%(4)=V1%:PV%(5)=V2% ELSE PV%(CN%)=V1% 3120 PROCstep_disp 3130 ENDPROC 3140 3150 DEF PROCstore 3160 IF SN%=51 THEN VDU7:ENDPROC 3170 PRINT TAB(20,24);SN%; 3180 PRINT TAB(0,22);"0]9 ˆSeconds Pause " 3190 PROCkeya:PA$=K$:IF PA$<"0" OR PA$>"9" THEN 3180 3200 PRINT TAB(24,24);"Pause ";PA$;" secs."; 3210 FOR J%=0 TO 7 3220 S%(J%,SN%)=PV%(J%) 3230 NEXT 3240 S%(8,SN%)=VAL(PA$) 3250 SN%=SN%+1 3260 PRINT TAB(0,22);P6$ 3270 ENDPROC 3280 3290 DEF PROCrunseq 3300 CLS:PRINT TAB(5,0);"RUN SEQUENCE"''' 3310 PRINT TAB(0,3); 3320 PRINT TAB(0,3)" 1. Single Step" 3330 PRINT TAB(0,5)" 2. Single Cycle" 3340 PRINT TAB(0,7)" 3. Continuous Cycle" 3350 PRINT''"RET Return to Menu" 3360 PRINT TAB(0,13);"1,2 or 3?" 3370 PROCkeya:SK$=K$:SK%=VAL(SK$) 3380 IF INSTR("123"+CHR$(13),SK$)=0 THEN 3370 3390 IF ASC(SK$)=13 THEN FOR J%=1 TO 6:PV%(J%)=128:PROCdata(J%,0,128):NEXT:PROCenable(1):TIME=0:REPEAT UNTIL TIME=500:ENDPROC 3400 PRINT TAB(0,SK%*2+1);"ˆ" 3410 T1%=6:K%=1 3420 PROCenable(1) 3430 PRINT TAB(0,13);SPC(30) 3440 REPEAT 3450 PROCnew 3460 FOR J%=0 TO 7 3470 PROCdata(J%,0,S%(J%,K%)) 3480 NEXT 3490 SK%=INKEY(0) 3500 T1%=S%(8,K%) 3510 PRINT TAB(0,16);"Sequence No. ";K%;" " 3520 PRINT TAB(0,19);SPC(35) 3530 @%=&305 3540 PRINT TAB(0,19);:FOR J=1 TO 6:PRINT S%(J,K%),;:NEXT:PRINT S%(8,K%); 3550 @%=10 3560 K%=K%+1 3570 IF SK$="1" THEN PRINT TAB(0,13);"Press space bar for next step or"'"'E' to edit":REPEAT:PROCkeya:SK%=ASC(K$):UNTIL SK%=32 OR SK%=13 OR SK%=69:GOTO 3590 3580 TIME=0:REPEAT UNTIL TIME>T1%*100 3590 UNTIL K%=50 OR S%(8,K%)=-1 OR SK%=13 OR SK%=69 3600 IF SK$="1" AND SK%=69 THEN SN%=K%-1:FOR J%=1 TO 6:PV%(J%)=S%(J%,SN%):NEXT:PROCmanual 3610 IF SK%=13 GOTO 3300 3620 IF SK$="3" THEN GOTO 3410 3630 GOTO 3300 3640 ENDPROC 3650 3660 DEF PROCsave 3670 CLS:PRINT" SAVE A SEQUENCE"'' 3680 PROCfilename 3690 PRINT''"Press 'RETURN' to exit or any other key to SAVE" 3700 PROCkeya:IF ASC(K$)=13 ENDPROC 3710 ON ERROR GOTO 4200 3720 s=OPENOUT fn$ 3730 FOR J%=1 TO 50 3740 FOR K%=0 TO 8 3750 PRINT#s,S%(K%,J%) 3760 NEXT:NEXT 3770 CLOSE#s 3780 ENDPROC 3790 3800 DEF PROCload 3810 CLS:PRINT" LOAD A SEQUENCE"'' 3820 PROCfilename 3830 PRINT''"Press 'RETURN' to exit or"'"any other key to LOAD" 3840 PROCkeya:IF ASC(K$)=13 ENDPROC 3850 ON ERROR GOTO 4150 3860 s=OPENIN fn$ 3870 J%=0:REPEAT:J%=J%+1 3880 FOR K%=0 TO 8 3890 INPUT#s,S%(K%,J%) 3900 NEXT:UNTIL EOF#(s) OR S%(8,J%)=-1 3910 CLOSE#s 3920 SN%=J% 3930 ENDPROC 3940 3950 DEF PROCfilename 3960 NL=0:fn$="" 3970 *. 3980 PRINT''"Enter file name - "; 3990 PROCkeya:F$=K$ 4000 IF F$=" "THEN 3990 4010 IF ASC(F$)=13 THEN ENDPROC 4020 IF ASC(F$)=127 THEN PRINT F$;:fn$=LEFT$(fn$,LEN(fn$)-1):GOTO 3990 4030 IF ASC(F$)<48 OR ASC(F$)>122 THEN 3990 4040 fn$=fn$+F$:NL=NL+1:PRINT F$; 4050 IF NL<7 THEN 3990 4060 ENDPROC 4070 4080 DEF PROCdelete 4090 CLS:PRINT" DELETE CURRENT SEQUENCE"'' 4100 PRINT"Press 'RETURN' to exit or"'"any other key to DELETE" 4110 PROCkeya:IF ASC(K$)=13 ENDPROC 4120 SN%=1:FOR J%=1 TO 50:S%(8,J%)=-1:FOR K%=0 TO 7:S%(K%,J%)=128:NEXT:NEXT:VDU7 4130 ENDPROC 4140 4150 ON ERROR OFF 4160 PRINT'"File not found"'"Press any key to continue" 4170 PROCkeya 4180 GOTO 1160 4190 4200 ON ERROR OFF 4210 PRINT'"File locked"'"Press any key to continue" 4220 GOTO 4170 4230 4240 DEF PROCnew 4250 FOR J%=0 TO 7 4260 PROCdata(J%,8,OV%(J%)) 4270 NEXT 4280 ENDPROC 4290 4300 DEF PROCkeya 4310 *FX15,1 4320 REPEAT:PROCnew:K$=INKEY$(0):UNTIL K$>"" 4330 ENDPROC