; generated by Component: ARM Compiler 5.06 update 7 (build 960) Tool: ArmCC [4d365d] ; commandline ArmCC [--list --split_sections --debug -c --asm --interleave -o..\list\segger_rtt_printf.o --asm_dir=..\List\ --list_dir=..\List\ --depend=..\list\segger_rtt_printf.d --cpu=Cortex-M3 --apcs=interwork -O0 --diag_suppress=9931 -I..\src\myprintf -I..\src\RTT -I.\RTE\_XWY -ID:\Keil\ARM\Packs\ARM\CMSIS\5.9.0\CMSIS\Core\Include -ID:\Keil\ARM\Packs\Keil\STM32F1xx_DFP\2.4.1\Device\Include -D__MICROLIB -D__UVISION_VERSION=538 -D_RTE_ -DSTM32F10X_HD -D_RTE_ -D_DEBUG --omf_browse=..\list\segger_rtt_printf.crf ..\src\RTT\SEGGER_RTT_printf.c] THUMB AREA ||i.SEGGER_RTT_printf||, CODE, READONLY, ALIGN=1 SEGGER_RTT_printf PROC ;;;495 */ ;;;496 int SEGGER_RTT_printf(unsigned BufferIndex, const char * sFormat, ...) { 000000 b40f PUSH {r0-r3} 000002 b538 PUSH {r3-r5,lr} 000004 4604 MOV r4,r0 ;;;497 int r; ;;;498 va_list ParamList; ;;;499 ;;;500 va_start(ParamList, sFormat); 000006 a806 ADD r0,sp,#0x18 000008 9000 STR r0,[sp,#0] ;;;501 r = SEGGER_RTT_vprintf(BufferIndex, sFormat, &ParamList); 00000a 466a MOV r2,sp 00000c 4620 MOV r0,r4 00000e 9905 LDR r1,[sp,#0x14] 000010 f7fffffe BL SEGGER_RTT_vprintf 000014 4605 MOV r5,r0 ;;;502 va_end(ParamList); 000016 2000 MOVS r0,#0 000018 9000 STR r0,[sp,#0] ;;;503 return r; 00001a 4628 MOV r0,r5 ;;;504 } 00001c bc38 POP {r3-r5} 00001e f85dfb14 LDR pc,[sp],#0x14 ;;;505 /*************************** End of file ****************************/ ENDP AREA ||i.SEGGER_RTT_vprintf||, CODE, READONLY, ALIGN=1 SEGGER_RTT_vprintf PROC ;;;321 */ ;;;322 int SEGGER_RTT_vprintf(unsigned BufferIndex, const char * sFormat, va_list * pParamList) { 000000 e92d4ff0 PUSH {r4-r11,lr} 000004 b099 SUB sp,sp,#0x64 000006 4682 MOV r10,r0 000008 460d MOV r5,r1 00000a 4614 MOV r4,r2 ;;;323 char c; ;;;324 SEGGER_RTT_PRINTF_DESC BufferDesc; ;;;325 int v; ;;;326 unsigned NumDigits; ;;;327 unsigned FormatFlags; ;;;328 unsigned FieldWidth; ;;;329 char acBuffer[SEGGER_RTT_PRINTF_BUFFER_SIZE]; ;;;330 ;;;331 BufferDesc.pBuffer = acBuffer; 00000c a803 ADD r0,sp,#0xc 00000e 9014 STR r0,[sp,#0x50] ;;;332 BufferDesc.BufferSize = SEGGER_RTT_PRINTF_BUFFER_SIZE; 000010 2040 MOVS r0,#0x40 000012 9015 STR r0,[sp,#0x54] ;;;333 BufferDesc.Cnt = 0u; 000014 2000 MOVS r0,#0 000016 9016 STR r0,[sp,#0x58] ;;;334 BufferDesc.RTTBufferIndex = BufferIndex; 000018 f8cda060 STR r10,[sp,#0x60] ;;;335 BufferDesc.ReturnValue = 0; 00001c 9017 STR r0,[sp,#0x5c] ;;;336 ;;;337 do { 00001e bf00 NOP |L2.32| ;;;338 c = *sFormat; 000020 782e LDRB r6,[r5,#0] ;;;339 sFormat++; 000022 1c6d ADDS r5,r5,#1 ;;;340 if (c == 0u) { 000024 b906 CBNZ r6,|L2.40| ;;;341 break; 000026 e0dd B |L2.484| |L2.40| ;;;342 } ;;;343 if (c == '%') { 000028 2e25 CMP r6,#0x25 00002a d179 BNE |L2.288| ;;;344 // ;;;345 // Filter out flags ;;;346 // ;;;347 FormatFlags = 0u; 00002c 2700 MOVS r7,#0 ;;;348 v = 1; 00002e f04f0901 MOV r9,#1 ;;;349 do { 000032 bf00 NOP |L2.52| ;;;350 c = *sFormat; 000034 782e LDRB r6,[r5,#0] ;;;351 switch (c) { 000036 2e23 CMP r6,#0x23 000038 d012 BEQ |L2.96| 00003a 2e2b CMP r6,#0x2b 00003c d00c BEQ |L2.88| 00003e 2e2d CMP r6,#0x2d 000040 d002 BEQ |L2.72| 000042 2e30 CMP r6,#0x30 000044 d110 BNE |L2.104| 000046 e003 B |L2.80| |L2.72| ;;;352 case '-': FormatFlags |= FORMAT_FLAG_LEFT_JUSTIFY; sFormat++; break; 000048 f0470701 ORR r7,r7,#1 00004c 1c6d ADDS r5,r5,#1 00004e e00e B |L2.110| |L2.80| ;;;353 case '0': FormatFlags |= FORMAT_FLAG_PAD_ZERO; sFormat++; break; 000050 f0470702 ORR r7,r7,#2 000054 1c6d ADDS r5,r5,#1 000056 e00a B |L2.110| |L2.88| ;;;354 case '+': FormatFlags |= FORMAT_FLAG_PRINT_SIGN; sFormat++; break; 000058 f0470704 ORR r7,r7,#4 00005c 1c6d ADDS r5,r5,#1 00005e e006 B |L2.110| |L2.96| ;;;355 case '#': FormatFlags |= FORMAT_FLAG_ALTERNATE; sFormat++; break; 000060 f0470708 ORR r7,r7,#8 000064 1c6d ADDS r5,r5,#1 000066 e002 B |L2.110| |L2.104| ;;;356 default: v = 0; break; 000068 f04f0900 MOV r9,#0 00006c bf00 NOP |L2.110| 00006e bf00 NOP ;352 ;;;357 } ;;;358 } while (v); 000070 f1b90f00 CMP r9,#0 000074 d1de BNE |L2.52| ;;;359 // ;;;360 // filter out field with ;;;361 // ;;;362 FieldWidth = 0u; 000076 f04f0800 MOV r8,#0 ;;;363 do { 00007a bf00 NOP |L2.124| ;;;364 c = *sFormat; 00007c 782e LDRB r6,[r5,#0] ;;;365 if ((c < '0') || (c > '9')) { 00007e 2e30 CMP r6,#0x30 000080 db01 BLT |L2.134| 000082 2e39 CMP r6,#0x39 000084 dd00 BLE |L2.136| |L2.134| ;;;366 break; 000086 e007 B |L2.152| |L2.136| ;;;367 } ;;;368 sFormat++; 000088 1c6d ADDS r5,r5,#1 ;;;369 FieldWidth = (FieldWidth * 10u) + ((unsigned)c - '0'); 00008a f1a60030 SUB r0,r6,#0x30 00008e eb080188 ADD r1,r8,r8,LSL #2 000092 eb000841 ADD r8,r0,r1,LSL #1 ;;;370 } while (1); 000096 e7f1 B |L2.124| |L2.152| 000098 bf00 NOP ;366 ;;;371 ;;;372 // ;;;373 // Filter out precision (number of digits to display) ;;;374 // ;;;375 NumDigits = 0u; 00009a 2000 MOVS r0,#0 00009c 9013 STR r0,[sp,#0x4c] ;;;376 c = *sFormat; 00009e 782e LDRB r6,[r5,#0] ;;;377 if (c == '.') { 0000a0 2e2e CMP r6,#0x2e 0000a2 d112 BNE |L2.202| ;;;378 sFormat++; 0000a4 1c6d ADDS r5,r5,#1 ;;;379 do { 0000a6 bf00 NOP |L2.168| ;;;380 c = *sFormat; 0000a8 782e LDRB r6,[r5,#0] ;;;381 if ((c < '0') || (c > '9')) { 0000aa 2e30 CMP r6,#0x30 0000ac db01 BLT |L2.178| 0000ae 2e39 CMP r6,#0x39 0000b0 dd00 BLE |L2.180| |L2.178| ;;;382 break; 0000b2 e009 B |L2.200| |L2.180| ;;;383 } ;;;384 sFormat++; 0000b4 1c6d ADDS r5,r5,#1 ;;;385 NumDigits = NumDigits * 10u + ((unsigned)c - '0'); 0000b6 f1a60030 SUB r0,r6,#0x30 0000ba 9913 LDR r1,[sp,#0x4c] 0000bc eb010181 ADD r1,r1,r1,LSL #2 0000c0 eb000041 ADD r0,r0,r1,LSL #1 0000c4 9013 STR r0,[sp,#0x4c] ;;;386 } while (1); 0000c6 e7ef B |L2.168| |L2.200| 0000c8 bf00 NOP ;382 |L2.202| ;;;387 } ;;;388 // ;;;389 // Filter out length modifier ;;;390 // ;;;391 c = *sFormat; 0000ca 782e LDRB r6,[r5,#0] ;;;392 do { 0000cc bf00 NOP |L2.206| ;;;393 if ((c == 'l') || (c == 'h')) { 0000ce 2e6c CMP r6,#0x6c 0000d0 d001 BEQ |L2.214| 0000d2 2e68 CMP r6,#0x68 0000d4 d102 BNE |L2.220| |L2.214| ;;;394 sFormat++; 0000d6 1c6d ADDS r5,r5,#1 ;;;395 c = *sFormat; 0000d8 782e LDRB r6,[r5,#0] 0000da e000 B |L2.222| |L2.220| ;;;396 } else { ;;;397 break; 0000dc e000 B |L2.224| |L2.222| ;;;398 } ;;;399 } while (1); 0000de e7f6 B |L2.206| |L2.224| 0000e0 bf00 NOP ;397 ;;;400 // ;;;401 // Handle specifiers ;;;402 // ;;;403 switch (c) { 0000e2 2e70 CMP r6,#0x70 0000e4 d05d BEQ |L2.418| 0000e6 dc08 BGT |L2.250| 0000e8 2e25 CMP r6,#0x25 0000ea d06a BEQ |L2.450| 0000ec 2e58 CMP r6,#0x58 0000ee d035 BEQ |L2.348| 0000f0 2e63 CMP r6,#0x63 0000f2 d009 BEQ |L2.264| 0000f4 2e64 CMP r6,#0x64 0000f6 d169 BNE |L2.460| 0000f8 e013 B |L2.290| |L2.250| 0000fa 2e73 CMP r6,#0x73 0000fc d03c BEQ |L2.376| 0000fe 2e75 CMP r6,#0x75 000100 d01d BEQ |L2.318| 000102 2e78 CMP r6,#0x78 000104 d162 BNE |L2.460| 000106 e028 B |L2.346| |L2.264| ;;;404 case 'c': { ;;;405 char c0; ;;;406 v = va_arg(*pParamList, int); 000108 6821 LDR r1,[r4,#0] 00010a 1d08 ADDS r0,r1,#4 00010c 6020 STR r0,[r4,#0] 00010e f8d19000 LDR r9,[r1,#0] ;;;407 c0 = (char)v; 000112 f0090bff AND r11,r9,#0xff ;;;408 _StoreChar(&BufferDesc, c0); 000116 4659 MOV r1,r11 000118 a814 ADD r0,sp,#0x50 00011a f7fffffe BL _StoreChar ;;;409 break; 00011e e056 B |L2.462| |L2.288| 000120 e058 B |L2.468| |L2.290| ;;;410 } ;;;411 case 'd': ;;;412 v = va_arg(*pParamList, int); 000122 6821 LDR r1,[r4,#0] 000124 1d08 ADDS r0,r1,#4 000126 6020 STR r0,[r4,#0] 000128 f8d19000 LDR r9,[r1,#0] ;;;413 _PrintInt(&BufferDesc, v, 10u, NumDigits, FieldWidth, FormatFlags); 00012c e9cd8700 STRD r8,r7,[sp,#0] 000130 220a MOVS r2,#0xa 000132 4649 MOV r1,r9 000134 a814 ADD r0,sp,#0x50 000136 9b13 LDR r3,[sp,#0x4c] 000138 f7fffffe BL _PrintInt ;;;414 break; 00013c e047 B |L2.462| |L2.318| ;;;415 case 'u': ;;;416 v = va_arg(*pParamList, int); 00013e 6821 LDR r1,[r4,#0] 000140 1d08 ADDS r0,r1,#4 000142 6020 STR r0,[r4,#0] 000144 f8d19000 LDR r9,[r1,#0] ;;;417 _PrintUnsigned(&BufferDesc, (unsigned)v, 10u, NumDigits, FieldWidth, FormatFlags); 000148 e9cd8700 STRD r8,r7,[sp,#0] 00014c 220a MOVS r2,#0xa 00014e 4649 MOV r1,r9 000150 a814 ADD r0,sp,#0x50 000152 9b13 LDR r3,[sp,#0x4c] 000154 f7fffffe BL _PrintUnsigned ;;;418 break; 000158 e039 B |L2.462| |L2.346| ;;;419 case 'x': ;;;420 case 'X': 00015a bf00 NOP |L2.348| ;;;421 v = va_arg(*pParamList, int); 00015c 6821 LDR r1,[r4,#0] 00015e 1d08 ADDS r0,r1,#4 000160 6020 STR r0,[r4,#0] 000162 f8d19000 LDR r9,[r1,#0] ;;;422 _PrintUnsigned(&BufferDesc, (unsigned)v, 16u, NumDigits, FieldWidth, FormatFlags); 000166 e9cd8700 STRD r8,r7,[sp,#0] 00016a 2210 MOVS r2,#0x10 00016c 4649 MOV r1,r9 00016e a814 ADD r0,sp,#0x50 000170 9b13 LDR r3,[sp,#0x4c] 000172 f7fffffe BL _PrintUnsigned ;;;423 break; 000176 e02a B |L2.462| |L2.376| ;;;424 case 's': ;;;425 { ;;;426 const char * s = va_arg(*pParamList, const char *); 000178 6821 LDR r1,[r4,#0] 00017a 1d08 ADDS r0,r1,#4 00017c 6020 STR r0,[r4,#0] 00017e f8d1b000 LDR r11,[r1,#0] ;;;427 do { 000182 bf00 NOP |L2.388| ;;;428 c = *s; 000184 f89b6000 LDRB r6,[r11,#0] ;;;429 s++; 000188 f10b0b01 ADD r11,r11,#1 ;;;430 if (c == '\0') { 00018c b906 CBNZ r6,|L2.400| ;;;431 break; 00018e e006 B |L2.414| |L2.400| ;;;432 } ;;;433 _StoreChar(&BufferDesc, c); 000190 4631 MOV r1,r6 000192 a814 ADD r0,sp,#0x50 000194 f7fffffe BL _StoreChar ;;;434 } while (BufferDesc.ReturnValue >= 0); 000198 9817 LDR r0,[sp,#0x5c] 00019a 2800 CMP r0,#0 00019c daf2 BGE |L2.388| |L2.414| 00019e bf00 NOP ;431 ;;;435 } ;;;436 break; 0001a0 e015 B |L2.462| |L2.418| ;;;437 case 'p': ;;;438 v = va_arg(*pParamList, int); 0001a2 6821 LDR r1,[r4,#0] 0001a4 1d08 ADDS r0,r1,#4 0001a6 6020 STR r0,[r4,#0] 0001a8 f8d19000 LDR r9,[r1,#0] ;;;439 _PrintUnsigned(&BufferDesc, (unsigned)v, 16u, 8u, 8u, 0u); 0001ac 2000 MOVS r0,#0 0001ae 2108 MOVS r1,#8 0001b0 460b MOV r3,r1 0001b2 2210 MOVS r2,#0x10 0001b4 e9cd1000 STRD r1,r0,[sp,#0] 0001b8 4649 MOV r1,r9 0001ba a814 ADD r0,sp,#0x50 0001bc f7fffffe BL _PrintUnsigned ;;;440 break; 0001c0 e005 B |L2.462| |L2.450| ;;;441 case '%': ;;;442 _StoreChar(&BufferDesc, '%'); 0001c2 2125 MOVS r1,#0x25 0001c4 a814 ADD r0,sp,#0x50 0001c6 f7fffffe BL _StoreChar ;;;443 break; 0001ca e000 B |L2.462| |L2.460| ;;;444 default: ;;;445 break; 0001cc bf00 NOP |L2.462| 0001ce bf00 NOP ;409 ;;;446 } ;;;447 sFormat++; 0001d0 1c6d ADDS r5,r5,#1 0001d2 e003 B |L2.476| |L2.468| ;;;448 } else { ;;;449 _StoreChar(&BufferDesc, c); 0001d4 4631 MOV r1,r6 0001d6 a814 ADD r0,sp,#0x50 0001d8 f7fffffe BL _StoreChar |L2.476| ;;;450 } ;;;451 } while (BufferDesc.ReturnValue >= 0); 0001dc 9817 LDR r0,[sp,#0x5c] 0001de 2800 CMP r0,#0 0001e0 f6bfaf1e BGE |L2.32| |L2.484| 0001e4 bf00 NOP ;341 ;;;452 ;;;453 if (BufferDesc.ReturnValue > 0) { 0001e6 9817 LDR r0,[sp,#0x5c] 0001e8 2800 CMP r0,#0 0001ea dd0a BLE |L2.514| ;;;454 // ;;;455 // Write remaining data, if any ;;;456 // ;;;457 if (BufferDesc.Cnt != 0u) { 0001ec 9816 LDR r0,[sp,#0x58] 0001ee b120 CBZ r0,|L2.506| ;;;458 SEGGER_RTT_Write(BufferIndex, acBuffer, BufferDesc.Cnt); 0001f0 a903 ADD r1,sp,#0xc 0001f2 4650 MOV r0,r10 0001f4 9a16 LDR r2,[sp,#0x58] 0001f6 f7fffffe BL SEGGER_RTT_Write |L2.506| ;;;459 } ;;;460 BufferDesc.ReturnValue += (int)BufferDesc.Cnt; 0001fa e9dd1016 LDRD r1,r0,[sp,#0x58] 0001fe 4408 ADD r0,r0,r1 000200 9017 STR r0,[sp,#0x5c] |L2.514| ;;;461 } ;;;462 return BufferDesc.ReturnValue; 000202 9817 LDR r0,[sp,#0x5c] ;;;463 } 000204 b019 ADD sp,sp,#0x64 000206 e8bd8ff0 POP {r4-r11,pc} ;;;464 ENDP AREA ||i._PrintInt||, CODE, READONLY, ALIGN=1 _PrintInt PROC ;;;226 */ ;;;227 static void _PrintInt(SEGGER_RTT_PRINTF_DESC * pBufferDesc, int v, unsigned Base, unsigned NumDigits, unsigned FieldWidth, unsigned FormatFlags) { 000000 e92d5ffc PUSH {r2-r12,lr} 000004 4606 MOV r6,r0 000006 460f MOV r7,r1 000008 4692 MOV r10,r2 00000a 4698 MOV r8,r3 00000c e9dd450c LDRD r4,r5,[sp,#0x30] ;;;228 unsigned Width; ;;;229 int Number; ;;;230 ;;;231 Number = (v < 0) ? -v : v; 000010 2f00 CMP r7,#0 000012 da01 BGE |L3.24| 000014 4278 RSBS r0,r7,#0 000016 e000 B |L3.26| |L3.24| 000018 4638 MOV r0,r7 |L3.26| 00001a 4683 MOV r11,r0 ;;;232 ;;;233 // ;;;234 // Get actual field width ;;;235 // ;;;236 Width = 1u; 00001c f04f0901 MOV r9,#1 ;;;237 while (Number >= (int)Base) { 000020 e003 B |L3.42| |L3.34| ;;;238 Number = (Number / (int)Base); 000022 fb9bfbfa SDIV r11,r11,r10 ;;;239 Width++; 000026 f1090901 ADD r9,r9,#1 |L3.42| 00002a 45d3 CMP r11,r10 ;237 00002c daf9 BGE |L3.34| ;;;240 } ;;;241 if (NumDigits > Width) { 00002e 45c8 CMP r8,r9 000030 d900 BLS |L3.52| ;;;242 Width = NumDigits; 000032 46c1 MOV r9,r8 |L3.52| ;;;243 } ;;;244 if ((FieldWidth > 0u) && ((v < 0) || ((FormatFlags & FORMAT_FLAG_PRINT_SIGN) == FORMAT_FLAG_PRINT_SIGN))) { 000034 b134 CBZ r4,|L3.68| 000036 2f00 CMP r7,#0 000038 db03 BLT |L3.66| 00003a f0050004 AND r0,r5,#4 00003e 2804 CMP r0,#4 000040 d100 BNE |L3.68| |L3.66| ;;;245 FieldWidth--; 000042 1e64 SUBS r4,r4,#1 |L3.68| ;;;246 } ;;;247 ;;;248 // ;;;249 // Print leading spaces if necessary ;;;250 // ;;;251 if ((((FormatFlags & FORMAT_FLAG_PAD_ZERO) == 0u) || (NumDigits != 0u)) && ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u)) { 000044 f0050002 AND r0,r5,#2 000048 b110 CBZ r0,|L3.80| 00004a f1b80f00 CMP r8,#0 00004e d011 BEQ |L3.116| |L3.80| 000050 f0050001 AND r0,r5,#1 000054 b970 CBNZ r0,|L3.116| ;;;252 if (FieldWidth != 0u) { 000056 b16c CBZ r4,|L3.116| ;;;253 while ((FieldWidth != 0u) && (Width < FieldWidth)) { 000058 e008 B |L3.108| |L3.90| ;;;254 FieldWidth--; 00005a 1e64 SUBS r4,r4,#1 ;;;255 _StoreChar(pBufferDesc, ' '); 00005c 2120 MOVS r1,#0x20 00005e 4630 MOV r0,r6 000060 f7fffffe BL _StoreChar ;;;256 if (pBufferDesc->ReturnValue < 0) { 000064 68f0 LDR r0,[r6,#0xc] 000066 2800 CMP r0,#0 000068 da00 BGE |L3.108| ;;;257 break; 00006a e002 B |L3.114| |L3.108| 00006c b10c CBZ r4,|L3.114| 00006e 45a1 CMP r9,r4 ;253 000070 d3f3 BCC |L3.90| |L3.114| 000072 bf00 NOP |L3.116| ;;;258 } ;;;259 } ;;;260 } ;;;261 } ;;;262 // ;;;263 // Print sign if necessary ;;;264 // ;;;265 if (pBufferDesc->ReturnValue >= 0) { 000074 68f0 LDR r0,[r6,#0xc] 000076 2800 CMP r0,#0 000078 db36 BLT |L3.232| ;;;266 if (v < 0) { 00007a 2f00 CMP r7,#0 00007c da05 BGE |L3.138| ;;;267 v = -v; 00007e 427f RSBS r7,r7,#0 ;;;268 _StoreChar(pBufferDesc, '-'); 000080 212d MOVS r1,#0x2d 000082 4630 MOV r0,r6 000084 f7fffffe BL _StoreChar 000088 e007 B |L3.154| |L3.138| ;;;269 } else if ((FormatFlags & FORMAT_FLAG_PRINT_SIGN) == FORMAT_FLAG_PRINT_SIGN) { 00008a f0050004 AND r0,r5,#4 00008e 2804 CMP r0,#4 000090 d103 BNE |L3.154| ;;;270 _StoreChar(pBufferDesc, '+'); 000092 212b MOVS r1,#0x2b 000094 4630 MOV r0,r6 000096 f7fffffe BL _StoreChar |L3.154| ;;;271 } else { ;;;272 ;;;273 } ;;;274 if (pBufferDesc->ReturnValue >= 0) { 00009a 68f0 LDR r0,[r6,#0xc] 00009c 2800 CMP r0,#0 00009e db23 BLT |L3.232| ;;;275 // ;;;276 // Print leading zeros if necessary ;;;277 // ;;;278 if (((FormatFlags & FORMAT_FLAG_PAD_ZERO) == FORMAT_FLAG_PAD_ZERO) && ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u) && (NumDigits == 0u)) { 0000a0 f0050002 AND r0,r5,#2 0000a4 2802 CMP r0,#2 0000a6 d114 BNE |L3.210| 0000a8 f0050001 AND r0,r5,#1 0000ac b988 CBNZ r0,|L3.210| 0000ae f1b80f00 CMP r8,#0 0000b2 d10e BNE |L3.210| ;;;279 if (FieldWidth != 0u) { 0000b4 b16c CBZ r4,|L3.210| ;;;280 while ((FieldWidth != 0u) && (Width < FieldWidth)) { 0000b6 e008 B |L3.202| |L3.184| ;;;281 FieldWidth--; 0000b8 1e64 SUBS r4,r4,#1 ;;;282 _StoreChar(pBufferDesc, '0'); 0000ba 2130 MOVS r1,#0x30 0000bc 4630 MOV r0,r6 0000be f7fffffe BL _StoreChar ;;;283 if (pBufferDesc->ReturnValue < 0) { 0000c2 68f0 LDR r0,[r6,#0xc] 0000c4 2800 CMP r0,#0 0000c6 da00 BGE |L3.202| ;;;284 break; 0000c8 e002 B |L3.208| |L3.202| 0000ca b10c CBZ r4,|L3.208| 0000cc 45a1 CMP r9,r4 ;280 0000ce d3f3 BCC |L3.184| |L3.208| 0000d0 bf00 NOP |L3.210| ;;;285 } ;;;286 } ;;;287 } ;;;288 } ;;;289 if (pBufferDesc->ReturnValue >= 0) { 0000d2 68f0 LDR r0,[r6,#0xc] 0000d4 2800 CMP r0,#0 0000d6 db07 BLT |L3.232| ;;;290 // ;;;291 // Print number without sign ;;;292 // ;;;293 _PrintUnsigned(pBufferDesc, (unsigned)v, Base, NumDigits, FieldWidth, FormatFlags); 0000d8 4643 MOV r3,r8 0000da 4652 MOV r2,r10 0000dc 4639 MOV r1,r7 0000de 4630 MOV r0,r6 0000e0 e9cd4500 STRD r4,r5,[sp,#0] 0000e4 f7fffffe BL _PrintUnsigned |L3.232| ;;;294 } ;;;295 } ;;;296 } ;;;297 } 0000e8 e8bd9ffc POP {r2-r12,pc} ;;;298 ENDP AREA ||i._PrintUnsigned||, CODE, READONLY, ALIGN=2 _PrintUnsigned PROC ;;;136 */ ;;;137 static void _PrintUnsigned(SEGGER_RTT_PRINTF_DESC * pBufferDesc, unsigned v, unsigned Base, unsigned NumDigits, unsigned FieldWidth, unsigned FormatFlags) { 000000 e92d5ffc PUSH {r2-r12,lr} 000004 4680 MOV r8,r0 000006 4689 MOV r9,r1 000008 4615 MOV r5,r2 00000a 461e MOV r6,r3 00000c 9c0c LDR r4,[sp,#0x30] ;;;138 static const char _aV2C[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; ;;;139 unsigned Div; ;;;140 unsigned Digit; ;;;141 unsigned Number; ;;;142 unsigned Width; ;;;143 char c; ;;;144 ;;;145 Number = v; 00000e f8cd9004 STR r9,[sp,#4] ;;;146 Digit = 1u; 000012 2701 MOVS r7,#1 ;;;147 // ;;;148 // Get actual field width ;;;149 // ;;;150 Width = 1u; 000014 46bb MOV r11,r7 ;;;151 while (Number >= Base) { 000016 e005 B |L4.36| |L4.24| ;;;152 Number = (Number / Base); 000018 9801 LDR r0,[sp,#4] 00001a fbb0f0f5 UDIV r0,r0,r5 00001e 9001 STR r0,[sp,#4] ;;;153 Width++; 000020 f10b0b01 ADD r11,r11,#1 |L4.36| 000024 9801 LDR r0,[sp,#4] ;151 000026 42a8 CMP r0,r5 ;151 000028 d2f6 BCS |L4.24| ;;;154 } ;;;155 if (NumDigits > Width) { 00002a 455e CMP r6,r11 00002c d900 BLS |L4.48| ;;;156 Width = NumDigits; 00002e 46b3 MOV r11,r6 |L4.48| ;;;157 } ;;;158 // ;;;159 // Print leading chars if necessary ;;;160 // ;;;161 if ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u) { 000030 980d LDR r0,[sp,#0x34] 000032 f0000001 AND r0,r0,#1 000036 b9d0 CBNZ r0,|L4.110| ;;;162 if (FieldWidth != 0u) { 000038 b1cc CBZ r4,|L4.110| ;;;163 if (((FormatFlags & FORMAT_FLAG_PAD_ZERO) == FORMAT_FLAG_PAD_ZERO) && (NumDigits == 0u)) { 00003a 980d LDR r0,[sp,#0x34] 00003c f0000002 AND r0,r0,#2 000040 2802 CMP r0,#2 000042 d103 BNE |L4.76| 000044 b916 CBNZ r6,|L4.76| ;;;164 c = '0'; 000046 2030 MOVS r0,#0x30 000048 9000 STR r0,[sp,#0] 00004a e001 B |L4.80| |L4.76| ;;;165 } else { ;;;166 c = ' '; 00004c 2020 MOVS r0,#0x20 00004e 9000 STR r0,[sp,#0] |L4.80| ;;;167 } ;;;168 while ((FieldWidth != 0u) && (Width < FieldWidth)) { 000050 e009 B |L4.102| |L4.82| ;;;169 FieldWidth--; 000052 1e64 SUBS r4,r4,#1 ;;;170 _StoreChar(pBufferDesc, c); 000054 4640 MOV r0,r8 000056 9900 LDR r1,[sp,#0] 000058 f7fffffe BL _StoreChar ;;;171 if (pBufferDesc->ReturnValue < 0) { 00005c f8d8000c LDR r0,[r8,#0xc] 000060 2800 CMP r0,#0 000062 da00 BGE |L4.102| ;;;172 break; 000064 e002 B |L4.108| |L4.102| 000066 b10c CBZ r4,|L4.108| 000068 45a3 CMP r11,r4 ;168 00006a d3f2 BCC |L4.82| |L4.108| 00006c bf00 NOP |L4.110| ;;;173 } ;;;174 } ;;;175 } ;;;176 } ;;;177 if (pBufferDesc->ReturnValue >= 0) { 00006e f8d8000c LDR r0,[r8,#0xc] 000072 2800 CMP r0,#0 000074 db35 BLT |L4.226| ;;;178 // ;;;179 // Compute Digit. ;;;180 // Loop until Digit has the value of the highest digit required. ;;;181 // Example: If the output is 345 (Base 10), loop 2 times until Digit is 100. ;;;182 // ;;;183 while (1) { 000076 e009 B |L4.140| |L4.120| ;;;184 if (NumDigits > 1u) { // User specified a min number of digits to print? => Make sure we loop at least that often, before checking anything else (> 1 check avoids problems with NumDigits being signed / unsigned) 000078 2e01 CMP r6,#1 00007a d901 BLS |L4.128| ;;;185 NumDigits--; 00007c 1e76 SUBS r6,r6,#1 00007e e004 B |L4.138| |L4.128| ;;;186 } else { ;;;187 Div = v / Digit; 000080 fbb9faf7 UDIV r10,r9,r7 ;;;188 if (Div < Base) { // Is our divider big enough to extract the highest digit from value? => Done 000084 45aa CMP r10,r5 000086 d200 BCS |L4.138| ;;;189 break; 000088 e001 B |L4.142| |L4.138| ;;;190 } ;;;191 } ;;;192 Digit *= Base; 00008a 436f MULS r7,r5,r7 |L4.140| 00008c e7f4 B |L4.120| |L4.142| 00008e bf00 NOP ;189 ;;;193 } ;;;194 // ;;;195 // Output digits ;;;196 // ;;;197 do { 000090 bf00 NOP |L4.146| ;;;198 Div = v / Digit; 000092 fbb9faf7 UDIV r10,r9,r7 ;;;199 v -= Div * Digit; 000096 fb0a9917 MLS r9,r10,r7,r9 ;;;200 _StoreChar(pBufferDesc, _aV2C[Div]); 00009a 4813 LDR r0,|L4.232| 00009c f810100a LDRB r1,[r0,r10] 0000a0 4640 MOV r0,r8 0000a2 f7fffffe BL _StoreChar ;;;201 if (pBufferDesc->ReturnValue < 0) { 0000a6 f8d8000c LDR r0,[r8,#0xc] 0000aa 2800 CMP r0,#0 0000ac da00 BGE |L4.176| ;;;202 break; 0000ae e003 B |L4.184| |L4.176| ;;;203 } ;;;204 Digit /= Base; 0000b0 fbb7f7f5 UDIV r7,r7,r5 ;;;205 } while (Digit); 0000b4 2f00 CMP r7,#0 0000b6 d1ec BNE |L4.146| |L4.184| 0000b8 bf00 NOP ;202 ;;;206 // ;;;207 // Print trailing spaces if necessary ;;;208 // ;;;209 if ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == FORMAT_FLAG_LEFT_JUSTIFY) { 0000ba 980d LDR r0,[sp,#0x34] 0000bc f0000001 AND r0,r0,#1 0000c0 b178 CBZ r0,|L4.226| ;;;210 if (FieldWidth != 0u) { 0000c2 b174 CBZ r4,|L4.226| ;;;211 while ((FieldWidth != 0u) && (Width < FieldWidth)) { 0000c4 e009 B |L4.218| |L4.198| ;;;212 FieldWidth--; 0000c6 1e64 SUBS r4,r4,#1 ;;;213 _StoreChar(pBufferDesc, ' '); 0000c8 2120 MOVS r1,#0x20 0000ca 4640 MOV r0,r8 0000cc f7fffffe BL _StoreChar ;;;214 if (pBufferDesc->ReturnValue < 0) { 0000d0 f8d8000c LDR r0,[r8,#0xc] 0000d4 2800 CMP r0,#0 0000d6 da00 BGE |L4.218| ;;;215 break; 0000d8 e002 B |L4.224| |L4.218| 0000da b10c CBZ r4,|L4.224| 0000dc 45a3 CMP r11,r4 ;211 0000de d3f2 BCC |L4.198| |L4.224| 0000e0 bf00 NOP |L4.226| ;;;216 } ;;;217 } ;;;218 } ;;;219 } ;;;220 } ;;;221 } 0000e2 e8bd9ffc POP {r2-r12,pc} ;;;222 ENDP 0000e6 0000 DCW 0x0000 |L4.232| DCD _aV2C AREA ||i._StoreChar||, CODE, READONLY, ALIGN=1 _StoreChar PROC ;;;111 */ ;;;112 static void _StoreChar(SEGGER_RTT_PRINTF_DESC * p, char c) { 000000 b570 PUSH {r4-r6,lr} 000002 4604 MOV r4,r0 000004 460e MOV r6,r1 ;;;113 unsigned Cnt; ;;;114 ;;;115 Cnt = p->Cnt; 000006 68a5 LDR r5,[r4,#8] ;;;116 if ((Cnt + 1u) <= p->BufferSize) { 000008 1c68 ADDS r0,r5,#1 00000a 6861 LDR r1,[r4,#4] 00000c 4281 CMP r1,r0 00000e d306 BCC |L5.30| ;;;117 *(p->pBuffer + Cnt) = c; 000010 6820 LDR r0,[r4,#0] 000012 5546 STRB r6,[r0,r5] ;;;118 p->Cnt = Cnt + 1u; 000014 1c68 ADDS r0,r5,#1 000016 60a0 STR r0,[r4,#8] ;;;119 p->ReturnValue++; 000018 68e0 LDR r0,[r4,#0xc] 00001a 1c40 ADDS r0,r0,#1 00001c 60e0 STR r0,[r4,#0xc] |L5.30| ;;;120 } ;;;121 // ;;;122 // Write part of string, when the buffer is full ;;;123 // ;;;124 if (p->Cnt == p->BufferSize) { 00001e e9d41001 LDRD r1,r0,[r4,#4] 000022 4288 CMP r0,r1 000024 d10d BNE |L5.66| ;;;125 if (SEGGER_RTT_Write(p->RTTBufferIndex, p->pBuffer, p->Cnt) != p->Cnt) { 000026 68a2 LDR r2,[r4,#8] 000028 6821 LDR r1,[r4,#0] 00002a 6920 LDR r0,[r4,#0x10] 00002c f7fffffe BL SEGGER_RTT_Write 000030 68a1 LDR r1,[r4,#8] 000032 4288 CMP r0,r1 000034 d003 BEQ |L5.62| ;;;126 p->ReturnValue = -1; 000036 f04f30ff MOV r0,#0xffffffff 00003a 60e0 STR r0,[r4,#0xc] 00003c e001 B |L5.66| |L5.62| ;;;127 } else { ;;;128 p->Cnt = 0u; 00003e 2000 MOVS r0,#0 000040 60a0 STR r0,[r4,#8] |L5.66| ;;;129 } ;;;130 } ;;;131 } 000042 bd70 POP {r4-r6,pc} ;;;132 ENDP AREA ||.constdata||, DATA, READONLY, ALIGN=0 _aV2C 000000 30313233 DCB 0x30,0x31,0x32,0x33 000004 34353637 DCB 0x34,0x35,0x36,0x37 000008 38394142 DCB 0x38,0x39,0x41,0x42 00000c 43444546 DCB 0x43,0x44,0x45,0x46