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

📄 rtl8019as.s

📁 AVR以太网开发板中的几个例子。文件中定义了网卡芯片的IP地址,默认值是192.168.0.99。
💻 S
📖 第 1 页 / 共 2 页
字号:
;         mac_d0 -> y+6
;         mac_d1 -> y+4
;         mac_d2 -> y+2
;         mac_d3 -> y+0
;         mac_d4 -> R18
;         mac_d5 -> R16
	.even
_buildpack::
	.dbline -1
	.dbline 195
; }
; 
; void buildpack(unsigned char mac_d5,
;                unsigned char mac_d4,
; 			   unsigned char mac_d3,
; 			   unsigned char mac_d2,
; 			   unsigned char mac_d1,
; 			   unsigned char mac_d0,
; 			   unsigned char mac_s5,
; 			   unsigned char mac_s4,
; 			   unsigned char mac_s3,
; 			   unsigned char mac_s2,
; 			   unsigned char mac_s1,
; 			   unsigned char mac_s0,
; 			   unsigned int len)
; {
	.dbline 196
;  buffer[0]=mac_d5;
	sts _buffer,R16
	.dbline 197
;  buffer[1]=mac_d4;
	sts _buffer+1,R18
	.dbline 198
;  buffer[2]=mac_d3;
	ldd R0,y+0
	sts _buffer+2,R0
	.dbline 199
;  buffer[3]=mac_d2;
	ldd R0,y+2
	sts _buffer+3,R0
	.dbline 200
;  buffer[4]=mac_d1;
	ldd R0,y+4
	sts _buffer+4,R0
	.dbline 201
;  buffer[5]=mac_d0;
	ldd R0,y+6
	sts _buffer+5,R0
	.dbline 203
;  
;  buffer[6]=mac_s5;
	ldd R0,y+8
	sts _buffer+6,R0
	.dbline 204
;  buffer[7]=mac_s4;
	ldd R0,y+10
	sts _buffer+7,R0
	.dbline 205
;  buffer[8]=mac_s3;
	ldd R0,y+12
	sts _buffer+8,R0
	.dbline 206
;  buffer[9]=mac_s2;
	ldd R0,y+14
	sts _buffer+9,R0
	.dbline 207
;  buffer[10]=mac_s1;
	ldd R0,y+16
	sts _buffer+10,R0
	.dbline 208
;  buffer[11]=mac_s0;
	ldd R0,y+18
	sts _buffer+11,R0
	.dbline 210
;  
;  buffer[13]=len&0xFF;
	ldd R24,y+20
	ldd R25,y+21
	andi R25,0
	sts _buffer+13,R24
	.dbline 211
;  buffer[12]=len>>8;
	ldd R2,y+20
	ldd R3,y+21
	mov R2,R3
	clr R3
	sts _buffer+12,R2
	.dbline -2
L21:
	.dbline 0 ; func end
	ret
	.dbsym l len 20 i
	.dbsym l mac_s0 18 c
	.dbsym l mac_s1 16 c
	.dbsym l mac_s2 14 c
	.dbsym l mac_s3 12 c
	.dbsym l mac_s4 10 c
	.dbsym l mac_s5 8 c
	.dbsym l mac_d0 6 c
	.dbsym l mac_d1 4 c
	.dbsym l mac_d2 2 c
	.dbsym l mac_d3 0 c
	.dbsym r mac_d4 18 c
	.dbsym r mac_d5 16 c
	.dbend
	.dbfunc e rtl_packhandle _rtl_packhandle fV
;              i -> R10,R11
;        packlen -> R20,R21
;        packtyp -> R22,R23
;        mac_des -> y+6
;        mac_sou -> y+0
	.even
_rtl_packhandle::
	xcall push_gset3
	sbiw R28,12
	.dbline -1
	.dbline 215
; }
; 
; void rtl_packhandle(void)
; {
	.dbline 216
;  unsigned int packlen=0;         //包长度
	clr R20
	clr R21
	.dbline 217
;  unsigned int packtyp=0;         //包类型
	clr R22
	clr R23
	.dbline 220
;  unsigned char mac_des[6];       //目的地址
;  unsigned char mac_sou[6];       //源地址
;  unsigned int i=0;
	clr R10
	clr R11
	.dbline 222
;  
;  mac_des[5]=buffer[4];
	lds R2,_buffer+4
	std y+11,R2
	.dbline 223
;  mac_des[4]=buffer[5];
	lds R2,_buffer+5
	std y+10,R2
	.dbline 224
;  mac_des[3]=buffer[6];
	lds R2,_buffer+6
	std y+9,R2
	.dbline 225
;  mac_des[2]=buffer[7];
	lds R2,_buffer+7
	std y+8,R2
	.dbline 226
;  mac_des[1]=buffer[8];
	lds R2,_buffer+8
	std y+7,R2
	.dbline 227
;  mac_des[0]=buffer[9]; 
	lds R2,_buffer+9
	std y+6,R2
	.dbline 229
;  
;  mac_sou[5]=buffer[10];
	lds R2,_buffer+10
	std y+5,R2
	.dbline 230
;  mac_sou[4]=buffer[11];
	lds R2,_buffer+11
	std y+4,R2
	.dbline 231
;  mac_sou[3]=buffer[12];
	lds R2,_buffer+12
	std y+3,R2
	.dbline 232
;  mac_sou[2]=buffer[13];
	lds R2,_buffer+13
	std y+2,R2
	.dbline 233
;  mac_sou[1]=buffer[14];
	lds R2,_buffer+14
	std y+1,R2
	.dbline 234
;  mac_sou[0]=buffer[15];
	lds R2,_buffer+15
	std y+0,R2
	.dbline 236
;  
;  tempmac_d5=mac_sou[5];
	ldd R2,y+5
	sts _tempmac_d5,R2
	.dbline 237
;  tempmac_d4=mac_sou[4];
	ldd R2,y+4
	sts _tempmac_d4,R2
	.dbline 238
;  tempmac_d3=mac_sou[3]; 
	ldd R2,y+3
	sts _tempmac_d3,R2
	.dbline 239
;  tempmac_d2=mac_sou[2]; 
	ldd R2,y+2
	sts _tempmac_d2,R2
	.dbline 240
;  tempmac_d1=mac_sou[1];
	ldd R2,y+1
	sts _tempmac_d1,R2
	.dbline 241
;  tempmac_d0=mac_sou[0]; 
	ldd R2,y+0
	sts _tempmac_d0,R2
	.dbline 244
;  
;  
;  if(((buffer[0]&0x01)==0))//如果数据包无效则不作处理
	lds R2,_buffer
	sbrc R2,0
	rjmp L63
	.dbline 245
;  {
	.dbline 246
;   return;
	xjmp L35
L63:
	.dbline 249
;  }
;  
;  packlen=buffer[3];              //获取数据长度,包括4字节校验码
	lds R20,_buffer+3
	clr R21
	.dbline 250
;  packlen<<=8;
	mov R21,R20
	clr R20
	.dbline 251
;  packlen|=buffer[2];
	lds R2,_buffer+2
	clr R3
	or R20,R2
	or R21,R3
	.dbline 252
;  packtyp=buffer[16];             //获取数据类型
	lds R22,_buffer+16
	clr R23
	.dbline 253
;  packtyp<<=8;
	mov R23,R22
	clr R22
	.dbline 254
;  packtyp|=buffer[17];
	lds R2,_buffer+17
	clr R3
	or R22,R2
	or R23,R3
	.dbline 256
;  
;  switch(packtyp)
	cpi R22,0
	ldi R30,8
	cpc R23,R30
	breq L73
	cpi R22,0
	ldi R30,8
	cpc R23,R30
	brge X2
	xjmp L35
X2:
L103:
	cpi R22,6
	ldi R30,8
	cpc R23,R30
	breq L71
	xjmp L35
X0:
	.dbline 257
;  {
L71:
	.dbline 259
;   case 0x0806:                   //ARP数据包
;        arp_response(&buffer[18]);
	ldi R16,<_buffer+18
	ldi R17,>_buffer+18
	xcall _arp_response
	.dbline 260
; 	   break;
	xjmp L35
L73:
	.dbline 262
;   case 0x0800:                   //IP数据包
;        switch(ip_packhandle(&buffer[18]))
	ldi R16,<_buffer+18
	ldi R17,>_buffer+18
	xcall _ip_packhandle
	mov R22,R16
	clr R23
	cpi R22,1
	ldi R30,0
	cpc R23,R30
	breq L78
	cpi R22,1
	ldi R30,0
	cpc R23,R30
	brlt L35
L102:
	cpi R22,17
	ldi R30,0
	cpc R23,R30
	breq L35
	xjmp L35
X1:
	.dbline 263
; 	   {
L78:
	.dbline 265
; 	    case 1://ICMP包处理
; 		     buffer[4]=mac_sou[5];
	ldd R2,y+5
	sts _buffer+4,R2
	.dbline 266
; 			 buffer[5]=mac_sou[4];
	ldd R2,y+4
	sts _buffer+5,R2
	.dbline 267
; 			 buffer[6]=mac_sou[3];
	ldd R2,y+3
	sts _buffer+6,R2
	.dbline 268
; 			 buffer[7]=mac_sou[2];
	ldd R2,y+2
	sts _buffer+7,R2
	.dbline 269
; 			 buffer[8]=mac_sou[1];
	ldd R2,y+1
	sts _buffer+8,R2
	.dbline 270
; 			 buffer[9]=mac_sou[0];
	ldd R2,y+0
	sts _buffer+9,R2
	.dbline 272
; 			 
; 			 buffer[10]=mac_des[5];
	ldd R2,y+11
	sts _buffer+10,R2
	.dbline 273
; 			 buffer[11]=mac_des[4];
	ldd R2,y+10
	sts _buffer+11,R2
	.dbline 274
; 			 buffer[12]=mac_des[3];
	ldd R2,y+9
	sts _buffer+12,R2
	.dbline 275
; 			 buffer[13]=mac_des[2];
	ldd R2,y+8
	sts _buffer+13,R2
	.dbline 276
; 			 buffer[14]=mac_des[1];
	ldd R2,y+7
	sts _buffer+14,R2
	.dbline 277
; 			 buffer[15]=mac_des[0];
	ldd R2,y+6
	sts _buffer+15,R2
	.dbline 279
; 			 
; 			 rtl8019_sendpack(packlen,4);
	ldi R18,4
	movw R16,R20
	xcall _rtl8019_sendpack
	.dbline 280
; 			break;
	.dbline 282
; 		case 17://UDP包处理	 
; 		    break;
	.dbline 283
; 	    default:break;
	.dbline 285
; 	   } 
;        break;
	.dbline 287
;    
;   default:break;			  
	.dbline 290
;  }
;  
;  return;
	.dbline -2
L35:
	adiw R28,12
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r i 10 i
	.dbsym r packlen 20 i
	.dbsym r packtyp 22 i
	.dbsym l mac_des 6 A[6:6]c
	.dbsym l mac_sou 0 A[6:6]c
	.dbend
	.dbfunc e tsum _tsum fi
;          tempp -> R10,R11
;          cksum -> y+0
;           size -> R18,R19
;         buffer -> R16,R17
	.even
_tsum::
	xcall push_gset3
	sbiw R28,4
	.dbline -1
	.dbline 294
; }
; 
; unsigned int tsum(unsigned int *buffer,unsigned int size) //校验和的求法
; {
	.dbline 295
;  unsigned long cksum=0x0;
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
	.dbline 298
;  unsigned char *tempp;
;  
;  if(size&0x01)
	sbrs R18,0
	rjmp L108
	.dbline 299
;  {
	.dbline 300
;   tempp=(unsigned char *)buffer;
	movw R10,R16
	.dbline 301
;   tempp+=size;
	add R10,R18
	adc R11,R19
	.dbline 302
;   size++;
	subi R18,255  ; offset = 1
	sbci R19,255
	.dbline 303
;   *tempp=0;
	clr R2
	movw R30,R10
	std z+0,R2
	.dbline 304
;  }
	xjmp L108
L107:
	.dbline 307
	.dbline 308
	movw R30,R16
	ld R2,Z+
	ld R3,Z+
	movw R16,R30
	clr R4
	clr R5
	movw R30,R28
	ldd R6,z+0
	ldd R7,z+1
	ldd R8,z+2
	ldd R9,z+3
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	movw R30,R28
	std z+0,R6
	std z+1,R7
	std z+2,R8
	std z+3,R9
	.dbline 309
	subi R18,2
	sbci R19,0
	.dbline 310
L108:
	.dbline 306
;  
;  while(size>0) //各位求和
	cpi R18,0
	cpc R18,R19
	brne L107
X3:
	.dbline 311
;  {
;   cksum=cksum+(*buffer++);
;   size-=2;
;  }
;  cksum=(unsigned int)cksum+(cksum>>16);
	movw R30,R28
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R2,R4
	clr R4
	clr R5
	movw R30,R28
	ldd R6,z+0
	ldd R7,z+1
	clr R8
	clr R9
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	movw R30,R28
	std z+0,R6
	std z+1,R7
	std z+2,R8
	std z+3,R9
	.dbline 313
; 
;  return(~cksum); //再取反
	movw R30,R28
	ldd R16,z+0
	ldd R17,z+1
	com R16
	com R17
	.dbline -2
L104:
	adiw R28,4
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r tempp 10 pc
	.dbsym l cksum 0 l
	.dbsym r size 18 i
	.dbsym r buffer 16 pi
	.dbend
	.dbfunc e send_ippack _send_ippack fV
;       protocol -> y+26
;       packtype -> R22,R23
;            len -> R20,R21
	.even
_send_ippack::
	xcall push_gset2
	movw R22,R18
	movw R20,R16
	sbiw R28,22
	.dbline -1
	.dbline 317
; }
; 
; void send_ippack(unsigned int len,unsigned int packtype,unsigned char protocol)
; {
	.dbline 319
; 
;   buildpack(tempmac_d5,
	std y+21,R23
	std y+20,R22
	ldi R24,69
	std y+18,R24
	ldi R24,67
	std y+16,R24
	ldi R24,73
	std y+14,R24
	ldi R24,70
	std y+12,R24
	std y+10,R24
	ldi R24,79
	std y+8,R24
	lds R2,_tempmac_d0
	std y+6,R2
	lds R2,_tempmac_d1
	std y+4,R2
	lds R2,_tempmac_d2
	std y+2,R2
	lds R2,_tempmac_d3
	std y+0,R2
	lds R18,_tempmac_d4
	lds R16,_tempmac_d5
	xcall _buildpack
	.dbline 332
; 			tempmac_d4,
; 			tempmac_d3,
; 			tempmac_d2,
; 			tempmac_d1,
; 			tempmac_d0,
; 			mynodeid_0,
; 			mynodeid_1,
; 			mynodeid_2,
; 			mynodeid_3,
; 			mynodeid_4,
; 			mynodeid_5,
; 			packtype);
;   ip_buildpack(&buffer[14],(len-14),ip_id,protocol,tempip_d3,tempip_d2,tempip_d1,tempip_d0);
	lds R2,_tempip_d0
	std y+10,R2
	lds R2,_tempip_d1
	std y+8,R2
	lds R2,_tempip_d2
	std y+6,R2
	lds R2,_tempip_d3
	std y+4,R2
	ldd R0,y+26
	std y+2,R0
	lds R2,_ip_id
	lds R3,_ip_id+1
	std y+1,R3
	std y+0,R2
	movw R18,R20
	subi R18,14
	sbci R19,0
	ldi R16,<_buffer+14
	ldi R17,>_buffer+14
	xcall _ip_buildpack
	.dbline 333
;   if(len<64){rtl8019_sendpack(64,0);}
	cpi R20,64
	ldi R30,0
	cpc R21,R30
	brsh L112
	.dbline 333
	.dbline 333
	clr R18
	ldi R16,64
	ldi R17,0
	xcall _rtl8019_sendpack
	.dbline 333
	xjmp L113
L112:
	.dbline 334
	clr R18
	movw R16,R20
	xcall _rtl8019_sendpack
L113:
	.dbline -2
L110:
	adiw R28,22
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l protocol 26 c
	.dbsym r packtype 22 i
	.dbsym r len 20 i
	.dbend
	.area bss(ram, con, rel)
	.dbfile D:\hexok项目\AVRNET项目\AVRNET光盘\icc例子\rtl8019as.c
_tempmac_d0::
	.blkb 1
	.dbsym e tempmac_d0 _tempmac_d0 c
_tempmac_d1::
	.blkb 1
	.dbsym e tempmac_d1 _tempmac_d1 c
_tempmac_d2::
	.blkb 1
	.dbsym e tempmac_d2 _tempmac_d2 c
_tempmac_d3::
	.blkb 1
	.dbsym e tempmac_d3 _tempmac_d3 c
_tempmac_d4::
	.blkb 1
	.dbsym e tempmac_d4 _tempmac_d4 c
_tempmac_d5::
	.blkb 1
	.dbsym e tempmac_d5 _tempmac_d5 c
_count::
	.blkb 2
	.dbsym e count _count i

⌨️ 快捷键说明

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