📄 tcp.s
字号:
xcall push_gset5
movw R14,R18
movw R12,R16
sbiw R28,6
.dbline -1
.dbline 516
; }
;
; // ******************************************************************************************
;
; int TCP_RxSaveData(T_TCP_Socket *Socket, u8 *Src, int len)
; { // save the received tcp data into the sockets rx ring buffer - the executive reads the dat back from this buffer
.dbline 519
tst R12
brne X15
tst R13
breq L145
X15:
tst R14
brne X16
tst R15
breq L145
X16:
clr R2
clr R3
ldd R0,y+16
ldd R1,y+17
cp R2,R0
cpc R3,R1
brlt L142
L145:
.dbline 519
; int i;
;
; if ((Socket == NULL) || (!Src) || (len <= 0)) return 0; //
clr R16
clr R17
xjmp L141
L142:
.dbline 521
; //
; i = RingBufBytesFree(sizeof(Socket->RxBuffer), Socket->RxBufferRd, Socket->RxBufferWr); // number of bytes free in our buffer
movw R30,R12
subi R30,209 ; addi 1071
sbci R31,251
ldd R2,z+0
ldd R3,z+1
std y+1,R3
std y+0,R2
movw R30,R12
subi R30,211 ; addi 1069
sbci R31,251
ldd R18,z+0
ldd R19,z+1
ldi R16,512
ldi R17,2
xcall _RingBufBytesFree
movw R10,R16
.dbline 522
; if (len > i) len = i; //
ldd R0,y+16
ldd R1,y+17
cp R16,R0
cpc R17,R1
brge L146
.dbline 522
std y+17,R11
std y+16,R10
L146:
.dbline 524
; //
; i = CopyToRingBuffer(Socket->RxBuffer, Src, Socket->RxBufferWr, sizeof(Socket->RxBuffer), len); //
ldd R0,y+16
ldd R1,y+17
std y+5,R1
std y+4,R0
ldi R24,512
ldi R25,2
std y+3,R25
std y+2,R24
movw R30,R12
subi R30,209 ; addi 1071
sbci R31,251
ldd R2,z+0
ldd R3,z+1
std y+1,R3
std y+0,R2
movw R18,R14
movw R16,R12
subi R16,211 ; offset = 557
sbci R17,253
xcall _CopyToRingBuffer
movw R10,R16
.dbline 525
; Socket->RxBufferWr += i; //
movw R24,R12
subi R24,209 ; offset = 1071
sbci R25,251
movw R30,R24
ldd R4,z+0
ldd R5,z+1
add R4,R16
adc R5,R17
std z+1,R5
std z+0,R4
xjmp L149
L148:
.dbline 526
movw R24,R12
subi R24,209 ; offset = 1071
sbci R25,251
movw R30,R24
ldd R24,z+0
ldd R25,z+1
subi R24,0
sbci R25,2
std z+1,R25
std z+0,R24
L149:
.dbline 526
; while (Socket->RxBufferWr >= sizeof(Socket->RxBuffer)) Socket->RxBufferWr -= sizeof(Socket->RxBuffer); //
movw R30,R12
subi R30,209 ; addi 1071
sbci R31,251
ldd R24,z+0
ldd R25,z+1
cpi R24,0
ldi R30,2
cpc R25,R30
brsh L148
.dbline 528
; //
; u32_Put(&Socket->LastRxData, 0); // reset timer
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
std y+0,R22
std y+1,R23
movw R18,R20
movw R16,R12
subi R16,251 ; offset = 5
sbci R17,255
xcall _u32_Put
.dbline 529
; Socket->TheirSequenceNum += (u32)i; // the next sequence number we will be expecting
movw R24,R12
adiw R24,16
movw R4,R10
clr R6
sbrc R5,7
com R6
clr R7
sbrc R6,7
com R7
movw R30,R24
ldd R20,z+0
ldd R21,z+1
ldd R22,z+2
ldd R23,z+3
add R20,R4
adc R21,R5
adc R22,R6
adc R23,R7
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
.dbline 530
; Socket->AckDelay = 0; // delayed ack send back
clr R2
clr R3
movw R30,R12
std z+10,R3
std z+9,R2
.dbline 534
; // Socket->Flags |= TCP_ACK; // we need to ACK the data they sent us
; //
; #ifdef Debug
; sprintf((char*)ScratchPad, "RxBufferRd:%d RxBufferWr:%d\n", Socket->RxBufferRd, Socket->RxBufferWr);
movw R30,R12
subi R30,209 ; addi 1071
sbci R31,251
ldd R2,z+0
ldd R3,z+1
std y+3,R3
std y+2,R2
movw R30,R12
subi R30,211 ; addi 1069
sbci R31,251
ldd R2,z+0
ldd R3,z+1
std y+1,R3
std y+0,R2
ldi R18,<L151
ldi R19,>L151
ldi R16,<_ScratchPad
ldi R17,>_ScratchPad
xcall _sprintf
.dbline 535
; SendDebugStr((char*)ScratchPad);
ldi R16,<_ScratchPad
ldi R17,>_ScratchPad
xcall _SendDebugStr
.dbline 538
; #endif
; //
; return i; //
movw R16,R10
.dbline -2
L141:
adiw R28,6
xcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r i 10 I
.dbsym l len 16 I
.dbsym r Src 14 pc
.dbsym r Socket 12 pS[TTCPSocket]
.dbend
.dbfunc e TCP_RxBytes _TCP_RxBytes fI
; Socket -> R20,R21
.even
_TCP_RxBytes::
xcall push_gset1
movw R20,R16
sbiw R28,2
.dbline -1
.dbline 542
; }
;
; int TCP_RxBytes(T_TCP_Socket *Socket)
; { // return how many tcp Rx bytes are in the sockets rx ring buffer
.dbline 543
; if (Socket == NULL) return 0; //
cpi R20,0
cpc R20,R21
brne L153
X17:
.dbline 543
clr R16
clr R17
xjmp L152
L153:
.dbline 544
; return RingBufBytes(sizeof(Socket->RxBuffer), Socket->RxBufferRd, Socket->RxBufferWr); // number of bytes in our buffer
movw R30,R20
subi R30,209 ; addi 1071
sbci R31,251
ldd R2,z+0
ldd R3,z+1
std y+1,R3
std y+0,R2
movw R30,R20
subi R30,211 ; addi 1069
sbci R31,251
ldd R18,z+0
ldd R19,z+1
ldi R16,512
ldi R17,2
xcall _RingBufBytes
.dbline -2
L152:
adiw R28,2
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r Socket 20 pS[TTCPSocket]
.dbend
.dbfunc e TCP_RxData _TCP_RxData fI
; i -> R20,R21
; len -> R12,R13
; Dest -> R10,R11
; Socket -> R22,R23
.even
_TCP_RxData::
xcall push_gset4
movw R10,R18
movw R22,R16
sbiw R28,6
ldd R12,y+14
ldd R13,y+15
.dbline -1
.dbline 548
; }
;
; int TCP_RxData(T_TCP_Socket *Socket, u8 *Dest, int len)
; { // get a number of bytes from the tcp rx ring buffer - this is called from the executive
.dbline 551
cpi R22,0
cpc R22,R23
breq L159
X18:
tst R10
brne X19
tst R11
breq L159
X19:
clr R2
clr R3
cp R2,R12
cpc R3,R13
brlt L156
L159:
.dbline 551
; int i;
;
; if ((Socket == NULL) || (!Dest) || (len <= 0)) return 0; //
clr R16
clr R17
xjmp L155
L156:
.dbline 553
; //
; i = TCP_RxBytes(Socket); // number of bytes waiting for them to collect
movw R16,R22
xcall _TCP_RxBytes
movw R20,R16
.dbline 554
; if (i <= 0) return 0; // none
clr R2
clr R3
cp R2,R16
cpc R3,R17
brlt L160
.dbline 554
clr R16
clr R17
xjmp L155
L160:
.dbline 555
; if (len > i) len = i; // limit number of bytes their gona get
cp R20,R12
cpc R21,R13
brge L162
.dbline 555
movw R12,R20
L162:
.dbline 557
; //
; i = CopyFromRingBuffer(Dest, Socket->RxBuffer, Socket->RxBufferRd, sizeof(Socket->RxBuffer), len); //
std y+5,R13
std y+4,R12
ldi R24,512
ldi R25,2
std y+3,R25
std y+2,R24
movw R30,R22
subi R30,211 ; addi 1069
sbci R31,251
ldd R2,z+0
ldd R3,z+1
std y+1,R3
std y+0,R2
movw R18,R22
subi R18,211 ; offset = 557
sbci R19,253
movw R16,R10
xcall _CopyFromRingBuffer
movw R20,R16
.dbline 558
; Socket->RxBufferRd += i; //
movw R24,R22
subi R24,211 ; offset = 1069
sbci R25,251
movw R30,R24
ldd R4,z+0
ldd R5,z+1
add R4,R16
adc R5,R17
std z+1,R5
std z+0,R4
xjmp L165
L164:
.dbline 559
movw R24,R22
subi R24,211 ; offset = 1069
sbci R25,251
movw R30,R24
ldd R24,z+0
ldd R25,z+1
subi R24,0
sbci R25,2
std z+1,R25
std z+0,R24
L165:
.dbline 559
; while (Socket->RxBufferRd >= sizeof(Socket->RxBuffer)) Socket->RxBufferRd -= sizeof(Socket->RxBuffer); //
movw R30,R22
subi R30,211 ; addi 1069
sbci R31,251
ldd R24,z+0
ldd R25,z+1
cpi R24,0
ldi R30,2
cpc R25,R30
brsh L164
.dbline 561
; //
; return i; //
movw R16,R20
.dbline -2
L155:
adiw R28,6
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r i 20 I
.dbsym r len 12 I
.dbsym r Dest 10 pc
.dbsym r Socket 22 pS[TTCPSocket]
.dbend
.dbfunc e TCP_TxFree _TCP_TxFree fI
; Socket -> R20,R21
.even
_TCP_TxFree::
xcall push_gset1
movw R20,R16
sbiw R28,2
.dbline -1
.dbline 565
; }
;
; int TCP_TxFree(T_TCP_Socket *Socket)
; { // return how much space we have in the sockets tx ring buffer
.dbline 566
; if (Socket == NULL) return 0;
cpi R20,0
cpc R20,R21
brne L168
X20:
.dbline 566
clr R16
clr R17
xjmp L167
L168:
.dbline 567
; return RingBufBytesFree(sizeof(Socket->TxBuffer), Socket->TxBufferRd, Socket->TxBufferWr);
movw R30,R20
subi R30,213 ; addi 555
sbci R31,253
ldd R2,z+0
ldd R3,z+1
std y+1,R3
std y+0,R2
movw R30,R20
subi R30,215 ; addi 553
sbci R31,253
ldd R18,z+0
ldd R19,z+1
ldi R16,512
ldi R17,2
xcall _RingBufBytesFree
.dbline -2
L167:
adiw R28,2
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r Socket 20 pS[TTCPSocket]
.dbend
.dbfunc e TCP_TxData _TCP_TxData fI
; i -> R20,R21
; len -> R12,R13
; Src -> R10,R11
; Socket -> R22,R23
.even
_TCP_TxData::
xcall push_gset4
movw R10,R18
movw R22,R16
sbiw R28,6
ldd R12,y+14
ldd R13,y+15
.dbline -1
.dbline 571
; }
;
; int TCP_TxData(T_TCP_Socket *Socket, u8 *Src, int len)
; { // save data into the sockets tx ring buffer - this will get sent down the tcp link
.dbline 574
cpi R22,0
cpc R22,R23
breq L175
X21:
tst R10
brne X22
tst R11
breq L175
X22:
clr R2
clr R3
cp R2,R12
cpc R3,R13
brge L175
movw R30,R22
ldd R24,z+0
cpi R24,4
breq L171
L175:
.dbline 574
; int i;
;
; if ((Socket == NULL) || (!Src) || (len <= 0) || (Socket->Stage != TCP_ESTABLISHED)) return 0; //
clr R16
clr R17
xjmp L170
L171:
.dbline 576
; //
; i = TCP_TxFree(Socket); // number of bytes free in our buffer
movw R16,R22
xcall _TCP_TxFree
movw R20,R16
.dbline 577
; if (len > i) len = i; // limit number of bytes we will send
cp R16,R12
cpc R17,R13
brge L176
.dbline 577
movw R12,R20
L176:
.dbline 578
; if (len > Socket->TheirMaxSegSize) len = Socket->TheirMaxSegSize; // they can only acept a certain amount
movw R30,R22
ldd R2,z+14
ldd R3,z+15
cp R2,R12
cpc R3,R13
brsh L178
.dbline 578
movw R30,R22
ldd R12,z+14
ldd R13,z+15
L178:
.dbline 579
; i = CopyToRingBuffer(Socket->TxBuffer, Src, Socket->TxBufferWr, sizeof(Socket->TxBuffer), len); // copy the bytes into the tcp tx buffer
std y+5,R13
std y+4,R12
ldi R24,512
ldi R25,2
std y+3,R25
std y+2,R24
movw R30,R22
subi R30,213 ; addi 555
sbci R31,253
ldd R2,z+0
ldd R3,z+1
std y+1,R3
std y+0,R2
movw R18,R10
movw R16,R22
subi R16,215 ; offset = 41
sbci R17,255
xcall _CopyToRingBuffer
movw R20,R16
.dbline 580
; Socket->TxBufferWr += i; //
movw R24,R22
subi R24,213 ; offset = 555
sbci R25,253
movw R30,R24
ldd R4,z+0
ldd R5,z+1
add R4,R16
adc R5,R17
std z+1,R5
std z+0,R4
xjmp L181
L180:
.dbline 581
movw R24,R22
subi R24,213 ; offset = 555
sbci R25,253
movw R30,R24
ldd R24,z+0
ldd R25,z+1
subi R24,0
sbci R25,2
std z+1,R25
std z+0,R24
L181:
.dbline 581
; while (Socket->TxBufferWr >= sizeof(Socket->TxBuffer)) Socket->TxBufferWr -= sizeof(Socket->TxBuffer); //
movw R30,R22
subi R30,213 ; addi 555
sbci R31,253
ldd R24,z+0
ldd R25,z+1
cpi R24,0
ldi R30,2
cpc R25,R30
brsh L180
.dbline 583
; //
; return i; // number of bytes saved into the buffer
movw R16,R20
.dbline -2
L170:
adiw R28,6
xcall pop_gset4
.dbline 0 ; func end
re
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -