📄 cls1.asm
字号:
include HT82K96e.inc
include usbrf.inc
EXTERN bCMD_INDEX :BIT
extern bAltkbProtocol :bit
extern baltmouseprotocol :bit
extern TempKBTime :byte
extern TempmouseTime :byte
extern TempKBTime_L :byte
extern TempmouseTime_L :byte
extern fifo_type :byte
extern FIFO_Request :byte
extern fifo_wIndexl :byte
extern FIFO_wIndexH :byte
extern FIFO_wValueL :byte
extern FIFO_wValueH :byte
extern FIFO_wLengthH :byte
extern FIFO_wLengthL :byte
extern INT_temp2 :byte
extern FIFO_OUT1 :byte
extern FIFO_SendLen :byte
extern ReportkbTime :byte
extern ReportMouseTime :byte
extern MoveMouseData :near
Extern ExitExt :near
EXTERN ToStallPipe0 :NEAR
EXTERN RequestResponse :NEAR
EXTERN SendHandshake :NEAR
TEMP EQU INT_TEMP2
;CLS1 .SECTION AT 1d6H 'code'
CLS1 .SECTION AT 1E0H 'code'
;------------------------------------------------------------------------------
; Remark : Get report (属於Class-specific request)
;------------------------------------------------------------------------------
GetReport: ; Report_type, Report_ID=0, Report_Length
SNZ FIFO_Type.@Setup_D ; 检查是否device to host ?
JMP ToStallPipe0 ; No:Error
MOV A,FIFO_wValueH ; Get report type (Only 3 kind)
SUB A,REPORT_TYPE_NO ; 检查是否超过3种?(REPORT_TYPE_NO=4)
SZ C ;
JMP ToStallPipe0 ; Yes,Error
MOV A,FIFO_wValueH ; ACC=FIFO_wValueH(=Report Type)
get_report_pcl_5:
ADDM A,PCL ;
JMP ToStallPipe0 ; No this report type
JMP GetInputReport ; 跳到处理GetInputReport
JMP Tostallpipe0 ; 不处理Output report
GetFeatureReport:
JMP ToStallPipe0 ; 不处理Feature report
;----------------------------------------------------------------------------
; Remark : 根据Interface number将device状态放到FIFO_OUTx
;----------------------------------------------------------------------------
GetInputReport:
SZ FIFO_wLengthH ; 检查是否wLength=0?
JMP ToStallPipe0 ; No,Error
mov a,FIFO_wIndexL ; ACC=FIFO_wIndexL(=Interface Number)
get_input_pcl_4:
addm a,pcl ;
jmp get_KB_input ; 跳到get_KB_input
jmp get_mouse_input ; 跳到get_mouse_input
;----- Class-Specific request -----------------------------------------------
;------------------------------------------------------------------------------
; Remark : 处理Class-specific的request
;------------------------------------------------------------------------------
ClassRequest:
MOV A,FIFO_Type ; (Setup_Rev=1FH)
AND A,Setup_Rev ; 取出Recipient(device,interface,endpoint或other)
MOV TEMP,A ;
SUB A,04H ; 检查是否超过4项?
SZ C ;
JMP ToStallPipe0 ; Yes, Error
MOV A,TEMP ; No
class_request_pcl_5:
ADDM A,PCL ;
JMP ToStallPipe0 ; 若Recipient=Device(不可能,HID class request没有对device)
JMP InterfaceRev ; 若Recipient=Interface
JMP EndpointRev ;? 若Recipient=Endpoint
JMP ToStallPipe0 ; Invalid Other
EndpointRev:
sz fifo_wIndexL.7 ;? 检查fifo_wIndexL(Direction bit)是否为0
clr fifo_wIndexL.7 ;? No,将fifo_wIndexL(Direction bit)清为0
InterfaceRev:
SZ FIFO_wIndexH ; 检查fifo_wIndexH是否为0?
JMP ToStallPipe0 ; No, Error
MOV A,FIFO_wIndexL ; FIFO_wIndexL=Interface Number
SUB A,INTERFACE_NO ; 检查是否FIFO_wIndexL(即Interface Number)大於2
SZ C ;
JMP ToStallPipe0 ; Yes, Error
;Check bRequest
MOV A,FIFO_Request ; bRequest
SUB A,CLASS_REQUEST_NO ; 检查Class request是否Over 12 item ?
SZ C ;
JMP ToStallPipe0 ; Yes, Error
MOV A,FIFO_Request ; ACC=取出Request
;!!!!! Need in same page
class_cmd_pcl_13:
ADDM A,PCL ;
JMP ToStallPipe0 ; 0:不处理
JMP GetReport ; 1:跳去处理GetReport
JMP GetIdle ; 2:将一个byte的Idle rate回传给Host
JMP GetProtocol ; 3
JMP ToStallPipe0 ; 4:不处理
JMP ToStallPipe0 ; 5:不处理
JMP ToStallPipe0 ; 6:不处理
JMP ToStallPipe0 ; 7:不处理
JMP ToStallPipe0 ; 8:不处理
JMP SetReport ; 9
JMP SetIdle ; A
JMP SetProtocol ; B
;;/////////////Class Specific Request/////////////////////////////////////////
;----------------------------------------------------------------------------
; Remark : 设定FIFO_SendLen,将固定长度的data传送出去
;----------------------------------------------------------------------------
ReportVL:
MOV FIFO_OUT1,A ;
MOV A,KB_OUTPUT_SIZE ; 检查是否FIFO data length=KB_OUTPUT_SIZE(=1)
ReportL:
MOV FIFO_SendLen,A ; 设定FIFO_SendLen
ReportIt:
jmp RequestResponse ; 跳到RequestResponse,将固定长度的data传送出去
;------------------------------------------------------------------------------
; Remark : Get idle (属於Class-specific request)
;------------------------------------------------------------------------------
GetIdle: ;Report_ID=0,
SNZ FIFO_Type.@Setup_D ; 检查是否Device to host ?
JMP ToStallPipe0 ; No, Error
SZ FIFO_wValueH ; 检查是否FIFO_wValueH=0
JMP ToStallPipe0 ; No, Error
SZ FIFO_wLengthH ; 检查是否wLengthH=0
JMP ToStallPipe0 ; No, Error
MOV A,FIFO_wLengthL ; 检查是否wLengthL=1?
XOR A,01H ;
SNZ Z ;
JMP ToStallPipe0 ; No, Error
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -