📄 ppp.lst
字号:
(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 + -