diff --git a/libsrc/common/.cvsignore b/libsrc/common/.cvsignore index ba46b0e7b..549615250 100644 --- a/libsrc/common/.cvsignore +++ b/libsrc/common/.cvsignore @@ -26,7 +26,6 @@ getchar.s gets.s locale.s perror.s -printf.s putchar.s puts.s qsort.s diff --git a/libsrc/common/Makefile b/libsrc/common/Makefile index 9bdb80e3b..1d06712db 100644 --- a/libsrc/common/Makefile +++ b/libsrc/common/Makefile @@ -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 index f5228ef4b..000000000 --- a/libsrc/common/printf.c +++ /dev/null @@ -1,26 +0,0 @@ -/* - * printf.c - * - * Ullrich von Bassewitz, 11.08.1998 - */ - - - -#include -#include - - - -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 index 000000000..ad26b8655 --- /dev/null +++ b/libsrc/common/printf.s @@ -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 +