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

📄 udp.s

📁 AVR以太网开发板中的几个例子。文件中定义了网卡芯片的IP地址,默认值是192.168.0.99。
💻 S
字号:
	.module udp.c
	.area text(rom, con, rel)
	.dbfile D:\hexok项目\AVRNET项目\AVRNET光盘\icc例子\udp.c
	.dbfunc e udp_init _udp_init fV
	.even
_udp_init::
	.dbline -1
	.dbline 9
; #include "main.h"
; #include "rtl8019as.h"
; #include "arp.h"
; #include "ip.h"
; #include "icmp.h"
; #include "udp.h"
; 
; void udp_init(void)
; {
	.dbline 10
;   udpbuffer_in_p=0;
	clr R2
	clr R3
	sts _udpbuffer_in_p+1,R3
	sts _udpbuffer_in_p,R2
	.dbline 11
;   udpbuffer_in_rp=0;
	sts _udpbuffer_in_rp+1,R3
	sts _udpbuffer_in_rp,R2
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e udp_packhandle _udp_packhandle fc
;         udp_ok -> R20
;       des_port -> R12,R13
;              i -> R10,R11
;         udplen -> R10,R11
;       udpbegin -> R22,R23
	.even
_udp_packhandle::
	xcall push_gset4
	movw R10,R18
	movw R22,R16
	.dbline -1
	.dbline 15
; }
; 
; unsigned char udp_packhandle(unsigned char *udpbegin,unsigned int udplen)
; {
	.dbline 16
;  unsigned char udp_ok=0;
	clr R20
	.dbline 17
;  unsigned int des_port=0;
	clr R12
	clr R13
	.dbline 18
;  unsigned int i=0;
	clr R10
	clr R11
	.dbline 20
;  
;  to_udpport=*udpbegin;
	movw R30,R22
	ldd R2,z+0
	clr R3
	sts _to_udpport+1,R3
	sts _to_udpport,R2
	.dbline 21
;  to_udpport<<=8;
	mov R3,R2
	clr R2
	sts _to_udpport+1,R3
	sts _to_udpport,R2
	.dbline 22
;  to_udpport|=*(udpbegin+1);
	ldd R2,z+1
	clr R3
	lds R4,_to_udpport
	lds R5,_to_udpport+1
	or R4,R2
	or R5,R3
	sts _to_udpport+1,R5
	sts _to_udpport,R4
	.dbline 24
;  
;  des_port=*(udpbegin+2);
	movw R30,R22
	ldd R12,z+2
	clr R13
	.dbline 25
;  des_port<<=8;
	mov R13,R12
	clr R12
	.dbline 26
;  des_port|=*(udpbegin+3);
	movw R30,R22
	ldd R2,z+3
	clr R3
	or R12,R2
	or R13,R3
	.dbline 28
;  
;  udpdatalen=*(udpbegin+4);
	movw R30,R22
	ldd R2,z+4
	clr R3
	sts _udpdatalen+1,R3
	sts _udpdatalen,R2
	.dbline 29
;  udpdatalen<<=8;
	mov R3,R2
	clr R2
	sts _udpdatalen+1,R3
	sts _udpdatalen,R2
	.dbline 30
;  udpdatalen|=*(udpbegin+5);
	movw R30,R22
	ldd R2,z+5
	clr R3
	lds R4,_udpdatalen
	lds R5,_udpdatalen+1
	or R4,R2
	or R5,R3
	sts _udpdatalen+1,R5
	sts _udpdatalen,R4
	.dbline 31
;  udpdatalen-=8;
	movw R24,R4
	sbiw R24,8
	sts _udpdatalen+1,R25
	sts _udpdatalen,R24
	.dbline 36
;  
;  //*(udpbegin+6)=0;
;  //*(udpbegin+7)=0;
;  
;  switch(des_port)
	movw R24,R12
	cpi R24,16
	ldi R30,0
	cpc R25,R30
	breq L5
	cpi R24,17
	ldi R30,0
	cpc R25,R30
	brne X3
	xjmp L18
X3:
	cpi R24,18
	ldi R30,0
	cpc R25,R30
	brne X4
	xjmp L19
X4:
	cpi R24,19
	ldi R30,0
	cpc R25,R30
	brne X5
	xjmp L4
X5:
	xjmp L3
X0:
	.dbline 37
;  {
L5:
	.dbline 39
	ldi R24,1024
	ldi R25,4
	lds R2,_udpdatalen
	lds R3,_udpdatalen+1
	cp R24,R2
	cpc R25,R3
	brsh L11
	.dbline 39
	.dbline 39
	mov R16,R20
	xjmp L2
X1:
	.dbline 39
;   case localport_udp_port00:    //端口0 使用内部RAM
;        if(udpdatalen>1024){return udp_ok;break;}
	.dbline 40
;        for(;i<udpdatalen;i++)
L8:
	.dbline 41
; 	   {
	.dbline 42
; 	    udpbuffer_in[udpbuffer_in_p]=*(udpbegin+8+i);
	movw R24,R22
	adiw R24,8
	movw R30,R10
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldi R24,<_udpbuffer_in
	ldi R25,>_udpbuffer_in
	lds R30,_udpbuffer_in_p
	lds R31,_udpbuffer_in_p+1
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 43
; 		udpbuffer_in_p++;
	lds R24,_udpbuffer_in_p
	lds R25,_udpbuffer_in_p+1
	adiw R24,1
	sts _udpbuffer_in_p+1,R25
	sts _udpbuffer_in_p,R24
	.dbline 44
; 		if(udpbuffer_in_p>=1024){udpbuffer_in_p=0;}
	cpi R24,0
	ldi R30,4
	cpc R25,R30
	brlo L12
	.dbline 44
	.dbline 44
	clr R2
	clr R3
	sts _udpbuffer_in_p+1,R3
	sts _udpbuffer_in_p,R2
	.dbline 44
L12:
	.dbline 45
L9:
	.dbline 40
	movw R24,R10
	adiw R24,1
	movw R10,R24
L11:
	.dbline 40
	lds R2,_udpdatalen
	lds R3,_udpdatalen+1
	cp R10,R2
	cpc R11,R3
	brlo L8
	.dbline 46
; 	   } 
; 	   udp_ok=1;
	ldi R20,1
	.dbline 47
; 	   break;
	xjmp L4
X2:
	.dbline 50
; 	   
;   case localport_udp_port01:    //端口1 使用外部RAM
;        for(;i<udpdatalen;i++)
L15:
	.dbline 51
	.dbline 52
	movw R24,R22
	adiw R24,8
	movw R30,R10
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldi R24,<_udpbuffer_ex
	ldi R25,>_udpbuffer_ex
	movw R30,R10
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 53
L16:
	.dbline 50
	movw R24,R10
	adiw R24,1
	movw R10,R24
L18:
	.dbline 50
	lds R2,_udpdatalen
	lds R3,_udpdatalen+1
	cp R10,R2
	cpc R11,R3
	brlo L15
	.dbline 54
; 	   {
; 	    udpbuffer_ex[i]=*(udpbegin+8+i);
; 	   } 
; 	   udp_ok=1;
	ldi R20,1
	.dbline 55
; 	   break;
	xjmp L4
L19:
	.dbline 58
; 
;   case localport_udp_port02:    //端口2
;        led_cont(*(udpbegin+8));
	movw R30,R22
	ldd R16,z+8
	xcall _led_cont
	.dbline 59
; 	   break;
	.dbline 63
; 	   
;   case localport_udp_port03:    //端口3
;        
; 	   break;
L3:
L4:
	.dbline 66
;  }
;  
;  return udp_ok;
	mov R16,R20
	.dbline -2
L2:
	xcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r udp_ok 20 c
	.dbsym r des_port 12 i
	.dbsym r i 10 i
	.dbsym r udplen 10 i
	.dbsym r udpbegin 22 pc
	.dbend
	.dbfunc e udp_readdata _udp_readdata fi
;           data -> R16,R17
	.even
_udp_readdata::
	.dbline -1
	.dbline 70
; }
; 
; unsigned int udp_readdata(void)
; {
	.dbline 71
;  unsigned int data=0;
	clr R16
	clr R17
	.dbline 73
;  
;  if(udpbuffer_in_p==udpbuffer_in_rp){return 0;} //没有新数据则返回0
	lds R2,_udpbuffer_in_rp
	lds R3,_udpbuffer_in_rp+1
	lds R4,_udpbuffer_in_p
	lds R5,_udpbuffer_in_p+1
	cp R4,R2
	cpc R5,R3
	brne L22
	.dbline 73
	.dbline 73
	xjmp L21
L22:
	.dbline 74
;  data=(udpbuffer_in[udpbuffer_in_rp]&0xFF);
	ldi R24,<_udpbuffer_in
	ldi R25,>_udpbuffer_in
	lds R30,_udpbuffer_in_rp
	lds R31,_udpbuffer_in_rp+1
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	clr R17
	andi R17,0
	.dbline 75
;  data|=0x8000;                                  //有新数据则置位最高位作为标记
	ori R17,128
	.dbline 76
;  udpbuffer_in_rp++;
	lds R24,_udpbuffer_in_rp
	lds R25,_udpbuffer_in_rp+1
	adiw R24,1
	sts _udpbuffer_in_rp+1,R25
	sts _udpbuffer_in_rp,R24
	.dbline 77
;  if(udpbuffer_in_rp>=1024){udpbuffer_in_rp=0;}
	cpi R24,0
	ldi R30,4
	cpc R25,R30
	brlo L24
	.dbline 77
	.dbline 77
	clr R2
	clr R3
	sts _udpbuffer_in_rp+1,R3
	sts _udpbuffer_in_rp,R2
	.dbline 77
L24:
	.dbline 78
;  return data;
	.dbline -2
L21:
	.dbline 0 ; func end
	ret
	.dbsym r data 16 i
	.dbend
	.dbfunc e udp_buildpack _udp_buildpack fV
;     remoteport -> y+2
;      localport -> y+0
;            len -> R18,R19
;  udpsendbuffer -> R16,R17
	.even
_udp_buildpack::
	.dbline -1
	.dbline 85
; }
; 
; void udp_buildpack(unsigned char *udpsendbuffer,
;                    unsigned int len,
; 				   unsigned int localport,
; 				   unsigned int remoteport)
; {
	.dbline 86
;   *udpsendbuffer=(localport>>8);        //源端口
	ldd R2,y+0
	ldd R3,y+1
	mov R2,R3
	clr R3
	movw R30,R16
	std z+0,R2
	.dbline 87
;   *(udpsendbuffer+1)=(localport&0xFF);
	ldd R24,y+0
	ldd R25,y+1
	andi R25,0
	std z+1,R24
	.dbline 89
;   
;   *(udpsendbuffer+2)=(remoteport>>8);   //目的端口
	ldd R2,y+2
	ldd R3,y+3
	mov R2,R3
	clr R3
	movw R30,R16
	std z+2,R2
	.dbline 90
;   *(udpsendbuffer+3)=(remoteport&0xFF);
	ldd R24,y+2
	ldd R25,y+3
	andi R25,0
	movw R30,R16
	std z+3,R24
	.dbline 97
;   
;   //if(len&0x01)                          //如果长度为奇数字节则填充一字节
;   //{
;   // len++;
;   // *(udpsendbuffer+8+len)=0xFF;
;   //}                  
;   *(udpsendbuffer+4)=(len>>8);
	movw R2,R18
	mov R2,R3
	clr R3
	movw R30,R16
	std z+4,R2
	.dbline 98
;   *(udpsendbuffer+5)=(len&0xFF);
	movw R24,R18
	andi R25,0
	movw R30,R16
	std z+5,R24
	.dbline 100
;   
;   *(udpsendbuffer+6)=0x00;                 //不进行校验
	clr R2
	movw R30,R16
	std z+6,R2
	.dbline 101
;   *(udpsendbuffer+7)=0x00;
	movw R30,R16
	std z+7,R2
	.dbline -2
L26:
	.dbline 0 ; func end
	ret
	.dbsym l remoteport 2 i
	.dbsym l localport 0 i
	.dbsym r len 18 i
	.dbsym r udpsendbuffer 16 pc
	.dbend
	.dbfunc e udp_builddata _udp_builddata fV
;            i_d -> R20,R21
;              i -> R22,R23
;            len -> R10,R11
;    udpsenddata -> R18,R19
;  udpsendbuffer -> R16,R17
	.even
_udp_builddata::
	xcall push_gset3
	ldd R10,y+6
	ldd R11,y+7
	.dbline -1
	.dbline 106
;   
; }
; 
; void udp_builddata(unsigned char *udpsendbuffer,unsigned char *udpsenddata,unsigned int len)
; {
	.dbline 107
;   unsigned int i=8;
	ldi R22,8
	ldi R23,0
	.dbline 108
;   unsigned int i_d=0;
	clr R20
	clr R21
	.dbline 110
;   
;   len+=8;
	movw R24,R10
	adiw R24,8
	movw R10,R24
	.dbline 111
;   for(;i<len;i++)
	xjmp L31
L28:
	.dbline 112
	.dbline 113
	movw R30,R20
	add R30,R18
	adc R31,R19
	ldd R2,z+0
	movw R30,R22
	add R30,R16
	adc R31,R17
	std z+0,R2
	.dbline 114
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 115
L29:
	.dbline 111
	subi R22,255  ; offset = 1
	sbci R23,255
L31:
	.dbline 111
	cp R22,R10
	cpc R23,R11
	brlo L28
	.dbline -2
L27:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r i_d 20 i
	.dbsym r i 22 i
	.dbsym r len 10 i
	.dbsym r udpsenddata 18 pc
	.dbsym r udpsendbuffer 16 pc
	.dbend

⌨️ 快捷键说明

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