📄 rtl8019as.s
字号:
; 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 + -