📄 offickbd.asm
字号:
STA KSC_P3OUT
PLA
RTS
;============================================================
;write the columns with the next pattern in the keyboard scan
;
;============================================================
KSC_NEXTPATTERN:
PHA
SEC
LDA KSC_P0OUT
ROLA
STA KSC_P0OUT
STA PORT0
LDA KSC_P1OUT
ROLA
STA KSC_P1OUT
STA PORT1
LDA KSC_P3OUT
ROLA
STA KSC_P3OUT
STA PORT3
PLA
RTS
;============================================================
;A column had one or more button that changed state (up to
;down or down to up),scan the rows to find out which one(S)
;changed.
;============================================================
;*******************KSC_KEYCHANGED(X)////X-->Column number*******************
;****************************************************************************
KSC_KEYCHANGED:
PHA
STZ KSC_Y_INDEX
LDA KSC_CHANGES
JSR REPEAT_KEY_CHECK
ONLY_ONE_KEY:
LDA #1H
CLC
ROW_LOOP:
PHA
AND KSC_CHANGES
BEQ NEXT_ROW
JSR KSC_FOUNDKEY
NEXT_ROW:
INC KSC_Y_INDEX
PLA
CLC
ROLA
BCC ROW_LOOP
DONE_KEYCHANGED:
PLA
RTS
POSITION_1_TABLE:
DB 1,2,4,8,10H,20H,40H,80H
;=============================================================
REPEAT_KEY_CHECK:
PHA
PHX
LDX #00H
ROW_LOOP_REPEAT:
LDA POSITION_1_TABLE,X
INX
AND KSC_CHANGES
BEQ ROW_LOOP_REPEAT
STA KSC_CHANGES
PLX
PLA
RTS
;=============================================================
;We have a key identified by an ksc_x_index and a ksc_y_index
;combine the two into a single index and lookup the keycode,
;check if up or down change.
;=============================================================
;*****KSC_FOUNDKEY(A,X,KSC_Y_INDEX)/A-->SCANCODEposition,||X-->COLUMN NUMBER
;*************KSC_Y_INDEX--->ROW NUMBER*****************************
;*************KSC_X_INDEX--->COLUMN COUNTE**************************
;*******************************************************************
KSC_FOUNDKEY:
STX KSC_MATRIX_ADDR
PHA
AND KSC_IMAGE,X ;see whether up or down change
;key up
BNE CALC_MATRIX
LDA #0FFH
JMP KEYDOWNHAPPEN ;key down
CALC_MATRIX:
LDA #00H ;;==0 key up
KEYDOWNHAPPEN:
STA KSC_DOWN_UP
LDX KSC_MATRIX_ADDR
LDA KSC_X_INDEX ;COLUMN*8
ASLA
ASLA
ASLA
CLC
ADC KSC_Y_INDEX ;Sure key position
STA KSC_MATRIX_ADDR ;Store key position
CMP #00H
BNE NON0ADDR
LDA #FEH
NON0ADDR:
JSR KSC_DEBOUNCE_TEST ;Check if debounce in progress on this key
BNE UPDATE_IMAGE
JMP DONE_FOUNDKEY
UPDATE_IMAGE:
PLA
PHA
EOR KSC_IMAGE,X
STA KSC_IMAGE,X ;Update key switch ksc_image
JSR KSC_DEBOUNCE_KEYS ;push matrix address on debounce array
LDA KSC_MATRIX_ADDR
TAX
LDA AT101_TBL,X
;;#######################################################
;;CHECK KEYVALUE'S FUNCTION PROCESS KEY FUNCTION
STA TEMP_R
LDA MARK_FLAGS
CMP #FFH
BNE NON_MARK_KEY
LDA KSC_DOWN_UP
CMP #FFH
BEQ KEY_DOWN_NON_UP
STZ MARK_FLAGS
JMP EXIT_SEND_0
KEY_DOWN_NON_UP:
JMP EXIT_SEND_01
NON_MARK_KEY:
LDA TEMP_R
CMP #ATOFFICEKBD_FN
BNE NON_FN_KEY_CHANGE ;IF KEY IS FN DOWN,SET FN_KEY_FLAGS=#FFH
LDA KSC_DOWN_UP
CMP #FFH
BNE FN_KEY_UP
LDA #FFH
STA FN_KEY_FLAGS
JMP FN_KEY_FLAG_SET_OVER
FN_KEY_UP:
STZ FN_KEY_FLAGS ;IF FN UP,CLEAR FN_KEY_FLAGS=0
FN_KEY_FLAG_SET_OVER:
JMP DONE_FOUNDKEY
NON_FN_KEY_CHANGE:
LDA FN_KEY_FLAGS
CMP #FFH
BNE FN_KEY_NOT_PRESS
LDA TEMP_R
CMP #AT101KB_ESCAPE
BNE NOT_FN_ESC_KEY
LDA KSC_DOWN_UP
CMP #FFH
BNE NOT_FN_ESC_KEY
LDA MM_LED_FLAGS ;;PROCESS FN+ESC KEY PRESSED: NO SEND CODE MEDIU LED LAMP
EOR #FFH
STA MM_LED_FLAGS
CMP #FFH
BNE MMLED_OVER
RMB3 LED
JMP DONE_FOUNDKEY
MMLED_OVER:
SMB3 LED ;MM_LED
JMP DONE_FOUNDKEY
NOT_FN_ESC_KEY:
CMP #ATOFFICEKBD_FN_SLEEP ;;FN+SLEEP
BNE FN_WAKE_KEY
LDA #AT101KB_SLEEP
STA TEMP_R
JMP FN_KEY_NOT_PRESS
FN_WAKE_KEY:
CMP #ATOFFICEKBD_FN_WAKE ;;FN+WAKE
BNE FN_PORWER_KEY
LDA #AT101KB_WAKE
STA TEMP_R
JMP FN_KEY_NOT_PRESS
FN_PORWER_KEY:
CMP #ATOFFICEKBD_FN_POWER ;;FN+POWER
BNE FN_KEY_NOT_PRESS
LDA #AT101KB_POWER
STA TEMP_R
FN_KEY_NOT_PRESS:
LDA TEMP_R
CMP #ATOFFICEKBD_FN_SLEEP
BEQ NOT_PROCESS_POWER
CMP #ATOFFICEKBD_FN_WAKE
BEQ NOT_PROCESS_POWER
CMP #ATOFFICEKBD_FN_POWER
BEQ NOT_PROCESS_POWER
JMP OTHERKEY_PROCESS
NOT_PROCESS_POWER:
JMP DONE_FOUNDKEY
OTHERKEY_PROCESS:
LDA TEMP_R ;;APP + ESC KEY CHECK
CMP #AT101KB_APPLICATION
BNE NOT_APP_KEY
LDA APP_PRESS_FLAGS
EOR #FFH
STA APP_PRESS_FLAGS
LDA KSC_DOWN_UP
CMP #FFH
BNE APP_UP_STATE
;SMB0 APP_ESC_STATE
;RMB1 APP_ESC_STATE
JMP NOT_APP_KEY
APP_UP_STATE:
BBR4 APP_ESC_STATE,NOT_APP_KEY
SMB1 APP_ESC_STATE
RMB0 APP_ESC_STATE
NOT_APP_KEY:
LDA APP_PRESS_FLAGS
CMP #FFH
BNE APP_KEY_NOT_PRESS
LDA TEMP_R ;;AFTER APP KEY PRESS PROCESS
CMP #AT101KB_ESCAPE
BNE APP_KEY_NOT_PRESS
LDA KSC_DOWN_UP
CMP #FFH
BNE ESC_KEY_UP
LDA MM_LED_FLAGS ;PROCESS APP+ESC KEY PRESSED:
;NO SEND CODE MEDIU LED LAMP
EOR #FFH
STA MM_LED_FLAGS ;;MM_LED
CMP #FFH
BNE MMLED_APP_OVER
RMB3 LED
JMP OK_MMLED_LAMP
MMLED_APP_OVER:
SMB3 LED
OK_MMLED_LAMP:
SMB4 APP_ESC_STATE
JMP DONE_FOUNDKEY
ESC_KEY_UP:
SMB3 APP_ESC_STATE
RMB2 APP_ESC_STATE
JMP DONE_FOUNDKEY
APP_KEY_NOT_PRESS:
LDA TEMP_R
CMP #AT101KB_ESCAPE
BNE NON_ESC_KEY
LDA KSC_DOWN_UP
CMP #FFH
BEQ NON_ESC_KEY
BBR4 APP_ESC_STATE,NON_ESC_KEY
SMB3 APP_ESC_STATE
RMB2 APP_ESC_STATE
NON_ESC_KEY:
LDA MM_LED_FLAGS
CMP #FFH
BNE NON_MMKEY
LDA TEMP_R
JSR FN_KEY_PROCESS
NON_MMKEY:
;;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
LDA TEMP_R
LDX #0
COMBIN_KEY: ;;find combination key
CMP COMBINATION_KEY,X
BEQ FIND_COMBIN_KEY
INX
CPX #END_COMBINATION_KEY-COMBINATION_KEY
BNE COMBIN_KEY
JMP NON_COMBIN_KEY
FIND_COMBIN_KEY:
CMP #AT101KB_ESCAPE
BEQ NON_COMBIN_KEY
PHA
CMP #ATOFFICEKBD_K3
BNE SET_TIMER_CONST_16MS
LDA #25
STA TIMER_CONST
JMP TIMER_CONST_100MS_OVER
SET_TIMER_CONST_16MS:
LDA #4
STA TIMER_CONST
TIMER_CONST_100MS_OVER:
LDA KSC_DOWN_UP
CMP #FFH
BNE SEND_0_COMBBUFFER
LDA COMBINATION_PARAM,X
STA COMB_PARAM
LDA COMBINATION_SPACE,X
STA COMB_POINT
;PROCESS COMBINATION KEY
PLA
CMP #ATOFFICEKBD_K8
BNE NON_K8_KEY
BBR1 LED_REG,NON_K8_KEY
CLC
LDA COMB_PARAM
ADC #3
STA COMB_PARAM
LDA COMB_POINT
CLC
SBC #16
LDA #168
STA COMB_POINT
;LDA #20
;STA TIMER_CONST
NON_K8_KEY:
JMP DONE_FOUNDKEY
SEND_0_COMBBUFFER:
PLA
LDA TEMP_R
CMP #ATOFFICEKBD_K7
BNE EXIT_SEND_0
LDA KSC_DOWN_UP
CMP #FFH
BNE EXIT_SEND_01
LDA #FFH
STA MARK_FLAGS
JMP EXIT_SEND_01
EXIT_SEND_0:
LDA #4
STA TIMER_CONST
LDA #K00-COMBINATION_INDEX
STA COMB_POINT
LDA #1
STA COMB_PARAM
EXIT_SEND_01:
JMP DONE_FOUNDKEY
NON_COMBIN_KEY:
BBR4 APP_ESC_STATE,NON_APP_ESC_DOWN
BBR3 APP_ESC_STATE,NON_APP_ESC_DOWN
BBR1 APP_ESC_STATE,NON_APP_ESC_DOWN
LDA #4
STA TIMER_CONST
LDA #2
STA COMB_PARAM
STZ COMB_POINT
STZ APP_ESC_STATE
LDA #4
STA TIMER_COUNT
;JMP DONE_FOUNDKEY
NON_APP_ESC_DOWN:
LDA TEMP_R ;;PROCESS STANDARD KEY
JSR USBKEY_PUTKEY
DONE_FOUNDKEY:
PLA
RTS
COMBINATION_KEY:
DB AT101KB_ESCAPE
DB ATOFFICEKBD_K1,ATOFFICEKBD_K2,ATOFFICEKBD_K3,ATOFFICEKBD_K4
DB ATOFFICEKBD_K5,ATOFFICEKBD_K6,ATOFFICEKBD_K33,ATOFFICEKBD_K34
DB ATOFFICEKBD_K7,ATOFFICEKBD_K8
END_COMBINATION_KEY:
COMBINATION_INDEX:
DB 00,00,29H,00,00,00,00,00 ;;ESCAPE
DB 00,00,00,00,00,00,00,00
DB 04,00,00,00,00,00,00,00 ;K1
DB 04,00,2BH,00,00,00,00,00
DB 04,00,00,00,00,00,00,00 ;K2
DB 04,00,3DH,00,00,00,00,00
DB 08,00,00,00,00,00,00,00 ;K3
DB 00,00,00,00,00,00,00,00
DB 00,00,0FH,00,00,00,00,00
DB 00,00,00,00,00,00,00,00
DB 02,00,00,00,00,00,00,00 ;K4
DB 02,00,4CH,00,00,00,00,00
DB 02,00,00,00,00,00,00,00 ;K5
DB 02,00,49H,00,00,00,00,00
DB 01,00,00,00,00,00,00,00 ;K6
DB 01,00,49H,00,00,00,00,00
DB 00,00,28H,00,00,00,00,00 ;K33
DB 04,00,28H,00,00,00,00,00
DB 04,00,00,00,00,00,00,00 ;K34
DB 04,00,2AH,00,00,00,00,00
DB 02,00,00,00,00,00,00,00 ;K7
DB 00,00,53H,00,00,00,00,00
DB 00,00,00,00,00,00,00,00
DB 04,00,00,00,00,00,00,00 ;EUROPE
DB 04,00,59H,00,00,00,00,00
DB 04,00,00,00,00,00,00,00
DB 04,00,5AH,00,00,00,00,00
DB 04,00,00,00,00,00,00,00
DB 04,00,60H,00,00,00,00,00
DB 00,00,53H,00,00,00,00,00
K00:
DB 00,00,00,00,00,00,00,00 ;K0
DB 00,00,00,00,00,00,00,00
DB 00,00,00,00,00,00,00,00
COMBINATION_PARAM:
DB 2
db 2,2,4,2
db 2,2,2,2
db 1,6
COMBINATION_SPACE:
DB 0
DB 16,32,48,80
DB 96,112,128,144
DB 160,184
;;===========================================================================
COMBINPROCESS:
PHA
PHX
LDA TIMER_COUNT
CMP #00
BNE NO_DATA_TRANS
LDA COMB_PARAM
CMP #00H
BEQ NO_DATA_TRANS
LDA COMB_POINT
TAX
LDY #00H
STZ TXCNT1
COPY_DATA_TO_USBBUFFER:
LDA COMBINATION_INDEX,X
STA TXDAT1
INX
INY
CPY #8
BNE COPY_DATA_TO_USBBUFFER
JSR OUT_EP1_DATA
STX COMB_POINT
DEC COMB_PARAM
LDA TIMER_CONST
STA TIMER_COUNT
NO_DATA_TRANS:
PLX
PLA
RTS
;;==============================
;=============================================================
;quick and dirty routine to count the number of 1's in a byte
;the table below gives the number of 1's in the nibble from
;0--15
;=============================================================
ONES_TABLE:
DB 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4
COUNT_ONES:
PHX
PHA
AND #0FH
TAX
LDA ONES_TABLE,X
STA KSC_WORK
PLA
LSRA
LSRA
LSRA
LSRA
AND #0FH
TAX
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -