COPY1/ ;		* * * * * * * * * * * * *
 ;		*  Program by Kim Watt  *
 ;		* Breeze Computing Inc. *
 ;		*     P.O. Box  1013    *
 ;		* Berkley, Mich.  48072 *
 ;		*    (313)  288-9422    *
 ;		* * * * * * * * * * * * *
 ;
 ;
 ;
 ;
 ;
 ;
 ;
 ;
 	ORG	7000H
 START	JP	ENTRY
 STACK	DEFB	0
 BUFF	DEFW	0
 STRING	DEFS	100H
 TRACKS	DEFB	5		;NUMBER OF TRACKS TO COPY
 DRIVE0	DEFB	0
 DRIVE1	DEFB	0
 DRIVE2	DEFB	0
 DRIVE3	DEFB	0
 PRELUD	CALL	DISPLY
 	DEFW	1F1CH
 	DEFM	'This diskette will make copies of the program'
 	DEFB	0DH
 	DEFM	'FORMAT by Kim Watt.'
 	DEFW	0D0DH
 	DEFM	'This program is under strict restrictions and has been'
 	DEFB	0DH
 	DEFM	'authorized to be used by PROGRAMMA INTERNATIONAL ONLY !'
 	DEFB	0DH
 	DEFB	0
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'You may make copies on any number of drives, any combination.'
 	DEFB	0
 	LD	B,4
 	LD	HL,DRIVE0
 	XOR	A
 LOOP11	LD	(HL),A
 	INC	HL
 	DJNZ	LOOP11
 	LD	IX,DRIVE0
 	LD	B,4
 	LD	C,0
 LOOP22	PUSH	BC
 	LD	A,C
 	CALL	ASCII
 	LD	A,B
 	LD	(STR1),A
 BAD2	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Do you want to copy to Drive '
 STR1	DEFM	'0 ? '
 	DEFB	0
 	LD	B,1
 	CALL	GETSTR
 	CP	'Y'
 	JR	Z,YES
 	CP	'N'
 	JR	NZ,BAD2
 YES	LD	(IX),A
 	INC	IX
 	POP	BC
 	INC	C
 	DJNZ	LOOP22
 	LD	IX,DRIVE0
 	LD	B,4
 	LD	C,1
 B4LOOP	LD	A,(IX)
 	CP	'Y'
 	JR	NZ,B4BAD
 	LD	(IX),C
 B4BAD	INC	IX
 	SLA	C
 	DJNZ	B4LOOP
 	LD	IX,DRIVE0
 	RET
 VALUE	LD	E,0
 VALLP	LD	A,(HL)
 	INC	HL
 	CP	30H
 	RET	C
 	CP	3AH
 	RET	NC
 	SUB	30H
 	LD	B,A
 	LD	A,E
 	ADD	A,A
 	ADD	A,D
 	ADD	A,E
 	ADD	A,A
 	ADD	A,B
 	LD	E,A
 	JR	VALLP
 ASCII	LD	C,30H
 ASCII1	SUB	0AH
 	JR	C,ASCII2
 	INC	C
 	JR	ASCII1
 ASCII2	ADD	A,3AH
 	LD	B,A
 	RET
 DISPLY	POP	DE
 DISLP	LD	HL,(4020H)
 	LD	A,(DE)
 	INC	DE
 	OR	A
 	JR	Z,DISDON
 	CP	20H
 	JR	C,DISCTL
 	LD	(HL),A
 	CP	(HL)
 	JR	Z,DISOK
 	SUB	20H
 	LD	(HL),A
 DISOK	INC	HL
 	LD	(4020H),HL
 	JR	DISLP
 DISDON	PUSH	DE
 	RET
 DISCTL	PUSH	IY
 	PUSH	DE
 	CALL	33H
 	POP	DE
 	POP	IY
 	JR	DISLP
 FILLFF	LD	C,0FFH
 FILL	CALL	FILL1
 	DJNZ	FILL
 	RET
 FILL1	LD	(HL),C
 	INC	HL
 	RET
 ROUTIN	LD	SP,STACK
 	CALL	DISPLY
 	DEFW	1F1CH
 	DEFM	'Mount diskettes into requested drives.'
 	DEFW	0D0DH
 	DEFM	'Press <ENTER> to begin copy ! '
 	DEFB	0
 	LD	B,1
 	CALL	GETSTR
 	CALL	STATCK
 	LD	B,4
 RTLP0	LD	A,(IX)
 	INC	IX
 	CP	'N'
 	JR	Z,SKIP
 	PUSH	BC
 	LD	(DRIVE),A
 	CALL	FORMAT
 	CALL	WRITE
 	CALL	VERIFY
 	POP	BC
 SKIP	DJNZ	RTLP0
 BAD4	CALL	DISPLY
 	DEFW	0D0DH
 	DEFM	'Full diskette copy completed.'
 	DEFW	0D0DH
 	DEFM	'<C>ontinue or <T>erminate ? '
 	DEFB	0
 	LD	B,1
 	CALL	GETSTR
 	CP	'C'
 	JP	Z,ROUTIN
 	CP	'T'
 	JR	NZ,BAD4
 	CALL	DISPLY
 	DEFW	0D0DH
 	DEFM	'Copy program terminated !'
 	DEFB	0DH
 	DEFM	'Press <ENTER> when SYSTEM disk mounted ! '
 	DEFB	0
 	LD	B,1
 	CALL	GETSTR
 	JP	0
 STATCK	LD	IX,DRIVE0
 	LD	B,4
 STATLP	LD	A,(IX)
 	CP	'N'
 	JP	Z,SKIPST
 	PUSH	BC
 	LD	(DRIVE),A
 	CALL	RESTOR
 	LD	BC,0
 	CALL	60H
 	CALL	SELECT
 	LD	A,(37ECH)
 	LD	HL,ERMSG5
 	BIT	7,A
 	JP	NZ,DERROR
 	LD	HL,ERMSG6
 	BIT	2,A
 	JP	Z,DERROR
 	LD	HL,ERMSG7
 	BIT	6,A
 	JP	NZ,DERROR
 	LD	B,00CDH
 	LD	HL,ERMSG8
 TST1	DEC	BC
 	LD	A,B
 	OR	C
 	JP	Z,DERROR
 	LD	A,(37ECH)
 	AND	2
 	JR	NZ,TST1
 	LD	BC,199DH
 	LD	HL,ERMSG9
 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
 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
 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
 	JP	NC,DERROR
 	POP	BC
 SKIPST	INC	IX
 	DEC	B
 	JP	NZ,STATLP
 	LD	IX,DRIVE0
 	RET
 SELECT	DEFB	3EH
 DRIVE	DEFB	1
 	LD	(37E1H),A
 	RET
 RESTOR	CALL	SELECT
 	LD	BC,0
 	CALL	60H
 	LD	HL,37ECH
 	LD	(HL),0BH
 	PUSH	AF
 	POP	AF
 	PUSH	AF
 	POP	AF
 RESLP	CALL	SELECT
 	LD	A,(HL)
 	RRCA
 	JR	C,RESLP
 	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
 DERROR	PUSH	HL
 	JP	DISPLY
 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
 	JP	ENTRY
 REQLEN	DEFB	0
 LENGTH	DEFB	0
 CHAR	DEFB	0
 NEWST	XOR	A
 	LD	(LENGTH),A
 	LD	HL,(4020H)
 	LD	A,(REQLEN)
 	LD	B,A
 	JR	GET15
 GETSTR	LD	HL,(4020H)
 	LD	A,B
 	LD	(REQLEN),A
 GET15	LD	(HL),20H
 	INC	HL
 	DJNZ	GET15
 	XOR	A
 	LD	(LENGTH),A
 	LD	HL,STRING
 	LD	DE,(4020H)
 SCAN	LD	A,8FH
 	LD	(DE),A
 	LD	BC,500H
 LOOP1	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,LOOP1
 	LD	A,20H
 	LD	(DE),A
 	LD	BC,500H
 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
 GOTONE	LD	(CHAR),A
 	CP	0DH
 	JR	Z,DONEST
 	CP	8
 	JR	Z,BCKSPA
 	CP	18H
 	JR	Z,NEWST
 	CP	20H
 	JP	C,SCAN
 	LD	A,(REQLEN)
 	LD	B,A
 	LD	A,(LENGTH)
 	CP	B
 	JR	NC,SCAN
 	LD	A,(CHAR)
 	LD	(DE),A
 	LD	(HL),A
 	INC	DE
 	INC	HL
 	LD	A,(LENGTH)
 	INC	A
 	LD	(LENGTH),A
 	JP	SCAN
 BCKSPA	LD	A,(LENGTH)
 	OR	A
 	JP	Z,SCAN
 	DEC	A
 	LD	(LENGTH),A
 	LD	A,20H
 	LD	(DE),A
 	LD	(HL),A
 	DEC	HL
 	DEC	DE
 	JR	SCAN
 DONEST	LD	A,20H
 	LD	(DE),A
 	LD	(HL),0DH
 	LD	A,(LENGTH)
 	OR	A
 	LD	B,A
 	LD	C,A
 	LD	A,(STRING)
 	LD	HL,STRING
 	LD	(4020H),DE
 	RET
 ENTRY	CALL	GETDAT
 	CALL	PRELUD
 	JP	ROUTIN
 FORMAT	LD	A,(DRIVE)
 	LD	C,0
 FMTLP1	RRCA
 	JR	C,DRVFND
 	INC	C
 	JR	FMTLP1
 DRVFND	LD	A,C
 	CALL	ASCII
 	LD	A,B
 	LD	(FMTDRV),A
 	CALL	DISPLY
 	DEFW	1F1CH
 	DEFM	'- BREEZE SPECIAL COPY UTILITY -'
 	DEFW	0D0DH
 	DEFM	'Copying on Drive '
 FMTDRV	DEFM	'0.'
 	DEFW	0D0DH
 	DEFB	0
 	CALL	RESTOR
 	XOR	A
 	LD	(TRAK),A
 	LD	IY,TRACKS
 FMTLP	LD	A,(TRAK)
 	CALL	ASCII
 	LD	(FMTTR),BC
 	CALL	DISPLY
 	DEFB	1DH
 	DEFM	'Formatting Track '
 FMTTR	DEFM	'00.'
 	DEFB	0
 	LD	A,0F9H
 	LD	(DATMRK),A
 	LD	HL,5F00H
 	LD	DE,ORDER
 	LD	B,0EH
 	CALL	FILLFF
 SECLP	LD	B,6
 	LD	C,0
 	CALL	FILL
 	LD	C,0FEH
 	CALL	FILL1
 	DEFB	0EH
 TRAK	DEFB	0
 	CALL	FILL1
 	LD	C,0
 	CALL	FILL1
 	LD	A,(DE)
 	LD	C,A
 	CALL	FILL1
 	LD	C,1
 	CALL	FILL1
 	LD	C,0F7H
 	CALL	FILL1
 	LD	C,0FFH
 	CALL	FILL1
 	LD	B,0BH
 	CALL	FILLFF
 	LD	B,6
 	LD	C,0
 	CALL	FILL
 	DEFB	0EH
 DATMRK	DEFB	0
 	CALL	FILL1
 	LD	B,0
 	DEFB	0EH
 	DEFB	0
 	CALL	FILL
 	LD	C,0F7H
 	CALL	FILL1
 	LD	C,0FFH
 	CALL	FILL1
 	LD	B,0BH
 	CALL	FILLFF
 	INC	DE
 	LD	A,(DE)
 	INC	A
 	JR	NZ,SECLP
 	LD	B,5BH
 	CALL	FILLFF
 	CALL	WRITTR
 NXTFMT	LD	A,(TRAK)
 	INC	A
 	LD	(TRAK),A
 	CP	(IY)
 	RET	Z
 	LD	A,5BH
 	LD	(37ECH),A
 	PUSH	AF
 	POP	AF
 	PUSH	AF
 	POP	AF
 STEPWT	LD	A,(37ECH)
 	RRCA
 	JR	C,STEPWT
 	JP	FMTLP
 WRITTR	CALL	TRWRIT
 	RET	Z
 TRWRIT	CALL	SELECT
 	LD	BC,5F00H
 	LD	HL,37ECH
 	LD	(HL),0F4H
 	LD	DE,37EFH
 	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)
 	LD	(DE),A
 	INC	BC
 	JP	WRBZZ
 WRDNZ	LD	A,(HL)
 	LD	(HL),0D0H
 	LD	HL,ERMSG2
 	BIT	2,A
 	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
 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
 WRITE	CALL	DISPLY
 	DEFB	0DH
 	DEFB	0
 	XOR	A
 	LD	(TRAK),A
 	LD	IY,TRACKS
 	CALL	RESTOR
 	LD	BC,0BA00H
 	LD	(BUFF),BC
 	LD	DE,0
 WRLOOP	PUSH	DE
 	CALL	SELECT
 	LD	A,E
 	CALL	ASCII
 	LD	A,B
 	LD	(ASSC1),A
 	POP	DE
 	PUSH	DE
 	LD	A,D
 	CALL	ASCII
 	LD	(ASSD1),BC
 	CALL	DISPLY
 	DEFB	1DH
 	DEFM	'Writing Track '
 ASSD1	DEFM	'00, Sector '
 ASSC1	DEFM	'0.'
 	DEFB	0
 	POP	DE
 	PUSH	DE
 	LD	BC,(BUFF)
 	CALL	DWRITE
 	LD	A,(37ECH)
 	BIT	2,A
 	LD	HL,BADMSG
 	JP	NZ,DERROR
 	LD	(BUFF),BC
 	POP	DE
 	INC	E
 	LD	A,E
 	SUB	0AH
 	JP	NZ,WRLOOP
 	LD	E,0
 	INC	D
 	LD	A,D
 	CP	(IY)
 	RET	Z
 	JP	WRLOOP
 BADMSG	DEFB	0DH
 	DEFM	'Error detected during write operation !'
 	DEFB	0
 	JP	ERRORD
 DWRITE	CALL	WRITE1
 DBADW	LD	HL,BADMSG
 	JP	NZ,DERROR
 	RET
 WRITE1	PUSH	BC
 	CALL	WRITE2
 	POP	HL
 	RET	Z
 	LD	B,H
 	LD	C,L
 WRITE2	LD	(37EEH),DE
 	PUSH	DE
 	CALL	SELECT
 	LD	HL,37ECH
 	LD	(HL),1BH
 	PUSH	AF
 	POP	AF
 	PUSH	AF
 	POP	AF
 SKWT	CALL	SELECT
 	LD	A,(HL)
 	RRCA
 	JR	C,SKWT
 	LD	(HL),0ABH
 	LD	DE,37EFH
 	PUSH	BC
 	POP	BC
 	PUSH	BC
 	POP	BC
 	NOP
 	JR	WRBZ
 BZWR	RRCA
 	JR	NC,WRDN
 WRBZ	LD	A,(HL)
 	BIT	1,A
 	JR	Z,BZWR
 	LD	A,(BC)
 	LD	(DE),A
 	INC	BC
 	JP	WRBZ
 WRDN	LD	A,(HL)
 	AND	1CH
 	POP	DE
 	RET	Z
 	LD	(HL),0D0H
 	RET
 DREAD	PUSH	BC
 	CALL	R2
 	POP	HL
 	RET	Z
 	LD	B,H
 	LD	C,L
 R2	LD	(37EEH),DE
 	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
 ORDER	DEFB	0
 	DEFB	5
 	DEFB	1
 	DEFB	6
 	DEFB	2
 	DEFB	7
 	DEFB	3
 	DEFB	8
 	DEFB	4
 	DEFB	9
 	DEFB	0FFH
 VERIFY	CALL	RESTOR
 	CALL	DISPLY
 	DEFB	0DH
 	DEFB	0
 	LD	D,0
 VERLP	LD	A,D
 	CALL	ASCII
 	LD	(ASDR),BC
 	LD	E,0
 VERLP1	PUSH	DE
 	CALL	SELECT
 	LD	A,E
 	CALL	ASCII
 	LD	A,B
 	LD	(ASSC),A
 	CALL	DISPLY
 	DEFB	1DH
 	DEFM	'Verifying Track '
 ASDR	DEFM	'00, Sector '
 ASSC	DEFM	'0.'
 	DEFB	0
 	POP	DE
 	LD	BC,5D00H
 	CALL	DREAD
 	LD	HL,ERMSGA
 	BIT	4,A
 	JP	NZ,DERROR
 	LD	HL,ERMSGB
 	BIT	3,A
 	JP	NZ,DERROR
 	LD	HL,ERMSGC
 	BIT	2,A
 	JP	NZ,DERROR
 	INC	E
 	LD	A,E
 	CP	0AH
 	JP	NZ,VERLP1
 	INC	D
 	LD	A,D
 	CP	(IY)
 	JP	NZ,VERLP
 	RET
 ERMSGA	DEFB	0DH
 	DEFM	'TRACK NOT FOUND during verify operation !'
 	DEFB	0
 	JP	ERRORD
 ERMSGB	DEFB	0DH
 	DEFM	'CRC ERROR occured during verify operation !'
 	DEFB	0
 	JP	ERRORD
 ERMSGC	DEFB	0DH
 	DEFM	'CAN '
 	DEFB	27H
 	DEFM	'T VERIFY one of the tracks !'
 	DEFB	0
 	JP	ERRORD
 GETDAT	CALL	DISPLY
 	DEFW	1F1CH
 	DEFM	'One moment to load data !'
 	DEFB	0
 	LD	BC,0BA00H
 	LD	DE,0300H
 	LD	HL,50
 GETLP	PUSH	HL
 	CALL	DREAD
 	POP	HL
 	DEC	L
 	RET	Z
 	INC	E
 	LD	A,E
 	SUB	0AH
 	JR	NZ,GETLP
 	LD	E,0
 	INC	D
 	JR	GETLP
 	END	ENTRY

 	LD	BC,0BA00H
 	LD	DE,0300H
 	LD	HL,50
 GETLP	PUSH	HL
 	CALL	DREAD
 	POP	HL
 	DEC	L
 	RET	Z
 	INC	E
 	LD	A,E
