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

📄 avrsms_zip.s90

📁 SMS傳送Sourcode,compiler with C,AT command
💻 S90
📖 第 1 页 / 共 2 页
字号:
        CFI R25 Frame(CFA_Y, -12)
        CFI R24 Frame(CFA_Y, -13)
        CFI CFA_Y Y+13
        REQUIRE	?Register_R4_is_cg_reg
        REQUIRE	?Register_R5_is_cg_reg
        REQUIRE	?Register_R6_is_cg_reg
        REQUIRE	?Register_R7_is_cg_reg
        REQUIRE	?Register_R8_is_cg_reg
        REQUIRE	?Register_R9_is_cg_reg
        REQUIRE	?Register_R10_is_cg_reg
        REQUIRE	?Register_R11_is_cg_reg
        REQUIRE	?Register_R12_is_cg_reg
        MOVW	R5:R4, R17:R16
        MOVW	R27:R26, R19:R18
//   75   //Local variables
//   76   int i,ii,iii;                                             //String index
//   77   unsigned char rest_c, ans_c ,dec_c , this_c, next_c;      //Read and temorary variables
//   78 
//   79   for( i = ii = iii = rest_c = 0; (this_c = compressed[i++]) != '\0'; )                         //Run through complete string
        LDI	R16, 0
        MOV	R8, R16
        LDI	R17, 0
        MOVW	R7:R6, R17:R16
        MOVW	R25:R24, R17:R16
        MOVW	R11:R10, R17:R16
        RJMP	??ZIP_decompress_0
//   80   {
//   81     //Read:
//   82     next_c = compressed[i++];                               //Read from in buffer in AVR_SMS_com.c
//   83 
//   84     //Convert:
//   85     dec_c = 16 * ZIP_htoi( this_c ) + ZIP_htoi( next_c );           //Decimal value of the two chars
//   86     ans_c = dec_c & mask[6 - ii];                           //mask out the correct bits
//   87     ans_c <<= ii;                                           //Left shift proper correct of times
//   88     decompressed[iii++] = ans_c + rest_c;                        //Store
//   89 
//   90     rest_c = (dec_c & ~mask[6 - ii]) >> ( 7 - ii );         //Saving up for next time
//   91 
//   92     if( ii == 6)                                            //Do carry
//   93     {
//   94       ii = 0;
??ZIP_decompress_1:
        LDI	R24, 0
        LDI	R25, 0
//   95       decompressed[iii++] = rest_c;
        MOVW	R31:R30, R27:R26
        ADD	R30, R6
        ADC	R31, R7
        ST	Z, R8
        LDI	R16, 1
        ADD	R6, R16
        LDI	R16, 0
        ADC	R7, R16
//   96       rest_c = 0;
        CLR	R8
//   97     }
??ZIP_decompress_0:
        MOVW	R31:R30, R5:R4
        ADD	R30, R10
        ADC	R31, R11
        LD	R17, Z
        LDI	R16, 1
        ADD	R10, R16
        LDI	R16, 0
        ADC	R11, R16
        MOV	R16, R17
        TST	R17
        BRNE	$+2+2
        RJMP	??ZIP_decompress_2
        MOVW	R31:R30, R5:R4
        ADD	R30, R10
        ADC	R31, R11
        LD	R9, Z
        LDI	R17, 1
        ADD	R10, R17
        LDI	R17, 0
        ADC	R11, R17
        RCALL	ZIP_htoi
        MOV	R17, R16
        LDI	R16, 16
        MUL	R17, R16
        MOV	R12, R0
        MOV	R16, R9
        RCALL	ZIP_htoi
        MOV	R18, R16
        ADD	R18, R12
        LDI	R30, LOW((mask + 6))
        LDI	R31, (mask + 6) >> 8
        MOVW	R17:R16, R25:R24
        NEG	R17
        NEG	R16
        SBCI	R17, 0
        ADD	R30, R16
        ADC	R31, R17
        LPM	R16, Z
        AND	R16, R18
        MOV	R20, R24
        CALL	?C_SHL_L01
        ADD	R8, R16
        MOVW	R31:R30, R27:R26
        ADD	R30, R6
        ADC	R31, R7
        ST	Z, R8
        LDI	R16, 1
        ADD	R6, R16
        LDI	R16, 0
        ADC	R7, R16
        LDI	R19, 0
        LDI	R30, LOW((mask + 6))
        LDI	R31, (mask + 6) >> 8
        MOVW	R17:R16, R25:R24
        NEG	R17
        NEG	R16
        SBCI	R17, 0
        ADD	R30, R16
        ADC	R31, R17
        LPM	R16, Z
        LDI	R17, 0
        COM	R16
        COM	R17
        AND	R16, R18
        AND	R17, R19
        LDI	R20, 7
        MOV	R18, R24
        SUB	R20, R18
        CALL	?SS_SHR_L02
        MOV	R8, R16
        CPI	R24, 6
        LDI	R16, 0
        CPC	R25, R16
        BRNE	$+2+2
        RJMP	??ZIP_decompress_1
//   98     else
//   99     {
//  100           ii++;
        ADIW	R25:R24, 1
        RJMP	??ZIP_decompress_0
//  101     }
//  102 
//  103   }
//  104 
//  105   decompressed[iii] = '\0';                                      //Terminate string in a proper manner
??ZIP_decompress_2:
        LDI	R16, 0
        ADD	R26, R6
        ADC	R27, R7
        ST	X, R16
//  106   return iii; //Dummy for now
        MOVW	R17:R16, R7:R6
        LDI	R30, 13
        JMP	?EPILOGUE_B13_L09
        CFI EndBlock cfiBlock1
//  107 }
//  108 
//  109 
//  110 /*! \brief Converting ascii char string to int
//  111  *
//  112  *
//  113  *  \note     Will return value as int.
//  114  *
//  115  *  \param    a[]   ASCII string to be converted.
//  116  *  \param    ret   Return Integer.
//  117  *
//  118  */

        RSEG CODE:CODE:NOROOT(1)
//  119 int ZIP_atoi( unsigned char *a )
ZIP_atoi:
        CFI Block cfiBlock2 Using cfiCommon0
        CFI Function ZIP_atoi
//  120 {
        CALL	?PROLOGUE4_L09
        CFI R27 Frame(CFA_Y, -1)
        CFI R26 Frame(CFA_Y, -2)
        CFI R25 Frame(CFA_Y, -3)
        CFI R24 Frame(CFA_Y, -4)
        CFI CFA_Y Y+4
        MOVW	R25:R24, R17:R16
//  121   int i, n;                                     //Help variables
//  122 
//  123   n = 0;                                        //Init
        LDI	R20, 0
        LDI	R21, 0
//  124 
//  125   for( i=0; ( a[i] >= '0' ) && ( a[i] <= '9' ); ++i )   //Running through string converting from ascii to integer
        LDI	R26, 0
        LDI	R27, 0
        RJMP	??ZIP_atoi_0
//  126   {
//  127     n = 10*n + ( a[i] - '0' );                  //Adding value to return Integer
??ZIP_atoi_1:
        LDI	R16, 10
        LDI	R17, 0
        CALL	?S_EC_MUL_L02
        MOVW	R31:R30, R25:R24
        ADD	R30, R26
        ADC	R31, R27
        LD	R20, Z
        LDI	R21, 0
        ADD	R20, R16
        ADC	R21, R17
        SUBI	R20, 48
        SBCI	R21, 0
//  128   }
        ADIW	R27:R26, 1
??ZIP_atoi_0:
        MOVW	R31:R30, R25:R24
        ADD	R30, R26
        ADC	R31, R27
        LD	R16, Z
        CPI	R16, 48
        BRCS	??ZIP_atoi_2
        MOVW	R31:R30, R25:R24
        ADD	R30, R26
        ADC	R31, R27
        LD	R16, Z
        CPI	R16, 58
        BRCS	??ZIP_atoi_1
//  129 
//  130   return n;
??ZIP_atoi_2:
        MOVW	R17:R16, R21:R20
        LDI	R30, 4
        JMP	?EPILOGUE_B4_L09
        CFI EndBlock cfiBlock2
//  131 }//end atoi
//  132 
//  133 
//  134 /*! \brief Convert hex to int
//  135  *
//  136  *  This function will take a hex in char format and return int value
//  137  *
//  138  *  \param    hex     Hex value to convert
//  139  *
//  140  *  \retval           Integer value
//  141  *
//  142  */

        RSEG CODE:CODE:NOROOT(1)
//  143 int ZIP_htoi( unsigned char hex )
ZIP_htoi:
        CFI Block cfiBlock3 Using cfiCommon0
        CFI Function ZIP_htoi
//  144 {
        MOVW	R19:R18, R25:R24
//  145 
//  146   if( ( hex >= 'A' ) && ( hex <= 'F' ) )    //Test if hex is A-->F?
        CPI	R16, 65
        BRCS	??ZIP_htoi_0
        CPI	R16, 71
        BRCC	??ZIP_htoi_0
//  147   {
//  148     return hex - 'A' + 10;
        MOV	R24, R16
        LDI	R25, 0
        SBIW	R25:R24, 55
        MOVW	R17:R16, R25:R24
        RJMP	??ZIP_htoi_1
//  149   }
//  150   else                             //Must have something else then:0-->9
//  151   {
//  152     return hex - '0';
??ZIP_htoi_0:
        MOV	R24, R16
        LDI	R25, 0
        SBIW	R25:R24, 48
        MOVW	R17:R16, R25:R24
??ZIP_htoi_1:
        MOVW	R25:R24, R19:R18
        RET
        CFI EndBlock cfiBlock3
//  153   }
//  154 }//end htoi
//  155 
//  156 
//  157 /*! \brief Converting int [0->255] to hex value
//  158  *
//  159  *
//  160  *  \note     Will return hex value as string.
//  161  *
//  162  *  \param    n     Integer value to be decoded.
//  163  *  \param    ret   Return array.
//  164  *
//  165  */

        RSEG CODE:CODE:NOROOT(1)
//  166 void ZIP_itoh( int n, unsigned char *ret )
ZIP_itoh:
        CFI Block cfiBlock4 Using cfiCommon0
        CFI Function ZIP_itoh
//  167 {
//  168   ret[0] = hex_lookup[ ( n >> 4 )&0x0F ];
        LDI	R30, LOW(hex_lookup)
        LDI	R31, (hex_lookup) >> 8
        MOV	R20, R16
        ASR	R20
        ASR	R20
        ASR	R20
        ASR	R20
        MOV	R21, R20
        LSL	R21
        SBC	R21, R21
        ANDI	R20, 0x0F
        ANDI	R21, 0x00
        ADD	R30, R20
        ADC	R31, R21
        LPM	R20, Z
        MOVW	R31:R30, R19:R18
        ST	Z, R20
//  169   ret[1] = hex_lookup[ ( n & 0x0F ) ];
        LDI	R30, LOW(hex_lookup)
        LDI	R31, (hex_lookup) >> 8
        LDI	R20, 15
        LDI	R21, 0
        AND	R20, R16
        AND	R21, R17
        ADD	R30, R20
        ADC	R31, R21
        LPM	R16, Z
        MOVW	R31:R30, R19:R18
        STD	Z+1, R16
//  170   ret[2] = '\0';
        LDI	R16, 0
        MOVW	R31:R30, R19:R18
        STD	Z+2, R16
//  171 }//end itoh
        RET
        CFI EndBlock cfiBlock4
//  172 
//  173 
//  174 /*! \brief Check if Character is a number
//  175  *
//  176  *
//  177  *  \param    input     Character to test
//  178  *
//  179  *  \retval             BOOL: 1 on success, 0 else
//  180  *
//  181  */

        RSEG CODE:CODE:NOROOT(1)
//  182 unsigned char ZIP_isNmbr( unsigned char nmbr )
ZIP_isNmbr:
        CFI Block cfiBlock5 Using cfiCommon0
        CFI Function ZIP_isNmbr
//  183 {
//  184     if( ( nmbr >= '0' ) && ( nmbr <= '9' ) )
        CPI	R16, 48
        BRCS	??ZIP_isNmbr_0
        CPI	R16, 58
        BRCC	??ZIP_isNmbr_0
//  185     {
//  186       return 1;  //Check if this is a number
        LDI	R16, 1
        RET
//  187     }
//  188 
//  189     else
//  190     {
//  191       return 0;
??ZIP_isNmbr_0:
        LDI	R16, 0
        RET
        CFI EndBlock cfiBlock5
//  192     }
//  193 }//end isNmbr

        ASEGN ABSOLUTE:DATA:NOROOT,01cH
__?EECR:

        ASEGN ABSOLUTE:DATA:NOROOT,01dH
__?EEDR:

        ASEGN ABSOLUTE:DATA:NOROOT,01eH
__?EEARL:

        ASEGN ABSOLUTE:DATA:NOROOT,01fH
__?EEARH:

        END
// 
// 632 bytes in segment CODE
//  31 bytes in segment NEAR_F
// 
// 663 bytes of CODE memory
//
//Errors: none
//Warnings: none

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -