📄 offickbd.asm
字号:
LDY RXCNT0 ;;count register
LDX #0
READ_FIFO:
LDA RXDAT0 ;;?read data from FIFO
STA BUFFER,X ;;?
INX ;;?
DEY ;;?
BNE READ_FIFO ;;?
STZ RXFLG0 ;;clear full flag
STZ TXFLG0
STZ TXCNT0 ;;clear count register
LDA bmReq
AND #01100000B
BEQ DEVICE_STANDARD_REQUEST ;;command is standard command
JMP DEVICE_CLASS_REQUEST ;;command is class command
DEVICE_STANDARD_REQUEST:
LDA bReq
CMP #STANDARD_REQ_TABLE_END-STANDARD_REQ_TABLE_START
BCC STANDARD_REQUEST1
LDA #STANDARD_REQ_TABLE_END-STANDARD_REQ_TABLE_START-1
STANDARD_REQUEST1:
STA REQUEST_BUF
TAX
LDA STANDARD_REQ_TABLE,X
STA TABLE_ADDR0
LDA STANDARD_REQ_TABLE1,X
STA TABLE_ADDR1
JMP (TABLE_ADDR)
STANDARD_REQ_TABLE:
STANDARD_REQ_TABLE_START:
DB <GET_STATUS ;;0
DB <CLEAR_FEATURE ;;1
DB <NO_SUPPORT_REQ ;; no support
DB <SET_FEATURE ;;3
DB <NO_SUPPORT_REQ ;; no support
DB <SET_ADDRESS ;;5
DB <GET_DESCRIPTOR ;;6
DB <NO_SUPPORT_REQ ;; SET_DESCRIPTOR, no support
DB <GET_CONFIG ;;8
DB <SET_CONFIG ;;9
DB <GET_INTERFACE ;;10
DB <SET_INTERFACE ;;11
DB <NO_SUPPORT_REQ ;; no support
STANDARD_REQ_TABLE_END:
STANDARD_REQ_TABLE1:
DB >GET_STATUS ;;0
DB >CLEAR_FEATURE ;;1
DB >NO_SUPPORT_REQ ;; no support
DB >SET_FEATURE ;;3
DB >NO_SUPPORT_REQ ;; no support
DB >SET_ADDRESS ;;5
DB >GET_DESCRIPTOR ;;6
DB >NO_SUPPORT_REQ ;; SET_DESCRIPTOR, no support
DB >GET_CONFIG ;;8
DB >SET_CONFIG ;;9
DB >GET_INTERFACE ;;10
DB >SET_INTERFACE ;;11
DB >NO_SUPPORT_REQ ;; no support
;---------------------------------------
GET_STATUS:
LDA bmReq
CMP #80H
BEQ GET_DEVICE_STATUS
CMP #81H
BEQ GET_IF_STATUS
CMP #82H
BEQ GET_EP_STATUS
JMP NO_SUPPORT_REQ
GET_DEVICE_STATUS:
LDA DEV_STATUS
AND #00000011B ;;device remote wakeup
STA TXDAT0
STZ TXDAT0
JMP VALIDATE_BUFFER
GET_EP_STATUS:
LDA wIndex
BEQ EP0_OUT
CMP #80H
BEQ EP0_IN
CMP #81H
BEQ EP1_IN
CMP #82H
BEQ EP2_IN
JMP NO_SUPPORT_REQ
GET_IF_STATUS:
LDA #0
BRA ENDPOINT_UN_STALL
EP0_OUT:
BBS2 DEV_STATUS,ENDPOINT_STALL
BRA ENDPOINT_UN_STALL
EP0_IN:
BBS3 DEV_STATUS,ENDPOINT_STALL
BRA ENDPOINT_UN_STALL
EP1_IN:
BBS4 DEV_STATUS,ENDPOINT_STALL
BRA ENDPOINT_UN_STALL
EP2_IN:
BBS5 DEV_STATUS,ENDPOINT_STALL
BRA ENDPOINT_UN_STALL
ENDPOINT_STALL:
LDA #1
STA TXDAT0
STZ TXDAT0
JMP VALIDATE_BUFFER
ENDPOINT_UN_STALL:
STZ TXDAT0
STZ TXDAT0
JMP VALIDATE_BUFFER
;---------------------------------------
CLEAR_FEATURE:
LDA bmReq
BEQ CLEAR_DEVICE_REMOTE_WAKEUP
CMP #2
BEQ CLEAR_EP_FEATURE
JMP NO_SUPPORT_REQ
CLEAR_DEVICE_REMOTE_WAKEUP:
RMB1 DEV_STATUS ;;clear remote wakeup function
JMP VALIDATE_BUFFER
CLEAR_EP_FEATURE:
LDA wIndex
BEQ CLR_EP0_OUT
CMP #80H
BEQ CLR_EP0_IN
CMP #81H
BEQ CLR_EP1_IN
CMP #82H
BEQ CLR_EP2_IN
JMP NO_SUPPORT_REQ
CLR_EP0_OUT:
CLR_EP0_IN:
JMP VALIDATE_BUFFER
CLR_EP1_IN:
RMB1 TXFLG1 ;;?clear endpoint1 stall
RMB4 DEV_STATUS ;;?
JMP VALIDATE_BUFFER
CLR_EP2_IN:
RMB1 TXFLG2 ;;?clear endpoint2 stall
RMB5 DEV_STATUS ;;?
JMP VALIDATE_BUFFER
;---------------------------------------
SET_FEATURE:
LDA bmReq
BEQ SET_DEVICE_REMOTE_WAKEUP
CMP #2
BEQ SET_EP_FEATURE
JMP NO_SUPPORT_REQ
SET_DEVICE_REMOTE_WAKEUP:
SMB1 DEV_STATUS ;;enable remote wakeup function
JMP VALIDATE_BUFFER
SET_EP_FEATURE:
LDA wIndex
BEQ SET_EP0_OUT
CMP #80H
BEQ SET_EP0_IN
CMP #81H
BEQ SET_EP1_IN
CMP #82H
BEQ SET_EP2_IN
JMP NO_SUPPORT_REQ
SET_EP0_OUT:
SET_EP0_IN:
JMP VALIDATE_BUFFER
SET_EP1_IN:
SMB1 TXFLG1 ;;?endpoint1 stall
SMB4 DEV_STATUS ;;?
JMP VALIDATE_BUFFER
SET_EP2_IN:
SMB1 TXFLG2 ;;?endpoint2 stall
SMB5 DEV_STATUS ;;?
JMP VALIDATE_BUFFER
;---------------------------------------
SET_ADDRESS:
LDA wValue ;;address from host
STA DEV_ADR ;;change to new address
JMP VALIDATE_BUFFER
;---------------------------------------
DESCRIPTOR_INDEX:
DESC_INDEX_START:
DB 01H
DB 02H
DB 03H
DB 04H
DB 05H
DB 21H
DB 22H
DESC_INDEX_END:
DESCRIPTOR_TABLE:
DB <DEV_DESC1 ;;1
DB <CONFIG_DESC1 ;;2
DB <STRING_0_DESC ;;3
DB <STRING_1_DESC ;;3
DB <STRING_2_DESC ;;3
DB <STRING_3_DESC ;;3
DB <INTERFACE_DESC1_EP1 ;;4
DB <INTERFACE_DESC1_EP2 ;;4
DB <ENDPOINT_DESC1_EP1 ;;5
DB <ENDPOINT_DESC1_EP2 ;;5
DB <HID_DESC1_EP1 ;;21
DB <HID_DESC1_EP2 ;;21
DB <REPORT_DESC1_EP1 ;;22
DB <REPORT_DESC1_EP2 ;;22
DESCRIPTOR_TABLE1:
DB >DEV_DESC1 ;;1
DB >CONFIG_DESC1 ;;2
DB >STRING_0_DESC ;;3
DB >STRING_1_DESC ;;3
DB >STRING_2_DESC ;;3
DB >STRING_3_DESC ;;3
DB >INTERFACE_DESC1_EP1 ;;4
DB >INTERFACE_DESC1_EP2 ;;4
DB >ENDPOINT_DESC1_EP1 ;;5
DB >ENDPOINT_DESC1_EP2 ;;5
DB >HID_DESC1_EP1 ;;21
DB >HID_DESC1_EP2 ;;21
DB >REPORT_DESC1_EP1 ;;22
DB >REPORT_DESC1_EP2 ;;22
DESCRIPTOR_LENGTH:
DB <DEV_DESC1_END-DEV_DESC1_START ;;1
DB <CONFIG_DESC1_END-CONFIG_DESC1_START ;;2
DB <STRING_0_DESC_END-STRING_0_DESC_START ;;3
DB <STRING_1_DESC_END-STRING_1_DESC_START ;;3
DB <STRING_2_DESC_END-STRING_2_DESC_START ;;3
DB <STRING_3_DESC_END-STRING_3_DESC_START ;;3
DB <INTERFACE_DESC1_EP1_END-INTERFACE_DESC1_EP1_START ;;4
DB <INTERFACE_DESC1_EP2_END-INTERFACE_DESC1_EP2_START ;;4
DB <ENDPOINT_DESC1_EP1_END-ENDPOINT_DESC1_EP1_START ;;5
DB <ENDPOINT_DESC1_EP2_END-ENDPOINT_DESC1_EP2_START ;;5
DB <HID_DESC1_EP1_END-HID_DESC1_EP1_START ;;21
DB <HID_DESC1_EP2_END-HID_DESC1_EP2_START ;;21
DB <REPORT_DESC1_EP1_END-REPORT_DESC1_EP1_START ;;22
DB <REPORT_DESC1_EP2_END-REPORT_DESC1_EP2_START ;;22
DESCRIPTOR_LENGTH1:
DB >DEV_DESC1_END-DEV_DESC1_START ;;1
DB >CONFIG_DESC1_END-CONFIG_DESC1_START ;;2
DB >STRING_0_DESC_END-STRING_0_DESC_START ;;3
DB >STRING_1_DESC_END-STRING_1_DESC_START ;;3
DB >STRING_2_DESC_END-STRING_2_DESC_START ;;3
DB >STRING_3_DESC_END-STRING_3_DESC_START ;;3
DB >INTERFACE_DESC1_EP1_END-INTERFACE_DESC1_EP1_START ;;4
DB >INTERFACE_DESC1_EP2_END-INTERFACE_DESC1_EP2_START ;;4
DB >ENDPOINT_DESC1_EP1_END-ENDPOINT_DESC1_EP1_START ;;5
DB >ENDPOINT_DESC1_EP2_END-ENDPOINT_DESC1_EP2_START ;;5
DB >HID_DESC1_EP1_END-HID_DESC1_EP1_START ;;21
DB >HID_DESC1_EP2_END-HID_DESC1_EP2_START ;;21
DB >REPORT_DESC1_EP1_END-REPORT_DESC1_EP1_START ;;22
DB >REPORT_DESC1_EP2_END-REPORT_DESC1_EP2_START ;;22
GET_DESCRIPTOR:
LDX #0
FIND_DESC_TYPE:
LDA wValue+1
CMP DESCRIPTOR_INDEX,X
BEQ DESC_TYPE1
INX
CPX #DESC_INDEX_END-DESC_INDEX_START
BCC FIND_DESC_TYPE
NO_SUPPORT_REQ1:
JMP NO_SUPPORT_REQ
DESC_TYPE1:
TXA
CMP #2 ;;?string
BNE Comp_Index_value ;;?
CLC ;;?
ADC wValue ;;?
BRA SEND_DESC
Comp_Index_value:
CMP #3
BCC Index_Less_than_3
SBC #3
ASL A
ADC #6
STA DESC_REG
LDA wIndex ;;interface0 or interface1
CMP #2
BCS NO_SUPPORT_REQ1
ADC DESC_REG
BRA SEND_DESC
Index_Less_than_3:
SEND_DESC:
TAX
LDA DESCRIPTOR_TABLE,X
STA DESC_REG
LDA DESCRIPTOR_TABLE1,X
STA DESC_REG1
LDA DESCRIPTOR_LENGTH,X
STA DESC_BYTE
LDA DESCRIPTOR_LENGTH1,X
STA DESC_BYTE1
SEND_DESCRIP:
LDA wLength
SEC
SBC DESC_BYTE
LDA wLength+1
SBC DESC_BYTE1
BCS SEND_DESCRIPTOR
LDA wLength
STA DESC_BYTE
LDA wLength+1
STA DESC_BYTE1
;---------------------------------------
SEND_DESCRIPTOR:
STZ DESC_BYTE_INDEX
STZ DESC_BYTE_INDEX1
SEND_DESCRIPTOR1:
LDA DESC_BYTE_INDEX
SEC
SBC DESC_BYTE
LDA DESC_BYTE_INDEX1
SBC DESC_BYTE1
BCC SEND_DESC_LOOP
STZ bReq ;;end data transmit
BRA END_SEND_DESC
SEND_DESC_LOOP:
LDA DESC_REG
CLC
ADC DESC_BYTE_INDEX
STA TABLE_ADDR0
LDA DESC_REG1
ADC DESC_BYTE_INDEX1
STA TABLE_ADDR1
LDY #0
LDA (TABLE_ADDR),Y
STA TXDAT0
INC DESC_BYTE_INDEX
BNE $+4
INC DESC_BYTE_INDEX1
;$+4:
LDA DESC_BYTE_INDEX
AND #00000111B
BNE SEND_DESCRIPTOR1
END_SEND_DESC:
JMP VALIDATE_BUFFER
;---------------------------------------
GET_CONFIG:
LDA Config_Value
STA TXDAT0
JMP VALIDATE_BUFFER
;---------------------------------------
SET_CONFIG:
LDA wValue
STA Config_Value
BEQ DISABLE_CONFIG
CMP #1 ;;configuration value = 1
BNE End_Set_Config
ENABLE_CONFIG:
LDA #00001100B ;;?enable endpoint1,endpoint2
STA TXFLG1 ;;?
STA TXFLG2 ;;?
SMB3 IE_FUNC_REG ;;?enable KBD
LDA IE_FUNC_REG ;;?
STA IE_FUNC ;;?
SMB6 DEV_STATUS ;;device be configured
BRA End_Set_Config
DISABLE_CONFIG:
STZ TXFLG1 ;;?disable endpoint1,endpoint2
STZ TXFLG2 ;;?
RMB3 IE_FUNC_REG ;;?disable KBD
LDA IE_FUNC_REG ;;?
STA IE_FUNC ;;?
RMB6 DEV_STATUS
End_Set_Config:
LDA DEV_STATUS ;;?clear endpoint1/2 stall
AND #11001111B ;;?
STA DEV_STATUS ;;?
RMB1 TXFLG1 ;;?
RMB1 TXFLG2 ;;?
BRA VALIDATE_BUFFER
;---------------------------------------
GET_INTERFACE:
LDA wIndex
BEQ Get_IF0
CMP #01H
BEQ Get_IF1
BRA NO_SUPPORT_REQ
Get_IF0:
LDA Alternate0
STA TXDAT0
BRA VALIDATE_BUFFER
Get_IF1:
LDA Alternate1
STA TXDAT0
BRA VALIDATE_BUFFER
;---------------------------------------
SET_INTERFACE:
LDA wIndex
BEQ Set_IF0
CMP #01H
BEQ Set_IF1
BRA NO_SUPPORT_REQ
Set_IF0:
LDA wValue
STA Alternate0
RMB4 DEV_STATUS ;;?clear endpoint1 stall
RMB1 TXFLG1 ;;?
BRA VALIDATE_BUFFER
Set_IF1:
LDA wValue
STA Alternate1
RMB5 DEV_STATUS ;;?clear endpoint2 stall
RMB1 TXFLG2 ;;?
BRA VALIDATE_BUFFER
;---------------------------------------
VALIDATE_BUFFER: ;;validated buffer
LDA TXFLG0
ORA #00000001B
EOR #00000100B ;;buffer full
STA TXFLG0
RTS
;---------------------------------------
NO_SUPPORT_REQ:
LDA #00000010B ;;?EP0 IN TOKEN stall
STA TXFLG0 ;;?
RTS
;;----------------------------------------------------------------------------
CLASS_REQ_TABLE:
CLASS_REQ_TABLE_START:
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 ;;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -