From b46dab6d4498cc1084905a386203868f44e05bd1 Mon Sep 17 00:00:00 2001 From: cuz Date: Fri, 1 Dec 2000 17:32:59 +0000 Subject: [PATCH] Rewrote sprintf() in assembler git-svn-id: svn://svn.cc65.org/cc65/trunk@514 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- libsrc/common/.cvsignore | 1 - libsrc/common/Makefile | 13 ++++---- libsrc/common/fprintf.s | 2 +- libsrc/common/sprintf.c | 26 --------------- libsrc/common/sprintf.s | 71 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 79 insertions(+), 34 deletions(-) delete mode 100644 libsrc/common/sprintf.c create mode 100644 libsrc/common/sprintf.s diff --git a/libsrc/common/.cvsignore b/libsrc/common/.cvsignore index 1ebdbe1d6..44c6fff60 100644 --- a/libsrc/common/.cvsignore +++ b/libsrc/common/.cvsignore @@ -29,7 +29,6 @@ puts.s qsort.s realloc.s rewind.s -sprintf.s strtok.s strxfrm.s vcprintf.s diff --git a/libsrc/common/Makefile b/libsrc/common/Makefile index a5e668664..dbfaf4248 100644 --- a/libsrc/common/Makefile +++ b/libsrc/common/Makefile @@ -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 \ diff --git a/libsrc/common/fprintf.s b/libsrc/common/fprintf.s index 318f68576..47bff6b30 100644 --- a/libsrc/common/fprintf.s +++ b/libsrc/common/fprintf.s @@ -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 index 15c028fbf..000000000 --- a/libsrc/common/sprintf.c +++ /dev/null @@ -1,26 +0,0 @@ -/* - * sprintf.c - * - * Ullrich von Bassewitz, 11.08.1998 - */ - - - -#include -#include - - - -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 index 000000000..6a1a29c4b --- /dev/null +++ b/libsrc/common/sprintf.s @@ -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 +