RUIN   ;    WRITE TRACK
 	ORG	0E000H		;USE HIGH MEMORY
 DRIVE	EQU	1		; 1=DRIVE 0
 TRACK	DEFB	1		;STARTING TRACK TO RUIN
 SECTOR	EQU	0 	     ;COULD BE ANY SECTOR
 SEEK  	EQU	1BH     	;CODE TO SEEK
 STATUS	EQU	37ECH  	;STATUS & COMMAND ADDRESS ON DRIVE
 DATA	EQU	37EFH 		 ;DATA TRANSFER ADDRESS
 BUFFER	EQU	4200H 	 	;USER DEFINED AREA
 WRITE	EQU	0F4H		;WRITE TRACK BYTE
 START	DI			;DISABLE INTERRUPTS
 	LD	A,(STATUS)	;CLEAR LATCH
 	CALL	01C9H		;CLEAR SCREEN
 	LD	HL,MSG1		;POINT TO MESSAGE
 	CALL	PRINT		;DISPLAY IT
 	CALL	WAIT		;WAIT FOR <ENTER>
 	JP	ROUTIN		;DO IT !
 WAIT	CALL	002BH		;SCAN KEYBOARD
 	CP	0DH		;	<ENTER> ?
 	JR	NZ,WAIT		;WAIT SOME MORE
 	RET			;DONE
 JUP1	LD	HL,BUFFER	;POINT TO I/O BUFFER
 	LD	B,18		;FILLER
 	LD	A,0FFH		;BYTE TO FILL WITH
 FIL	LD	(HL),A		;LOAD 'EM
 	INC	HL		;NEXT BYTE IN BUFFER
 	DJNZ	FIL		;KEEP GOING
 	DEC	A		;ID MARK
 	LD	(HL),A		;ID ADDRESS MARK
 	INC	HL		;NEXT
 	LD	A,(TRACK)	;TRACK NUMBER
 	LD	(HL),A		;TRACK #
 	INC	HL
 	XOR	A
 	LD	(HL),A		;HEAD NUMBER
 	INC	HL
 	LD	(HL),A		;SECTOR
 	INC	HL
 	LD	A,0A0H
 	LD	(HL),A		;SECTOR LENGTH
 	INC	HL
 	LD	A,0F7H
 	LD	(HL),A		;CRC GENERATOR
 	INC	HL
 	LD	B,11		;BYTES TO FILL
 	LD	A,0FFH		;FILL BYTE
 GAP2	LD	(HL),A
 	INC	HL
 	DJNZ	GAP2
 	LD	B,6
 	XOR	A
 GAP0	LD	(HL),A		;SYNC GAP
 	INC	HL
 	DJNZ	GAP0
 	LD	A,0FBH
 	LD	(HL),A		;DATA ID
 	INC	HL
 	LD	A,0E5H		;DATA BYTES
 	LD	BC,2560		;DATA
 	PUSH	HL
 	POP	DE
 	INC	DE
 	LD	(HL),A
 	LDIR
 	LD	A,0F7H		;CRC GENERATOR
 	LD	(HL),A
 	INC	HL
 	INC	DE
 	LD	A,0FFH		;POST DATA FILLER
 	LD	(HL),A
 	LD	BC,255+255
 	LDIR			;FILL TO END OF TRACK
 	RET
 WRITIT	LD	A,(TRACK)	;CURRENT TRACK POINTER
 	LD	D,A		;PASS IT
 	LD	E,SECTOR	;GET SECTOR NUMBER
 	LD	A,DRIVE		;GET DRIVE
 	LD	(37E1H),A     ;SELECT DRIVE 0,1,2, OR 3
 	LD	HL,STATUS
 	LD	(37EEH),DE    ;SELECT TRACK
 	LD	(HL),SEEK    ;MOVE HEAD TO TRACK #
 	PUSH	HL
 	POP	HL
 	PUSH	HL
 	POP	HL
 QQ3	LD	A,(HL)		;FOUND ?
 	BIT	0,A		;COMMAND IN PROGRESS ?
 	JR	NZ,QQ3		;JUMP IF NO.
 	LD	A,DRIVE		;RESELECT DRIVE
 	LD	(37E1H),A	;RESELECT DRIVE
 	PUSH	AF
 	POP	AF
 	LD	(HL),WRITE	;WRITE THE TRACK.
 	LD	BC,BUFFER
 	POP	BC
 	PUSH	BC
 	POP	BC
 	PUSH	BC
 	JR	DRQCK		;WAIT TILL READY FOR DATA
 BSYCK	RRCA			;SHIFT OUT BIT 0
 	JR	NC,DONE		;WAIT TILL READY
 DRQCK	LD	A,(HL)		;GET STATUS
 	BIT	1,A		;DATA REGISTER FULL ?
 	JR	Z,BSYCK		;WAIT SOME MORE
 	LD	A,(BC)		;GET BYTE TO WRITE
 	LD	(DATA),A	;PASS TO CONTROLLER
 	INC	BC		;INCREMENT BUFFER POINTER
 	JR	DRQCK		;WAIT TILL COMMAND DONE
 DONE	LD	A,(HL)		;TEST FOR GOOD WRITE
 	RET
 PRINT	LD	A,(HL)		;GET DATA BYTE
 	CP	03		;TERMINATOR ?
 	RET	Z		;DONE IF YES
 	CALL	0033H		;DISPLAY BYTE
 	INC	HL		;POINT TO NEXT BYTE
 	JR	PRINT		;DO IT AGAIN
 MSG1	DEFB	17H		;DOUBLE WIDTH DISPLAY
 	DEFW	0D0DH
 	DEFM	'PRESS <ENTER>'
 	DEFB	0AH
 	DEFM	'TO RUIN TRACKS 1,2,7,12-34'
 	DEFB	0AH
 	DEFM	'ON DRIVE 0'
 	DEFB	03H
 MESG2	DEFB	17H
 	DEFW	0D0DH
 	DEFM	'"COPY" NOW DISABLED'
 	DEFB	0AH
 	DEFM	'ON DISK IN DRIVE 0'
 	DEFB	0AH
 	DEFM	'LOAD SYSTEM DISKETTE'
 	DEFM	'PRESS <ENTER>'
 	DEFB	03H
 SAD	CALL	1C9H			;CLEAR SCREEN
 	LD	HL,MESG2		;POINT TO MESSAGE
 	CALL	PRINT
 	CALL	WAIT
 	JP	0
 ROUTIN	CALL	JUP1	;STRUCTURE BUFFER
 	LD	A,1	;TRACK TO FIX
 	LD	(TRACK),A
 	CALL	WRITIT			;WRITE TRACK
 	LD	A,2
 	LD	(TRACK),A		;KEEP IT GOING
 	CALL	WRITIT
 	LD	A,7
 	LD	(TRACK),A
 	CALL	WRITIT
 	LD	A,12
 ROUTE	LD	(TRACK),A
 	CP	35
 	JP	NC,SAD
 	PUSH	AF
 	CALL	WRITIT
 	POP	AF
 	INC	A
 	JR	ROUTE
 	END	START
