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

📄 hid-kbd.asm

📁 MC68HC608JB8的固件例程源程序.zip
💻 ASM
📖 第 1 页 / 共 3 页
字号:
* [Standard Device Request] ------------------------------------------- *
* SRQ_GET_STATUS - serve GET_STATUS Request                             *
* In      : <nil>                                                       *
* Out     : <nil>                                                       *
* Call    : ECHO_STALLED, TRAN_IN                                       *
* Note    :- b_IN is set after IN transact started                      *
* --------------------------------------------------------------------- *
SRQ_GET_STATUS:
*
* --- Check Constant Fields ----------------------------------------------
$IF CHK_UNSPECIFIED     ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        lda     V_wValue_L
        ora     V_wValue_H
        ora     V_wLength_H
        bne     SGS_STALL
*
        lda     V_wLength_L            ; data size != 2 byte ?
        KCMPNE  2,SGS_STALL
$ENDIF                  ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
*
* --- Check Recipient ----------------------------------------------------
        lda     V_bmReqType
        KCMPEQ  %10000000,SGS_DEVICE    ; recipient = device ?
        KCMPEQ  %10000001,SGS_INTERFACE ;           = interface ?
        KCMPEQ  %10000010,SGS_ENDPOINT  ;           = endpoint ?

* --- Echo Device Stalled ------------------------------------------------
SGS_STALL:
        jsr     ECHO_STALLED
	bra	SGS_Exit
*
*
*
*
* --- Serve GET_STATUS to Device -----------------------------------------
SGS_DEVICE:
$IF CHK_UNSPECIFIED     ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        lda     V_wIndex_L
        ora     V_wIndex_H
        bne     SGS_STALL
$ENDIF
        lda     V_Dev_Status              ; return b_SelPwr & b_RWakeup
        and     #%00000011
        sta     {Q_Tx_Buf+0}
*
        clr     {Q_Tx_Buf+1}
*
        bra     SGS_TXDATA
*
*
*
* --- Serve GET_STATUS to Interface --------------------------------------
SGS_INTERFACE:
        lda     V_wIndex_L             ; Interface #
        ora     V_wIndex_H
        KCMPEQ	1,SGS_IF1
        bne     SGS_STALL               ;   = 0 ?
*
SGS_IF1:
        clra
        sta     {Q_Tx_Buf+0}
        sta     {Q_Tx_Buf+1}
*
        bra     SGS_TXDATA
*
*
* --- Serve GET_STATUS to Endpoint ---------------------------------------
SGS_ENDPOINT:
        lda     V_wIndex_H
        bne     SGS_STALL
*
        lda     V_wIndex_L             ; Endpoint #
        KCMPEQ  $81,SGS_EP1             ;   = Interrupt IN Epnt 1 ?
        KCMPEQ	$82,SGS_EP2		;   = Interrupt IN Epnt 2 ?
        and     #%00001111              ;   (neglect DIR bit)
        beq     SGS_EP0                 ;   = Control Epnt 0 ?
        bra     SGS_STALL
*
* --- Return Endpoint 1 STALL status -------------
SGS_EP1:
        brclr   b_CONFIG,V_Dev_State,SGS_STALL  ; ~device in CONFIG state ?
*
        clra
        brclr   b_STALL1,UCR1,SGS_EP1_NOSTALL
SGS_EP1_STALL:
        lda     #$01                    ; signal stalled status
SGS_EP1_NOSTALL:
        sta     {Q_Tx_Buf+0}
*
        clra
        sta     {Q_Tx_Buf+1}
*
        bra     SGS_TXDATA
*
*
* --- Return Endpoint 1 STALL status -------------
SGS_EP2:
        brclr   b_CONFIG,V_Dev_State,SGS_STALL  ; ~device in CONFIG state ?
*
        clra
        brclr   b_STALL2,UCR2,SGS_EP2_NOSTALL
SGS_EP2_STALL:
        lda     #$01                    ; signal stalled status
SGS_EP2_NOSTALL:
        sta     {Q_Tx_Buf+0}
*
        clra
        sta     {Q_Tx_Buf+1}
*
        bra     SGS_TXDATA
*
* --- Return Endpoint 0 STALL status -------------
;; (if Epnt 0 stalled, no echo for GET_STATUS request)
SGS_EP0:
        clra
        sta     {Q_Tx_Buf+0}
        sta     {Q_Tx_Buf+1}
*
*
*
* --- Initialize IN Data Stage -------------------------------------------
SGS_TXDATA:
        MOV     #$02,V_Tx_Size          ; negotiated data size=2 bytes
        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
*
*
* ------------------------------------------------------------------------
SGS_EXIT:
        rts



* [Standard Device Request] ------------------------------------------- *
* SRQ_SYNC_FRAME - serve SYNCH_FRAME Request                            *
*                  (this option is NOT supported)                       *
* In      : <nil>                                                       *
* Out     : <nil>                                                       *
* Call    : ECHO_STALLED                                                *
* Note    :- call to unsupported request will cause device stalled.     *
* --------------------------------------------------------------------- *
SRQ_SYNC_FRAME:
;;        jsr     ECHO_STALLED
*
*
*
* ------------------------------------------------------------------------
SSF_EXIT:
        rts




* [Standard Device Request] ------------------------------------------- *
* SRQ_SET_DESC - serve SET_DESCRIPTOR Request                           *
*                (this option is NOT supported)                         *
* In      : <nil>                                                       *
* Out     : <nil>                                                       *
* Call    : ECHO_STALLED                                                *
* Note    :- call to unsupported request will cause device stalled.     *
* --------------------------------------------------------------------- *
SRQ_SET_DESC:
        bra     SSD_STALL               ; Request NOT supported
;; (SET_DESCRIPTOR not supported)
;;*
;;* --- Check Parameters ---------------------------------------------------
;;        lda     V_bmReqType
;;        bne     SSD_STALL               ; recipient = ~device ?
;;*
;;        lda     V_wValue_H
;;        KCMPHI  5,SSD_STALL             ; unsupported Desc. Type ?
;;*
;;;; (already checked in TSP_OUT routine)
;;        lda     V_wLength_L
;;        beq     SSD_STALL               ; Rx bytes = 0 ?
;;;; (already checked in TSP_OUT routine)
;;;;        cmp     #K_Buf_Size
;;;;        bhi     TSP_STALL               ; Rx bytes > buffer size ?
;;*
;;        bclr    b_data,V_PROCESS        ; process after OUT Data Rxd
;;*
;;        bra     SSD_EXIT
*
* --- Echo Device Stalled ------------------------------------------------
SSD_STALL:
;;        jsr     ECHO_STALLED
*
* ------------------------------------------------------------------------
SSD_EXIT:
        rts




* [Standard Device Request] ------------------------------------------- *
* SRQ_GET_DESC - serve GET_DESCRIPTOR Request                           *
* In      : <nil>                                                       *
* Out     : <nil>                                                       *
* Call    : ECHO_STALLED, TRAN_IN                                       *
* Note    :- only support GET_DESC request for DEVICE, CONFIG, STRING,  *
*            HID, & REPORT Desc.                                        *
*          - for GET_DESC request of Config Desc., it returns the       *
*            Config Desc., all I/F Desc., all HID Desc., and all        *
*            Endpoint Desc.                                             *
*          - b_IN is set after IN transact started                      *
* --------------------------------------------------------------------- *
SRQ_GET_DESC:
*
* --- Check Constant Fields ----------------------------------------------
        lda     V_wLength_H
        beq     SGD_NOVERFLOW
        MOV     #$FF,V_wLength_L        ; signal req. data size overflow
SGD_NOVERFLOW:
*
*
* --- Check Recipient ----------------------------------------------------
        brclr   b_Dir,V_bmReqType,SGD_STALL ; ~device-to-host ?
*
        lda     V_bmReqType
        and     #%00011111
        KCMPEQ  0,SGD_DEVICE            ; recipient = device ?
        KCMPEQ  1,SGD_IFACE             ; recipient = interface ?
        KCMPEQ  2,SGD_EPNT              ; recipient = endpoint ?
        bra     SGD_STALL               ; ~recipient = device ?
*
*
*
* --- Serve GET_DESC for DEVICE Recipient --------------------------------
SGD_DEVICE:
*
* --- Check Descriptor Type(for DEVICE) ------------------------

        lda     V_wValue_H
        KCMPEQ  K_DType_DEV,SGD_DESC_DEVICE  ; get Device Desc. ?
        KCMPEQ  K_DType_CFG,SGD_DESC_CONFIG  ; get Config Desc. ?
        KCMPEQ  K_DType_STG,SGD_DESC_STRING  ; get String Desc. ?
        bra     SGD_STALL
*
*
*
* --- Serve GET_DESC for DEVICE Desc. ------------------------------------
SGD_DESC_DEVICE:
* (no Lang ID)
        lda     V_wIndex_L		; Lang. ID should be zero
        ora     V_wIndex_H
        bne     SGD_STALL
*
* --- Init. LONG_IDX point to DEVICE_DESC queue ---
        LMOV    DEV_bLength,V_Tx_Size
*
        mov     #{DEVICE_DESC/256},V_OFF_LDA_H      ; make LONG_IDX routine
        mov    #{DEVICE_DESC%256},V_OFF_LDA_L      ; point to DEVICE_DESC queue
*                                               ; (used in TRAN_TX routine)
        jmp     SGD_TX_INIT
*
*
*
* --- Serve GET_DESC for CONFIG Desc. ------------------------------------
SGD_DESC_CONFIG:
* (no Lang ID)
        lda     V_wIndex_L		; Lang. ID should be zero
        ora     V_wIndex_H
        bne     SGD_STALL
*
* --- Init. LONG_IDX point to CONFIG_DESC queue ---
        LMOV    CFG_wTotLength,V_Tx_Size
*
        MOV     #{CONFIG_DESC/256},V_OFF_LDA_H  ; make LONG_IDX routine
        MOV     #{CONFIG_DESC%256},V_OFF_LDA_L  ; point to CONFIG_DESC queue
*                                               ; (used in TRAN_TX routine)
        jmp     SGD_TX_INIT
*
*
*
* --- Serve GET_DESC for STRING Desc. ------------------------------------
SGD_DESC_STRING:
;;        lda     V_wIndex_L
;;        CMPNE   STG0_bString,SGD_STALL  ; diff. Lang ID ?
*
        lda     V_wValue_L
        KCMPHI  {STG_PTR_NUM-1},SGD_STALL  ; invalid desc. idx ?
*
* --- Init. LONG_IDX point to STRING_DESC[V_wValue_L] queue -------------
        lsla
        tax
*
        lda     STG_PTR_TABLE,x         ; make LONG_IDX routine
        sta     V_OFF_LDA_H                 ; point to STRING_DESC[
        lda     {STG_PTR_TABLE+1},x     ; V_wValue_L] queue
        sta     V_OFF_LDA_L                 ; (used in TRAN_TX routine)
*
		ldhx	V_OFF_LDA_H
		lda		,x
		sta		V_Tx_Size
		clrh

;        clrx                            ; get desc. size
;        MOV     #V_Tx_Size,V_OFF_STA
;        jsr     LONG_IDX

        bra     SGD_TX_INIT
*
*
*
* --- Serve GET_DESC for INTERFACE Recipient -----------------------------
SGD_IFACE:
* --- Check Interface # ----------------------------------------
        lda     V_wIndex_L             ; Interface #
        beq     SGD_IFACE_0             ;  = 0 ?
	KCMPEQ	1,SGD_IFACE_1		;  = 1 ?

* --- Echo Device Stalled ------------------------------------------------
* (placed here to enable 8-bit "BRA SGD_STALL" instructions in
*  SRQ_GET_DESC routine)
SGD_STALL:
        jsr     ECHO_STALLED
        bra     SGD_EXIT
*
*
* --- Serve GET_DESC for ENDPOINT Recipient ------------------------------
SGD_EPNT:
*
* --- Check Endpoint # -----------------------------------------
        lda     V_wIndex_L             ; Endpoint #
        and     %00001111               ; neglect endpoint direction
        beq     SGD_EPNT_1              ;  = 0 ?
        KCMPEQ  1,SGD_EPNT_1            ;  = 1 ?
        KCMPEQ	2,SGD_EPNT_2		;  = 2 ?
        bra     SGD_STALL
*
*
* --- Check Descriptor Type(for Keyboard INTERFACE/ENDPOINT) -------------
SGD_IFACE_0:
SGD_EPNT_1:
        lda     V_wValue_H
        KCMPEQ  K_DType_HID,SGD_DESC_HID0  ; get HID Desc. ?      目
        KCMPEQ  K_DType_RPT,SGD_DESC_RPT0  ; get Report Desc. ?    

⌨️ 快捷键说明

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