*
* COPYDISK: Disk to Disk direct copy utility
*
* Copyright 1983-2005 Dave Dunfield
* All rights reserved.
*
MAXBUF	EQU	OSEND-BUFFER/512 # SECTORS TO BUFFER
*
	ORG	OSRAM		PROGRAM LOCATION
* TEST FOR HELP REQUEST
CPYDSK	CMPA	#'?'		HELP?
	BNE	QUAL		NO
	SSR	25		OUTPUT MESSAGE
	FCCZ	'Use: COPYDISK[/PROMPT/QUIET] <source drive> <dest drive>'
	RTS
* TEST FOR QUALIFIERS
QUAL	LDA	,Y		GET CHAR FROM LINE
	CMPA	#'/'		QUALIFIER?
	BNE	MAIN		NO, START UP PGM
	LDX	#QTABLE		PT TO TABLE
	SSR	18		LOOKUP QUALIFIER
	CMPB	#NUMQ		IN RANGE?
	BHS	QERR		NO, INVALID
	LDX	#QFLAGS		PT TO FLAGS
	CLR	B,X		SET THE FLAG
	BRA	QUAL		GET NEXT
* QUALIFIER WAS INVALID, REPORT
QERR	SSR	24		MESSAGE
	FCCZ	/Invalid qualifier: '/
	LDA	,Y+		GET CHAR
QSHOW	SSR	33		DISPLAY IT
	SSR	5		LOOK FOR TERMINATOR
	BEQ	QEND		EXIT
	CMPA	#'/'		ALSO TERMINATOR
	BNE	QSHOW		SHOW EM ALL
QEND	SSR	25		MESSAGE
	FCCZ	/'/		CLOSING QUITE
	LDA	#1		BAD OPERAND RC
ABORT	SSR	0		RETURN TO OS
* DISK TO DISK COPY PROGRAM
MAIN	SSR	16		GET SOURCE
	BNE	ABORT		ERROR
	STA	>SOURCE		SAVE
	SSR	81		GET SIZE
	PSHS	A,B		SAVE
	SSR	16		GET DEST
	BNE	ABORT		ERROR
	STA	>DEST		SAVE
	SSR	81		GET SIZE
	CMPD	,S++		MATCH?
	BEQ	MAIN1		YES
	SSR	25
	FCCZ	'Incompatable drive sizes'
	LDA	#100
	RTS
* COPY DISK
MAIN1	STD	>DSIZE		SAVE DRIVE SIZE
	LDA	>PROMPT
	BNE	CPY		DON'T PROMPT
	SSR	88		PURGE
	SSR	24		OUTPUT MESSAGE
	FCCZ	'Insert disks, press <return>:'
	SSR	3		GET LINE
CPY	LDA	>SOURCE		GET SOURCE DRIVE
	SSR	76		SELECT
	CMPA	>DEST		SAME DRIVE?
	BNE	CPY1		NO
	SSR	24		MESSAGE
	FCB	$0D		CARRIAGE RETURN
	FCCZ	'Insert source disk, press <return>:'
	SSR	3		WAIT
* READ A BUFFER INTO MEMORY
CPY1	LDA	>QUIET
	BEQ	QUI1
	SSR	25
	FCB	$0D		CARRIAGE RETURN
	FCCZ	'Reading'
QUI1	LDX	#BUFFER		PT TO RAM AREA
	LDY	#MAXBUF		ZERO COUNT
RDB1	LDD	>RSECT		GET SECTOR ID
	CMPD	>DSIZE		OVER?
	BHS	RDEND		YES, EXIT
	TST	>QUIET
	BEQ	QUI2		NO SECTOR COUNT
	LDA	#$0D		GET CR
	SSR	33		OUTPUT
	LDD	>RSECT		RESTORE ADDRESS
	SSR	26
QUI2	SSR	92		READ SECTOR
	LBNE	EXIT		ERROR
	LEAX	512,X		ADVANCE
	ADDD	#1		ADVANCE NUM
	STD	>RSECT		RESAVE
	LEAY	-1,Y		ADVANCE COUNT
	BNE	RDB1		NO, ITS OK
RDEND	LDA	>DEST		GET DEST
	SSR	76		SELECT
	CMPA	>SOURCE		SAME AS SOURCE?
	BNE	CPY2		NO
	SSR	24		MESSAGE
	FCB	$0D		CARRIAGE RETURN
	FCCZ	'Insert destination disk, press <return>:'
	SSR	3		WAIT FOR RETURN
* WRITE A BUFFER FROM MEMORY
CPY2	LDA	>QUIET
	BEQ	QUI3
	SSR	25
	FCB	$0D		CARRIAGE RETURN
	FCCZ	'Writing'
QUI3	LDX	#BUFFER		PT TO RAM AREA
	LDY	#MAXBUF		ZERO COUNT
WRB1	LDD	>WSECT		GET SECTOR ID
	CMPD	>DSIZE		OVER?
	BHS	WREND		IF SO, QUIT
	TST	>QUIET
	BEQ	QUI4
	LDA	#$0D		CARRIAGE RETURN
	SSR	33
	LDD	>WSECT		RESTORE SECTOR ID
	SSR	26
QUI4	SSR	93		WRITE SECTOR
	BNE	EXIT		ERROR
	LEAX	512,X		NEXT
	ADDD	#1		ADVANCE
	STD	>WSECT		RESAVE
	LEAY	-1,Y		ADVANCE COUNT
	BNE	WRB1		MORE
WREND	LDD	>WSECT		RESTORE SECTOR
	CMPD	>DSIZE		OVER LIMIT
	LBLO	CPY		DO IT AGAIN SAM
	LDA	>QUIET
	BEQ	QUI5
	SSR	22		OUTPUT LFCR
QUI5	CLRA
EXIT	SSR	0
* QUALIFIER TEXT TABLE
QTABLE	FCB	$82		1 CHAR MATCH
	FCC	'/QUIET'
	FCB	$82
	FCC	'/PROMPT'
	FCB	$80		END OF TABLE
NUMQ	EQU	2		# OF QUALIFIERS
QFLAGS	EQU	*		QUALIFIER FLAG TABLE
QUIET	FCB	$FF		DON'T DISPLAY READ/WRITES
PROMPT	FCB	$FF		PROMPT FOR DISK SHANGE
* MISC VARAIBLES
RSECT	FDB	0		CURRENT READ SECTOR
WSECT	FDB	0		CURRENT WRITE SECTOR
SOURCE	RMB	1		SOURCE DRIVE
DEST	RMB	1		DESTINATION DRIVE
DSIZE	RMB	2		DRIVE SIZE
*
BUFFER	EQU	*
