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

📄 std1.asm

📁 Holteck HT82M9XX的USB Mouse的Firmware汇编代码
💻 ASM
📖 第 1 页 / 共 4 页
字号:

        ;----------------------------------------------------------------------
        ; Remark : 1. 将Descriptor table的内容读取出来放到FIFO_OUTx
        ;          2. 累加FIFO_SendLen的值
        ;----------------------------------------------------------------------
read_data_again:
        snz     brd_h_table                     ; 检查是否brd_h_table=1
        jmp     read_L_table_byte               ; No
;read_H_byte
        clr     brd_h_table                     ; 设定brd_h_table=0
        TABRDL  R0                              ; 将descriptor读到FIFO_OUTx
        INC     TBLP                            ;
        mov     a,tblh                          ; 取出读出来的High-byte
        and     a,00111111b                     ;
        xor     a,3FH                           ; 检查是否读到3FH(读到High-byte为3FH时要bypass掉)
        sz      z                               ;
        jmp     read_data_again                 ; Yes,读到3FH,则跳到read_data_again继续读取
        mov     a,tblh                          ; No.
        and     a,00111111b                     ;
        mov     R0,a                            ; 将读到的High-byte存到FIFO_OUTx
        jmp     read_next_table                 ;
read_L_table_byte:
        set     brd_h_table                     ; 设定brd_h_table=1
        TABRDL  R0                              ; 将descriptor读到FIFO_OUTx
read_next_table:
        INC     MP0                             ; Update memory pointer 0
        INC     FIFO_SendLen                    ; Update FIFO_SendLen
        sz      lengthl                         ; 检查LengthL是否为0
        jmp     skip_check_lengthh              ; 若LengthL不为0,则跳到skip_check_lengthh
        sz      lengthH                         ; 若LengthL为0,则检查LengthH是否为0
        jmp     check_length_data               ; 若LengthH不为0,则跳到check_length_data
out_descript:
        MOV     A,LOW EndSend                   ;
        MOV     ReturnAddr,A                    ; 读完Descriptor,将ReturnAddr设为EndSend
        jmp     get_table_lp                    ;
skip_check_lengthh:
        dec     lengthl                         ; 将Host指定的回传长度减1
get_table_lp:
        SDZ     TableLength                     ; 将descriptor指定的长度减1,并检查descriptor的读取动作是否结束
        JMP     GetTableTag                     ; 检查是否8-byte的FIFO_OUTx空间是否已经填满
        RET

check_length_data:
        set     lengthl                         ; LengthL=FFH
        dec     lengthH                         ; LengthH减1
        jmp     get_table_lp                    ;

        ;----------------------------------------------------------------------
        ; Remark : 检查是否8-byte的FIFO_OUTx空间是否已经填满了
        ;----------------------------------------------------------------------
GetTableTag:
        MOV     A,FIFO_SendLen                  ;
        XOR     A,FIFO_SIZE                     ; 检查FIFO_OUT buffer(8 bytes)是否都填满了
        SNZ     Z                               ;
        JMP     GetTableLp                      ; No, 继续读取descriptor将FIFO_OUT buffer填满
        RET                                     ; Yes, FIFO FULL
;----------------------------------------------------------------------------------------------

;stack 1
;!!!!! Must in same page with caller
ReadEntityAndSendCnf:
        MOV     a,FIFO_wIndexL                  ; FIFO_wIndexL=Host欲读取的descriptor index
        mov     des_count,a                     ; des_count=descriptor index
        call    get_entity_length               ; 根据descriptor index(des_count)取出目标Entity(Report) descriptor length
        MOV     TableLength,A                   ; TableLength=目标Entity(Report) descriptor length
        jmp     SendCnf                         ; 跳到SendCnf开始进行读取Entity(Report) descriptor的工作

;----------------------------------------------------------------------------------------------
;stack 1
ReadTableAndSendCnf:
        TABRDL  TableLength                     ; TableLength=读出descriptor的table length栏位
SendCnf:
        call    gettablenolength                ; 决定真正读取Descriptor Table的长度=>TableLength
        call    GetTableBeg                     ; 将descriptor的内容读出来放到FIFO_OUTx
        JMP     ReadNextXX                      ; 跳到ReadNextXX
;----------------------------------------------------------------------------------------------
;程式进入点for get the next table data
GetTableLength:
        clr     brd_h_table                     ; 清除brd_h_table=0
        TABRDL  TableLength                     ; TableLength=读出descriptor的table length栏位
        CALL    GetTableNoLength                ; 决定真正读取Descriptor Table的长度=>TableLength
gettablelength_cont:
        SZ      bFLAG_RsqF                      ; 是否已经正在传Descriptor给Host(bFLAG_RsqF=1)
        JMP     ReadAgain                       ; 是,已经正在传送,跳到ReadAgain
        CALL    GetTableLp                      ; 否,跳到GetTableLp,开始读取descriptor data
        JMP     ReadNextXX                      ; 跳到ReadNextXX
;----------------------------------------------------------------------------------------------
        ;----------------------------------------------------------------------
        ; Remark : Descriptor尚未读取完,会把bFLAG_SndFC设定为1
        ;----------------------------------------------------------------------
ReadAgain:
        SET     bFLAG_SndFC                     ; 设定bFLAG_SndFC=1(Set continue send flag)
        MOV     A,TBLP                          ; Save TBLP
        MOV     FIFO_TBLP,A                     ; FIFO_TBLP=Descriptor读取进度的指标
        JMP     RequestResponse                 ; 送出固定长度(FIFO_SendLen)的data到Host

        ;----------------------------------------------------------------------
        ; Remark : 当USB INT从FIFO0收到IN,接续未读完的descriptor
        ;----------------------------------------------------------------------
ReadNextCnf:
        MOV     A,FIFO_TBLP                     ; Restore TBLP
        MOV     TBLP,A                          ; TBLP=前次未读完的descriptor index
        CALL    GetTableBeg                     ; 继续读取前次未读完的descriptor

        ;----------------------------------------------------------------------
        ; Remark : 检查FIFO_OUTx的空间是否填满
        ;----------------------------------------------------------------------
ReadNextXX:
        MOV     A,FIFO_SendLen                  ; 检查是否FIFO_OUTx full ?
        XOR     A,FIFO_SIZE                     ; (FIFO_SIZE=08H)
        SZ      Z                               ;
        JMP     ReadTASTag                      ; Yes,跳到ReadTASTag
        JMP     ReadNextCnfLp                   ; No,跳到ReadNextCnfLp
;----------------------------------------------------------------------------------------------
        ;----------------------------------------------------------------------
        ; Remark : 决定读取descriptor时的真正长度=>Host所指定长度(LengthH,LengthL)
        ;          和descriptor所指定长度(TableLength),二者取较小者
        ;----------------------------------------------------------------------
GetTableNoLength:
        SZ      LengthH                         ; 检查是否LengthH=0?
        ret                                     ; No, return with error

        MOV     A,TableLength                   ;
        SUB     A,LengthL                       ; Table length >= wLengthL ?
        SNZ     C                               ;
        ret                                     ; 若TableLength<wLengthL,则return
set_tablelength:
        MOV     A,LengthL                       ; 若TableLength>=wLengthL,
        MOV     TableLength,A                   ; 则Update Tablelength=FIFO_wLengthL
        ret                                     ;

        ;----------------------------------------------------------------------
        ; Remark : GetDescriptor命令的Recipient若为Interface,则要处理的descriptor
        ;          是HID和Entity(Report)二种descriptor,因为这二种descriptor是隶属
        ;          在InterfaceDescriptor阶层之下的(03-09-2004)
        ;----------------------------------------------------------------------
ClassDst_Interface:
        MOV     A,FIFO_wIndexL                  ; ACC=取出interface number
        SUB     A,INTERFACE_NO                  ;
        SZ      C                               ; 检查interface number是否超过INTERFACE_NO
        JMP     ToStallPipe0                    ; Yes,跳到ToStallPipe0

Skip_Check_Endpoint:                            ; No,continue
        MOV     A,FIFO_wValueH                  ; ACC=取出Class descriptor type(HID/Report/Physical)
        AND     A,wValueH_Dst                   ;  Stanard, Class & Vendor
        MOV     TEMP,A                          ;
        SUB     A,04H                           ;Over 4 iteM ?
        SZ      C                               ;
        JMP     ToStallPipe0                    ;Yes

        MOV     A,TEMP                          ;
class_des_pcl_5:
        ADDM    A,PCL                           ;
        JMP     ToStallPipe0                    ; 不处理
        JMP     GetHID                          ; Get HID descriptor
        JMP     GetEntity                       ; Get entity descriptor
        JMP     ToStallPipe0                    ; 不处理Get physical descriptor
;-----------------------------------------------------------------------------------
get_Interface_des_adr:
        mov     a,des_count                     ;
get_interface_pcl_3:
        addm    a,pcl                           ;
        ret     a,LOW InterfaceD_0              ; 回传ACC=InterfaceD_0的地址
        ret     a,LOW InterfaceD_1              ; 回传ACC=InterfaceD_1的地址
        ret     a,LOW InterfaceD_2              ; 回传ACC=InterfaceD_2的地址
;-----------------------------------------------------------------------------------
get_HID_des_adr:
        mov     a,des_count                     ;
get_HID_pcl_3:
        addm    a,pcl                           ;
        ret     a,LOW HID_0                     ; 回传ACC=HID_0的地址
        ret     a,LOW HID_1                     ; 回传ACC=HID_1的地址
        ret     a,LOW HID_2                     ; 回传ACC=HID_2的地址
;-----------------------------------------------------------------------------------
get_endpt_des_adr:
        mov     a,des_count                     ;
get_endpt_pcl_3:
        addm    a,pcl                           ;
        ret     a,LOW EndpointD_0               ; 回传ACC=EndpointD_0的地址
        ret     a,LOW EndpointD_1               ; 回传ACC=EndpointD_1的地址
        ret     a,LOW EndpointD_2               ; 回传ACC=EndpointD_2的地址
;-----------------------------------------------------------------------------------
get_entity_des_adr:
        mov     a,des_count                     ;
get_entity_pcl_3:
        addm    a,pcl                           ;
        ret     a,LOW Entity_0                  ; 回传ACC=Entity_0的地址
        ret     a,LOW Entity_1                  ; 回传ACC=Entity_1的地址
        ret     a,LOW Entity_2                  ; 回传ACC=Entity_2的地址
;-----------------------------------------------------------------------------------
get_entity_length:
        mov     a,des_count                     ;
get_entity_len_pcl_3:
        addm    a,pcl                           ;
        ret     a,Entity_Length_0               ; 回传ACC=Entity_Length_0的地址
        ret     a,Entity_Length_1               ; 回传ACC=Entity_Length_1的地址
        ret     a,Entity_Length_2               ; 回传ACC=Entity_Length_2的地址



PUBLIC                  StandardRequest
PUBLIC                  GetEnd
PUBLIC                  ReadNextCnf
public                  std_request_pcl_14
public                  clear_feature_pcl_5
public                  set_feature_pcl_5
public                  std_des_start_pcl
public                  std_des_end_pcl
public                  GetStringDes
public                  std_device_pcl_5
public                  class_des_pcl_5
public                  get_status_pcl_5
public                  get_interface_pcl_3
public                  get_endpt_pcl_3
public                  get_entity_pcl_3
public                  get_HID_pcl_3
public                  get_entity_len_pcl_3
END

⌨️ 快捷键说明

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