1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-26 20:29:34 +00:00

Added a new sysrename module to make the high level function rename work. Code

is untested!


git-svn-id: svn://svn.cc65.org/cc65/trunk@3940 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
uz 2009-02-22 14:06:12 +00:00
parent 30237d3c36
commit ef18b567f0
3 changed files with 120 additions and 59 deletions

View File

@ -77,6 +77,7 @@ S_OBJS = c_acptr.o \
rwcommon.o \
scratch.o \
sysremove.o \
sysrename.o \
systime.o \
wherex.o \
wherey.o \

View File

@ -9,66 +9,18 @@
.import SETNAM
.import __curunit, __filetype
.importzp ptr1
.importzp ptr1, tmp1
.include "ctype.inc"
;------------------------------------------------------------------------------
; fnparsename: Parse a filename (without drive spec) passed in in ptr1 and y.
;--------------------------------------------------------------------------
; fnparse: Parse a filename passed in in a/x. Will set the following
; variables:
;
; fnlen -> length of filename
; fnbuf -> filename including drive spec
; fnunit -> unit from spec or default unit
;
; Returns an error code in A or zero if all is ok.
.proc fnparsename
.proc fnparse
sta ptr1
stx ptr1+1 ; Save pointer to name
; For now we will always use the default unit
jsr fndefunit
; Check the name for a drive spec
ldy #0
lda (ptr1),y
sta fnbuf+0
cmp #'0'
beq digit
cmp #'1'
bne nodrive
digit: iny
lda (ptr1),y
cmp #':'
bne nodrive
; We found a drive spec, copy it to the buffer
sta fnbuf+1
iny ; Skip colon
bne drivedone ; Branch always
; We did not find a drive spec, always use drive zero
nodrive:
lda #'0'
sta fnbuf+0
lda #':'
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.
drivedone:
lda #2 ; Length of drive spec
sta fnlen
lda #0
sta tmp1 ; Remember length of name
nameloop:
lda (ptr1),y ; Get next char from filename
@ -90,12 +42,13 @@ namecheck:
; Check the maximum length, store the character
nameok: ldx fnlen
cpx #18 ; Maximum length reached?
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
@ -110,6 +63,69 @@ namedone:
.endproc
;------------------------------------------------------------------------------
; fnparse: Parse a full filename passed in in a/x. Will set the following
; variables:
;
; fnlen -> length of filename
; fnbuf -> filename including drive spec
; fnunit -> unit from spec or default unit
;
; Returns an error code in A or zero if all is ok.
.proc fnparse
sta ptr1
stx ptr1+1 ; Save pointer to name
; For now we will always use the default unit
jsr fndefunit
; Check the name for a drive spec
ldy #0
lda (ptr1),y
cmp #'0'
beq digit
cmp #'1'
bne nodrive
digit: sta fnbuf+0
iny
lda (ptr1),y
cmp #':'
bne nodrive
; We found a drive spec, copy it to the buffer
sta fnbuf+1
iny ; Skip colon
bne drivedone ; Branch always
; We did not find a drive spec, always use drive zero
nodrive:
lda #'0'
sta fnbuf+0
lda #':'
sta fnbuf+1
ldy #$00 ; Reposition to start of name
; Drive spec done. We do now have a drive spec in the buffer.
drivedone:
lda #2 ; Length of drive spec
sta fnlen
; 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.
jmp fnparsename
.endproc
;--------------------------------------------------------------------------
; fndefunit: Use the default unit
@ -169,8 +185,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 ".,-_+()"

44
libsrc/cbm/sysrename.s Normal file
View File

@ -0,0 +1,44 @@
;
; Ullrich von Bassewitz, 2009-02-22
;
; unsigned char __fastcall__ _sysrename (const char *oldpath, const char *newpath);
;
.export __sysrename
.import fnparse, fnadd, fnparsename
.import writefndiskcmd, closecmdchannel
.import popax
.import fncmd, fnunit
;--------------------------------------------------------------------------
; __sysrename:
.proc __sysrename
jsr fnparse ; Parse first filename, pops newpath
bne done
lda #'='
jsr fnadd
jsr popax
jsr fnparsename ; Parse second filename
bne done
lda #'r' ; Rename command
sta fncmd
jsr writefndiskcmd
pha
ldx fnunit
jsr closecmdchannel
pla
done: rts
.endproc