diff --git a/libsrc/cbm/Makefile b/libsrc/cbm/Makefile index 39b7f600f..8d3adde4b 100644 --- a/libsrc/cbm/Makefile +++ b/libsrc/cbm/Makefile @@ -77,6 +77,7 @@ S_OBJS = c_acptr.o \ rwcommon.o \ scratch.o \ sysremove.o \ + sysrename.o \ systime.o \ wherex.o \ wherey.o \ diff --git a/libsrc/cbm/filename.s b/libsrc/cbm/filename.s index af1249647..85d5bc459 100644 --- a/libsrc/cbm/filename.s +++ b/libsrc/cbm/filename.s @@ -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 ".,-_+()" diff --git a/libsrc/cbm/sysrename.s b/libsrc/cbm/sysrename.s new file mode 100644 index 000000000..b4211f9b4 --- /dev/null +++ b/libsrc/cbm/sysrename.s @@ -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 + +