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

📄 std1.asm

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

extern                  baddr_state             :bit
extern                  bFLAG_FIFO_REDY         :bit
extern                  bRmtWakeup              :bit
extern                  bFLAG_RsqF              :bit
extern                  bFLAG_SndFC             :bit
extern                  bFLAG_HvRpt             :bit
extern                  brd_h_table             :bit
extern                  bCfgValue               :bit
extern                  bwait_setup             :bit

extern                  int_temp1               :byte
extern                  int_temp2               :byte

fifo_temp               EQU                     int_temp1
FIFO_ADDR               equ                     int_temp1
ADDR_Wake               equ                     fifo_addr.0
temp                    equ                     int_temp2

extern                  STALL                   :byte
extern                  Wtotallength            :near
;extern                 Entity_length           :near
extern                  bNumberInterface        :near
extern                  des_count               :byte
extern                  FIFO_Request            :byte
extern                  FIFO_wValueH            :byte
extern                  FIFO_wValueL            :byte
extern                  CMD_ADDR                :byte
extern                  FIFO_wIndexH            :byte
extern                  FIFO_Type               :byte
;extern                 TEMP                    :byte
extern                  FIFO_wIndexL            :byte
extern                  FIFO_OUT1               :byte
extern                  fifo_out2               :byte
extern                  ReturnAddr              :byte
extern                  FIFO_SendLen            :byte
extern                  TableLength             :byte
extern                  FIFO_wLengthH           :byte
extern                  FIFO_wLengthL           :byte

;extern                 AltkbSetting            :byte
;extern                 altmousesetting         :byte
extern                  lengthh                 :byte
extern                  lengthl                 :byte
extern                  FIFO_TBLP               :byte

Extern                  ExitExt:near
EXTERN                  ToStallPipe0:NEAR
EXTERN                  RequestResponse:NEAR
EXTERN                  SendHandshake:NEAR
EXTERN                  GetPipeBit:NEAR
EXTERN                  SendFIFOOut:NEAR
EXTERN                  ClearStall:NEAR
EXTERN                  SetStall:NEAR

EXTERN                  DeviceD:NEAR
EXTERN                  ConfigurationD:NEAR
EXTERN                  InterfaceD_0:NEAR
EXTERN                  EndpointD_0:NEAR
EXTERN                  HID_0:NEAR
EXTERN                  Entity_0:NEAR
EXTERN                  InterfaceD_1:NEAR
EXTERN                  EndpointD_1:NEAR
EXTERN                  HID_1:NEAR
EXTERN                  Entity_1:NEAR
EXTERN                  InterfaceD_2:NEAR
EXTERN                  EndpointD_2:NEAR
EXTERN                  HID_2:NEAR
EXTERN                  Entity_2:NEAR

extern                  LangID:near
extern                  ManufactureS:near
extern                  ProductS:near

;STD1                    .SECTION        AT 009H         'code'
STD1                    .SECTION        AT 0010H         'code'
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;----- Standard request -----------------------------------------------------
StandardRequest:
        mov     a,1                             ; ACC=1
        snz     baddr_state                     ; 检查baddr_state是否为1(baddr_state要在SetConfiguration完成後才会设为0)
        mov     a,ENDPOINT_NO                   ; 若baddr_state=0,则ACC=ENDPOINT_NO=02H
        mov     fifo_temp,a                     ;

        MOV     A,FIFO_Request                  ; ACC=bRequest栏位
        SUB     A,STANDARD_REQUEST_NO           ; Over 13 Item ?
        SZ      C                               ; 检查Standard request的值是否超过13
        JMP     ToStallPipe0                    ; Yes,ToStallPipe0
        MOV     A,FIFO_Request                  ; ACC=合法的Standard request
;!!!!! Need in same page
std_request_pcl_14:
        ADDM    A,PCL                           ;
        JMP     GetStatus               ;0      ; 获得Interface/Device/Endpoint的状态
        JMP     ClearFeature            ;1      ; 解除Device的RemoteWakeup,或Endpoint的Halt feature
        JMP     ToStallPipe0            ;2      ; 不作处理
        JMP     SetFeature              ;3      ; 设定Device的RemoteWakeup,或Endpoint的Halt feature
        JMP     ToStallPipe0            ;4      ; 不作处理
        JMP     SetAddressC             ;5      ; 设定Device的address(CMD_ADDR)
        JMP     GetDescriptor           ;6      ; 跳到GetDescriptor
        JMP     Tostallpipe0            ;7      ; 不作处理
        JMP     GetConfiguration        ;8      ; 跳到GetConfiguration
        JMP     SetConfiguration        ;9      ; 跳到SetConfiguration
        JMP     GetInterface            ;A      ; 跳到GetInterface(不作处理)
        JMP     SetInterface            ;B      ; 跳到SetInterface(不作处理)
        JMP     SynchFrame              ;C      ; 跳到SynchFrame(不作处理)

;------------------------------------------------------------------------------
; Remark : Set address(属於Standard request)
;------------------------------------------------------------------------------
SetAddressC:
        SZ      FIFO_wValueH            ; 检查是否wValueH == 0 ?
        JMP     ToStallPipe0            ; No: Error

        MOV     A,FIFO_wValueL          ; Save address to CMD_ADDR
        MOV     CMD_ADDR,A              ; CMD_ADDR=Host所指定的Device Address

        mov     a,USB_SIES              ;
        mov     mp1,a                   ;
        mov     a,00000001b             ; 将USB_SIES[45H]的bit0(Adr_set)设成1
        orm     a,R1                    ;
        
        rla     CMD_ADDR                ;
        AND     A,0FEH                  ;& save it
        MOV     FIFO_ADDR,A             ;Move address to adress buffer
        SZ      bRmtWakeup              ;Remote wakeup exist ?
        SET     FIFO_ADDR.0             ;Yes:Set remote wakeup flag
        MOV     A,USB_ADDR_WAKE         ;MP1 point to Address register
        MOV     MP1,A                   ;
        MOV     A,FIFO_ADDR             ; 将Host设定的device address和remote wakeup feature设定给USB_ADDR_WAKE
        MOV     R1,A                    ;
        
        sz      CMD_ADDR                ; 检查Host刚设定的CMD_ADDR是否为0
        set     baddr_state             ; 若CMD_ADDR不为0,则设baddr_state=1
        
        ;SET     bFLAG_FIFO_REDY         ; Host发出SetAddress command後,设定bFLAG_FIFO_REDY=1(Wait to write address)
        JMP     SendHandshake           ; 送出一个Zero-length packet到Host

;------------------------------------------------------------------------------
; Remark : Clear feature(属於Standard request)
;------------------------------------------------------------------------------
ClearFeature:
        SZ      FIFO_wValueH                    ; 检查是否wValueH == 0 ?
        JMP     ToStallPipe0                    ; No, Error

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

        MOV     A,FIFO_Type                     ; Type (Device, Interface or Endpoint)
        AND     A,Setup_Rev                     ; 取出RequestType的Recipient栏位(Setup_Rev=00011111B)
        MOV     TEMP,A                          ; TEMP=RequestType的Recipient栏位
;!!!!! Need in same page
        SUB     A,04H                           ; 检查是否Over 4 item?
        SZ      C                               ; No: Continue
        JMP     ToStallPipe0                    ; Yes: Error
        MOV     A,TEMP                          ;
clear_feature_pcl_5:
        ADDM    A,PCL                           ;
        JMP     DeviceStatusCF                  ; 处理Recipient=Device
        JMP     ToStallpipe0                    ; 不处理Recipient=Interface
        JMP     EndpointStatusCF                ; 处理Recipient=Endpoint
        JMP     ToStallPipe0                    ; 不处理Recipient=Other

        ;------------------------------------------------------------------------------
        ; Remark : Clear EndpointStatus feature(属於Standard request)--清除Endpoint的Stall flag
        ;------------------------------------------------------------------------------
EndpointStatusCF:
        SZ      FIFO_wValueL                    ; 检查是否FeatureSelector=(ENDPOINT_HALT=0)?
        JMP     ToStallPipe0                    ; No, Error

        MOV     A,FIFO_wIndexL                  ; 取得Endpoint number
        and     a,01111111b                     ;
        SUB     A,FIFO_temp                     ; 是否超过合法Endpoint number
        SZ      C                               ;
        JMP     ToStallPipe0                    ; Yes, Error

        MOV     A,FIFO_wIndexL                  ; ACC=取出Host所指定的Endpoint number
        ;Is it necessary to check endpoint number range ?
        AND     A,0FH                           ;
        call    GetPipeBit                      ;
        CALL    ClearStall                      ; 清除指定的Endpoint的Stall flag
        ;Is it necessary to check clear completely ?
        JMP     SendHandshake                   ; 送出一个Zero-length packet到Host

        ;------------------------------------------------------------------------------
        ; Remark : Clear DeviceStatus feature(属於Standard request)--清除Device的RemoteWakeup状态
        ;------------------------------------------------------------------------------
DeviceStatusCF:
        MOV     A,FIFO_wValueL                  ; 检查是否FeatureSelector=(DEVICE_REMOTE_WAKEUP=1)?
        XOR     A,01H                           ;
        SNZ     Z                               ;
        JMP     ToStallPipe0                    ; No, Error

        SZ      FIFO_wIndexL                    ; 检查是否wIndex == 0(代表device)?
        JMP     ToStallPipe0                    ; No, Error

        ;disable remote wakeup                  ; Yes
        CLR     bRmtWakeup                      ; Disable remote wakeup (flag)
        rla     cmd_addr                        ;
        and     a,11111110b                     ;
        mov     fifo_addr,a                     ;
        CLR     ADDR_Wake                       ; 清除remote wakeup flag(即fifo_addr.0)

        JMP     SetAddrWake                     ; 跳到SetAddrWake,将fifo_addr写入USB_ADDR_WAKE Register

;------------------------------------------------------------------------------
; Remark : Get status(属於Standard request)
;------------------------------------------------------------------------------
GetStatus:
        SNZ     FIFO_Type.@Setup_D              ; 检查是否Device to Host ?
        JMP     ToStallPipe0                    ; No: Error

        SZ      FIFO_wIndexH                    ; 检查是否wIndex == 0 ?
        JMP     ToStallPipe0                    ; No: Error

        MOV     A,FIFO_Type                     ; Type (Device, Interface or Endpoint)
        AND     A,Setup_Rev                     ; 取出RequestType的Recipient栏位
        MOV     TEMP,A                          ; TEMP=RequestType的Recipient栏位
        ;!!!!! Need in same page
        SUB     A,04H                           ; 检查是否Over 4 item ?
        SZ      C                               ; No: Continue

⌨️ 快捷键说明

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