* Makefile.in, configure.in, configure,
[fw/sdcc] / device / lib / printf_fast.c
index 63a4308e2aee918ab0bf31a24609bc4f75668e09..3e20d343b9da77cf404da4f968f0561285dfca48 100644 (file)
 // Warning: using static/global variables makes these functions NON-reentrant!
 // reentrant keyword is only used for parameter passing method
 
 // Warning: using static/global variables makes these functions NON-reentrant!
 // reentrant keyword is only used for parameter passing method
 
-static bit long_flag, short_flag, print_zero_flag, negative_flag;
+static __bit long_flag, short_flag, print_zero_flag, negative_flag;
 
 #ifdef FIELD_WIDTH
 
 #ifdef FIELD_WIDTH
-static bit field_width_flag;
-static bit leading_zero_flag;
-static data unsigned char field_width;
+static __bit field_width_flag;
+static __bit leading_zero_flag;
+static __data unsigned char field_width;
 #endif
 
 #ifdef FLOAT
 #define SDCC_FLOAT_LIB
 #include <float.h>
 #endif
 
 #ifdef FLOAT
 #define SDCC_FLOAT_LIB
 #include <float.h>
-static bit continue_float;
+static __bit continue_float;
 #ifndef FLOAT_FIXED4
 #ifndef FLOAT_FIXED4
-static data unsigned char frac_field_width;
-static data unsigned char float_frac_bcd[4];
+static __data unsigned char frac_field_width;
+static __data unsigned char float_frac_bcd[4];
 // TODO: can float_frac_bcd be overlaid with temps used by trig functions
 #endif
 #endif
 
 #ifndef FAST_INTEGER
 #ifdef LONG
 // TODO: can float_frac_bcd be overlaid with temps used by trig functions
 #endif
 #endif
 
 #ifndef FAST_INTEGER
 #ifdef LONG
-static data unsigned int i2bcd_tmp;  // slow 32 int conversion needs temp space
+static __data unsigned int i2bcd_tmp;  // slow 32 int conversion needs temp space
 #endif
 #endif
 
 
 #endif
 #endif
 
 
-
 #ifndef PRINTF_FAST
 #define PRINTF_FAST printf_fast
 #endif
 #ifndef PRINTF_FAST
 #define PRINTF_FAST printf_fast
 #endif
@@ -134,11 +133,11 @@ static data unsigned int i2bcd_tmp;  // slow 32 int conversion needs temp space
 #else // defines are compatible with printf_fast
 
 
 #else // defines are compatible with printf_fast
 
 
-void PRINTF_FAST(code char *fmt, ...) reentrant
+void PRINTF_FAST(__code char *fmt, ...) __reentrant
 {
        fmt;    /* suppress unreferenced variable warning */
 
 {
        fmt;    /* suppress unreferenced variable warning */
 
-       _asm
+       __asm
 
 printf_begin:
        mov     a, _bp          // r0 will point to va_args (stack)
 
 printf_begin:
        mov     a, _bp          // r0 will point to va_args (stack)
@@ -149,7 +148,6 @@ printf_begin:
        mov     dpl, @r0        // dptr has address of fmt
        dec     r0
 
        mov     dpl, @r0        // dptr has address of fmt
        dec     r0
 
-
 printf_main_loop:
        clr     a
        movc    a, @a+dptr      // get next byte of fmt string
 printf_main_loop:
        clr     a
        movc    a, @a+dptr      // get next byte of fmt string
@@ -203,7 +201,6 @@ printf_nondigit1:
 printf_nondigit2:
        add     a, #48
 
 printf_nondigit2:
        add     a, #48
 
-
 printf_format_l:
        //cjne  a, #'l', printf_format_h
        cjne    a, #108, printf_format_h
 printf_format_l:
        //cjne  a, #'l', printf_format_h
        cjne    a, #108, printf_format_h
@@ -276,10 +273,6 @@ printf_eot:
        ljmp    printf_end
 
 
        ljmp    printf_end
 
 
-
-
-
-
        /* print a string... just grab each byte with __gptrget */
        /* the user much pass a 24 bit generic pointer */
 
        /* print a string... just grab each byte with __gptrget */
        /* the user much pass a 24 bit generic pointer */
 
@@ -323,12 +316,6 @@ printf_str_done:
        ljmp    printf_main_loop
 
 
        ljmp    printf_main_loop
 
 
-
-
-
-
-
-
        /* printing in hex is easy because sdcc pushes the LSB first */
 
 printf_hex:
        /* printing in hex is easy because sdcc pushes the LSB first */
 
 printf_hex:
@@ -427,6 +414,11 @@ printf_uint_ck8:
        /* print the digit zero and skip all the hard work! */
        mov     a, r1
        jnz     printf_uint_begin
        /* print the digit zero and skip all the hard work! */
        mov     a, r1
        jnz     printf_uint_begin
+#ifdef FLOAT
+       /* never use the "just print zero" shortcut if we're printing */
+       /* the integer part of a float  (fixes bug 1255403)  */
+       jb      _continue_float, printf_uint_begin
+#endif
 #ifdef FIELD_WIDTH
        jnb     _field_width_flag, printf_uint_zero
        mov     a, _field_width
 #ifdef FIELD_WIDTH
        jnb     _field_width_flag, printf_uint_zero
        mov     a, _field_width
@@ -438,15 +430,8 @@ printf_uint_zero:
        //mov   a, #'0'
        mov     a, #48
        lcall   printf_putchar
        //mov   a, #'0'
        mov     a, #48
        lcall   printf_putchar
-#ifdef FLOAT
-       jnb     _continue_float, 0001$
-       ret
-0001$:
-#endif
        ljmp    printf_main_loop
 
        ljmp    printf_main_loop
 
-
-
 printf_uint_begin:
        push    dpl
        push    dph
 printf_uint_begin:
        push    dpl
        push    dph
@@ -500,7 +485,7 @@ printf_uifw_8:
        jnz     printf_uifw_sub
        dec     r1
 printf_uifw_sub:
        jnz     printf_uifw_sub
        dec     r1
 printf_uifw_sub:
-       ;r1 has the number of digits for the number
+       //r1 has the number of digits for the number
        mov     a, _field_width
        mov     c, _negative_flag
        subb    a, r1
        mov     a, _field_width
        mov     c, _negative_flag
        subb    a, r1
@@ -616,12 +601,6 @@ printf_uint8a:
        ljmp    printf_main_loop
 
 
        ljmp    printf_main_loop
 
 
-
-
-
-
-
-
 #ifdef FLOAT
 #ifdef FLOAT_FIXED4
        // Print a float the easy way.  First, extract the integer part and
 #ifdef FLOAT
 #ifdef FLOAT_FIXED4
        // Print a float the easy way.  First, extract the integer part and
@@ -750,8 +729,6 @@ print_float_frac_skip:
 #else // not FLOAT_FIXED4
 
 
 #else // not FLOAT_FIXED4
 
 
-
-
 print_float:
        // Print a float the not-as-easy way, with a configurable number of
        // fractional digits (up to 8) and proper round-off (up to 7 digits).
 print_float:
        // Print a float the not-as-easy way, with a configurable number of
        // fractional digits (up to 8) and proper round-off (up to 7 digits).
@@ -788,8 +765,12 @@ print_float_default_width:
        // default fractional field width (between 0 to 7)
        // attempt to scale the default number of fractional digits
        // based on the magnitude of the float
        // default fractional field width (between 0 to 7)
        // attempt to scale the default number of fractional digits
        // based on the magnitude of the float
-       mov     ar1, r0         // r0 points to first byte of float
-       dec     r1              // r1 points to second byte of float
+       mov     a, @r0
+       anl     a, #0x7F        // ignore sign bit
+       mov     r2, a           // r2 is first byte of float
+       dec     r0
+       mov     ar3, @r0        // r3 is second byte of float
+       inc     r0
        mov     r6, dpl
        mov     r7, dph
        mov     dptr, #_float_range_table
        mov     r6, dpl
        mov     r7, dph
        mov     dptr, #_float_range_table
@@ -797,11 +778,11 @@ print_float_default_width:
 print_float_default_loop:
        clr     a
        movc    a, @a+dptr
 print_float_default_loop:
        clr     a
        movc    a, @a+dptr
-       add     a, @r1
+       add     a, r3
        inc     dptr
        clr     a
        movc    a, @a+dptr
        inc     dptr
        clr     a
        movc    a, @a+dptr
-       addc    a, @r0
+       addc    a, r2
        jnc     print_float_default_done
        inc     dptr
        djnz    r5, print_float_default_loop
        jnc     print_float_default_done
        inc     dptr
        djnz    r5, print_float_default_loop
@@ -1009,7 +990,6 @@ print_float_done:
        ljmp    printf_main_loop
 
 
        ljmp    printf_main_loop
 
 
-
        // acc=1 for tenths, acc=2 for hundredths, etc
 get_float_frac_digit:
        dec     a
        // acc=1 for tenths, acc=2 for hundredths, etc
 get_float_frac_digit:
        dec     a
@@ -1025,9 +1005,6 @@ get_float_frac_digit_done:
        anl     a, #15
        ret
 
        anl     a, #15
        ret
 
-
-
-
 #endif // end of normal FLOAT code (not FLOAT_FIXED4)
 
 
 #endif // end of normal FLOAT code (not FLOAT_FIXED4)
 
 
@@ -1077,17 +1054,6 @@ printf_get_float_2:
 #endif // FLOAT
 
 
 #endif // FLOAT
 
 
-
-
-
-
-
-
-
-
-
-
-
        /* read an integer into r1/r2/r3/r4, and msb into r5 */
 printf_get_int:
        mov     a, @r0
        /* read an integer into r1/r2/r3/r4, and msb into r5 */
 printf_get_int:
        mov     a, @r0
@@ -1112,9 +1078,6 @@ printf_get_done:
        ret
 
 
        ret
 
 
-
-
-
 #ifdef FAST_INTEGER
 
        /* convert binary number in r4/r3/r2/r1 into bcd packed number
 #ifdef FAST_INTEGER
 
        /* convert binary number in r4/r3/r2/r1 into bcd packed number
@@ -1405,17 +1368,6 @@ printf_i2bcd_add_skip:
 #endif // not FAST_INTEGER
 
 
 #endif // not FAST_INTEGER
 
 
-
-
-
-
-
-
-
-
-
-
-
 #ifdef FIELD_WIDTH
 printf_space_loop:
        //mov   a, #' '
 #ifdef FIELD_WIDTH
 printf_space_loop:
        //mov   a, #' '
@@ -1432,10 +1384,6 @@ printf_space:
        ret
 #endif
 
        ret
 #endif
 
-
-
-
-
        /* print a hex digit, either upper 4 bit (msn) or lower 4 bits (lsn) */
 
 printf_phex_msn:
        /* print a hex digit, either upper 4 bit (msn) or lower 4 bits (lsn) */
 
 printf_phex_msn:
@@ -1481,7 +1429,7 @@ printf_zero:
         ljmp   printf_putchar
   
 printf_end:
         ljmp   printf_putchar
   
 printf_end:
-       _endasm;
+       __endasm;
 }
 
 
 }
 
 
