faster printing of floats by divmod10() and others

Yes, works for Print::printNumber() too, only need one pointer to track the end of the string.

size_t Print::printNumber(unsigned long n, uint8_t base) {
    char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
    char *str = &buf[sizeof(buf) - 1];
    char *estr = str;
    *str = '\0';

    uint8_t c;
    uint32_t d;

    // prevent crash if called with base <= 1
    if (base < 2) base = 10;

    switch(base)
    {
    case HEX:
        do {
            c = n & 0x0F;
            n >>= 4;
            *--str = c < 10 ? c + '0' : c + ('A' - 10);
        } while(n > 0);
        break;

    case DEC:
        do {
            divmod10_asm(n, c, d);
            *--str = c + '0';
        } while(n > 0);
        break;

    case OCT:
        // *--str = '0';   //leading 0 to indicate octal ?
        do {
            c = n & 0x07;
            n >>= 3;
            *--str = c + '0';
        } while(n > 0);
        break;

    case BIN:
        // *--str = 'b';  // leading b to indicate binary ?
        do {
            c = n & 0x01;
            n >>= 1;
            *--str = c + '0';
        } while(n > 0);
        break;

    default:
        do {
            d = n;
            n /= base;
            c = d - base * n;
            *--str = c < 10 ? c + '0' : c + 'A' - 10;
        } while(n);
        break;
    }
    return write((const uint8_t*)str, (size_t)(estr-str));
}

As printFloat() uses printNumber() for the integer part its timing is improved too :slight_smile:

Time=665
per char incl .\r\n : 23.75