📄 cc1100_test.lst
字号:
0244 01AF MOVW R20,R30
0245 DFE9 RCALL _putchar
0246 01FA MOVW R30,R20
0247 8020 LDD R2,Z+0
0248 2022 TST R2
0249 F7C1 BNE 0x0242
024A D5E7 RCALL pop_gset1
024B 9508 RET
_strlen:
i --> R20
s --> R16
024C D5E2 RCALL push_gset1
(0047) }
(0048) }
(0049) int strlen(const char *s)
(0050) {
(0051) int i = 0;
024D 2744 CLR R20
024E 2755 CLR R21
(0052)
(0053) for(; *s; s++)
024F C004 RJMP 0x0254
(0054) i++;
0250 5F4F SUBI R20,0xFF
0251 4F5F SBCI R21,0xFF
0252 5F0F SUBI R16,0xFF
0253 4F1F SBCI R17,0xFF
0254 01F8 MOVW R30,R16
0255 91E4 LPM R30,0(Z)
0256 23EE TST R30
0257 F7C1 BNE 0x0250
(0055)
(0056) return i;
0258 018A MOVW R16,R20
0259 D5D8 RCALL pop_gset1
025A 9508 RET
_PutRepChar:
count --> R20
c --> R22
025B D5D1 RCALL push_gset2
025C 01A9 MOVW R20,R18
025D 2F60 MOV R22,R16
(0057) }
(0058) /*---------------------printf and support routines ---------------------*/
(0059) /* print c count times */
(0060) void PutRepChar(char c, int count)
(0061) {
025E C002 RJMP 0x0261
(0062) while (count--) putchar(c);
025F 2F06 MOV R16,R22
0260 DFCE RCALL _putchar
0261 011A MOVW R2,R20
0262 5041 SUBI R20,1
0263 4050 SBCI R21,0
0264 2022 TST R2
0265 F7C9 BNE 0x025F
0266 2033 TST R3
0267 F7B9 BNE 0x025F
0268 D5B6 RCALL pop_gset2
0269 9508 RET
_PutStringReverse:
index --> R20
s --> R22
026A D5C2 RCALL push_gset2
026B 01A9 MOVW R20,R18
026C 01B8 MOVW R22,R16
(0063) }
(0064)
(0065) /* put string reverse */
(0066) void PutStringReverse(char *s, int index)
(0067) {
026D C005 RJMP 0x0273
(0068) while ((index--) > 0) putchar(s[index]);
026E 01FA MOVW R30,R20
026F 0FE6 ADD R30,R22
0270 1FF7 ADC R31,R23
0271 8100 LDD R16,Z+0
0272 DFBC RCALL _putchar
0273 011A MOVW R2,R20
0274 5041 SUBI R20,1
0275 4050 SBCI R21,0
0276 2444 CLR R4
0277 2455 CLR R5
0278 1442 CP R4,R2
0279 0453 CPC R5,R3
027A F39C BLT 0x026E
027B D5A3 RCALL pop_gset2
027C 9508 RET
_PutNumber:
negative --> R14
left --> Y+40
buffer --> Y+0
digit --> R22
bi --> R4
uvalue --> R20
fill --> Y+56
width --> Y+54
radix --> Y+52
value --> R22
027D 933A ST R19,-Y
027E 932A ST R18,-Y
027F D5A7 RCALL push_gset5
0280 01B8 MOVW R22,R16
0281 97AA SBIW R28,0x2A
(0069) }
(0070)
(0071) /*-------------------------------------------------------------------------*/
(0072) /*
(0073) prints value in radix, in a field width width, with fill
(0074) character fill
(0075) if radix is negative, print as signed quantity
(0076) if width is negative, left justify
(0077) if width is 0, use whatever is needed
(0078) if fill is 0, use ' '
(0079) */
(0080)
(0081) static void PutNumber(int value, int radix, int width, char fill)
(0082) {
(0083) char buffer[40];
(0084) int bi = 0;
0282 2444 CLR R4
0283 2455 CLR R5
(0085) int unsigned uvalue;
(0086) short int digit;
(0087) short int left = FALSE;
0284 2400 CLR R0
0285 2411 CLR R1
0286 A619 STD Y+41,R1
0287 A608 STD Y+40,R0
(0088) short int negative = FALSE;
0288 24EE CLR R14
0289 24FF CLR R15
(0089)
(0090) if (fill == 0) fill = ' ';
028A AC08 LDD R0,Y+56
028B 2000 TST R0
028C F411 BNE 0x028F
028D E280 LDI R24,0x20
028E AF88 STD Y+56,R24
(0091)
(0092) if (width < 0) {
028F A98E LDD R24,Y+54
0290 A99F LDD R25,Y+55
0291 3080 CPI R24,0
0292 E0E0 LDI R30,0
0293 079E CPC R25,R30
0294 F454 BGE 0x029F
(0093) width = -width;
0295 9580 COM R24
0296 9590 COM R25
0297 5F8F SUBI R24,0xFF
0298 4F9F SBCI R25,0xFF
0299 AB9F STD Y+55,R25
029A AB8E STD Y+54,R24
(0094) left = TRUE;
029B E081 LDI R24,1
029C E090 LDI R25,0
029D A799 STD Y+41,R25
029E A788 STD Y+40,R24
(0095) }
(0096) if (width < 0 || width > 80) width = 0;
029F A98E LDD R24,Y+54
02A0 A99F LDD R25,Y+55
02A1 3080 CPI R24,0
02A2 E0E0 LDI R30,0
02A3 079E CPC R25,R30
02A4 F03C BLT 0x02AC
02A5 E580 LDI R24,0x50
02A6 E090 LDI R25,0
02A7 A80E LDD R0,Y+54
02A8 A81F LDD R1,Y+55
02A9 1580 CP R24,R0
02AA 0591 CPC R25,R1
02AB F424 BGE 0x02B0
02AC 2400 CLR R0
02AD 2411 CLR R1
02AE AA1F STD Y+55,R1
02AF AA0E STD Y+54,R0
(0097)
(0098) if (radix < 0) {
02B0 A98C LDD R24,Y+52
02B1 A99D LDD R25,Y+53
02B2 3080 CPI R24,0
02B3 E0E0 LDI R30,0
02B4 079E CPC R25,R30
02B5 F48C BGE 0x02C7
(0099) radix = -radix;
02B6 9580 COM R24
02B7 9590 COM R25
02B8 5F8F SUBI R24,0xFF
02B9 4F9F SBCI R25,0xFF
02BA AB9D STD Y+53,R25
02BB AB8C STD Y+52,R24
(0100) if (value < 0) {
02BC 3060 CPI R22,0
02BD E0E0 LDI R30,0
02BE 077E CPC R23,R30
02BF F43C BGE 0x02C7
(0101) negative = TRUE;
02C0 E081 LDI R24,1
02C1 E090 LDI R25,0
02C2 017C MOVW R14,R24
(0102) value = -value;
02C3 9560 COM R22
02C4 9570 COM R23
02C5 5F6F SUBI R22,0xFF
02C6 4F7F SBCI R23,0xFF
(0103) }
(0104) }
(0105) uvalue = value;
02C7 01AB MOVW R20,R22
(0106) do
(0107) {
(0108) if (radix != 16)
02C8 A98C LDD R24,Y+52
02C9 A99D LDD R25,Y+53
02CA 3180 CPI R24,0x10
02CB E0E0 LDI R30,0
02CC 079E CPC R25,R30
02CD F051 BEQ 0x02D8
(0109) {
(0110) digit = uvalue % radix ;
02CE 019C MOVW R18,R24
02CF 018A MOVW R16,R20
02D0 D522 RCALL mod16u
02D1 01B8 MOVW R22,R16
(0111) uvalue = uvalue / radix ;
02D2 A92C LDD R18,Y+52
02D3 A93D LDD R19,Y+53
02D4 018A MOVW R16,R20
02D5 D51F RCALL div16u
02D6 01A8 MOVW R20,R16
(0112) }
02D7 C00D RJMP 0x02E5
(0113) else
(0114) {
(0115) digit = uvalue & 0xf;
02D8 01BA MOVW R22,R20
02D9 706F ANDI R22,0xF
02DA 7070 ANDI R23,0
(0116) uvalue = uvalue >> 4;
02DB 011A MOVW R2,R20
02DC 9436 LSR R3
02DD 9427 ROR R2
02DE 9436 LSR R3
02DF 9427 ROR R2
02E0 9436 LSR R3
02E1 9427 ROR R2
02E2 9436 LSR R3
02E3 9427 ROR R2
02E4 01A1 MOVW R20,R2
(0117) }
(0118) buffer[bi] = digit + ((digit <= 9) ? '0' : ('A' - 10));
02E5 E089 LDI R24,0x9
02E6 E090 LDI R25,0
02E7 1786 CP R24,R22
02E8 0797 CPC R25,R23
02E9 F01C BLT 0x02ED
02EA E380 LDI R24,0x30
02EB 015C MOVW R10,R24
02EC C003 RJMP 0x02F0
02ED E387 LDI R24,0x37
02EE E090 LDI R25,0
02EF 015C MOVW R10,R24
02F0 011B MOVW R2,R22
02F1 0C2A ADD R2,R10
02F2 1C3B ADC R3,R11
02F3 01CE MOVW R24,R28
02F4 01F2 MOVW R30,R4
02F5 0FE8 ADD R30,R24
02F6 1FF9 ADC R31,R25
02F7 8220 STD Z+0,R2
(0119) bi++;
02F8 01C2 MOVW R24,R4
02F9 9601 ADIW R24,1
02FA 012C MOVW R4,R24
(0120)
(0121) if (uvalue != 0)
02FB 3040 CPI R20,0
02FC 0745 CPC R20,R21
02FD F409 BNE 0x02FF
02FE C036 RJMP 0x0335
(0122) {
(0123) if ((radix==10)&&((bi==3)||(bi==7)||(bi==11)|(bi==15)))
02FF A98C LDD R24,Y+52
0300 A99D LDD R25,Y+53
0301 308A CPI R24,0xA
0302 E0E0 LDI R30,0
0303 079E CPC R25,R30
0304 F009 BEQ 0x0306
0305 C02F RJMP 0x0335
0306 01C2 MOVW R24,R4
0307 3083 CPI R24,3
0308 E0E0 LDI R30,0
0309 079E CPC R25,R30
030A F101 BEQ 0x032B
030B 3087 CPI R24,7
030C E0E0 LDI R30,0
030D 079E CPC R25,R30
030E F0E1 BEQ 0x032B
030F 308B CPI R24,0xB
0310 E0E0 LDI R30,0
0311 079E CPC R25,R30
0312 F421 BNE 0x0317
0313 E081 LDI R24,1
0314 E090 LDI R25,0
0315 015C MOVW R10,R24
0316 C002 RJMP 0x0319
0317 24AA CLR R10
0318 24BB CLR R11
0319 01C2 MOVW R24,R4
031A 308F CPI R24,0xF
031B E0E0 LDI R30,0
031C 079E CPC R25,R30
031D F421 BNE 0x0322
031E E081 LDI R24,1
031F E090 LDI R25,0
0320 016C MOVW R12,R24
0321 C002 RJMP 0x0324
0322 24CC CLR R12
0323 24DD CLR R13
0324 0115 MOVW R2,R10
0325 282C OR R2,R12
0326 283D OR R3,R13
0327 2022 TST R2
0328 F411 BNE 0x032B
0329 2033 TST R3
032A F051 BEQ 0x0335
(0124) {
(0125) buffer[bi++]=',';
032B 0112 MOVW R2,R4
032C 01C1 MOVW R24,R2
032D 9601 ADIW R24,1
032E 012C MOVW R4,R24
032F 01CE MOVW R24,R28
0330 01F1 MOVW R30,R2
0331 0FE8 ADD R30,R24
0332 1FF9 ADC R31,R25
0333 E28C LDI R24,0x2C
0334 8380 STD Z+0,R24
(0126) }
(0127) }
(0128) } while (uvalue != 0);
0335 3040 CPI R20,0
0336 0745 CPC R20,R21
0337 F009 BEQ 0x0339
0338 CF8F RJMP 0x02C8
(0129)
(0130) if (negative) {
0339 20EE TST R14
033A F411 BNE 0x033D
033B 20FF TST R15
033C F049 BEQ 0x0346
(0131) buffer[bi] = '-';
033D 01CE MOVW R24,R28
033E 01F2 MOVW R30,R4
033F 0FE8 ADD R30,R24
0340 1FF9 ADC R31,R25
0341 E28D LDI R24,0x2D
0342 8380 STD Z+0,R24
(0132) bi += 1;
0343 01C2 MOVW R24,R4
0344 9601 ADIW R24,1
0345 012C MOVW R4,R24
(0133) }
(0134) if (width <= bi)
0346 A80E LDD R0,Y+54
0347 A81F LDD R1,Y+55
0348 1440 CP R4,R0
0349 0451 CPC R5,R1
034A F044 BLT 0x0353
(0135) {
(0136) PutStringReverse(buffer, bi);
034B 0192 MOVW R18,R4
034C 018E MOVW R16,R28
034D 932F PUSH R18
034E 933F PUSH R19
034F DF1A RCALL _PutStringReverse
0350 905F POP R5
0351 904F POP R4
(0137) }
0352 C021 RJMP 0x0374
(0138) else
(0139) {
(0140) width -= bi;
0353 A80E LDD R0,Y+54
0354 A81F LDD R1,Y+55
0355 1804 SUB R0,R4
0356 0815 SBC R1,R5
0357 AA1F STD Y+55,R1
0358 AA0E STD Y+54,R0
(0141) if (!left) PutRepChar(fill, width);
0359 A408 LDD R0,Y+40
035A A419 LDD R1,Y+41
035B 2000 TST R0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -