From 6195f87f6a1344e9c00c5c58c04c56588cd07242 Mon Sep 17 00:00:00 2001 From: cuz Date: Sat, 23 Nov 2002 18:46:40 +0000 Subject: [PATCH] Rewrote fopen in assembler git-svn-id: svn://svn.cc65.org/cc65/trunk@1608 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- libsrc/common/.cvsignore | 1 - libsrc/common/Makefile | 2 +- libsrc/common/fopen.c | 32 ------------------------- libsrc/common/fopen.s | 51 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 52 insertions(+), 34 deletions(-) delete mode 100644 libsrc/common/fopen.c create mode 100644 libsrc/common/fopen.s diff --git a/libsrc/common/.cvsignore b/libsrc/common/.cvsignore index 46556ea50..3f648ea4f 100644 --- a/libsrc/common/.cvsignore +++ b/libsrc/common/.cvsignore @@ -11,7 +11,6 @@ fdopen.s fgetc.s fgetpos.s fgets.s -fopen.s fputc.s fputs.s fread.s diff --git a/libsrc/common/Makefile b/libsrc/common/Makefile index 94129707b..ba1d3b697 100644 --- a/libsrc/common/Makefile +++ b/libsrc/common/Makefile @@ -23,7 +23,6 @@ C_OBJS = _afailed.o \ fgetc.o \ fgetpos.o \ fgets.o \ - fopen.o \ fputc.o \ fputs.o \ fread.o \ @@ -72,6 +71,7 @@ S_OBJS = _fdesc.o \ divt.o \ errno.o \ fmisc.o \ + fopen.o \ fprintf.o \ free.o \ getcpu.o \ diff --git a/libsrc/common/fopen.c b/libsrc/common/fopen.c deleted file mode 100644 index f5c36527d..000000000 --- a/libsrc/common/fopen.c +++ /dev/null @@ -1,32 +0,0 @@ -/* - * fopen.c - * - * Ullrich von Bassewitz, 17.06.1998 - */ - - - -#include -#include -#include -#include "_file.h" - - - -FILE* fopen (const char* name, const char* mode) -{ - FILE* f; - - /* Find a free file slot */ - if (!(f = _fdesc ())) { - /* No slots */ - _errno = EMFILE; /* Too many files */ - return 0; - } - - /* Open the file and return the descriptor */ - return _fopen (name, mode, f); -} - - - diff --git a/libsrc/common/fopen.s b/libsrc/common/fopen.s new file mode 100644 index 000000000..791dfcff5 --- /dev/null +++ b/libsrc/common/fopen.s @@ -0,0 +1,51 @@ +; +; Ullrich von Bassewitz, 22.11.2002 +; +; FILE* __fastcall__ fopen (const char* name, const char* mode) +; /* Open a file */ +; + + .export _fopen + + .import __fopen, __fdesc + .import pushax, return0 + + .include "errno.inc" + + +; ------------------------------------------------------------------------ +; Code + +.proc _fopen + +; Bring the mode parameter on the stack + + jsr pushax + +; Allocate a new file stream + + jsr __fdesc + +; Check if we have a stream + + cmp #$00 + bne @L1 + cpx #$00 + bne @L1 + +; Failed to allocate a file stream + + lda #EMFILE + sta __errno + lda #0 + sta __errno+1 + tax + rts ; Return zero + +; Open the file and return the file descriptor. All arguments are already +; in place: name and mode on the stack, and f in a/x + +@L1: jmp __fopen + +.endproc + -- 2.39.5