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

📄 tcp.s

📁 AVR单片机系统开发经典实例部分源程序
💻 S
📖 第 1 页 / 共 5 页
字号:
	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 + -