Keypad editor (BBC BASIC front-end)

← Voltmace Delta 14B/1 KEYPAD loader and resident driver disassembly

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

10REM PROTECTION 3=&16
30VDU6:MODE7:Z%=0:E1%=0:E2%=0:ONERRORGOTO220
40REV$="Rev 2.0":*KEY10 
60IFZ%=0THEN*KEY10CLS:FOR A%=&C00TO&3A80STEP4:!A%=0:NEXT:*KEY10¦M 
70IF?&E8AA<>&4FTHEN130 
80ONERRORGOTO100
90MODE7:VDU6:PROCBIG(0,8,"KEYPAD DRIVER WILL NOT WORK WITH"):PROCBIG(0,11,"OPERATING SYSTEM  OS 0.1.")
100VDU6:ONERRORGOTO110
110IFZ%=1THENONERROROFF
120GOTO110
130VDU6:*FX200,2
140MODE7
150DIMROW%(4),COL%(3),KPOS%(14,2),ACHR%(40),ACHR$(40),KNUM%(14,1),KCHR$(14,1):MODE7:GOTO170
160MODE7:VDU23,1,0;0;0;0;:PROCBIG(5,10,"ƒR E S T A R T‡"):FORN%=0TO3000:NEXT
170MODE7:VDU23,1,0;0;0;0;:PROCINTRO:MODE1:VDU23,1,0;0;0;0;
180PROCH1:PROCINS:PROCEDIT
190PROCMENU
200IFQ$="E"THENGOTO180
210IFQ$="F"THENPROCFIN:IFZ%=1THENSTOPELSEGOTO1350
220IFE1%=1THENPRINT'''"Error ";ERR;" in line ";ERL;"  ";:REPORT:PRINT'':STOP
230IFERR<>17THENGOTO250
240IFE2%=0THEN160 ELSEE1%=1:GOTO220
250MODE7:PROCBIG(5,8,"SYSTEM ERROR"):PRINT''"Please quote this number ";ERL;"/";ERR
260ONERRORGOTO270
270IFZ%=1THENONERROROFF
280GOTO270
290DEFPROCINIT:*FX4,1
300CURKEY%=0:NEWKEY%=0:CURROW%=0:CURCOL%=0:?&FE62=&F0:F%=0:B$=STRING$(32," "):B%=0:A%=0
310RESTORE320:FORN%=0TO4:READROW%(N%):NEXT:FORN%=0TO3:READCOL%(N%):NEXT
320DATA 8,4,2,1,0,&60,&50,&30
330RESTORE340:FORN%=0TO14:KCHR$(N%,0)="     ":KCHR$(N%,1)="     ":FORM%=0TO2:READKPOS%(N%,M%):NEXT:NEXT
340DATA 1,22,128,10,22,128,19,22,128,1,17,128,10,17,128,19,17,128,1,12,128,10,12,128,19,12,128,1,7,128,10,7,129,19,7,128,1,1,129,10,1,131,19,1,129
350RESTORE370:FORN%=0TO40:READACHR%(N%):IFACHR%(N%)=-1N%=40:GOTO360:ELSEREADACHR$(N%)
360NEXT
370DATA 2,P ON,3,P OFF,4,T=TC,5,T=GC,6,VDUON,7,BEEP,8,BACK,9,TAB,10,DOWN,11,UP,12,CLS,13,RET,14,PAGE,15,SCROL,16,CLG,21,CLRLN,26,R-D-W,30,HOME,32,SPACE,127,DEL
380DATA&90,fO,&91,f1,&92,f2,&93,f3,&94,f4,&95,f5,&96,f6,&97,f7,&98,f8,&99,f9,&9A,f10,135,COPY,136,CUR <,137,CUR >,138,CUR V,139,CUR ^,0,ESC,-1
390RESTORE400:FORKP%=0TO1:FORN%=0TO14:READK%:KNUM%(N%,KP%)=K%:PROCCONV:NEXT:NEXT
400DATA &7F,&30,&D,&31,&32,&33,&34,&35,&36,&37,&38,&39,&38,&38,&38,127,138,0,136,30,137,135,139,12,&90,13,&91,13,13,13
410KP%=0:FI%=0:ENDPROC
420DEFPROCKEYPAD:VDU28,0,31,26,5:COLOUR131:CLS:COLOUR0:PRINTTAB(1,26);"( Copyright 1983  C.V.P.)";:FORN%=0TO14:PROCBKKEY:NEXT:ENDPROC
430DEFPROCBKKEY:COLOUR3:PROCkey:ENDPROC 
440DEFPROCWTKEY:COLOUR0:PROCkey:PROCkchr:ENDPROC
450DEFPROCkey:COLOURKPOS%(N%,2):X%=KPOS%(N%,0):Y%=KPOS%(N%,1):PRINTTAB(X%,Y%);"       ";:PRINTTAB(X%,Y%+1);" ";
460IFN%<>13PRINTKCHR$(N%,KP%);" ";ELSECOLOUR0:IFKP%=0PRINT"REAR";ELSEPRINT"SIDE";
470PRINTTAB(X%,Y%+2);
480IFN%<>13ANDFI%=1COLOUR2:PRINT;" ";KCHR$(N%,1);" ";ELSEIFN%=13ANDFI%=1COLOUR1:PRINT" SIDE";:ENDPROC
490IFN%<>13ANDFI%=0PRINT;"       ";
500ENDPROC
510DEFPROCkchr:PRINTTAB(KPOS%(N%,0),KPOS%(N%,1)+1);:ENDPROC
520DEFPROCEDIT:OK%=-1
530PROCKEYPAD:N%=CURKEY%
540PROCWTKEY
550PROCREADKP
560IFNEWKEY%<>CURKEY%THENNEWKEY%=CURKEY%:PROCBKKEY:N%=CURKEY%:PROCWTKEY:SOUND1,-10,180,5:OK%=-2
570K%=INKEY(5):*FX15,1
580F%=(F%+1)AND&7:IFF%>4THENPROCWTKEYELSEPROCBKKEY
590IFK%=17PROCBKKEY:ENDPROC
600IFK%=-1OROK%=K%THEN550 ELSEIFK%<>1THENOK%=K%
610IFK%=1THENSOUND1,-8,150,10:SOUND2,-8,158,10:KP%=(KP%+1)AND1:OK%=-2:GOTO530
620PROCCONV:PROCYEL:PROCSND:GOTO550
630DEFPROCCONV:IFK%>32ANDK%<127THENKCHR$(N%,KP%)="  "+CHR$(K%)+"  ":S%=1:ENDPROC
640PROCSPECIAL:IFE%=-1THENS%=2:ENDPROCELSEPROCPAD:S%=1:ENDPROC
650DEFPROCPAD:IFLEN(KCHR$(N%,KP%))<3THENKCHR$(N%,KP%)=KCHR$(N%,KP%)+" " 
660IFLEN(KCHR$(N%,KP%))<4THENKCHR$(N%,KP%)=KCHR$(N%,KP%)+" "
670IFLEN(KCHR$(N%,KP%))<5THENKCHR$(N%,KP%)=" "+KCHR$(N%,KP%)
680ENDPROC
690DEFPROCSND:SOUND1,-10,200DIVS%,S%:ENDPROC
700DEFPROCYEL:KNUM%(N%,KP%)=K%:IFN%<>10THENENDPROCELSEKCHR$(12,KP%)=KCHR$(10,KP%):KCHR$(14,KP%)=KCHR$(10,KP%):N%=12:PROCBKKEY:N%=14:PROCBKKEY:N%=10:ENDPROC
710DEFPROCSPECIAL
720FORC%=0TO40:IFACHR%(C%)=-1THENC%=40:E%=-1:GOTO740
730IFK%=ACHR%(C%)THENKCHR$(N%,KP%)=ACHR$(C%):C%=40:E%=1:GOTO740
740NEXT:ENDPROC
750DEFPROCREADKP:?&FE60=KP%*&80:IF?&FE60=(KP%*&80)+&FTHENCURROW%=5:CURCOL%=5:ENDPROC
760Y%=CURROW%:IFCURROW%=5THEN780
770X%=CURCOL%:?&FE60=(COL%(X%)+(&80*KP%)):IF(?&FE60ANDROW%(Y%))=0THENENDPROC
780X%=0
790Y%=0
800?&FE60=COL%(X%)+(&80*KP%)
810IF(?&FE60ANDROW%(Y%))=0THENCURCOL%=X%:CURROW%=Y%:CURKEY%=(3*CURROW%)+CURCOL%:ENDPROC
820Y%=Y%+1:IFY%<4THEN800 
830X%=X%+1:IFX%<3THEN790 
840ENDPROC
850DEFPROCA1:*FX4,1
860COLOUR2:COLOUR128:VDU26:ENDPROC
870DEFPROCH1:PROCA1:PRINT;STRING$(27,"_")''" VOLTMACE   DELTA14 KEYPAD":COLOUR3:PRINT"WARNING: ";:COLOUR1:PRINT"Do not press BREAK"'SPC(9)"ESCAPE = Restart":ENDPROC
880DEFPROCA2:VDU28,28,31,39,0:COLOUR3:COLOUR128:CLS:ENDPROC
890DEFPROCINS:PROCA2:PRINT;"____________"'"INSTRUCTIONS____________"''"(1)  SELECT"'"THE WANTED"'"KEYPAD KEY"'"BY PRESSING"'"THAT BUTTON"'"ON KEYPAD."''"(2)  SELECT"'"CHARACTER"'"FOR THAT KEYBY PRESSING REQUIRED KEYON THE BBC'SKEYBOARD."
900PRINT''"(3) TOGGLE"'"BETWEEN"'"KEYPADS USE"'"CTRL A"'''"(4) TO LEAVEEDITOR TYPE"'"CTRL Q.":ENDPROC 
910DEFPROCINTRO:CLS:PROCWARN:PROCHEAD:PROCBIG(6,5,CHR$(133)+"* DISC COMPATIBLE *"):PRINTTAB(0,7);CHR$(133);"(KEYPAD DRIVER WILL NOT RUN ON OS O.1)"
920PRINTTAB(14,4);REV$;: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"'"DISK BY THE PURCHASER AND THEN DISK RUN."
930PRINT"THIS SOFTWARE REMAINS THE COPYRIGHT OF"':PROCBIG(0,15,CHR$(134)+"CUSTOM VIDEO PRODUCTIONS  (C.V.P.)"):PRINT"AND MAY NOT BE COPIED OR DUPLICATED IN"'"ANY MANNER FOR RETAIL OR RESALE."''SPC(5);CHR$(131)"( Copyright (1983) C.V.P.)"
940PROCINIT:PROCCONT:PROCHEAD:PRINT'"†'KEYPAD DRIVER'‡is a utility that"'"enables theƒKEYPADS‡ofƒVOLTMACE DELTA14"'"ƒJoysticks‡to be defined as programable"'"external keypads for the BBC Computer."'
950PRINT"This UTILITY generates a customised"'"Machine Code Driver that remains"'"resident in the computer's memory at"'"address  &AOO to &AFF, running under"'"interrupt. (EVENT 4. VERTICAL SYNC.)"'
960PRINT"NOTE: EVENT 4 is enabled by the Driver."
970PROCCONT:PROCHEAD:PRINTSPC(4)"*** KEYPAD DEFINITION DETAILS ***"''"ƒSupports†Upper‡&†Lower‡case characters"'"ƒSupports†VDU 1‡to†VDU 30‡&†VDU 127‡"'"(only VDU commands with NO BYTES EXTRA)"'"eg CLEAR TEXT = VDU 12 ( CTRL L)"
980PRINT"therefore define key as CTRL L."
990PRINT"ƒSupports†CURSOR KEYS etc‡."'"ƒSupports†RED FUNCTION KEYS‡f0 to f9"'"( use CTRL f0  (not just f0) to define)"'"ƒSupports†ESCAPE‡(use CTRL @ to define)"'
1000PRINTSPC(5)"ˆ******** WARNING *********"'"†Do NOT press BREAK‡"'" BREAK cannot be defined on KEYPAD."
1010PRINT"Note that CTRL [ ([ is key right of @)"'"(=VDU 27) is equivalent to…ESCAPE"'"& will cause a…RESTART.‡Be careful !.":PROCCONT:ENDPROC
1020DEFPROCHEAD:PROCBIG(0,2,CHR$(131)+"VOLTMACE  DELTA14/B    KEYPAD DRIVER"):ENDPROC
1030DEFPROCBIG(X%,Y%,B$):PRINTTAB(X%,Y%);CHR$(141);B$:PRINTTAB(X%,Y%+1);CHR$(141);B$:ENDPROC
1040DEFPROCWARN:PRINTTAB(0,24);CHR$(131)+"WARNING.";CHR$(134);"DO NOT PRESS BREAK (Protected)";SPC(9);CHR$(133);"PRESS ESCAPE TO RESTART";:VDU30:ENDPROC
1050DEFPROCCONT:PRINTTAB(1,22);"ƒˆPRESS  SPACE-BAR  TO CONTINUE ";
1060*FX15,0
1070Q$=GET$:IFQ$=" "THENCLS:PROCWARN:ENDPROCELSE1060
1080DEFPROCMENU:PROCA2:PRINT"____________"'" OPTIONS"'"____________"'"S  A  E  F"'
1090VDU17,129,17,0:PRINT"   SOUND   "'" Beep when "'" keypad is "'" pressed.  "'" BBC KEY S "'"           "'"  BEEP     ":VDU17,128:PROCONOFF
1100VDU17,129,17,0:PRINT''"AUTO REPEAT"'" BBC KEY A "'"           "'"  AUTO     ":VDU17,128:PROCAUTO
1110PRINT':VDU17,130,17,0:PRINT" RE-EDIT   "'" BBC KEY E ":VDU17,128,17,3:PRINT':VDU17,131,17,0:PRINT"  FINISH   "'" Make M/C  "'" driver,   "'" link  it, "'" and then  "'" finish    "'" BBC KEY F ":VDU17,128,17,3
1120S%=1:PROCSND
1130Q%=INKEY(50):*FX15,1
1140IFQ%=-1THEN1130
1150Q$=CHR$(Q%AND&5F)
1160IFQ$="S"THENB%=(B%+1)AND1:PROCONOFF:GOTO1120
1170IFQ$="A"THENA%=(A%+1)AND1:PROCAUTO:GOTO1120
1180IFQ$<>"F"ANDQ$<>"E"GOTO1130 ELSECLS:ENDPROC
1190DEFPROCONOFF:VDU17,129,17,3:IFB%=0THENPRINTTAB(7,13);"ON ";ELSEPRINTTAB(7,13);"OFF";
1200DEFPROCAUTO:VDU17,129,17,3:IFA%=0THENPRINTTAB(7,18);"ON ";ELSEPRINTTAB(7,18);"OFF";
1210VDU17,128:ENDPROC
1220DEFPROCFIN:KP%=0:FI%=1:PROCA1:CLS:PRINT"To Save/Re-load M/C Driver"'SPC(10);"*TAPE (or *DISC)"'"SAVE M/C =*SAVE MC A00 +100"'"LOAD M/C =*LOAD MC"'"*KEY10 CALL&A00¦M";:COLOUR3:PRINT;" Do BREAK":PROCKEYPAD
1230PROCA2:PRINT"You may now"'"press BREAK"'"   BUT"'"When you do"'"the screen"'"will clear."''"Ensure you"'"note the"'"definitions"'"of the"'"KEYPAD keys"''"TRY KEYPAD"'"BEFORE YOU"'"BREAK."''
1240FORKP%=0TO1:FORP%=0TO11:IFKNUM%(P%,KP%)>=&87ANDKNUM%(P%,KP%)<=&8BTHENKNUM%(P%,KP%)=KNUM%(P%,KP%)+4
1250NEXT
1260FORP%=0TO11:IFKNUM%(P%,KP%)>=&90ANDKNUM%(P%,KP%)<&9BTHENKNUM%(P%,KP%)=KNUM%(P%,KP%)-&10
1270IFKNUM%(P%,KP%)=0THENKNUM%(P%,KP%)=&1B
1280NEXT
1290FORC%=0TO2:FORR%=0TO3:?(&ADD+4*C%+R%+12*KP%)=KNUM%(3*R%+C%,KP%):NEXT:NEXT:NEXT
1300IFA%=1THEN?&A67=&AD
1310IFB%=1THEN?&AF8=&F0
1320*FX4,0
1330CALL&A00
1340VDU23,1,1;0;0;0;:ENDPROC
1350FOR N%=PAGE TO PAGE+&1C00 STEP4:!N%=0:NEXT:!PAGE=&FF0D:*KEY10CALL&A00:VDU11,11:P.SPC(40);"ƒKEYPAD OPERATIONAL‡"'¦M
1360IF?&E8AA<>&4F THEN *FX200,0 
1370PAGE=&1900:!PAGE=&FF0D:END