|
|
@@ -98,6 +98,115 @@ int Print::printf(const __FlashStringHelper *format, ...) |
|
|
|
return vdprintf((int)this, (const char *)format, ap); |
|
|
|
} |
|
|
|
|
|
|
|
#ifdef __MKL26Z64__ |
|
|
|
|
|
|
|
// optimized code inspired by Stimmer's optimization |
|
|
|
// obviously a dit different, adapted to 32 bit Cortex-M0+ |
|
|
|
// http://forum.arduino.cc/index.php?topic=167414.msg1293679#msg1293679 |
|
|
|
// http://forum.arduino.cc/index.php?topic=167414.msg1309482#msg1309482 |
|
|
|
// equivelant code: |
|
|
|
// mod = div % 10; |
|
|
|
// div = div / 10; |
|
|
|
// tmp1 = {random}; |
|
|
|
// tmp2 = 10; |
|
|
|
#if 1 |
|
|
|
#define divmod10_asm(div, mod, tmp1, tmp2, const3333) \ |
|
|
|
asm ( \ |
|
|
|
" lsr %2, %0, #16" "\n\t" \ |
|
|
|
" mul %2, %4" "\n\t" \ |
|
|
|
" uxth %1, %0" "\n\t" \ |
|
|
|
" mul %1, %4" "\n\t" \ |
|
|
|
" add %1, #1" "\n\t" \ |
|
|
|
" lsr %0, %2, #16" "\n\t" \ |
|
|
|
" lsl %2, %2, #16" "\n\t" \ |
|
|
|
" add %1, %2" "\n\t" \ |
|
|
|
" mov %3, #0" "\n\t" \ |
|
|
|
" adc %0, %3" "\n\t" \ |
|
|
|
" lsl %0, %0, #15" "\n\t" \ |
|
|
|
" lsr %2, %1, #17" "\n\t" \ |
|
|
|
" orr %0, %2" "\n\t" \ |
|
|
|
" lsl %1, %1, #15" "\n\t" \ |
|
|
|
" lsr %2, %1, #16" "\n\t" \ |
|
|
|
" lsl %3, %0, #16" "\n\t" \ |
|
|
|
" orr %2, %3" "\n\t" \ |
|
|
|
" lsr %3, %0, #16" "\n\t" \ |
|
|
|
" add %1, %0" "\n\t" \ |
|
|
|
" adc %0, %1" "\n\t" \ |
|
|
|
" sub %0, %1" "\n\t" \ |
|
|
|
" add %1, %2" "\n\t" \ |
|
|
|
" adc %0, %3" "\n\t" \ |
|
|
|
" lsr %1, %1, #4" "\n\t" \ |
|
|
|
" mov %3, #10" "\n\t" \ |
|
|
|
" mul %1, %3" "\n\t" \ |
|
|
|
" lsr %1, %1, #28" "\n\t" \ |
|
|
|
: "+l" (div), \ |
|
|
|
"=&l" (mod), \ |
|
|
|
"=&l" (tmp1), \ |
|
|
|
"=&l" (tmp2) \ |
|
|
|
: "l" (const3333) \ |
|
|
|
: \ |
|
|
|
) |
|
|
|
#else |
|
|
|
#define divmod10_asm(_div, _mod, _tmp1, _tmp2, _const3333) \ |
|
|
|
({ _tmp1 = _div; _div = _div / 10; _mod = _tmp1 - _div * 10; }) |
|
|
|
// ({_mod = _div % 10, _div = _div / 10; }) |
|
|
|
#endif |
|
|
|
|
|
|
|
size_t Print::printNumberDec(unsigned long n, uint8_t sign) |
|
|
|
{ |
|
|
|
uint8_t buf[11], *p; |
|
|
|
uint32_t digit, t1, t2, c3333=0x3333; |
|
|
|
|
|
|
|
p = buf + (sizeof(buf)); |
|
|
|
do { |
|
|
|
divmod10_asm(n, digit, t1, t2, c3333); |
|
|
|
*--p = digit + '0'; |
|
|
|
} while (n); |
|
|
|
if (sign) *--p = '-'; |
|
|
|
return write(p, sizeof(buf) - (p - buf)); |
|
|
|
} |
|
|
|
|
|
|
|
size_t Print::printNumberHex(unsigned long n) |
|
|
|
{ |
|
|
|
uint8_t digit, buf[8], *p; |
|
|
|
|
|
|
|
p = buf + (sizeof(buf)); |
|
|
|
do { |
|
|
|
digit = n & 15; |
|
|
|
*--p = (digit < 10) ? '0' + digit : 'A' + digit - 10; |
|
|
|
n >>= 4; |
|
|
|
} while (n); |
|
|
|
return write(p, sizeof(buf) - (p - buf)); |
|
|
|
} |
|
|
|
|
|
|
|
size_t Print::printNumberBin(unsigned long n) |
|
|
|
{ |
|
|
|
uint8_t buf[32], *p; |
|
|
|
|
|
|
|
p = buf + (sizeof(buf)); |
|
|
|
do { |
|
|
|
*--p = '0' + ((uint8_t)n & 1); |
|
|
|
n >>= 1; |
|
|
|
} while (n); |
|
|
|
return write(p, sizeof(buf) - (p - buf)); |
|
|
|
} |
|
|
|
|
|
|
|
size_t Print::printNumberAny(unsigned long n, uint8_t base) |
|
|
|
{ |
|
|
|
uint8_t digit, buf[21], *p; |
|
|
|
uint32_t tmp; |
|
|
|
|
|
|
|
p = buf + sizeof(buf); |
|
|
|
do { |
|
|
|
tmp = n; |
|
|
|
n = n / base; |
|
|
|
digit = tmp - n * base; |
|
|
|
*--p = (digit < 10) ? '0' + digit : 'A' + digit - 10; |
|
|
|
} while (n); |
|
|
|
return write(p, sizeof(buf) - (p - buf)); |
|
|
|
} |
|
|
|
|
|
|
|
#else |
|
|
|
|
|
|
|
size_t Print::printNumber(unsigned long n, uint8_t base, uint8_t sign) |
|
|
|
{ |
|
|
@@ -134,6 +243,7 @@ size_t Print::printNumber(unsigned long n, uint8_t base, uint8_t sign) |
|
|
|
return write(buf + i, sizeof(buf) - i); |
|
|
|
} |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
size_t Print::printFloat(double number, uint8_t digits) |
|
|
|
{ |