X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libsrc%2Fatari%2Fopen.s;h=927c1953c24cac1da8a55c20dbf0f74f5fa79e2e;hb=2273b7575c1dfc70ddc41f32c58d37ed537980ad;hp=48568b083dfb72924c113e79769b58481e485385;hpb=8d6f5a2fca38aa7378180a26ca43fcfbcefafe45;p=cc65 diff --git a/libsrc/atari/open.s b/libsrc/atari/open.s index 48568b083..927c1953c 100644 --- a/libsrc/atari/open.s +++ b/libsrc/atari/open.s @@ -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 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 + 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 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