From 13be3ba3ef3598db220762a9bb4a24a280c638b1 Mon Sep 17 00:00:00 2001 From: cuz Date: Fri, 1 Dec 2000 17:25:07 +0000 Subject: [PATCH] Rewrote fprintf in assembler git-svn-id: svn://svn.cc65.org/cc65/trunk@513 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- libsrc/common/.cvsignore | 1 - libsrc/common/Makefile | 3 +- libsrc/common/fprintf.c | 26 --------------- libsrc/common/fprintf.s | 70 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 72 insertions(+), 28 deletions(-) delete mode 100644 libsrc/common/fprintf.c create mode 100644 libsrc/common/fprintf.s diff --git a/libsrc/common/.cvsignore b/libsrc/common/.cvsignore index 53109108e..1ebdbe1d6 100644 --- a/libsrc/common/.cvsignore +++ b/libsrc/common/.cvsignore @@ -12,7 +12,6 @@ fgetc.s fgetpos.s fgets.s fopen.s -fprintf.s fputc.s fputs.s fread.s diff --git a/libsrc/common/Makefile b/libsrc/common/Makefile index b00dd0837..a5e668664 100644 --- a/libsrc/common/Makefile +++ b/libsrc/common/Makefile @@ -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 index 010180bf8..000000000 --- a/libsrc/common/fprintf.c +++ /dev/null @@ -1,26 +0,0 @@ -/* - * fprintf.c - * - * Ullrich von Bassewitz, 11.08.1998 - */ - - - -#include -#include - - - -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 index 000000000..318f68576 --- /dev/null +++ b/libsrc/common/fprintf.s @@ -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 +