⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 offickbd.asm

📁 以台湾CHESEN公司的CSC0108实现多媒体USB键盘的功能
💻 ASM
📖 第 1 页 / 共 5 页
字号:
        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 + -