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