2 ; Christian Groessler, Jan-2003
4 ; int open(const char *name,int flags,...);
13 .destructor closeallfiles, 17
17 .import fddecusage,newfd
19 .import __do_oserror,incsp4
20 .import ldaxysp,addysp
30 cpy #4 ; correct # of arguments (bytes)?
31 beq parmok ; parameter count ok
32 tya ; parm count < 4 shouldn't be needed to be checked
33 sec ; (it generates a c compiler warning)
36 jsr addysp ; fix stack, throw away unused parameters
38 parmok: jsr findfreeiocb
39 beq iocbok ; we found one
41 lda #<EMFILE ; "too many open files"
42 seterr: jsr __seterrno
43 jsr incsp4 ; clean up stack
48 ; process the mode argument
51 jsr clriocb ; init with zero
53 jsr ldaxysp ; get mode
60 cmp #O_RDONLY ; DOS supports append with write-only only
67 .ifndef UCASE_FILENAME
68 invret: lda #<EINVAL ; file name is too long
90 ; process the filename argument
99 invret: lda #<EINVAL ; file name is too long
104 .endif ; defined UCASE_FILENAME
108 ;AX - points to filename
109 ;Y - iocb to use, if open needed
110 jsr newfd ; maybe we don't need to open and can reuse an iocb
111 ; returns fd num to use in tmp2, all regs unchanged
112 bcs doopen ; C set: open needed
113 lda #0 ; clears N flag
132 .ifdef UCASE_FILENAME
134 jsr addysp ; free used space on the stack
135 .endif ; defined UCASE_FILENAME
137 jsr incsp4 ; clean up stack
146 jsr fddecusage ; decrement usage counter of fd as open failed
149 ok: lda tmp2 ; get fd
157 ; closeallfiles: Close all files opened by the program.