;
; * AND 1-8.  FAST DIRECTORY LIST
;
FASTDD	STA	PAR+2
	LDA	#':'
	STA	PAR+1
	BNE	DOFDD
;
FASTDIR	STA	PAR+1
	LDA	#':'
	STA	PAR+2
DOFDD	LDA	#'*'
	STA	PAR+3
	STA	PAR+4
	LDA	#'D'
	STA	PAR
	LDA	#$9B
	STA	PAR+5		;fix the 174 errors in menu [Bob Puff]
	STA	CPYTYP
	STA	DELIM
	BNE	DODIRL
;
; A.  DIRECTORY LIST
;
DIRLST	DB	'Files to list, Destination?',$9B,0
	LDA	#$9B
	STA	CPYTYP
	JSR	GETFN
	JSR	DEFPAR
DODIRL	LDA	#LOW[PAR]
	LDY	#HIGH[PAR]
	JSR	DBUF10
	LDX	#$10
	STX	CSRC		;IOCB10 IS SOURCE
	JSR	OPDIR		;OPEN IOCB10 AS DIRECTORY
;
	LDA	#HIGH[TEMPBUF+1]
	STA	BUFAD+1
	LDA	#LOW[TEMPBUF+1]
	STA	BUFAD
;
	LDA	#38
	STA	BUFLEN
	LDA	#0
	STA	BUFLEN+1
;
	LDX	#$00		;CDES=IOCB00
	LDA	DELIM
	BMI	CPY1FSP
	LDA	DELIM
	BMI	SGFCPY
	JSR	GETFN2
	STY	IBUF+$20
	STA	IBUF+1+$20
SGFCPY	LDX	#$20
	LDA	#GETCHR
	BNE	DOCALL
;
CPY1FSP	LDA	#GETREC
DOCALL	STX	CDES
	JSR	COPYF
	JMP	MENUSL	;THEN RETURN TO CMD. LINE
;
BADRN	JSR	ERRXIT
	DB	'Need new file name!',$9B,0
CANTDV	JSR	ERRXIT
	DB	'No drive or directories allowed in new name!',$9B,0
;
LKMSG	DB	'Lock ',0
ULMSG	DB	'Unlock ',0
DELMSG	DB	'Delete ',0
;
; D.  DELETE FILE(S)
;
DELFIL	DB	'Delete what file?',$9B,0
	LDY	#LOW[DELMSG]
	LDX	#HIGH[DELMSG]
	LDA	#DELETE
	BNE	DOCMD
;
; F.  LOCK FILES
;
LKFIL	DB	'Lock which file?',$9B,0
	LDY	#LOW[LKMSG]
	LDX	#HIGH[LKMSG]
	LDA	#LOCK
	BNE	DOCMD	;GET FILE NAME THEN LOCK IT
;
; G.  UNLOCK FILES
;
ULKFIL	DB	'Unlock which file?',$9B,0
	LDY	#LOW[ULMSG]
	LDX	#HIGH[ULMSG]
	LDA	#UNLOCK
;
DOCMD	STY	SECSIZ
	STX	SECSIZ+1
	PHA
	JSR	GETFN
	JSR	CKDSK
	LDX	OPT
	CPX	#'N'	;IF '/N' THEN DO IT THE EASY WAY
	BEQ	AFTCHK
	JSR	PRINT
	DB	'Answer ',$27,'Y',$27
	DB	' or ',$27,'N',$27,$9B,0
	PLA
	JSR	SETSCN
;
RDFN	JSR	SCNDIR
	BCS	DELX	;IF END OF DIRECTORY
	LDA	SECSIZ
	LDX	SECSIZ+1
	JSR	PRTMSG
	LDA	#LOW[PAR]
	LDX	#HIGH[PAR]
	JSR	PRTMSG
	JSR	PRINT
	DB	'?',0
	JSR	CHRGET
	CMP	#'Y'
	BNE	NODELT
	LDX	#$20
	JSR	CIOCL	;DELETE THE FILE THEN
NODELT	JMP	RDFN
;
SMPLCMD	PHA
	JSR	GETFN	;GET FILE NAME
	JSR	CKDSK	;VERIFY A DISK FILE
AFTCHK	PLA
ISSCMD	STA	ICMD+$10
	LDX	#$10
	JSR	CIOCL
	LDA	ICMD+$10
	CMP	#41
	BEQ	SETFNJ
DELX	JMP	MENUSL
SETFNJ	JMP	SETFNM
JCANTDV	JMP	CANTDV
JBADRN	JMP	BADRN
;
; E.  RENAME FILE(S)
;
RENFIL	DB	'File to rename, new name?',$9B,0
	JSR	GETFN
	JSR	CKDSK
	LDY	PTR
	LDA	DELIM
	CMP	#','
	BEQ	CKNAM2
	CMP	#' '
	BNE	JBADRN
CKNAM2	INY
	LDA	(FNPTR),Y
	CMP	#':'
	BEQ	JCANTDV
	CMP	#'>'		;check for sparta type
	BEQ	JCANTDV
	CMP	#'0'
	BCC	DOREN
	CMP	#'z'+1
	BCC	CKNAM2
DOREN	LDA	#RENAME
	BNE	ISSCMD
;
; Q.  MAKE A DIRECTORY
;
MKDIR	DB	'Full directory name?',$9B,0
	LDX	#8
	STX	IAUX+$10
	LDA	#34	;MAKE DIR. COMMAND
	JMP	SMPLCMD
;
; R.  SET DIRECTORY
;
SETDIR	DB	'Directory to be used as ',$27,'D:',$27,'?',$9B,0
	JSR	GETFN
	JSR	CKDSK
	LDY	PTR	;DRIVE OR NULL?
	CPY	#4
	BCC	CPYDNE
	LDA	#41
	JMP	ISSCMD
;
SETFNM	LDX	#0
	LDA	PTR
	EOR	#4
	BEQ	ZAPNAM
	LDY	#1
	LDA	#':'
	CMP	(FNPTR),Y
	BNE	ALLNEW	;IF NOT SUBDIRECTORY
FNDEND	INX
	LDY	FNAME-1,X
	BNE	FNDEND	;END OF OLD DIR?
	STA	FNAME-1,X
;
ALLNEW	INY
	BEQ	CPYDNE
	CMP	(FNPTR),Y
	BNE	ALLNEW
	DEX		;POINT BACK AT ':'
	BEQ	CPY1ST	;IF START, NO ':' TO PRESERVE
;
CPYNAM	INX
CPY1ST	INY
	LDA	(FNPTR),Y
ZAPNAM	STA	FNAME,X
	BNE	CPYNAM
	JMP	MENUSL
;
CPYDNE	JSR	ERRXIT
	DB	'Invalid directory!',$9B,0
;
; SINGLE FILE (DEVICE) COPY
;
TOERR1	JMP	CIOER1
SGCOPY	LDX	#$10
	STX	CSRC	;SOURCE IS IOCB10
	JSR	SOPEN
	DB	4	;INPUT
	DB	OPEN	;OPEN FUNCTION
	DW	PAR	;INPUT DEVICE NAM
	BMI	TOERR1
	JMP	SGFCPY
;
; C.  COPY FILES
;
DUPFIL	=	*
CPYFIL	DB	'File source, destination?',$9B,0
	LDA	#' '
	STA	PAR3+2	;DEFINE CHAR 3 OF DEVICE NAME
	LDA	#$9B
	STA	CPYTYP
	JSR	GETFN	;GET SOURCE FILE NAME
;
	LDA	#HIGH[DUPEND]
	STA	BUFAD+1
	LDA	#LOW[DUPEND]
	STA	BUFAD
;
	LDA	MEMTOP
	SEC
	SBC	#LOW[DUPEND]
	STA	BUFLEN
	LDA	MEMTOP+1
	SBC	#HIGH[DUPEND]
	STA	BUFLEN+1
;
	JSR	DEFPAR
	LDA	DELIM
	BMI	SFNAME
	JSR	GETFN2
	LDA	#0
SFNAME	STA	SWPFLG
	ASL	WARMST
	LDA	FNPTR+1
	STA	IBUF+1+$20
	LDA	FNPTR
	STA	IBUF+$20
	LDA	PAR	;DISK DEVICE?
	CMP	#'D'
	BNE	SGCOPY
	LDA	#LOW[PAR]
	LDY	#HIGH[PAR]
	JSR	DBUF10
;
	LDA	#'?'
	LDY	#11
QQQ	STA	PAR2-1,Y
	DEY
	BNE	QQQ
;
	JSR	CWFSD
	LDX	#$10
	JSR	OPDIR	;OPEN IOCB10 AS DIRECTORY
;
	LDY	#$FF
CPSCL1	INY
	LDA	(FNPTR),Y
	STA	PAR3,Y
	BNE	CPSCL1
CPSCL2	DEY
	LDA	(FNPTR),Y
	CMP	#'>'		;account for sparta type
	BEQ	CPSCL3
	CMP	#':'
	BNE	CPSCL2
CPSCL3	INY
	STY	FNPT2
	LDA	(FNPTR),Y
	BEQ	OPINP
;
	LDX	#0	;SCAN -PAR- STARTING AT 1-ST BYTE
MVMSK	LDA	(FNPTR),Y
	BMI	WCOPYB	;1 FILESPEC COPY??
	CMP	#'*'
	BEQ	MVNML
	CMP	#'.'
	BCC	WCOPYB
	BNE	DOSTOR
	LDA	#' '
	DEY
DOSTOR	STA	PAR2,X
	INY
MVNML	INX
	CPX	#8
	BCC	MVMSK
SKPPRD	INY
MVEXT	LDA	(FNPTR),Y
	BEQ	WCOPYB
	CMP	#'.'
	BEQ	SKPPRD	;IF A PERIOD, SKIP OVER IT
	CMP	#'*'
	BEQ	OPINP
	CMP	#' '
	BEQ	WCOPYB
	CMP	#','
	BEQ	WCOPYB
	CMP	#$9B
	BEQ	WCOPYB
	INY
SAVBLK	STA	PAR2,X
	INX
	CPX	#11
	BCC	MVEXT
	BCS	OPINP
;
WCOPY	JSR	CWFSD
OPINP	JSR	SCNDIR
	BIT	CBYTE
	BMI	OPINP
	BCC	WCNEXT
	JMP	MENUSL
;
WCOPYB	LDA	#' '
	BNE	SAVBLK
WCNEXT	LDA	#HIGH[PAR3]
	STA	IBUF+$30+1
	LDA	#LOW[PAR3]
	STA	IBUF+$30
;
	LDX	#0
	LDY	FNPT2
WCNBLD	LDA	PAR2,X
	BEQ	TERMX
	CMP	#'?'
	BNE	STWCC
	LDA	DATA+2,X
STWCC	STA	PAR3,Y
	CMP	#' '
	BEQ	OVWRTC
	INY
OVWRTC	INX
	CPX	#8
	BCC	WCNBLD
	LDA	#'.'
	STA	PAR3,Y
	INY
WCEBLD	LDA	PAR2,X
	BEQ	TERMX
	CMP	#'?'
	BNE	STWCEC
	LDA	DATA+2,X
STWCEC	STA	PAR3,Y
	CMP	#' '
	BEQ	OVWRTE
	INY
OVWRTE	INX
	CPX	#11
	BCC	WCEBLD
TERMX	LDA	#'.'
	CMP	PAR3-1,Y
	BNE	NOTOVP
	DEY
NOTOVP	LDA	#$9B
	LDX	OPT
	CPX	#'Q'
	BNE	NOQUERY
	LDA	#'?'
NOQUERY	STA	PAR3,Y
	LDA	#0
	STA	PAR3+1,Y
;
	LDA	CPYTYP
	BNE	DOONE
	LDA	#LOW[PAR]
	LDX	#HIGH[PAR]
	JSR	PRTMSG
	JSR	PRINT
	DB	'-->',0
	LDA	#LOW[PAR3]
	LDX	#HIGH[PAR3]
	JSR	PRTMSG
	LDA	OPT
	CMP	#'Q'
	BNE	DOONE
	JSR	CHRGET
	CMP	#'Y'
	BNE	SKPCOP
DOONE	LDA	IAUX+5+$10
	STA	IAUX+5+$20
	LDX	#$20
	STX	CSRC
	LDA	#4
	STA	IAUX,X
	LDA	#LOW[PAR]
	LDY	#HIGH[PAR]
	JSR	DEFBUF
	LDA	#OPEN
	JSR	SCMD		;OPEN THE SOURCE FILE
	BMI	CPYERR
;
	LDX	#7
CKFDOS	LDA	CKDTST-1,X	;File name = DOS.SYS?
	CMP	PAR3+2,X
	BNE	NOXDOS		;No, handle it normally then
	DEX
	BNE	CKFDOS
;
;  COPYING DOS.SYS, SET UP FOR RENAME AND LOAD BOOT SECTORS
;
	LDA	PAR3+1
	STA	DOSRNM+1	;Stash the unit number in the rename buffer
	STA	DOSSYS+1
	LDA	#$60		;Change destination name to diamond-OS
	STA	PAR3+3
;
	CLC			;READ BOOT SECTORS
	JSR	DOBOOT		;DO BOOT I/O
;
;  THIS REALLY COPIES THE FILE . . .
;
NOXDOS	LDA	#HIGH[PAR3]
	STA	IBUF+$30+1
	LDA	#LOW[PAR3]
	STA	IBUF+$30
;
	LDX	#8		;IOCB $30 set up for writing
	STX	IAUX+$30
	LDX	#$30
	STX	CDES
	LDA	#GETCHR
	JSR	COPYF	;COPY FILE
;
	LDA	DOSRNM+1	;NEED TO RENAME DOS.SYS?
	BEQ	SKPCOP
;
;  WRITE THE BOOT SECTORS OUT TO THE DESTINATION AND RENAME BACK TO DOS.SYS
;
	JSR	FIXUPDOS	;FIX BOOT SECTORS, WRITE THEM, AND RENAME FILE
	LDA	#0		;CLEAR RENAME FLAG
	STA	DOSRNM+1
;
SKPCOP	LDA	CPYTYP
	BNE	TOEXIT
	JMP	WCOPY
TOEXIT	JMP	MENUSL
CPYERR	JMP	CIOER1
