📄 ppp.lis
字号:
0154 0895 ret
0156 .dbsym r len 20 I
0156 .dbsym r cp 22 pc
0156 .dbsym r fcs 10 i
0156 .dbend
0156 .dbfunc e ProcPPPSend _ProcPPPSend fV
0156 ; Checksum -> R20,R21
0156 ; len -> R22
0156 ; Buffer -> R10,R11
.even
0156 _ProcPPPSend::
0156 0E940000 xcall push_gset3
015A 622F mov R22,R18
015C 5801 movw R10,R16
015E .dbline -1
015E .dbline 81
015E ; }
015E ;
015E ;
015E ; /////////////////////////////////////////////////////////////
015E ; /*
015E ;
015E ; PPP包发送
015E ; 说明:0x00~0x20是ASCⅡ的控制字符,要进行转意处理。
015E ;
015E ; */
015E ; ////////////////////////////////////////////////////////////
015E ; void ProcPPPSend (BYTE *Buffer, BYTE len)
015E ; {
015E .dbline 82
015E ; WORD Checksum = 0;
015E 4427 clr R20
0160 5527 clr R21
0162 .dbline 83
0162 ; Checksum = PPPGetChecksum (Buffer, Buffer[7] + 4);
0162 F501 movw R30,R10
0164 2781 ldd R18,z+7
0166 3327 clr R19
0168 2C5F subi R18,252 ; offset = 4
016A 3F4F sbci R19,255
016C 8F01 movw R16,R30
016E B6DF xcall _PPPGetChecksum
0170 A801 movw R20,R16
0172 .dbline 84
0172 ; Buffer [Buffer[7]+4] = Checksum & 0xFF;
0172 F501 movw R30,R10
0174 E781 ldd R30,z+7
0176 FF27 clr R31
0178 EA0D add R30,R10
017A FB1D adc R31,R11
017C CA01 movw R24,R20
017E 9070 andi R25,0
0180 8483 std z+4,R24
0182 .dbline 85
0182 ; Buffer [Buffer[7]+5] = (Checksum >> 8) & 0xFF;
0182 F501 movw R30,R10
0184 E781 ldd R30,z+7
0186 FF27 clr R31
0188 EA0D add R30,R10
018A FB1D adc R31,R11
018C CA01 movw R24,R20
018E 892F mov R24,R25
0190 9927 clr R25
0192 9070 andi R25,0
0194 8583 std z+5,R24
0196 .dbline 86
0196 ; putchar (0x7E);
0196 0EE7 ldi R16,126
0198 0E940000 xcall _putchar
019C 2FC0 xjmp L33
019E L32:
019E .dbline 87
019E ; while (len--) {
019E .dbline 88
019E ; if(*Buffer < 0x20)
019E F501 movw R30,R10
01A0 8081 ldd R24,z+0
01A2 8032 cpi R24,32
01A4 50F4 brsh L35
01A6 .dbline 89
01A6 ; {
01A6 .dbline 90
01A6 ; putchar(0x7D);
01A6 0DE7 ldi R16,125
01A8 0E940000 xcall _putchar
01AC .dbline 91
01AC ; putchar(*Buffer ^ 0x20);
01AC 80E2 ldi R24,32
01AE F501 movw R30,R10
01B0 0081 ldd R16,z+0
01B2 0827 eor R16,R24
01B4 0E940000 xcall _putchar
01B8 .dbline 92
01B8 ; }
01B8 1EC0 xjmp L36
01BA L35:
01BA .dbline 93
01BA ; else {
01BA .dbline 94
01BA F501 movw R30,R10
01BC 4081 ldd R20,z+0
01BE 5527 clr R21
01C0 4D37 cpi R20,125
01C2 E0E0 ldi R30,0
01C4 5E07 cpc R21,R30
01C6 61F0 breq L41
01C8 4E37 cpi R20,126
01CA E0E0 ldi R30,0
01CC 5E07 cpc R21,R30
01CE 09F0 breq L40
01D0 0EC0 xjmp L37
01D2 X3:
01D2 .dbline 94
01D2 ; switch (*Buffer) {
01D2 L40:
01D2 .dbline 96
01D2 ; case 0x7E:
01D2 ; putchar (0x7D);
01D2 0DE7 ldi R16,125
01D4 0E940000 xcall _putchar
01D8 .dbline 97
01D8 ; putchar (0x5E);
01D8 0EE5 ldi R16,94
01DA 0E940000 xcall _putchar
01DE .dbline 98
01DE ; break;
01DE 0BC0 xjmp L38
01E0 L41:
01E0 .dbline 100
01E0 ; case 0x7D:
01E0 ; putchar (0x7D);
01E0 0DE7 ldi R16,125
01E2 0E940000 xcall _putchar
01E6 .dbline 101
01E6 ; putchar (0x5D);
01E6 0DE5 ldi R16,93
01E8 0E940000 xcall _putchar
01EC .dbline 102
01EC ; break;
01EC 04C0 xjmp L38
01EE L37:
01EE .dbline 104
01EE ; default:
01EE ; putchar (*Buffer);
01EE F501 movw R30,R10
01F0 0081 ldd R16,z+0
01F2 0E940000 xcall _putchar
01F6 .dbline 105
01F6 ; break;
01F6 L38:
01F6 .dbline 107
01F6 ; }
01F6 ; }
01F6 L36:
01F6 .dbline 108
01F6 C501 movw R24,R10
01F8 0196 adiw R24,1
01FA 5C01 movw R10,R24
01FC .dbline 109
01FC L33:
01FC .dbline 87
01FC 262E mov R2,R22
01FE 3324 clr R3
0200 6150 subi R22,1
0202 2220 tst R2
0204 09F0 breq X4
0206 CBCF xjmp L32
0208 X4:
0208 .dbline 110
0208 ; Buffer++;
0208 ; }
0208 ; putchar (0x7E);
0208 0EE7 ldi R16,126
020A 0E940000 xcall _putchar
020E .dbline -2
020E .dbline 111
020E ; }
020E L31:
020E 0E940000 xcall pop_gset3
0212 .dbline 0 ; func end
0212 0895 ret
0214 .dbsym r Checksum 20 i
0214 .dbsym r len 22 c
0214 .dbsym r Buffer 10 pc
0214 .dbend
0214 .dbfunc e ProcPPPReceive _ProcPPPReceive fV
0214 ; c -> R16
.even
0214 _ProcPPPReceive::
0214 .dbline -1
0214 .dbline 117
0214 ;
0214 ;
0214 ;
0214 ;
0214 ; void ProcPPPReceive (void)
0214 ; {
0214 .dbline 120
0214 ;
0214 ; BYTE c;
0214 ; c=UART_BUFFER[UART_ptr];
0214 80E0 ldi R24,<_UART_BUFFER
0216 90E0 ldi R25,>_UART_BUFFER
0218 E0910E00 lds R30,_UART_ptr
021C F0910F00 lds R31,_UART_ptr+1
0220 E80F add R30,R24
0222 F91F adc R31,R25
0224 0081 ldd R16,z+0
0226 .dbline 121
0226 ; PPPStatus |= ByteRx; //收到一个字节
0226 80910800 lds R24,_PPPStatus
022A 8061 ori R24,16
022C 80930800 sts _PPPStatus,R24
0230 .dbline 122
0230 ; if (PPPStatus & IsFrame) return; //判断是否收到一个完整的PPP包
0230 83FF sbrs R24,3
0232 01C0 rjmp L43
0234 .dbline 122
0234 95C0 xjmp L42
0236 L43:
0236 .dbline 124
0236 ; else
0236 ; {
0236 .dbline 125
0236 ; if(UART_ptr>(PPP_BUFFER_SIZE+3))
0236 83EB ldi R24,1203
0238 94E0 ldi R25,4
023A 20900E00 lds R2,_UART_ptr
023E 30900F00 lds R3,_UART_ptr+1
0242 8215 cp R24,R2
0244 9305 cpc R25,R3
0246 30F4 brsh L45
0248 .dbline 126
0248 ; {
0248 .dbline 127
0248 ; UART_ptr=0;
0248 2224 clr R2
024A 3324 clr R3
024C 30920F00 sts _UART_ptr+1,R3
0250 20920E00 sts _UART_ptr,R2
0254 .dbline 128
0254 ; }
0254 L45:
0254 .dbline 129
0254 ; UART_BUFFER[UART_ptr]='\0';
0254 80E0 ldi R24,<_UART_BUFFER
0256 90E0 ldi R25,>_UART_BUFFER
0258 E0910E00 lds R30,_UART_ptr
025C F0910F00 lds R31,_UART_ptr+1
0260 E80F add R30,R24
0262 F91F adc R31,R25
0264 2224 clr R2
0266 2082 std z+0,R2
0268 .dbline 130
0268 ; UART_ptr++;
0268 80910E00 lds R24,_UART_ptr
026C 90910F00 lds R25,_UART_ptr+1
0270 0196 adiw R24,1
0272 90930F00 sts _UART_ptr+1,R25
0276 80930E00 sts _UART_ptr,R24
027A .dbline 131
027A ; }
027A .dbline 134
027A ;
027A ; ///////////////////////////////////////////////////////
027A ; if (PPPStatus & ReSync) { //判断是否在初始状态
027A 20900800 lds R2,_PPPStatus
027E 22FE sbrs R2,2
0280 0BC0 rjmp L47
0282 .dbline 134
0282 .dbline 135
0282 ; if (c!= 0x7E) return; //判断是否包头
0282 0E37 cpi R16,126
0284 09F0 breq L49
0286 .dbline 135
0286 6CC0 xjmp L42
0288 L49:
0288 .dbline 136
0288 ; PPPStatus &= ~ReSync; //去掉初始状态
0288 80910800 lds R24,_PPPStatus
028C 8B7F andi R24,251
028E 80930800 sts _PPPStatus,R24
0292 .dbline 137
0292 ; FrameSize = 0; //清空缓冲区
0292 2224 clr R2
0294 20920900 sts _FrameSize,R2
0298 .dbline 138
0298 ; }
0298 L47:
0298 .dbline 140
0298 ; //////////////////////////////////////////////////////
0298 ; if (PPPStatus & IsESC) { //判断是否需要还原
0298 20900800 lds R2,_PPPStatus
029C 20FE sbrs R2,0
029E 19C0 rjmp L51
02A0 .dbline 140
02A0 .dbline 141
02A0 ; PPP_Packet [FrameSize++] = 0x20 ^ c; //还原
02A0 20900900 lds R2,_FrameSize
02A4 3324 clr R3
02A6 822D mov R24,R2
02A8 8F5F subi R24,255 ; addi 1
02AA 80930900 sts _FrameSize,R24
02AE 80E2 ldi R24,32
02B0 402E mov R4,R16
02B2 4826 eor R4,R24
02B4 60900A00 lds R6,_PPP_Packet
02B8 70900B00 lds R7,_PPP_Packet+1
02BC E22D mov R30,R2
02BE FF27 clr R31
02C0 E60D add R30,R6
02C2 F71D adc R31,R7
02C4 4082 std z+0,R4
02C6 .dbline 142
02C6 ; PPPStatus &= ~IsESC; //去掉还原状态
02C6 80910800 lds R24,_PPPStatus
02CA 8E7F andi R24,254
02CC 80930800 sts _PPPStatus,R24
02D0 .dbline 143
02D0 ; }
02D0 47C0 xjmp L52
02D2 L51:
02D2 .dbline 144
02D2 ; else {
02D2 .dbline 145
02D2 202F mov R18,R16
02D4 3327 clr R19
02D6 2D37 cpi R18,125
02D8 E0E0 ldi R30,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -