📄 standard_request.asm
字号:
;;Established date: 2006/03/01
;;********************************************************************
L_Standardrequest:
MOV A,1H
SZ F_AddressStatus
MOV A,2H
MOV M_EndpointNO,A
MOV A,T_RequestNUM
SUB A,0DH
SZ C
JMP L_Stallpipe0
MOV A,T_RequestNUM
ADDM A,PCL
JMP L_GetStatus ;;0 ;wang
JMP L_ClearSetFeature ;;1 ;wang
JMP L_StallPipe0 ;;2 ;wang
JMP L_ClearSetFeature ;;3 ;wang
JMP L_StallPipe0 ;;4 ;wang
JMP L_SetAddress ;;5
JMP L_GetDescriptor ;;6
JMP L_StallPipe0 ;;7 ;wang
JMP L_GetConfiguration ;;8 ;wang
JMP L_SetConfiguration ;;9
JMP L_StallPipe0 ;;0AH(GetInterface) ;wang
JMP L_StallPipe0 ;;0BH(SetInterface) ;wang
JMP L_StallPipe0 ;;0CH(SynchFrame) ;wang
;;********************************************************************
L_GetStatus:
SZ T_Indexh
JMP L_StallPipe0
MOV A,T_Requesttype
AND A,1FH
MOV M_TEMP2,A
SUB A,03H
SZ C
JMP L_StallPipe0
MOV A,M_TEMP2
ADDM A,PCL
JMP L_GetDeviceStatus
JMP L_GetInterfaceStatus
; JMP L_GetEndpointStatus
;;--------------------------------------------------------------------
L_GetEndpointStatus:
MOV A,T_Indexl
AND A,7FH
SUB A,M_EndpointNO
SZ C
JMP L_StallPipe0
MOV A,01H
SZ T_Indexl.0
MOV A,02H
AND A,M_STALL
SNZ Z
L_EndpontStall:
MOV A,01H
L_SendEndpointStall:
MOV M_FIFOBAK0,A
CLR M_FIFOBAK1
MOV A,02H
JMP L_WriteDataToFIFO_AnyBytes
;;--------------------------------------------------------------------
L_GetInterfaceStatus:
SNZ F_AddressStatus
JMP L_StallPipe0
MOV A,T_Indexl
SUB A,C_InterfaceNO
SZ C
JMP L_StallPipe0
L_SendInterfaceStatus:
CLR M_FIFOBAK0
CLR M_FIFOBAK1
MOV A,02H
JMP L_WriteDataToFIFO_AnyBytes
;;--------------------------------------------------------------------
L_GetDeviceStatus:
CLR ACC
SZ F_RemoteWakeup
SET ACC.1
MOV M_FIFOBAK0,A
CLR M_FIFOBAK1
MOV A,02H
JMP L_WriteDataToFIFO_AnyBytes
;;********************************************************************
L_ClearSetFeature:
SZ T_Valueh
JMP L_StallPipe0
SZ T_Indexh
JMP L_StallPipe0
MOV A,T_RequestType
AND A,1FH
SZ Z
JMP L_Clear_SetDeviceFeature
XOR A,02H
SNZ Z
JMP L_StallPipe0
; JMP L_Clear_SetEndpointFeature
;;--------------------------------------------------------------------
L_Clear_SetEndpointFeature:
SZ T_Valuel
JMP L_StallPipe0
MOV A,T_Indexl
AND A,7FH
SUB A,M_EndpointNO
SZ C
JMP L_StallPipe0
MOV A,C_STALL
MOV MP1,A
MOV A,1H
SZ T_Indexl.0
MOV A,2H
SNZ T_RequestNUM.1
JMP L_ClearStallFeature
L_SetStallFeature:
ORM A,M_STALL
ORM A,R1
JMP L_WriteDataToFIFO_0_Packet
L_ClearStallFeature:
CPL ACC
ANDM A,M_STALL
ANDM A,R1
JMP L_WriteDataToFIFO_0_Packet
;;--------------------------------------------------------------------
L_Clear_SetDeviceFeature:
SDZA T_Valuel
JMP L_StallPipe0
SZ T_Indexl
JMP L_StallPipe0
MOV A,C_Addr_Wakeup
MOV MP1,A
SET F_RemoteWakeup
SNZ T_RequestNUM.1 ;;????
CLR F_RemoteWakeup
CLR C
RLCA M_DeviceAddress ;;AWR
SZ T_RequestNUM.1
SET ACC.0
MOV R1,A
JMP L_WriteDataToFIFO_0_Packet
;;********************************************************************
L_SetAddress:
SZ T_ValueH
JMP L_StallPipe0
MOV A,T_ValueL
MOV M_DeviceAddress,A
MOV A,C_SIES
MOV MP1,A
MOV A,01H
ORM A,R1
MOV A,C_Addr_Wakeup
MOV MP1,A
CLR C
RLCA M_DeviceAddress
SZ F_RemoteWakeup
SET ACC.0
MOV R1,A
SZ M_DeviceAddress
SET F_AddressStatus
JMP L_WriteDataToFIFO_0_Packet
;;********************************************************************
L_GetDescriptor:
MOV A,T_LengthL
MOV M_DataLengthL,A
MOV A,T_LengthH
MOV M_DataLengthH,A
CLR F_RdHighTable ;FLAG0.6
MOV A,T_RequestType
AND A,1FH
SZ Z
JMP L_GetStandardDescriptor
XOR A,1H
SZ Z
JMP L_GetClassDescriptor
JMP L_StallPipe0
;;--------------------------------------------------------------------
;;the high byte of wValue is descriptor type value.
L_GetStandardDescriptor:
MOV A,T_ValueH
AND A,1FH
MOV M_Temp1,A
SUB A,04H
SZ C
JMP L_StallPipe0
MOV A,M_Temp1
ADDM A,PCL
JMP L_StallPipe0
JMP L_GetDeviceDescriptor
JMP L_GetConfigurationDescriptor
; JMP L_GetStringDescriptor
;;--------------------------------------------------------------------
L_GetStringDescriptor:
MOV A,T_IndexH
OR A,T_IndexL
OR A,T_ValueL
MOV A,2
SZ Z
JMP L_Zero_String ;T_IndexH=T_IndexL=T_ValueL=0
; JMP L_Get_String
L_Get_String:
MOV A,T_IndexH
XOR A,C_LanguageIDH
SNZ Z
JMP L_StallPipe0
MOV A,T_IndexL
XOR A,C_LanguageIDL
SNZ Z
JMP L_StallPipe0
MOV A,2H
SUB A,T_ValueL
SNZ C
JMP L_StallPipe0
;; ADDM A,PCL
;; ADD A,1+4
;; ADD A,2+1
MOV A,low Table_LanguageID ;00
SZ T_ValueL.0
MOV A,low ManufactureS ;01
SZ T_ValueL.1
MOV A,low ProductS
MOV A,TBLP
TABRDL M_DescriptorLength
JMP L_GetSendDataLength
L_Zero_String:
ADD A,LOW Table_LanguageID
SUB A,2
MOV TBLP,A
TABRDL M_DescriptorLength
JMP L_GetSendDataLength
;;--------------------------------------------------------------------
L_GetConfigurationDescriptor:
MOV A,LOW Table_ConfigurationDescriptor
MOV TBLP,A
MOV A,C_ConfigurationDesLength
JMP L_CheckIndex
;;--------------------------------------------------------------------
L_GetDeviceDescriptor:
MOV A,LOW Table_DeviceDescriptor
MOV TBLP,A
MOV A,C_DeviceDescriptorLength
JMP L_CheckIndex
;;--------------------------------------------------------------------
L_CheckIndex:
SZ T_IndexL
JMP L_StallPipe0
SZ T_IndexH
JMP L_StallPipe0
MOV M_DescriptorLength,A
L_GetSendDataLength:
CALL SBR_GetLengthOfSendData
L_WriteDataToBuffer:
CALL SBR_GetDescriptorToBuffer
MOV A,M_DataPacketLength
XOR A,C_FIFOSize ;data packet length = 8 byte?
SZ Z
SET F_BufferFull ;yes,set the flag of buffer full
CLR F_SendContinue ;clear the flag of send data continue
SZ M_DescriptorLength
JMP L_SendContinue ;if Descriptor data not load finally,jmp here
; JMP L_SendEnd ;else,jmp here
L_SendEnd:
SZ F_BufferFull ;buffer was full?
SET F_SendContinue ;yes,set the flag of send data continue
SZ F_SendContinue ;need to continue send data?
JMP L_WriteDataToFIFO ;yes,write data to FIFO
SZ M_DataPacketLength ;load data finally?
JMP L_WriteDataToFIFO ;no,write data to FIFO
CLR F_ControlEvent ;clear the flag of setup finally
JMP L_WriteDataToFIFO_0_Packet ;return 0 size packet
L_SendContinue:
CLR F_BufferFull ;clear the flag of buffer full
SET F_SendContinue ;set the flag of data not load finally
MOV A,TBLP
MOV M_TBLPFIFO,A ;save address of table
JMP L_WriteDataToFIFO ;write FIFO
;;--------------------------------------------------------------------
L_GetClassDescriptor:
MOV A,T_IndexL
SUB A,C_InterfaceNO
SZ C
JMP L_StallPipe0
MOV A,T_ValueH
AND A,1FH
MOV M_TEMP1,A
SUB A,03H
SZ C
JMP L_StallPipe0
MOV A,M_TEMP1
ADDM A,PCL
JMP L_StallPipe0
JMP L_GetOptionalHIDDescriptor
JMP L_GetReportDescriptor
;;--------------------------------------------------------------------
L_GetReportDescriptor:
MOV A,LOW Table_ReportDescriptor
MOV TBLP,A
MOV A,C_ReportDescriptorLength
JMP L_CheckIndex
;;--------------------------------------------------------------------
L_GetOptionalHIDDescriptor:
MOV A,LOW Table_HIDDescriptor
MOV TBLP,A
MOV A,C_HIDDescriptorLength
MOV M_DescriptorLength,A
JMP L_GetSendDataLength
;;********************************************************************
L_GetConfiguration:
CLR M_FIFOBAK0
SZ F_ConfigurationStatus
SET M_FIFOBAK0.0
MOV A,01H
JMP L_WriteDataToFIFO_AnyBytes
;;********************************************************************
L_SetConfiguration:
MOV A,1H
SUB A,T_ValueL
SNZ C
JMP L_StallPipe0
CLR F_AddressStatus
SNZ Z
SET F_AddressStatus
CLR M_STALL
MOV A,C_STALL
MOV MP1,A
CLR R1
SZ T_ValueL
JMP L_ToConfigurationStatus
CLR F_ConfigurationStatus
JMP L_WriteDataToFIFO_0_Packet
L_ToConfigurationStatus:
SET PA.0
SET F_ConfigurationStatus
;; SET TMR1C.4
JMP L_WriteDataToFIFO_0_Packet
;;********************************************************************
SBR_GetLengthOfSendData:
SZ M_DataLengthH
RET
MOV A,M_DescriptorLength
SUB A,M_DataLengthL
SNZ C
RET
L_DesLenBiggerRecLen:
MOV A,M_DataLengthL
MOV M_DescriptorLength,A
RET
;;********************************************************************
SBR_GetDescriptorToBuffer:
MOV A,OFFSET M_FIFOBAK0 ;load FIFO buffer's address
MOV MP0,A
CLR M_DataPacketLength ;clear packet length
L_GetDescriptorToBufferLoop:
MOV A,M_DataPacketLength
XOR A,C_FIFOSize ;packet size = 8 byte?
SZ Z
RET ;yes,return
JMP L_GetDescriptorToBuffer ;no,continue
L_GetDescriptorToBuffer:
SZ M_DescriptorLength ;Discriptor data was load finally
JMP L_Read_Data ;no,read data
RET ;yes,return
L_Read_Data:
SNZ F_RdHighTable ;read table's high 8 bit or low 8 bit
JMP L_ReadLowByteOfTable
; JMP L_ReadHighByteOfTable
L_ReadHighByteOfTable:
CLR F_RdHighTable ;14 bit table.if High bit=3fh,then read next 8bit
TABRDL R0
INC TBLP
MOV A,TBLH
AND A,00111111B
XOR A,3FH
SZ Z
JMP L_Read_Data
MOV A,TBLH
AND A,3FH
MOV R0,A
JMP L_ReadNextByte
L_ReadLowByteOfTable:
SET F_RdHighTable
TABRDL R0
JMP L_ReadNextByte
;;--------------------------------------------------------------------
L_ReadNextByte:
INC MP0 ;next address
INC M_DataPacketLength ;packet length add 1
SDZ M_DescriptorLength ;descriptor length dec 1
JMP L_GetDescriptorToBufferLoop
RET
;;********************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -