⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 web51.asm

📁 web51的开发库
💻 ASM
字号:
.nolist.include	"param.inc".include	"8019.inc".list	.section buf_data, #alloc.global	buf.global	bufendbuf:	.ds.b	sizeofbufbufend:.global	slowtimer	.comm	slowtimer, 1	.bcomm	stateFlg, 1		;; stateFlg bit enum		.equ	flagARP, 0		.equ	flagICMP,1		.equ	flagUDP, 2		.equ	flagTCP, 3;	RSEG	CPU_BIT;;***** ARP/IP/TCP *****.global	rx_eth_bit.global	flagArpGwRq.global	flagSynRq.global	flag1WaitForAck.global	flagIPactive	.bitcomm	rx_eth_bit,   1		;Packet driver	.bitcomm	flagArpGwRq,  1 	.bitcomm	flagSynRq,    1	.bitcomm	flag1WaitForAck, 1	;Wait for Ack state (Psh send, wait for Ack rcv)	.bitcomm	flagIPactive, 1		;flash_ip_point != 0	.comm		activity1, 1		; TCP1 activity timer.ifdef ACTIVESTACK.global	flagArpPoiRq	.bitcomm	flagArpPoiRq, 1.else .ifdef ACTIVEUDP.global	flagArpPoiRq	.bitcomm	flagArpPoiRq, 1 .endif.endif.ifdef DUALSTACK.global	flag2WaitForAck.global activity2	.bitcomm	flag2WaitForAck, 1	; Wait for Ack state (Psh send, wait for Ack rcv)	.comm		activity2, 1		; TCP2 activity timer.endif;;***** timer *****	.bitcomm	bit1ms, 1	.section vectors, #alloc;*************************************************************	.org	0x00	LJMP	reset	.org	0x03	LJMP	intIE0		; external interrupt 0	.org	0x0B	LJMP	intTF0		; timer 0	.org	0x13	LJMP	intIE1		; external interrupt 1	.org	0x1B	LJMP	intTF1		; timer 1	.org	0x23	LJMP	intRITI		; serial port;	.section reset_begin, #alloc;*************************************************************	.global resetreset:	MOV	R7,#20		;ISP DELAY for AT89S8252 CPUISP_Ra:	MOV	R6,#0xFF	; 255 x 255 x 25 = 650 ms for 22.1184 MHz XtalISP_Rb:	MOV	R5,#0xFFISP_Rc:	DJNZ	R5,ISP_Rc	DJNZ	R6,ISP_Rb	DJNZ	R7,ISP_Ra	MOV	P0,#-1	MOV	P1,#0	MOV	P2,#-1	MOV	P3,#-1	MOV	SP,#stack	MOV	R0,#0resLP:	MOV	@R0,#0	INC	R0	MOV	A,R0	JNZ	resLP;	mov	PCON,#0		; default	mov     TMOD,#0b00000001; timer 0, 16 bit mode				; timer 1, default	mov     tl0,#LOW(SysTik)	mov     th0,#HIGH(SysTik)	mov	TCON,#0x30      ; start timer0, other bits set to default	mov	IE,#0b00000010	; enable timer0 int.if RD2	mov	CKCON, #C2SETUP;	mov	AUXR1, #0	;select DPTR	mov	AUXR,  #X2SETUP	.endif	.section reset_end, #alloc;*************************************************************	orl	IE,#0b10000000	; enable interrupt.ifdef SERIAL	clr	rxint		; clear interrupt flags	clr	txint.endif	clr	bit1ms	mov	slowtimer,#slowtiming	INIT_WD;;	ajmp	main	.section fast_begin, #alloc;*************************************************************	.global	mainmain:	RESTART_WD			;restart Watchdog.ifdef SERIAL	lcall	sstat			;scan RTS/CTS,....endif	mov	stateFlg,#0		;flagARP..flagTCP	clr	rx_eth_bit	LCALL	rcv_pkt	jnb	rx_eth_bit,NoRxEth	acall	ProcessEthPacket;cpl LED0	jnb	B2B(stateFlg, flagICMP),.+6	lcall	ProcessICMP	jnb	B2B(stateFlg, flagTCP),.+6	lcall	ProcessTCP	jnb	B2B(stateFlg, flagUDP),.+6	lcall	ProcessUDP	jnb	B2B(stateFlg, flagARP),.+6	lcall	ProcessARP;cpl LED1NoRxEth:jnb	bit1ms,main	clr	bit1ms;~1 ms loopfastloop:	jnb	flagArpGwRq,.+6	lcall	ProcessArpGwRq.ifdef ACTIVESTACK	jnb	flagArpPoiRq,.+6	lcall	ProcessArpPoiRq.else .ifdef ACTIVEUDP	jnb	flagArpPoiRq,.+6	lcall	ProcessArpPoiRq .endif.endif.ifdef ACTIVESTACK	jnb	flagSynRq,.+6	lcall	ProcessSynRq.endif	.section fast_end, #alloc;*************************************************************	djnz	slowtimer,main	mov	slowtimer,#slowtiming;~50 ms loopslowloop:	.section slow_begin, #alloc;*************************************************************	clr	B2B(tcpState, stateSyn).ifdef DUALSTACK	clr	B2B(tcpStateXX, stateSyn)	clr	B2B(tcpStateXX+1, stateSyn).endif	.section slow_end, #alloc;**************************************************************************	ajmp	main	.section cpu_rom, #alloc;**************************************************************************ProcessEthPacket:;;if (rx_eth_pkt.pktType == 0x0800) goto IPPacket; //IP;;else if (rx_eth_pkt.pktType == 0x0806) goto ArpPacket; //ARP;;else goto UnknownEthType;	mov	a,eth_pkt_hdr_type	xrl	a,#0x08		;high ARP and IP ID	jnz	UnknownEthType	mov	a,eth_pkt_hdr_type+1	jz	IPPacket	xrl	a,#0x06		;low ARP ID	jz	ArpPacketUnknownEthType:	ret			;Unknown ID of Ethernet packet;**************************************************************************;Type of ethernet packet = 0806h ARPArpPacket:	setb	B2B(stateFlg, flagARP)	ret;**************************************************************************;Type of ethernet packet = 0800h IPNoMyIP:	DISABLE_EE	ret				;IP with IP_DSTADDR != flash_my_ipIPPacket:;;if (rx_eth_pkt.pkt.ip.ipheader.DstAddr == flash_my_ip) {	mov	R7,#buf			;buffer_addr	mov	R5,#IP_TTL		;source_packet_offset	mov	R3,#12			;length	lcall	short_pr2s	;read IP_TTL & IP_PROTO & IP_CKSUM				;IP_SRCADDR & IP_DSTADDR to temp var	mov	dptr,#flash_my_ip	mov	r0, #buf+(IP_DSTADDR-IP_TTL)	mov	r1, #IP_ADDR_LEN	ENABLE_EEmyiploop:movx	a,@dptr	xrl	a,@r0	jnz	NoMyIP	inc	dptr	inc	r0	djnz	r1,myiploop;;if (((rx_eth_pkt.pkt.ip.ipheader.SrcAddr ^ flash_my_ip) & flash_ip_mask) != 0) {	mov	dptr,#flash_my_ip	mov	r0, #buf+(IP_SRCADDR-IP_TTL)	mov	r1, #IP_ADDR_LENgwloop1:movx	a,@dptr	xrl	a,@r0	mov	@r0,a	inc	dptr	inc	r0	djnz	r1,gwloop1	mov	dptr,#flash_ip_mask	mov	r0, #buf+(IP_SRCADDR-IP_TTL)	mov	r1, #IP_ADDR_LENgwloop2:movx	a,@dptr	anl	a,@r0	jnz	gwloopbreak	inc	dptr	inc	r0	djnz	r1,gwloop2gwloopbreak:	DISABLE_EE	jz	noneedgw;;  if(!valid_mac_gateway) {	jb	validMACgateway, noneedarpgw;;    MakeArpGwRq(); return;	setb	flagArpGwRq		;Arp Gateway Request	ret;;  } else {;;    EthRcvHdr.pktSrc = flash_mac_gateway;noneedarpgw:	mov	r7, #eth_pkt_hdr_src		;TO	mov	r4, #HIGH(flash_mac_gateway)	;FROM	mov	r5, #LOW(flash_mac_gateway)	mov	r3, #ETHER_ADDR_LEN		;LENGTH	lcall	pe2s;;  };;}noneedgw:;;  switch (rx_eth_pkt.pkt.ip.Proto) {;;    case IPT_ICMP: goto protoICMP;	mov	R0,#buf+(IP_PROTO-IP_TTL)	mov	a,@R0	xrl	a,#IPT_ICMP		;proto ICMP	jz	protoICMP;;    case IPT_TCP:  goto protoTCP;	xrl	a,#(IPT_ICMP ^ IPT_TCP)	;proto TCP	jz	protoTCP;;    case IPT_UDP:  goto protoUDP;	xrl	a,#(IPT_TCP ^ IPT_UDP)	;proto UDP	jz	protoUDP	retprotoICMP:	setb	B2B(stateFlg, flagICMP)	retprotoTCP:	setb	B2B(stateFlg, flagTCP)	retprotoUDP:	setb	B2B(stateFlg, flagUDP)	ret;;  };;};;;###########################################;# Timer 0 Interrupt service		   #;###########################################;	.section cpu_rom, #alloc;*************************************************************.global intTF0.global _reti_intTF0:	push	psw	push	acc	mov     tl0,#LOW(SysTik)	mov     th0,#HIGH(SysTik)	mov	a,activity1	jz	noDecAct1	dec	activity1noDecAct1:.ifdef DUALSTACK	mov	a,activity2	jz	noDecAct2	dec	activity2noDecAct2:.endif	setb	bit1ms	pop	acc	pop	psw.ifdef SERIAL.else.global	intRITIintRITI: 	;don't link serial.obj.endif_reti_:	reti	;; END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -