]> git.sur5r.net Git - cc65/commitdiff
Replace vfscanf by an assembler version
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 27 Nov 2004 14:56:54 +0000 (14:56 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 27 Nov 2004 14:56:54 +0000 (14:56 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@3305 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/common/.cvsignore
libsrc/common/Makefile
libsrc/common/_scanf.inc
libsrc/common/vfscanf.c [deleted file]
libsrc/common/vfscanf.s [new file with mode: 0644]

index e96db4c0989c85cfb529a746456f209670107df5..d8d6186b314c1505305945afb20f868631e59682 100644 (file)
@@ -37,7 +37,6 @@ strtok.s
 strxfrm.s
 system.s
 timezone.s
-vfscanf.s
 vscanf.s
 vsscanf.s
 
index f9eea810405cee2cf18a62c28de006c26d2d95d2..43b56ba1cba84253466eeb418beb8b3813491b0b 100644 (file)
@@ -67,7 +67,6 @@ C_OBJS =      _afailed.o      \
                strtok.o        \
                 system.o        \
                 timezone.o      \
-                vfscanf.o       \
                 vscanf.o        \
                 vsscanf.o
 
@@ -169,6 +168,7 @@ S_OBJS =    _cwd.o          \
                 unlink.o        \
                 utscopy.o       \
                vfprintf.o      \
+                vfscanf.o       \
                vprintf.o       \
                vsprintf.o      \
                zerobss.o
index 48ae5b08ae9afacf1d8005135f85b084a2a9bbba..91be888a6a9fdea8ffd2c8306dd0f7aa3a4cae19 100644 (file)
@@ -14,7 +14,7 @@
 ;----------------------------------------------------------------------------
 ; Global data
 
-.global _scanf
+.global __scanf
 
 
 
diff --git a/libsrc/common/vfscanf.c b/libsrc/common/vfscanf.c
deleted file mode 100644 (file)
index 0f62113..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * vfscanf.c
- *
- * Ullrich von Bassewitz (uz@cc65.org), 2004-11-26
- *
- */
-
-
-
-#include <stdio.h>
-#include "_scanf.h"
-
-
-
-/*****************************************************************************/
-/*                                          Code                                    */
-/*****************************************************************************/
-
-
-
-int __fastcall__ vfscanf (FILE* f, const char* format, va_list ap)
-/* Standard C function */
-{
-    struct scanfdata d;
-
-    /* Initialize the data struct. We do only need the given file as user data,
-     * since the get and ungetc are crafted so they match the standard fgetc
-     * and ungetc functions.
-     */
-    d.get    = (getfunc) fgetc,
-    d.unget  = (ungetfunc) ungetc,
-    d.data   = f;
-
-    /* Call the internal function and return the result */
-    return _scanf (&d, format, ap);
-}
-
-
-
diff --git a/libsrc/common/vfscanf.s b/libsrc/common/vfscanf.s
new file mode 100644 (file)
index 0000000..057a62c
--- /dev/null
@@ -0,0 +1,70 @@
+;
+; int __fastcall__ vfscanf (FILE* f, const char* format, va_list ap);
+;
+; Ullrich von Bassewitz, 2004-11-27
+;
+
+       .export         _vfscanf
+        .import         _fgetc, _ungetc
+
+        .include        "zeropage.inc"
+        .include        "_scanf.inc"
+
+
+; ----------------------------------------------------------------------------
+; Static scanfdata structure for the _vfscanf routine
+;
+
+.data
+d:      .addr   _fgetc          ; GET
+       .addr   _ungetc         ; UNGET
+               .addr   0               ; data
+
+
+; ----------------------------------------------------------------------------
+; int __fastcall__ vfscanf (FILE* f, const char* format, va_list ap)
+; /* Standard C function */
+; {
+;     struct scanfdata d;
+;
+;     /* Initialize the data struct. We do only need the given file as user data,
+;      * since the get and ungetc are crafted so they match the standard fgetc
+;      * and ungetc functions.
+;      */
+;     d.get    = (getfunc) fgetc,
+;     d.unget  = (ungetfunc) ungetc,
+;     d.data   = f;
+;
+;     /* Call the internal function and return the result */
+;     return _scanf (&d, format, ap);
+; }
+;
+; Since _scanf has the same parameter stack as vfscanf, with f replaced by &d,
+; we will do exactly that. _scanf will then clean up the stack, so we can jump
+; directly there, no need to return.
+; Beware: Since ap is a fastcall parameter, we must not destroy a/x.
+;
+
+.code
+_vfscanf:
+        pha                     ; Save low byte of ap
+
+; Swap f against &d on the stack, placing f into d.data
+
+        ldy     #2              ; Offset of f on the stack
+        lda     (sp),y
+        sta     d + SCANFDATA::DATA
+        lda     #<d
+        sta     (sp),y
+
+        iny                     ; High byte
+        lda     (sp),y
+        sta     d + SCANFDATA::DATA + 1
+        lda     #>d
+        sta     (sp),y
+
+; Restore the low byte of ap and jump to the _scanf function
+
+        pla
+        jmp     __scanf
+