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

📄 cls1.asm

📁 Holteck HT82M9XX的USB Mouse的Firmware汇编代码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
include         HT82K96e.inc
include         usbrf.inc

EXTERN          bCMD_INDEX              :BIT
extern          bAltkbProtocol          :bit
extern          baltmouseprotocol       :bit

extern          TempKBTime              :byte
extern          TempmouseTime           :byte
extern          TempKBTime_L            :byte
extern          TempmouseTime_L         :byte

extern          fifo_type               :byte
extern          FIFO_Request            :byte
extern          fifo_wIndexl            :byte
extern          FIFO_wIndexH            :byte
extern          FIFO_wValueL            :byte
extern          FIFO_wValueH            :byte
extern          FIFO_wLengthH           :byte
extern          FIFO_wLengthL           :byte

extern          INT_temp2               :byte
extern          FIFO_OUT1               :byte
extern          FIFO_SendLen            :byte
extern          ReportkbTime            :byte
extern          ReportMouseTime         :byte

extern          MoveMouseData           :near

Extern          ExitExt                 :near
EXTERN          ToStallPipe0            :NEAR
EXTERN          RequestResponse         :NEAR
EXTERN          SendHandshake           :NEAR

TEMP            EQU                     INT_TEMP2

;CLS1            .SECTION        AT      1d6H    'code'
CLS1            .SECTION        AT      1E0H    'code'

;------------------------------------------------------------------------------
; Remark : Get report (属於Class-specific request)
;------------------------------------------------------------------------------
GetReport:                              ; Report_type, Report_ID=0, Report_Length
        SNZ     FIFO_Type.@Setup_D      ; 检查是否device to host ?
        JMP     ToStallPipe0            ; No:Error

        MOV     A,FIFO_wValueH          ; Get report type (Only 3 kind)
        SUB     A,REPORT_TYPE_NO        ; 检查是否超过3种?(REPORT_TYPE_NO=4)
        SZ      C                       ;
        JMP     ToStallPipe0            ; Yes,Error

        MOV     A,FIFO_wValueH          ; ACC=FIFO_wValueH(=Report Type)
get_report_pcl_5:
        ADDM    A,PCL                   ;
        JMP     ToStallPipe0            ; No this report type
        JMP     GetInputReport          ; 跳到处理GetInputReport
        JMP     Tostallpipe0            ; 不处理Output report
GetFeatureReport:
        JMP     ToStallPipe0            ; 不处理Feature report
        ;----------------------------------------------------------------------------
        ; Remark : 根据Interface number将device状态放到FIFO_OUTx
        ;----------------------------------------------------------------------------
GetInputReport:
        SZ      FIFO_wLengthH           ; 检查是否wLength=0?
        JMP     ToStallPipe0            ; No,Error
                                
        mov     a,FIFO_wIndexL          ; ACC=FIFO_wIndexL(=Interface Number)
get_input_pcl_4:
        addm    a,pcl                   ;
        jmp     get_KB_input            ; 跳到get_KB_input
        jmp     get_mouse_input         ; 跳到get_mouse_input

;----- Class-Specific request -----------------------------------------------
;------------------------------------------------------------------------------
; Remark : 处理Class-specific的request
;------------------------------------------------------------------------------
ClassRequest:
        MOV     A,FIFO_Type             ; (Setup_Rev=1FH)
        AND     A,Setup_Rev             ; 取出Recipient(device,interface,endpoint或other)
        MOV     TEMP,A                  ;
        SUB     A,04H                   ; 检查是否超过4项?
        SZ      C                       ;
        JMP     ToStallPipe0            ; Yes, Error

        MOV     A,TEMP                  ; No
class_request_pcl_5:
        ADDM    A,PCL                   ;
        JMP     ToStallPipe0            ; 若Recipient=Device(不可能,HID class request没有对device)
        JMP     InterfaceRev            ; 若Recipient=Interface
        JMP     EndpointRev             ;? 若Recipient=Endpoint
        JMP     ToStallPipe0            ; Invalid Other

EndpointRev:
        sz      fifo_wIndexL.7          ;? 检查fifo_wIndexL(Direction bit)是否为0
        clr     fifo_wIndexL.7          ;? No,将fifo_wIndexL(Direction bit)清为0
InterfaceRev:
        SZ      FIFO_wIndexH            ; 检查fifo_wIndexH是否为0?
        JMP     ToStallPipe0            ; No, Error

        MOV     A,FIFO_wIndexL          ; FIFO_wIndexL=Interface Number
        SUB     A,INTERFACE_NO          ; 检查是否FIFO_wIndexL(即Interface Number)大於2
        SZ      C                       ;
        JMP     ToStallPipe0            ; Yes, Error

;Check bRequest         
        MOV     A,FIFO_Request          ; bRequest
        SUB     A,CLASS_REQUEST_NO      ; 检查Class request是否Over 12 item ?
        SZ      C                       ;
        JMP     ToStallPipe0            ; Yes, Error

        MOV     A,FIFO_Request          ; ACC=取出Request
;!!!!! Need in same page
class_cmd_pcl_13:
        ADDM    A,PCL                   ;
        JMP     ToStallPipe0            ; 0:不处理
        JMP     GetReport               ; 1:跳去处理GetReport
        JMP     GetIdle                 ; 2:将一个byte的Idle rate回传给Host
        JMP     GetProtocol             ; 3
        JMP     ToStallPipe0            ; 4:不处理
        JMP     ToStallPipe0            ; 5:不处理
        JMP     ToStallPipe0            ; 6:不处理
        JMP     ToStallPipe0            ; 7:不处理
        JMP     ToStallPipe0            ; 8:不处理
        JMP     SetReport               ; 9
        JMP     SetIdle                 ; A
        JMP     SetProtocol             ; B
;;/////////////Class Specific Request/////////////////////////////////////////

        ;----------------------------------------------------------------------------
        ; Remark : 设定FIFO_SendLen,将固定长度的data传送出去
        ;----------------------------------------------------------------------------
ReportVL:
        MOV     FIFO_OUT1,A             ;
        MOV     A,KB_OUTPUT_SIZE        ; 检查是否FIFO data length=KB_OUTPUT_SIZE(=1)

ReportL:
        MOV     FIFO_SendLen,A          ; 设定FIFO_SendLen
ReportIt:
        jmp     RequestResponse         ; 跳到RequestResponse,将固定长度的data传送出去

;------------------------------------------------------------------------------
; Remark : Get idle (属於Class-specific request)
;------------------------------------------------------------------------------
GetIdle:                                ;Report_ID=0,
        SNZ     FIFO_Type.@Setup_D      ; 检查是否Device to host ?
        JMP     ToStallPipe0            ; No, Error

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

        MOV     A,FIFO_wLengthL         ; 检查是否wLengthL=1?
        XOR     A,01H                   ;
        SNZ     Z                       ;
        JMP     ToStallPipe0            ; No, Error

⌨️ 快捷键说明

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