X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=libsrc%2Fcbm%2Ffilename.s;h=fb8c9978e8c0abb58046713c53334556fe3df455;hb=9948b5acfe552de93cfb3bd9495babf19a7f3814;hp=af12496474fd04c5f16c38b1778bbe5722bc6ccb;hpb=8440c13edd28dde46df114f80169f24f02f499ac;p=cc65 diff --git a/libsrc/cbm/filename.s b/libsrc/cbm/filename.s index af1249647..fb8c9978e 100644 --- a/libsrc/cbm/filename.s +++ b/libsrc/cbm/filename.s @@ -4,18 +4,69 @@ ; File name handling for CBM file I/O ; - .export fnparse, fnset, fnaddmode, fncomplete, fndefunit + .export fnparse, fnparsename, fnset + .export fnadd, fnaddmode, fncomplete, fndefunit .export fnunit, fnlen, fncmd, fnbuf .import SETNAM .import __curunit, __filetype - .importzp ptr1 + .importzp ptr1, tmp1 .include "ctype.inc" -;-------------------------------------------------------------------------- -; fnparse: Parse a filename passed in in a/x. Will set the following +;------------------------------------------------------------------------------ +; fnparsename: Parse a filename (without drive spec) passed in in ptr1 and y. + +.proc fnparsename + + lda #0 + sta tmp1 ; Remember length of name + +nameloop: + lda (ptr1),y ; Get next char from filename + beq namedone ; Jump if end of name reached + +; Check for valid chars in the file name. We allow letters, digits, plus some +; additional chars from a table. + + ldx #fncharcount-1 +namecheck: + cmp fnchars,x + beq nameok + dex + bpl namecheck + tax + lda __ctype,x + and #CT_ALNUM + beq invalidname + +; Check the maximum length, store the character + +nameok: ldx tmp1 + cpx #16 ; Maximum length reached? + bcs invalidname + lda (ptr1),y ; Reload char + jsr fnadd ; Add character to name + iny ; Next char from name + inc tmp1 ; Increment length of name + bne nameloop ; Branch always + +; Invalid file name + +invalidname: + lda #33 ; Invalid file name + +; Done, we've successfully parsed the name. + +namedone: + rts + +.endproc + + +;------------------------------------------------------------------------------ +; fnparse: Parse a full filename passed in in a/x. Will set the following ; variables: ; ; fnlen -> length of filename @@ -37,13 +88,13 @@ ldy #0 lda (ptr1),y - sta fnbuf+0 cmp #'0' beq digit cmp #'1' bne nodrive -digit: iny +digit: sta fnbuf+0 + iny lda (ptr1),y cmp #':' bne nodrive @@ -63,50 +114,16 @@ nodrive: sta fnbuf+1 ldy #$00 ; Reposition to start of name -; Drive spec done. Copy the name into the file name buffer. Check that all -; file name characters are valid and that the maximum length is not exceeded. +; Drive spec done. We do now have a drive spec in the buffer. drivedone: lda #2 ; Length of drive spec sta fnlen -nameloop: - lda (ptr1),y ; Get next char from filename - beq namedone ; Jump if end of name reached - -; Check for valid chars in the file name. We allow letters, digits, plus some -; additional chars from a table. +; Copy the name into the file name buffer. The subroutine returns an error +; code in A and zero flag set if the were no errors. - ldx #fncharcount-1 -namecheck: - cmp fnchars,x - beq nameok - dex - bpl namecheck - tax - lda __ctype,x - and #CT_ALNUM - beq invalidname - -; Check the maximum length, store the character - -nameok: ldx fnlen - cpx #18 ; Maximum length reached? - bcs invalidname - lda (ptr1),y ; Reload char - jsr fnadd ; Add character to name - iny ; Next char from name - bne nameloop ; Branch always - -; Invalid file name - -invalidname: - lda #33 ; Invalid file name - -; Done, we've successfully parsed the name. - -namedone: - rts + jmp fnparsename .endproc @@ -169,8 +186,8 @@ fnlen: .res 1 .data fncmd: .byte 's' ; Use as scratch command -fnbuf: .res 22 ; 0:0123456789012345,t,m - +fnbuf: .res 35 ; Either 0:0123456789012345,t,m + ; Or 0:0123456789012345=0123456789012345 .rodata ; Characters that are ok in filenames besides digits and letters fnchars:.byte ".,-_+()"