📄 offickbd.asm
字号:
LDA ONES_TABLE,X
CLC
ADC KSC_WORK
PLX
RTS
;=============================================================
;phantom key detection routin
;=============================================================
CHECK_PHANTOM:
LDA KSC_ROW_HITS
JSR COUNT_ONES
CMP KSC_COL_HITS
BCS SKIP
LDA KSC_COL_HITS
SKIP:
CMP KSC_KEY_COUNT
BCS EXITCHECK1
CLC
JMP EXITCHECK
EXITCHECK1:
SEC
EXITCHECK:
RTS
;============================================================
;Test debounce fifo to see if matrix address is still in it
;if not, exit with zero flag set
;============================================================
KSC_DEBOUNCE_TEST:
PHA
PHX
LDX #00H ;#DEBOUNCE_ARRAY_SIZE
DB_LOOP:
CMP KSC_DB_KEYS,X
BEQ DB_EXIT
INX
CPX #DEBOUNCE_ARRAY_SIZE
BNE DB_LOOP
CPX #0FFH
DB_EXIT:
PLX
PLA
RTS
;============================================================
;Put matrix address in A onto debounce array
;============================================================
;********KSC_DEBOUNCE_KEYS(MATRIX_ADDRESS,KSC_DOWN_UP)******
KSC_DEBOUNCE_KEYS:
PHX
PHA
LDX #00H ;#DEBOUNCE_ARRAY_SIZE
FIND_FREE_DEBOUNCE_LOCATION:
LDA KSC_DB_KEYS,X
CMP #0FFH
BEQ START_KEY_DEBOUNCE
INX
CPX #DEBOUNCE_ARRAY_SIZE
BNE FIND_FREE_DEBOUNCE_LOCATION
JMP DB_KEYS_END
START_KEY_DEBOUNCE:
LDA KSC_MATRIX_ADDR
STA KSC_DB_KEYS,X
LDA KSC_DOWN_UP
CMP #00H
BEQ DEBOUNCE_KEY_RELEASE
LDA #DEBOUNCE_PRESS_TIME
STA KSC_DB_COUNTS,X
JMP DB_KEYS_END
DEBOUNCE_KEY_RELEASE:
LDA #DEBOUNCE_RELEASE_TIME
STA KSC_DB_COUNTS,X
DB_KEYS_END:
PLA
PLX
RTS
;======================================================
;Decrement the time constant in the counter array
;======================================================
KSC_DEBOUNCE_TASK:
PHX
PHA
LDX #00H ;#DEBOUNCE_ARRAY_SIZE
DEBOUNCE_CHECK:
LDA KSC_DB_KEYS,X
CMP #0FFH
BEQ NEXT_VALUE_PROCESS
LDA KSC_DB_COUNTS,X
DEC A
STA KSC_DB_COUNTS,X
BNE NEXT_VALUE_PROCESS
LDA #0FFH
STA KSC_DB_KEYS,X
NEXT_VALUE_PROCESS:
INX
CPX #DEBOUNCE_ARRAY_SIZE
BNE DEBOUNCE_CHECK
PLA
PLX
RTS
;==================================================================================
;FUNCTION: USBKEYPUTKEY
;Handles key presses in usb environment.
;this function is called form within the key scanning loop,each time a valid key
;event has been recognized .a key event is defined as whenever
;==================================================================================
;///////////////////////////USBKEY_PUTKEY(A)//A-->KEY POSITION AT AT-TABLE
USBKEY_PUTKEY:
JSR USB_ALTERNATE_KEY
BCS DONE_PUTKEY
JSR KSC_MODIFIER
BCC NON_MODIFIERS
LDA #1H
STA USB_TX_FLAGS
JMP DONE_PUTKEY
NON_MODIFIERS:
PHX
TAX
LDA USB_USAGE_TABLE,X
PHA
LDA #1H
STA USB_TX_FLAGS
LDA KSC_DOWN_UP
CMP #00H ;;=0 is key release
BNE ADD_KEY_TO_BUFFER ;;=FFH is key down
REMOVE_KEY_FROM_BUFFER:
LDA USB_KEY_COUNT
CMP #00H
BEQ SKIP_DECREMENT_KEY_COUNT
DEC USB_KEY_COUNT
SKIP_DECREMENT_KEY_COUNT:
LDX #2
FIND_KEY_IN_BUFFER:
PLA
PHA
CMP USB_REPORT_BUFFER,X
BEQ CLEAR_BUFFER_POSITION
INX
TXA
CMP #8H
BNE FIND_KEY_IN_BUFFER
PLA
JMP NON_MODIFIERS_DONE
CLEAR_BUFFER_POSITION:
PLA
LDA #00H
STA USB_REPORT_BUFFER,X
JMP NON_MODIFIERS_DONE
ADD_KEY_TO_BUFFER:
LDA USB_KEY_COUNT
CMP #FFH
BEQ SKIP_INCREMENT_KEY_COUNT
INC USB_KEY_COUNT
SKIP_INCREMENT_KEY_COUNT:
LDX #2
FIND_FREE_BUFFER_POSITION:
LDA #00H
CMP USB_REPORT_BUFFER,X
BEQ PUT_KEY_IN_BUFFER_POSITION
INX
TXA
CMP #8H
BNE FIND_FREE_BUFFER_POSITION
BUFFER_FULL_ERR:
PLA
JMP NON_MODIFIERS_DONE
PUT_KEY_IN_BUFFER_POSITION:
PLA
STA USB_REPORT_BUFFER,X
NON_MODIFIERS_DONE:
PLX
DONE_PUTKEY:
RTS
;=====================================================================
FN_NOT_PRESS_TABLE:
DB AT101KB_F2,AT101KB_F3,AT101KB_F4,AT101KB_F5
DB AT101KB_F6,AT101KB_F8,AT101KB_F9,AT101KB_F10
DB AT101KB_F11,AT101KB_F12,AT101KB_PRINTSCREEN,AT101KB_SCROLL_LOCK,AT101KB_PAUSE
FN_PRESSED_TABLE:
DB ATOFFICEKBD_K21,ATOFFICEKBD_K22,ATOFFICEKBD_K23,ATOFFICEKBD_K24
DB ATOFFICEKBD_K25,ATOFFICEKBD_K27,ATOFFICEKBD_K28,ATOFFICEKBD_K29
DB ATOFFICEKBD_K30,ATOFFICEKBD_K31,ATOFFICEKBD_K32,ATOFFICEKBD_K33,ATOFFICEKBD_K34
FN_KEY_PROCESS:
PHA
PHX
LDX #00H
FIND_FN_PROCESS_KEY:
LDA FN_NOT_PRESS_TABLE,X
CMP TEMP_R
BEQ IS_FN_KEY_TABLE
INX
CPX #FN_PRESSED_TABLE-FN_NOT_PRESS_TABLE
BNE FIND_FN_PROCESS_KEY
JMP EXIT_FN_KEY
IS_FN_KEY_TABLE:
LDA FN_PRESSED_TABLE,X
STA TEMP_R
EXIT_FN_KEY:
PLX
PLA
LDA TEMP_R
RTS
;======================================================================
MOD_KEY_TABLE:
DB AT101KB_LEFTCTRL, AT101KB_LEFTSHIFT
DB AT101KB_LEFTALT, AT101KB_LEFTGUI
DB AT101KB_RIGHTCTRL, AT101KB_RIGHTSHIFT
DB AT101KB_RIGHTALT, AT101KB_RIGHTGUI
; DB AT101KB_APPLICATION
MOD_BIT_TABLE:
DB LEFT_CTRL_BIT, LEFT_SHIFT_BIT
DB LEFT_ALT_BIT, LEFT_GUI_BIT
DB RIGHT_CTRL_BIT, RIGHT_SHIFT_BIT
DB RIGHT_ALT_BIT, RIGHT_GUI_BIT
; DB APP_BIT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;currently we are not counting the application key as a modifer key.
;so there are only 8 modifiers.
NUM_MODIFIERS EQU 8
KSC_MODIFIER:
PHX
PHA
MOD_LP0:
STA KSC_WORK
LDX #0
MOD_LP1:
LDA MOD_KEY_TABLE,X
CMP KSC_WORK
BEQ MOD_LP2
INX
CPX #NUM_MODIFIERS
BEQ NON_MODIFIER
JMP MOD_LP1
MOD_LP2:
LDA MOD_BIT_TABLE,X
LDX KSC_DOWN_UP
CPX #00H
BEQ MOD0_UP
ORA USB_REPORT_BUFFER
STA USB_REPORT_BUFFER
JMP MOD_DONE_PUTKEY
MOD0_UP:
EOR #FFH
AND USB_REPORT_BUFFER
STA USB_REPORT_BUFFER
MOD_DONE_PUTKEY:
SEC
EXITMODIFIER:
PLA
PLX
RTS
NON_MODIFIER:
CLC
JMP EXITMODIFIER
;================================================================================
;========================================================================
;tables for alternate keys
;lookup table for special keys. The keys in this table
;are treated differently.
ALT_KEY_TABLE:
;1
db AT101KB_SLEEP, AT101KB_POWER, AT101KB_WAKE
;2
db AT101KB_MUTE, AT101KB_VOL_INC,AT101KB_VOL_DEC,AT101KB_PLAY_PAUSE
db AT101KB_STOP, AT101KB_SCAN_PREV,AT101KB_SCAN_NEXT,AT101KB_EMAIL
;3
db AT101KB_CALCULATOR,AT101KB_WWW_SEARCH,AT101KB_WWW_HOME,AT101KB_WWW_FAVORITES
db AT101KB_MYCOMPUTER,AT101KB_WWW_BACK,AT101KB_WWW_FORWARD,AT101KB_WWW_STOP
;4
db AT101KB_WWW_REFRESH,AT101KB_MEDIA_SELECT,ATOFFICEKBD_K9,ATOFFICEKBD_K10
DB ATOFFICEKBD_K11,ATOFFICEKBD_K12,ATOFFICEKBD_K13,ATOFFICEKBD_K14
;5
DB ATOFFICEKBD_K15,ATOFFICEKBD_K16,ATOFFICEKBD_K17,ATOFFICEKBD_K18
DB ATOFFICEKBD_K19,ATOFFICEKBD_K21,ATOFFICEKBD_K22,ATOFFICEKBD_K23
;6
DB ATOFFICEKBD_K24,ATOFFICEKBD_K25,ATOFFICEKBD_K27,ATOFFICEKBD_K28
DB ATOFFICEKBD_K29,ATOFFICEKBD_K30,ATOFFICEKBD_K31,ATOFFICEKBD_K32
;each key above is represented in a report as a single bit -- 1 == pressed.
;this table contains the masks for the bits representing each key
BIT_MASK_TABLE:
db 1,2,4,
db 1,2,4,8
db 10h,20h,40h,80h
db 1,2,4,8
db 10h,20h,40h,80h
db 1,2,4,8
db 10h,20h,40h,80h
db 1,2,4,8
db 10h,20h,40h,80h
db 1,2,4,8
db 10h,20h,40h,80h
;each key's bit mask must be applied to the data byte corresponding to it.
;this table points to the data byte's position in RAM.
POINT_TABLE:
DB 0,0,0
DB 1,1,1,1
DB 1,1,1,1
DB 2,2,2,2
DB 2,2,2,2
DB 3,3,3,3
DB 3,3,3,3
DB 4,4,4,4
DB 4,4,4,4
DB 5,5,5,5
DB 5,5,5,5
REPORT_ID_TABLE:
DB 2,2,2
DB 3,3,3,3
DB 3,3,3,3
DB 4,4,4,4
DB 4,4,4,4
DB 5,5,5,5
DB 5,5,5,5
DB 6,6,6,6
DB 6,6,6,6
DB 7,7,7,7
DB 7,7,7,7
NUM_POWER_KEYS: equ 3
NUM_CONSUMER_KEYS: equ 12
NUM_ALT_KEYS: equ 43
;============================================================================
USB_ALTERNATE_KEY:
PHX
STA KSC_WORK
LDX #00H
ALT_LP1:
LDA ALT_KEY_TABLE,X
CMP KSC_WORK
BEQ ALT_LP2
INX
CPX #NUM_ALT_KEYS
BNE ALT_LP1
CLC
JMP ALT_EXIT
ALT_LP2:
LDA REPORT_ID_TABLE,X
STA USB_REPORT_ID
LDA #FFH
STA USB_TX_FLAGS
LDA POINT_TABLE,X
TAY
LDA BIT_MASK_TABLE,X
PHA
LDA KSC_DOWN_UP
CMP #00H
BEQ ALT_MOD0_UP
TYA
TAX
PLA
STA usb_mm_keys
JMP ALT_DONE_PUTKEY
ALT_MOD0_UP:
TYA
TAX
PLA
EOR #FFH
AND usb_mm_keys
STA usb_mm_keys
ALT_DONE_PUTKEY:
SEC
ALT_EXIT:
PLX
LDA KSC_WORK
RTS
;
;========================================================================
; FILE: matrix.asm
;
; This file contains the lookup to convert the codes generated
; by scanning the key-matrix, into at101/102 key keyboard values.
; this file needs to change if the key matrix changes or if keys
; are added to the current matrix.
;
;
;========================================================================
;========================================================================
; FILE: KEYBOARDINC.inc
;
; contains the defines for the keys on a 101/102 key keyboard.
;
; The definitions are standard with the addition of the following
; codes:
;
; AT101KB_POWER: EQU 130
; AT101KB_SLEEP: EQU 131
; AT101KB_WAKE: EQU 132
;
; in addition, code 135 is currently used to represent
; the CTRL-ALT scan code in scan sets 1 and 2. This can be moved
; to another location (above 135) if new keys are added that need
; the 135 placement.
;
;
;========================================================================
AT101_TBL:
;1
db AT101KB_PAUSE,AT101KB_RESERVED,AT101KB_RESERVED,AT101KB_RESERVED
db AT101KB_RIGHTCTRL,AT101KB_RESERVED,AT101KB_LEFTCTRL,AT101KB_F5
;2
db AT101KB_Q,AT101KB_TAB,AT101KB_A,AT101KB_ESCAPE
db AT101KB_Z,AT101KB_JPN_131,AT101KB_TILDE,AT101KB_01
;3
db AT101KB_W,AT101KB_CAPSLOCK,AT101KB_S,AT101KB_EUROPE2_K45
db AT101KB_X,AT101KB_JPN_132,AT101KB_F1,AT101KB_02
;4
db AT101KB_E,AT101KB_F3,AT101KB_D,AT101KB_F4
db AT101KB_C,AT101KB_JPN_133,AT101KB_F2,AT101KB_03
;5
db AT101KB_R,AT101KB_T,AT101KB_F,AT101KB_G
db AT101KB_V,AT101KB_B,AT101KB_05,AT101KB_04
;6
db AT101KB_U,AT101KB_Y,AT101KB_J,AT101KB_H
db AT101KB_M,AT101KB_N,AT101KB_06,AT101KB_07
;7
db AT101KB_I,AT101KB_RIGHTBRACKET,AT101KB_K,AT101KB_F6
db AT101KB_LEFTANGLE,AT101KB_BRAZILIAN,AT101KB_EQUAL,AT101KB_08
;8
db AT101KB_O,AT101KB_F7,AT101KB_L,AT101KB_RESERVED
db AT101KB_RIGHTANGLE,AT101KB_APPLICATION,AT101KB_F8,AT101KB_09
;9
db AT101KB_P,AT101KB_LEFTBRACKET,AT101KB_SEMICOLON,AT101KB_DOUBLEQUOTE
db AT101KB_EUROPE1_K42,AT101KB_QUESTION,AT101KB_UNDERSCORE,AT101KB_00
;10
db AT101KB_SCROLL_LOCK,ATOFFICEKBD_K6,AT101KB_SCAN_NEXT,AT101KB_LEFTALT
db AT101KB_WWW_SEARCH,AT101KB_RIGHTALT,AT101KB_SCAN_PREV,AT101KB_PRINTSCREEN
;;11
db AT101KB_K14,AT101KB_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -