1000REM 'ALFRED' ROBOT PROGRAMME – BBC Basic 1010REM VERSION SM0.4 DATE 27/5/86 1020REM Serial version for MKII Board and mono monitor 1030REM COPYRIGHT ROBOT CITY TECHNOLOGY LTD. 1986 1040REM AUTHOR A.J. CAVES 1050 1060DIM PV%(7):DIMS%(8,50) 1070MODE7 1080*FX229,1 1090*FX12,15 1100MO%=1:SN%=1:SK%=0 1110VDU23,1,0;0;0;0; 1120*FX4,1 1130*FX7,7 1140*FX8,7 1150*DIR D 1160 1170PROCinit 1180IF K$=CHR$(13) THEN 1210 1190PROCwelcome 1200PROCprog 1210*FX4,0 1220VDU 23,1,1;0;0;0; 1230PROCenable(0) 1240CLS 1250*FX12,0 1260*FX229,0 1270*DIR $ 1280END 1290 1300DEFPROCmanual 1310PROCman_disp 1320 REPEAT 1330PROCkeya 1340KEY%=ASC(K$) 1350PRINT TAB(20,24);SN%;SPC(16); 1360IF KEY%=9 PROCmovement:GOTO1430 1370IF KEY%>135 AND KEY%<140 PROCstep:GOTO 1430 1380IF K$="E" THEN PROCenable(1):PRINT TAB(0,1);H7$ 1390IF K$="F" THEN PROCenable(0):PRINT TAB(0,1);H6$ 1400IF K$="S" THEN PROCsize:GOTO1430 1410IF K$="C" THEN PROCcent 1420IF KEY%=135 THEN PROCstore 1430 UNTIL KEY%=13 1440PROCenable(0) 1450ENDPROC 1460 1470DEF PROCinit 1480PROCcom 1490IF K$=CHR$(13) THEN ENDPROC 1500PROCenable(0) 1510FOR J%=1 TO 6 1520PV%(J%)=128 1530PROCdata(J%,PV%(J%)) 1540NEXT 1550S%(8,2)=-1:FOR K%=0 TO 7:S%(K%,1)=128:NEXT 1560M1$="Waist [" 1570M2$="Upper Arm ^" 1580M3$="Forearm ^" 1590M4$="Wrist Rotate [" 1600M5$="Wrist Up/Dn ^" 1610M6$="Gripper ^" 1620P4$=" C Centralise (Position=128)" 1630P5$="RET Return to Menu" 1640P6$="COPY Store sequence" 1650H2$="Movement" 1660H3$="Position" 1670H4$="No." 1680 H5$="STEP SIZE= 'S' to change" 1690H6$="ˆFROZEN 'E' to energise servos" 1700H7$=" ENERGISED 'F' to freeze servos " 1710ENDPROC 1720 1730DEFPROCdata(cn%,d%) 1740Un%=d% DIV 16:IF Un%<10 Ud%=Un%+48 ELSE Ud%=Un%+55 1750Ln%=d% MOD 16:IF Ln%<10 Ld%=Ln%+48 ELSE Ld%=Ln%+55 1760x%=50+cn% 1770*FX3,7 1780PRINT CHR$(x%);CHR$(Ud%);CHR$(Ld%); 1790*FX3,0 1800ENDPROC 1810 1820DEFPROCenable(en) 1830*FX3,7 1840PRINT CHR$(83-en); 1850*FX3,0 1860ENDPROC 1870 1880DEFPROCwelcome 1890CLS:PRINT''' 1900VDU141:PRINTTAB(10);"WELCOME TO" 1910VDU141:PRINTTAB(10);"WELCOME TO" 1920PRINT''' 1930VDU141,136:PRINTTAB(4);"ROBOT CITY TECHNOLOGY" 1940VDU141,136:PRINTTAB(4);"ROBOT CITY TECHNOLOGY" 1950PRINT''''''" Press any key to continue" 1960PROCkeya 1970ENDPROC 1980 1990DEFPROCmenu 2000PROCcom 2010IF K$=CHR$(13) THEN M%=6:GOTO 2190 2020PROCenable(0) 2030CLS 2040VDU141:PRINTTAB(17);"MENU" 2050VDU141:PRINTTAB(17);"MENU" 2060PRINT''" 1. Manual Mode" 2070PRINT'" 2. Run a Sequence" 2080PRINT'" 3. Save a Sequence" 2090PRINT'" 4. Load a Sequence" 2100PRINT'" 5. Delete Sequence" 2110PRINT'" 6. Exit" 2120PRINT' 2130PRINT''" Press Number Required"; 2140REPEAT 2150PROCkeya:M%=VAL(K$) 2160UNTIL M%>0 AND M%<7 2170PROCcom 2180IF K$=CHR$(13) THEN M%=6 2190ENDPROC 2200 2210DEFPROCprog 2220REPEAT 2230PROCmenu 2240IF M%=1 THEN PROCmanual 2250IF M%=2 THEN PROCrunseq 2260IF M%=3 THEN PROCsave 2270IF M%=4 THEN PROCload 2280IF M%=5 THEN PROCdelete 2290*FX15,1 2300UNTIL M%=6 2310IF K$=CHR$(13) THEN 2440 2320CLS:PRINT"Fold ALFRED Y/N?":K$=GET$ 2330IF K$="N" OR K$="n" THEN 2440 2340IF K$<>"Y" AND K$<>"y" THEN 2320 2350*FX3,7 2360PROCenable(1) 2370FOR J%=1 TO 6 2380READ D% 2390PROCdata(J%,D%) 2400NEXT 2410TIME=0:REPEAT:UNTIL TIME=400 2420*FX3,0 2430DATA 0,0,0,32,224,128 2440ENDPROC 2450 2460REM Manual Mode Display Form 2470 2480DEFPROCman_disp 2490CLS 2500VDU31,2,3:PRINTH2$ 2510VDU31,19,3:PRINT H3$;" ";H4$ 2520PRINT'TAB(2);M1$ 2530PRINTTAB(2);M2$ 2540PRINTTAB(2);M3$ 2550PRINTTAB(2);M5$ 2560PRINTTAB(2);M4$ 2570PRINTTAB(2);M6$ 2580FOR 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 2590FOR J=1 TO 6:VDU31,21,4+J:PRINT RIGHT$(" "+STR$(PV%(J)),3):NEXT 2600PRINT TAB(0,1);H6$ 2610PRINT TAB(0,15);H5$ 2620PRINT'P4$''P5$'''P6$ 2630SS%=3:PROCsize 2640MO%=6:PROCmovement 2650PRINT TAB(0,24);"Current Sequence No.";SN%;TAB(25,24);" "; 2660ENDPROC 2670 2680DEFPROCmovement 2690VDU31,0,MO%+4,32,32 2700IFMO%<4 OR MO%>4 THEN VDU31,19,MO%+4,32,32,31,28,MO%+4,32,32 2710MO%=MO%+1:IF MO%=7 THEN MO%=1 2720VDU31,0,MO%+4,157,132,31,19,MO%+4,157,132,31,28,MO%+4,157,132 2730IF MO%=4 THEN VDU31,19,MO%+5,157,132,31,28,MO%+5,157,132 2740IFMO%=6 THEN VDU31,19,MO%+2,32,32,31,28,MO%+2,32,32 2750ENDPROC 2760 2770DEFPROCstep 2780CN%=MO% 2790IF MO%=4 OR MO%=5 THEN V1%=PV%(4) ELSE V1%=PV%(CN%) 2800V2%=PV%(5) 2810IF MO%=1 AND KEY%=136 THEN V1%=V1%+SS% 2820IF MO%=1 AND KEY%=137 THEN V1%=V1%-SS% 2830IF MO%=2 AND KEY%=138 THEN V1%=V1%+SS% 2840IF MO%=2 AND KEY%=139 THEN V1%=V1%-SS% 2850IF MO%=3 AND KEY%=138 THEN V1%=V1%-SS% 2860IF MO%=3 AND KEY%=139 THEN V1%=V1%+SS% 2870IF MO%=4 AND KEY%=138 THEN V1%=V1%-SS%:V2%=V2%+SS% 2880IF MO%=4 AND KEY%=139 THEN V1%=V1%+SS%:V2%=V2%-SS% 2890IF MO%=5 AND KEY%=136 THEN V1%=V1%-SS%:V2%=V2%-SS% 2900IF MO%=5 AND KEY%=137 THEN V1%=V1%+SS%:V2%=V2%+SS% 2910IF MO%=6 AND KEY%=138 THEN V1%=V1%+SS% 2920IF MO%=6 AND KEY%=139 THEN V1%=V1%-SS% 2930IFV1%<0 OR V1%>255 THEN ENDPROC 2940IF V2%<0 OR V2%>255 ENDPROC 2950IF MO%=4 AND V1%-V2%>96 THEN VDU7:ENDPROC 2960IF MO%=4 AND V2%-V1%>96 THEN VDU7:ENDPROC 2970IF MO%=5 AND V1%-V2%>96 THEN VDU7:ENDPROC 2980IF MO%=5 AND V2%-V1%>96 THEN VDU7:ENDPROC 2990IF MO%=5 THEN PV%(4)=V1% ELSE PV%(CN%)=V1% 3000PV%(5)=V2% 3010PROCstep_disp 3020ENDPROC 3030 3040DEFPROCstep_disp 3050D1$=RIGHT$(" "+STR$(V1%),3) 3060IF MO%=5 THEN VDU31,21,8 ELSE VDU31,21,MO%+4 3070PRINTD1$ 3080D2$=RIGHT$(" "+STR$(V2%),3) 3090IF MO%=4 OR MO%=5 VDU31,21,9:PRINT D2$ 3100PROCdata(CN%,PV%(CN%)) 3110IFMO%=4 THEN PROCdata(5,PV%(5)) 3120IFMO%=5 THEN PROCdata(4,PV%(4)) 3130ENDPROC 3140 3150DEFPROCsize 3160SS%=SS%+1 3170IF SS%=10 THEN SS%=1 3180PRINT TAB(10,15);SS% 3190ENDPROC 3200 3210DEFPROCcent 3220CN%=MO%:V1%=128:V2%=128 3230IF MO%=4 OR MO%=5 THEN PV%(4)=V1%:PV%(5)=V2% ELSE PV%(CN%)=V1% 3240PROCstep_disp 3250ENDPROC 3260 3270DEFPROCstore 3280IFSN%=51 THEN VDU7:ENDPROC 3290PRINT TAB(20,24);SN%; 3300PRINT TAB(0,22);"0]9 ˆSeconds Pause " 3310PROCkeya:PA$=K$:IF PA$<"0" OR PA$>"9" THEN3300 3320PRINT TAB(24,24);"Pause ";PA$;" secs."; 3330FOR J%=0 TO 7 3340S%(J%,SN%)=PV%(J%) 3350NEXT 3360S%(8,SN%)=VAL(PA$) 3370SN%=SN%+1 3380IFSK%<>69THENS%(8,SN%)=-1 3390PRINT TAB(0,22);P6$ 3400ENDPROC 3410 3420DEFPROCrunseq 3430CLS:PRINT TAB(5,0);"RUN SEQUENCE"''' 3440PRINT TAB(0,3); 3450PRINT TAB(0,3)" 1. Single Step" 3460PRINT TAB(0,5)" 2. Single Cycle" 3470PRINT TAB(0,7)" 3. Continuous Cycle" 3480PRINT''"RET Return to Menu" 3490PRINT TAB(0,13);"1,2 or 3?" 3500PROCkeya:SK$=K$:SK%=VAL(SK$) 3510IF INSTR("123"+CHR$(13),SK$)=0 THEN3500 3520IF ASC(SK$)=13 THEN FOR J%=1 TO 6:PV%(J%)=128:PROCdata(J%,128):NEXT:PROCenable(1):CLS:PRINT "CENTRALISING - PLEASE WAIT":TIME=0:REPEAT UNTIL TIME=400:ENDPROC 3530PRINT TAB(0,SK%*2+1);"ˆ" 3540 T1%=6:K%=1 3550PROCenable(1) 3560PRINT TAB(0,13);SPC(30) 3570REPEAT 3580FOR J%=1 TO 6 3590PROCdata(J%,S%(J%,K%)) 3600NEXT 3610SK%=INKEY(0) 3620T1%=S%(8,K%) 3630PRINT TAB(0,16);"Sequence No. ";K%;" " 3640PRINT TAB(0,19);SPC(35) 3650@%=&305 3660PRINT TAB(0,19);:FOR J=1 TO 6:PRINTS%(J,K%),;:NEXT:PRINT S%(8,K%); 3670@%=10 3680K%=K%+1 3690IF 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 3710 3700TIME=0:REPEAT UNTIL TIME>T1%*100 3710UNTIL K%=50 OR S%(8,K%)=-1 OR SK%=13 OR SK%=69 3720IF SK$="1" AND SK%=69 THEN SN%=K%-1:FORJ%=1 TO 6:PV%(J%)=S%(J%,SN%):NEXT:PROCmanual 3730IF SK%=13 GOTO 3430 3740IF SK$="3" THEN GOTO 3540 3750GOTO 3430 3760ENDPROC 3770 3780DEFPROCsave 3790CLS:PRINT" SAVE A SEQUENCE"'' 3800PROCfilename 3810PRINT''"Press 'RETURN' to exit or"'"any other key to SAVE" 3820PROCkeya:IF ASC(K$)=13 ENDPROC 3830ONERROR GOTO 4350 3840s=OPENOUT fn$ 3850FOR J%=1 TO SN% 3860FOR K%=0 TO 8 3870PRINT#s,S%(K%,J%) 3880NEXT:NEXT 3890CLOSE#s 3900ENDPROC 3910 3920DEFPROCload 3930CLS:PRINT" LOAD A SEQUENCE"'' 3940PROCfilename 3950PRINT''"Press 'RETURN' to exit or"'"any other key to LOAD" 3960PROCkeya:IF ASC(K$)=13 ENDPROC 3970ONERROR GOTO 4300 3980s=OPENIN fn$ 3990J%=0:REPEAT:J%=J%+1 4000FOR K%=0 TO 8 4010INPUT#s,S%(K%,J%) 4020NEXT:UNTIL EOF#(s) OR S%(8,J%)=-1 4030CLOSE#s 4040SN%=J% 4050ENDPROC 4060 4070DEFPROCfilename 4080NL=0:fn$="" 4090*INFO * 4100PRINT''"Enter file name - "; 4110PROCkeya:F$=K$ 4120IF F$=" "THEN 4110 4130IF ASC(F$)=13 THEN 4190 4140IF ASC(F$)=127 THEN PRINT F$;:fn$=LEFT$(fn$,LEN(fn$)-1):GOTO4110 4150IF F$="." THEN fn$="":PRINT F$;:GOTO4110 4160IF ASC(F$)<48 OR ASC(F$)>122 THEN 4110 4170fn$=fn$+F$:NL=NL+1:PRINT F$; 4180 IF NL<7 THEN 4110 4190fn$="D."+fn$ 4200ENDPROC 4210 4220DEFPROCdelete 4230CLS:PRINT" DELETE CURRENT SEQUENCE"'' 4240PRINT"Press 'RETURN' to exit or"'"any other key to DELETE" 4250PROCkeya:IF ASC(K$)=13 ENDPROC 4260SN%=1:S%(8,2)=-1:S%(8,1)=0:FOR K%=0 TO 7:S%(K%,1)=128:NEXT 4270CLS:PRINT '" SEQUENCE DELETED"''"Press any key to continue":PROCkeya 4280ENDPROC 4290 4300ONERROR OFF 4310PRINT'"File not found"'"Press any key to continue" 4320PROCkeya 4330GOTO1200 4340 4350ONERROR OFF 4360PRINT'"File locked"'"Press any key to continue" 4370GOTO4320 4380 4390DEFPROCkeya 4400*FX15,1 4410REPEAT:K$=INKEY$(0):UNTIL K$>"" 4420ENDPROC 4430 4440DEFPROCcom 4450CLS 4460*FX2,1 4470*FX3,7 4480PRINT CHR$(13); 4490*FX3,0 4500I$=INKEY$(100) 4510*FX2,0 4520*FX21,1 4530K$="" 4540IF I$=CHR$(13) THEN 4610 4550VDU136,141:PRINT TAB(6)"NO COMMUNICATION" 4560VDU136,141:PRINT TAB(6)"NO COMMUNICATION" 4570PRINT ''"CHECK:-"'" Serial Lead"'" Power Lead"'"Press Reset Button"''"Press to try again or"'" to exit" 4580K$=GET$ 4590IF K$=CHR$(13) THEN 4610 4600GOTO 4450 4610CLS 4620ENDPROC