?? ymodem.s79
字號:
BEQ ??Receive_Packet_5
CMP R0,#+65
BEQ ??Receive_Packet_6
CMP R0,#+97
BEQ ??Receive_Packet_6
B ??Receive_Packet_7
// 83 {
// 84 case SOH:
// 85 packet_size = PACKET_SIZE;
??Receive_Packet_2:
MOV R0,#+128
MOVS R8,R0
B ??Receive_Packet_8
// 86 break;
// 87 case STX:
// 88 packet_size = PACKET_1K_SIZE;
??Receive_Packet_3:
MOV R0,#+1024
MOVS R8,R0
B ??Receive_Packet_8
// 89 break;
// 90 case EOT:
// 91 return 0;
??Receive_Packet_4:
MOV R0,#+0
B ??Receive_Packet_1
// 92 case CAN:
// 93 if ((Receive_Byte(&c, timeout) == 0) && (c == CAN))
??Receive_Packet_5:
MOVS R1,R6
MOVS R0,SP
BL Receive_Byte
CMP R0,#+0
BNE ??Receive_Packet_9
LDRB R0,[SP, #+0]
CMP R0,#+24
BNE ??Receive_Packet_9
// 94 {
// 95 *length = -1;
MVN R0,#+0
STR R0,[R5, #+0]
// 96 return 0;
MOV R0,#+0
B ??Receive_Packet_1
// 97 }
// 98 else
// 99 {
// 100 return -1;
??Receive_Packet_9:
MVN R0,#+0
B ??Receive_Packet_1
// 101 }
// 102 case ABORT1:
// 103 case ABORT2:
// 104 return 1;
??Receive_Packet_6:
MOV R0,#+1
B ??Receive_Packet_1
// 105 default:
// 106 return -1;
??Receive_Packet_7:
MVN R0,#+0
B ??Receive_Packet_1
// 107 }
// 108 *data = c;
??Receive_Packet_8:
LDRB R0,[SP, #+0]
STRB R0,[R4, #+0]
// 109 for (i = 1; i < (packet_size + PACKET_OVERHEAD); i ++)
MOV R0,#+1
MOVS R7,R0
??Receive_Packet_10:
ADDS R0,R8,#+5
CMP R7,R0
BGE ??Receive_Packet_11
// 110 {
// 111 if (Receive_Byte(data + i, timeout) != 0)
MOVS R1,R6
ADDS R0,R7,R4
BL Receive_Byte
CMP R0,#+0
BEQ ??Receive_Packet_12
// 112 {
// 113 return -1;
MVN R0,#+0
B ??Receive_Packet_1
// 114 }
// 115 }
??Receive_Packet_12:
ADDS R7,R7,#+1
B ??Receive_Packet_10
// 116 if (data[PACKET_SEQNO_INDEX] != ((data[PACKET_SEQNO_COMP_INDEX] ^ 0xff) & 0xff))
??Receive_Packet_11:
LDRB R0,[R4, #+1]
LDRB R1,[R4, #+2]
EORS R1,R1,#0xFF
CMP R0,R1
BEQ ??Receive_Packet_13
// 117 {
// 118 return -1;
MVN R0,#+0
B ??Receive_Packet_1
// 119 }
// 120 *length = packet_size;
??Receive_Packet_13:
STR R8,[R5, #+0]
// 121 return 0;
MOV R0,#+0
??Receive_Packet_1:
ADD SP,SP,#+4 ;; stack cleaning
CFI CFA R13+24
POP {R4-R8,PC} ;; return
CFI EndBlock cfiBlock2
// 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 *******************************************************************************/
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock3 Using cfiCommon0
CFI Function Ymodem_Receive
ARM
// 129 s32 Ymodem_Receive (char *buf)
// 130 {
Ymodem_Receive:
PUSH {R0,R4-R11,LR}
CFI ?RET Frame(CFA, -4)
CFI R11 Frame(CFA, -8)
CFI R10 Frame(CFA, -12)
CFI R9 Frame(CFA, -16)
CFI R8 Frame(CFA, -20)
CFI R7 Frame(CFA, -24)
CFI R6 Frame(CFA, -28)
CFI R5 Frame(CFA, -32)
CFI R4 Frame(CFA, -36)
CFI CFA R13+40
SUB SP,SP,#+40
CFI CFA R13+80
SUB SP,SP,#+1024
CFI CFA R13+1104
// 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;
MOV R1,#+0
STR R1,[SP, #+0]
// 133 u32 Sector_Mask = 0;
MOV R0,#+0
MOVS R11,R0
// 134 for (session_done = 0, errors = 0, session_begin = 0; ;)
MOV R1,#+0
STR R1,[SP, #+8]
MOV R0,#+0
MOVS R9,R0
MOV R0,#+0
MOVS R10,R0
// 135 {
// 136 for (packets_received = 0, file_done = 0, buf_ptr = buf; ;)
??Ymodem_Receive_0:
MOV R0,#+0
MOVS R8,R0
MOV R0,#+0
MOVS R7,R0
LDR R1,[SP, #+1064]
STR R1,[SP, #+12]
// 137 {
// 138 switch (Receive_Packet(packet_data, &packet_length, NAK_TIMEOUT))
??Ymodem_Receive_1:
MOV R2,#+999424
ORR R2,R2,#0x240
ADD R1,SP,#+4
ADD R0,SP,#+32
BL Receive_Packet
CMP R0,#+0
BEQ ??Ymodem_Receive_2
CMP R0,#+1
BEQ ??Ymodem_Receive_3
B ??Ymodem_Receive_4
// 139 {
// 140 case 0:
// 141 errors = 0;
??Ymodem_Receive_2:
MOV R0,#+0
MOVS R9,R0
// 142 switch (packet_length)
LDR R0,[SP, #+4]
CMP R0,#+0
BEQ ??Ymodem_Receive_5
CMN R0,#+1
BNE ??Ymodem_Receive_6
// 143 {
// 144 case -1: /* Abort by sender */
// 145 Send_Byte(ACK);
??Ymodem_Receive_7:
MOV R0,#+6
BL Send_Byte
// 146 return 0;
MOV R0,#+0
B ??Ymodem_Receive_8
// 147 case 0: /* End of transmission */
// 148 Send_Byte(ACK);
??Ymodem_Receive_5:
MOV R0,#+6
BL Send_Byte
// 149 file_done = 1;
MOV R0,#+1
MOVS R7,R0
B ??Ymodem_Receive_9
// 150 break;
// 151 default: /* Normal packet */
// 152 if ((packet_data[PACKET_SEQNO_INDEX] & 0xff) != (packets_received & 0xff))
??Ymodem_Receive_6:
LDRB R0,[SP, #+33]
ANDS R1,R8,#0xFF
CMP R0,R1
BEQ ??Ymodem_Receive_10
// 153 {
// 154 Send_Byte(NAK);
MOV R0,#+21
BL Send_Byte
B ??Ymodem_Receive_9
// 155 }
// 156 else
// 157 {
// 158 if (packets_received == 0) /* Filename packet */
??Ymodem_Receive_10:
CMP R8,#+0
BNE ??Ymodem_Receive_11
// 159 {
// 160 if (packet_data[PACKET_HEADER] != 0) /* Filename packet has valid data */
LDRB R0,[SP, #+35]
CMP R0,#+0
BEQ ??Ymodem_Receive_12
// 161 {
// 162 for (i = 0, file_ptr = packet_data + PACKET_HEADER; (*file_ptr != 0) && (i < FILE_NAME_LENGTH);)
MOV R0,#+0
MOVS R5,R0
ADD R0,SP,#+35
MOVS R4,R0
??Ymodem_Receive_13:
LDRB R0,[R4, #+0]
CMP R0,#+0
BEQ ??Ymodem_Receive_14
CMP R5,#+256
BGE ??Ymodem_Receive_14
// 163 {
// 164 file_name[i++] = *file_ptr++;
LDR R0,??Ymodem_Receive_15 ;; file_name
LDRB R1,[R4, #+0]
STRB R1,[R5, +R0]
ADDS R4,R4,#+1
ADDS R5,R5,#+1
B ??Ymodem_Receive_13
// 165 }
// 166 file_name[i++] = '\0';
??Ymodem_Receive_14:
LDR R0,??Ymodem_Receive_15 ;; file_name
MOV R1,#+0
STRB R1,[R5, +R0]
ADDS R5,R5,#+1
// 167 for (i = 0, file_ptr ++; (*file_ptr != ' ') && (i < FILE_SIZE_LENGTH);)
MOV R0,#+0
MOVS R5,R0
ADDS R4,R4,#+1
??Ymodem_Receive_16:
LDRB R0,[R4, #+0]
CMP R0,#+32
BEQ ??Ymodem_Receive_17
CMP R5,#+16
BGE ??Ymodem_Receive_17
// 168 {
// 169 file_size[i++] = *file_ptr++;
ADD R0,SP,#+16
LDRB R1,[R4, #+0]
STRB R1,[R5, +R0]
ADDS R4,R4,#+1
ADDS R5,R5,#+1
B ??Ymodem_Receive_16
// 170 }
// 171 file_size[i++] = '\0';
??Ymodem_Receive_17:
ADD R0,SP,#+16
MOV R1,#+0
STRB R1,[R5, +R0]
ADDS R5,R5,#+1
// 172 Str2Int(file_size, &size);
MOVS R1,SP
ADD R0,SP,#+16
_BLF Str2Int,??Str2Int??rA
// 173
// 174 /* Test the size of the image to be sent */
// 175 if (size > 0x3E000)
LDR R0,[SP, #+0]
MOV R1,#+1
ORR R1,R1,#0x3E000
CMP R0,R1
BLT ??Ymodem_Receive_18
// 176 {
// 177 /* End session */
// 178 Send_Byte(CAN);
MOV R0,#+24
BL Send_Byte
// 179 Send_Byte(CAN);
MOV R0,#+24
BL Send_Byte
// 180 return -1;
MVN R0,#+0
B ??Ymodem_Receive_8
// 181 }
// 182 /* Erase the needed sectors */
// 183 Sector_Mask = FLASH_SectorMask(size);
??Ymodem_Receive_18:
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -