📄 avrsms_zip.lst
字号:
\ 0000000A E0A0 LDI R26, 0
\ 0000000C E0B0 LDI R27, 0
\ 0000000E C00E RJMP ??ZIP_atoi_0
126 {
127 n = 10*n + ( a[i] - '0' ); //Adding value to return Integer
\ ??ZIP_atoi_1:
\ 00000010 E00A LDI R16, 10
\ 00000012 E010 LDI R17, 0
\ 00000014 ........ CALL ?S_EC_MUL_L02
\ 00000018 01FC MOVW R31:R30, R25:R24
\ 0000001A 0FEA ADD R30, R26
\ 0000001C 1FFB ADC R31, R27
\ 0000001E 8140 LD R20, Z
\ 00000020 E050 LDI R21, 0
\ 00000022 0F40 ADD R20, R16
\ 00000024 1F51 ADC R21, R17
\ 00000026 5340 SUBI R20, 48
\ 00000028 4050 SBCI R21, 0
128 }
\ 0000002A 9611 ADIW R27:R26, 1
\ ??ZIP_atoi_0:
\ 0000002C 01FC MOVW R31:R30, R25:R24
\ 0000002E 0FEA ADD R30, R26
\ 00000030 1FFB ADC R31, R27
\ 00000032 8100 LD R16, Z
\ 00000034 3300 CPI R16, 48
\ 00000036 F030 BRCS ??ZIP_atoi_2
\ 00000038 01FC MOVW R31:R30, R25:R24
\ 0000003A 0FEA ADD R30, R26
\ 0000003C 1FFB ADC R31, R27
\ 0000003E 8100 LD R16, Z
\ 00000040 330A CPI R16, 58
\ 00000042 F330 BRCS ??ZIP_atoi_1
129
130 return n;
\ ??ZIP_atoi_2:
\ 00000044 018A MOVW R17:R16, R21:R20
\ 00000046 E0E4 LDI R30, 4
\ 00000048 ........ JMP ?EPILOGUE_B4_L09
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 */
\ In segment CODE, align 2, keep-with-next
143 int ZIP_htoi( unsigned char hex )
\ ZIP_htoi:
144 {
\ 00000000 019C MOVW R19:R18, R25:R24
145
146 if( ( hex >= 'A' ) && ( hex <= 'F' ) ) //Test if hex is A-->F?
\ 00000002 3401 CPI R16, 65
\ 00000004 F038 BRCS ??ZIP_htoi_0
\ 00000006 3407 CPI R16, 71
\ 00000008 F428 BRCC ??ZIP_htoi_0
147 {
148 return hex - 'A' + 10;
\ 0000000A 2F80 MOV R24, R16
\ 0000000C E090 LDI R25, 0
\ 0000000E 97C7 SBIW R25:R24, 55
\ 00000010 018C MOVW R17:R16, R25:R24
\ 00000012 C004 RJMP ??ZIP_htoi_1
149 }
150 else //Must have something else then:0-->9
151 {
152 return hex - '0';
\ ??ZIP_htoi_0:
\ 00000014 2F80 MOV R24, R16
\ 00000016 E090 LDI R25, 0
\ 00000018 97C0 SBIW R25:R24, 48
\ 0000001A 018C MOVW R17:R16, R25:R24
\ ??ZIP_htoi_1:
\ 0000001C 01C9 MOVW R25:R24, R19:R18
\ 0000001E 9508 RET
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 */
\ In segment CODE, align 2, keep-with-next
166 void ZIP_itoh( int n, unsigned char *ret )
\ ZIP_itoh:
167 {
168 ret[0] = hex_lookup[ ( n >> 4 )&0x0F ];
\ 00000000 .... LDI R30, LOW(hex_lookup)
\ 00000002 .... LDI R31, (hex_lookup) >> 8
\ 00000004 2F40 MOV R20, R16
\ 00000006 9545 ASR R20
\ 00000008 9545 ASR R20
\ 0000000A 9545 ASR R20
\ 0000000C 9545 ASR R20
\ 0000000E 2F54 MOV R21, R20
\ 00000010 0F55 LSL R21
\ 00000012 0B55 SBC R21, R21
\ 00000014 704F ANDI R20, 0x0F
\ 00000016 7050 ANDI R21, 0x00
\ 00000018 0FE4 ADD R30, R20
\ 0000001A 1FF5 ADC R31, R21
\ 0000001C 9144 LPM R20, Z
\ 0000001E 01F9 MOVW R31:R30, R19:R18
\ 00000020 8340 ST Z, R20
169 ret[1] = hex_lookup[ ( n & 0x0F ) ];
\ 00000022 .... LDI R30, LOW(hex_lookup)
\ 00000024 .... LDI R31, (hex_lookup) >> 8
\ 00000026 E04F LDI R20, 15
\ 00000028 E050 LDI R21, 0
\ 0000002A 2340 AND R20, R16
\ 0000002C 2351 AND R21, R17
\ 0000002E 0FE4 ADD R30, R20
\ 00000030 1FF5 ADC R31, R21
\ 00000032 9104 LPM R16, Z
\ 00000034 01F9 MOVW R31:R30, R19:R18
\ 00000036 8301 STD Z+1, R16
170 ret[2] = '\0';
\ 00000038 E000 LDI R16, 0
\ 0000003A 01F9 MOVW R31:R30, R19:R18
\ 0000003C 8302 STD Z+2, R16
171 }//end itoh
\ 0000003E 9508 RET
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 */
\ In segment CODE, align 2, keep-with-next
182 unsigned char ZIP_isNmbr( unsigned char nmbr )
\ ZIP_isNmbr:
183 {
184 if( ( nmbr >= '0' ) && ( nmbr <= '9' ) )
\ 00000000 3300 CPI R16, 48
\ 00000002 F020 BRCS ??ZIP_isNmbr_0
\ 00000004 330A CPI R16, 58
\ 00000006 F410 BRCC ??ZIP_isNmbr_0
185 {
186 return 1; //Check if this is a number
\ 00000008 E001 LDI R16, 1
\ 0000000A 9508 RET
187 }
188
189 else
190 {
191 return 0;
\ ??ZIP_isNmbr_0:
\ 0000000C E000 LDI R16, 0
\ 0000000E 9508 RET
192 }
193 }//end isNmbr
Maximum stack usage in bytes:
Function CSTACK RSTACK
-------- ------ ------
ZIP_atoi 4 4
ZIP_compress 6 4
ZIP_decompress 13 4
-> ZIP_htoi 13 2
-> ZIP_htoi 13 2
ZIP_htoi 0 2
ZIP_isNmbr 0 2
ZIP_itoh 0 2
Segment part sizes:
Function/Label Bytes
-------------- -----
hex_lookup 17
mask 7
power 7
ZIP_compress 226
ZIP_decompress 218
ZIP_atoi 76
ZIP_htoi 32
ZIP_itoh 64
ZIP_isNmbr 16
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 + -