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

📄 ppp.s

📁 在串口上PPP拨号上网的源程序(实现PPP协议栈)
💻 S
📖 第 1 页 / 共 4 页
字号:
	movw R16,R30
	xcall _PPPGetChecksum
	movw R20,R16
	.dbline 84
; 	Buffer [Buffer[7]+4] = Checksum & 0xFF;
	movw R30,R10
	ldd R30,z+7
	clr R31
	add R30,R10
	adc R31,R11
	movw R24,R20
	andi R25,0
	std z+4,R24
	.dbline 85
; 	Buffer [Buffer[7]+5] = (Checksum >> 8) & 0xFF;
	movw R30,R10
	ldd R30,z+7
	clr R31
	add R30,R10
	adc R31,R11
	movw R24,R20
	mov R24,R25
	clr R25
	andi R25,0
	std z+5,R24
	.dbline 86
; 	putchar (0x7E);
	ldi R16,126
	xcall _putchar
	xjmp L33
L32:
	.dbline 87
; 	while (len--) {
	.dbline 88
; 		if(*Buffer < 0x20)
	movw R30,R10
	ldd R24,z+0
	cpi R24,32
	brsh L35
	.dbline 89
; 		{    
	.dbline 90
; 			putchar(0x7D);
	ldi R16,125
	xcall _putchar
	.dbline 91
; 			putchar(*Buffer ^ 0x20);
	ldi R24,32
	movw R30,R10
	ldd R16,z+0
	eor R16,R24
	xcall _putchar
	.dbline 92
; 		} 	
	xjmp L36
L35:
	.dbline 93
; 		else {
	.dbline 94
	movw R30,R10
	ldd R20,z+0
	clr R21
	cpi R20,125
	ldi R30,0
	cpc R21,R30
	breq L41
	cpi R20,126
	ldi R30,0
	cpc R21,R30
	breq L40
	xjmp L37
X3:
	.dbline 94
; 			switch (*Buffer) {
L40:
	.dbline 96
; 				case 0x7E:
; 					putchar (0x7D);
	ldi R16,125
	xcall _putchar
	.dbline 97
; 					putchar (0x5E);
	ldi R16,94
	xcall _putchar
	.dbline 98
; 				    break;
	xjmp L38
L41:
	.dbline 100
; 				case 0x7D:
; 					putchar (0x7D);
	ldi R16,125
	xcall _putchar
	.dbline 101
; 					putchar (0x5D);
	ldi R16,93
	xcall _putchar
	.dbline 102
; 				    break;
	xjmp L38
L37:
	.dbline 104
; 				default:
; 					putchar (*Buffer);
	movw R30,R10
	ldd R16,z+0
	xcall _putchar
	.dbline 105
; 				    break;
L38:
	.dbline 107
; 			 }
; 		}
L36:
	.dbline 108
	movw R24,R10
	adiw R24,1
	movw R10,R24
	.dbline 109
L33:
	.dbline 87
	mov R2,R22
	clr R3
	subi R22,1
	tst R2
	breq X4
	xjmp L32
X4:
	.dbline 110
; 		Buffer++;
; 	}
; 	putchar (0x7E);
	ldi R16,126
	xcall _putchar
	.dbline -2
	.dbline 111
; }
L31:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r Checksum 20 i
	.dbsym r len 22 c
	.dbsym r Buffer 10 pc
	.dbend
	.dbfunc e ProcPPPReceive _ProcPPPReceive fV
;              c -> R16
	.even
_ProcPPPReceive::
	.dbline -1
	.dbline 117
; 
; 
; 
; 
; void ProcPPPReceive (void)
;  {  
	.dbline 120
; 
; 	BYTE c;
;  	c=UART_BUFFER[UART_ptr];
	ldi R24,<_UART_BUFFER
	ldi R25,>_UART_BUFFER
	lds R30,_UART_ptr
	lds R31,_UART_ptr+1
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	.dbline 121
; 	PPPStatus |= ByteRx;                //收到一个字节
	lds R24,_PPPStatus
	ori R24,16
	sts _PPPStatus,R24
	.dbline 122
; 	if (PPPStatus & IsFrame) return;    //判断是否收到一个完整的PPP包
	sbrs R24,3
	rjmp L43
	.dbline 122
	xjmp L42
L43:
	.dbline 124
; 	else
; 	{
	.dbline 125
; 	 if(UART_ptr>(PPP_BUFFER_SIZE+3))
	ldi R24,1203
	ldi R25,4
	lds R2,_UART_ptr
	lds R3,_UART_ptr+1
	cp R24,R2
	cpc R25,R3
	brsh L45
	.dbline 126
; 	{
	.dbline 127
; 	UART_ptr=0;
	clr R2
	clr R3
	sts _UART_ptr+1,R3
	sts _UART_ptr,R2
	.dbline 128
; 	}
L45:
	.dbline 129
; 	UART_BUFFER[UART_ptr]='\0';
	ldi R24,<_UART_BUFFER
	ldi R25,>_UART_BUFFER
	lds R30,_UART_ptr
	lds R31,_UART_ptr+1
	add R30,R24
	adc R31,R25
	clr R2
	std z+0,R2
	.dbline 130
; 	UART_ptr++;
	lds R24,_UART_ptr
	lds R25,_UART_ptr+1
	adiw R24,1
	sts _UART_ptr+1,R25
	sts _UART_ptr,R24
	.dbline 131
; 	}
	.dbline 134
; 
; 	///////////////////////////////////////////////////////
; 	if (PPPStatus & ReSync) {           //判断是否在初始状态
	lds R2,_PPPStatus
	sbrs R2,2
	rjmp L47
	.dbline 134
	.dbline 135
; 		if (c!= 0x7E) return;      //判断是否包头
	cpi R16,126
	breq L49
	.dbline 135
	xjmp L42
L49:
	.dbline 136
; 		PPPStatus &= ~ReSync;       //去掉初始状态
	lds R24,_PPPStatus
	andi R24,251
	sts _PPPStatus,R24
	.dbline 137
; 		FrameSize = 0;              //清空缓冲区
	clr R2
	sts _FrameSize,R2
	.dbline 138
; 	}
L47:
	.dbline 140
;    //////////////////////////////////////////////////////
; 	if (PPPStatus & IsESC) {                            //判断是否需要还原
	lds R2,_PPPStatus
	sbrs R2,0
	rjmp L51
	.dbline 140
	.dbline 141
; 		PPP_Packet [FrameSize++] = 0x20 ^ c;        //还原
	lds R2,_FrameSize
	clr R3
	mov R24,R2
	subi R24,255    ; addi 1
	sts _FrameSize,R24
	ldi R24,32
	mov R4,R16
	eor R4,R24
	lds R6,_PPP_Packet
	lds R7,_PPP_Packet+1
	mov R30,R2
	clr R31
	add R30,R6
	adc R31,R7
	std z+0,R4
	.dbline 142
; 		PPPStatus &= ~IsESC;                        //去掉还原状态
	lds R24,_PPPStatus
	andi R24,254
	sts _PPPStatus,R24
	.dbline 143
; 	}
	xjmp L52
L51:
	.dbline 144
; 	else {
	.dbline 145
	mov R18,R16
	clr R19
	cpi R18,125
	ldi R30,0
	cpc R19,R30
	breq L56
	cpi R18,126
	ldi R30,0
	cpc R19,R30
	breq L57
	xjmp L53
X5:
	.dbline 145
; 		switch (c) {
L56:
	.dbline 147
; 			case ESC:		            // 如果是0x7D,置为还原状态
; 				PPPStatus |= IsESC;    
	lds R24,_PPPStatus
	ori R24,1
	sts _PPPStatus,R24
	.dbline 148
; 			break;
	xjmp L54
L57:
	.dbline 151
; 
; 			case END:		            // 如果是0x7E,置为收到完整的PPP状态
; 				if (FrameSize > 0) {	
	clr R2
	lds R3,_FrameSize
	cp R2,R3
	brsh L54
	.dbline 151
	.dbline 152
; 					PPP_Packet [FrameSize] = 0;
	lds R2,_PPP_Packet
	lds R3,_PPP_Packet+1
	lds R30,_FrameSize
	clr R31
	add R30,R2
	adc R31,R3
	clr R2
	std z+0,R2
	.dbline 153
; 					PPPStatus |= IsFrame;	
	lds R24,_PPPStatus
	ori R24,8
	sts _PPPStatus,R24
	.dbline 154
; 				}
	.dbline 155
; 			break;
	xjmp L54
L53:
	.dbline 158
; 
; 			default:                            //接收PPP数据
; 				PPP_Packet [FrameSize++] = c;
	lds R2,_FrameSize
	clr R3
	mov R24,R2
	subi R24,255    ; addi 1
	sts _FrameSize,R24
	lds R4,_PPP_Packet
	lds R5,_PPP_Packet+1
	mov R30,R2
	clr R31
	add R30,R4
	adc R31,R5
	std z+0,R16
	.dbline 159
; 				if (FrameSize > (PPP_BUFFER_SIZE - 6)) {     //?
	ldi R24,1194
	ldi R25,4
	lds R2,_FrameSize
	clr R3
	cp R24,R2
	cpc R25,R3
	brge L54
	.dbline 159
	.dbline 160
; 					FrameSize = 0;                   //清空缓冲区
	clr R2
	sts _FrameSize,R2
	.dbline 161
; 					PPPStatus |= ReSync;             //置为初始状态
	lds R24,_PPPStatus
	ori R24,4
	sts _PPPStatus,R24
	.dbline 162
; 				}
	.dbline 163
; 			break;
L54:
	.dbline 165
L52:
	.dbline -2
	.dbline 168
; 		}
;         }
; 
; 
; }
L42:
	.dbline 0 ; func end
	ret
	.dbsym r c 16 c
	.dbend
	.dbfunc s HandleLCPOptions _HandleLCPOptions fV
;            nak -> R14
;            rej -> R20
;        length0 -> y+64
;   temp_buffer1 -> y+42
;              j -> R10
;   temp_buffer2 -> y+2
;        length1 -> y+62
;              i -> R22
	.even
_HandleLCPOptions:
	xcall push_gset5
	sbiw R28,63
	sbiw R28,3  ; offset = 66
	.dbline -1
	.dbline 172
; 
; 
; 
; static void HandleLCPOptions (void) {
	.dbline 173
; WORD length0=0;                     //保存LCP的数据长度
	clr R0
	clr R1
	movw R30,R28
	subi R30,192  ; addi 64
	sbci R31,255
	std z+1,R1
	std z+0,R0
	.dbline 174
; WORD length1=8;                     //保存单个LCP包开始位置
	ldi R24,8
	ldi R25,0
	std y+63,R25
	std y+62,R24
	.dbline 175
; BYTE rej=0;                         //是否要发拒绝包
	clr R20
	.dbline 176
; BYTE nak=0;                         //是否要发否定包
	clr R14
	.dbline 177
; BYTE i=0;                           
	clr R22
	.dbline 178
; BYTE j=0;                              
	clr R10
	.dbline 183
	lds R12,_InBuffer+4
	clr R13
	movw R24,R12
	cpi R24,1
	ldi R30,0
	cpc R25,R30
	brne X10
	xjmp L71
X10:
	cpi R24,2
	ldi R30,0
	cpc R25,R30
	brne X11
	xjmp L123
X11:
	cpi R24,3
	ldi R30,0
	cpc R25,R30
	brne X12
	xjmp L127
X12:
	cpi R24,4
	ldi R30,0
	cpc R25,R30
	brne X13
	xjmp L62
X13:
	cpi R24,5
	ldi R30,0
	cpc R25,R30
	breq L67
	cpi R24,6
	ldi R30,0
	cpc R25,R30
	brne X14
	xjmp L139
X14:
	xjmp L62
X6:
	.dbline 183
; BYTE temp_buffer1[20];              //LCP 协商类型
; WORD temp_buffer2[20];              //LCP 各个协商类型在缓冲中的位置
; 
; 
; 	switch (InBuffer [4] ) {
L67:
	.dbline 187
; 
; 		//++++++++++++++++++++++++++++++++++++++++++++++++++++
; 		case LCP_TERMINATE_REQUEST:			//"Server Terminate-Request received"
; 			Move (InBuffer, OutBuffer, InBuffer[7]+4);
	lds R24,_InBuffer+7
	clr R25
	adiw R24,4
	std y+1,R25
	std y+0,R24
	ldi R18,<_OutBuffer
	ldi R19,>_OutBuffer
	ldi R16,<_InBuffer
	ldi R17,>_InBuffer
	xcall _Move
	.dbline 188
; 			OutBuffer [4] = LCP_TERMINATE_ACK;
	ldi R24,6
	sts _OutBuffer+4,R24
	.dbline 189
; 			ProcPPPSend ((BYTE *)OutBuffer, OutBuffer[7] + 6);					
	lds R18,_OutBuffer+7
	subi R18,250    ; addi 6
	ldi R16,<_OutBuffer
	ldi R17,>_OutBuffer
	xcall _ProcPPPSend
	.dbline 190
; 			PPPStatus &= ~LinkOn;
	lds R24,_PPPStatus
	andi R24,223
	sts _PPPStatus,R24
	.dbline 191
; 		break;
	xjmp L62
L71:
	.dbline 195
; 
; 		//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; 		case LCP_CONFIG_REQUEST:
; 		      length0=InBuffer[7]-4;                  //LCP的数据长度
	lds R24,_InBuffer+7
	clr R25
	sbiw R24,4
	movw R30,R28
	subi R30,192  ; addi 64
	sbci R31,255
	std z+1,R25
	std z+0,R24
	xjmp L74
L73:
	.dbline 197
	.dbline 198
	ldi R24,<_InBuffer
	ldi R25,>_InBuffer
	ldd R30,y+62
	ldd R31,y+63
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	movw R24,R28
	adiw R24,42
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 199
	ldi R24,2
	mul R24,R10
	movw R30,R0
	movw R24,R28
	adiw R24,2
	add R30,R24
	adc R31,R25
	ldd R0,y+62
	ldd R1,y+63
	std z+1,R1
	std z+0,R0
	.dbline 200
	ldi R24,<_InBuffer
	ldi R25,>_InBuffer
	movw R30,R0
	adiw R30,1
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	clr R3
	movw R30,R28
	subi R30,192  ; addi 64
	sbci R31,255
	ldd R0,z+0
	ldd R1,z+1
	sub R0,R2
	sbc R1,R3
	movw R30,R28
	subi R30,192  ; addi 64
	sbci R31,255
	std z+1,R1
	std z+0,R0
	.dbline 201
	ldd R30,y+62
	ldd R31,y+63
	adiw R30,1
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	clr R3
	ldd R0,y+62
	ldd R1,y+63
	add R0,R2
	adc R1,R3
	std y+63,R1
	std y+62,R0
	.dbline 202
	inc R10
	.dbline 203
L74:
	.dbline 196
; 			  while(length0)                     
	movw R30,R28
	subi R30,192  ; addi 64
	sbci R31,255
	ldd R0,z+0
	ldd R1,z+1
	tst R0
	breq X15
	xjmp L73
X15:
	tst R1
	breq X16
	xjmp L73
X16:
X7:
	.dbline 204
; 			  {
; 			    temp_buffer1[j]=InBuffer[length1];//读取LCP 协商类型
; 			    temp_buffer2[j]=length1;          //读取LCP 各个协商类型在缓冲中的位置
; 			    length0-=InBuffer[length1+1];     //
; 			    length1+=InBuffer[length1+1];     //
; 			    j++;
; 			  }//end of while(length0)
; 			  Move (InBuffer, OutBuffer, 8);
	ldi R24,8
	ldi R25,0
	std y+1,R25
	std y+0,R24
	ldi R18,<_OutBuffer
	ldi R19,>_OutBuffer
	ldi R16,<_InBuffer
	ldi R17,>_InBuffer
	xcall _Move
	.dbline 205
; 			  length1=8;
	ldi R24,8
	ldi R25,0
	std y+63,R25
	std y+62,R24
	.dbline 206
; 			  OutBuffer[7]=4;
	ldi R24,4
	sts _OutBuffer+7,R24
	.dbline 207
; 			  for(i=0;i<j;i++)
	clr R22
	xjmp L80
L77:
	.dbline 208
; 			  {
	.dbline 209
; 			  if(!((temp_buffer1[i]==LCP_OPT_MRU)
	movw R24,R28
	adiw R24,42
	mov R30,R22
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	clr R3
	mov R24,R2
	cpi R24,1
	brne X17
	xjmp L81
X17:
	cpi R24,2
	brne X18
	xjmp L81
X18:
	cpi R24,5
	brne X19
	xjmp L81
X19:
	.dbline 212
; 			  ||(temp_buffer1[i]==LCP_OPT_ASYNC_MAP)
; 			  ||(temp_buffer1[i]==LCP_OPT_MAGIC)))
; 			   {
	.dbline 213
; 				Move (&InBuffer[temp_buffer2[i]],&OutBuffer[length1],InBuffer[temp_buffer2[i]+1]);
	ldi R24,2
	mul R24,R22
	movw R30,R0
	movw R24,R28
	adiw R24,2
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldd R3,z+1
	ldi R24,<_InBuffer
	ldi R25,>_InBuffer
	movw R30,R2
	adiw R30,1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -