📄 udp.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 + -