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