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

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

index 53109108ebd883532beda0075a845ca1dcc43c51..1ebdbe1d65ae0c7b8a9c160ecc2c7c1b46155628 100644 (file)
@@ -12,7 +12,6 @@ fgetc.s
 fgetpos.s
 fgets.s
 fopen.s
-fprintf.s
 fputc.s
 fputs.s
 fread.s
index b00dd0837ea936d90c0d669d7738689c42dddfdd..a5e668664128675938281aa7f39ed7cb5c5c759d 100644 (file)
@@ -11,7 +11,7 @@
 %.o:   %.s
        @$(AS) -g -o $@ $(AFLAGS) $<
 
-C_OBJS = fclose.o fgets.o fprintf.o calloc.o _fopen.o\
+C_OBJS = fclose.o fgets.o calloc.o _fopen.o\
         fputs.o fread.o fwrite.o gets.o realloc.o bsearch.o strxfrm.o\
         _hextab.o fdopen.o strtok.o\
         _afailed.o fopen.o fgetc.o fputc.o puts.o gets.o perror.o getchar.o\
@@ -35,6 +35,7 @@ S_OBJS =      _fdesc.o        \
                cprintf.o       \
                errno.o         \
                fmisc.o         \
+               fprintf.o       \
                free.o          \
                getcpu.o        \
                isalnum.o       \
diff --git a/libsrc/common/fprintf.c b/libsrc/common/fprintf.c
deleted file mode 100644 (file)
index 010180b..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * fprintf.c
- *
- * Ullrich von Bassewitz, 11.08.1998
- */
-
-
-
-#include <stdarg.h>
-#include <stdio.h>
-
-
-
-int fprintf (FILE* /*F*/, 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 ((FILE*) va_fix (ap, 1), (char*) va_fix (ap, 2), ap);
-}
-
-
-
diff --git a/libsrc/common/fprintf.s b/libsrc/common/fprintf.s
new file mode 100644 (file)
index 0000000..318f685
--- /dev/null
@@ -0,0 +1,70 @@
+;
+; int printf (const char* Format, ...);
+;
+; Ullrich von Bassewitz, 1.12.2000
+;
+
+       .export         _fprintf
+       .import         pushax, addysp, subysp, _vfprintf
+       .importzp       sp, ptr1
+
+       .macpack        generic
+
+; ----------------------------------------------------------------------------
+; Data
+
+.bss
+
+ParamSize:     .res    1               ; Number of parameter bytes
+
+; ----------------------------------------------------------------------------
+; Code
+
+.code
+
+
+_fprintf:
+       sty     ParamSize               ; Number of param bytes passed in Y
+
+; We have to push f and format, both in the order they already have on stack.
+; To make this somewhat more efficient, we will create space on the stack and
+; the do a copy of the complete block instead of pushing each parameter
+; separately. Since the size of the arguments passed is the same as the size
+; of the fixed arguments, this will allow us to calculate the pointer to the
+; fixed size arguments easier (they're just ParamSize bytes away).
+
+       ldy     #4
+       jsr     subysp
+
+; Calculate a pointer to the Format argument
+
+       lda     ParamSize
+       add     sp
+       sta     ptr1
+       ldx     sp+1
+       bcc     @L1
+       inx
+@L1:   stx     ptr1+1
+
+; Now copy both, f and format
+
+       ldy     #4-1
+@L2:   lda     (ptr1),y
+       sta     (sp),y
+       dey
+       bpl     @L2
+
+; Load va_list (last and __fastcall__ parameter to vfprintf)
+
+       lda     ptr1
+       ldx     ptr1+1
+
+; Call vfprintf
+
+       jsr     _vfprintf
+
+; Cleanup the stack. We will return what we got from vfprintf
+
+       ldy     ParamSize
+       jmp     addysp
+