ô > USBKBD/src v0.42  ô Background keyboard driver : (ô v0.30 17-Nov-2017: 2?ô Works with Vinculum v1 with keyboard as device 0 (no hub) .oldKEYV H JMP 0 R: \ .usb_EVNT f8CMP #4:BNE usb_bye :\ Not VSync p: z9\ We are running event code, so all IRQs are disabled „,\ So we can use IRQ workspace at &FA/&FB Ž\ ˜@LDX #0:LDY #12:JSR usb_CmdSend :\ Read from keyboard ¢KCLC:BEQ kbd_flush:CMP #9:BCS kbd_flush :\ Null packet or invalid packet ¬9JSR usb_Rd:JSR usb_Rd:TAY :\ Y=modifiers ¶CJSR usb_Rd:JSR usb_Rd:CMP #&FF :\ A=keypress, set CC+NE À.kbd_flush ÊAPHP:JSR usb_Flush:PLP:BCS kbd_exit :\ Not our data packet Ô;\BIT usb_D:\BIT sub_S:\BPL kbd_flush:\BCS kbd_exit:\TAX Þ: è\ CS =null/invalid packet ò7\ CC+EQ=no data received, no change to keys pressed ü<\ CC+NE=keypress, might be same or different to last key ;BEQ kbd_repeat :\ No key change 8PHA:TYA:STA &FA :\ A=gascgasc 8ASL A:ASL A:ASL A:ASL A :\ A=gasc0000 $5„A &FA:€ #&F0 :\ A=GASC0000 .>ASL A:ASL A:ROL A :\ A=C000000A, Cy=S 87BCC P%+4:„A #&40 :\ A=CS00000A BGSTA kbd_modify :\ b7=ctrl, b6=shift, b0=alt L: VCPLA:CMP kbd_lastK:BEQ kbd_repeat :\ Same key pressed down `@STA kbd_lastK :\ New or no keypress jKLDX &254:STX &E7 :\ Copy KeyDelay to KeyCountdown t.kbd_keypress ~9JSR kbd_convert:BCS kbd_exit :\ No keypress ˆ6TAY:‚ &26C:BNE kbd_insert :\ Not Escape ’?STA &E7 :\ Cancel autorepeat œ.kbd_insert ¦ LDX #3 ° .kbd_save ºDLDA &EE,X:PHA:DEX:BNE kbd_save :\ Save OSBYTE parameters ÄKLDA #153:JSR OSBYTE:LDX #&FD :\ Insert with Escape processing Î.kbd_restore ØGPLA:STA &F2,X:INX:BNE kbd_restore :\ Restore OSBYTE parameters â .kbd_exit ìRTS ö: .kbd_repeat  =LDA &E7:BEQ kbd_exit :\ Repeat disabled CDEC &E7:BEQ P%+6:DEC &E7:BNE kbd_exit :\ Countdown not reached LLDA &255:STA &E7 :\ Copy KeyRepeat to KeyCountdown (ELDA kbd_lastK:JMP kbd_keypress :\ Insert another keypress 2: <.kbd_convert FCMP #&39:BNE kbd_notcaps P0LDA &25A:‚ #16:STA &25A:RTS :\ CAPS Z.kbd_notcaps dBSEC:SBC #4:BPL kbd_test:SBC #&1F :\ Reduce range if &84+ n .kbd_test x9CMP #&69:BCS kbd_exit :\ No keypress ‚;LDX kbd_modify:STX &FA :\ Get modifiers Œ0ADC #—"A":CMP #—"[":BCC kbd_tab :\ Letter –1SBC #42:CMP #—"9"+1:BCC kbd_tab :\ Digit  TAX:LDA kbd_keytable-58,X ª1BNE kbd_tab:LDA &26B :\ TAB ´ .kbd_tab ¾5CMP #—"!":BCC kbd_exit :\ ctrls+spc ÈACMP #127:BEQ kbd_done:BCS kbd_topset :\ DEL and topbit keys Ò?)!@#$%^&*(*:<+>?",kbd%=0):\ US b:EQUS À"~!@~$%&@()*+<_>?)!""`$%^&*(*:<+>?",kbd%=1):\ UK lH\EQUSLEFT$("@!@~$%&'()*+<=>?0!""#$%&'()*+<+>`",kbd%=2):\ JP/BBC/ECMA vCEQUS À"@!@~$%&'()*+<=>?_!""#$%&'()*+_+>`",kbd%=2):\ JP/BBC/ECMA €1\ Shift+ !"#$%&'()*+,-./012 3456789c;<=>? Š1\ @ABCDEFGHIJKLMNOPQR STUVWXYZ[\]^_ ”0\ `abcdefghijklmnopqr stuvwxyz{|}~ ž\ ¨.kbd_keytable ²5EQUB 48:EQUB 13:EQUB 27:EQUB 127:EQUB 0:EQUS " -" ¼!EQUS À"=[]\#;'`",kbd%=0):\ US Æ!EQUS À"=[]\#;'`",kbd%=1):\ UK Ð*EQUS À"^@[\];:_",kbd%=2):\ JP/BBC/ECMA ÚKEQUS ",./":EQUB 1:EQUB &81:EQUB &82:EQUB &83:EQUB &84:EQUB &85:EQUB &86 äKEQUB &87:EQUB &88:EQUB &89:EQUB &CA:EQUB &CB:EQUB &CC:EQUB &80:EQUB &C3 îKEQUB &8A:EQUB &CD:EQUB &C8:EQUB &9F:EQUB &7F:EQUB &8B:EQUB &9E:EQUB &8D ø'EQUB &8C:EQUB &8E:EQUB &8F:EQUB &C2 ;EQUB &C0+—"/":EQUB &C0+—"*":EQUB &C0+—"-":EQUB &C0+—"+"  =EQUB &E0 :EQUB &C0+—"1":EQUB &C0+—"2":EQUB &C0+—"3" ;EQUB &C0+—"4":EQUB &C0+—"5":EQUB &C0+—"6":EQUB &C0+—"7"  ;EQUB &C0+—"8":EQUB &C0+—"9":EQUB &C0+—"0":EQUB &C0+—"." *?EQUS "\" :EQUB &C1 :EQUB &C0+—",":EQUB &C0+—"=" 40EQUS "\":EQUB &C7:EQUS "\":EQUB &C6:EQUB &C5 >I\ Note, calculating function/keypad key codes takes 10 bytes but only H&\ save 9 bytes in the lookup table R: \] f)í:ç (P%€&FFFF)>&B00:ñ"Code overrun":à p9ç (kbd_lastK € &FFFF)<&900:ñ "Code start too early":à zDñ"*SAVE USBKBD ";~mcode%;" ";~O%;" ";~exec%„&FFFF0000;" ";~load% ÿ