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

📄 ppp.lst

📁 在串口上PPP拨号上网的源程序(实现PPP协议栈)
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0059) }
    0493 940E0C00  CALL	pop_gset1
    0495 9508      RET
_PPPGetChecksum:
  len                  --> R22
  cp                   --> R20
    0496 940E0C14  CALL	push_gset2
    0498 01B9      MOVW	R22,R18
    0499 01A8      MOVW	R20,R16
    049A 9722      SBIW	R28,2
(0060) 
(0061) WORD PPPGetChecksum (register unsigned char *cp, register int len) {
(0062) 	   return ~PPPfcs16(0xffff, cp, len );
    049B 8379      STD	Y+1,R23
    049C 8368      STD	Y+0,R22
    049D 019A      MOVW	R18,R20
    049E EF0F      LDI	R16,0xFF
    049F EF1F      LDI	R17,0xFF
    04A0 D006      RCALL	_PPPfcs16
    04A1 9500      COM	R16
    04A2 9510      COM	R17
    04A3 9622      ADIW	R28,2
    04A4 940E0BF4  CALL	pop_gset2
    04A6 9508      RET
_PPPfcs16:
  len                  --> R20
  cp                   --> R22
  fcs                  --> R10
    04A7 940E0C18  CALL	push_gset3
    04A9 01B9      MOVW	R22,R18
    04AA 0158      MOVW	R10,R16
    04AB 814E      LDD	R20,Y+6
    04AC 815F      LDD	R21,Y+7
(0063) }
(0064) 
(0065) static WORD PPPfcs16 (WORD fcs, BYTE *cp, int len) {
    04AD C01A      RJMP	0x04C8
(0066) 	   while (len--) 
(0067) 		   fcs = (fcs >> 8) ^ fcstab[(fcs ^ *cp++) & 0xff];
    04AE 01FB      MOVW	R30,R22
    04AF 9021      LD	R2,Z+
    04B0 01BF      MOVW	R22,R30
    04B1 2433      CLR	R3
    04B2 0195      MOVW	R18,R10
    04B3 2522      EOR	R18,R2
    04B4 2533      EOR	R19,R3
    04B5 7030      ANDI	R19,0
    04B6 E002      LDI	R16,2
    04B7 E010      LDI	R17,0
    04B8 940E0BE4  CALL	empy16s
    04BA 01F8      MOVW	R30,R16
    04BB E88C      LDI	R24,0x8C
    04BC E092      LDI	R25,2
    04BD 0FE8      ADD	R30,R24
    04BE 1FF9      ADC	R31,R25
    04BF 9005      LPM	R0,Z+
    04C0 9014      LPM	R1,0(Z)
    04C1 01F0      MOVW	R30,R0
    04C2 0115      MOVW	R2,R10
    04C3 2C23      MOV	R2,R3
    04C4 2433      CLR	R3
    04C5 262E      EOR	R2,R30
    04C6 263F      EOR	R3,R31
    04C7 0151      MOVW	R10,R2
    04C8 011A      MOVW	R2,R20
    04C9 5041      SUBI	R20,1
    04CA 4050      SBCI	R21,0
    04CB 2022      TST	R2
    04CC F709      BNE	0x04AE
    04CD 2033      TST	R3
    04CE F6F9      BNE	0x04AE
(0068)        return (fcs);
    04CF 0185      MOVW	R16,R10
    04D0 940E0BF7  CALL	pop_gset3
    04D2 9508      RET
_ProcPPPSend:
  Checksum             --> R20
  len                  --> R22
  Buffer               --> R10
    04D3 940E0C18  CALL	push_gset3
    04D5 2F62      MOV	R22,R18
    04D6 0158      MOVW	R10,R16
(0069) }
(0070) 
(0071) 
(0072) /////////////////////////////////////////////////////////////
(0073) /*
(0074) 
(0075) PPP包发送
(0076) 说明:0x00~0x20是ASCⅡ的控制字符,要进行转意处理。 
(0077) 
(0078) */
(0079) ////////////////////////////////////////////////////////////
(0080) void ProcPPPSend (BYTE *Buffer, BYTE len) 
(0081) {
(0082) 	WORD Checksum = 0;
    04D7 2744      CLR	R20
    04D8 2755      CLR	R21
(0083) 	Checksum = PPPGetChecksum (Buffer, Buffer[7] + 4);
    04D9 01F5      MOVW	R30,R10
    04DA 8127      LDD	R18,Z+7
    04DB 2733      CLR	R19
    04DC 5F2C      SUBI	R18,0xFC
    04DD 4F3F      SBCI	R19,0xFF
    04DE 018F      MOVW	R16,R30
    04DF DFB6      RCALL	_PPPGetChecksum
    04E0 01A8      MOVW	R20,R16
(0084) 	Buffer [Buffer[7]+4] = Checksum & 0xFF;
    04E1 01F5      MOVW	R30,R10
    04E2 81E7      LDD	R30,Z+7
    04E3 27FF      CLR	R31
    04E4 0DEA      ADD	R30,R10
    04E5 1DFB      ADC	R31,R11
    04E6 01CA      MOVW	R24,R20
    04E7 7090      ANDI	R25,0
    04E8 8384      STD	Z+4,R24
(0085) 	Buffer [Buffer[7]+5] = (Checksum >> 8) & 0xFF;
    04E9 01F5      MOVW	R30,R10
    04EA 81E7      LDD	R30,Z+7
    04EB 27FF      CLR	R31
    04EC 0DEA      ADD	R30,R10
    04ED 1DFB      ADC	R31,R11
    04EE 01CA      MOVW	R24,R20
    04EF 2F89      MOV	R24,R25
    04F0 2799      CLR	R25
    04F1 7090      ANDI	R25,0
    04F2 8385      STD	Z+5,R24
(0086) 	putchar (0x7E);
    04F3 E70E      LDI	R16,0x7E
    04F4 940E0B92  CALL	_putchar
    04F6 C02F      RJMP	0x0526
(0087) 	while (len--) {
(0088) 		if(*Buffer < 0x20)
    04F7 01F5      MOVW	R30,R10
    04F8 8180      LDD	R24,Z+0
    04F9 3280      CPI	R24,0x20
    04FA F450      BCC	0x0505
(0089) 		{    
(0090) 			putchar(0x7D);
    04FB E70D      LDI	R16,0x7D
    04FC 940E0B92  CALL	_putchar
(0091) 			putchar(*Buffer ^ 0x20);
    04FE E280      LDI	R24,0x20
    04FF 01F5      MOVW	R30,R10
    0500 8100      LDD	R16,Z+0
    0501 2708      EOR	R16,R24
    0502 940E0B92  CALL	_putchar
(0092) 		} 	
    0504 C01E      RJMP	0x0523
(0093) 		else {
(0094) 			switch (*Buffer) {
    0505 01F5      MOVW	R30,R10
    0506 8140      LDD	R20,Z+0
    0507 2755      CLR	R21
    0508 374D      CPI	R20,0x7D
    0509 E0E0      LDI	R30,0
    050A 075E      CPC	R21,R30
    050B F061      BEQ	0x0518
    050C 374E      CPI	R20,0x7E
    050D E0E0      LDI	R30,0
    050E 075E      CPC	R21,R30
    050F F009      BEQ	0x0511
    0510 C00E      RJMP	0x051F
(0095) 				case 0x7E:
(0096) 					putchar (0x7D);
    0511 E70D      LDI	R16,0x7D
    0512 940E0B92  CALL	_putchar
(0097) 					putchar (0x5E);
    0514 E50E      LDI	R16,0x5E
    0515 940E0B92  CALL	_putchar
(0098) 				    break;
    0517 C00B      RJMP	0x0523
(0099) 				case 0x7D:
(0100) 					putchar (0x7D);
    0518 E70D      LDI	R16,0x7D
    0519 940E0B92  CALL	_putchar
(0101) 					putchar (0x5D);
    051B E50D      LDI	R16,0x5D
    051C 940E0B92  CALL	_putchar
(0102) 				    break;
    051E C004      RJMP	0x0523
(0103) 				default:
(0104) 					putchar (*Buffer);
    051F 01F5      MOVW	R30,R10
    0520 8100      LDD	R16,Z+0
    0521 940E0B92  CALL	_putchar
(0105) 				    break;
(0106) 			 }
(0107) 		}
(0108) 		Buffer++;
    0523 01C5      MOVW	R24,R10
    0524 9601      ADIW	R24,1
    0525 015C      MOVW	R10,R24
    0526 2E26      MOV	R2,R22
    0527 2433      CLR	R3
    0528 5061      SUBI	R22,1
    0529 2022      TST	R2
    052A F009      BEQ	0x052C
    052B CFCB      RJMP	0x04F7
(0109) 	}
(0110) 	putchar (0x7E);
    052C E70E      LDI	R16,0x7E
    052D 940E0B92  CALL	_putchar
(0111) }
    052F 940E0BF7  CALL	pop_gset3
    0531 9508      RET
(0112) 
(0113) 
(0114) 
(0115) 
(0116) void ProcPPPReceive (void)
(0117)  {  
(0118) 
(0119) 	BYTE c;
(0120)  	c=UART_BUFFER[UART_ptr];
_ProcPPPReceive:
  c                    --> R16
    0532 E38B      LDI	R24,0x3B
    0533 E091      LDI	R25,1
    0534 91E00131  LDS	R30,0x131
    0536 91F00132  LDS	R31,0x132
    0538 0FE8      ADD	R30,R24
    0539 1FF9      ADC	R31,R25
    053A 8100      LDD	R16,Z+0
(0121) 	PPPStatus |= ByteRx;                //收到一个字节
    053B 9180012B  LDS	R24,0x12B
    053D 6180      ORI	R24,0x10
    053E 9380012B  STS	0x12B,R24
(0122) 	if (PPPStatus & IsFrame) return;    //判断是否收到一个完整的PPP包
    0540 FF83      SBRS	R24,3
    0541 C001      RJMP	0x0543
    0542 C095      RJMP	0x05D8
(0123) 	else
(0124) 	{
(0125) 	 if(UART_ptr>(PPP_BUFFER_SIZE+3))
    0543 EB83      LDI	R24,0xB3
    0544 E094      LDI	R25,4
    0545 90200131  LDS	R2,0x131
    0547 90300132  LDS	R3,0x132
    0549 1582      CP	R24,R2
    054A 0593      CPC	R25,R3
    054B F430      BCC	0x0552
(0126) 	{
(0127) 	UART_ptr=0;
    054C 2422      CLR	R2
    054D 2433      CLR	R3
    054E 92300132  STS	0x132,R3
    0550 92200131  STS	0x131,R2
(0128) 	}
(0129) 	UART_BUFFER[UART_ptr]='\0';
    0552 E38B      LDI	R24,0x3B
    0553 E091      LDI	R25,1
    0554 91E00131  LDS	R30,0x131
    0556 91F00132  LDS	R31,0x132
    0558 0FE8      ADD	R30,R24
    0559 1FF9      ADC	R31,R25
    055A 2422      CLR	R2
    055B 8220      STD	Z+0,R2
(0130) 	UART_ptr++;
    055C 91800131  LDS	R24,0x131
    055E 91900132  LDS	R25,0x132
    0560 9601      ADIW	R24,1
    0561 93900132  STS	0x132,R25
    0563 93800131  STS	0x131,R24
(0131) 	}
(0132) 
(0133) 	///////////////////////////////////////////////////////
(0134) 	if (PPPStatus & ReSync) {           //判断是否在初始状态
    0565 9020012B  LDS	R2,0x12B
    0567 FE22      SBRS	R2,2
    0568 C00B      RJMP	0x0574
(0135) 		if (c!= 0x7E) return;      //判断是否包头
    0569 370E      CPI	R16,0x7E
    056A F009      BEQ	0x056C
    056B C06C      RJMP	0x05D8
(0136) 		PPPStatus &= ~ReSync;       //去掉初始状态
    056C 9180012B  LDS	R24,0x12B
    056E 7F8B      ANDI	R24,0xFB
    056F 9380012B  STS	0x12B,R24
(0137) 		FrameSize = 0;              //清空缓冲区
    0571 2422      CLR	R2
    0572 9220012C  STS	0x12C,R2
(0138) 	}
(0139)    //////////////////////////////////////////////////////
(0140) 	if (PPPStatus & IsESC) {                            //判断是否需要还原
    0574 9020012B  LDS	R2,0x12B
    0576 FE20      SBRS	R2,0
    0577 C019      RJMP	0x0591
(0141) 		PPP_Packet [FrameSize++] = 0x20 ^ c;        //还原
    0578 9020012C  LDS	R2,0x12C
    057A 2433      CLR	R3
    057B 2D82      MOV	R24,R2
    057C 5F8F      SUBI	R24,0xFF
    057D 9380012C  STS	0x12C,R24
    057F E280      LDI	R24,0x20
    0580 2E40      MOV	R4,R16
    0581 2648      EOR	R4,R24
    0582 9060012D  LDS	R6,0x12D
    0584 9070012E  LDS	R7,0x12E
    0586 2DE2      MOV	R30,R2
    0587 27FF      CLR	R31
    0588 0DE6      ADD	R30,R6
    0589 1DF7      ADC	R31,R7
    058A 8240      STD	Z+0,R4
(0142) 		PPPStatus &= ~IsESC;                        //去掉还原状态
    058B 9180012B  LDS	R24,0x12B
    058D 7F8E      ANDI	R24,0xFE
    058E 9380012B  STS	0x12B,R24
(0143) 	}
    0590 C047      RJMP	0x05D8
(0144) 	else {
(0145) 		switch (c) {
    0591 2F20      MOV	R18,R16
    0592 2733      CLR	R19
    0593 372D      CPI	R18,0x7D
    0594 E0E0      LDI	R30,0
    0595 073E      CPC	R19,R30
    0596 F029      BEQ	0x059C
    0597 372E      CPI	R18,0x7E
    0598 E0E0      LDI	R30,0
    0599 073E      CPC	R19,R30
    059A F039      BEQ	0x05A2
    059B C01C      RJMP	0x05B8
(0146) 			case ESC:		            // 如果是0x7D,置为还原状态
(0147) 				PPPStatus |= IsESC;    
    059C 9180012B  LDS	R24,0x12B
    059E 6081      ORI	R24,1
    059F 9380012B  STS	0x12B,R24
(0148) 			break;
    05A1 C036      RJMP	0x05D8
(0149) 
(0150) 			case END:		            // 如果是0x7E,置为收到完整的PPP状态
(0151) 				if (FrameSize > 0) {	
    05A2 2422      CLR	R2
    05A3 9030012C  LDS	R3,0x12C
    05A5 1423      CP	R2,R3
    05A6 F588      BCC	0x05D8
(0152) 					PPP_Packet [FrameSize] = 0;
    05A7 9020012D  LDS	R2,0x12D
    05A9 9030012E  LDS	R3,0x12E
    05AB 91E0012C  LDS	R30,0x12C
    05AD 27FF      CLR	R31
    05AE 0DE2      ADD	R30,R2
    05AF 1DF3      ADC	R31,R3
    05B0 2422      CLR	R2
    05B1 8220      STD	Z+0,R2
(0153) 					PPPStatus |= IsFrame;	
    05B2 9180012B  LDS	R24,0x12B
    05B4 6088      ORI	R24,0x8
    05B5 9380012B  STS	0x12B,R24
(0154) 				}
(0155) 			break;
    05B7 C020      RJMP	0x05D8
(0156) 
(0157) 			default:                            //接收PPP数据
(0158) 				PPP_Packet [FrameSize++] = c;
    05B8 9020012C  LDS	R2,0x12C
    05BA 2433      CLR	R3
    05BB 2D82      MOV	R24,R2
    05BC 5F8F      SUBI	R24,0xFF
    05BD 9380012C  STS	0x12C,R24
    05BF 9040012D  LDS	R4,0x12D
    05C1 9050012E  LDS	R5,0x12E
    05C3 2DE2      MOV	R30,R2
    05C4 27FF      CLR	R31
    05C5 0DE4      ADD	R30,R4
    05C6 1DF5      ADC	R31,R5
    05C7 8300      STD	Z+0,R16
(0159) 				if (FrameSize > (PPP_BUFFER_SIZE - 6)) {     //?
    05C8 EA8A      LDI	R24,0xAA
    05C9 E094      LDI	R25,4
    05CA 9020012C  LDS	R2,0x12C
    05CC 2433      CLR	R3
    05CD 1582      CP	R24,R2
    05CE 0593      CPC	R25,R3
    05CF F444      BGE	0x05D8
(0160) 					FrameSize = 0;                   //清空缓冲区
    05D0 2422      CLR	R2
    05D1 9220012C  STS	0x12C,R2
(0161) 					PPPStatus |= ReSync;             //置为初始状态
    05D3 9180012B  LDS	R24,0x12B
    05D5 6084      ORI	R24,4
    05D6 9380012B  STS	0x12B,R24
(0162) 				}
(0163) 			break;
(0164) 		}
(0165)         }
(0166) 
(0167) 
(0168) }
    05D8 9508      RET
_HandleLCPOptions:
  nak                  --> R14
  rej                  --> R20
  length0              --> Y+64
  temp_buffer1         --> Y+42
  j                    --> R10
  temp_buffer2         --> Y+2
  length1              --> Y+62
  i                    --> R22
    05D9 940E0C20  CALL	push_gset5
    05DB 97EF      SBIW	R28,0x3F
    05DC 9723      SBIW	R28,3
(0169) 
(0170) 
(0171) 
(0172) static void HandleLCPOptions (void) {
(0173) WORD length0=0;                     //保存LCP的数据长度
    05DD 2400      CLR	R0
    05DE 2411      CLR	R1
    05DF 01FE      MOVW	R30,R28
    05E0 5CE0      SUBI	R30,0xC0
    05E1 4FFF      SBCI	R31,0xFF
    05E2 8211      STD	Z+1,R1

⌨️ 快捷键说明

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