📄 std.asm
字号:
include body.inc
include usbrf1.inc
include usbfifo.inc
extern baddr_state :bit
extern bRmtWakeup :bit
extern bFIFO_Full :bit
extern bSend_Continue :bit
extern brd_h_table :bit ;read hi byte of table
extern bCfgValue :bit
extern bwait_setup :bit
extern int_temp1 :byte
extern int_temp2 :byte
extern STALL :byte
extern CMD_ADDR :byte
extern FIFO_Type :byte
extern FIFO_Request :byte
extern FIFO_wValueH :byte
extern FIFO_wValueL :byte
extern FIFO_wIndexH :byte
extern FIFO_wIndexL :byte
extern FIFO_OUT1 :byte
extern fifo_out2 :byte
extern FIFO_SendLen :byte
extern FIFO_wLengthH :byte
extern FIFO_wLengthL :byte
extern TableLength :byte
extern lengthh :byte
extern lengthl :byte
extern FIFO_TBLP :byte
;---usb_int.asm---
EXTERN ToStallPipe0:NEAR
EXTERN RequestResponse:NEAR
EXTERN SendHandshake:NEAR
EXTERN SendFIFOOut:NEAR
;---des.asm---
EXTERN DeviceD:NEAR
EXTERN ConfigurationD:NEAR
EXTERN HID_0:NEAR
EXTERN Entity_0:NEAR
EXTERN ENTITY_1:NEAR
extern LangID:NEAR
extern ManufactureS:near
extern ProductS:near
fifo_temp EQU int_temp1
temp equ int_temp2
STD1 .SECTION at 60h 'code'
;----- 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-3) ;Over 13 Item ?
SZ C ;
JMP ToStallPipe0 ;Yes
MOV A,FIFO_Request
sz acc.0
jmp std_request_pcl_14
SNZ FIFO_Type.@Setup_D ;Device to Host ? 0,6,8
JMP ToStallPipe0 ;No: Error
;!!!!! Need in same page
std_request_pcl_14:
ADDM A,PCL
JMP GetStatus ;0
JMP clearSetFeature ;1
JMP ToStallPipe0 ;2
JMP clearSetFeature ;3
JMP ToStallPipe0 ;4
JMP SetAddressC ;5
JMP GetDescriptor ;6
JMP Tostallpipe0 ;7
JMP GetConfiguration ;8
JMP SetConfiguration ;9
;JMP ToStallPipe0 ;GetInterface### ;A
;JMP ToStallPipe0 ;SetInterface### ;B
;JMP ToStallPipe0 ;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 ;
mov a,USB_SIES
mov mp1,a
mov a,00000001b
orm a,R1
MOV A,USB_ADDR_WAKE ;MP1 point to Address register
MOV MP1,A ;
rla CMD_ADDR
AND A,0FEH ;& save it
SZ bRmtWakeup ;Remote wakeup exist ?
SET acc.0 ;Yes:Set remote wakeup flag
MOV R1,A ;
sz CMD_ADDR
set baddr_state
JMP SendHandshake
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
clearSetFeature:
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)
sz z
jmp DeviceStatuscSF ;acc=0
xor a,2
snz z ;acc=2
jmp TostallPipe0
; jmp EndpointStatusCSF
;-----------------------------------------------------------------------------
EndpointStatusCSF: ;clear stall flag
SZ FIFO_wValueL ;ENDPOINT_STALL = 0 ?
JMP ToStallPipe0 ;No
MOV A,FIFO_wIndexL ;Get endpoint number
and a,01111111b
SUB A,FIFO_temp
SZ C
JMP ToStallPipe0
MOV A,USB_STALL ;MP1 point to Stall register
MOV MP1,A ;
mov a,1 ;pipe0
sz FIFO_wIndexL.0
mov a,2 ;pipe1
sz FIFO_windexL.1
mov a,4 ;pipe2
snz FIFO_Request.1
jmp clear_stall
orm a,stall
orm a,r1
JMP SendHandshake ;send handshake flag
clear_stall:
cpl acc
andm a,stall
andm a,r1
jmp SendHandshake
;-----------------------------------------------------------------------------
DeviceStatusCSF:
sdza fifo_wValueL
jmp ToStallPipe0
SZ FIFO_wIndexL ;Is wIndex == 0 ?
JMP ToStallPipe0 ;No
MOV A,USB_ADDR_WAKE ;Address & Remote wakeup address
MOV MP1,A ;
SET bRmtWakeup ;enable remote wakeup (flag)
snz FIFO_Request.1
clr bRmtWakeup
;enable remote wakeup ;Yes
clr c
rlca cmd_addr
sz FIFO_Request.1
set acc.0
SetAddrWake:
MOV R1,A ;
JMP SendHandshake ;send handshake flag
;****************************************************************************
GetStatus:
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,03H ;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
;-----------------------------------------------------------------------------
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,00000001b ;pipe0
sz FIFO_wIndexL.0
mov a,00000010b ;pipe1
sz FIFO_wIndexL.1
mov a,00000100b ;pipe2
and a,STALL
snz z
FoundStall:
mov A,01H ;mask bits except stall bit
JMP SendEndpointStsS ;Send endpoint status
;-------------------------------------------------------------------
DeviceStatusS:
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 acc ;low byte = 00H
JMP SendEndpointStsS ;Send it
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;Get string descriptor
std_des_pcl_start:
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 ;
TABRDL TableLength ;table length from TBLP
JMP SendCnf ;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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -