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
				>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 #hDstFullPath
				jsr CS.RUN.GetPathY

				>PUSHYA
				ldy #hSrcFullPath
				jsr CS.RUN.GetPathY

				>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
