⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ymodem.s79

📁 IAPBootLoader源程序是单片机ARM的在系统编程方法1
💻 S79
📖 第 1 页 / 共 3 页
字号:
        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 + -