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

📄 cls1.asm

📁 Holteck HT82M9XX的USB Mouse的Firmware汇编代码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
               
        MOV     A,ReportkbTime          ; ACC=ReportKBTime
        SZ      FIFO_wIndexL.0          ; 检查FIFO_wIndexL(=Interface Number:0-KB, 1-Mouse)
        mov     a,reportmousetime       ; ACC=ReportMouseTime
        JMP     ReportVL                ; 跳到ReportVL,准备将data传出去

;------------------------------------------------------------------------------
; Remark : Get protocol (属於Class-specific request)--回传protocol为Boot或Report
;          protocol给Host,若alternative protocol为0,则代表Boot protocol,否则为
;          Report protocol
;------------------------------------------------------------------------------
GetProtocol:
        SNZ     FIFO_Type.@Setup_D      ; 检查是否Device to host ?
        JMP     ToStallPipe0            ; No, Error

        SZ      FIFO_wValueL            ; 检查是否FIFO_wValueL=0?
        JMP     ToStallPipe0            ; No, Error
        SZ      FIFO_wValueH            ; 检查是否FIFO_wValueH=0?
        JMP     ToStallPipe0            ; No, Error
                
        SZ      FIFO_wLengthH           ; 检查是否FIFO_wLengthH=0
        JMP     ToStallPipe0            ; No, Error
        MOV     A,FIFO_wLengthL         ; 检查是否FIFO_wLengthL=1
        XOR     A,01H                   ;
        SNZ     Z                       ;
        JMP     ToStallPipe0            ; No, Error

        clr     acc                     ; ACC=00H
        sz      FIFO_wIndexL.0          ; 检查FIFO_wIndexL(=Interface Number:0-KB, 1-Mouse)是否为0(即KB)
        jmp     ms_get_protocol         ; No, 跳到ms_get_protocol

        sz      bAltkbProtocol          ; 检查bAltkbProtocol是否为0
        set     acc.0                   ; No, ACC=01H(即为Report protocol)
        jmp     ReportVL                ; 回传给Host
        
ms_get_protocol:
        sz      baltmouseprotocol       ; 检查bAltMouseProtocol是否为0
        set     acc.0                   ; No, ACC=01H(即为Report protocol)
        jmp     ReportVL                ; 回传给Host

;------------------------------------------------------------------------------
; Remark : Set idle (属於Class-specific request)
;------------------------------------------------------------------------------
SetIdle:
        sz      FIFO_wLengthL           ; 检查是否FIFO_wLengthL=0
        jmp     Tostallpipe0            ; No, Error
        sz      FIFO_wLengthH           ; 检查是否FIFO_wLengthH=0
        JMP     ToStallPipe0            ; No, Error
                                                                        
        clr     TempKBTime              ;
        clr     TempMouseTime           ;
        clr     TempKBTime_L            ;
        clr     TempMouseTime_L         ;

        MOV     A,offset ReportKBTime   ; ACC=ReportKBTime address
        SZ      FIFO_wIndexL.0          ; 检查是否FIFO_wIndexL(即Interface Number)=0(0-KB, 1-Mouse)
        mov     a,offset ReportMouseTime; ACC=ReportMouseTime address
write_idle_rate:
        MOV     MP0,A                   ; MP0=ReportKBTime或ReportMouseTime的地址
        MOV     A,FIFO_wValueH          ; ACC=FIFO_wValueH(即KB或Mouse的Report cycle)
        MOV     R0,A                    ; 设定ReportKBTime或ReportMouseTime

        JMP     SendHandshake           ; 跳到SendHandshake(send handshake flag)

;------------------------------------------------------------------------------
; Remark : Set report (属於Class-specific request)
;------------------------------------------------------------------------------
SetReport:
        ; Report_Type,Report_ID=0,Check bmRequestType direction
        ; No Feature Report, Input Report
        SZ      FIFO_Type.@Setup_D      ; 检查是否Host to device ?
        JMP     ToStallPipe0            ; No, Error

        MOV     A,FIFO_wValueH          ; ACC=FIFO_wValueH(即report type)(Only 3 kind)
        SUB     A,04H                   ; 检查是否Over 4 item ?
        SZ      C                       ;
        JMP     ToStallPipe0            ; Yes, Error

        MOV     A,FIFO_wValueH          ;
setreport_pcl_5:
        ADDM    A,PCL                   ;
        JMP     ToStallPipe0            ; No this report type
        JMP     ToStallPipe0            ; 不处理SetInputReport
        JMP     SetOutputReport         ; 跳到SetOutputReport
SetFeatureReport:                       ;
        JMP     ToStallPipe0            ; 不处理SetFeatureReport

SetOutputReport:
        SZ      FIFO_wIndexL            ; 检查是否FIFO_wIndexL(即Interface Number)=0(0-KB, 1-Mouse)
        JMP     ToStallPipe0            ; No, Error
;KB                                     
        SZ      FIFO_wLengthH           ; 检查是否FIFO_wLengthH=0?
        JMP     ToStallPipe0            ; No, Error

        MOV     A,FIFO_wLengthL         ; ACC=FIFO_wLengthL(1 byte report)
        XOR     A,KB_Output_SIZE        ; 检查是否FIFO_wLengthL=KB_Output_SIZE
        SNZ     Z                       ;
        JMP     ToStallPipe0            ; No, Error

        set     bCMD_INDEX              ; 设定bCMD_INDEX=1,在USB_INT的DataStage会用到,代表Host下了一个SetReport request
        JMP     ExitExt                 ; 准备离开ExitExt ISR

;------------------------------------------------------------------------------
; Remark : Set protocol (属於Class-specific request)--设定protocol为Boot或Report
;          protocol给Host,若alternative protocol为0,则代表Boot protocol,否则为
;          Report protocol
;------------------------------------------------------------------------------
SetProtocol:    ;
        ;Not Check bmRequestType direction because wLength = 0
        ;SZ      FIFO_Type.@Setup_D     ;Host to device ?
        ;JMP            ToStallPipe0           ;No: to stall

        MOV     A,FIFO_wLengthL         ; 检查是否FIFO_wLength=0
        ADD     A,FIFO_wLengthH         ;
        SNZ     Z                       ;
        JMP     ToStallPipe0            ; No, Error

        SZ      FIFO_wValueH            ; 检查是否FIFO_wValueH = 0 ?
        JMP     ToStallPipe0            ; No, Error

        sz      FIFO_wIndexL.0          ; 检查是否FIFO_wIndexL(即Interface Number)=0
        jmp     ms_set_protocol         ; No, 跳到ms_get_protocol

        clr     bAltkbProtocol          ; 设定bAltKBProtocol=0(即Boot Protocol)
        sz      FIFO_wValueL            ; 检查是否FIFO_wValueL(即Protocol type:0=Boot Protocol;1:Report Protocol)
        set     bAltkbProtocol          ; 设定bAltKBProtocol=1(即Report Protocol)
        JMP     SendHandshake           ; 跳到SendHandshake(send handshake flag)

ms_set_protocol:
        clr     baltmouseprotocol       ; 设定bAltMouseProtocol=0(即Boot Protocol)
        sz      FIFO_wValueL            ; 检查是否FIFO_wValueL(即Protocol type:0=Boot Protocol;1:Report Protocol)
        set     baltmouseprotocol       ; 设定bAltMouseProtocol=1(即Report Protocol)
        JMP     SendHandshake           ; 跳到SendHandshake(send handshake flag)
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
get_kb_input:
;KB
        MOV     A,FIFO_wLengthL         ; ACC=Report size
        XOR     A,REPORT_KB_SIZE        ; 检查是否FIFO_wLengthL=Report size
        SNZ     Z                       ;
        JMP     ToStallPipe0            ; No,Error
                                
        call    MoveMouseData           ; 将Mouse的移动资料放到FIFO_OUTx

        JMP     ReportIt                ; 跳到ReportIt
;----------------------------------------------------------------------------
get_mouse_input:
        JMP     ToStallPipe0            ; 不处理

PUBLIC          ClassRequest
public          class_request_pcl_5
public          class_cmd_pcl_13
public          get_report_pcl_5
public          get_input_pcl_4
public          setreport_pcl_5
                END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -