📄 hid-kbd.asm
字号:
* [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 + -