mirror of
https://github.com/cc65/cc65.git
synced 2025-01-14 00:32:08 +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 \
|
||||
scratch.o \
|
||||
sysremove.o \
|
||||
sysrename.o \
|
||||
systime.o \
|
||||
wherex.o \
|
||||
wherey.o \
|
||||
|
@ -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
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…
x
Reference in New Issue
Block a user