NEWCOP ;		* * * * * * * * * * * * *
 ;		*  PROGRAM BY KIM WATT  *
 ;		* BREEZE COMPUTING INC. *
 ;		*     P.O. BOX  1013    *
 ;		* BERKLEY, MICH.  48072 *
 ;		*    (313)  288-9422    *
 ;		* * * * * * * * * * * * *											
 ;  THIS IS A FULL CAPABILITY COPY UTILITY.
 ;	IT WILL FUNCION SIMILIAR TO NEWDOS COPY
 ;	AND TAKES MAXIMUM USE OF RESIDENT DOS ROUTINES.
 ;  EITHER A PROGRAM COPY OR A FULL DISK COPY MAY
 ;	BE UTILIZED WITH FULL VERIFICATION
 ;
 DISPLY	EQU	4467H		;RESIDENT DISPLAY ROUTINE
 ENTRY	EQU	5200H		;ENTRY POINT
 INITL	EQU	4420H		;CREATE OR OPEN FILE 
 OPEN	EQU	4424H		;OPEN A FILE ROUTINE
 READ	EQU	4436H		;DISK READ ROUTINE
 WRITE	EQU	4439H		;DISK WRITE ROUTINE
 CLOSE	EQU	4428H		;CLOSE FILE ROUTINE
 DOS	EQU	402DH		;ENTRY TO DOS
 VALID	EQU	441CH		;CHECK FILENAME VALIDITY
 	ORG	5200H		;DOS UTILITY MEMORY
 ;  HL WILL POINT TO THE USER INPUT DIRECTLY AFTER
 ;	THE WORD COPY SO THAT THE SPECIFIED PARAMETERS
 ;	MAY NOW BE RECOVERED.
 	PUSH	HL		;SAVE INPUT POINTER
 	LD	A,0E5H		;CONTROL CODE FOR RST 28H
 	CALL	CPR1		;COMPARE ROUTINE
 	LD	HL,4D00H	;READ/WRITE BUFFER
 	LD	DE,PGMEND	;POINT TO END OF PROGRAM
 	LD	BC,100H		;256 BYTES
 	LDIR			;MOVE MESSAGES
 	POP	HL		;RESTORE INPUT POINTER
 	LD	D,H		;PASS POINTER
 	LD	E,L		;	TO DE
 	LD	A,(DE)		;GET THE NEXT CHARACTER
 	CP	':'		;	COLON ?
 	JP	NZ,FORIN	;CHECK FOR FOREIGN SYSTEM
 	LD	HL,DB2		;DRIVE # IN SOURCE DCB
 	CALL	CODEIT		;CONVERT TO ASCII
 	LD	A,(HL)		;GET THE CONVERSION
 	LD	(SCRMES+1),A	;SAVE INTO SOURCE MESSAGE
 	PUSH	DE		;SAVE INPUT POINTER
 	LD	HL,MSG16	;<SP>TO<SP> STRING
 	CALL	CPR2		;COMPARE ROUTINE
 	JP	NZ,ONEDRV	;SINGLE DRIVE COPY ?
 	POP	HL		;RESTORE INPUT POINTER
 	LD	HL,DBX2		;DRIVE # IN DEST DCB
 	CALL	DECODE		;CONVERT TO ASCII
 	LD	C,3		;3 PAIRS OF NUMBERS
 	LD	HL,MSG18	;WHERE THE DATE IS
 ;  WHEN DATNUM IS CALLED, IT WILL NOT RETURN HERE
 ;	IF THE DATE IS CORRECT.  IF DATE IS INCORRECT
 ;	CONTROL WILL RETURN TO THE TERMINATE ROUTINE.
 	CALL	DATNUM		;IS IT NUMERICAL
 	LD	HL,MSG8		;BAD DATE MESSAGE
 BYE	PUSH	HL		;SAVE MESSAGE POINTER
 	CALL	CR		;CARRIAGE RETURN
 	POP	HL		;RESTORE MESSAGE
 	CALL	DISPLY		;RESIDENT DISPLAY ROUTINE
 	CALL	NEEDSC		;DO WE NEED SYSTEM DISK ?
 	JP	4030H		;GO BACK TO DOS
 ERROR	PUSH	AF		;SAVE ERROR CODE
 	CALL	CR		;CARRIAGE RETURN
 	CALL	NEEDSC		;IS SYSTEM DISK NEEDED ?
 	POP	AF		;RESTORE ERROR CODE
 	OR	40H		;SET BIT 6 FOR DISPLAY
 	JP	4409H		;BACK TO DOS WITH ERROR
 SLASH	LD	A,(DE)		;GET NEXT CHARACTER
 	CP	(HL)		;IS IT A SLASH ?
 	RET	NZ		;NO IT ISN'T
 	INC	DE		;INCREMENT DATA POINTER
 	INC	HL		;INCREMENT COMPARE DATA
 DATNUM	LD	B,2		;2 CHARACTERS TO COMPARE
 NEXTNB	LD	A,(DE)		;GET ONE CHARACTER
 	CP	30H		;IS IT NUMERICAL ?
 	RET	C		;LESS THAN 0 IF CARRY
 	CP	(HL)		;CHECK WITH COMPARE DATA
 	RET	NC		;NON NUMERICAL
 	LD	(HL),A		;PUT IT INTO STORAGE
 	INC	DE		;INCREMENT
 	INC	HL		;	POINTERS
 	DJNZ	NEXTNB		;GET THE SECOND NUMBER ?
 	DEC	C		;DO IT 3 TIMES
 	JR	NZ,SLASH	;CHECK THE SLASH
 ;  AT THIS POINT THE DATE IS CORRECT, AND SO THE
 ;	RETURN ADDRESS IS POPPED OFF THE STACK.
 	POP	AF		;REMOVE RETURN ADDRESS
 	LD	HL,FULDAT+1	;FULL DISK COPY FLAG
 	INC	HL		;SET BIT 0
 	LD	A,(DB2)		;GET SOURCE DRIVE
 	LD	HL,DBX2		;DESTINATION DRIVE ADDR.
 	CP	(HL)		;SOURCE & DEST. SAME ?
 	JR	Z,ONEDRV	;ONE DRIVE COPY
 ;  IF 2 DRIVE COPY THEN ASK THAT THE PROPER DISKS
 ;	BE MOUNTED IN THE RESPECTIVE DRIVES.
 	LD	B,(HL)		;GET DEST. DRIVE INTO B
 	LD	HL,MSG10	;SOURCE DRIVE MESSAGE
 	CALL	SHOWIT		;DISPLAY THE MESSAGE
 	LD	A,B		;GET DEST DRIVE
 	LD	HL,MSG11	;DESTINATION DRIVE MESSG.
 	CALL	SHOWIT		;DISPLAY THAT TOO
 	JP	GOCOPY		;DO THE COPY
 ONEDRV	LD	DE,UREC		;USER RECORD
 	LD	HL,(4049H)	;GET TOP OF MEMORY
 	OR	A		;RESET THE CARRY FLAG
 	SBC	HL,DE		;COMPARE
 	LD	A,H		;A=256 * # FREE BYTES
 	INC	L		;ADD ONE FOR COMPARE
 	CP	L		;ENOUGH FOR ONE MORE
 	JR	C,ALOT		;YES THERE IS
 	DEC	A		;ADJUST FOR ONE LESS
 ALOT	CP	0C0H		;MORE THAN 192 ?
 	JP	NC,0		;BAD BAD BAD
 	LD	(SECTRS+1),A	;# OF SECTORS TO BE READ
 	LD	L,A		;GIVE TO HL FOR
 	LD	H,0		;	FOR INDEX
 	ADD	HL,DE		;SAVE FOR ID INFO.
 	LD	(HMANY),HL	;SAVE FOR LATER USE
 	LD	HL,MULCPY+1	;# OF DRIVE COPY FLAG
 	INC	(HL)		;FLAG SAYS ONE DRIVE COPY
 	LD	A,(FULDAT+1)	;GET FULL DISK COPY FLAG
 	OR	A		;SET THE FLAGS
 	JR	NZ,GOCOPY	;GO FOR THE FULL DISK
 	POP	HL		;RESTORE INPUT POINTER
 FORIN	LD	A,(HL)		;GET NEXT INPUT CHARACTER
 	CP	'$'		;FOREIGN SYSTEM SPECIFIED
 	JR	NZ,CKFIL1	;CHECK FILENAME
 	LD	(FRNDAT+1),A	;SET FOREIGN SYSTEM FLAG
 	INC	HL		;NEXT INPUT CHARACTER
 CKFIL1	LD	DE,DCBS		;SOURCE DCB
 	CALL	VALID		;CHECK VALIDITY
 	JR	NZ,BADFIL	;NZ=BAD FILENAME
 	DEC	HL		;BACK TO BEGINNING
 	LD	DE,MSG16	;<SP>TO<SP> STRING
 	CALL	CPR2		;CHECK FOR SYNTAX
 	JR	NZ,BADFIL	;BAD FILENAME
 CKFIL2	LD	DE,DCBD		;DESTINATION DCB
 	CALL	VALID		;CHECK VALIDITY
 	JR	Z,FORTST	;CHECK FOR FOREIGN STATUS
 	CP	':'		;NEW DRIVE SPECIFIED ?
 	JR	Z,CHANGE	;FIX THE DCB
 	CP	'.'		;NEW PASSWORD ?
 	JR	Z,CHANGE	;FIX THE DCB
 	CP	'/'		;NEW EXTENSION ?
 	JR	Z,CHANGE	;FIX THE DCB
 	CP	0DH		;CARRIAGE RETURN ?
 	JR	NZ,BADFIL	;BETTER BE
 	LD	A,3		;TERMINATOR
 CHANGE	LD	C,A		;PASS CHARACTER TO C
 	LD	B,0		;ZERO IT FOR NOW
 	DEC	HL		;POINT TO PART TO CHANGE
 	LD	DE,DCBS		;SOURCE DCB
 NEXTCH	LD	A,(DE)		;GET A CHARACTER
 	CP	C		;IS IT THE ONE WE WANT?
 	JR	Z,FIXDCB	;FOUND THE ONE LIKE IT
 	INC	DE		;NEXT DCB POINTER
 	INC	B		;# OF CHARACTERS TO FIX
 	CP	3		;TERMINATOR ?
 	JR	NZ,NEXTCH	;GET THE NEXT ONE
 BADFIL	LD	HL,MSG4		;BAD FILESPEC MESSAGE
 	JP	BYE		;SAID THE WRONG WORD
 FIXDCB	DEC	HL		;REDUCE BOTH
 	DEC	DE		;	POINTERS
 	LD	A,(DE)		;GET THE CHARACTER AND
 	LD	(HL),A		;SAVE INTO DCB
 	DJNZ	FIXDCB		;KEEP GOING
 	JR	CKFIL2		;CHECK FILENAME VALIDITY
 FORTST	LD	A,(FRNDAT+1)	;GET FOREIGN STATUS
 	OR	A		;SET THE FLAGS
 	LD	DE,PGMEND	;BEFORE THE DCB'S
 	CALL	NZ,OPEN		;OPEN THE FILE
 GOCOPY	CALL	CR		;CARRIAGE RETURN TO VIDEO
 SOURCE	LD	DE,DCBS		;SOURCE DCB
 	LD	HL,MSG10	;SOURCE MESSAGE
 	CALL	DESPT1		;SET UP THE POINTERS
 	LD	HL,(DB6)	;OFFSET INFORMATION
 	LD	(BUFFER),HL	;SAVE INTO THE BUFFER
 	LD	A,H		;GET THE HIGH NIBBLE
 	OR	L		;ANY BITS ON ?
 	CALL	Z,MULSEC	;MULTIPLE SECTORS
 	LD	HL,(MSG5)	;TRACK ON VIDEO
 	LD	(TRACK),HL	;SAVE INTO THE COMMAND
 	LD	A,(MSG6)	;SECTOR ON VIDEO
 	LD	(SECTOR),A	;PASS IT TO COMMAND
 SECTRS	LD	C,0AH		;NUMBER OF SECTORS
 ;  THE ABOVE NUMBER WAS MODIFIED IF A SINGLE DRIVE
 ;	COPY WAS SPECIFIED TO THE MAXIMUM NUMBER
 ;	OF SECTORS THAT CAN FIT INTO MEMORY.
 	LD	B,C		;PASS TO BYTE COUNTER
 	LD	HL,MSG13	;READING MESSAGE
 	CALL	FULDAT		;CORRECT DISK IN DRIVE?
 READIT	CALL	FIXVID		;UPDATE VIDEO DISPLAY
 	CALL	READ		;READ DATA
 	JP	NZ,RUDONE	;ERROR ERROR
 	XOR	A		;ZERO THE ACCUMULATOR
 PUTBUF	LD	(IY),A		;SAVE ID TYPE INTO BUFF.
 	INC	IY		;FOR THE NEXT TRACK
 	INC	(IX+4)		;MSB OF BUFFER ADDRESS
 	DJNZ	READIT		;GET SOME MORE SECTORS
 ;  THE LAST COMMAND WILL READ
 ;	10 SECTORS ON A FULL DISK COPY
 ;	# OF SECTORS AVAILBLE IN MEMORY ON 1 DRIVE COPY
 ;	THE NEXT PROGRAM LINK FOR FILE COPY
 	LD	HL,SOURCE	;FOR A RETURN ADDRESS
 FIXRET	LD	(VECTOR+1),HL	;PUT INTO A JUMP COMMAND
 	CALL	BUFPT1		;SET UP POINTERS
 	LD	B,C		;# OF SECTORS
 	CALL	WHEREI		;VECTORS AND POINTERS
 	LD	HL,MSG14	;WRITING MESSAGE
 	CALL	FULDAT		;ADJUST NRN ETC.
 PUTPTC	CALL	FIXVID		;FIX THE VIDEO STUFF
 	LD	A,(IY)		;GET THE DATA ID BYTE
 	INC	IY		;POINT TO NEXT ONE
 	CP	6		;READ PROTECTED ?
 	JR	NZ,PUTRG	;WRITE REGULAR ID MARKS
 	LD	HL,46E7H	;POINT TO WRITE BYTE
 ;  46E7H CONTAINS A8 REGULARLY FOR A WRITE SECTOR BYTE
 ;	THIS IS CHANGED TO A9 FOR READ PROTECTED SECTOR
 	INC	(HL)		;MAKE IT A9
 	LD	A,(HL)		;GET IT
 	CP	0A9H		;IS IT A9 INDEED ?
 WHOA	JR	NZ,WHOA		;ENDLESS LOOP IF WRONG
 ;  THE ABOVE COMMAND IS TO PROTECT THE DISKETTE FROM
 ;	A BAD WRITE IN CASE NEWDOS IS NOT PRESENT
 	CALL	WRITE		;WRITE SOME INFORMATION
 	LD	(HL),0A8H	;RESTORE THE BYTE
 	JR	Z,PUTDON	;Z=SUCCESSFUL WRITE
 	CALL	NXTREC		;GET NEXT RECORD
 	LD	HL,(DBX5)	;DESTINATION TRACK
 	LD	(DBX6),HL	;FIX THE DATA CONTROL BLK
 	CP	6		;READ PROTECTED ?
 	JR	PUTDON		;CHECK IF DONE YET
 PUTRG	CALL	WRITE		;WRITE A REGULAR TRACK
 PUTDON	JR	NZ,NOGOOD	;NZ=BAD WRITE
 	INC	(IX+4)		;MSB OF BUFFER ADDRESS
 	DJNZ	PUTPTC		;KEEP WRITING SECTORS
 	CALL	WHEREI		;WHERE AM I ?
 	LD	IY,PGMEND	;POINT TO END OF PROGRAM
 	LD	B,C		;# SECTORS IN OPERATION
 	LD	HL,4D00H	;DOS DISK I/O BUFFER
 	LD	(DBX1),HL	;PUT INTO DEST. DCB
 	LD	HL,MSG15	;VERIFYING MESSAGE
 	CALL	FULDAT		;GET THE STUFF
 	LD	HL,(HMANY)	;HOW MANY NOW ?
 DOVER	PUSH	HL		;SAVE ON STACK FOR VERIFY
 	CALL	FIXVID		;FIX THE VIDEO DISPLAY
 	LD	A,(IY)		;HOW'D IT GO ?
 	INC	IY		;POINT TO NEXT ONE
 	CP	6		;READ PROTECTED ?
 	JR	NZ,REGRD	;REGULAR READ IF NZ
 	CALL	READ		;READ IT ANYWAY
 	JR	Z,TESTIT	;Z=OK READ
 	CALL	NXTREC		;NEXT RECORD
 	CP	6		;READ PROTECTED ?
 	JR	RDONE		;JUMP OVER REG. READ
 REGRD	CALL	READ		;REGULAR READ
 RDONE	JR	NZ,NOGOOD	;READ WAS NO GOOD
 	POP	HL		;TOP OF PROGRAM POINTER
 	PUSH	BC		;MUST SAVE BC AND DE
 	PUSH	DE		;	TILL VERIFY DONE
 	LD	DE,4D00H	;DUPLICATE BUFFER
 	LD	B,0		;256 BYTES TO CHECK
 COMPAR	LD	A,(DE)		;GET BYTE FROM BUFFER
 	CP	(HL)		;SAME ONE WE READ ?
 	LD	A,4		;ERROR CODE IF BAD
 	JR	NZ,NOGOOD	;BAD VERIFY
 	INC	DE		;INCREMENT BOTH
 	INC	HL		;	DATA POINTERS
 	DJNZ	COMPAR		;GO FOR # OF BYTES ASKED
 	POP	DE		;RESTORE NOW THAT
 	POP	BC		;	WE'RE DONE
 	DJNZ	DOVER		;ANY LEFT TO TEST ?
 VECTOR	JP	VECTOR		;DEAD END UNLESS FIXED !
 TESTIT	LD	A,11H		;LOST DATA DURING WRITE
 NOGOOD	JP	ERROR		;SAD CASE
 RUDONE	CP	6		;READ PROTECTED ERROR ?
 	JR	NZ,CHK1		;CHECK IT !
 	LD	HL,FULDAT+1	;IF FULL DISK COPY
 	BIT	0,(HL)		;WELL, IS IT ?
 	JR	Z,NOGOOD	;TERMINATE IN ERROR
 	CALL	NXTREC		;GET NEXT RECORD TO READ
 	JP	PUTBUF		;PUT INTO BUFFER AREA
 CHK1	CP	1CH		;WHICH BITS SET
 	JR	Z,GETSEC	;OK SO FAR
 	CP	1DH		;NOW WHICH BITS ARE SET ?
 	JR	NZ,NOGOOD	;TERMINATE COMMAND !
 GETSEC	LD	A,C		;# OF SECTORS
 	SUB	B		;# JUST READ
 	LD	C,A		;HOW MANY LEFT TO READ
 	LD	HL,PROCED	;FOR A RETURN ADDRESS
 	JP	NZ,FIXRET	;	DO IT !
 	CALL	BUFPT1		;SET UP POINTERS
 PROCED	CALL	CR		;CARRIAGE RETURN TO VIDEO
 	LD	A,(FULDAT+1)	;FULL DISK COPY ?
 	OR	A		;SET THE FLAGS
 	JR	NZ,FULLCY	;NZ=FULL DISK COPY
 FRNDAT	LD	A,0		;IF A FOREIGN SYSTEM
 	OR	A		;SET THE FLAGS
 	JR	Z,GETONE	;Z=NOT FOREIGN SYSTEM
 	XOR	A		;ZERO THE ACCUMULATOR
 	CALL	GETSYS		;SYSTEM DISKETTE MOUNTED?
 	LD	DE,PGMEND	;BEFORE DCB'S
 	CALL	CLOSE		;CLOSE THE FILE
 	CALL	BUFPT1		;WAIT FOR SOURCE DISK
 GETONE	LD	HL,(DB7)	;EOF DATA
 	LD	(DBX4),HL	;SAVE INTO DEST. DCB
 	LD	A,(DB4)		;MORE DATA TO PASS TO
 	LD	(DBX4),A	;	DEST. DCB
 	LD	DE,DCBD		;DESTINATION DCB
 	CALL	CLOSE		;CLOSE THE FILE
 DONECL	JR	NZ,NOGOOD	;BAD CLOSE DETECTED
 	CALL	NEEDSC		;IS SYSTEM DISK NEEDED?
 	JP	402DH		;BACK TO DOS
 FULLCY	LD	HL,MSG3		;FULL DISK COPY DONE MSG.
 	CALL	DISPLY		;RESIDENT DISPLAY ROUTINE
 	LD	A,(DBX2)	;DESTINATION DRIVE
 	LD	C,A		;PASS TO C REG.
 	CALL	4AF0H		;FIND DIRECTORY
 	JR	NZ,DONECL	;TERMINATE COMMAND
 	LD	HL,MSG18	;DATE OF COPY
 	LD	DE,4DD8H	;PUT INTO DIR. BUFFER
 	LD	A,C		;DESTINATION DRIVE
 	LD	BC,8		;8 BYTES TO MOVE
 	LDIR			;PUT 'EM THERE
 	LD	C,A		;GET IT BACK
 	CALL	4B03H		;UPDATE DIRECTORY
 	JR	DONECL		;DONE UPDATING
 BUFPT1	LD	DE,DCBD		;DESTINATION DCB
 	LD	HL,MSG11	;DESTINATION DRIVE MSG.
 DESPT1	PUSH	DE		;SAVE DCB
 	POP	IX		;	GIVE TO IX
 MULCPY	LD	A,0		;0 IF 2 DRIVE COPY
 	OR	A		;SET THE FLAGS
 	CALL	NZ,GETSDR	;GET SOURCE DRIVE MOUNTED
 	LD	A,(DE)		;FIRST BYTE IN DCB
 	BIT	7,A		;IS FILE OPEN ?
 	JR	NZ,DCBFIX	;FIX DCB
 	PUSH	BC		;BC = MESSAGE POINTER
 	LD	A,(MULCPY+1)	;MULTIPLE DRIVE COPY ?
 	OR	A		;SET THE FLAGS
 	JR	Z,LRLTYP	;GET LOGICAL RECORD TYPE
 	PUSH	DE		;SAVE DCB
 	LD	B,17H		;CHARACTERS IN FILENAME
 DCBOK	LD	A,(DE)		;CHECK THROUGH THE DCB
 	CP	3		;TERMINATOR ?
 	JR	Z,PUTIN		;PUT INTO DCB
 	CP	':'		;DRIVE ?
 	JR	Z,DCBXXX	;BAD FILESPEC
 	INC	DE		;NEXT DCB POINTER
 	DJNZ	DCBOK		;GET NEXT CHAR. IN DCB
 DCBXXX	LD	HL,MSG9		;BAD FILESPEC MESSAGE
 	JP	BYE		;OUT OF ROUTINE
 PUTIN	LD	A,':'		;PUT INTO ACCUMULATOR
 	LD	(DE),A		;PUT INTO THE DCB
 	INC	DE		;NEXT CHARACTER
 SCRMES	LD	A,10H		;DRIVE # FOR DISPLAY
 	ADD	A,30H		;MAKE IT ASCII
 	LD	(DE),A		;PUT INTO DCB
 	INC	DE		;NEXT CHARACTER
 	LD	A,3		;TERMINATOR BYTE
 	LD	(DE),A		;PUT IT INTO DCB
 	POP	DE		;RESTORE DCB BEGINNING
 LRLTYP	LD	B,0		;LOGICAL RECORD LENGTH
 	LD	A,(BUFPT1+1)	;HOPEFULLY ZERO
 	CP	E		;LSB OF DCB POINTER
 	JR	Z,MAKE1		;CREATE THE FILE
 	CALL	OPEN		;ELSE OPEN THE FILE
 	JR	NZ,ENDIT	;BADNESS DETECTED
 	JR	SAVEIT		;GO ON
 MAKE1	CALL	INITL		;CREATE A FILE
 	JR	NZ,ENDIT	;MORE BADNESS
 	LD	BC,(DB2)	;SOURCE DRIVE #
 	LD	A,B		;GET HIGH NIBBLE
 	CP	(IX+7)		;DEC OF FILES FPDE
 	JR	NZ,SAVEIT	;SAVE THE DARN THING
 	LD	A,C		;SOURCE DRIVE
 	CP	(IX+6)		;RELATIVE DRIVE
 	JR	NZ,SAVEIT	;NOW WE KNOW WHAT IT IS
 	LD	A,(MULCPY+1)	;MULTIPLE DRIVE COPY ?
 	OR	A		;SET THE FLAGS
 	LD	HL,MSG6		;POINT TO CURRENT SECTOR
 	JP	Z,BYE		;DONE WITH ROUTINE
 SAVEIT	POP	BC		;READ/WRITE/VERIFY MESG.
 DCBFIX	LD	(IX+3),L	;PUT THE BUFFER POINTER
 	LD	(IX+4),H	;	INTO THE DCB
 	LD	IY,PGMEND	;END OF PROGRAM
 	RET			;DONE WITH POINTERS
 GETSDR	LD	A,(SCRMES+1)	;IF SOURCE DRIVE MOUNTED
 SHOWIT	PUSH	BC		;SAVE MESSAGE POINTER
 	PUSH	DE		;SAVE DCB
 	PUSH	AF		;IF DISK IF MOUNTED
 	PUSH	HL		;BUFFER POINTER
 	CALL	CR		;CARRIAGE RETURN TO VIDEO
 	LD	HL,MSG1		;PRESS ENTER MESSAGE
 	CALL	DISPLY		;RESIDENT DISPLAY ROUTINE
 	POP	HL		;SOURCE/DESTINATION
 	CALL	DISPLY		;DISPLAY THAT TOO
 	POP	AF		;GET IF MOUNTED
 	OR	A		;SET THE FLAGS
 	JR	NZ,ASCII	;MAKE INTO ASCII
 	LD	(NEEDSC+1),A	;SAVE DRIVE NUMBER
 ASCII	ADD	A,30H		;ADJUST FOR ASCII
 	LD	(MSG2B),A	;SAVE INTO MESSAGE
 	LD	HL,MSG2		;DISKETTE MOUNTED MSG.
 	CALL	DISPLY		;SHOW IT ON VIDEO
 	LD	BC,8000H	;DELAY FOR ENTER KEY
 	CALL	60H		;DELAY LOOP
 WAIT	CALL	49H		;GET A KEY
 	CP	0DH		;ENTER PRESSED ?
 	JR	NZ,WAIT		;WAIT SOME MORE
 	CALL	CR		;CARRIAGE RETURN TO VIDEO
 	POP	DE		;RESTORE THE REST
 	POP	BC		;	OF THE POINTERS
 	RET			;ALL DONE
 CODEIT	INC	DE		;NEXT INPUT CHARACTER
 DECODE	LD	A,(DE)		;GET DRIVE NUMBER
 	SUB	30H		;REMOVE ASCII
 	CP	4		;MORE THAN DRIVE 3 ?
 	JR	NC,SPACE	;BAD DRIVE # !
 	LD	(HL),A		;SAVE INTO PROGRAM
 	INC	DE		;POINT TO NEXT
 	RET	Z		;ALL IS OK !
 SPACE	LD	A,20H		;ILLEGAL DRIVE ERROR
 ENDIT	JP	ERROR		;ERROR HAS OCCURED
 MULSEC	LD	A,(FULDAT+1)	;FULL DISK COPY ?
 	OR	A		;SET FLAGS
 	RET	Z		;NO IT ISN'T
 	LD	C,(IX+6)	;RELATIVE DRIVE #
 	CALL	44E8H		;MYSTERY ROUTINE !
 	JR	NZ,ENDIT	;END THE WHOLE ROUTINE
 	LD	(NUMSEC+1),A	;# SECTORS IN OPERATIONS
 ;  THE FOLLOWING IS A MULTIPLY BY 10 ROUTINE
 ;	ENTER=A 	EXIT=HL
 	LD	L,A		;PASS THE LOW BYTE
 	LD	H,0		;ZERO THE HIGH BYTE
 	LD	B,H		;PASS ALSO TO
 	LD	C,L		;	BC REG PAIR
 	ADD	HL,HL		;DOUBLE IT
 	ADD	HL,HL		;QUADRUPLE IT
 	ADD	HL,BC		;MAKE IT 5 TIMES
 	ADD	HL,HL		;DOUBLE IT AGAIN
 	LD	(DB7),HL	;SAVE INTO DCB
 	RET			;DONE WITH ROUTINE
 FULDAT	LD	A,0		;IF FULL DISK COPY FLAG
 	OR	A		;SET THE FLAGS
 	RET	Z		;10 SECTORS READ
 	PUSH	BC		;SAVE 'EM BOTH
 	PUSH	DE
 	LD	A,1DH		;BEGINNING OF LINE
 	CALL	33H		;	ON VIDEO
 	SUB	57H		;"W" COMPARE
 	OR	(IX+0AH)	;NEXT RECORD
 	OR	(IX+0BH)	;	NUMBER
 	JR	NZ,MESG1	;DISPLY TRACK/SECTOR
 NUMSEC	LD	B,0		;# OF READ SECTORS
 ;  THE ABOVE LOAD IS MODIFIED BY ROUTINES ELSEWHERE
 	LD	C,(IX+6)	;GET DRIVE #
 	LD	A,0F5H		;FOR RST 28H
 	CALL	CPR1		;COMPARE ROUTINE
 	JP	NZ,4030H	;NZ=NOT TRUE, EXIT TO DOS
 MESG1	CALL	DISPLY		;DISPLAY ROUTINE
 	LD	HL,MSGZZ	;TRACK/SECTOR MESSAGE
 	CALL	DISPLY		;DISPLAY IT
 	POP	DE		;RESTORE BOTH
 	POP	BC		;	REGISTER PAIRS
 	RET			;DONE WITH ROUTINE
 FIXVID	LD	A,(FULDAT+1)	;NZ IS FULL DISK COPY
 	OR	A		;SET FLAGS
 	RET	Z		;BACK IF NOT FULL DISK
 	PUSH	BC		;MUST SAVE BOTH
 	PUSH	DE		;REGISTER PAIRS
 	LD	B,4		;4 BACKSPACES
 MOREBK	LD	A,8		;BACKSPACE CODE
 	CALL	33H		;DO IT
 	DJNZ	MOREBK		;MORE BACKSPACES
 	LD	HL,MSG5	;POINT TO TRACK #
 	CALL	DISPLY		;DOS DISPLAY ROUTINE
 	POP	DE		;RESTORE BOTH
 	POP	BC		;	DE AND BC
 	LD	A,'9'		;COMPARE IF END SECTOR
 	LD	HL,MSG6	;POINT TO SECTOR #
 	INC	(HL)		;ADD ONE MORE
 	CP	(HL)		;IS IT 9 ?
 	RET	NC		;LESS OR EQUAL TO
 	LD	(HL),'0'	;ELSE MAKE IT A 0
 	LD	HL,MSG5+1	;LSB OF TRACK #
 	INC	(HL)		;ADD ONE MORE
 	CP	(HL)		;IS IT 9 ?
 	RET	NC		;LESS OR EQUAL TO
 	LD	(HL),'0'	;ZERO IT OUT
 	DEC	HL		;MSB OF TRACK #
 	INC	(HL)		;ONE ONE HERE IF 10 SECS.
 	RET			;DONE WITH VIDEO ADJUST
 WHEREI	DEFB	21H		;LD HL COMMAND
 BUFFER	DEFW	0		;BUFFER POINTER FOR DCB
 	LD	(DBX5),HL	;SAVE INTO DCB
 	DEFB	21H		;LD HL COMMAND
 TRACK	DEFW	0		;CURRENT TRACK
 	LD	(MSG5),HL	;SAVE INTO TRACK MESSG.
 	DEFB	3EH		;LD A COMMAND
 SECTOR	DEFB	0		;CURRENT SECTOR
 	LD	(MSG6),A	;SAVE INTO SECTOR MESSG.
 	RET			;VIDEO ALL FIXED UP
 CR	LD	A,0DH		;CARRIAGE RETURN BYTE
 	JP	33H		;DISPLAY ROUTINE
 NXTREC	INC	(IX+0AH)	;INCREMENT NEXT RECORD
 	RET	NZ		;LESS THAN 10
 	INC	(IX+0BH)	;INCREMENT MSB
 	RET			;DONE WITH DCB ADJUST
 NEEDSC	LD	A,(0FFH)	;IF SOURCE DRIVE MOUNTED
 	OR	A		;SET THE FLAGS
 	RET	NZ		;NOTHING DONE
 GETSYS	LD	HL,MSG12	;SYSTEM DISK MESSAGE
 	JP	SHOWIT		;SHOW THE MESSAGE
 CPR1	RST	28H		;FIX HL,DE
 CPR2	LD	B,4		;4 CHARACTER COMPARE
 CPR3	LD	A,(DE)		;GET A CHARACTER
 	CP	(HL)		;THE SAME ?
 	RET	NZ		;NO THEY'RE NOT
 	INC	DE		;INCREMENT BOTH
 	INC	HL		;	POINTERS
 	DJNZ	CPR3		;KEEP GOING
 	RET			;COMPARE COMPLETE Z FLAG
 ;  FOLLOWING 32 BYTE AREA IS USED FOR SOURCE DCB
 DCBS	DEFB	80H		;1'ST BIT SET IF OPEN
 	DEFB	20H		;SECTOR OPERATIONS
 	DEFB	0		;WHO KNOWS WHAT IT'S FOR?
 DB1	DEFW	0		;BUFFER ADDRESS
 	DEFB	0		;RELATIVE POSIT. IN SECT.
 DB2	DEFB	0		;RELATIVE DRIVE
 DB3	DEFB	0		;DEC OF FPDE
 DB4	DEFB	0		;LSB OF EOF
 DB5	DEFB	0		;LOGICAL RECORD LENGTH
 DB6	DEFW	0		;NEXT BYTE TO PROCESS
 DB7	DEFW	0		;RELATIVE OFFSET OF EOF
 	DEFW	0		;SAME AS 23-24 OF FPDE
 ; 4 FOUR BYTE EXTENT ELEMENTS
 	DEFS	10H		;SAVE THE MEMORY
 ;  FOLLOWING IS USED AS DESTINATION DCB
 DCBD	DEFB	80H		;BIT 7 IF FILE OPEN
 	DEFW	0
 DBX1	DEFW	0
 	DEFB	0
 DBX2	DEFB	0		;RELATIVE DRIVE #
 	DEFW	0
 DBX4	DEFB	0		;LRL
 DBX5	DEFW	0
 DBX6	DEFW	0
 	DEFW	0
 	DEFW	0
 DBX7	DEFB	0
 DBX8	DEFB	0
 	DEFW	0
 	DEFW	0
 	DEFW	0
 DBX10	DEFB	0
 DBX11	DEFB	0
 	DEFS	4
 HMANY	DEFW	0		;SECTOR ID MARKS
 MSG1	DEFM	'PRESS "ENTER" WHEN '
 	DEFB	3		;TERMINATOR
 PGMEND	EQU	MSG1		;WHERE END OF PROGRAM
 MSG2	DEFM	'DISKETTE MOUNTED ON DRIVE '
 MSG2B	DEFB	'0'		;WHICH DRIVE TO MOUNT
 	DEFB	0DH		;CARRIAGE RETURN
 MSG3	DEFM	'FULL DISKETTE COPY DONE'
 	DEFB	0DH
 MSG4	DEFM	'BAD FILESPEC'
 	DEFB	0DH
 MSGZZ	DEFM	' TRACK, SECTOR '
 MSG5	DEFM	'00,'
 MSG6	DEFM	'0'
 	DEFB	3		;TERMINATOR
 MSG7	DEFM	'SOURCE & DEST. SAME FILE'
 	DEFB	0DH
 MSG8	DEFM	'BAD DATE'
 	DEFB	0DH
 MSG9	DEFM	'BAD FILESPEC'
 	DEFB	0DH
 MSG10	DEFM	'SOURCE'
 	DEFB	3
 MSG11	DEFM	'DESTINATION'
 	DEFB	3
 MSG12	DEFM	'** SYSTEM  **'
 	DEFB	3
 MSG13	DEFM	'READING  '
 	DEFB	3
 MSG14	DEFM	'WRITING  '
 	DEFB	3
 MSG15	DEFM	'VERIFYING'
 	DEFB	3
 MSG16	DEFM	' TO '		;FOR COMMAND COMPARE
 MSG17	DEFB	':'		;FOR DRIVE #
 MSG18	DEFM	'00/00/00'	;FOR NEW COPY DATE
 UREC	DEFB	0		;AREA USED FOR TRANSFER
 	END	ENTRY
