]> git.sur5r.net Git - cc65/commitdiff
Rewrote vcprintf() in assembler
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 2 Dec 2000 09:15:43 +0000 (09:15 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 2 Dec 2000 09:15:43 +0000 (09:15 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@521 b7a2c559-68d2-44c3-8de9-860c34a00d81

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

index aab101ac4a73b7623375ba6f7395bd2d90a5f934..789eb14f2962c27ff9a7e58f3dbd951340006ef6 100644 (file)
@@ -31,5 +31,4 @@ realloc.s
 rewind.s
 strtok.s
 strxfrm.s
-vcprintf.s
 vprintf.s
index 1594714e97348ad98c800a7d5869458b931a9811..aabe87d68b56b1e09062516e8cd6e608ea730e07 100644 (file)
@@ -16,7 +16,7 @@ C_OBJS = fclose.o fgets.o calloc.o _fopen.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 abort.o qsort.o putchar.o\
-        errormsg.o vcprintf.o freopen.o locale.o fsetpos.o\
+        errormsg.o freopen.o locale.o fsetpos.o\
         fgetpos.o rewind.o fseek.o ftell.o
 
 S_OBJS =       _fdesc.o        \
@@ -86,6 +86,7 @@ S_OBJS =      _fdesc.o        \
                strupper.o      \
                tolower.o       \
                toupper.o       \
+               vcprintf.o      \
                vfprintf.o      \
                vsprintf.o      \
                zerobss.o
index 0beba092a37c8218e7cfcbf815ce3cdfe9e7a98f..d5e5691538197d634de883f863eb59dfaee4d66d 100644 (file)
@@ -47,11 +47,10 @@ _cprintf:
        lda     (ptr1),y
        jsr     pushax
 
-; Push va_list (last parameter to vcprintf)
+; Load va_list (last and __fastcall__ parameter to vfprintf)
 
        lda     ptr1
        ldx     ptr1+1
-       jsr     pushax
 
 ; Call vcprintf
 
@@ -62,4 +61,4 @@ _cprintf:
        ldy     ParamSize
        jmp     addysp
 
-  
+
diff --git a/libsrc/common/vcprintf.c b/libsrc/common/vcprintf.c
deleted file mode 100644 (file)
index 64d0e5c..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * vcprintf.c
- *
- * Ullrich von Bassewitz, 11.08.1998
- */
-
-
-
-#include <stdarg.h>
-#include <conio.h>
-#include "_printf.h"
-
-
-
-static void out (struct outdesc* d, const char* buf, unsigned count)
-/* Routine used for writing */
-{
-    /* Fast screen output */
-    d->ccount += count;
-    while (count) {
-       cputc (*buf);
-       ++buf;
-        --count;
-    }
-}
-
-
-
-int vcprintf (const char* format, va_list ap)
-{
-    struct outdesc d;
-
-    /* Setup descriptor */
-    d.fout = out;
-
-    /* Do formatting and output */
-    _printf (&d, format, ap);
-
-    /* Return bytes written */
-    return d.ccount;
-}
-
-
-
diff --git a/libsrc/common/vcprintf.s b/libsrc/common/vcprintf.s
new file mode 100644 (file)
index 0000000..f994ad2
--- /dev/null
@@ -0,0 +1,158 @@
+;
+; int vcprintf (const char* Format, va_list ap);
+;
+; Ullrich von Bassewitz, 2.12.2000
+;
+
+       .export         _vcprintf
+       .import         pushax, popax
+       .import         __printf, _cputc
+       .importzp       sp, ptr1, ptr2, ptr3, tmp1
+
+       .macpack        generic
+
+
+.data
+
+; ----------------------------------------------------------------------------
+;
+; Static data for the _vsprintf routine
+;
+
+outdesc:                       ; Static outdesc structure
+       .word   0               ; ccount
+       .word   out             ; Output function pointer
+       .word   0               ; ptr
+               .word   0               ; uns
+
+.code
+
+; ----------------------------------------------------------------------------
+; Callback routine used for the actual output.
+;
+; static void out (struct outdesc* d, const char* buf, unsigned count)
+; /* Routine used for writing */
+; {
+;     /* Fast screen output */
+;     d->ccount += count;
+;     while (count) {
+;        cputc (*buf);
+;        ++buf;
+;        --count;
+;     }
+; }
+;
+; We're using ptr1 and tmp1, since we know that the cputc routine will not use
+; them (they're also used in cputs, so they must be safe).
+
+out:   jsr     popax           ; count
+       sta     ptr2
+       eor     #$FF
+       sta     outdesc+6
+       txa
+       sta     ptr2+1
+       eor     #$FF
+               sta     outdesc+7
+
+       jsr     popax           ; buf
+               sta     ptr1
+       stx     ptr1+1
+
+       jsr     popax           ; d
+       sta     ptr3
+       stx     ptr3+1
+
+; Sum up the total count of characters
+
+       ldy     #0              ; ccount in struct outdesc
+       sty     tmp1            ; Initialize tmp1 while we have zero available
+       lda     (ptr3),y
+       add     ptr2
+       sta     (ptr3),y
+       iny
+       lda     (ptr3),y
+       adc     ptr2+1
+       sta     (ptr3),y
+
+; Loop outputting characters
+
+@L1:   inc     outdesc+6
+       beq     @L4
+@L2:   ldy     tmp1
+       lda     (ptr1),y
+       iny
+       bne     @L3
+               inc     ptr1+1
+@L3:   sty     tmp1
+       jsr     _cputc
+       jmp     @L1
+
+@L4:   inc     outdesc+7
+       bne     @L2
+       rts
+
+; ----------------------------------------------------------------------------
+; vcprintf - formatted console i/o
+;
+; int vcprintf (const char* format, va_list ap)
+; {
+;     struct outdesc d;
+;
+;     /* Setup descriptor */
+;     d.fout = out;
+;
+;     /* Do formatting and output */
+;     _printf (&d, format, ap);
+;
+;     /* Return bytes written */
+;     return d.ccount;
+; }
+;
+; It is intentional that this function does not have __fastcall__ calling
+; conventions - we need the space on the stack anyway, so there's nothing
+; gained by using __fastcall__.
+
+_vcprintf:
+       sta     ptr1            ; Save ap
+       stx     ptr1+1
+
+; Setup the outdesc structure
+
+       lda     #0
+       sta     outdesc
+       sta     outdesc+1       ; Clear ccount
+
+; Get the format parameter and push it again
+
+       ldy     #1
+       lda     (sp),y
+       tax
+       dey
+       lda     (sp),y
+       jsr     pushax
+
+; Replace the passed format parameter on the stack by &d - this creates
+; exactly the stack frame _printf expects. Parameters will get dropped
+; by _printf.
+
+       ldy     #2              ; Low byte of d
+       lda     #<outdesc
+       sta     (sp),y
+       iny
+       lda     #>outdesc
+       sta     (sp),y
+
+; Restore ap and call _printf
+
+       lda     ptr1
+       ldx     ptr1+1
+       jsr     __printf
+
+; Return the number of bytes written.
+
+       lda     outdesc         ; ccount
+       ldx     outdesc+1
+       rts
+
+                     
+