📄 avrsms_zip.lst
字号:
\ 000000C4 3086 CPI R24, 6
\ 000000C6 E000 LDI R16, 0
\ 000000C8 0790 CPC R25, R16
\ 000000CA F409 BRNE $+2+2
\ 000000CC CFA7 RJMP ??ZIP_compress_1
60
61 else
62 {
63 ii++;
\ 000000CE 9601 ADIW R25:R24, 1
\ 000000D0 CFAD RJMP ??ZIP_compress_0
64 }
65 }
66
67 ret[iii] = '\0';
\ ??ZIP_compress_2:
\ 000000D2 E000 LDI R16, 0
\ 000000D4 0DA2 ADD R26, R2
\ 000000D6 1DB3 ADC R27, R3
\ 000000D8 930C ST X, R16
68
69 return i;
\ 000000DA 0189 MOVW R17:R16, R19:R18
\ 000000DC E0E6 LDI R30, 6
\ 000000DE ........ JMP ?EPILOGUE_B6_L09
70 }//end ZIP_compress
71
72
\ In segment CODE, align 2, keep-with-next
73 int ZIP_decompress( unsigned char *compressed, unsigned char *decompressed )
\ ZIP_decompress:
74 {
\ 00000000 ........ CALL ?PROLOGUE13_L09
\ 00000004 REQUIRE ?Register_R4_is_cg_reg
\ 00000004 REQUIRE ?Register_R5_is_cg_reg
\ 00000004 REQUIRE ?Register_R6_is_cg_reg
\ 00000004 REQUIRE ?Register_R7_is_cg_reg
\ 00000004 REQUIRE ?Register_R8_is_cg_reg
\ 00000004 REQUIRE ?Register_R9_is_cg_reg
\ 00000004 REQUIRE ?Register_R10_is_cg_reg
\ 00000004 REQUIRE ?Register_R11_is_cg_reg
\ 00000004 REQUIRE ?Register_R12_is_cg_reg
\ 00000004 0128 MOVW R5:R4, R17:R16
\ 00000006 01D9 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
\ 00000008 E000 LDI R16, 0
\ 0000000A 2E80 MOV R8, R16
\ 0000000C E010 LDI R17, 0
\ 0000000E 0138 MOVW R7:R6, R17:R16
\ 00000010 01C8 MOVW R25:R24, R17:R16
\ 00000012 0158 MOVW R11:R10, R17:R16
\ 00000014 C00B 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:
\ 00000016 E080 LDI R24, 0
\ 00000018 E090 LDI R25, 0
95 decompressed[iii++] = rest_c;
\ 0000001A 01FD MOVW R31:R30, R27:R26
\ 0000001C 0DE6 ADD R30, R6
\ 0000001E 1DF7 ADC R31, R7
\ 00000020 8280 ST Z, R8
\ 00000022 E001 LDI R16, 1
\ 00000024 0E60 ADD R6, R16
\ 00000026 E000 LDI R16, 0
\ 00000028 1E70 ADC R7, R16
96 rest_c = 0;
\ 0000002A 2488 CLR R8
97 }
\ ??ZIP_decompress_0:
\ 0000002C 01F2 MOVW R31:R30, R5:R4
\ 0000002E 0DEA ADD R30, R10
\ 00000030 1DFB ADC R31, R11
\ 00000032 8110 LD R17, Z
\ 00000034 E001 LDI R16, 1
\ 00000036 0EA0 ADD R10, R16
\ 00000038 E000 LDI R16, 0
\ 0000003A 1EB0 ADC R11, R16
\ 0000003C 2F01 MOV R16, R17
\ 0000003E 2311 TST R17
\ 00000040 F409 BRNE $+2+2
\ 00000042 C043 RJMP ??ZIP_decompress_2
\ 00000044 01F2 MOVW R31:R30, R5:R4
\ 00000046 0DEA ADD R30, R10
\ 00000048 1DFB ADC R31, R11
\ 0000004A 8090 LD R9, Z
\ 0000004C E011 LDI R17, 1
\ 0000004E 0EA1 ADD R10, R17
\ 00000050 E010 LDI R17, 0
\ 00000052 1EB1 ADC R11, R17
\ 00000054 .... RCALL ZIP_htoi
\ 00000056 2F10 MOV R17, R16
\ 00000058 E100 LDI R16, 16
\ 0000005A 9F10 MUL R17, R16
\ 0000005C 2CC0 MOV R12, R0
\ 0000005E 2D09 MOV R16, R9
\ 00000060 .... RCALL ZIP_htoi
\ 00000062 2F20 MOV R18, R16
\ 00000064 0D2C ADD R18, R12
\ 00000066 .... LDI R30, LOW((mask + 6))
\ 00000068 .... LDI R31, (mask + 6) >> 8
\ 0000006A 018C MOVW R17:R16, R25:R24
\ 0000006C 9511 NEG R17
\ 0000006E 9501 NEG R16
\ 00000070 4010 SBCI R17, 0
\ 00000072 0FE0 ADD R30, R16
\ 00000074 1FF1 ADC R31, R17
\ 00000076 9104 LPM R16, Z
\ 00000078 2302 AND R16, R18
\ 0000007A 2F48 MOV R20, R24
\ 0000007C ........ CALL ?C_SHL_L01
\ 00000080 0E80 ADD R8, R16
\ 00000082 01FD MOVW R31:R30, R27:R26
\ 00000084 0DE6 ADD R30, R6
\ 00000086 1DF7 ADC R31, R7
\ 00000088 8280 ST Z, R8
\ 0000008A E001 LDI R16, 1
\ 0000008C 0E60 ADD R6, R16
\ 0000008E E000 LDI R16, 0
\ 00000090 1E70 ADC R7, R16
\ 00000092 E030 LDI R19, 0
\ 00000094 .... LDI R30, LOW((mask + 6))
\ 00000096 .... LDI R31, (mask + 6) >> 8
\ 00000098 018C MOVW R17:R16, R25:R24
\ 0000009A 9511 NEG R17
\ 0000009C 9501 NEG R16
\ 0000009E 4010 SBCI R17, 0
\ 000000A0 0FE0 ADD R30, R16
\ 000000A2 1FF1 ADC R31, R17
\ 000000A4 9104 LPM R16, Z
\ 000000A6 E010 LDI R17, 0
\ 000000A8 9500 COM R16
\ 000000AA 9510 COM R17
\ 000000AC 2302 AND R16, R18
\ 000000AE 2313 AND R17, R19
\ 000000B0 E047 LDI R20, 7
\ 000000B2 2F28 MOV R18, R24
\ 000000B4 1B42 SUB R20, R18
\ 000000B6 ........ CALL ?SS_SHR_L02
\ 000000BA 2E80 MOV R8, R16
\ 000000BC 3086 CPI R24, 6
\ 000000BE E000 LDI R16, 0
\ 000000C0 0790 CPC R25, R16
\ 000000C2 F409 BRNE $+2+2
\ 000000C4 CFA8 RJMP ??ZIP_decompress_1
98 else
99 {
100 ii++;
\ 000000C6 9601 ADIW R25:R24, 1
\ 000000C8 CFB1 RJMP ??ZIP_decompress_0
101 }
102
103 }
104
105 decompressed[iii] = '\0'; //Terminate string in a proper manner
\ ??ZIP_decompress_2:
\ 000000CA E000 LDI R16, 0
\ 000000CC 0DA6 ADD R26, R6
\ 000000CE 1DB7 ADC R27, R7
\ 000000D0 930C ST X, R16
106 return iii; //Dummy for now
\ 000000D2 0183 MOVW R17:R16, R7:R6
\ 000000D4 E0ED LDI R30, 13
\ 000000D6 ........ JMP ?EPILOGUE_B13_L09
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 */
\ In segment CODE, align 2, keep-with-next
119 int ZIP_atoi( unsigned char *a )
\ ZIP_atoi:
120 {
\ 00000000 ........ CALL ?PROLOGUE4_L09
\ 00000004 01C8 MOVW R25:R24, R17:R16
121 int i, n; //Help variables
122
123 n = 0; //Init
\ 00000006 E040 LDI R20, 0
\ 00000008 E050 LDI R21, 0
124
125 for( i=0; ( a[i] >= '0' ) && ( a[i] <= '9' ); ++i ) //Running through string converting from ascii to integer
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -