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

📄 hid-kbd.asm

📁 MC68HC608JB8的固件例程源程序.zip
💻 ASM
📖 第 1 页 / 共 3 页
字号:
        bclr    b_RWakeup,V_Dev_Status    ; disable Device Remote Wakeup
        bra     SCF_EXIT
*
*
*
* --- Serve CLEAR_FEATURE/SET_FEATURE to Interface -----------------------
SCF_INTERFACE:
        bra     SCF_STALL
*
*
*
* --- Serve CLEAR_FEATURE/SET_FEATURE to Endpoint ------------------------
SCF_ENDPOINT:
        lda     V_wValue_L              ; Feature Selector
        KCMPNE  K_EP_STALL,SCF_STALL    ; = ~ENDPOINT_STALL request ?
*
        lda     V_bRequest
        KCMPEQ  K_CLR_FEATURE,SCF_EP_CLR  ; CLEAR_FEATURE request ?
*
*
* --- Serve SET_FEATURE to Endpoint ----------------------------
SCF_EP_SET:
        lda     V_wIndex_L              ; endpoint #
        KCMPEQ  $81,SCF_SET_EP1         ; endpoint #1 ?
        KCMPEQ  $82,SCF_SET_EP2         ; endpoint #2 ?
        bra     SCF_STALL
SCF_SET_EP1:
	brclr	b_CONFIG,V_Dev_State,SCF_STALL	; ~device in CONFIG?
        bset    b_STALL1,UCR1           ; stalled Epnt 1
        bra     SCF_EXIT
*
SCF_SET_EP2:
	brclr	b_CONFIG,V_Dev_State,SCF_STALL	; ~device in CONFIG?
        bset    b_STALL2,UCR2
        bra     SCF_EXIT
*
* --- Serve CLEAR_FEATURE to Endpoint --------------------------
SCF_EP_CLR:
        lda     V_wIndex_L              ; endpoint #
        KCMPEQ  $81,SCF_CLR_EP1         ; = Interrupt IN epnt 1 ?
        KCMPEQ	$82,SCF_CLR_EP2		; =  EP2
        and     #%00001111              ; neglect DIR bit
        beq     SCF_CLR_EP0             ;   = 0 ?
        bra     SCF_STALL

SCF_CLR_EP2:
        bclr    b_STALL2,UCR2           ; un-stalled EP2
        bra     SCF_EXIT

SCF_CLR_EP1:
        bclr    b_STALL1,UCR1           ; un-stalled EP1
        bra     SCF_EXIT

SCF_CLR_EP0:
        bclr    b_OSTALL0,UCR3           ; un-stalled EP0
        bclr    b_ISTALL0,UCR3

* ------------------------------------------------------------------------
SCF_EXIT:
        rts
*
*
*




* [Standard Device Request] ------------------------------------------- *
* SRQ_SET_CONFIG - serve SET_CONFIGURATION Request                      *
* In      : V_wValue_L      config. value                               *
* Out     : V_ConfigID      ID to select a config. descriptor           *
* Call    : ECHO_STALLED                                                *
* --------------------------------------------------------------------- *
SRQ_SET_CONFIG:
*
* --- Check Constant Fields ----------------------------------------------
* --- Check Constant Fields ----------------------------------------------
$IF CHK_UNSPECIFIED     ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        lda     V_wValue_H
        ora     V_wIndex_L
        ora     V_wIndex_H
        ora     V_wLength_L
        ora     V_wLength_H
        bne     SSC_STALL
$ENDIF                  ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
*
* --- Check Recipient ----------------------------------------------------
        lda     V_bmReqType
        beq     SSC_UpDate
;;        bne     SSC_STALL               ; recipient = ~device ?
*
* --- Echo Device Stalled -------
SSC_STALL:
        jsr     ECHO_STALLED
        bra     SSC_EXIT
*
*
* --- Change to Selected Configuration -----------------------------------
SSC_UPDATE:
        lda     V_wValue_L             ; config. ID
        beq     SSC_UNCONFIG
        CMPEQ   CFG_bCfgValue,SSC_CONFIG  ; config ID != CFG_bCfgValue ?
        bra     SSC_STALL
*
* --- Set Device to Unconfigured State --------------------------
SSC_UnConfig:
        clr     V_ConfigID
*
        jsr     Kbd_Address             ; bring keyboard from
                                        ;  CONFIG to ADDRESS state
        bra     SSC_EXIT
*
* --- Set Device to One of the Configured States -------------
SSC_Config:
        sta     V_ConfigID
        jsr     Kbd_Config              ; bring keyboard to CONFIG state
*
* ------------------------------------------------------------------------
SSC_EXIT:
        rts




* [Standard Device Request] ------------------------------------------- *
* SRQ_GET_CONFIG - serve GET_CONFIGURATION Request                      *
* In      : V_ConfigID      ID to select a config. descriptor           *
* Out     : <nil>                                                       *
* Call    : ECHO_STALLED, TRAN_IN                                       *
* Note    :- b_IN is set after IN transact started                      *
* --------------------------------------------------------------------- *
SRQ_GET_CONFIG:
*
* --- Check Constant Fields ----------------------------------------------
$IF CHK_UNSPECIFIED     ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        lda     V_wLength_H
        ora     V_wValue_L
        ora     V_wValue_H
        ora     V_wIndex_L
        ora     V_wIndex_H
        bne     SGC_STALL
*
        lda     V_wLength_L            ; data size != 1 byte ?
        KCMPNE  1,SGC_STALL
$ENDIF                  ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
*
* --- Check Recipient ----------------------------------------------------
        lda     V_bmReqType
        KCMPEQ  %10000000,SGC_RTN_DATA  ; recipient = device ?
*
*
* --- Echo Device Stalled ------------------------------------------------
SGC_STALL:
        jsr     ECHO_STALLED
        bra     SGC_EXIT
*
*
* --- Return Config. ID --------------------------------------------------
SGC_RTN_DATA:
        LMOV    V_ConfigID,{Q_Tx_Buf+0}  ; update USB Buffer Queue
*
        MOV     #$01,V_Tx_Size          ; negotiated data size=1 byte
        clr     V_Tx_Ptr
*
        MOV    #{Q_Tx_Buf/256},V_OFF_LDA_H  ; make D_LONG_IDX routine
        MOV    #{Q_Tx_Buf%256},V_OFF_LDA_L  ; point to QD_Tx_Buf
                                           ; (used in TRAN_TX routine)
*
        bset    b_IN,V_TRANSACT        ; IN transact started
        jsr     TRAN_IN                 ; force an IN transact
*
* ------------------------------------------------------------------------
SGC_EXIT:
        rts
*



* [Standard Device Request] ------------------------------------------- *
* SRQ_SET_IF - serve SET_INTERFACE Request                              *
* In      : <nil>                                                       *
* Out     : <nil>                                                       *
* Call    : <nil>                                                       *
* --------------------------------------------------------------------- *
SRQ_SET_IF:
        brclr   b_CONFIG,V_Dev_State,SSI_STALL     ; ~device in CONFIG ?

* --- Check Constant Fields ----------------------------------------------
        lda     V_wValue_H
        ora     V_wIndex_H
$IF CHK_UNSPECIFIED     ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        ora     V_wLength_L
        ora     V_wLength_H
$ENDIF                  ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        bne     SSI_STALL
*
*
* --- Check Recipient ----------------------------------------------------
        lda     V_bmReqType
        KCMPNE  %00000001,SSI_STALL		; recipient = ~device ?
*
*
        lda     V_wIndex_L				; Interface # = 0,1 ?
		beq		IFS_S_IF0				; = IF0 ?
		cbeqa	#1,ITS_S_IF1			; = IF1 ?

		bra	SSI_STALL
*
IFS_S_IF0:
ITS_S_IF1:
        lda     V_wValue_L		; Only Default Setting supported
        beq     SSI_UPDATE              ; Alt. Setting = 0 ?
*
*
* --- Echo Device Stalled ------------------------------------------------
SSI_STALL:
        jsr     ECHO_STALLED
        bra     SSI_EXIT
*
*
* --- Update I/F Alternate Setting # -------------------------------------
SSI_UPDATE:
;; (no Alt. Setting)
*
        bclr    b_STALL1,UCR1           ; un-stalled EP1
        bclr    b_STALL2,UCR2           ; un-stalled EP2
*
* ------------------------------------------------------------------------
SSI_EXIT:
        rts



* [Standard Device Request] ------------------------------------------- *
* SRQ_GET_IF - serve GET_INTERFACE Request                              *
* In      : <nil>                                                       *
* Out     : <nil>                                                       *
* Call    : ECHO_STALLED, TRAN_IN                                       *
* --------------------------------------------------------------------- *
SRQ_GET_IF:
        brclr   b_CONFIG,V_Dev_State,SGI_STALL     ; ~device in CONFIG state ?

* --- Check Constant Fields ----------------------------------------------
        lda     V_wIndex_H
$IF CHK_UNSPECIFIED     ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        ora     V_wLength_H
        ora     V_wValue_L
        ora     V_wValue_H
$ENDIF                  ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        bne     SGI_STALL
*
$IF CHK_UNSPECIFIED     ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        lda     V_wLength_L            ; data size != 1 byte ?
        KCMPNE  1,SGI_STALL
$ENDIF                  ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
*
* --- Check Recipient ----------------------------------------------------
        lda     V_bmReqType
        KCMPNE  %10000001,SGI_STALL     ; recipient = ~device ?
*
        lda     V_wIndex_L              ; Interface # ?
		beq	SGI_RTN_DATA		; = 0 ?
        cbeqa	#1,SGI_RTN_DATA		; = 1 ?
;        beq     SGI_RTN_DATA
*
*
* --- Echo Device Stalled ------------------------------------------------
SGI_STALL:
        jsr     ECHO_STALLED
        bra     SGI_EXIT
*
* --- Return I/F Setting Byte --------------------------------------------
SGI_RTN_DATA:
;; (no Alt. Setting)
        clra
        clr     {Q_Tx_Buf+0}            ; always return 0
*
        MOV     #$01,V_Tx_Size           ; negotiated data size=1 byte
        clr     V_Tx_Ptr
*
        MOV     #{Q_Tx_Buf/256},V_OFF_LDA_H  ; make LONG_IDX routine
        MOV     #{Q_Tx_Buf%256},V_OFF_LDA_L  ; point to Q_Tx_Buf
                                        ; (used in TRAN_TX routine)
*
        bset    b_IN,V_TRANSACT         ; IN transact started
        jsr     TRAN_IN                 ; force an IN transact
;        bra     SGI_EXIT
*
*
*
* ------------------------------------------------------------------------
SGI_EXIT:
        rts




* [Standard Device Request] ------------------------------------------- *
* SRQ_SET_ADDRESS - serve SET_ADDRESS Request                           *
* In      : V_wValue_L      new device address (cannot be zero)         *
* Out     : b_UpdAddr       =0      no pending address update           *
*                           =1      update device addr after IN Status  *
* Call    : ECHO_STALLED                                                *
* --------------------------------------------------------------------- *
SRQ_SET_ADDRESS:
*
* --- Check Constant Fields ----------------------------------------------
* - ensure that V_wIndex_L/H, V_wLength_L/H & V_wValue_H are zero
*
$IF CHK_UNSPECIFIED     ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        lda     V_wValue_H
        ora     V_wIndex_L
        ora     V_wIndex_H
        ora     V_wLength_L
        ora     V_wLength_H
        bne     SSA_STALL
$ENDIF                  ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
*
* --- Check Recipient ----------------------------------------------------
        lda     V_bmReqType
        beq     SSA_UPDATE              ; recipient = device ?
*
*
* --- Echo Device Stalled ------------------------------------------------
SSA_STALL:
        jsr     ECHO_STALLED
        bra     SSA_EXIT
*
*
* --- Prepare to Set Address ---------------------------------------------
SSA_UPDATE:
        bset    b_UpdAddr,V_Dev_Status   ; update device addr
*
* ------------------------------------------------------------------------
SSA_EXIT:
        rts




⌨️ 快捷键说明

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