MCOPY/ 	ORG	8000H
 STATCK	CALL	SELECT
 	CALL	STATUS
 	CALL	SELEC2
 	CALL	STATUS
 	RET
 STATUS	LD	BC,0
 	CALL	60H
 	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	SELEC2
 	LD	BC,0
 	CALL	60H
 FMTLP	LD	B,0F9H		;DATA MARK
 GOFMT1	LD	A,B		;GET TYPE OF WRITE BYTE
 	LD	(DATMRK),A	;SAVE INTO BUFFER
 	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
 	DEFB	0EH		;LOAD C OPCODE
 DATMRK	DEFB	0		;DATA MARK TYPE
 	CALL	FILL1
 	LD	B,0
 	DEFB	0EH		;LOAD C OPCODE
 FILBYT	DEFB	0E5H		;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
 	OR	A
 	JR	Z,NEX11
 	DEC	A
 	DEC	A
 	JR	NEX22
 NEX11	LD	A,7FH
 NEX22	LD	(TRAK),A
 	CP	3BH
 	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	7FH
 	DEFB	7DH
 	DEFB	7BH
 	DEFB	79H
 	DEFB	77H
 	DEFB	75H
 	DEFB	73H
 	DEFB	71H
 	DEFB	6FH
 	DEFB	0FFH		;TERMINATOR
 DRTRK	DEFB	11H		;DIRECTORY TRACK
 	DEFB	01
 	DEFW	0FFFFH
 	DEFW	0
 	DEFW	0
 	DEFW	0
 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
 	LD	(HL),0A9H
 	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	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	EXX
 	CALL	SELECT
 	CALL	MOVEIN
 	CALL	SELEC2
 	CALL	MOVEIN
 	EXX
 	RET
 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	'MICROSOFT ADVENTURE COPY UTILITY'
 	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	STATCK
 	CALL	FORMAT
 	CALL	RESTOR
 	LD	DE,0
 COPY	LD	A,D
 	LD	(37EDH),A
 	CALL	READ
 	CALL	WRITE
 	LD	A,E
 	OR	A
 	JR	Z,CP11
 	DEC	A
 	DEC	A
 	LD	E,A
 	CP	6DH
 	JR	Z,NEXTRK
 	JR	COPY
 CP11	LD	E,7FH
 	JR	COPY
 NEXTRK	LD	E,0
 	LD	A,D
 	OR	A
 	JR	Z,CP22
 	DEC	A
 	DEC	A
 	LD	D,A
 	CP	3BH
 	JP	Z,TERMIN
 	JR	COPYZZ
 CP22	LD	D,7FH
 COPYZZ	CALL	STEP
 	JR	COPY
 TERMIN	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'COPY COMPLETE !!'
 	DEFB	0
 BAD1	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'MOUNT SYSTEM DISKETTE ON DRIVE 0, PRESS <ENTER> '
 	DEFB	0
 	LD	HL,BUFFER
 	LD	B,1
 	CALL	40H
 	JP	402DH
 RESTOR	CALL	SELECT
 	CALL	RES1
 	CALL	SELEC2
 	CALL	RES1
 	RET
 RES1	LD	HL,37ECH
 	LD	BC,0
 	CALL	60H
 	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
 	CALL	RES1
 	RET
 RES1	LD	HL,37ECH
 	LD	BC,0
 	CALL	60H
 	LD	(HL),0BH
 	PUSH	AF
 	POP	AF
 	PUSH	AF
