BCOPY/ 	ORG	7000H
 READIN	DEFW	0
 WRITIN	DEFW	0
 STATCK	CALL	SELECT
 	LD	BC,8000H
 	CALL	60H
 	CALL	STATUS
 	CALL	SELEC2
 STATUS	LD	HL,37ECH
 	LD	(HL),0BH
 	PUSH	AF
 	POP	AF
 	PUSH	AF
 	POP	AF
 SKWTZZ	LD	A,(HL)
 	RRCA
 	JR	C,SKWTZZ
 	LD	A,(37ECH)
 	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	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
 	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 DISK 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
 DERROR	PUSH	HL		;STRING POINTER
 	JP	DISPLY		;GO DISPLAY
 ;  ALL ERROR ROUTINES END HERE
 ERRORD	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'FORMAT CANNOT CONTINUE because of detected ERROR !'
 	DEFB	0DH
 	DEFM	'Press <ENTER> to restart program ! '
 	DEFB	0
 	LD	BC,0
 	CALL	60H
 	LD	HL,BUFFER
 	LD	B,1
 	CALL	40H
 	JP	ENTRY		;TERMINATE
 FORMAT	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'FORMATTING'
 	DEFB	0
 	XOR	A
 	LD	(TRAK),A
 	CALL	SELEC2
 FMTLP	LD	HL,5F00H
 	LD	DE,ORDER	;SECTOR ORDER ON TRACK
 	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
 ;  COULD BE 1 WITH DOUBLE SIDED DISKS
 	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
 	LD	C,0F9H
 	CALL	FILL1
 	LD	B,0
 	DEFB	0EH		;LOAD C OPCODE
 FILBYT	DEFB	0EEH		;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,0BH		;PRE-INDEX GAP
 	CALL	FILLFF
 	CALL	WRITTR		;WRITE TRACK
 NXTFMT	LD	A,(TRAK)	;GET CURRENT TRACK
 	OR	A
 	JR	Z,NEX11
 	DEC	A
 	DEC	A
 	DEC	A
 	DEC	A
 	DEC	A
 	JR	NEX22
 NEX11	LD	A,80
 NEX22	LD	(TRAK),A
 	CP	50
 	RET	Z
 	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	SELEC2
 	LD	BC,5F00H
 	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
 ORDER	DEFB	0
 	DEFB	77
 	DEFB	74
 	DEFB	71
 	DEFB	78
 	DEFB	75
 	DEFB	72
 	DEFB	79
 	DEFB	76
 	DEFB	73
 	DEFB	0FFH		;TERMINATOR
 FILLFF	LD	C,0FFH
 FILL	CALL	FILL1
 	DJNZ	FILL
 	RET
 FILL1	LD	(HL),C
 	INC	HL
 	RET
 READ1	LD	(37EEH),DE
 	LD	BC,BUFFER
 	CALL	SELECT
 	LD	HL,37ECH
 	LD	(HL),1BH
 	PUSH	BC
 	POP	BC
 	PUSH	BC
 	POP	BC
 SEEKWT	CALL	SELECT
 	LD	A,(HL)
 	RRCA
 	JR	C,SEEKWT
 	LD	(HL),88H
 	PUSH	DE
 	LD	DE,37EFH
 	PUSH	AF
 	POP	AF
 	PUSH	AF
 	POP	AF
 	JR	RD2
 RD1	RRCA
 	JR	NC,RD3
 RD2	LD	A,(HL)
 	BIT	1,A
 	JR	Z,RD1
 	LD	A,(DE)
 	LD	(BC),A
 	INC	BC
 	JR	RD2
 RD3	LD	A,(HL)
 	AND	1CH
 	POP	DE
 	RET	Z
 	LD	(HL),0D0H
 	RET
 WRITE1	LD	(37EEH),DE
 	LD	BC,BUFFER
 	CALL	SELEC2
 	LD	HL,37ECH
 	LD	(HL),1BH
 	PUSH	AF
 	POP	AF
 	PUSH	AF
 	POP	AF
 SKWT2	CALL	SELEC2
 	LD	A,(HL)
 	RRCA
 	JR	C,SKWT2
 WRTYPE	LD	(HL),0A3H
 	PUSH	DE
 	LD	DE,37EFH
 	PUSH	BC
 	POP	BC
 	PUSH	BC
 	POP	BC
 	JR	WR2
 WR1	RRCA
 	JR	NC,WR3
 WR2	LD	A,(HL)
 	BIT	1,A
 	JR	Z,WR1
 	LD	A,(BC)
 	LD	(DE),A
 	INC	BC
 	JR	WR2
 WR3	LD	A,(HL)
 	AND	1CH
 	POP	DE
 	RET	Z
 	LD	(HL),0D0H
 	RET
 READ	PUSH	BC
 	CALL	READ1
 	POP	HL
 	RET	Z
 	LD	B,H
 	LD	C,L
 	CALL	READ1
 	RET	Z
 	JP	ERROR
 WRITE	LD	A,D
 	OR	E
 	JR	Z,DTRK0
 	LD	A,0A3H
 PUTTRK	LD	(WRTYPE+1),A
 	JR	CONT
 DTRK0	LD	A,0ABH
 	JR	PUTTRK
 CONT	PUSH	BC
 	CALL	WRITE1
 	POP	HL
 	RET	Z
 	LD	B,H
 	LD	C,L
 	CALL	WRITE1
 	RET	Z
 ERROR	BIT	0,A
 	JR	Z,ERR1
 	PUSH	AF
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'BIT 0'
 	DEFB	0
 	POP	AF
 ERR1	BIT	1,A
 	JR	Z,ERR2
 	PUSH	AF
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'BIT 1'
 	DEFB	0
 	POP	AF
 ERR2	BIT	2,A
 	JR	Z,ERR3
 	PUSH	AF
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'BIT 2'
 	DEFB	0
 	POP	AF
 ERR3	BIT	3,A
 	JR	Z,ERR4
 	PUSH	AF
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'BIT 3'
 	DEFB	0
 	POP	AF
 ERR4	BIT	4,A
 	JR	Z,ERR5
 	PUSH	AF
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'BIT 4'
 	DEFB	0
 	POP	AF
 ERR5	BIT	5,A
 	JR	Z,ERR6
 	PUSH	AF
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'BIT 5'
 	DEFB	0
 	POP	AF
 ERR6	BIT	6,A
 	JR	Z,ERR7
 	PUSH	AF
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'BIT 6'
 	DEFB	0
 	POP	AF
 ERR7	BIT	7,A
 	JR	Z,ERRDON
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'BIT 7'
 	DEFB	0
 ERRDON	LD	A,0DH
 	CALL	33H
 	LD	HL,BUFFER
 	LD	B,1
 	CALL	40H
 	JP	ENTRY
 STEP	CALL	SELECT
 	CALL	MOVEIN
 	CALL	SELEC2
 MOVEIN	LD	A,5BH
 	LD	(37ECH),A
 	PUSH	AF
 	POP	AF
 	PUSH	AF
 	POP	AF
 MVWAIT	LD	A,(37ECH)
 	RRCA
 	JR	C,MVWAIT
 	RET
 SELECT	LD	A,1
 	LD	(37E1H),A
 	RET
 SELEC2	LD	A,2
 	LD	(37E1H),A
 	RET
 DISPLY	POP	HL
 DISLP	LD	A,(HL)
 	INC	HL
 	OR	A
 	JR	Z,DISDN
 	CALL	33H
 	JR	DISLP
 DISDN	JP	(HL)
 ENTRY	DI
 	LD	SP,6FF0H
 	CALL	DISPLY
 	DEFW	1F1CH
 	DEFM	'- BREEZE SPECIAL COPY UTILITY -'
 	DEFW	0D0DH
 	DEFM	'THIS PROGRAM WILL COPY ALL MASTER PROGRAM DISKS FROM BREEZE'
 	DEFW	0D0DH
 	DEFW	0D0DH
 	DEFM	'MOUNT SOURCE DISKETTE ON DRIVE 0.'
 	DEFB	0DH
 	DEFM	'MOUNT DESTINATION DISKETTE ON DRIVE 1.'
 	DEFW	0D0DH
 	DEFM	'PRESS <ENTER> TO BEGIN '
 	DEFB	0
 	LD	HL,BUFFER
 	LD	B,1
 	CALL	40H
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'CHECKING DISK STATUS'
 	DEFB	0
 	CALL	STATCK
 	CALL	FORMAT
 	CALL	RESTOR
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'COPYING'
 	DEFB	0
 	CALL	RESTOR
 	LD	DE,0
 	LD	(READIN),DE
 	LD	(WRITIN),DE
 COPY	LD	DE,(READIN)
 	LD	A,D
 	LD	(37EDH),A
 	LD	BC,BUFFER
 	CALL	READ
 	LD	DE,(WRITIN)
 	LD	A,D
 	LD	(37EDH),A
 	LD	BC,BUFFER
 	CALL	WRITE
 	LD	DE,(READIN)
 	LD	A,E
 	INC	A
 	CP	0AH
 	JR	NZ,CP11
 	INC	D
 	XOR	A
 CP11	LD	E,A
 	LD	(READIN),DE
 	LD	DE,(WRITIN)
 	LD	A,E
 	OR	A
 	JR	Z,CP22
 	INC	A
 	LD	E,A
 	CP	80
 	JR	Z,NEXTRK
 CP33	LD	(WRITIN),DE
 	JR	COPY
 CP22	LD	E,71
 	JR	CP33
 NEXTRK	LD	E,0
 	LD	A,D
 	OR	A
 	JR	Z,CP44
 	DEC	A
 	DEC	A
 	DEC	A
 	DEC	A
 	DEC	A
 	LD	D,A
 	CP	50
 	JR	Z,TERMIN
 	JR	CP55
 CP44	LD	D,80
 CP55	LD	(WRITIN),DE
 	CALL	STEP
 	JR	COPY
 TERMIN	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'COPY COMPLETE !!'
 	DEFB	0
 BAD1	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'<A>NOTHER COPY OR <E>ND ? '
 	DEFB	0
 	LD	HL,BUFFER
 	LD	B,1
 	CALL	40H
 	LD	A,(HL)
 	CP	'A'
 	JP	Z,ENTRY
 	CP	'E'
 	JP	Z,0
 	JR	BAD1
 RESTOR	CALL	SELECT
 	CALL	RES1
 	CALL	SELEC2
 RES1	LD	HL,37ECH
 	LD	(HL),0BH
 	PUSH	AF
 	POP	AF
 	PUSH	AF
 	POP	AF
 RESWT	LD	A,(HL)
 	RRCA
 	JR	C,RESWT
 	RET
 BUFFER	DEFB	0
 	END	ENTRY
RESTOR	CALL	SELECT
 	CALL	RES1
