📄 std1.asm
字号:
include ht82k96e.inc
include usbrf.inc
include usbfifo.inc
extern baddr_state :bit
extern bFLAG_FIFO_REDY :bit
extern bRmtWakeup :bit
extern bFLAG_RsqF :bit
extern bFLAG_SndFC :bit
extern bFLAG_HvRpt :bit
extern brd_h_table :bit
extern bCfgValue :bit
extern bwait_setup :bit
extern int_temp1 :byte
extern int_temp2 :byte
fifo_temp EQU int_temp1
FIFO_ADDR equ int_temp1
ADDR_Wake equ fifo_addr.0
temp equ int_temp2
extern STALL :byte
;extern Wtotallength :near
;extern bNumberInterface :near
extern des_count :byte
extern FIFO_Request :byte
extern FIFO_wValueH :byte
extern FIFO_wValueL :byte
extern CMD_ADDR :byte
extern FIFO_wIndexH :byte
extern FIFO_Type :byte
;extern TEMP :byte
extern FIFO_wIndexL :byte
extern FIFO_OUT1 :byte
extern fifo_out2 :byte
extern ReturnAddr :byte
extern FIFO_SendLen :byte
extern TableLength :byte
extern FIFO_wLengthH :byte
extern FIFO_wLengthL :byte
;extern AltkbSetting :byte
;extern altmousesetting :byte
extern lengthh :byte
extern lengthl :byte
extern FIFO_TBLP :byte
Extern ExitExt:near
EXTERN ToStallPipe0:NEAR
EXTERN RequestResponse:NEAR
EXTERN SendHandshake:NEAR
EXTERN GetPipeBit:NEAR
EXTERN SendFIFOOut:NEAR
EXTERN ClearStall:NEAR
EXTERN SetStall:NEAR
EXTERN DeviceD:NEAR
EXTERN ConfigurationD:NEAR
EXTERN InterfaceD_0:NEAR
EXTERN EndpointD_0:NEAR
EXTERN HID_0:NEAR
EXTERN Entity_0:NEAR
EXTERN InterfaceD_1:NEAR
EXTERN EndpointD_1:NEAR
EXTERN HID_1:NEAR
EXTERN Entity_1:NEAR
;EXTERN InterfaceD_2:NEAR
;EXTERN EndpointD_2:NEAR
;EXTERN HID_2:NEAR
;EXTERN Entity_2:NEAR
extern LangID:near
extern ManufactureS:near
extern ProductS:near
STD1 .SECTION AT 00DH 'code'
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
get_Interface_des_adr:
mov a,des_count
get_interface_pcl_3:
addm a,pcl
ret a,LOW InterfaceD_0
ret a,LOW InterfaceD_1
;-----------------------------------------------------------------------------------
get_HID_des_adr:
mov a,des_count
get_HID_pcl_3:
addm a,pcl
ret a,LOW HID_0
ret a,LOW HID_1
;-----------------------------------------------------------------------------------
get_endpt_des_adr:
mov a,des_count
get_endpt_pcl_3:
addm a,pcl
ret a,LOW EndpointD_0
ret a,LOW EndpointD_1
;-----------------------------------------------------------------------------------
get_entity_des_adr:
mov a,des_count
get_entity_pcl_3:
addm a,pcl
ret a,LOW Entity_0
ret a,LOW Entity_1
;-----------------------------------------------------------------------------------
get_entity_length:
mov a,des_count
get_entity_len_pcl_3:
addm a,pcl
ret a,Entity_Length_0
ret a,Entity_Length_1
;-----------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------
;no implement STD command
GetInterface:
JMP ToStallPipe0 ;No:Error
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SetInterface:
jmp TOstallpipe0
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SynchFrame: ;No support
JMP ToStallPipe0
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;-----------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GetConfiguration:
;Check bmRequestType direction
SNZ FIFO_Type.@Setup_D ;device to host ?
JMP ToStallPipe0 ;No:Error
clr FIFO_out1
sz bcfgvalue
set FIFO_OUT1.0 ;to FIFO
MOV A,01H ;Send length = 1
jmp SendFIFOOut
; MOV FIFO_SendLen,A ;
; jmp RequestResponse
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;----- Standard request -----------------------------------------------------
StandardRequest:
mov a,1
snz baddr_state
mov a,ENDPOINT_NO
mov fifo_temp,a
MOV A,FIFO_Request ;bRequest
SUB A,STANDARD_REQUEST_NO ;Over 13 Item ?
SZ C ;
JMP ToStallPipe0 ;Yes
MOV A,FIFO_Request
;!!!!! Need in same page
std_request_pcl_14:
ADDM A,PCL
JMP GetStatus ;0
JMP ClearFeature ;1
JMP ToStallPipe0 ;2
JMP SetFeature ;3
JMP ToStallPipe0 ;4
JMP SetAddressC ;5
JMP GetDescriptor ;6
JMP Tostallpipe0 ;7
JMP GetConfiguration ;8
JMP SetConfiguration ;9
JMP GetInterface ;A
JMP SetInterface ;B
JMP SynchFrame ;C
;////////////////////////////////////////////////////////////////////////////
;Standard Request
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SetAddressC:
SZ FIFO_wValueH ;Is wValueH == 0 ?
JMP ToStallPipe0 ;No:Error
MOV A,FIFO_wValueL ;Save address to CMD_ADDR
MOV CMD_ADDR,A ;
SET bFLAG_FIFO_REDY ;Wait to write address
JMP SendHandshake
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ClearFeature:
SZ FIFO_wValueH ;wValueH == 0 ?
JMP ToStallPipe0 ;No
SZ FIFO_wIndexH ;wIndexH == 0 ?
JMP ToStallPipe0 ;No
MOV A,FIFO_Type ;Type (Device, Interface or
AND A,Setup_Rev ; Endpoint)
MOV TEMP,A
;!!!!! Need in same page
SUB A,04H ;Over 4 item ?
SZ C ;
JMP ToStallPipe0 ;Yes
MOV A,TEMP
clear_feature_pcl_5:
ADDM A,PCL
JMP DeviceStatusCF
JMP TOstallpipe0
JMP EndpointStatusCF
JMP ToStallPipe0
;-----------------------------------------------------------------------------------
EndpointStatusCF: ;clear stall flag
;Check Feature Selector
SZ FIFO_wValueL ;ENDPOINT_STALL = 0 ?
JMP ToStallPipe0 ;No
;Check Endpoint Number
; snz fifo_windexL.7
; jmp ToStallpipe0
MOV A,FIFO_wIndexL ;Get endpoint number
and a,01111111b
SUB A,FIFO_temp
SZ C
JMP ToStallPipe0
MOV A,FIFO_wIndexL
;Is it necessary to check endpoint number range ?
AND A,0FH ;Ignore direction
call GetPipeBit
CALL ClearStall ;Clear endpoint stall
;Is it necessary to check clear completely ?
JMP SendHandshake ;send handshake flag
;-----------------------------------------------------------------------------------
DeviceStatusCF:
;Check Feature Selector
MOV A,FIFO_wValueL ;DEVICE_REMOTE_WAKEUP = 1 ?
XOR A,01H ;
SNZ Z ;
JMP ToStallPipe0 ;No
SZ FIFO_wIndexL ;Is wIndex == 0 ?
JMP ToStallPipe0 ;No
;disable remote wakeup ;Yes
CLR bRmtWakeup ;disable remote wakeup (flag)
rla cmd_addr
and a,11111110b
mov fifo_addr,a
CLR ADDR_Wake ;Clear remote wakeup flag
JMP SetAddrWake ;send handshake flag
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GetStatus:
;Check bmRequestType direction
SNZ FIFO_Type.@Setup_D ;Device to Host ?
JMP ToStallPipe0 ;No: Error
SZ FIFO_wIndexH ;Is wIndex == 0 ?
JMP ToStallPipe0 ;No
MOV A,FIFO_Type ;Type (Device, Interface or
AND A,Setup_Rev ; Endpoint)
MOV TEMP,A
;!!!!! Need in same page
SUB A,04H ;Over 4 item ?
SZ C ;
JMP ToStallPipe0 ;Yes
MOV A,TEMP
get_status_pcl_5:
ADDM A,PCL
JMP DeviceStatusS
JMP InterfaceStatusS
JMP EndpointStatusS
JMP ToStallPipe0
;-----------------------------------------------------------------------------------
EndpointStatusS:
MOV A,FIFO_wIndexL
and a,01111111b
SUB A,fifo_temp
SZ C
JMP ToStallPiPe0
;Don't care direction, maybe it's neccesary.
MOV A,0FH ;Ignore direction (D7)
AND A,FIFO_wIndexL ;get stall pipe number
CALL GetPipeBit ;and transform to bitmap
MOV FIFO_TEMP,A
MOV A,STALL ;get stall status into ACC
ShiftLoop:
RRC FIFO_TEMP ;Shift stall bit to D0
SZ C ;
JMP FoundStall ;
RR ACC ;
JMP ShiftLoop ;
FoundStall:
AND A,01H ;mask bits except stall bit
JMP SendEndpointStsS ;Send endpoint status
;-----------------------------------------------------------------------------------
DeviceStatusS:
SZ FIFO_wIndexL ;Is wIndex == 0 ?
JMP ToStallPipe0 ;No
clr acc
sz bRmtwakeup
set acc.1
SendEndpointStsS:
MOV FIFO_OUT1,A ;low byte
CLR FIFO_OUT2 ;high byte = 00H
MOV A,02H ;data length = 2
JMP SendFIFOOut ;Send it
;-----------------------------------------------------------------------------------
InterfaceStatusS:
sz baddr_state
jmp TOstallpipe0
MOV A,FIFO_wIndexL
SUB A,INTERFACE_NO ;Over 2 Interface ?
SZ C ;
JMP ToStallPipe0 ;Yes
;No Matter which Interface
CLR FIFO_OUT1 ;low byte = 00H
CLR FIFO_OUT2 ;high byte = 00H
MOV A,02H ;data length = 2
JMP SendFIFOOut ;Send it
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;Get string descriptor
GetStringDes:
SZ FIFO_wIndexH
JMP get_other_string
;FIFO_wIndexL = Language ID
sz fifo_windexl
jmp get_other_string
sz fifo_wvaluel
jmp tostallpipe0
get_string:
mov a,fifo_wvaluel
sub a,3
sz c
jmp Tostallpipe0
mov a,low LangID ;00
sz fifo_wvaluel.0
mov a,low ManufactureS ;01
sz fifo_wvaluel.1
mov a,low ProductS ;10
MOV TBLP,A ;
JMP ReadTableAndSendcnf ;Read Device table and send it
get_other_string:
mov a,fifo_windexH
xor a,LAND_ID_H
snz z
jmp ToStallPipe0
mov a,fifo_windexl
xor a,LAND_ID_L
snz z
jmp TOStallpipe0
jmp get_string
;Standard--------------------------------------------------------------------
;Get device descriptor
std_des_start_pcl:
GetDeviceDes:
SZ FIFO_wIndexH
JMP ToStallPipe0
SZ FIFO_wIndexL
JMP ToStallPipe0
MOV A,LOW DeviceD ;Set table pointer to device
MOV TBLP,A ; table
JMP ReadTableAndSendcnf ;Read Device table and send it
;----------------------------------------------------------------------------------------------
;(Configuration, interface & endpoint) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
GetConfigurationDes:
;Configuration
SZ FIFO_wIndexH
JMP ToStallPipe0
SZ FIFO_wIndexL ;report ID 0 ?
JMP ToStallPipe0 ;
MOV A,LOW ConfigurationD ;Set table pointer to
MOV TBLP,A ;configuration
MOV A,LOW GetInterfaceDes ;Save Return Address
MOV ReturnAddr,A ;to ReturnAddr
JMP ReadTableAndSendCnf ;Read configuration table
;and send it
;----------------------------------------------------------------------------------------------
GetInterfaceDes:
;Interface
call get_Interface_des_adr
MOV TBLP,A ;configuration
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -