bpl namecheck
tax
lda __ctype,x
- and #(CT_LOWER|CT_DIGIT)
+ and #CT_ALNUM
beq invalidname
; Check the maximum length, store the character
nameok: ldx fnlen
- cpx #14 ; Maximum length reached?
+ cpx #16 ; Maximum length reached?
bcs invalidname
lda (ptr1),y ; Reload char
sta fnbuf,x ; Store into buffer
fnlen: .res 1
.data
-fncmd: .byte 's' ; Use as scratch command
-fnbuf: .res 20
+fncmd: .byte 's' ; Use as scratch command
+fnbuf: .res 22 ; 0:0123456789012345,t,m
.rodata
; Characters that are ok in filenames besides digits and letters
bcs nofile
stx tmp2
-; Check the flags. We cannot have:
-;
-; - both, read and write flags set
-; - the append flag set
-;
-
- lda tmp3
- and #O_RDWR
- beq invflags ; Neither read nor write
- cmp #O_RDWR
- beq invflags ; Jump if both set
- cmp #O_RDONLY
- beq doread
-
-; Write bit is set. We cannot open a file for writing without creating it,
-; so check for the O_CREAT bit.
+; Check the flags. We cannot have both, read and write flags set, and we cannot
+; open a file for writing without creating it.
lda tmp3
- and #O_CREAT
- beq invflags
+ and #(O_RDWR | O_CREAT)
+ cmp #O_RDONLY ; Open for reading?
+ beq doread ; Yes: Branch
+ cmp #(O_WRONLY | O_CREAT) ; Open for writing?
+ bne invflags ; No: Invalid open mode
; If O_TRUNC is set, scratch the file, but ignore any errors
beq notrunc
jsr scratch
-; Complete the the file name
+; Complete the the file name. Check for append mode here.
notrunc:
- lda #'w'
+ lda tmp3 ; Get the mode again
+ ldx #'a'
+ and #O_APPEND ; Append mode?
+ bne append ; Branch if yes
+ ldx #'w'
+append: txa
jsr fncomplete
; Setup the real open flags