📄 tcp.s
字号:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r Socket 20 pS[TTCPSocket]
.dbend
.dbfunc e TCP_SocketStage _TCP_SocketStage fV
; Stage -> R22
; Socket -> R20,R21
.even
_TCP_SocketStage::
xcall push_gset2
mov R22,R18
movw R20,R16
.dbline -1
.dbline 385
; }
;
; #endif
;
; // ******************************************************************************************
; // set the socket stage
;
; void TCP_SocketStage(T_TCP_Socket *Socket, T_TCP_Stage Stage)
; {
.dbline 386
; if (Socket == NULL) return; //
cpi R20,0
cpc R20,R21
brne L112
X9:
.dbline 386
xjmp L111
L112:
.dbline 388
; //
; Socket->Stage = Stage; // set the socket stage
movw R30,R20
std z+0,R22
.dbline 389
; Socket->Retries = 0; //
clr R2
std z+38,R2
.dbline 390
; u16_Put(&Socket->Retry_Timer, Socket->RoundTripTime * TCP_Retry_Time); // send next packet asap
movw R30,R20
ldd R18,z+36
ldd R19,z+37
ldi R16,4
ldi R17,0
xcall empy16s
movw R18,R16
movw R16,R20
subi R16,217 ; offset = 39
sbci R17,255
xcall _u16_Put
.dbline 393
;
; #ifdef Debug
; TCP_DisplaySocketStage(Socket);
movw R16,R20
xcall _TCP_DisplaySocketStage
.dbline -2
L111:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r Stage 22 c
.dbsym r Socket 20 pS[TTCPSocket]
.dbend
.dbfunc e TCP_UpdateRoundTripTime _TCP_UpdateRoundTripTime fV
; Time -> R18,R19
; Socket -> R16,R17
.even
_TCP_UpdateRoundTripTime::
.dbline -1
.dbline 400
; #endif
; }
;
; // ******************************************************************************************
;
; void TCP_UpdateRoundTripTime(T_TCP_Socket *Socket, u16 Time)
; {
.dbline 404
; // update our record of roughtly how long it takes for the total round trip time for tcp data.
; // we the value to work out how long we should wait for tx retries
;
; if (Socket == NULL) return; //
cpi R16,0
cpc R16,R17
brne L115
X10:
.dbline 404
xjmp L114
L115:
.dbline 406
; //
; if (Socket->RoundTripTime < Time) //
movw R30,R16
ldd R2,z+36
ldd R3,z+37
cp R2,R18
cpc R3,R19
brsh L117
.dbline 407
; Socket->RoundTripTime = Time; // bump straight up
movw R30,R16
std z+37,R19
std z+36,R18
xjmp L118
L117:
.dbline 409
; else //
; { //
.dbline 410
; Socket->RoundTripTime += Time; // average round trip time
movw R24,R16
adiw R24,36
movw R30,R24
ldd R4,z+0
ldd R5,z+1
add R4,R18
adc R5,R19
std z+1,R5
std z+0,R4
.dbline 411
; Socket->RoundTripTime >>= 1; // "
movw R24,R16
adiw R24,36
movw R30,R24
ldd R4,z+0
ldd R5,z+1
lsr R5
ror R4
std z+1,R5
std z+0,R4
.dbline 412
; } //
L118:
.dbline 414
; //
; if (Socket->RoundTripTime < 100) Socket->RoundTripTime = 100; // no lower than 100ms
movw R30,R16
ldd R24,z+36
ldd R25,z+37
cpi R24,100
ldi R30,0
cpc R25,R30
brsh L119
.dbline 414
ldi R24,100
ldi R25,0
movw R30,R16
std z+37,R25
std z+36,R24
xjmp L120
L119:
.dbline 416
; else //
; if (Socket->RoundTripTime > 6000) Socket->RoundTripTime = 6000; // no higher than 6000ms
ldi R24,6000
ldi R25,23
movw R30,R16
ldd R2,z+36
ldd R3,z+37
cp R24,R2
cpc R25,R3
brsh L121
.dbline 416
movw R30,R16
std z+37,R25
std z+36,R24
L121:
L120:
.dbline -2
L114:
.dbline 0 ; func end
ret
.dbsym r Time 18 s
.dbsym r Socket 16 pS[TTCPSocket]
.dbend
.dbfunc e TCP_CloseSocket _TCP_CloseSocket fc
; Socket -> R20,R21
.even
_TCP_CloseSocket::
xcall push_gset2
movw R20,R16
.dbline -1
.dbline 422
; }
;
; // ******************************************************************************************
;
; bool TCP_CloseSocket(T_TCP_Socket *Socket)
; { // close the tcp socket
.dbline 423
; if (Socket == NULL) return true; // socket is closed
cpi R20,0
cpc R20,R21
brne L124
X11:
.dbline 423
ldi R16,1
xjmp L123
L124:
.dbline 425
;
; switch (Socket->Stage)
movw R30,R20
ldd R22,z+0
clr R23
cpi R22,0
cpc R22,R23
breq L127
X12:
cpi R22,1
ldi R30,0
cpc R23,R30
breq L127
cpi R22,2
ldi R30,0
cpc R23,R30
breq L130
cpi R22,3
ldi R30,0
cpc R23,R30
breq L131
cpi R22,4
ldi R30,0
cpc R23,R30
breq L131
xjmp L126
X13:
.dbline 426
; {
.dbline 428
; case TCP_CLOSED :
; case TCP_LISTEN : break; // close the socket
L130:
.dbline 429
; case TCP_SYN_SENT : TCP_SocketStage(Socket, TCP_CLOSED);
clr R18
movw R16,R20
xcall _TCP_SocketStage
.dbline 430
; TCP_SendPacket(Socket, TCP_RST);
ldi R18,4
movw R16,R20
xcall _TCP_SendPacket
.dbline 431
; return false;
clr R16
xjmp L123
L131:
.dbline 433
; case TCP_SYN_RECEIVED :
; case TCP_ESTABLISHED : TCP_SocketStage(Socket, TCP_FIN_WAIT_1);
ldi R18,5
movw R16,R20
xcall _TCP_SocketStage
.dbline 434
; TCP_SendPacket(Socket, TCP_FIN | TCP_ACK);
ldi R18,17
movw R16,R20
xcall _TCP_SendPacket
L126:
.dbline 435
; default : return false;
clr R16
xjmp L123
L127:
.dbline 438
; }
;
; TCP_SocketStage(Socket, TCP_CLOSED); //
clr R18
movw R16,R20
xcall _TCP_SocketStage
.dbline 440
; //
; return true; // socket is closed
ldi R16,1
.dbline -2
L123:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r Socket 20 pS[TTCPSocket]
.dbend
.dbfunc e TCP_SocketListen _TCP_SocketListen fpS[TTCPSocket]
; Socket -> R20,R21
; Port -> R22,R23
.even
_TCP_SocketListen::
xcall push_gset2
movw R22,R16
sbiw R28,2
.dbline -1
.dbline 444
; }
;
; T_TCP_Socket *TCP_SocketListen(u16 Port)
; { // create a new tcp socket and set it to listen mode
.dbline 448
; T_TCP_Socket *Socket; //
; //
; #ifdef StaticTCPSocket
; Socket = TCP_Socket; // static socket
lds R20,_TCP_Socket
lds R21,_TCP_Socket+1
.dbline 460
; #else
; Socket = malloc(sizeof(T_TCP_Socket)); // allocate memory for a tcp socket
; if (Socket == NULL) //
; { //
; #ifdef Debug
; SendDebugRStr(tcp_Str35); //
; #endif
; return NULL; // failed to get a socket
; } //
; #endif
; //
; memset(Socket, 0, sizeof(T_TCP_Socket)); //
ldi R24,1075
ldi R25,4
std y+1,R25
std y+0,R24
clr R18
clr R19
movw R16,R20
xcall _memset
.dbline 461
; Socket->LocalPort = Port; // select the port we are gona listen on
movw R30,R20
std z+35,R23
std z+34,R22
.dbline 462
; Socket->OurSequenceNum = Random32; // our sequence number
lds R4,_Random32+2
lds R5,_Random32+2+1
lds R2,_Random32
lds R3,_Random32+1
movw R30,R20
std z+22,R2
std z+23,R3
std z+24,R4
std z+25,R5
.dbline 463
; Socket->RoundTripTime = TCP_RoundTripTime; // default average round trip time - ms
ldi R24,1000
ldi R25,3
movw R30,R20
std z+37,R25
std z+36,R24
.dbline 464
; Socket->TheirMaxSegSize = TCP_Default_MSS; //
ldi R24,536
ldi R25,2
movw R30,R20
std z+15,R25
std z+14,R24
.dbline 465
; Socket->OutGoing = false; //
clr R2
movw R30,R20
std z+12,R2
.dbline 466
; Socket->AckDelay = 65000; //
ldi R24,65000
ldi R25,253
movw R30,R20
std z+10,R25
std z+9,R24
.dbline 468
; //
; TCP_SocketStage(Socket, TCP_LISTEN); // open a tcp listening socket
ldi R18,1
movw R16,R20
xcall _TCP_SocketStage
.dbline 470
; //
; return Socket; // success
movw R16,R20
.dbline -2
L132:
adiw R28,2
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r Socket 20 pS[TTCPSocket]
.dbsym r Port 22 s
.dbend
.dbfunc e TCP_OpenSocket _TCP_OpenSocket fpS[TTCPSocket]
; Socket -> R10,R11
; Port -> y+12
; IP -> y+8
.even
_TCP_OpenSocket::
xcall push_arg4
xcall push_gset3
sbiw R28,2
.dbline -1
.dbline 474
; }
;
; T_TCP_Socket *TCP_OpenSocket(u32 IP, u16 Port)
; { // create a tcp socket and initiate an out going connection
.dbline 477
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
breq L136
ldd R0,y+12
ldd R1,y+13
tst R0
brne L134
tst R1
brne L134
X14:
L136:
.dbline 477
; T_TCP_Socket *Socket; //
; //
; if ((!IP) || (!Port)) return NULL; //
clr R16
clr R17
xjmp L133
L134:
.dbline 480
; //
; #ifdef StaticTCPSocket
; Socket = TCP_Socket; // static socket
lds R10,_TCP_Socket
lds R11,_TCP_Socket+1
.dbline 492
; #else
; Socket = malloc(sizeof(T_TCP_Socket)); // allocate memory for a tcp socket
; if (Socket == NULL) //
; { //
; #ifdef Debug
; SendDebugRStr(tcp_Str35); //
; #endif
; return NULL; // failed to get a socket
; } //
; #endif
; //
; memset(Socket, 0, sizeof(T_TCP_Socket)); //
ldi R24,1075
ldi R25,4
std y+1,R25
std y+0,R24
clr R18
clr R19
movw R16,R10
xcall _memset
.dbline 494
; //
; if (TCP_TmpPort < TCP_OutGoingPortLow) TCP_TmpPort = TCP_OutGoingPortLow; //
lds R24,_TCP_TmpPort
lds R25,_TCP_TmpPort+1
cpi R24,0
ldi R30,4
cpc R25,R30
brsh L137
.dbline 494
ldi R24,1024
ldi R25,4
sts _TCP_TmpPort+1,R25
sts _TCP_TmpPort,R24
xjmp L138
L137:
.dbline 496
; else //
; if (TCP_TmpPort >= TCP_OutGoingPortHigh) TCP_TmpPort = TCP_OutGoingPortHigh;//
lds R24,_TCP_TmpPort
lds R25,_TCP_TmpPort+1
cpi R24,0
ldi R30,16
cpc R25,R30
brlo L139
.dbline 496
ldi R24,4096
ldi R25,16
sts _TCP_TmpPort+1,R25
sts _TCP_TmpPort,R24
L139:
L138:
.dbline 498
; //
; Socket->LocalPort = TCP_TmpPort++; // select the port we are gona listen on
lds R2,_TCP_TmpPort
lds R3,_TCP_TmpPort+1
movw R24,R2
adiw R24,1
sts _TCP_TmpPort+1,R25
sts _TCP_TmpPort,R24
movw R30,R10
std z+35,R3
std z+34,R2
.dbline 499
; Socket->RemotePort = Port; // select the port we are gona listen on
movw R30,R10
ldd R0,y+12
ldd R1,y+13
std z+33,R1
std z+32,R0
.dbline 500
; Socket->RemoteIP.ip32 = IP; // select the port we are gona listen on
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
movw R30,R10
std z+28,R2
std z+29,R3
std z+30,R4
std z+31,R5
.dbline 501
; Socket->OurSequenceNum = Random32; // our sequence number
lds R4,_Random32+2
lds R5,_Random32+2+1
lds R2,_Random32
lds R3,_Random32+1
movw R30,R10
std z+22,R2
std z+23,R3
std z+24,R4
std z+25,R5
.dbline 502
; Socket->TheirMaxSegSize = TCP_Default_MSS; //
ldi R24,536
ldi R25,2
movw R30,R10
std z+15,R25
std z+14,R24
.dbline 503
; Socket->RoundTripTime = TCP_RoundTripTime; // default average round trip time - ms
ldi R24,1000
ldi R25,3
movw R30,R10
std z+37,R25
std z+36,R24
.dbline 504
; Socket->OutGoing = true; //
ldi R24,1
movw R30,R10
std z+12,R24
.dbline 505
; Socket->AckDelay = 65000; //
ldi R24,65000
ldi R25,253
movw R30,R10
std z+10,R25
std z+9,R24
.dbline 507
; //
; TCP_SocketStage(Socket, TCP_SYN_SENT); // start a an outgoing connection
ldi R18,2
movw R16,R10
xcall _TCP_SocketStage
.dbline 508
; u16_Put(&Socket->Retry_Timer, Socket->RoundTripTime * TCP_Retry_Time); // next packet asap
movw R30,R10
ldd R18,z+36
ldd R19,z+37
ldi R16,4
ldi R17,0
xcall empy16s
movw R18,R16
movw R16,R10
subi R16,217 ; offset = 39
sbci R17,255
xcall _u16_Put
.dbline 510
; //
; return Socket; // success
movw R16,R10
.dbline -2
L133:
adiw R28,2
xcall pop_gset3
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r Socket 10 pS[TTCPSocket]
.dbsym l Port 12 s
.dbsym l IP 8 l
.dbend
.dbfunc e TCP_RxSaveData _TCP_RxSaveData fI
; i -> R10,R11
; len -> y+16
; Src -> R14,R15
; Socket -> R12,R13
.even
_TCP_RxSaveData::
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -