]> git.sur5r.net Git - cc65/blobdiff - libsrc/atari/open.s
DIO functions always set _oserror.
[cc65] / libsrc / atari / open.s
index 48568b083dfb72924c113e79769b58481e485385..927c1953c24cac1da8a55c20dbf0f74f5fa79e2e 100644 (file)
@@ -1,41 +1,43 @@
 ;
-; Christian Groessler, May-2000
+; Christian Groessler, Jan-2003
 ;
 ; int open(const char *name,int flags,...);
 ;
 
-UCASE_FILENAME = 1             ; comment it out if filename shouldn't be uppercased
-
        .include "atari.inc"
-       .include "../common/fmode.inc"
-       .include "../common/errno.inc"
+       .include "fcntl.inc"
+       .include "errno.inc"
+       .include "fd.inc"
+
        .export _open
+        .destructor     closeallfiles, 17
+
+       .import _close
        .import clriocb
        .import fddecusage,newfd
        .import findfreeiocb
-       .import __do_oserror,__seterrno,incsp4
-       .import ldaxysp,addysp,subysp
-       .import _strupr,__oserror
-       .importzp tmp4,tmp2,sp
+       .import __do_oserror,incsp4
+       .import ldaxysp,addysp
+       .import __oserror
+       .importzp tmp4,tmp2
 .ifdef UCASE_FILENAME
-       .importzp tmp3,ptr4
+       .importzp tmp3
+       .import ucase_fn
 .endif
 
 .proc  _open
 
-       cpy     #4              ; correct # of arguments (bytes)?
+       dey                     ; parm count < 4 shouldn't be needed to be checked
+       dey                     ;       (it generates a c compiler warning)
+       dey
+       dey
        beq     parmok          ; parameter count ok
-       tya                     ; parm count < 4 shouldn't be needed to be checked
-       sec                     ;       (it generates a c compiler warning)
-       sbc     #4
-       tay
        jsr     addysp          ; fix stack, throw away unused parameters
 
 parmok:        jsr     findfreeiocb
        beq     iocbok          ; we found one
 
        lda     #<EMFILE        ; "too many open files"
-       ldx     #>EMFILE
 seterr:        jsr     __seterrno
        jsr     incsp4          ; clean up stack
        lda     #$FF
@@ -43,13 +45,32 @@ seterr:     jsr     __seterrno
        rts                     ; return -1
 
        ; process the mode argument
-       ; @@@TODO: append not handled yet!
 
 iocbok:        stx     tmp4
        jsr     clriocb         ; init with zero
        ldy     #1
        jsr     ldaxysp         ; get mode
        ldx     tmp4
+       pha
+       and     #O_APPEND
+       beq     no_app
+       pla
+       and     #15
+       cmp     #O_RDONLY       ; DOS supports append with write-only only
+       beq     invret
+       cmp     #O_RDWR
+       beq     invret
+       lda     #OPNOT|APPEND
+       bne     set
+
+.ifndef        UCASE_FILENAME
+invret:        lda     #<EINVAL        ; file name is too long
+       ldx     #>EINVAL
+       jmp     seterr
+.endif
+
+no_app:        pla
+       and     #15
        cmp     #O_RDONLY
        bne     l1
        lda     #OPNIN
@@ -71,50 +92,13 @@ cont:       ldy     #3
        jsr     ldaxysp
 
 .ifdef UCASE_FILENAME
-       ; we make sure that the filename doesn't contain lowercase letters
-       ; we copy the filename we got onto the stack, uppercase it and use this
-       ; one to open the iocb
-       ; we're using tmp3, ptr4
-
-       ; save the original pointer
-       sta     ptr4
-       stx     ptr4+1
-
-       ; now we need the length of the name
-       ldy     #0
-loop:  lda     (ptr4),y
-       beq     str_end
-       cmp     #ATEOL          ; we also accept Atari EOF char as end of string
-       beq     str_end
-       iny
-       bne     loop            ; not longer than 255 chars (127 real limit)
-toolong:lda    #<EINVAL        ; file name is too long
+
+       jsr     ucase_fn
+       bcc     ucok1
+invret:        lda     #<EINVAL        ; file name is too long
        ldx     #>EINVAL
        jmp     seterr
-
-str_end:iny                    ; room for terminating zero
-       cpy     #128            ; we only can handle lenght < 128
-       bcs     toolong
-       sty     tmp3            ; save size
-       jsr     subysp          ; make room on the stack
-
-       ; copy filename to the temp. place on the stack
-       lda     #0              ; end-of-string
-       sta     (sp),y          ; Y still contains length + 1
-       dey
-loop2: lda     (ptr4),y
-       sta     (sp),y
-       dey
-       bpl     loop2           ; bpl: this way we only support a max. length of 127
-
-       ; uppercase the temp. filename
-       ldx     sp+1
-       lda     sp
-       jsr     _strupr
-
-       ; leave X and Y pointing to the modified filename
-       lda     sp
-       ldx     sp+1
+ucok1:
 
 .endif ; defined UCASE_FILENAME
 
@@ -167,3 +151,20 @@ ok:        lda     tmp2            ; get fd
        rts
 
 .endproc
+
+
+; closeallfiles: Close all files opened by the program.
+
+.proc   closeallfiles
+
+       lda     #MAX_FD_INDEX-1
+loop:  ldx     #0
+       pha
+       jsr     _close
+       pla
+       clc
+       sbc     #0
+       bpl     loop
+       rts
+
+.endproc