📄 offickbd.asm
字号:
DB <SET_REPORT ;;9
DB <SET_IDLE ;;10
DB <SET_PROTOCOL ;;11
CLASS_REQ_TABLE_END:
CLASS_REQ_TABLE1:
DB >NO_SUPPORT_REQ ;;
DB >GET_REPORT ;;1
DB >GET_IDLE ;;2
DB >GET_PROTOCOL ;;3
DB >NO_SUPPORT_REQ ;;
DB >NO_SUPPORT_REQ ;;
DB >NO_SUPPORT_REQ ;;
DB >NO_SUPPORT_REQ ;;
DB >NO_SUPPORT_REQ ;;
DB >SET_REPORT ;;9
DB >SET_IDLE ;;10
DB >SET_PROTOCOL ;;11
DEVICE_CLASS_REQUEST: ;;command is class command
LDA bReq
CMP #CLASS_REQ_TABLE_END-CLASS_REQ_TABLE_START
BCC $+4
LDA #0
;$+4:
TAX
ORA #10H ;;class command
STA REQUEST_BUF
LDA CLASS_REQ_TABLE,X
STA TABLE_ADDR0
LDA CLASS_REQ_TABLE1,X
STA TABLE_ADDR1
JMP (TABLE_ADDR)
;---------------------------------------
GET_REPORT:
LDA wIndex
BEQ Interface0
CMP #01 ;;interface 1
BEQ Interface1
BRA NO_SUPPORT_REQ
Interface0:
LDX #8
BRA AA
Interface1:
LDX #4
AA:
STZ TXDAT0
DEX
BNE AA
BRA VALIDATE_BUFFER
;---------------------------------------
GET_IDLE:
LDA wIndex
Get_Interface0_Idle:
CMP #0
BNE Get_Interface1_Idle
LDA EP1_IDLE_RATE ;;EP1 idle rate
STA TXDAT0
JMP VALIDATE_BUFFER ;;validated buffer
Get_Interface1_Idle:
CMP #1
BEQ $+5
JMP NO_SUPPORT_REQ
;$+5:
LDA EP2_IDLE_RATE ;;EP2 idle rate
STA TXDAT0
JMP VALIDATE_BUFFER ;;validated buffer
;---------------------------------------
GET_PROTOCOL:
LDA wIndex
Get_Interface0_Protocol:
CMP #0
BNE Get_Interface1_Protocol
LDA PROTOCOL0
STA TXDAT0
JMP VALIDATE_BUFFER
Get_Interface1_Protocol:
CMP #1
BEQ $+5
JMP NO_SUPPORT_REQ
;$-5:
LDA PROTOCOL1
STA TXDAT0
JMP VALIDATE_BUFFER
;---------------------------------------
SET_REPORT:
End_SET_Report:
RTS
;---------------------------------------
SET_IDLE:
LDA wIndex
Set_Interface0_Idle:
CMP #0
BNE Set_Interface1_Idle
LDA wValue+1
STA EP1_IDLE_RATE
STZ EP1_IDLE_TIME
JMP VALIDATE_BUFFER ;;validated buffer
Set_Interface1_Idle:
CMP #1
BEQ $+5
JMP NO_SUPPORT_REQ
;$+5:
LDA wValue+1
STA EP2_IDLE_RATE
STZ EP2_IDLE_TIME
JMP VALIDATE_BUFFER ;;validated buffer
;---------------------------------------
SET_PROTOCOL:
LDA wIndex
Set_Interface0_Protocol:
CMP #0
BNE Set_Interface1_Protocol
LDA wValue
STA PROTOCOL0
JMP VALIDATE_BUFFER
Set_Interface1_Protocol:
CMP #1
BEQ $+5
JMP NO_SUPPORT_REQ
;$-5:
LDA wValue
STA PROTOCOL1
JMP VALIDATE_BUFFER
;;----------------------------------------------------------------------------
ENDPOINT0_IN: ;;ENDPOINT0 in
BBS0 TXFLG0,END_EP0_TOKEN
SMB0 IRQCLRU
LDA bReq
CMP #REQ_SET_ADDRESS
BEQ USB_SET_ADDRESS
CMP #REQ_GET_DESCRIP
BNE END_EP0_TOKEN
STZ TXCNT0 ;;clear count register
JMP SEND_DESCRIPTOR1
USB_SET_ADDRESS:
LDA DEV_ADR
STA DA
STZ bReq ;;end data transmit
END_EP0_TOKEN:
RTS
;---------------------------------------
END_EP0_TOKEN1:
STZ RXFLG0 ;;clear full flag
RTS
ENDPOINT0_OUT: ;;ENDPOINT0 out
LDA REQUEST_BUF
CMP #REQ_SET_REPORT
BNE END_EP0_TOKEN1 ;;only SET_REPORT is valid,other ack only
LDY RXCNT0 ;;count register
LDX #0
EP0_OUT1:
LDA RXDAT0
STA BUFFER,X
INX
DEY
BNE EP0_OUT1
LDA BUFFER ;;?change LED
CLC ;;?
BBR2 BUFFER,$+4 ;;?
SEC ;;?
;$+4: ;;?
ROL A ;;?
AND #00000111B ;;?
EOR #00000111B ;;?
STA LED ;;?
STA LED_REG ;;?
LDA MM_LED_FLAGS ;;MM_LED
CMP #FFH
BNE MMLED_APP_OVER1
RMB3 LED
JMP OK_MMLED_LAMP1
MMLED_APP_OVER1:
SMB3 LED
OK_MMLED_LAMP1:
STZ REQUEST_BUF
STZ RXFLG0 ;;clear full flag
JMP VALIDATE_BUFFER
;---------------------------------------
ENDPOINT1_IN: ;;ENDPOINT1 in
BBS0 TXFLG1,EP1_IN_RET
SMB2 IRQCLRU
BRA EP1_IN_RET
OUT_EP1_DATA:
STZ EP1_IDLE_TIME ;;clear idle time
LDA TXFLG1
ORA #00000001B
EOR #00000100B ;;validated buffer
STA TXFLG1
EP1_IN_RET:
RTS
;---------------------------------------
ENDPOINT2_IN: ;;ENDPOINT2 in
BBS0 TXFLG2,EP2_IN_RET
SMB3 IRQCLRU
BRA EP2_IN_RET
BBR6 DEV_STATUS,EP2_IN_RET ;;device be configured
;STZ TXCNT2 ;;clear count register
;STZ TXDAT2 ;;?
;STZ TXDAT2 ;;?
;STZ TXDAT2 ;;?
;STZ TXDAT2 ;;?
OUT_EP2_DATA:
STZ EP2_IDLE_TIME ;;clear idle time
LDA TXFLG2
ORA #00000001B
EOR #00000100B ;;validated buffer
STA TXFLG2
EP2_IN_RET:
RTS
;;----------------------------------------------------------------------------
Given_Time:
LDA EP1_IDLE_RATE ;;?idle rate = 0
BEQ End_EP1_Given_time ;;?
LDA EP1_IDLE_TIME ;;?idle rate > 0
CMP EP1_IDLE_RATE ;;?
BCC End_EP1_Given_time ;;?
STZ EP1_IDLE_TIME ;;?
BBS0 TXFLG1,End_EP1_Given_time;;
SMB2 IRQCLRU ;;?
STZ TXCNT1 ;;clear count register
STZ TXDAT1 ;;?
STZ TXDAT1 ;;?
STZ TXDAT1 ;;?
STZ TXDAT1 ;;?
STZ TXDAT1 ;;?
STZ TXDAT1 ;;?
STZ TXDAT1 ;;?
STZ TXDAT1 ;;?
JSR OUT_EP1_DATA ;;?
End_EP1_Given_time:
LDA EP2_IDLE_RATE ;;?idle rate = 0
BEQ End_EP2_Given_time ;;?
LDA EP2_IDLE_TIME ;;?idle rate > 0
CMP EP2_IDLE_RATE ;;?
BCC End_EP2_Given_time ;;?
STZ EP2_IDLE_TIME ;;?
BBS0 TXFLG2,End_EP2_Given_time;;
SMB3 IRQCLRU ;;?
STZ TXCNT2 ;;clear count register
STZ TXDAT2 ;;?
STZ TXDAT2 ;;?
STZ TXDAT2 ;;?
STZ TXDAT2 ;;?
JSR OUT_EP2_DATA ;;?
End_EP2_Given_time:
RTS
;;----------------------------------------------------------------------------
Delay_500ms: ;;delay 500ms
LDX #40
Decrease_X:
TXA
PHA
JSR Delay
PLA
TAX
DEX
BNE Decrease_X
RTS
;-----------------------------------------------------------------------------
Delay: ;;delay 12.5ms
LDX #28
Delay_loop2:
LDY #0
Delay_loop1:
DEY
BNE Delay_loop1
LDA #01010101B
STA CLRWDT
DEX
BNE Delay_loop2
RTS
;-----------------------------------------------------------------------------
Delay_5ms: ;;delay 5ms
TXA
PHA
LDX #50
Decrease_X_ms:
JSR Delay_100us
DEX
BNE Decrease_X_ms
PLA
TAX
RTS
;-----------------------------------------------------------------------------
Delay_100us: ;;delay 100us
TXA
PHA
LDX #52
;-----------------------------------------------------------------------------
Decrease_X_us:
DEX
BNE Decrease_X_us
PLA
TAX
RTS
;;---------------------------------------------------------------------------
Delay_10us: ;;delay 100us
PHA
TXA
PHA
LDX #5
;-----------------------------------------------------------------------------
Decrease_X_us5:
DEX
BNE Decrease_X_us5
PLA
TAX
PLA
RTS
NMI_vector:
RTI
;----------------------------------------------------------------------------
IRQ_vector: ;;IRQ start location
BBR6 TCON,Normal_IRQ_vector
; JMP Test_Mode_IRQ_vector
Normal_IRQ_vector:
PHA
TXA
PHA
INT0_Int:
BBR1 IRQFUNC,INT1_Int
SMB1 IRQCLRF ;;clear INT0 interrupt flag
BBR1 IE_FUNC,INT1_Int
BRA End_IRQ_vector
;---------------------------------------
INT1_Int:
BBR2 IRQFUNC,TMR_Int
SMB2 IRQCLRF ;;clear INT1 interrupt flag
BBR2 IE_FUNC,TMR_Int
BRA End_IRQ_vector
;---------------------------------------
TMR_Int:
BBR0 IRQFUNC,KBD_Int
SMB0 IRQCLRF ;;clear TMR interrupt flag
LDA #01010101B ;;?clear watch dog
STA CLRWDT ;;?
End_IRQ_vector:
PLA
TAX
PLA
RTI
;---------------------------------------
KBD_Int:
BBR3 IRQFUNC,P2_Int
SMB3 IRQCLRF ;;clear KBD interrupt flag
INC EP1_IDLE_TIME
INC EP2_IDLE_TIME
JSR KeyScan
LDA TIMER_COUNT
CMP #00H
BEQ NON_SUB_0
DEC TIMER_COUNT
NON_SUB_0:
BRA End_IRQ_vector
;---------------------------------------
P2_Int:
BBR4 IRQFUNC,End_IRQ_vector
SMB4 IRQCLRF ;;clear PORT2 interrupt flag
BRA End_IRQ_vector
;---------------------------------------
;=================================================================================
;This is the main entry point for the start of key scanning
;=================================================================================
KeyScan:
JSR KSC_DEBOUNCE_TASK ;task for debounce处理弹跳任务
STZ KSC_PHANTOM ;init phantom key flag to false
STZ KSC_COL_HITS ;
STZ KSC_ROW_HITS
STZ KSC_CHANGES
STZ KSC_KEY_COUNT
STZ KSC_X_INDEX
LDA #FFH
STA PORT2
LDX #0 ;18 column总共18行
JSR KSC_STARTSCAN ;write init scan pattern
COLUMN_LOOP: ;scan key and process key
LDA PORT2
EOR #FFH ;~A
STA KSC_MOD1 ;save port2 data to tempram
BEQ NOKEYDOWN
PHA
JSR COUNT_ONES ;计算这行共有几个1
CLC
ADC KSC_KEY_COUNT ;计算按键中总共有几个1
STA KSC_KEY_COUNT
PLA
ORA KSC_ROW_HITS ;
STA KSC_ROW_HITS ;save keycode
INC KSC_COL_HITS ;and count of columns with a key down
NOKEYDOWN:
LDA KSC_CHANGES
CMP #00H
BNE KEY_HAS_CHANGED
LDA KSC_IMAGE,X
EOR KSC_MOD1
STA KSC_CHANGES
CMP #00H
BNE KEY_HAS_CHANGED
INC KSC_X_INDEX
KEY_HAS_CHANGED:
JSR KSC_NEXTPATTERN
INX
CPX #21
BNE COLUMN_LOOP
LDA KSC_CHANGES
CMP #00H
BEQ EXIT1
JSR CHECK_PHANTOM
BCC EXIT12
LDX KSC_X_INDEX
JSR KSC_KEYCHANGED ;;KSC_KEYCHANGED(X)////X-->LAST KEY COLUMN NUMBER
SEC
JMP EXIT1
EXIT12:
LDA #AAH ;;ERROR CODE
STA USB_TX_FLAGS
EXIT1:
RTS
;=======================================================
;INITIALIZE ALL COLUMN TO BEGIN A KEYBOARD SCAN
; 0 IN C[0]
; 1 IN C[17:1]
;=======================================================
KSC_STARTSCAN:
PHA
LDA #0FEH
STA PORT0
STA KSC_P0OUT
LDA #0FFH
STA PORT1
STA KSC_P1OUT
LDA #0FFH
STA PORT3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -