mirror of
https://github.com/cc65/cc65.git
synced 2024-07-10 23:29:05 +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:
parent
30237d3c36
commit
ef18b567f0
@ -77,6 +77,7 @@ S_OBJS = c_acptr.o \
|
|||||||
rwcommon.o \
|
rwcommon.o \
|
||||||
scratch.o \
|
scratch.o \
|
||||||
sysremove.o \
|
sysremove.o \
|
||||||
|
sysrename.o \
|
||||||
systime.o \
|
systime.o \
|
||||||
wherex.o \
|
wherex.o \
|
||||||
wherey.o \
|
wherey.o \
|
||||||
|
@ -9,66 +9,18 @@
|
|||||||
|
|
||||||
.import SETNAM
|
.import SETNAM
|
||||||
.import __curunit, __filetype
|
.import __curunit, __filetype
|
||||||
.importzp ptr1
|
.importzp ptr1, tmp1
|
||||||
|
|
||||||
.include "ctype.inc"
|
.include "ctype.inc"
|
||||||
|
|
||||||
|
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
; fnparsename: Parse a filename (without drive spec) passed in in ptr1 and y.
|
||||||
|
|
||||||
;--------------------------------------------------------------------------
|
.proc fnparsename
|
||||||
; 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 fnparse
|
lda #0
|
||||||
|
sta tmp1 ; Remember length of name
|
||||||
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
|
|
||||||
|
|
||||||
nameloop:
|
nameloop:
|
||||||
lda (ptr1),y ; Get next char from filename
|
lda (ptr1),y ; Get next char from filename
|
||||||
@ -90,12 +42,13 @@ namecheck:
|
|||||||
|
|
||||||
; Check the maximum length, store the character
|
; Check the maximum length, store the character
|
||||||
|
|
||||||
nameok: ldx fnlen
|
nameok: ldx tmp1
|
||||||
cpx #18 ; Maximum length reached?
|
cpx #16 ; Maximum length reached?
|
||||||
bcs invalidname
|
bcs invalidname
|
||||||
lda (ptr1),y ; Reload char
|
lda (ptr1),y ; Reload char
|
||||||
jsr fnadd ; Add character to name
|
jsr fnadd ; Add character to name
|
||||||
iny ; Next char from name
|
iny ; Next char from name
|
||||||
|
inc tmp1 ; Increment length of name
|
||||||
bne nameloop ; Branch always
|
bne nameloop ; Branch always
|
||||||
|
|
||||||
; Invalid file name
|
; Invalid file name
|
||||||
@ -110,6 +63,69 @@ namedone:
|
|||||||
|
|
||||||
.endproc
|
.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
|
; fndefunit: Use the default unit
|
||||||
|
|
||||||
@ -169,8 +185,8 @@ fnlen: .res 1
|
|||||||
|
|
||||||
.data
|
.data
|
||||||
fncmd: .byte 's' ; Use as scratch command
|
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
|
.rodata
|
||||||
; Characters that are ok in filenames besides digits and letters
|
; Characters that are ok in filenames besides digits and letters
|
||||||
fnchars:.byte ".,-_+()"
|
fnchars:.byte ".,-_+()"
|
||||||
|
44
libsrc/cbm/sysrename.s
Normal file
44
libsrc/cbm/sysrename.s
Normal 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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user