@@ -1504,24 +1452,24 @@ printf_end:
  */
 
 #if 0
  */
 
 #if 0
-static code unsigned char int2bcd_0[] = {
+static __code unsigned char int2bcd_0[] = {
 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15};
 
 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15};
 
-static code unsigned char int2bcd_1[] = {
+static __code unsigned char int2bcd_1[] = {
 0x00, 0x16, 0x32, 0x48, 0x64, 0x80, 0x96, 0x12,
 0x28, 0x44, 0x60, 0x76, 0x92, 0x08, 0x24, 0x40,
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02};
 #endif
 
 0x00, 0x16, 0x32, 0x48, 0x64, 0x80, 0x96, 0x12,
 0x28, 0x44, 0x60, 0x76, 0x92, 0x08, 0x24, 0x40,
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02};
 #endif
 
-static code unsigned char int2bcd_2[] = {
+static __code unsigned char int2bcd_2[] = {
 0x00, 0x56, 0x12, 0x68, 0x24, 0x80, 0x36, 0x92,
 0x48, 0x04, 0x60, 0x16, 0x72, 0x28, 0x84, 0x40,
 0x00, 0x02, 0x05, 0x07, 0x10, 0x12, 0x15, 0x17,
 0x20, 0x23, 0x25, 0x28, 0x30, 0x33, 0x35, 0x38};
 
 0x00, 0x56, 0x12, 0x68, 0x24, 0x80, 0x36, 0x92,
 0x48, 0x04, 0x60, 0x16, 0x72, 0x28, 0x84, 0x40,
 0x00, 0x02, 0x05, 0x07, 0x10, 0x12, 0x15, 0x17,
 0x20, 0x23, 0x25, 0x28, 0x30, 0x33, 0x35, 0x38};
 
-static code unsigned char int2bcd_3[] = {
+static __code unsigned char int2bcd_3[] = {
 0x00, 0x96, 0x92, 0x88, 0x84, 0x80, 0x76, 0x72,
 0x68, 0x64, 0x60, 0x56, 0x52, 0x48, 0x44, 0x40,
 0x00, 0x40, 0x81, 0x22, 0x63, 0x04, 0x45, 0x86,
 0x00, 0x96, 0x92, 0x88, 0x84, 0x80, 0x76, 0x72,
 0x68, 0x64, 0x60, 0x56, 0x52, 0x48, 0x44, 0x40,
 0x00, 0x40, 0x81, 0x22, 0x63, 0x04, 0x45, 0x86,
@@ -1530,7 +1478,7 @@ static code unsigned char int2bcd_3[] = {
 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x06};
 
 #ifdef LONG
 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x06};
 
 #ifdef LONG
-static code unsigned char int2bcd_4[] = {
+static __code unsigned char int2bcd_4[] = {
 0x00, 0x36, 0x72, 0x08, 0x44, 0x80, 0x16, 0x52,
 0x88, 0x24, 0x60, 0x96, 0x32, 0x68, 0x04, 0x40,
 0x00, 0x55, 0x10, 0x66, 0x21, 0x76, 0x32, 0x87,
 0x00, 0x36, 0x72, 0x08, 0x44, 0x80, 0x16, 0x52,
 0x88, 0x24, 0x60, 0x96, 0x32, 0x68, 0x04, 0x40,
 0x00, 0x55, 0x10, 0x66, 0x21, 0x76, 0x32, 0x87,
@@ -1538,7 +1486,7 @@ static code unsigned char int2bcd_4[] = {
 0x00, 0x06, 0x13, 0x19, 0x26, 0x32, 0x39, 0x45,
 0x52, 0x58, 0x65, 0x72, 0x78, 0x85, 0x91, 0x98};
 
 0x00, 0x06, 0x13, 0x19, 0x26, 0x32, 0x39, 0x45,
 0x52, 0x58, 0x65, 0x72, 0x78, 0x85, 0x91, 0x98};
 
-static code unsigned char int2bcd_5[] = {
+static __code unsigned char int2bcd_5[] = {
 0x00, 0x76, 0x52, 0x28, 0x04, 0x80, 0x56, 0x32,
 0x08, 0x84, 0x60, 0x36, 0x12, 0x88, 0x64, 0x40,
 0x00, 0x85, 0x71, 0x57, 0x43, 0x28, 0x14, 0x00,
 0x00, 0x76, 0x52, 0x28, 0x04, 0x80, 0x56, 0x32,
 0x08, 0x84, 0x60, 0x36, 0x12, 0x88, 0x64, 0x40,
 0x00, 0x85, 0x71, 0x57, 0x43, 0x28, 0x14, 0x00,
@@ -1548,7 +1496,7 @@ static code unsigned char int2bcd_5[] = {
 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15};
 
 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15};
 
-static code unsigned char int2bcd_6[] = {
+static __code unsigned char int2bcd_6[] = {
 0x00, 0x16, 0x32, 0x48, 0x64, 0x80, 0x96, 0x12,
 0x28, 0x44, 0x60, 0x76, 0x92, 0x08, 0x24, 0x40,
 0x00, 0x72, 0x44, 0x16, 0x88, 0x60, 0x32, 0x05,
 0x00, 0x16, 0x32, 0x48, 0x64, 0x80, 0x96, 0x12,
 0x28, 0x44, 0x60, 0x76, 0x92, 0x08, 0x24, 0x40,
 0x00, 0x72, 0x44, 0x16, 0x88, 0x60, 0x32, 0x05,
@@ -1560,7 +1508,7 @@ static code unsigned char int2bcd_6[] = {
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02};
 
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02};
 
-static code unsigned char int2bcd_7[] = {
+static __code unsigned char int2bcd_7[] = {
 0x00, 0x56, 0x12, 0x68, 0x24, 0x80, 0x36, 0x92,
 0x48, 0x04, 0x60, 0x16, 0x72, 0x28, 0x84, 0x40,
 0x00, 0x54, 0x09, 0x63, 0x18, 0x72, 0x27, 0x81,
 0x00, 0x56, 0x12, 0x68, 0x24, 0x80, 0x36, 0x92,
 0x48, 0x04, 0x60, 0x16, 0x72, 0x28, 0x84, 0x40,
 0x00, 0x54, 0x09, 0x63, 0x18, 0x72, 0x27, 0x81,
@@ -1577,7 +1525,7 @@ static code unsigned char int2bcd_7[] = {
 
 /*
  * #! /usr/bin/perl
 
 /*
  * #! /usr/bin/perl
- * print "code unsigned char int2bcd[] = {\n";
+ * print "__code unsigned char int2bcd[] = {\n";
  * for ($i=0, $n=1; $i<32; $i++, $n*=2) {
  *     $r = sprintf "%010u", $n;
  *     $r =~ /([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])/;
  * for ($i=0, $n=1; $i<32; $i++, $n*=2) {
  *     $r = sprintf "%010u", $n;
  *     $r =~ /([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])/;
@@ -1585,7 +1533,7 @@ static code unsigned char int2bcd_7[] = {
  *     print ',' if $i < 31;
  *     printf "\t\t// %10u\n", $n;
  * }
  *     print ',' if $i < 31;
  *     printf "\t\t// %10u\n", $n;
  * }
- * print "}\ncode unsigned char int2bcd[] = {\n";
+ * print "}\n__code unsigned char int2bcd[] = {\n";
  * for ($i=0, $n=1; $i<16; $i++, $n*=2) {
  *     $r = sprintf "%06u", $n;
  *     $r =~ /([0-9][0-9])([0-9][0-9])([0-9][0-9])/;
  * for ($i=0, $n=1; $i<16; $i++, $n*=2) {
  *     $r = sprintf "%06u", $n;
  *     $r =~ /([0-9][0-9])([0-9][0-9])([0-9][0-9])/;
@@ -1597,7 +1545,7 @@ static code unsigned char int2bcd_7[] = {
 */
 
 #ifdef LONG
 */
 
 #ifdef LONG
-static code unsigned char int2bcd[] = {
+static __code unsigned char int2bcd[] = {
 0x01, 0x00, 0x00, 0x00, 0x00,          //          1
 0x02, 0x00, 0x00, 0x00, 0x00,          //          2
 0x04, 0x00, 0x00, 0x00, 0x00,          //          4
 0x01, 0x00, 0x00, 0x00, 0x00,          //          1
 0x02, 0x00, 0x00, 0x00, 0x00,          //          2
 0x04, 0x00, 0x00, 0x00, 0x00,          //          4
@@ -1632,7 +1580,7 @@ static code unsigned char int2bcd[] = {
 0x48, 0x36, 0x48, 0x47, 0x21           // 2147483648
 };
 #else // not LONG
 0x48, 0x36, 0x48, 0x47, 0x21           // 2147483648
 };
 #else // not LONG
-static code unsigned char int2bcd[] = {
+static __code unsigned char int2bcd[] = {
 0x01, 0x00, 0x00,              //          1
 0x02, 0x00, 0x00,              //          2
 0x04, 0x00, 0x00,              //          4
 0x01, 0x00, 0x00,              //          1
 0x02, 0x00, 0x00,              //          2
 0x04, 0x00, 0x00,              //          4
@@ -1655,8 +1603,6 @@ static code unsigned char int2bcd[] = {
 #endif // not FAST_INTEGER
 
 
 #endif // not FAST_INTEGER
 
 
-
-
 #ifdef FLOAT
 #ifndef FLOAT_FIXED4
 
 #ifdef FLOAT
 #ifndef FLOAT_FIXED4
 
@@ -1673,7 +1619,7 @@ static code unsigned char int2bcd[] = {
  * }
  */
 
  * }
  */
 
-static code unsigned char frac2bcd[] = {
+static __code unsigned char frac2bcd[] = {
 0x00, 0x00, 0x00, 0x50,                // 0.500000000000000  0.50000000
 0x00, 0x00, 0x00, 0x25,                // 0.250000000000000  0.75000000
 0x00, 0x00, 0x50, 0x12,                // 0.125000000000000  0.87500000
 0x00, 0x00, 0x00, 0x50,                // 0.500000000000000  0.50000000
 0x00, 0x00, 0x00, 0x25,                // 0.250000000000000  0.75000000
 0x00, 0x00, 0x50, 0x12,                // 0.125000000000000  0.87500000
@@ -1715,7 +1661,7 @@ static code unsigned char frac2bcd[] = {
 // 100.0 - 999.99      2       100.0 = 0x42C80000  42C8
 // 1000 - 9999.9       1       1000  = 0x447A0000  447A
 // 10000+              0       10000 = 0x461C4000  461C
 // 100.0 - 999.99      2       100.0 = 0x42C80000  42C8
 // 1000 - 9999.9       1       1000  = 0x447A0000  447A
 // 10000+              0       10000 = 0x461C4000  461C
-static code unsigned int float_range_table[] = {
+static __code unsigned int float_range_table[] = {
 65536 - 0x3A83,
 65536 - 0x3C23,
 65536 - 0x3DCC,
 65536 - 0x3A83,
 65536 - 0x3C23,
 65536 - 0x3DCC,
@@ -1741,7 +1687,7 @@ static code unsigned int float_range_table[] = {
 * }
 */
 
 * }
 */
 
-static code unsigned char frac2bcd[] = {
+static __code unsigned char frac2bcd[] = {
 0x00, 0x50,             // 0.500000000000000  0.5000
 0x00, 0x25,             // 0.250000000000000  0.7500
 0x50, 0x12,             // 0.125000000000000  0.8750
 0x00, 0x50,             // 0.500000000000000  0.5000
 0x00, 0x25,             // 0.250000000000000  0.7500
 0x50, 0x12,             // 0.125000000000000  0.8750
@@ -1763,4 +1709,3 @@ static code unsigned char frac2bcd[] = {
 
 
 #endif // defines compatible with printf_fast
 
 
 #endif // defines compatible with printf_fast
-