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

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

index 1ebdbe1d65ae0c7b8a9c160ecc2c7c1b46155628..44c6fff6037dca01a1b7d09fc1c751becbb0133d 100644 (file)
@@ -29,7 +29,6 @@ puts.s
 qsort.s
 realloc.s
 rewind.s
-sprintf.s
 strtok.s
 strxfrm.s
 vcprintf.s
index a5e668664128675938281aa7f39ed7cb5c5c759d..dbfaf4248c94280149e013bbf12642f65be6f909 100644 (file)
@@ -15,7 +15,7 @@ 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\
-        vprintf.o vsprintf.o sprintf.o abort.o qsort.o putchar.o\
+        vprintf.o vsprintf.o abort.o qsort.o putchar.o\
         errormsg.o vcprintf.o freopen.o locale.o fsetpos.o\
         fgetpos.o rewind.o fseek.o ftell.o
 
@@ -58,11 +58,12 @@ S_OBJS =    _fdesc.o        \
                maperrno.o      \
                memchr.o        \
                memcmp.o        \
-               memcpy.o        \
-               memset.o        \
-               printf.o        \
-               rand.o          \
-               setjmp.o        \
+               memcpy.o        \
+               memset.o        \
+               printf.o        \
+               rand.o          \
+               setjmp.o        \
+               sprintf.o       \
                stkcheck.o      \
                strcat.o        \
                strchr.o        \
index 318f68576487ba05c81130d3c25c415672de63e6..47bff6b3055e6758084d537ccc1ede7ffe90833a 100644 (file)
@@ -1,5 +1,5 @@
 ;
-; int printf (const char* Format, ...);
+; int fprintf (FILE* f, const char* Format, ...);
 ;
 ; Ullrich von Bassewitz, 1.12.2000
 ;
diff --git a/libsrc/common/sprintf.c b/libsrc/common/sprintf.c
deleted file mode 100644 (file)
index 15c028f..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * sprintf.c
- *
- * Ullrich von Bassewitz, 11.08.1998
- */
-
-
-
-#include <stdarg.h>
-#include <stdio.h>
-
-
-
-int sprintf (char* /*buf*/, 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 vsprintf ((char*) va_fix (ap, 1), (char*) va_fix (ap, 2), ap);
-}
-
-
-
diff --git a/libsrc/common/sprintf.s b/libsrc/common/sprintf.s
new file mode 100644 (file)
index 0000000..6a1a29c
--- /dev/null
@@ -0,0 +1,71 @@
+;
+; int sprintf (char* buf, const char* Format, ...);
+;
+; Ullrich von Bassewitz, 1.12.2000
+;
+
+       .export         _sprintf
+       .import         pushax, addysp, subysp, _vsprintf
+       .importzp       sp, ptr1
+
+       .macpack        generic
+
+; ----------------------------------------------------------------------------
+; Data
+
+.bss
+
+ParamSize:     .res    1               ; Number of parameter bytes
+
+; ----------------------------------------------------------------------------
+; Code
+
+.code
+
+
+_sprintf:
+       sty     ParamSize               ; Number of param bytes passed in Y
+
+; We have to push buf 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, buf and format
+
+       ldy     #4-1
+@L2:   lda     (ptr1),y
+       sta     (sp),y
+       dey
+       bpl     @L2
+
+; Push va_list (last parameter to vsprintf)
+
+       lda     ptr1
+       ldx     ptr1+1
+       jsr     pushax
+
+; Call vfprintf
+
+       jsr     _vsprintf
+
+; Cleanup the stack. We will return what we got from vsprintf
+
+       ldy     ParamSize
+       jmp     addysp
+