📄 icmp.lis
字号:
02C4 8F01 movw R16,R30
02C6 0E940000 xcall _IP_Checksum1
02CA 0E940000 xcall _htons
02CE E0910000 lds R30,_IP_Header
02D2 F0910100 lds R31,_IP_Header+1
02D6 1387 std z+11,R17
02D8 0287 std z+10,R16
02DA .dbline 177
02DA ; //
02DA ; MainBufferWr_Tx = MainBufferWr_Rx; // number of bytes to the packet we are sending back
02DA 20900000 lds R2,_MainBufferWr_Rx
02DE 30900100 lds R3,_MainBufferWr_Rx+1
02E2 30920100 sts _MainBufferWr_Tx+1,R3
02E6 20920000 sts _MainBufferWr_Tx,R2
02EA .dbline 179
02EA ;
02EA ; len = MainBufferWr_Tx; //
02EA A0900000 lds R10,_MainBufferWr_Tx
02EE B0900100 lds R11,_MainBufferWr_Tx+1
02F2 .dbline 181
02F2 ;
02F2 ; if (!PPP_SendPacket(false)) return; // send it
02F2 0027 clr R16
02F4 0E940000 xcall _PPP_SendPacket
02F8 0023 tst R16
02FA 09F4 brne L38
02FC .dbline 181
02FC 69C0 xjmp L29
02FE L38:
02FE .dbline 184
02FE ;
02FE ; #ifdef Debug
02FE ; IP_DisplayProtocol(true, len); //
02FE 9501 movw R18,R10
0300 01E0 ldi R16,1
0302 0E940000 xcall _IP_DisplayProtocol
0306 .dbline 185
0306 ; IP_DisplayHeader(4, len); //
0306 9501 movw R18,R10
0308 04E0 ldi R16,4
030A 10E0 ldi R17,0
030C 0E940000 xcall _IP_DisplayHeader
0310 .dbline 186
0310 ; ICMP_DisplayHeader(4 + sizeof(T_IP_Header), len); //
0310 9501 movw R18,R10
0312 08E1 ldi R16,24
0314 10E0 ldi R17,0
0316 74DE xcall _ICMP_DisplayHeader
0318 .dbline 189
0318 ; #endif
0318 ;
0318 ; return;
0318 5BC0 xjmp L29
031A L34:
031A .dbline 194
031A E0910000 lds R30,_ICMP_Header
031E F0910100 lds R31,_ICMP_Header+1
0322 2080 ldd R2,z+0
0324 2220 tst R2
0326 09F0 breq X4
0328 53C0 xjmp L40
032A X4:
032A .dbline 195
032A .dbline 197
032A 00E0 ldi R16,<L42
032C 10E0 ldi R17,>L42
032E 0E940000 xcall _SendDebugStr
0332 .dbline 200
0332 20900400 lds R2,_ICMP_SeqNum
0336 30900500 lds R3,_ICMP_SeqNum+1
033A 2220 tst R2
033C 19F4 brne X2
033E 3320 tst R3
0340 09F4 brne X5
0342 46C0 xjmp L29
0344 X5:
0344 X2:
0344 E0910000 lds R30,_ICMP_Header
0348 F0910100 lds R31,_ICMP_Header+1
034C 0681 ldd R16,z+6
034E 1781 ldd R17,z+7
0350 0E940000 xcall _ntohs
0354 20900400 lds R2,_ICMP_SeqNum
0358 30900500 lds R3,_ICMP_SeqNum+1
035C 0215 cp R16,R2
035E 1305 cpc R17,R3
0360 B9F5 brne L29
0362 40900200 lds R4,_ICMP_IP+2
0366 50900300 lds R5,_ICMP_IP+2+1
036A 20900000 lds R2,_ICMP_IP
036E 30900100 lds R3,_ICMP_IP+1
0372 E0910000 lds R30,_IP_Header
0376 F0910100 lds R31,_IP_Header+1
037A 6484 ldd R6,z+12
037C 7584 ldd R7,z+13
037E 8684 ldd R8,z+14
0380 9784 ldd R9,z+15
0382 6214 cp R6,R2
0384 7304 cpc R7,R3
0386 8404 cpc R8,R4
0388 9504 cpc R9,R5
038A 11F5 brne L29
038C .dbline 201
038C .dbline 202
038C 2224 clr R2
038E 3324 clr R3
0390 30920500 sts _ICMP_SeqNum+1,R3
0394 20920400 sts _ICMP_SeqNum,R2
0398 .dbline 203
0398 40E0 ldi R20,0
039A 50E0 ldi R21,0
039C 60E0 ldi R22,0
039E 70E0 ldi R23,0
03A0 50930100 sts _ICMP_IP+1,R21
03A4 40930000 sts _ICMP_IP,R20
03A8 70930300 sts _ICMP_IP+2+1,R23
03AC 60930200 sts _ICMP_IP+2,R22
03B0 .dbline 205
03B0 20900600 lds R2,_ICMP_Timer
03B4 30900700 lds R3,_ICMP_Timer+1
03B8 3982 std y+1,R3
03BA 2882 std y+0,R2
03BC 20E0 ldi R18,<L45
03BE 30E0 ldi R19,>L45
03C0 00E0 ldi R16,<_ScratchPad
03C2 10E0 ldi R17,>_ScratchPad
03C4 0E940000 xcall _sprintf
03C8 .dbline 206
03C8 00E0 ldi R16,<_ScratchPad
03CA 10E0 ldi R17,>_ScratchPad
03CC 0E940000 xcall _SendConsoleStr
03D0 .dbline 207
03D0 .dbline 209
03D0 L40:
03D0 .dbline -2
03D0 L29:
03D0 2696 adiw R28,6
03D2 0E940000 xcall pop_gset3
03D6 .dbline 0 ; func end
03D6 0895 ret
03D8 .dbsym l dw 2 l
03D8 .dbsym r len 10 s
03D8 .dbend
03D8 .dbfunc e ICMP_Out _ICMP_Out fc
03D8 ; w2 -> y+2
03D8 ; len -> R14,R15
03D8 ; RandNum -> R12,R13
03D8 ; w -> R10,R11
03D8 ; IP -> y+14
.even
03D8 _ICMP_Out::
03D8 0E940000 xcall push_arg4
03DC 0E940000 xcall push_gset5
03E0 2497 sbiw R28,4
03E2 .dbline -1
03E2 .dbline 219
03E2 ; }
03E2 ;
03E2 ; // **********************
03E2 ;
03E2 ; if (ICMP_Header->Type == ICMP_ECHO_REPLY)
03E2 ; { // PONG
03E2 ; #ifdef Debug
03E2 ; SendDebugStr("\n");
03E2 ; #endif
03E2 ;
03E2 ; if ((ICMP_SeqNum) && (ntohs(ICMP_Header->SeqNum) == ICMP_SeqNum) && (IP_Header->SourceIP.ip32 == ICMP_IP.ip32))
03E2 ; { //
03E2 ; ICMP_SeqNum = 0; //
03E2 ; ICMP_IP.ip32 = 0; //
03E2 ; //
03E2 ; sprintf((char*)ScratchPad, " pong: %ums\n", ICMP_Timer); //
03E2 ; SendConsoleStr((char*)ScratchPad); //
03E2 ; } //
03E2 ;
03E2 ; return;
03E2 ; }
03E2 ;
03E2 ; // **********************
03E2 ; }
03E2 ;
03E2 ; // **************************************************************************
03E2 ; // send a ping out
03E2 ;
03E2 ; bool ICMP_Out(u32 IP)
03E2 ; {
03E2 .dbline 222
03E2 ; u16 w, w2, RandNum, len;
03E2 ;
03E2 ; if (!IP) return false; // no IP supplied
03E2 40E0 ldi R20,0
03E4 50E0 ldi R21,0
03E6 60E0 ldi R22,0
03E8 70E0 ldi R23,0
03EA FE01 movw R30,R28
03EC 2684 ldd R2,z+14
03EE 3784 ldd R3,z+15
03F0 4088 ldd R4,z+16
03F2 5188 ldd R5,z+17
03F4 2416 cp R2,R20
03F6 3506 cpc R3,R21
03F8 4606 cpc R4,R22
03FA 5706 cpc R5,R23
03FC 11F4 brne L47
03FE .dbline 222
03FE 0027 clr R16
0400 E6C0 xjmp L46
0402 L47:
0402 .dbline 223
0402 ; if (MainBufferWr_Rx > 0) return false; // buffer is not yet free
0402 2224 clr R2
0404 3324 clr R3
0406 40900000 lds R4,_MainBufferWr_Rx
040A 50900100 lds R5,_MainBufferWr_Rx+1
040E 2414 cp R2,R4
0410 3504 cpc R3,R5
0412 14F4 brge L49
0414 .dbline 223
0414 0027 clr R16
0416 DBC0 xjmp L46
0418 L49:
0418 .dbline 224
0418 ; if (MainBufferWr_Tx) return false; // buffer is not yet free
0418 20900000 lds R2,_MainBufferWr_Tx
041C 30900100 lds R3,_MainBufferWr_Tx+1
0420 2220 tst R2
0422 11F4 brne X6
0424 3320 tst R3
0426 11F0 breq L51
0428 X6:
0428 .dbline 224
0428 0027 clr R16
042A D1C0 xjmp L46
042C L51:
042C .dbline 226
042C CC24 clr R12
042E DD24 clr R13
0430 03C0 xjmp L56
0432 L53:
0432 .dbline 226
0432 0E940000 xcall _rand
0436 6801 movw R12,R16
0438 L54:
0438 .dbline 226
0438 L56:
0438 .dbline 226
0438 ;
0438 ; for (RandNum = 0; !RandNum; ) RandNum = (u16)rand(); //
0438 CC20 tst R12
043A 11F4 brne X7
043C DD20 tst R13
043E C9F3 breq L53
0440 X7:
0440 .dbline 229
0440 ;
0440 ; // start the packet off (IP header etc)
0440 ; IP_StartPacket(IP_PROTO_ICMP, IP); // start the IP packet off
0440 FE01 movw R30,R28
0442 2684 ldd R2,z+14
0444 3784 ldd R3,z+15
0446 4088 ldd R4,z+16
0448 5188 ldd R5,z+17
044A 4882 std y+0,R4
044C 5982 std y+1,R5
044E 9101 movw R18,R2
0450 01E0 ldi R16,1
0452 0E940000 xcall _IP_StartPacket
0456 .dbline 231
0456 ;
0456 ; len = MainBufferWr_Tx; //
0456 E0900000 lds R14,_MainBufferWr_Tx
045A F0900100 lds R15,_MainBufferWr_Tx+1
045E .dbline 234
045E ;
045E ; // add the ICMP header
045E ; ICMP_Header = (T_ICMP_Header*)(MainBuffer + MainBufferWr_Tx); // point to the ICMP header
045E 80E0 ldi R24,<_MainBuffer
0460 90E0 ldi R25,>_MainBuffer
0462 1701 movw R2,R14
0464 280E add R2,R24
0466 391E adc R3,R25
0468 30920100 sts _ICMP_Header+1,R3
046C 20920000 sts _ICMP_Header,R2
0470 .dbline 235
0470 ; memset(ICMP_Header, 0, sizeof(T_ICMP_Header)); // clear it
0470 88E0 ldi R24,8
0472 90E0 ldi R25,0
0474 9983 std y+1,R25
0476 8883 std y+0,R24
0478 2227 clr R18
047A 3327 clr R19
047C 8101 movw R16,R2
047E 0E940000 xcall _memset
0482 .dbline 236
0482 ; ICMP_Header->Type = ICMP_ECHO_REQUEST; //
0482 88E0 ldi R24,8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -