📄 avrsms_zip.s90
字号:
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 + -