Joystick configuration program (BBC BASIC front-end)

← Voltmace Delta 14B/1 JOYSTIK loader disassembly

BBC BASIC · voltmace-delta-14b-driver-joystik.bas

10 REM PROTECTION 3=&17
20 SN$="CVP DEMO"
25SN$=""  
28ER%=0:ER1%=0:ONERRORGOTO250 
30REV$="Rev 2.0":REM  Copyright (1983) C.V.P.
50 MODE7:Z%=0:OVL%=?&20A:OVH%=?&20B
60*KEY 10CLS:P."UNPROTECTED"¦M
70IFZ%=0THEN*KEY 10
80IFZ%=0THEN*KEY10 CLS:PA.=&1900:?&1900=&D:?&1901=&FF:FOR A%=&1902 TO &5000 STEP 4:!A%=0:NEXT:P."PROGRAM PROTECTED"¦M*KEY10¦M
90 OS%=0:IF ?&F0C7=&32 AND ?&F0C8=&30 THEN OS%=1
95VDU6
100 IF OS%<>1THEN GOTO 140 
130*FX200,2
135IF Z%=1 THEN *FX200,0
140 DIMN%(72),K$(72),V%(35),W%(35),C$(35),CH%(35),F$(35),T$(8)
150DIM K%(36),CR%(28),J%(8)
160*FX4,1
170ONERRORGOTO 250
190PROCINTRO::PROCINIT:PROCGAME
200PROCSCREEN:PROCDEFAULTPRINT:VDU23;8202;0;0;0;:GOTO220
210PROCEDIT
220PROCCHANGE
230IFQ$="R"ORQ$="r"GOTO210 ELSE PROCASSEM  
240CLS:PROCTERM:IF Q$="E" OR Q$="e" THEN GOTO 200 ELSE GOTO 240
250IF ER%=1 THEN 252
251IF ERR=17 AND ER1%=0 THEN 190 ELSE 258  
252IF ERR=17 THEN ER%=0:GOTO 240
258IFZ%=1THENPRINT'''"Error ";ERR;" in line ";ERL;" ";:REPORT:PRINT'':*FX4,0
260IFZ%=1 AND ER1%=1 THEN STOP
270CLS:PRINTTAB(8,4)"ƒˆSYSTEM ERROR"'''"Please note the following number"'''TAB(8);"JOY";ERL;"/";ERR'''"Please quote this number should this"'"program fail to work correctly." 
271IF Z%=1 AND ER1%=1 THEN ONERROROFF ELSE ONERRORGOTO272   
272IF Z%=0 THEN GOTO 1960 ELSE GOTO 272
280DEFPROCINTRO:VDU23;8202;0;0;0;:*FX16,4 
285IF SN$="" THEN Sn$="DISC COMPATIBLE" ELSE Sn$="Ser. No "+SN$
290CLS:PROCWARN:PRINTTAB(0,2);:VDU131,141:PRINT"VOLTMACE DELTA 14/B JOYSTICK DRIVER":PRINTTAB(0,3);:VDU131,141:PRINT"VOLTMACE DELTA 14/B JOYSTICK DRIVER"
295PRINTTAB(14,4);REV$;
300PRINTTAB(8,5);CHR$(134);CHR$(141);Sn$:PRINTTAB(8,6);CHR$(134);CHR$(141);Sn$;CHR$(140);"  Rev 1.0"
302PRINT"†( JOYSTICK DRIVER runs on all OS. )"
305IF SN$="" PRINTTAB(0,9);"THIS SOFTWARE IS SUPPLIED ON TAPE"'"AND CAN BE USED EITHER AS A TAPE BASED"'"UTILITY, OR IT MAY BE TRANSFERRED TO "'"DISC BY THE PURCHASER AND THEN DISC RUN." ELSE PRINT'''
310PRINT"THIS SOFTWARE REMAINS THE COPYRIGHT OF"'CHR$(134);CHR$(141);"CUSTOM VIDEO PRODUCTIONS (C.V.P.)"'CHR$(134);CHR$(141);"CUSTOM VIDEO PRODUCTIONS (C.V.P.)"
320PRINT"AND MAY NOT BE COPIED OR DUPLICATED IN"'"ANY MANNER FOR RETAIL OR RESALE."''SPC(4);"†( Copyright (1983)  C.V.P. )" 
330PROCCONT
340CLS:PROCWARN:PRINTTAB(0,2);:VDU131,141:PRINT"VOLTMACE DELTA 14/B JOYSTICK DRIVER":PRINTTAB(0,3);:VDU131,141:PRINT"VOLTMACE DELTA 14/B JOYSTICK DRIVER"
350PRINTTAB(2,6);CHR$(157);CHR$(132);"SELECT EITHER: ";CHR$(156)''TAB(4);"SINGLE JOYSTICK            (";CHR$(136);"S";CHR$(137);")"''TAB(4);"1 JOYSTICK  + ADAPTOR BOX  (";CHR$(136);"1";CHR$(137);")"' 
351PRINTTAB(4);"2 JOYSTICKS + ADAPTOR BOX  (";CHR$(136);"2";CHR$(137);")"   
360PRINT '''CHR$(131);"( SINGLE JOYSTICK IS RECOMMENDED FOR"'CHR$(131);"ACORNSOFT GAMES )"''"FORƒ1 JOYSTICK + ADAPTOR BOX‡, PLUG THE"'"JOYSTICK INTO THE†SIDE‡SOCKET."  
370 Q$=GET$:IFQ$="S"ORQ$="s"I%=0:J%=8:H%=7:L%=5:S1$="SINGLE JOYSTICK":GOTO410
380IFQ$="1"ORQ$="!"I%=18:J%=18:H%=35:L%=7:S1$="1 JOYSTICK  + ADAPTOR BOX":GOTO410
390IFQ$="2"ORQ$=""""I%=0:J%=36:H%=35:L%=9:S1$="2 JOYSTICKS + ADAPTOR BOX":GOTO410
400SOUND1,-15,40,5:GOTO370
410PRINT TAB(0,L%+3);CHR$(157);CHR$(132);:TIME=0:REPEAT UNTIL TIME>200:CLS:PROCWARN:PRINTTAB(0,2);:VDU131,141:PRINTS1$:PRINTTAB(0,3);:VDU131,141:PRINTS1$ 
420PRINT'"THE JOYSTICK DRIVER WILL ENABLE THE"'CHR$(131);S1$;CHR$(135);"TO SIMULATE"'"THE OPERATION OF UP TO";CHR$(131);J%;CHR$(135);"DEFINABLE"'"KEYBOARD KEYS." 
430PRINT'"THIS PROGRAM GENERATES THE MACHINE CODE"'"DRIVER THAT REMAINS RESIDENT IN RAM"'"MEMORY (&A00 to &AFF) WHILE YOUR MAIN"'"PROGRAM IS LOADED AND RUN."  
440PRINT'"ONCE THIS M/C DRIVER HAS BEEN INSTALLED"'"YOU CAN LOAD OR CHAIN YOUR OWN PROGRAM"'"INTO THE COMPUTER, AND THEN THE"'"JOYSTICK(S) & KEYPAD WILL SIMULATE"'"THE OPERATION OF THE COMPUTERS KEYBOARD." 
450PROCCONT:PRINTTAB(0,2);:VDU131,141,136,42,32,137:PRINT"ACORNSOFT COMPATIBLE   ";:VDU136,42,13:PRINTTAB(0,3);:VDU131,141,136,42,32,137:PRINT"ACORNSOFT COMPATIBLE   ";:VDU136,42,13
460PRINT''"THE WAY THIS SOFTWARE SIMULATES"'"THE PRESSING OF KEYS IS DIRECTLY"'"COMPATIBLE WITH SOME OF THE ARCADE"'"TYPE GAMES PRODUCED BY ACORNSOFT."'
470PRINT"THIS MEANS THAT THESE GAMES CAN NOW"'"BE CONTROLLED BY JOYSTICK(S) + KEYPADS"'"WITHOUT MODIFYING THE GAMES SOFTWARE."'
480IF J%<>8 THEN PRINT"…ˆWARNING:‰ƒSome programs use the VIA"'"ƒTimer in a mode that pulses P7 of the"'"ƒUser Port.   This has the effect of"'"ƒselecting between the two Keypads and"'"ƒcauses the Keypad operation to be"
481IF J%<>8 THEN PRINT"ƒunreliable. If this happens, re-build"'"ƒyour driver for SINGLE JOYSTICK."
485PROCCONT:PRINTTAB(0,2);:VDU134,141,136,42,32,137:PRINT"USER PROGRAM COMPATIBLE";:VDU136,42,13:PRINTTAB(0,3);:VDU134,141,136,42,32,137:PRINT"USER PROGRAM COMPATIBLE";:VDU136,42,13
490PRINT''"OTHER PROGRAMMES THAT USE KEYBOARD"'"CONTROL CAN ALSO BE CONTROLLED BY THE"'"ƒ";S1$;"‡,PROVIDED"'"THAT THE PROGRAM READS THE"'"KEYBOARD IN A COMPATIBLE WAY."' 
500PRINT"TO BE COMPATIBLE THE KEYBOARD MUST BE"'"READ USING THE INKEY(Y) FUNCTION,"'"WHERE Y IS A NEGATIVE VALUE"'"CORRESPONDING TO THE KEY TO BE TESTED."'
510PRINT"Example :- to test for key 'A' pressed."'';CHR$(134);"IF INKEY(-66)=-1 THEN ....etc"''"WHERE -66 IS THE INKEY VALUE FOR 'A'."
520PROCCONT:ENDPROC
530DEFPROCCONT:PRINTTAB(0,22);:VDU131,136:PRINT"PRESS  SPACE-BAR  TO CONTINUE ";
540Q$=GET$:IFQ$=" "CLS:PROCWARN:ENDPROCELSEGOTO540
550DEFPROCWARN:PRINTTAB(0,24);CHR$(131);"WARNING.";CHR$(133);"DO NOT BREAK.  ( Protected )"'SPC(9);CHR$(134);"PRESS ESCAPE TO RESTART";TAB(0,0);:ENDPROC 
560  DEFPROCSCREEN:CLS:PROCWARN:PRINTTAB(0,0);CHR$(131);CHR$(141);S1$;" EDITOR":PRINTTAB(0,1);CHR$(131);CHR$(141);S1$;" EDITOR"
570DEFPROCFUNCTION
580 PRINTTAB(8,2);CHR$(134);T$(Q%);
590FORE%=I% TO H%:PRINTTAB(20+10*(I%=18)+20*(E%<18),3+E%+(18*(E%>17)));CHR$(135);CHR$(137);C$(E%);:NEXT  
600ENDPROC
610DEFPROCGAME:PROCWARN:PRINTTAB(0,1);CHR$(131);CHR$(141);"SELECT GAME  OR  USER DEFINE":PRINTTAB(0,2);CHR$(131);CHR$(141);"SELECT GAME  OR  USER DEFINE":FORT%=0TO7:PRINTTAB(5,T%+4);T%;".   ";T$(T%):NEXT
620PRINTTAB(0,22);:VDU131,136:PRINT"HIT A NUMBER KEY ";:VDU137:PRINT" (0 to 7)           "
630Q$=GET$:IFASC(Q$)<ASC("0")ORASC(Q$)>ASC("7")THENSOUND1,-15,100,5:GOTO630
640 Q%=VAL(Q$):PROCINSOFF:PRINTTAB(1,Q%+4);CHR$(157);CHR$(132);:IF H%=7 THEN ON Q%+1GOTO 730,740,750,760,770,780,790,800 ELSE ONQ%+1GOTO650,660,670,680,690,700,710,720
650RESTORE810:GOTO970
660RESTORE820:GOTO970
670RESTORE830:GOTO970
680RESTORE840:GOTO970
690RESTORE850:GOTO970
700RESTORE860:GOTO970 
710RESTORE870:GOTO970
720RESTORE880:GOTO970
730RESTORE 890:GOTO 970
740RESTORE 900:GOTO 970
750RESTORE 910:GOTO 970
760RESTORE 920:GOTO 970
770RESTORE 930:GOTO 970 
780RESTORE 940:GOTO 970
790RESTORE 950:GOTO 970 
800RESTORE 960:GOTO 970
810DATA33,114,115,116,74,74,74,24,24,24,24,24,24,24,24,24,24,24,122,26,42,58,74,74,74,104,39,22,37,53,20,19,18,50,49,40
820DATA24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,67,98,105,73,24,24,24,24,24,24,24,24,24,24,24,24,24,24
830DATA24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,67,98,105,73,68,68,68,68,68,51,51,51,24,24,24,24,24,24
840DATA24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,1,99,98,66,74,74,74,74,74,97,97,97,24,24,24,85,85,85,24,24,24
850DATA24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,2,65,24,1,74,74,74,74,74,99,99,99,24,24,24,85,85,85 
860DATA24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,2,65,24,24,74,74,74,74,74,24,24,24,24,24,24,24,24,24
870DATA24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,1,99,98,66,74,74,74,74,74,97,97,97,24,24,24,24,24,24
880DATA24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,1,99,24,24,74,74,74,74,74,24,24,24,24,24,24,24,24,24
890DATA 122,26,42,58,74,74,99,99
900DATA 67,98,105,73,24,24,24,24
910 DATA 67,98,105,73,68,68,51,51
920 DATA 1,99,98,66,74,74,97,97
930DATA 2,65,24,1,74,74,99,99
940DATA 2,65,24,24,74,74,74,74
950DATA 1,99,98,66,74,74,97,97
960DATA 67,98,24,24,74,74,74,74
970 FORE%=0TOH%:READ L%
980FORK%=0TO72:IFL%=N%(K%)THENM%=K% 
990 NEXT:W%(E%)=M%:V%(E%)=N%(M%):NEXT:FORE%=0TOH%:F$(E%)=K$(W%(E%)):NEXT:ENDPROC
1000DEFPROCINSON:PRINTTAB(6,21);CHR$(131);"HOLD DOWN REQUIRED KEY":PRINTTAB(6,22);CHR$(131);"UNTIL TONE SOUNDS":ENDPROC
1010DEFPROCINSOFF:PRINTTAB(0,21);STRING$(34," "):PRINTTAB(0,22);STRING$(34," "):ENDPROC
1020DEFPROCEDIT:?&20A=OVL%:?&20B=OVH%:FORG%=0TO9000:NEXT:*FX 15,1
1030FORE%=I%TOH%:PROCINSON:PRINTTAB(27+10*(I%=18)+20*(E%<18),3+E%+(18*(E%>17)));CHR$(131);"?";CHR$(136);:PROCKEY:NEXT:ENDPROC 
1040DEFPROCDEFAULTPRINT::FORE%=I%TOH%:PRINTTAB(28+10*(I%=18)+20*(E%<18),3+E%+(18*(E%>17)));"  ";F$(E%);:NEXT:ENDPROC
1050DEFPROCCHANGE:FORG%=0TO2000:NEXT:*FX 15,1
1060PRINTTAB(0,21);:VDU131,136,42,137,129:PRINT"To REDEFINE HIT  R      ";:VDU131,136,42:PRINTTAB(0,22);:VDU131,136,42,137,130:PRINT"IF CORRECT  HIT SPACEBAR";:VDU131,136,42
1070Q$=GET$:IFQ$<>"R"ANDQ$<>" "GOTO1070ELSEPROCINSOFF:ENDPROC
1080DEFPROCINIT:SEN%=5:SL%=&2000+(SEN%*&1000)/2:SH%=&10000-SL%
1090RESTORE1100:FORN%=0TO72:READK$(N%):NEXT:RESTORE1120:FORN%=0TO72:READN%(N%):NEXT 
1100DATA f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,1,2,3,4,5,6,7,8,9,0,-,^,\,@,[,_,;,:,],",",".",SLASH
1110DATA ESCAPE,TAB,CAPSLOCK,CTRL,SHIFTLOCK,SHIFT,SPACEBAR,DELETE,COPY,RETURN,CUR.UP,CUR.DOWN,CUR.LEFT,CUR.RIGHT," "
1120DATA 33,114,115,116,21,117,118,23,119,120,66,101,83,51,35,68,84,85,38,70,71,87,102,86,55,56,17,52,82,36,54,100,34,67,69,98,49,50,18,19,20,53,37,22,39,40,24,25,121,72,57,41,88,73,89,103,104,105,113,97,65,2,81,1,99,90,106,74,58,42,26,122
1130DATA 3
1140RESTORE1150:FORN%=0TO7:READT$(N%):NEXT
1150DATA USER DEFINED,ACORNSOFT SNAPPER,ACORNSOFT MONSTERS,ACORNSOFT PLANETOID,ACORNSOFT METEOR,ACORNSOFT ARCADIAN,ACORNSOFT ROCKET RAID,ACORNSOFT SUPER INVADERS
1160  RESTORE1170:FORN%=0TO35:READC$(N%):NEXT:IF H%=7 THEN C$(4)="F1a":C$(5)="F1b":C$(6)="F2a":C$(7)="F2b"
1170  DATA RIGHT,LEFT,DOWN,UP,---F3,---F2,10-F1,11,9,8,7,6,5,4,3,2,1,0,RIGHT,LEFT,DOWN,UP,---F3,---F2,10-F1,11,9,8,7,6,5,4,3,2,1,0
1180FOR N%=0 TO H%:CH%(N%)=0:NEXT:CH%(0)=1:CH%(1)=1:CH%(2)=2:CH%(3)=2:CH%(18)=3:CH%(19)=3:CH%(20)=4:CH%(21)=4 
1190ENDPROC
1200DEFPROCKEY:Key=-1
1210FORN%=0TO71:K=INKEY(-N%(N%)):IFK=-1THENKey=N%
1220NEXT:IFKey=-1THENGOTO1210
1230V%(E%)=N%(Key):F$(E%)=K$(Key):VDU8,8:PRINT;CHR$(134);" ";K$(Key);SPC(10-LEN(K$(Key)));:PROCINSOFF:SOUND1,-15,100,10:FORD%=0TO5000:NEXT:*FX 15,1 
1240ENDPROC
1250DEFPROCFINI:CLS:PRINTTAB(0,1);:VDU131,136,141:PRINT"+++ LOAD / CHAIN  ETC PROGRAM +++":PRINTTAB(0,2);:VDU131,136,141:PRINT"+++ LOAD / CHAIN  ETC PROGRAM +++":PRINTTAB(0,4);CHR$(133);"DO NOT 'HARD RESET' OR REDEFINE KEY10"
1260PRINT"If you do, then the link vector to this"'"JOYSTICK DRIVER will be broken !"''"To restore link type:-"'CHR$(134);"  *KEY10 CALL &A00¦M"'"Then do 'SOFT RESET' (ie single BREAK)"'
1270T$=MID$(T$(Q%),0,4):IF Q%>0 THEN T$=MID$(T$(Q%),11,4) 
1280T$=T$+"-DR"
1290PRINT"TO SAVE THE MACHINE CODE DRIVER TYPE :-"'CHR$(134);"  *SAVE ";T$;" A00 +100"'"TO RE-INSTALL THAT DRIVER LATER USE :-"'CHR$(134);"  *LOAD ";T$;" ‡then†CALL &A00"
1295PRINT"The name†";T$;"‡is only a suggested"'"file name, you can call the M/C Driver"'"any valid unused filename."'
1300IF Q%=0 THENPRINT;CHR$(131);"LOAD ";ELSE PRINT;CHR$(131);"CHAIN ";
1310T$(0)="YOUR PROGRAMME"
1320PRINT;T$(Q%);"  & use"'CHR$(131);S1$;" or KEYBOARD"'"ONCE ";T$(Q%);" IS LOADED"'"FOLLOW THE ";CHR$(157);CHR$(132);"KEYBOARD  ";CHR$(156);CHR$(135);"OPTIONS."'
1330*FX4,0
1340VDU23;29194;0;0;0;
1350*KEY 10 CALL &A00¦MCLS:P.'"JOYSTICK DRIVER OPERATIONAL."¦M
1360IFZ%=0THEN GOTO 1960
1370ENDPROC
1380DEFPROCTERM
1390CLS:PROCWARN:PRINTTAB(3,2);CHR$(131);CHR$(141);S1$:PRINTTAB(3,3);CHR$(131);CHR$(141);S1$
1400PRINTTAB(0,9);"  EDIT JOYSTICK DEFINED KEYS  (ˆE‰)"''"  TEST JOYSTICK               (ˆT‰)"''"  ALTER JOYSTICK SENSITIVITY  (ˆA‰)"''"  FINISH PROGRAMME            (ˆF‰)"
1410Q$=GET$:IFQ$="E" OR Q$="e" THEN PRINTTAB(0,9);CHR$(157);CHR$(132);:PROCDEL:ENDPROC
1420IFQ$="T" OR Q$="t" THEN PRINTTAB(0,11);CHR$(157);CHR$(132);:PROCDEL:PROCTEST:ENDPROC
1430IFQ$="A" OR Q$="a" THEN PRINTTAB(0,13);CHR$(157);CHR$(132);:PROCDEL:PROCJOY:ENDPROC
1440IFQ$="F" OR Q$="f" THEN PRINTTAB(0,15);CHR$(157);CHR$(132);:PROCDEL:PROCFINI:END 
1450GOTO 1400
1460DEFPROCDEL:TIME=0:REPEAT UNTIL TIME>200:ENDPROC
1470DEFPROCTEST
1480ER%=1
1490CLS:PROCWARN:PROCFUNCTION:PRINTTAB(0,0);:VDU131,141:PRINT;S1$;"  TEST   ":PRINTTAB(0,1);:VDU131,141:PRINT;S1$;"  TEST   " 
1500PROCDEFAULTPRINT:PRINTTAB(0,24);CHR$(131);"WARNING.";CHR$(133);"DO NOT PRESS BREAK";SPC(10);TAB(0,0);
1510PRINTTAB(0,23);CHR$(134);CHR$(136);"PRESS  ESCAPE  TO STOP TEST";SPC(9);:PRINTTAB(0,21);CHR$(133);"TEST BY";CHR$(135);"(1)";CHR$(131);"DEFINED KEYBOARD KEYS":PRINTTAB(0,22);"         (2)";CHR$(134);"JOYSTICK & KEYPAD" 
1520VDU23;8202;0;0;0;
1530FORE%=I%TOH%:PRINTTAB(27+10*(I%=18)+20*(E%<18),3+E%+(18*(E%>17))); 
1540IFINKEY(-V%(E%))=-1THENVDU131,93ELSEVDU135,32
1550IF E%<4 OR (E%>17 AND E%<22) THEN PROCDISAD ELSE PROCDISUP 
1560NEXT:GOTO1530
1570DEFPROCDISUP:?&FE62=&F0:PRINTTAB(20+10*(I%=18)+20*(E%<18),3+E%+(18*(E%>17)));:IF H%=7 THEN PROCDISFIRE:ENDPROC ELSE A%=&97:X%=&60:TM%=?(TBL%+8+(E%*2)+1+8*(E%>17)):Y%=TM%AND&F0
1580CALL &FFF4:A%=&96:X%=&60:F%=&F-((USR(&FFF4) AND &F0000)DIV &10000)
1590IF ((TM% AND &F)AND F%)<>0 THEN VDU134,93 ELSEVDU135,32  
1600ENDPROC
1610DEFPROCDISAD:AD%=ADVAL(CH%(E%)):PRINTTAB(20+10*(I%=18)+20*(E%<16),3+E%+(18*(E%>13)));
1620IFE%MOD2=0PROCDISLOW
1630IFE%MOD2=1PROCDISHIGH
1640ENDPROC
1650DEFPROCDISLOW:IFAD%<SL%THENVDU134,93ELSEVDU135,32:ENDPROC
1660DEFPROCDISHIGH:IFAD%>SH%THENVDU134,93ELSEVDU135,32:ENDPROC
1670ENDPROC
1680DEFPROCDISFIRE:AD%=ADVAL(0)
1690IFE%=4ORE%=5THENFM%=1ELSEFM%=2
1700IF(AD%ANDFM%)=FM%THENVDU134,93ELSEVDU135,32  
1710ENDPROC
1720DEF PROCASSEM
1730S%=?&20A+&100*?&20B:IF S%>&8000 THEN R%=S%
1740TBL%=&AB0
1750IF H%=7 THEN S%=&1A00 ELSE S%=&1B00
1760FOR N%=0 TO &FF:?(&A00+N%)=?(S%+N%):NEXT
1770 
1780FOR N%=0 TO 7
1790?(TBL%+(N%)*2)=-V%(N%+14+14*(N%<4))
1800NEXT
1810FOR N%=0 TO 27
1820?(TBL%+0+(8+N%)*2)=-V%(N%+4+4+4*(N%<14))  
1830NEXT
1840?&AFA=&4C:?&AFB=R%MOD&100:?&AFC=R%DIV&100
1850?&AFD=SH%DIV&100:?&AFE=SL%DIV&100
1860CALL &A00 
1870ENDPROC
1880DEF PROCJOY CLS:PROCWARN:PRINTTAB(5,0);:VDU131,141:PRINT"JOYSTICK SENSITIVITY":PRINTTAB(5,1);:VDU131,141:PRINT"JOYSTICK SENSITIVITY"
1890PRINTTAB(4,4)"SELECT REQUIRED SENSITIVITY"'SPC(8);"(ˆ1‰ to ˆ9‰)"'''"   1 = LOW  SENSITIVITY"'"   9 = HIGH SENSITIVITY"'''"  ";CHR$(134);SEN%;" = CURRENT VALUE"''''''CHR$(131);"    PRESS SPACEBAR WHEN CORRECT"'' 
1900SL%=&2000+(SEN%*&1000)/2:SH%=&10000-SL%
1910Q$=GET$:IF Q$=" " THEN ?&AFD=SH%DIV&100:?&AFE=SL%DIV&100:ENDPROC
1920IF Q$<"1" OR Q$>"9" THEN GOTO 1910
1930SEN%=VAL(Q$):GOTO 1890
1960?&1900=&D:?&1901=&FF
1970 IF OS%=0 GOTO 2000
1980*FX200,0
2000VDU23;29194;0;0;0;
2010FORA%=&1902TO&4400 STEP 4:!A%=0:NEXT:PAGE=&1900:END