📄 ymodem.lst
字号:
\ ??Receive_Packet_9:
\ 000000C0 0000E0E3 MVN R0,#+0
\ 000000C4 1C0000EA B ??Receive_Packet_1
101 }
102 case ABORT1:
103 case ABORT2:
104 return 1;
\ ??Receive_Packet_6:
\ 000000C8 0100A0E3 MOV R0,#+1
\ 000000CC 1A0000EA B ??Receive_Packet_1
105 default:
106 return -1;
\ ??Receive_Packet_7:
\ 000000D0 0000E0E3 MVN R0,#+0
\ 000000D4 180000EA B ??Receive_Packet_1
107 }
108 *data = c;
\ ??Receive_Packet_8:
\ 000000D8 0000DDE5 LDRB R0,[SP, #+0]
\ 000000DC 0000C4E5 STRB R0,[R4, #+0]
109 for (i = 1; i < (packet_size + PACKET_OVERHEAD); i ++)
\ 000000E0 0100A0E3 MOV R0,#+1
\ 000000E4 0070B0E1 MOVS R7,R0
\ ??Receive_Packet_10:
\ 000000E8 050098E2 ADDS R0,R8,#+5
\ 000000EC 000057E1 CMP R7,R0
\ 000000F0 080000AA BGE ??Receive_Packet_11
110 {
111 if (Receive_Byte(data + i, timeout) != 0)
\ 000000F4 0610B0E1 MOVS R1,R6
\ 000000F8 040097E0 ADDS R0,R7,R4
\ 000000FC ........ BL Receive_Byte
\ 00000100 000050E3 CMP R0,#+0
\ 00000104 0100000A BEQ ??Receive_Packet_12
112 {
113 return -1;
\ 00000108 0000E0E3 MVN R0,#+0
\ 0000010C 0A0000EA B ??Receive_Packet_1
114 }
115 }
\ ??Receive_Packet_12:
\ 00000110 017097E2 ADDS R7,R7,#+1
\ 00000114 F3FFFFEA B ??Receive_Packet_10
116 if (data[PACKET_SEQNO_INDEX] != ((data[PACKET_SEQNO_COMP_INDEX] ^ 0xff) & 0xff))
\ ??Receive_Packet_11:
\ 00000118 0100D4E5 LDRB R0,[R4, #+1]
\ 0000011C 0210D4E5 LDRB R1,[R4, #+2]
\ 00000120 FF1031E2 EORS R1,R1,#0xFF
\ 00000124 010050E1 CMP R0,R1
\ 00000128 0100000A BEQ ??Receive_Packet_13
117 {
118 return -1;
\ 0000012C 0000E0E3 MVN R0,#+0
\ 00000130 010000EA B ??Receive_Packet_1
119 }
120 *length = packet_size;
\ ??Receive_Packet_13:
\ 00000134 008085E5 STR R8,[R5, #+0]
121 return 0;
\ 00000138 0000A0E3 MOV R0,#+0
\ ??Receive_Packet_1:
\ 0000013C 04D08DE2 ADD SP,SP,#+4 ;; stack cleaning
\ 00000140 F081BDE8 POP {R4-R8,PC} ;; return
122 }
123 /*******************************************************************************
124 * Function Name : Ymodem_Receive
125 * Description : Receive a file using the ymodem protocol
126 * Input : Address of the first byte
127 * Return : The size of the file
128 *******************************************************************************/
\ In segment CODE, align 4, keep-with-next
129 s32 Ymodem_Receive (char *buf)
130 {
\ Ymodem_Receive:
\ 00000000 F14F2DE9 PUSH {R0,R4-R11,LR}
\ 00000004 28D04DE2 SUB SP,SP,#+40
\ 00000008 40DE4DE2 SUB SP,SP,#+1024
131 char packet_data[PACKET_1K_SIZE + PACKET_OVERHEAD], file_size[FILE_SIZE_LENGTH], *file_ptr, *buf_ptr;
132 s32 i, j, packet_length, session_done, file_done, packets_received, errors, session_begin, size = 0;
\ 0000000C 0010A0E3 MOV R1,#+0
\ 00000010 00108DE5 STR R1,[SP, #+0]
133 u32 Sector_Mask = 0;
\ 00000014 0000A0E3 MOV R0,#+0
\ 00000018 00B0B0E1 MOVS R11,R0
134 for (session_done = 0, errors = 0, session_begin = 0; ;)
\ 0000001C 0010A0E3 MOV R1,#+0
\ 00000020 08108DE5 STR R1,[SP, #+8]
\ 00000024 0000A0E3 MOV R0,#+0
\ 00000028 0090B0E1 MOVS R9,R0
\ 0000002C 0000A0E3 MOV R0,#+0
\ 00000030 00A0B0E1 MOVS R10,R0
135 {
136 for (packets_received = 0, file_done = 0, buf_ptr = buf; ;)
\ ??Ymodem_Receive_0:
\ 00000034 0000A0E3 MOV R0,#+0
\ 00000038 0080B0E1 MOVS R8,R0
\ 0000003C 0000A0E3 MOV R0,#+0
\ 00000040 0070B0E1 MOVS R7,R0
\ 00000044 28149DE5 LDR R1,[SP, #+1064]
\ 00000048 0C108DE5 STR R1,[SP, #+12]
137 {
138 switch (Receive_Packet(packet_data, &packet_length, NAK_TIMEOUT))
\ ??Ymodem_Receive_1:
\ 0000004C F42AA0E3 MOV R2,#+999424
\ 00000050 902F82E3 ORR R2,R2,#0x240
\ 00000054 04108DE2 ADD R1,SP,#+4
\ 00000058 20008DE2 ADD R0,SP,#+32
\ 0000005C ........ BL Receive_Packet
\ 00000060 000050E3 CMP R0,#+0
\ 00000064 0200000A BEQ ??Ymodem_Receive_2
\ 00000068 010050E3 CMP R0,#+1
\ 0000006C 9B00000A BEQ ??Ymodem_Receive_3
\ 00000070 A00000EA B ??Ymodem_Receive_4
139 {
140 case 0:
141 errors = 0;
\ ??Ymodem_Receive_2:
\ 00000074 0000A0E3 MOV R0,#+0
\ 00000078 0090B0E1 MOVS R9,R0
142 switch (packet_length)
\ 0000007C 04009DE5 LDR R0,[SP, #+4]
\ 00000080 000050E3 CMP R0,#+0
\ 00000084 0500000A BEQ ??Ymodem_Receive_5
\ 00000088 010070E3 CMN R0,#+1
\ 0000008C 0800001A BNE ??Ymodem_Receive_6
143 {
144 case -1: /* Abort by sender */
145 Send_Byte(ACK);
\ ??Ymodem_Receive_7:
\ 00000090 0600A0E3 MOV R0,#+6
\ 00000094 ........ BL Send_Byte
146 return 0;
\ 00000098 0000A0E3 MOV R0,#+0
\ 0000009C A80000EA B ??Ymodem_Receive_8
147 case 0: /* End of transmission */
148 Send_Byte(ACK);
\ ??Ymodem_Receive_5:
\ 000000A0 0600A0E3 MOV R0,#+6
\ 000000A4 ........ BL Send_Byte
149 file_done = 1;
\ 000000A8 0100A0E3 MOV R0,#+1
\ 000000AC 0070B0E1 MOVS R7,R0
\ 000000B0 9D0000EA B ??Ymodem_Receive_9
150 break;
151 default: /* Normal packet */
152 if ((packet_data[PACKET_SEQNO_INDEX] & 0xff) != (packets_received & 0xff))
\ ??Ymodem_Receive_6:
\ 000000B4 2100DDE5 LDRB R0,[SP, #+33]
\ 000000B8 FF1018E2 ANDS R1,R8,#0xFF
\ 000000BC 010050E1 CMP R0,R1
\ 000000C0 0200000A BEQ ??Ymodem_Receive_10
153 {
154 Send_Byte(NAK);
\ 000000C4 1500A0E3 MOV R0,#+21
\ 000000C8 ........ BL Send_Byte
\ 000000CC 960000EA B ??Ymodem_Receive_9
155 }
156 else
157 {
158 if (packets_received == 0) /* Filename packet */
\ ??Ymodem_Receive_10:
\ 000000D0 000058E3 CMP R8,#+0
\ 000000D4 4600001A BNE ??Ymodem_Receive_11
159 {
160 if (packet_data[PACKET_HEADER] != 0) /* Filename packet has valid data */
\ 000000D8 2300DDE5 LDRB R0,[SP, #+35]
\ 000000DC 000050E3 CMP R0,#+0
\ 000000E0 3C00000A BEQ ??Ymodem_Receive_12
161 {
162 for (i = 0, file_ptr = packet_data + PACKET_HEADER; (*file_ptr != 0) && (i < FILE_NAME_LENGTH);)
\ 000000E4 0000A0E3 MOV R0,#+0
\ 000000E8 0050B0E1 MOVS R5,R0
\ 000000EC 23008DE2 ADD R0,SP,#+35
\ 000000F0 0040B0E1 MOVS R4,R0
\ ??Ymodem_Receive_13:
\ 000000F4 0000D4E5 LDRB R0,[R4, #+0]
\ 000000F8 000050E3 CMP R0,#+0
\ 000000FC 0700000A BEQ ??Ymodem_Receive_14
\ 00000100 400F55E3 CMP R5,#+256
\ 00000104 050000AA BGE ??Ymodem_Receive_14
163 {
164 file_name[i++] = *file_ptr++;
\ 00000108 40029FE5 LDR R0,??Ymodem_Receive_15 ;; file_name
\ 0000010C 0010D4E5 LDRB R1,[R4, #+0]
\ 00000110 0010C5E7 STRB R1,[R5, +R0]
\ 00000114 014094E2 ADDS R4,R4,#+1
\ 00000118 015095E2 ADDS R5,R5,#+1
\ 0000011C F4FFFFEA B ??Ymodem_Receive_13
165 }
166 file_name[i++] = '\0';
\ ??Ymodem_Receive_14:
\ 00000120 28029FE5 LDR R0,??Ymodem_Receive_15 ;; file_name
\ 00000124 0010A0E3 MOV R1,#+0
\ 00000128 0010C5E7 STRB R1,[R5, +R0]
\ 0000012C 015095E2 ADDS R5,R5,#+1
167 for (i = 0, file_ptr ++; (*file_ptr != ' ') && (i < FILE_SIZE_LENGTH);)
\ 00000130 0000A0E3 MOV R0,#+0
\ 00000134 0050B0E1 MOVS R5,R0
\ 00000138 014094E2 ADDS R4,R4,#+1
\ ??Ymodem_Receive_16:
\ 0000013C 0000D4E5 LDRB R0,[R4, #+0]
\ 00000140 200050E3 CMP R0,#+32
\ 00000144 0700000A BEQ ??Ymodem_Receive_17
\ 00000148 100055E3 CMP R5,#+16
\ 0000014C 050000AA BGE ??Ymodem_Receive_17
168 {
169 file_size[i++] = *file_ptr++;
\ 00000150 10008DE2 ADD R0,SP,#+16
\ 00000154 0010D4E5 LDRB R1,[R4, #+0]
\ 00000158 0010C5E7 STRB R1,[R5, +R0]
\ 0000015C 014094E2 ADDS R4,R4,#+1
\ 00000160 015095E2 ADDS R5,R5,#+1
\ 00000164 F4FFFFEA B ??Ymodem_Receive_16
170 }
171 file_size[i++] = '\0';
\ ??Ymodem_Receive_17:
\ 00000168 10008DE2 ADD R0,SP,#+16
\ 0000016C 0010A0E3 MOV R1,#+0
\ 00000170 0010C5E7 STRB R1,[R5, +R0]
\ 00000174 015095E2 ADDS R5,R5,#+1
172 Str2Int(file_size, &size);
\ 00000178 0D10B0E1 MOVS R1,SP
\ 0000017C 10008DE2 ADD R0,SP,#+16
\ 00000180 ........ _BLF Str2Int,??Str2Int??rA
173
174 /* Test the size of the image to be sent */
175 if (size > 0x3E000)
\ 00000184 00009DE5 LDR R0,[SP, #+0]
\ 00000188 0110A0E3 MOV R1,#+1
\ 0000018C F81B81E3 ORR R1,R1,#0x3E000
\ 00000190 010050E1 CMP R0,R1
\ 00000194 050000BA BLT ??Ymodem_Receive_18
176 {
177 /* End session */
178 Send_Byte(CAN);
\ 00000198 1800A0E3 MOV R0,#+24
\ 0000019C ........ BL Send_Byte
179 Send_Byte(CAN);
\ 000001A0 1800A0E3 MOV R0,#+24
\ 000001A4 ........ BL Send_Byte
180 return -1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -