ADVCOP ;		* * * * * * * * * * * * *
 ;		*  Program by Kim Watt  *
 ;		* Breeze Computing Inc. *
 ;		*     P.O. Box  1013    *
 ;		* Berkley, Mich.  48072 *
 ;		*    (313) 288-9422     *
 ;		* * * * * * * * * * * * *
 ;
 ;
 ;
 ;
 ;
 ;
 ;
 ;
 	ORG	6D00H
 ENTRY	DI
 	LD	SP,6CF0H	;BELOW PROGRAM
 	CALL	CREDIT		;SHOW AUTHOR CREDIT
 	CALL	GETDRV		;GET DESIRED DRIVES
 	CALL	STATCK		;CHECK STATUS & RESTORE
 	LD	IX,ONES		;WHICH DRIVES TO FORMAT
 	LD	IY,TRACKS	;# TRACKS ON DISK
 	CALL	HOWMNY		;HOW MANY ADVENTURES
 START	LD	SP,6CF0H
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Press <ENTER> when all disks are mounted ! '
 	DEFB	0
 	LD	B,1
 	CALL	GETSTR
 GOMORE	XOR	A		;START WITH TRACK 0
 	LD	(TRAK),A	;SAVE FOR FORMAT
 	LD	A,(IX)		;WORKING DRIVE
 	CP	0FFH		;TERMINATOR ?
 	JP	Z,FMTBYE	;DONE WITH FORMATTING
 	CP	99		;NOT THIS ONE
 	JR	Z,SKIP1
 	LD	(DRIVE),A	;SAVE DRIVE
 	CALL	FORMAT
 SKIP1	INC	IX		;BUMP DRIVE POINTER
 	JR	GOMORE
 CREDIT	CALL	DISPLY
 	DEFW	1F1CH		;CLEAR SCREEN
 	DEFM	'- ADVENTURE COPY UTILITY -'
 	DEFW	0D0DH
 	DEFM	'Program by '
 	DEFM	'Kim Watt'
 	DEFB	0DH
 	DEFM	'Breeze Computing Inc.'
 	DEFB	0DH
 	DEFM	'Version 1.1'
 	DEFW	0D0DH
 	DEFB	0
 	RET			;DONE WITH CREDITS
 GETDRV	LD	A,2		;START WITH DRIVE 0
 	LD	C,1		;ACTUAL DRIVE
 	LD	B,3		;GO FOR 3 DRIVES
 	LD	IX,ONES+1	;WHICH DRIVES TO FORMAT
 GETLP	PUSH	BC
 	PUSH	AF
 	LD	A,C		;GET DRIVE
 	CALL	ASCII		;MAKE IT ASCII
 	LD	A,B		;GET LOW BYTE
 	LD	(WHDRIV),A	;SAVE INTO STRING
 BAD7	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Do you want to copy to Drive '
 WHDRIV	DEFM	'0 ? '
 	DEFB	0
 	LD	B,3
 	CALL	GETSTR
 	CP	'Y'		;YES ?
 	JR	Z,OKYES
 	CP	'N'
 	JR	NZ,BAD7
 	LD	A,99
 	LD	(IX),A
 	JR	NEXT
 OKYES	POP	AF
 	LD	(IX),A
 	PUSH	AF
 NEXT	POP	AF
 	POP	BC
 	INC	IX
 	RLA			;SHIFT TO NEXT BIT
 	INC	C
 	DJNZ	GETLP
 	LD	IX,ONES		;RESET POINTER
 	LD	(IX),99		;NOT DRIVE 0
 	RET			;DONE
 ONES	DEFW	00H
 	DEFW	00H
 	DEFB	0FFH		;TERMINATOR
 STATCK	LD	A,(IX)		;GET A DRIVE BYTE
 	CP	0FFH		;TERMINATOR ?
 	RET	Z		;DONE
 	CP	99
 	JP	Z,NOCHK		;NOT THIS DRIVE
 	LD	(DRIVE),A	;PASS DRIVE
 	CALL	SELECT
 	LD	BC,0
 	CALL	60H
 	LD	A,(37ECH)
 	BIT	7,A
 	LD	HL,ERMSG5
 	JP	NZ,DERROR
 	CALL	RESTOR
 	CALL	SELECT		;RESELECT THE DRIVE
 	LD	A,(37ECH)	;GET STATUS BYTE
 	LD	HL,ERMSG5	;DRIVE NOT READY
 	BIT	7,A
 	JP	NZ,DERROR
 	LD	HL,ERMSG6	;DRIVE NOT IN SYSTEM
 	BIT	2,A
 	JP	Z,DERROR
 	LD	HL,ERMSG7	;DISKETTE WRITE PROTECTED
 	BIT	6,A
 	JP	NZ,DERROR
 	LD	B,00CDH
 	LD	HL,ERMSG8	;NO SYSTEM IN DRIVE
 TST1	DEC	BC
 	LD	A,B
 	OR	C		;ANY BITS ON STILL ?
 	JP	Z,DERROR
 	LD	A,(37ECH)
 	AND	2
 	JR	NZ,TST1
 	LD	BC,199DH
 	LD	HL,ERMSG9	;DOOR NOT CLOSED
 TST2	DEC	BC
 	LD	A,B
 	OR	C
 	JP	Z,DERROR
 	LD	A,(37ECH)
 	AND	2
 	JP	Z,TST2
 	LD	DE,0
 	LD	BC,00BAH
 	LD	HL,ERMSG0	;NO DISKETTE IN DRIVE
 TST3	DEC	BC
 	LD	A,B
 	OR	C
 	JP	Z,DERROR
 	INC	DE
 	LD	A,(37ECH)
 	AND	2
 	JR	NZ,TST3
 	LD	BC,1720H
 	LD	HL,ERMSG9	;DOOR NOT CLOSED
 TST4	DEC	BC
 	LD	A,B
 	OR	C
 	JP	Z,DERROR
 	INC	DE
 	LD	A,(37ECH)
 	AND	2
 	JR	Z,TST4
 	LD	HL,0EACBH
 	ADD	HL,DE
 	LD	HL,ERMSG1	;HARD SECTORED
 	JP	NC,DERROR
 NOCHK	INC	IX		;POINT TO NEXT BYTE
 	JP	STATCK		;GO AGAIN
 DISPLY	POP	DE		;POINT TO DATA
 DISLP	LD	HL,(4020H)	;GET CURSOR POSITION
 	LD	A,(DE)		;GET A BYTE
 	INC	DE		;POINT TO NEXT
 	OR	A		;SET FLAGS
 	JR	Z,DISDN		;TERMINATOR
 	CP	20H		;CHECK FOR CONTROL CODE
 	JR	C,DISCTL	;DISPLAY CONTROL CODE
 	LD	(HL),A		;DISPLAY BYTE
 	CP	(HL)		;STILL THERE ?
 	JR	Z,DISOK		;LOWER CASE INSTALLED
 	SUB	20H		;MAKE IT UPPER CASE
 	LD	(HL),A		;DISPLAY IT
 DISOK	INC	HL		;POINT TO NEXT
 	LD	(4020H),HL	;UPDATE CURSOR
 	JR	DISLP		;GET NEXT CHARACTER
 DISCTL	PUSH	DE		;MUST SAVE
 	PUSH	IY		;DE AND IY
 	CALL	33H		;DISPLAY CONTROL
 	POP	IY		;RESTORE
 	POP	DE		;DE AND IY
 	JR	DISLP		;GET SOME MORE
 DISDN	PUSH	DE		;RETURN ADDRESS
 	RET			;GO TO IT
 SELECT	DEFB	3EH		;LOAD A OPCODE
 DRIVE	DEFB	1		;DRIVE ONE
 	LD	(37E1H),A	;SELECT IT
 	RET
 ERMSG5	DEFB	0DH
 	DEFM	'Drive NOT READY !'
 	DEFB	0
 	JP	ERRORD
 ERMSG6	DEFB	0DH
 	DEFM	'Drive NOT IN SYSTEM !'
 	DEFB	0
 	JP	ERRORD
 ERMSG7	DEFB	0DH
 	DEFM	'Diskette WRITE PROTECTED !'
 	DEFB	0
 	JP	ERRORD
 ERMSG8	DEFB	0DH
 	DEFM	'No SYSTEM in DRIVE !'
 	DEFB	0
 	JP	ERRORD
 ERMSG9	DEFB	0DH
 	DEFM	'DOOR NOT CLOSED on drive !'
 	DEFB	0
 	JP	ERRORD
 ERMSG0	DEFB	0DH
 	DEFM	'NO DISKETTE in drive !'
 	DEFB	0
 	JP	ERRORD
 ERMSG1	DEFB	0DH
 	DEFM	'Diskette is HARD SECTORED !'
 	DEFB	0
 	JP	ERRORD
 TRACKS	DEFB	0		;# OF TRACKS ON DISK
 DERROR	PUSH	HL		;STRING POINTER
 	JP	DISPLY		;GO DISPLAY
 ;  ALL ERROR ROUTINES END HERE
 ERRORD	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'COPY CANNOT CONTINUE because of detected ERROR !'
 	DEFB	0DH
 	DEFM	'Press <ENTER> to restart program ! '
 	DEFB	0
 	LD	B,1
 	CALL	GETSTR		;WAIT FOR ENTER KEY
 	JP	ENTRY		;TERMINATE
 REQLEN	DEFB	0
 LENGTH	DEFB	0
 CHAR	DEFB	0
 NEWST	XOR	A		;ZERO THE LENGTH
 	LD	(LENGTH),A	;STASH IT
 	LD	HL,(4020H)	;START CURSOR POSIT
 	LD	A,(REQLEN)
 	LD	B,A
 	JR	GET15		;GO TO IT
 GETSTR	LD	HL,(4020H)	;GET CURSOR POSITION
 	LD	A,B		;GET REQUESTED LENGTH
 	LD	(REQLEN),A	;SAVE IT
 GET15	LD	(HL),20H	;PUT SPACES ON VIDEO
 	INC	HL		;POINT TO NEXT
 	DJNZ	GET15		;GO TILL END
 	XOR	A		;ZERO IT
 	LD	(LENGTH),A	;SAVE CURRENT LENGTH
 	LD	HL,STRING	;POINT TO INPUT BUFFER
 	LD	DE,(4020H)	;GET CURSOR
 SCAN	LD	A,8FH		;CURSOR CHARACTER
 	LD	(DE),A		;TURN IT ON
 	LD	BC,500H		;DELAY COUNT
 LOOP1	DEC	BC		;REDUCE COUNT
 	PUSH	BC		;SAVE IT
 	PUSH	DE
 	PUSH	IY
 	CALL	2BH
 	POP	IY
 	POP	DE
 	POP	BC
 	OR	A		;SET FLAGS
 	JR	NZ,GOTONE	;KEY WAS PRESSED
 	LD	A,B
 	OR	C		;ANY COUNT LEFT ?
 	JR	NZ,LOOP1	;GO SOME MORE
 	LD	A,20H		;CURSOR OFF CHARACTER
 	LD	(DE),A		;TURN IT OFF
 	LD	BC,500H		;DELAY COUNT
 LOOP2	DEC	BC
 	PUSH	BC
 	PUSH	DE
 	PUSH	IY
 	CALL	2BH
 	POP	IY
 	POP	DE
 	POP	BC
 	OR	A
 	JR	NZ,GOTONE
 	LD	A,B
 	OR	C
 	JR	NZ,LOOP2
 	JR	SCAN		;CURSOR BACK ON
 GOTONE	LD	(CHAR),A	;SAVE CHARACTER
 	CP	0DH		;ENTER KEY ?
 	JR	Z,DONEST	;TERMINATOR
 	CP	8		;BACKSPACE ?
 	JR	Z,BCKSPA
 	CP	18H		;SHIFT LEFT ARROW ?
 	JR	Z,NEWST		;START OVER
 	CP	20H		;DISPLAYABLE ?
 	JP	C,SCAN		;NOPE
 	LD	A,(REQLEN)	;GET REQUESTED LENGTH
 	LD	B,A		;SAVE IT HERE
 	LD	A,(LENGTH)	;GET ACTUAL LENGTH
 	CP	B
 	JR	NC,SCAN		;TOO MANY CHARACTERS
 	LD	A,(CHAR)	;GET CHARACTER BACK
 	LD	(DE),A		;PUT ON VIDEO
 	LD	(HL),A		;PUT INTO BUFFER
 	INC	DE
 	INC	HL		;BUMP POINTERS
 	LD	A,(LENGTH)	;GET LENGTH
 	INC	A		;ONE MORE
 	LD	(LENGTH),A	;SAVE NEW VALUE
 	JR	SCAN		;GO SOME MORE
 BCKSPA	LD	A,(LENGTH)	;GET LENGTH
 	OR	A		;SET FLAGS
 	JR	Z,SCAN		;NO CHARACTERS
 	DEC	A		;REDUCE NUMBER
 	LD	(LENGTH),A	;SAVE NEW LENGTH
 	LD	A,20H		;SPACE
 	LD	(DE),A
 	LD	(HL),A		;PUT INTO BUFFERS
 	DEC	HL
 	DEC	DE		;REDUCE POINTERS
 	JR	SCAN		;GO SOME MORE
 DONEST	LD	A,20H		;SPACE
 	LD	(DE),A		;CURSOR OFF
 	LD	(HL),0DH	;TERMINATOR
 	LD	A,(LENGTH)	;GET LENGTH
 	OR	A		;SET LENGTH FLAGS
 	LD	B,A		;GIVE TO B
 	LD	C,A		;HERE TO FOR BC=LENGTH
 	LD	A,(STRING)	;GET FIRST CHARACTER
 	LD	HL,STRING	;POINT TO INPUT
 	LD	(4020H),DE	;UPDATE CURSOR POSITION
 	RET			;DONE
 VALUE	LD	E,0		;PASS IN E REG.
 VALLP	LD	A,(HL)		;GET A BYTE FROM STRING
 	INC	HL		;POINT TO NEXT
 	CP	30H		;NUMERIC ?
 	RET	C		;NOPE
 	CP	3AH		;NUMERIC ?
 	RET	NC		;NOPE
 	SUB	30H		;REMOVE ASCII
 	LD	B,A
 	LD	A,E
 	ADD	A,A
 	ADD	A,A
 	ADD	A,E
 	ADD	A,A
 	ADD	A,B
 	LD	E,A
 	JR	VALLP		;GO SOME MORE
 ASCII	LD	C,30H		;START WITH 0
 ASCII1	SUB	0AH		;MINUS 10
 	JR	C,ASCII2
 	INC	C
 	JR	ASCII1
 ASCII2	ADD	A,3AH
 	LD	B,A
 	RET			;ASCII IN BC
 FORMAT	CALL	ADRIVE		;DRIVE TO ASCII
 	JR	BDRIVE
 ADRIVE	LD	A,(DRIVE)	;GET DRIVE
 	LD	C,0		;START WITH 0
 FMTLP1	RRCA			;SHIFT OUT A BIT
 	JR	C,DRVFND
 	INC	C		;BUMP DRIVE
 	JR	FMTLP1		;TEST AGAIN
 DRVFND	LD	A,C		;GET DRIVE
 	CALL	ASCII		;CONVERT TO ASCII
 	LD	A,B		;GET LOW NYBBLE
 	RET
 BDRIVE	LD	(FMTDRV),A	;PUT INTO STRING
 	CALL	DISPLY
 	DEFW	1F1CH		;CLEAR SCREEN
 	DEFM	'- BREEZE FORMAT UTILITY -'
 	DEFW	0D0DH
 	DEFM	'Formatting on Drive '
 FMTDRV	DEFM	'0.'
 	DEFW	0D0DH
 	DEFB	0
 	CALL	SELECT
 	LD	BC,0
 	CALL	60H
 FMTLP	LD	A,(TRAK)	;GET CURRENT TRACK
 	CALL	ASCII		;MAKE IT ASCII
 	LD	(FMTTR),BC	;PUT INTO STRING
 	CALL	DISPLY
 	DEFB	1DH		;BEGINNING OF LINE
 	DEFM	'Formatting Track '
 FMTTR	DEFM	'00.'
 	DEFB	0
 	LD	A,0FBH		;DELETED DATA
 	LD	(DATMRK),A
 	LD	HL,5F00H	;TRACK BUFFER
 	LD	A,(TRAK)
 	OR	A		;TRACK 0 ?
 	JR	NZ,OKZZ
 	LD	DE,ORDER0	;DIFFERENT SECTORS
 	JR	OKZY
 OKZZ	LD	DE,ORDER	;SECTOR ORDER ON TRACK
 OKZY	LD	B,0EH
 	CALL	FILLFF		;POST INDEX GAP
 SECLP	LD	B,6
 	LD	C,0
 	CALL	FILL		;SYNC FIELD
 	LD	C,0FEH		;ID ADDRESS MARK
 	CALL	FILL1		;PUT INTO BUFFER
 	DEFB	0EH		;LOAD C OPCODE
 TRAK	DEFB	0		;FORMAT TRACK
 	CALL	FILL1
 	LD	C,0		;HEAD NUMBER
 	CALL	FILL1
 	LD	A,(DE)		;GET SECTOR
 	LD	C,A
 	CALL	FILL1
 	LD	C,1		;SECTOR LENGTH 256 BYTES
 	CALL	FILL1
 	LD	C,0F7H		;CRC GENERATOR
 	CALL	FILL1
 	LD	C,0FFH
 	CALL	FILL1
 	LD	B,0BH
 	CALL	FILLFF
 	LD	B,6
 	LD	C,0
 	CALL	FILL
 	DEFB	0EH		;LOAD C OPCODE
 DATMRK	DEFB	0		;DATA MARK TYPE
 	CALL	FILL1
 	LD	B,0
 	DEFB	0EH		;LOAD C OPCODE
 FILBYT	DEFB	0		;FILL BYTE FOR EMPTY SECS
 	CALL	FILL		;FILL EMPTY SECTORS
 	LD	C,0F7H		;CRC GENERATOR
 	CALL	FILL1
 	LD	C,0FFH
 	CALL	FILL1
 	LD	B,0BH
 	CALL	FILLFF
 	INC	DE		;NEXT SECTOR
 	LD	A,(DE)		;GET BYTE
 	INC	A		;CHECK FOR FF TERMINATOR
 	JR	NZ,SECLP	;NEXT SECTOR
 	LD	B,5BH		;PRE-INDEX GAP
 	CALL	FILLFF
 	CALL	WRITTR		;WRITE TRACK
 NXTFMT	LD	A,(TRAK)	;GET CURRENT TRACK
 	INC	A		;NEXT
 	LD	(TRAK),A	;SAVE IT
 	CP	(IY)		;END ?
 	JP	Z,VERIFY	;VERIFY SECTORS
 	LD	A,5BH		;STEP IN BYTE
 	LD	(37ECH),A	;GIVE TO CONTROLLER
 	PUSH	AF
 	POP	AF
 	PUSH	AF
 	POP	AF
 STEPWT	LD	A,(37ECH)	;GET STATUS
 	RRCA			;SHIFT OUT BUSY BIT
 	JR	C,STEPWT	;WAIT TILL DONE
 	JP	FMTLP		;GO AGAIN
 WRITTR	CALL	TRWRIT		;TRY IT ONCE
 	RET	Z		;GOOD WRITE
 TRWRIT	CALL	SELECT		;SELECT DRIVE
 	LD	BC,5F00H	;TRACK BUFFER
 	LD	HL,37ECH	;CONTROLLER ADDRESS
 	LD	(HL),0F4H	;WRITE TRACK BYTE
 	LD	DE,37EFH	;DATA TRANSFER ADDRESS
 	PUSH	BC
 	POP	BC
 	PUSH	BC
 	POP	BC
 	DI
 	JR	WRBZZ
 BZWRZ	RRCA
 	JR	NC,WRDNZ
 WRBZZ	LD	A,(HL)
 	BIT	1,A
 	JR	Z,BZWRZ
 	LD	A,(BC)		;GET A BYTE
 	LD	(DE),A		;GIVE TO DISK
 	INC	BC		;BUMP POINTER
 	JP	WRBZZ
 WRDNZ	LD	A,(HL)		;GET STATUS/CLEAR LATCH
 	LD	(HL),0D0H	;FORCE INTERRUPT
 	LD	HL,ERMSG2	;TRANSFER TOO FAST
 	BIT	2,A		;DATA LOST ?
 	JP	NZ,DERROR
 	LD	HL,0A100H
 	ADD	HL,BC
 	EX	DE,HL
 	LD	HL,0F413H
 	ADD	HL,DE
 	LD	HL,ERMSG3
 	JP	NC,DERROR
 	LD	HL,0F397H
 	ADD	HL,DE
 	LD	HL,ERMSG4
 	JP	C,DERROR
 	RET			;EVERYTHING IS OK
 ERMSG2	DEFB	0DH
 	DEFM	'Can'
 	DEFB	27H
 	DEFM	't format.  Transfer rate TOO FAST !'
 	DEFB	0
 	JP	ERRORD
 ERMSG3	DEFB	0DH
 	DEFM	'Can'
 	DEFB	27H
 	DEFM	't format.  Motor speed TOO SLOW !'
 	DEFB	0
 	JP	ERRORD
 ERMSG4	DEFB	0DH
 	DEFM	'Can'
 	DEFB	27H
 	DEFM	't format.  Motor speed TOO FAST !'
 	DEFB	0
 	JP	ERRORD
 VERIFY	CALL	RESTOR
 	RET			;DONE WITH FORMAT
 RESTOR	CALL	SELECT		;SELECT DRIVE
 	LD	A,0BH
 	LD	(37ECH),A
 	PUSH	AF
 	POP	AF
 	PUSH	AF
 	POP	AF
 RESLP	CALL	SELECT
 	LD	A,(37ECH)
 	RRCA
 	JR	C,RESLP
 	RET			;DONE WITH RESTORE
 ;  ORDER THAT SECTORS APPEAR ON TRACK
 ORDER	DEFB	0
 	DEFB	5
 	DEFB	1
 	DEFB	6
 	DEFB	2
 	DEFB	7
 	DEFB	3
 	DEFB	8
 	DEFB	4
 	DEFB	9
 	DEFB	0FFH		;TERMINATOR
 ;  ALTERNATE SECTORS FOR TRACK 0
 ORDER0	DEFB	0
 	DEFB	5
 	DEFB	94H
 	DEFB	6
 	DEFB	2
 	DEFB	7
 	DEFB	3
 	DEFB	8
 	DEFB	4
 	DEFB	9
 	DEFB	0FFH
 FILLFF	LD	C,0FFH
 FILL	CALL	FILL1
 	DJNZ	FILL
 	RET
 FILL1	LD	(HL),C
 	INC	HL
 	RET
 WRITE	PUSH	BC
 	CALL	WRITEB
 	POP	HL
 	RET	Z
 	CALL	RESTOR
 	LD	B,H
 	LD	C,L
 WRITEB	LD	(37EEH),DE
 	PUSH	DE
 	CALL	SELECT
 	LD	HL,37ECH
 	LD	(HL),1BH
 	PUSH	AF
 	POP	AF
 	PUSH	AF
 	POP	AF
 ABCDEF	CALL	SELECT
 	LD	A,(HL)
 	RRCA
 	JR	C,ABCDEF
 	LD	(HL),0ABH
 	LD	DE,37EFH
 	PUSH	BC
 	POP	BC
 	DI
 	JR	WTBY
 WTBZ	RRCA
 	JR	NC,WTBX
 WTBY	LD	A,(HL)
 	BIT	1,A
 	JR	Z,WTBZ
 	LD	A,(BC)
 	LD	(DE),A
 	INC	BC
 	JR	WTBY
 WTBX	LD	A,(HL)
 	AND	1CH
 	POP	DE
 	RET	Z
 	LD	(HL),0D0H
 	RET
 READ	DI
 	PUSH	BC
 	CALL	R2
 	POP	HL
 	RET	Z
 	LD	B,H
 	LD	C,L
 R2	LD	(37EEH),DE
 	CALL	SELECT
 	LD	HL,37ECH
 	LD	(HL),1BH
 	PUSH	AF
 	POP	AF
 	PUSH	AF
 	POP	AF
 R1	CALL	SELECT
 	LD	A,(HL)
 	RRCA
 	JR	C,R1
 	LD	(HL),88H
 	PUSH	DE
 	LD	DE,37EFH
 	PUSH	BC
 	POP	BC
 	JR	R5
 R3	RRCA
 	JR	NC,R6
 R4	LD	A,(HL)
 	BIT	1,A
 	JR	Z,R3
 	LD	A,(DE)
 	LD	(BC),A
 	INC	BC
 R5	JR	R4
 R6	LD	A,(HL)
 	AND	1CH
 	POP	DE
 	RET	Z
 	LD	(HL),0D0H
 	RET
 STRING	DEFS	80H		;INPUT BUFFER
 BUFF	DEFS	100H		;GAT TABLE BUFFER
 HOWMNY	CALL	DISPLY
 	DEFW	0D0DH
 	DEFM	'How many Adventures are on the master (1-4) ? '
 	DEFB	0
 	LD	B,1
 	CALL	GETSTR
 	SUB	30H
 	JR	C,HOWMNY
 	CP	1
 	JR	C,HOWMNY
 	CP	5
 	JR	NC,HOWMNY
 	LD	B,0EH
 	CP	1
 	JR	Z,THTMNY
 	LD	B,15H
 	CP	2
 	JR	Z,THTMNY
 	LD	B,1CH
 	CP	3
 	JR	Z,THTMNY
 	LD	B,23H
 THTMNY	LD	(IY),B
 	RET
 FMTBYE	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'All disks formatted.'
 	DEFB	0DH
 	DEFB	0
 	LD	HL,3C00H
 	LD	(4020H),HL
 	CALL	DISPLY
 	DEFB	30
 	DEFM	'- BREEZE COPY UTILITY -'
 	DEFB	0DH
 	DEFB	30
 	DEFB	0DH
 	DEFB	30
 	DEFB	0
 	LD	HL,15360+384
 	LD	(4020H),HL
 	LD	A,1
 	LD	(DRIVE),A
 	CALL	RESTOR
 	LD	IX,ONES
 	LD	A,(IX+1)
 	LD	(DRIVE),A
 	CP	99
 	CALL	NZ,RESTOR
 	LD	A,(IX+2)
 	LD	(DRIVE),A
 	CP	99
 	CALL	NZ,RESTOR
 	LD	A,(IX+3)
 	LD	(DRIVE),A
 	CP	99
 	CALL	NZ,RESTOR
 	XOR	A
 	LD	(TRAK),A
 COPYLP	LD	IX,ONES
 	LD	A,(TRAK)
 	CP	(IY)		;END OF DISK ?
 	JP	Z,COPBYE
 	OR	A
 	JP	Z,SPCOPY
 	LD	D,A
 	CALL	ASCII
 	LD	(YDRIVE),BC	;TRACK TO STRING
 	LD	E,0		;TRACK/SECTOR
 	LD	BC,ENBUFF
 	LD	A,1
 	LD	(DRIVE),A
 CPLP1	PUSH	BC
 	PUSH	DE
 	LD	A,E		;GET SECTOR
 	CALL	ASCII
 	LD	(ZDRIVE),BC	;INTO STRING
 	CALL	DISPLY
 	DEFB	1DH		;BEGINNING OF LINE
 	DEFM	'Reading Track '
 YDRIVE	DEFM	'00, Sector '
 ZDRIVE	DEFM	'00.'
 	DEFB	0
 	POP	DE
 	POP	BC
 	CALL	READ
 	JP	NZ,BADC
 	INC	E
 	LD	A,E
 	CP	0AH
 	JR	NZ,CPLP1
 	LD	IX,ONES
 WRTLP	LD	A,(IX)
 	CP	99
 	JR	Z,WRTNX
 	CP	0FFH
 	JR	Z,WRTBY
 	LD	(DRIVE),A
 	LD	E,0
 	LD	A,(TRAK)
 	LD	D,A
 	CALL	ASCII
 	LD	(DRIVEG),BC	;ASCII TRACK
 	LD	BC,ENBUFF
 WZLP1	PUSH	BC
 	PUSH	DE
 	LD	A,E
 	CALL	ASCII
 	LD	(DRIVEH),BC	;SECTOR
 	CALL	DISPLY
 	DEFB	1DH
 	DEFM	'Writing Track '
 DRIVEG	DEFM	'00, Sector '
 DRIVEH	DEFM	'00.'
 	DEFB	0
 	POP	DE
 	POP	BC
 	CALL	WRITE
 	JP	NZ,BADA
 	INC	E
 	LD	A,E
 	CP	0AH
 	JP	NZ,WZLP1
 WRTNX	INC	IX
 	JP	WRTLP
 WRTBY	LD	HL,TRAK
 	INC	(HL)
 	JP	COPYLP
 BADA	BIT	7,A
 	JR	Z,BADAA
 	PUSH	AF
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Drive not ready !'
 	DEFB	0
 	POP	AF
 BADAA	BIT	6,A
 	JR	Z,BADAB
 	PUSH	AF
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Diskette write protected !'
 	DEFB	0
 	POP	AF
 BADAB	BIT	5,A
 	JR	Z,BADAC
 	PUSH	AF
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Write fault from drive !'
 	DEFB	0
 	POP	AF
 BADAC	BIT	4,A
 	JR	Z,BADAD
 	PUSH	AF
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Track and Sector were not found !'
 	DEFB	0
 	POP	AF
 BADAD	BIT	3,A
 	JR	Z,BADAE
 	PUSH	AF
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Error in data or id field !'
 	DEFB	0
 	POP	AF
 BADAE	BIT	2,A
 	JR	Z,BADAF
 	PUSH	AF
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Data lost during transfer !'
 	DEFB	0
 	POP	AF
 BADAF	LD	HL,ERMSGH
 	PUSH	HL
 	JP	DISPLY
 ERMSGH	DEFB	0DH
 	DEFM	'Error detected during write operation !'
 	DEFB	0
 	JP	ERRORD
 BADC	BIT	7,A
 	JR	Z,BADCA
 	PUSH	AF
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Drive not ready !'
 	DEFB	0
 	POP	AF
 BADCA	BIT	6,A
 	JR	Z,BADCB
 	PUSH	AF
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Data bit 6 set !'
 	DEFB	0
 	POP	AF
 BADCB	BIT	5,A
 	JR	Z,BADCC
 	PUSH	AF
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Data bit 5 set !'
 	DEFB	0
 	POP	AF
 BADCC	BIT	4,A
 	JR	Z,BADCD
 	PUSH	AF
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Track and Sector were not found !'
 	DEFB	0
 	POP	AF
 BADCD	BIT	3,A
 	JR	Z,BADCE
 	PUSH	AF
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Error in data or id field !'
 	DEFB	0
 	POP	AF
 BADCE	BIT	2,A
 	JR	Z,BADCF
 	PUSH	AF
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Data lost during transfer !'
 	DEFB	0
 	POP	AF
 BADCF	LD	HL,ERMSGJ
 	PUSH	HL
 	JP	DISPLY
 ERMSGJ	DEFB	0DH
 	DEFM	'Error detected during read operation !'
 	DEFB	0
 	JP	ERRORD
 BADB	LD	HL,ERMSGI
 	JP	DERROR
 ERMSGI	DEFB	0DH
 	DEFM	'Error detected during verify operation !'
 	DEFB	0
 	JP	ERRORD
 SPCOPY	LD	DE,0
 	LD	BC,ENBUFF
 	LD	A,1
 	LD	(DRIVE),A
 	CALL	READ
 	JP	NZ,BADC
 	LD	A,(IX+1)
 	CP	99
 	JR	Z,ASKIP
 	LD	(DRIVE),A
 	LD	BC,ENBUFF
 	CALL	WRITE
 	JP	NZ,BADA
 ASKIP	LD	A,(IX+2)
 	CP	99
 	JR	Z,BSKIP
 	LD	(DRIVE),A
 	LD	BC,ENBUFF
 	CALL	WRITE
 	JP	NZ,BADA
 BSKIP	LD	A,(IX+3)
 	CP	99
 	JR	Z,CSKIP
 	LD	(DRIVE),A
 	LD	BC,ENBUFF
 	CALL	WRITE
 	JP	NZ,BADA
 CSKIP	LD	HL,TRAK
 	INC	(HL)
 	INC	(HL)
 	JP	COPYLP
 COPHEL	CALL	DISPLY
 	DEFW	0D0DH
 	DEFM	'Copy is complete.  Mount fresh disks.'
 	DEFB	0
 	JP	START
 COPBYE	CALL	DISPLY
 	DEFB	0DH
 	DEFB	0
 	LD	IX,ONES
 LPCOP1	LD	A,(IX)
 	CP	0FFH
 	JP	Z,COPHEL
 	CP	99
 	JR	Z,LPCOP2
 	LD	(DRIVE),A
 	CALL	CHEKIT
 LPCOP2	INC	IX
 	JR	LPCOP1
 CHEKIT	LD	D,1
 CHKLP	LD	A,D
 	CALL	ASCII
 	LD	(CKDR1),BC
 	LD	E,0
 CHKLP1	PUSH	DE
 	CALL	SELECT
 	LD	A,E
 	CALL	ASCII
 	LD	(CKDR2),BC
 	CALL	DISPLY
 	DEFB	1DH
 	DEFM	'Verifying Track '
 CKDR1	DEFM	'00, Sector '
 CKDR2	DEFM	'00.'
 	DEFB	0
 	POP	DE
 	LD	BC,ENBUFF
 	CALL	READ
 	LD	HL,NOGO1
 	BIT	4,A
 	JP	NZ,DERROR
 	LD	HL,NOGO2
 	BIT	3,A
 	JP	NZ,DERROR
 	LD	HL,NOGO3
 	BIT	2,A
 	JP	NZ,DERROR
 	INC	E
 	LD	A,E
 	CP	0AH
 	JP	NZ,CHKLP1
 	INC	D
 	LD	A,D
 	CP	(IY)
 	JP	NZ,CHKLP
 	RET
 NOGO1	DEFB	0DH
 	DEFM	'Track or Sector not found during verify operation !'
 	DEFB	0
 	JP	ERRORD
 NOGO2	DEFB	0DH
 	DEFM	'CRC ERROR occured during verify operation !'
 	DEFB	0
 	JP	ERRORD
 NOGO3	DEFB	0DH
 	DEFM	'Cannot verify one of the sectors !'
 	DEFB	0
 	JP	ERRORD
 ENBUFF	DEFB	0
 	END	ENTRY
ERRORD
 NOGO2	DEFB	0DH
 	DEFM	'CRC ERROR occured during verify operation !'
 	DEFB	0
 	JP	ERRORD
 NOGO3	DEFB	0DH
 	DEFM	