]> git.sur5r.net Git - cc65/blobdiff - libsrc/common/fmisc.s
The IRQ handler needs to save the registers. By Stefan Haubenthal.
[cc65] / libsrc / common / fmisc.s
index 98ad7214c7bacffe25a45b923cbccb226efd8169..481be417644f7b88901ba226368f23bdcba3b898 100644 (file)
@@ -9,70 +9,81 @@
        .importzp       ptr1
 
         .include        "_file.inc"
+        .include        "errno.inc"
 
 ;
-; Get the FILE* parameter, check if the file is open
-;
-
-getf:  sta     ptr1
-       stx     ptr1+1
-       ldy     #_FILE::f_flags
-       lda     (ptr1),y        ; get f->f_flags
-       and     #_FOPEN         ; file open?
-       beq     @L1             ; jump if no
-       clc                     ; ok
-       rts
-@L1:   sec
+; Get the FILE* parameter, check if the file is open. Returns zero in A
+; and zero flag set in case of an error.
+
+.proc   getf
+        sta            ptr1
+       stx     ptr1+1
+       ldy     #_FILE::f_flags
+       lda     (ptr1),y        ; get f->f_flags
+       and     #_FOPEN         ; file open?
        rts
+.endproc
 
 ;
 ; void clearerr (FILE* f);
 ;
 
-_clearerr:
+.proc   _clearerr
                jsr     getf
-               bcs     err
+               beq     err
                lda     (ptr1),y
                and     #<~(_FEOF | _FERROR)
                sta     (ptr1),y
 err:   rts
+.endproc
 
 ;
 ; int feof (FILE* f);
 ;
 
-_feof:
-       jsr     getf
-;      bcs     err
-       lda     (ptr1),y
-       and     #_FEOF
-       ldx     #0
+.proc   _feof
+       jsr     getf
+        beq     @L1             ; Return 0 on error
+       lda     (ptr1),y
+       and     #_FEOF
+@L1:    ldx    #0
        rts
+.endproc
 
 ;
 ; int ferror (FILE* f);
 ;
 
-_ferror:
-       jsr     getf
-;      bcs     err
+.proc   _ferror
+       jsr     getf
+        beq     @L1             ; Return 0 on error
        lda     (ptr1),y
        and     #_FERROR
-       ldx     #0
+@L1:    ldx    #0
        rts
+.endproc
 
 ;
 ; int fileno (FILE* f);
 ;
 
-_fileno:
-       jsr     getf
-;      bcs     err
+.proc   _fileno
+       jsr     getf
+        beq     error
        ldy     #_FILE::f_fd
        lda     (ptr1),y
        ldx     #0
        rts
 
+; If the file is not valid, fileno must set errno and return -1
+
+error:  lda     #<EBADF
+        jsr     __seterrno
+        lda     #$FF
+        tax
+        rts
+.endproc
+
 ;
 ; int __fastcall__ fflush (FILE* f);
 ;