]> git.sur5r.net Git - cc65/blobdiff - libsrc/cbm/filename.s
Remove the load address since it's supplied in its own module now.
[cc65] / libsrc / cbm / filename.s
index af12496474fd04c5f16c38b1778bbe5722bc6ccb..fb8c9978e8c0abb58046713c53334556fe3df455 100644 (file)
@@ -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
 
         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   ".,-_+()"