📄 xmodem.lst
字号:
8D7 01F6 MOVW R30,R12
8D8 0FE8 ADD R30,R24
8D9 1FF9 ADC R31,R25
8DA E18A LDI R24,0x1A
8DB 8380 STD Z+0,R24
8DC 01C6 MOVW R24,R12
8DD 9601 ADIW R24,1
8DE 016C MOVW R12,R24
8DF 01C6 MOVW R24,R12
8E0 3880 CPI R24,0x80
8E1 E0E0 LDI R30,0
8E2 079E CPC R25,R30
8E3 F388 BCS 0x08D5
(0370) if(tx_packet(packet_number, xModem->Message, temp_char)==0)
8E4 82A8 STD Y+0,R10
8E5 019B MOVW R18,R22
8E6 5F2F SUBI R18,0xFF
8E7 4F3F SBCI R19,0xFF
8E8 2F04 MOV R16,R20
8E9 DF38 RCALL _tx_packet
8EA 2300 TST R16
8EB F009 BEQ 0x08ED
8EC C097 RJMP 0x0984
(0371) return 0;
8ED 2700 CLR R16
8EE C09C RJMP 0x098B
(0372) }
(0373) else
(0374) {
(0375) do
(0376) {
(0377) for(i=0;i<128;i++)
8EF 24CC CLR R12
8F0 24DD CLR R13
8F1 C01E RJMP 0x0910
(0378) xModem->Message[i]=(User_Data[j++]);
8F2 01FE MOVW R30,R28
8F3 57EC SUBI R30,0x7C
8F4 4FFF SBCI R31,0xFF
8F5 80E0 LDD R14,Z+0
8F6 80F1 LDD R15,Z+1
8F7 01C7 MOVW R24,R14
8F8 9601 ADIW R24,1
8F9 01FE MOVW R30,R28
8FA 57EC SUBI R30,0x7C
8FB 4FFF SBCI R31,0xFF
8FC 8391 STD Z+1,R25
8FD 8380 STD Z+0,R24
8FE 01F7 MOVW R30,R14
8FF 01DE MOVW R26,R28
900 57A0 SUBI R26,0x70
901 4FBF SBCI R27,0xFF
902 900D LD R0,X+
903 901C LD R1,255(X)
904 0DE0 ADD R30,R0
905 1DF1 ADC R31,R1
906 9024 LPM R2,255(Z)
907 01CB MOVW R24,R22
908 9601 ADIW R24,1
909 01F6 MOVW R30,R12
90A 0FE8 ADD R30,R24
90B 1FF9 ADC R31,R25
90C 8220 STD Z+0,R2
90D 01C6 MOVW R24,R12
90E 9601 ADIW R24,1
90F 016C MOVW R12,R24
910 01C6 MOVW R24,R12
911 3880 CPI R24,0x80
912 E0E0 LDI R30,0
913 079E CPC R25,R30
914 F2E8 BCS 0x08F2
(0379) if(tx_packet(packet_number, xModem->Message, temp_char)==0)
915 82A8 STD Y+0,R10
916 019B MOVW R18,R22
917 5F2F SUBI R18,0xFF
918 4F3F SBCI R19,0xFF
919 2F04 MOV R16,R20
91A DF07 RCALL _tx_packet
91B 2EE0 MOV R14,R16
91C 2300 TST R16
91D F411 BNE 0x0920
(0380) return 0;
91E 2700 CLR R16
91F C06B RJMP 0x098B
(0381) packet_number++;
920 9543 INC R20
(0382) LEN=LEN-128;
921 01FE MOVW R30,R28
922 56EE SUBI R30,0x6E
923 4FFF SBCI R31,0xFF
924 8180 LDD R24,Z+0
925 8191 LDD R25,Z+1
926 5880 SUBI R24,0x80
927 4090 SBCI R25,0
928 01FE MOVW R30,R28
929 56EE SUBI R30,0x6E
92A 4FFF SBCI R31,0xFF
92B 8391 STD Z+1,R25
92C 8380 STD Z+0,R24
(0383) Delay(10);
92D E00A LDI R16,0xA
92E E010 LDI R17,0
92F D0DB RCALL _Delay
(0384)
(0385) }while(LEN>=128);
930 01FE MOVW R30,R28
931 56EE SUBI R30,0x6E
932 4FFF SBCI R31,0xFF
933 8180 LDD R24,Z+0
934 8191 LDD R25,Z+1
935 3880 CPI R24,0x80
936 E0E0 LDI R30,0
937 079E CPC R25,R30
938 F008 BCS 0x093A
939 CFB5 RJMP 0x08EF
(0386) if (LEN)
93A 010C MOVW R0,R24
93B 3080 CPI R24,0
93C 0789 CPC R24,R25
93D F409 BNE 0x093F
93E C045 RJMP 0x0984
(0387) {
(0388) for(i=0;i<LEN;i++)
93F 24CC CLR R12
940 24DD CLR R13
941 C01E RJMP 0x0960
(0389) xModem->Message[i]=(User_Data[j++]);
942 01FE MOVW R30,R28
943 57EC SUBI R30,0x7C
944 4FFF SBCI R31,0xFF
945 80E0 LDD R14,Z+0
946 80F1 LDD R15,Z+1
947 01C7 MOVW R24,R14
948 9601 ADIW R24,1
949 01FE MOVW R30,R28
94A 57EC SUBI R30,0x7C
94B 4FFF SBCI R31,0xFF
94C 8391 STD Z+1,R25
94D 8380 STD Z+0,R24
94E 01F7 MOVW R30,R14
94F 01DE MOVW R26,R28
950 57A0 SUBI R26,0x70
951 4FBF SBCI R27,0xFF
952 900D LD R0,X+
953 901C LD R1,255(X)
954 0DE0 ADD R30,R0
955 1DF1 ADC R31,R1
956 9024 LPM R2,255(Z)
957 01CB MOVW R24,R22
958 9601 ADIW R24,1
959 01F6 MOVW R30,R12
95A 0FE8 ADD R30,R24
95B 1FF9 ADC R31,R25
95C 8220 STD Z+0,R2
95D 01C6 MOVW R24,R12
95E 9601 ADIW R24,1
95F 016C MOVW R12,R24
960 01FE MOVW R30,R28
961 56EE SUBI R30,0x6E
962 4FFF SBCI R31,0xFF
963 8000 LDD R0,Z+0
964 8011 LDD R1,Z+1
965 14C0 CP R12,R0
966 04D1 CPC R13,R1
967 F2D0 BCS 0x0942
(0390) for(i=LEN;i<128;i++)
968 0160 MOVW R12,R0
969 C00A RJMP 0x0974
(0391) xModem->Message[i]=CTRL_Z;
96A 01CB MOVW R24,R22
96B 9601 ADIW R24,1
96C 01F6 MOVW R30,R12
96D 0FE8 ADD R30,R24
96E 1FF9 ADC R31,R25
96F E18A LDI R24,0x1A
970 8380 STD Z+0,R24
971 01C6 MOVW R24,R12
972 9601 ADIW R24,1
973 016C MOVW R12,R24
974 01C6 MOVW R24,R12
975 3880 CPI R24,0x80
976 E0E0 LDI R30,0
977 079E CPC R25,R30
978 F388 BCS 0x096A
(0392) if( tx_packet(packet_number, xModem->Message, temp_char)==0)
979 82A8 STD Y+0,R10
97A 019B MOVW R18,R22
97B 5F2F SUBI R18,0xFF
97C 4F3F SBCI R19,0xFF
97D 2F04 MOV R16,R20
97E DEA3 RCALL _tx_packet
97F 2EA0 MOV R10,R16
980 2300 TST R16
981 F411 BNE 0x0984
(0393) return 0;
982 2700 CLR R16
983 C007 RJMP 0x098B
(0394) }
(0395) }
(0396)
(0397) if (!tx_EOT()) //发送方正常结束要发EOT信号,
984 D00D RCALL _tx_EOT
985 2EA0 MOV R10,R16
986 2300 TST R16
987 F411 BNE 0x098A
(0398) return 0; // end tx data failed
988 2700 CLR R16
989 C001 RJMP 0x098B
(0399) return 1; //正常结束
98A E001 LDI R16,1
98B 96EF ADIW R28,0x3F
98C 96EF ADIW R28,0x3F
98D 9628 ADIW R28,0x8
98E 940E 0B2F CALL pop_xgsetF0FC
990 9624 ADIW R28,4
991 9508 RET
_tx_EOT:
temp --> R22
attempt --> R20
992 934A ST R20,-Y
993 936A ST R22,-Y
(0400) }
(0401) uchar tx_EOT(void)
(0402) {
(0403) uchar attempt;
(0404) unsigned char temp;
(0405)
(0406) for(attempt = 1; attempt <= MAX_TX_TRY; attempt++)
994 E041 LDI R20,1
995 C00C RJMP 0x09A2
(0407) {
(0408) send_a_byte(EOT);
996 E004 LDI R16,4
997 DE6C RCALL _send_a_byte
(0409) // send file end
(0410) Delay(1);
998 E001 LDI R16,1
999 E010 LDI R17,0
99A D070 RCALL _Delay
(0411) temp=temp_char0;
99B 9160 0094 LDS R22,temp_char0
(0412) if(temp == ACK)
99D 3066 CPI R22,6
99E F411 BNE 0x09A1
(0413) return 1; // file end acknowledged 接收方返因ACK信号
99F E001 LDI R16,1
9A0 C005 RJMP 0x09A6
9A1 9543 INC R20
9A2 E083 LDI R24,3
9A3 1784 CP R24,R20
9A4 F788 BCC 0x0996
(0414) }
(0415) return 0; // file tx failed
9A5 2700 CLR R16
9A6 9169 LD R22,Y+
9A7 9149 LD R20,Y+
9A8 9508 RET
(0416) }
(0417)
(0418) uint update_CRC(uchar inData, uint checksum)
(0419) {
(0420) return ((checksum << 8) ^ crc16_table[ (checksum >> 8) ^ inData ]);
_update_CRC:
checksum --> R18
inData --> R16
9A9 2E20 MOV R2,R16
9AA 2433 CLR R3
9AB 01F9 MOVW R30,R18
9AC 2FEF MOV R30,R31
9AD 27FF CLR R31
9AE 25E2 EOR R30,R2
9AF 25F3 EOR R31,R3
9B0 0FEE LSL R30
9B1 1FFF ROL R31
9B2 E988 LDI R24,0x98
9B3 E09A LDI R25,0xA
9B4 0FE8 ADD R30,R24
9B5 1FF9 ADC R31,R25
9B6 9025 LPM R2,Z+
9B7 9034 LPM R3,10(Z)
9B8 0189 MOVW R16,R18
9B9 2F10 MOV R17,R16
9BA 2700 CLR R16
9BB 2502 EOR R16,R2
9BC 2513 EOR R17,R3
9BD 9508 RET
(0421) }
(0422)
(0423) /*
(0424) *************************************
(0425) *延时子程序,延时约10×i机器周期 *
(0426) *************************************/
(0427)
(0428) void intDelay(uint i)
(0429) {
(0430) while(i--);
_intDelay:
i --> R16
9BE 0118 MOVW R2,R16
9BF 5001 SUBI R16,1
9C0 4010 SBCI R17,0
9C1 2022 TST R2
9C2 F7D9 BNE 0x09BE
9C3 2033 TST R3
9C4 F7C9 BNE 0x09BE
9C5 9508 RET
_memcmp_self:
i --> R10
lenth --> Y,+1
string2 --> R18
string1 --> R16
9C6 92AA ST R10,-Y
(0431) }
(0432)
(0433)
(0434) char memcmp_self(char const *string1, char const *string2 ,unsigned int lenth)
(0435) {
(0436) uchar i;
(0437) for(i = 0; i<lenth; i++)
9C7 24AA CLR R10
9C8 C00D RJMP 0x09D6
(0438) {
(0439) if(*string1 != *string2)
9C9 01F9 MOVW R30,R18
9CA 9024 LPM R2,13(Z)
9CB 01F8 MOVW R30,R16
9CC 9034 LPM R3,13(Z)
9CD 1432 CP R3,R2
9CE F011 BEQ 0x09D1
(0440) return 0;
9CF 2700 CLR R16
9D0 C00D RJMP 0x09DE
(0441) string1++;
9D1 5F0F SUBI R16,0xFF
9D2 4F1F SBCI R17,0xFF
(0442) string2++;
9D3 5F2F SUBI R18,0xFF
9D4 4F3F SBCI R19,0xFF
9D5 94A3 INC R10
9D6 2C2A MOV R2,R10
9D7 2433 CLR R3
9D8 8009 LDD R0,Y+1
9D9 801A LDD R1,Y+2
9DA 1420 CP R2,R0
9DB 0431 CPC R3,R1
9DC F360 BCS 0x09C9
(0443) }
(0444) return 1;
9DD E001 LDI R16,1
9DE 90A9 LD R10,Y+
9DF 9508 RET
(0445) }
(0446) //char do_serial_data(uchar lenth)
(0447) void do_serial_data(void)
(0448) {
(0449) uchar i;
(0450) if(receive_data[0]=='+')
_do_serial_data:
i --> R16
9E0 9180 017E LDS R24,receive_data
9E2 328B CPI R24,0x2B
9E3 F531 BNE 0x0A0A
(0451) { receive_CLIP = 1;
9E4 E081 LDI R24,1
9E5 9380 0211 STS receive_CLIP,R24
(0452) if('1' == receive_data[8] && ((receive_data[18] >= '0') && (receive_data[18] <= '9')))
9E7 9180 0186 LDS R24,0x0186
9E9 3381 CPI R24,0x31
9EA F4F9 BNE 0x0A0A
9EB 9180 0190 LDS R24,0x0190
9ED 3380 CPI R24,0x30
9EE F0D8 BCS 0x0A0A
9EF E389 LDI R24,0x39
9F0 9020 0190 LDS R2,0x0190
9F2 1582 CP R24,R2
9F3 F0B0 BCS 0x0A0A
(0453) {
(0454) for(i=8;i<19;i++)
9F4 E008 LDI R16,0x8
9F5 C00F RJMP 0x0A05
(0455) dial_number[i-8]=receive_data[i];
9F6 E78E LDI R24,0x7E
9F7 E091 LDI R25,1
9F8 2FE0 MOV R30,R16
9F9 27FF CLR R31
9FA 0FE8 ADD R30,R24
9FB 1FF9 ADC R31,R25
9FC 8020 LDD R2,Z+0
9FD E688 LDI R24,0x68
9FE E090 LDI R25,0
9FF 2FE0 MOV R30,R16
A00 27FF CLR R31
A01 0FE8 ADD R30,R24
A02 1FF9 ADC R31,R25
A03 8220 STD Z+0,R2
A04 9503 INC R16
A05 3103 CPI R16,0x13
A06 F378 BCS 0x09F6
(0456) flag_mobile = 1;
A07 E081 LDI R24,1
A08 9380 0210 STS flag_mobile,R24
(0457) }
(0458)
(0459) }
A0A 9508 RET
_Delay:
i --> R20
Delay_MS --> R16
A0B 934A ST R20,-Y
(0460) /*switch (lenth)
(0461) {
(0462) case 0:
(0463) break;
(0464) case 1:
(0465) break;
(0466) case 2:
(0467)
(0468) break;
(0469) case 3:
(0470) if(memcmp_self(receive_data, DATA_OK,2)==0 ) //检测是否收到 OK
(0471) receive_OK = 1;
(0472) break;
(0473) case 4:
(0474) if(memcmp_self(receive_data, DATA_RING,4)==0 ) //检测是否收到 OK
(0475) receive_RING = 1;
(0476) break;
(0477) case 5:
(0478) if(memcmp_self(receive_data, DATA_ERROR, 5)==0) //检测是否收到 ERROR
(0479) receive_ERROR = 1;
(0480) break;
(0481) case 6:
(0482) break;
(0483) case 7:
(0484) break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -