NEW AUTO 3,1 .LIST OFF *-------------------------------------- X.COPY.BUF.SIZE .EQ 4096 *-------------------------------------- .DUMMY .OR ZPBIN ZS.START ZPPtr1 .BS 2 ZPPtr2 .BS 2 ZPFileName .BS 2 ZPFileStat .BS 2 ZS.END .ED *-------------------------------------- * File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) .DA #$61 6502,Level 1 (65c02) .DA #1 BIN Layout Version 1 .DA 0 .DA CS.END-CS.START CS .DA DS.END-DS.START DS .DA #64 SS .DA #ZS.END-ZS.START Zero Page Size .DA 0 *-------------------------------------- * Relocation Table *-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT .DA CS.QUIT L.MSG.USAGE .DA MSG.USAGE L.MSG.DIR .DA MSG.DIR L.MSG.FILE .DA MSG.FILE .DO X.COPY.TO.DEST=1 L.MSG.OVERWRITE .DA MSG.OVERWRITE .FIN L.MSG.OK .DA MSG.OK L.MSG.ERR .DA MSG.ERR L.MSG.CRLF .DA MSG.CRLF L.MSG.DONE .DA MSG.DONE L.STAT .DA STAT .DA 0 *-------------------------------------- CS.INIT .1 >INC.G ArgCount >SYSCALL ArgV bcs .7 >STYA ZPPtr1 lda (ZPPtr1) cmp #'-' bne .4 ldy #1 lda (ZPPtr1),y ldx #OptionVars-OptionList-1 .2 cmp OptionList,x beq .3 dex bpl .2 .99 >PUSHW L.MSG.USAGE >PUSHBI 0 >SYSCALL PrintF lda #E.SYN sec rts .3 ldy OptionVars,x lda #$80 sta (pData),y bra .1 .4 >LDA.G index .DO X.COPY.TO.DEST=1 bne .5 Already have a Src dir... .ELSE bne .99 .FIN >LDYA ZPPtr1 jsr InitSrcDirYA bcc .1 success, scan for any other args .9 rts .DO X.COPY.TO.DEST=1 .5 >LDA.G hDstBasePath bne .99 we already have a second arg....error! >LDYA ZPPtr1 jsr InitDstDirYA bcc .1 success, scan for any other args rts .FIN .7 >LDA.G index processed all args beq .99 , no src ? ERROR .DO X.COPY.TO.DEST=1 >LDA.G hDstBasePath bne .8 we also have a Dst folder ldy #S.PS.hCWD no dst folder, use actual prefix lda (pPS),y >SYSCALL GetMemPtr jsr InitDstDirYA bcs .99 .FIN .8 >LDYAI 256 >SYSCALL GetMem bcs .9 txa >STA.G hSrcFullPath .DO X.COPY.TO.DEST=1 >LDYAI 256 >SYSCALL GetMem bcs .9 txa >STA.G hDstFullPath .FIN clc CS.INIT.RTS rts *-------------------------------------- CS.RUN ldy #S.PS.hStdIn lda (pPS),y >SYSCALL FEOF bcs CS.INIT.RTS I/O error tay bne .15 >SYSCALL GetChar bcs CS.INIT.RTS I/O error cmp #$03 Ctrl-C bne .10 sec rts Abort.... .10 cmp #$13 Ctrl-S bne .15 >LDA.G bPause eor #$ff sta (pData),y .15 >LDA.G bPause bpl .1 .8 clc rts *-------------------------------------- .1 .DO X.COPY.TO.DEST=1 >LDA.G bCopy beq .2 jsr CS.RUN.Copy >LDA.G bCopy Copy completed ? bne .8 no.....exit clc >LDA.G CopyRC .DO X.DELETE.SOURCE=0 beq .20 no copy error sec jsr CS.RUN.CheckErr we have an error.... bcs .9 jmp CS.RUN.NEXT .20 jsr CS.RUN.CheckErr Success!! jsr CS.RUN.IncCount jmp CS.RUN.NEXT .ELSE beq .2 sec jsr CS.RUN.CheckErr we have an error.... bcc .21 rts .21 >STZ.G hToDelete Cancel delete if any jmp CS.RUN.NEXT .FIN .FIN .2 .DO X.DELETE.SOURCE=1 >LDA.G hToDelete beq .3 lda #0 sta (pData),y ldy #hSrcFullPath jsr CS.RUN.GetPathY >PUSHYA >SYSCALL Remove bcs .22 jsr CS.RUN.CheckErr Success!!! jsr CS.RUN.IncCount jmp CS.RUN.NEXT .22 jsr CS.RUN.CheckErr bcs .9 jmp CS.RUN.NEXT .FIN *-------------------------------------- .3 jsr GetEntry bcs CS.RUN.LEAVE jsr FilterMatch bcs CS.RUN.NEXT no match, skip.... .4 ldy #S.STAT.P.DRIVE lda (ZPFileStat),y ProDOS Device ? bne .6 ldy #S.STAT.P.TYPE lda (ZPFileStat),y cmp #$0F Directory ? bne .5 >LDA.G bRecurse bpl CS.RUN.NEXT lda (ZPFileName) cmp #'.' beq CS.RUN.NEXT Skip "." & ".." jsr CS.RUN.BuildFilePath jmp CS.RUN.DIR .5 jsr CS.RUN.BuildFilePath jmp CS.RUN.FILE .6 lda #MLI.E.UNSUPST sec .9 rts *-------------------------------------- CS.RUN.CR.NEXT jsr CS.RUN.CR CS.RUN.NEXT jsr GetNextEntry bcs CS.RUN.LEAVE rts *-------------------------------------- CS.RUN.LEAVE jsr LeaveSubDir exit this sub dir.... bcs .99 base, we are done, exit jsr BasePath.. .DO X.DELETE.SOURCE=1 * .DO X.COPY.TO.DEST=0 jsr GetEntry bcs * jsr CS.RUN.BuildFilePath jsr CS.RUN.DIR.MSG bcs CS.RUN.LEAVE.RTS ldy #hSrcFullPath jsr CS.RUN.GetPathY >SYSCALL Remove jsr CS.RUN.CheckErr bcs .99 * .FIN .FIN jmp CS.RUN.NEXT .99 ldy #bQuiet lda (pData),y bmi .91 >PUSHW L.MSG.DONE ldy #Count+1 >PUSHB (pData),y dey >PUSHB (pData),y >PUSHBI 2 >SYSCALL PrintF .91 ldy #RC lda (pData),y get global RC in case of bContinue sec CS.RUN.LEAVE.RTS rts *-------------------------------------- CS.RUN.DIR .DO X.COPY.TO.DEST=1 jsr CS.RUN.DIR.MSG bcs CS.RUN.LEAVE.RTS ldy #hDstFullPath jsr CS.RUN.GetPathY >PUSHYA >PUSHW L.STAT >SYSCALL Stat bcs .3 File Not exists...go create ldy #bNoConfirm lda (pData),y bmi .21 no prompt, nothing to create, enter subdir jsr CS.RUN.OVERWRITE.MSG bcs CS.RUN.DIR.RTS .1 >SLEEP >SYSCALL GetChar bcs .1 cmp #3 beq .99 abort jsr CS.RUN.ToUpper cmp #'N' bne .2 jmp CS.RUN.CR.NEXT no overwrite, nothing to do, no recurse .2 cmp #'Y' beq .21 no create, but recurse cmp #'A' bne .1 ldy #bNoConfirm lda #$ff sta (pData),y .21 clc lda #0 bra .4 .3 ldy #hDstFullPath jsr CS.RUN.GetPathY >SYSCALL MKDir .4 jsr CS.RUN.CheckErr bcs CS.RUN.DIR.RTS jsr CS.RUN.IncCount .FIN >LDYA ZPFileName jmp EnterSubDirYA .99 ldy #RC lda (pData),y get global RC in case of bContinue sec CS.RUN.DIR.RTS rts *-------------------------------------- CS.RUN.FILE jsr CS.RUN.FILE.MSG bcs CS.RUN.DIR.RTS .DO X.COPY.TO.DEST=1 ldy #hDstFullPath jsr CS.RUN.GetPathY >PUSHYA >PUSHW L.STAT >SYSCALL Stat bcs .2 File Not exists...go create ldy #bNoConfirm lda (pData),y bmi .2 no prompt, ovverwrite jsr CS.RUN.OVERWRITE.MSG bcs .9 .1 >SLEEP >SYSCALL GetChar bcs .1 cmp #3 beq .99 abort jsr CS.RUN.ToUpper cmp #'N' bne .11 jmp CS.RUN.CR.NEXT no overwrite exit .90 rts .11 cmp #'Y' beq .12 copy cmp #'A' bne .1 ldy #bNoConfirm lda #$ff sta (pData),y .12 jsr GetEntry get back current entry corrupted by SLEEP .2 .DO X.DELETE.SOURCE=1 mv file, check if srcbase=dstbase ldy #hSrcBasePath jsr CS.RUN.GetPathY >PUSHYA ldy #hDstBasePath jsr CS.RUN.GetPathY >SYSCALL StrCaseCmp bcs .3 not same dir, go copy/delete jsr CS.RUN.Rename jsr CS.RUN.CheckErr bcs .9 jmp CS.RUN.NEXT .FIN .3 jsr CS.RUN.CopyStart bcc .4 jsr CS.RUN.CheckErr bcs .9 jmp CS.RUN.NEXT .FIN .4 .DO X.DELETE.SOURCE=1 ldy #hSrcFullPath lda (pData),y ldy #hToDelete sta (pData),y .FIN clc .9 rts .99 ldy #RC lda (pData),y get global RC in case of bContinue sec rts *-------------------------------------- CS.RUN.DIR.MSG sec .HS 90 bcc opcode CS.RUN.FILE.MSG clc >LDA.G bQuiet bmi .8 bcc .1 >LDYA L.MSG.DIR bcs .2 .1 >LDYA L.MSG.FILE .2 >PUSHYA ldy #hSrcFullPath jsr CS.RUN.GetPathY >PUSHYA .DO X.COPY.TO.DEST=1 ldy #hDstFullPath jsr CS.RUN.GetPathY >PUSHYA >PUSHBI 4 .ELSE >PUSHBI 2 .FIN >SYSCALL PrintF rts .8 clc rts *-------------------------------------- .DO X.COPY.TO.DEST=1 CS.RUN.OVERWRITE.MSG >LDA.G bQuiet bmi .1 jsr CS.RUN.CR .1 >PUSHW L.MSG.OVERWRITE ldy #hDstFullPath jsr CS.RUN.GetPathY >PUSHYA >PUSHBI 2 >SYSCALL PrintF rts .FIN *-------------------------------------- CS.RUN.CR >PUSHW L.MSG.CRLF >PUSHBI 0 >SYSCALL PrintF rts *-------------------------------------- .DO X.COPY.TO.DEST=1 .DO X.DELETE.SOURCE=1 CS.RUN.Rename ldy #hSrcFullPath jsr CS.RUN.GetPathY >PUSHYA ldy #hDstFullPath jsr CS.RUN.GetPathY >PUSHYA >SYSCALL Rename bcs .9 jsr CS.RUN.IncCount .9 rts .FIN .FIN *-------------------------------------- .DO X.COPY.TO.DEST=1 CS.RUN.CopyStart ldy #hSrcFullPath lda #O.RDONLY jsr CS.RUN.Open bcs .99 >STA.G hSrcFile ldy #hDstFullPath lda #O.WRONLY+O.CREATE jsr CS.RUN.Open bcs .9 >STA.G hDstFile lda #$ff >STA.G bCopy inc >STA.G CopyRC Reset RC clc rts .9 pha >LDA.G hSrcFile >SYSCALL FClose pla sec .99 >STA.G CopyRC rts *-------------------------------------- CS.RUN.Open pha Save open mode jsr CS.RUN.GetPathY >PUSHYA pla >PUSHA ldy #S.STAT.P.TYPE >PUSHB (ZPFileStat),y ldy #S.STAT.P.AUXTYPE+1 >PUSHB (ZPFileStat),y dey >PUSHB (ZPFileStat),y >SYSCALL FOpen rts *-------------------------------------- CS.RUN.Copy >STZ.G hCopyBuf >LDYAI X.COPY.BUF.SIZE >SYSCALL GetMem bcs .9 >STYA ZPPtr1 txa >STA.G hCopyBuf >PUSHWI X.COPY.BUF.SIZE Bytes To Read >PUSHW ZPPtr1 Dst Ptr >LDA.G hSrcFile >SYSCALL FRead bcc .1 cmp #MLI.E.EOF bne .9 lda #0 bra .9 .1 >PUSHYA Bytes To Write >PUSHW ZPPtr1 Src Ptr >LDA.G hDstFile >SYSCALL FWrite bcs .9 >LDA.G hCopyBuf >SYSCALL FreeMem ldy #bQuiet lda (pData),y bmi .8 lda #'.' >SYSCALL PutChar rts .8 clc rts .9 ldy #CopyRC sta (pData),y >LDA.G hCopyBuf beq CS.RUN.CopyEnd >SYSCALL FreeMem *-------------------------------------- CS.RUN.CopyEnd >LDA.G hSrcFile >SYSCALL FClose >LDA.G hDstFile >SYSCALL FClose >STZ.G bCopy clc rts .FIN *-------------------------------------- CS.RUN.CheckErr bcs .1 >LDA.G bQuiet bmi .8 >LDYA L.MSG.OK >SYSCALL PutS .8 rts .1 pha >PUSHW L.MSG.ERR pla pha >PUSHA >PUSHBI 1 >SYSCALL PrintF >LDA.G bContinue eor #$80 asl pla rts *-------------------------------------- CS.RUN.BuildFilePath ldy #hSrcBasePath jsr CS.RUN.GetPathY >PUSHYA ldy #hSrcFullPath jsr CS.RUN.GetPathY >STYA ZPPtr1 >SYSCALL StrCpy >PUSHW ZPFileName >LDYA ZPPtr1 >SYSCALL StrCat .DO X.COPY.TO.DEST=1 ldy #hDstBasePath jsr CS.RUN.GetPathY >PUSHYA ldy #hDstFullPath jsr CS.RUN.GetPathY >STYA ZPPtr1 >SYSCALL StrCpy ldy #hDstFileName lda (pData),y beq .1 >SYSCALL GetMemPtr >PUSHYA bra .2 .1 >PUSHW ZPFileName .2 >LDYA ZPPtr1 >SYSCALL StrCat .FIN rts *-------------------------------------- CS.RUN.GetPathY lda (pData),y >SYSCALL GetMemPtr rts *-------------------------------------- CS.RUN.IncCount >INCW.G Count rts *-------------------------------------- CS.RUN.ToUpper cmp #'a' bcc .8 cmp #'z'+1 bcs .8 eor #$20 .8 rts *-------------------------------------- CS.DOEVENT sec rts *-------------------------------------- CS.QUIT jsr LeaveSubDir bcc CS.QUIT .DO X.COPY.TO.DEST=1 >LDA.G bCopy bpl .1 >LDA.G hSrcFile >SYSCALL FClose >LDA.G hDstFile >SYSCALL FClose .1 ldy #hDstFullPath jsr .7 ldy #hDstFilename jsr .7 .FIN ldy #hSrcFullPath jsr .7 ldy #hFilter .7 lda (pData),y beq .9 >SYSCALL FreeMem .9 clc rts *-------------------------------------- MAN SAVE USR/SRC/BIN/X.CPMVRM.S LOAD USR/SRC/BIN/CP.S ASM