]> git.sur5r.net Git - cc65/commitdiff
Rewrote printf in assembler
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 1 Dec 2000 10:08:47 +0000 (10:08 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 1 Dec 2000 10:08:47 +0000 (10:08 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@506 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/common/.cvsignore
libsrc/common/Makefile
libsrc/common/printf.c [deleted file]
libsrc/common/printf.s [new file with mode: 0644]

index ba46b0e7bd8fa0dc4710238fc8f2bf8c51483f8c..5496152500d80ac731446a9d3630fed28562b18c 100644 (file)
@@ -26,7 +26,6 @@ getchar.s
 gets.s
 locale.s
 perror.s
-printf.s
 putchar.s
 puts.s
 qsort.s
index 9bdb80e3bdbb9beddbf326ffd09090999a643fdd..1d06712db01f28ec56cd18a4a57eab83bf8a8d1b 100644 (file)
@@ -13,7 +13,7 @@
 
 C_OBJS = fclose.o fgets.o fprintf.o calloc.o _fopen.o\
         fputs.o fread.o fwrite.o gets.o realloc.o bsearch.o strxfrm.o\
-        printf.o _hextab.o vfprintf.o fdopen.o strtok.o\
+        _hextab.o vfprintf.o fdopen.o strtok.o\
         _afailed.o fopen.o fgetc.o fputc.o puts.o gets.o perror.o getchar.o\
         vprintf.o vsprintf.o sprintf.o abort.o qsort.o putchar.o\
         errormsg.o cprintf.o vcprintf.o freopen.o locale.o fsetpos.o\
@@ -56,9 +56,10 @@ S_OBJS =     _fdesc.o        \
                maperrno.o      \
                memchr.o        \
                memcmp.o        \
-               memcpy.o        \
-               memset.o        \
-               rand.o          \
+               memcpy.o        \
+               memset.o        \
+               printf.o        \
+               rand.o          \
                setjmp.o        \
                stkcheck.o      \
                strcat.o        \
diff --git a/libsrc/common/printf.c b/libsrc/common/printf.c
deleted file mode 100644 (file)
index f5228ef..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * printf.c
- *
- * Ullrich von Bassewitz, 11.08.1998
- */
-
-
-
-#include <stdarg.h>
-#include <stdio.h>
-
-
-
-int printf (const char* format, ...)
-{
-    va_list ap;
-    va_start (ap, format);
-
-    /* Do formatting and output. Since we know, that va_end is empty, we don't
-     * call it here, saving an extra variable and some code.
-     */
-    return vfprintf (stdout, (char*) va_fix (ap, 1), ap);
-}
-
-
-
diff --git a/libsrc/common/printf.s b/libsrc/common/printf.s
new file mode 100644 (file)
index 0000000..ad26b86
--- /dev/null
@@ -0,0 +1,77 @@
+;
+; int printf (const char* Format, ...);
+;
+; Ullrich von Bassewitz, 1.12.2000
+;
+
+       .export         _printf
+       .import         _stdout, pushax, addysp, _vfprintf
+       .importzp       sp, ptr1
+
+       .macpack        generic
+
+; ----------------------------------------------------------------------------
+; Data
+
+.bss
+
+ParamSize:     .res    1               ; Number of parameter bytes
+
+; ----------------------------------------------------------------------------
+; Code
+
+.code
+
+
+_printf:
+       sty     ParamSize               ; Number of param bytes passed in Y
+
+; We are using a (hopefully) clever trick here to reduce code size. On entry,
+; the stack pointer points to the last pushed parameter        of the variable
+; parameter list. Adding the number of parameter bytes, would result in a
+; pointer that points *after* the Format parameter.
+; Since we have to push stdout anyway, we will do that here, so
+;
+;   * we will save the subtraction of 2 (__fixargs__) later
+;   * we will have the address of the Format parameter which needs to
+;     be pushed next.
+;
+
+       lda     _stdout
+       ldx     _stdout+1
+       jsr     pushax
+
+; Now calculate the va_list pointer, which does points to Format
+
+       lda     sp
+       ldx     sp+1
+       add     ParamSize
+       bcc     @L1
+       inx
+@L1:   sta     ptr1
+       stx     ptr1+1
+
+; Push Format
+
+       ldy     #1
+       lda     (ptr1),y
+       tax
+       dey
+       lda     (ptr1),y
+       jsr     pushax
+
+; Push the va_list
+
+       lda     ptr1
+       ldx     ptr1+1
+       jsr     pushax
+
+; Call vfprintf
+
+       jsr     _vfprintf       
+
+; Cleanup the stack. We will return what we got from vfprintf
+
+       ldy     ParamSize
+       jmp     addysp
+