CHANGE ;		* * * * * * * * * * * * *
 ;		*  PROGRAM BY KIM WATT  *
 ;		* BREEZE COMPUTING INC. *
 ;		*     P.O. BOX  1013    *
 ;		* BERKLEY, MICH.  48072 *
 ;		*    (313)  288-9422    *
 ;		* * * * * * * * * * * * * 												
 ;
 ;	THIS PROGRAM WILL CHANGE ALL OF THE DATA MARKS
 ;	ON A DISK FROM TRACKS 1 THROUGH 15.  THE
 ;	MARKS WILL BE CHANGED FROM STANDARD IBM 3740
 ;	FORMAT.  WILL BE CHANGED FROM 00 TO 11 HEX.
 ;
 ;	THIS WILL MAKE THE TRACKS UNREADABLE TO ALL BUT
 ;	THE LOADER WHICH IS INSTRUCTED TO TEST FOR THIS
 ;	CONDITION.  NONE OF THE DATA WILL BE ABLE TO BE
 ;	COPIED FROM THE TARGET DISKETTE TO ANOTHER.
 ;
 	ORG	7200H		;CLOBBER SYS0/SYS
 ENTRY	EI			;NO INTERRUPTIONS
 	LD	SP,7200H	;BELOW PROGRAM
 	CALL	DISPLY		;DISPLAY FOLLOWING
 	DEFW	1F1CH		;CLEAR SCREEN
 	DEFW	0D0DH
 	DEFM	'PRESS <ENTER> TO ALTER TRACK/SECTOR'
 	DEFM	' ID MARKERS.'
 	DEFB	0DH
 	DEFM	'DRIVE 0, TRACKS 1-34 AFFECTED.'
 	DEFW	0D0DH
 	DEFB	0
 GETKEY	CALL	2BH		;SCAN KEYBOARD
 	CP	0DH		; <ENTER> ?
 	JR	NZ,GETKEY	;WAIT SOME MORE
 	CALL	DISPLY		;WRITE MESSAGE
 	DEFM	'TRACKS 1-34 NOW BEING REFORMATTED.'
 	DEFW	0D0DH
 	DEFB	0		;TERMINATOR
 	LD	A,1		;DRIVE SELECT
 	LD	(37E1H),A	;	1=DRIVE 0
 	LD	DE,0100		;START TRACK/SECTOR
 	LD	BC,BUFFER	;BUFFER AREA FOR TRANSFER
 	LD	HL,22H		;34 TRACKS TO FIX
 	LD	(COUNT),HL	;SAVE FOR LATER
 	LD	(TRACE),DE	;SAVE IT TOO
 ROUTIN	CALL	READTR		;READ TRACK
 	CALL	ADJUST		;NEW ID MARKERS
 	CALL	WRITE		;WRITE TRACK
 	LD	HL,(COUNT)	;GET COUNT
 	DEC	HL		;DECREMENT
 	LD	(COUNT),HL	;SAVE AGAIN
 	LD	DE,(TRACE)	;GET TRACK/SECTOR
 	INC	D		;NEXT TRACK
 	LD	(TRACE),DE	;SAVE IT
 	LD	A,H		;GET H REG.
 	OR	L		; AND L TO SET FLAGS
 	JR	NZ,ROUTIN	;NEXT TRACK
 	CALL	DISPLY		;WRITE MESSAGE
 	DEFM	'OPERATION SUCCESSFUL!'
 	DEFB	0DH
 	DEFM	'1) TO RUN AGAIN'
 	DEFB	0DH
 	DEFM	'2) TO RE-BOOT'
 	DEFB	0DH
 	DEFB	0
 WAIT3	CALL	2BH		;SCAN KEYBOARD
 	CP	31		;	1 ?
 	JP	Z,ENTRY		;RUN AGAIN
 	CP	32		;	2 ?
 	JP	Z,0		;RE-BOOT
 	JR	WAIT3		;INVALID KEY
 DISPLY	POP	HL		;GET DATA POINTER
 LOOP8	LD	A,(HL)		;GET BYTE
 	INC	HL		;POINT TO NEXT BYTE
 	OR	A		;SET FLAGS
 	JR	Z,DONED		;DONE WITH DISPLAY
 	CALL	33H		;DISPLAY BYTE
 	JR	LOOP8		;DO IT AGAIN
 DONED	PUSH	HL		;PUT ON STACK FOR RETURN
 	RET			;BACK TO CALLER
 ERRORP	CALL	DISPLY		;MESSAGE
 	DEFM	'DISKETTE WRITE PROTECTED !'
 	DEFB	0DH
 	DEFM	'<ENTER> WHEN CORRECTED.'
 	DEFB	0DH
 	DEFB	0
 WAIT4	CALL	2BH		;SCAN KEYBOARD
 	CP	0DH		;	ENTER ?
 	JP	Z,ENTRY		;TRY AGAIN
 	JR	WAIT4		;INVALID KEY
 ERROR	CALL	DISPLY		;MESSAGE
 	DEFM	'DISK ERROR OCCURED !'
 	DEFB	0DH
 	DEFM	'<ENTER> TO TRY AGAIN.'
 	DEFB	0
 	JR	WAIT4
 READTR	LD	BC,BUFFER	;LOAD ADDRESS
 	LD	HL,0AH		;10 SECTORS TO READ
 LOOP1	CALL	READ		;READ A SECTOR
 	INC	E		;POINT TO NEXT SECTOR
 	DEC	L		;DECREMENT COUNTER
 	JR	NZ,LOOP1	;NEXT SECTOR
 	RET			;TRACK READ
 READ	LD	A,1		;RESELECT DRIVE
 	LD	(37E1H),A
 	LD	(37EEH),DE	;TRACK/SECTOR
 	LD	A,1BH		;SEEK BYTE
 	LD	(37ECH),A	;PERFORM
 	PUSH	AF
 	POP	AF
 	PUSH	AF
 	POP	AF
 WAIT5	LD	A,(37ECH)	;GET STATUS
 	RRCA			;SHIFY BUSY BIT
 	JP	C,WAIT5		;NOT DONE YET
 	LD	A,88H		;READ MULTIPLE SECTORS
 	PUSH	DE		;SAVE TRACK/SECTOR
 	LD	DE,37EFH	;DATA TRANSFER ADDRESS
 	LD	(37ECH),A	;PERFORM
 	PUSH	AF
 	POP	AF
 	PUSH	AF
 	POP	AF
 	JR	DATACK		;CHECK FOR READY
 BUSYCK	RRCA			;SHIFT BUSY BIT
 	JP	NC,DONER	;DONE READING
 DATACK	LD	A,(37ECH)	;GET STATUS
 	BIT	1,A		;VALID BYTE IN REGISTER ?
 	JP	Z,BUSYCK	;NOT READY
 	LD	A,(DE)		;GET BYTE FROM CONTROLLER
 	LD	(BC),A		;SAVE IN BUFFER
 	INC	BC		;POINT TO NEXT
 	JR	DATACK		;CHECK FOR NEXT BYTE
 DONER	POP	DE		;RESTORE TRACK/SECTOR
 	RET			;DONE WITH SECTOR
 ADJUST	LD	HL,BUFF2	;TRACK CONTENTS
 	LD	B,18		;PRE ID FIELD
 	LD	A,0FFH		;ALL BITS SET
 LOOP2	LD	(HL),A		;SAVE IN BUFFER
 	INC	HL		;POINT TO NEXT
 	DJNZ	LOOP2		;FILL
 	DEC	A		;ID ADDRESS MARKER
 	LD	(HL),A		;	TO BUFFER
 	INC	HL
 	LD	DE,(TRACE)	;GET TRACK/SECTOR
 	LD	(HL),D		;TRACK #
 	INC	HL
 	XOR	A
 	LD	(HL),A		;HEAD #
 	INC	HL
 	LD	(HL),A		;SECTOR #
 	INC	HL
 	LD	A,0A0H		;SECTOR LENGTH
 	LD	(HL),A
 	INC	HL
 	LD	A,0F7H		;CRC GENERATOR
 	LD	(HL),A
 	INC	HL
 	LD	B,11		;PRE SECTOR GAP
 	LD	A,0FFH		;FILL BYTE
 LOOP5	LD	(HL),A
 	INC	HL
 	DJNZ	LOOP5
 	XOR	A		;SYNC FIELD
 	LD	B,6
 LOOP6	LD	(HL),A
 	INC	HL
 	DJNZ	LOOP6
 	LD	A,0FBH		;DATA ID MARKER
 	LD	(HL),A
 	INC	HL
 	LD	DE,BUFFER	;POINT TO BUFFER
 	EX	DE,HL		;EXCHANGE POINTERS
 	LD	BC,2560		;NUMBER OF DATA BYTES
 	LDIR			;MOVE PREV DATA TO BUFFER
 	EX	DE,HL		;SWAP BACK
 	INC	HL
 	LD	A,0F7H		;CRC GENERATOR
 	LD	(HL),A
 	INC	HL
 	LD	A,0FFH		;POST DATA GAP
 	LD	BC,200H
 LOOP7	LD	(HL),A
 	INC	HL
 	DEC	BC
 	LD	A,B
 	OR	C
 	JR	NZ,LOOP7
 	RET			;ADJUSTMENT MADE
 WRITE	LD	BC,BUFF2	;NEW ID/DATA BUFFER
 	LD	A,1		;RESELECT DRIVE
 	LD	(37E1H),A
 	LD	HL,37ECH	;CONTROLLER ADDRESS
 	LD	(HL),0F4H	;WRITE TRACK BYTE
 	PUSH	AF
 	POP	AF
 	PUSH	AF
 	POP	AF
 	LD	DE,37EFH	;DATA TRANSFER ADDRESS
 	JP	DATACH		;CHECK FOR READY
 BUSYCH	RRCA			;COMMAND IN PROGRESS ?
 	JP	NC,DONEW	;DONE WITH ROUTINE
 DATACH	LD	A,(HL)		;GET STATUS
 	BIT	1,A		;READY TO ACCEPT DATA ?
 	JP	Z,BUSYCH	;CHECK FOR BUSY
 	LD	A,(BC)		;GET BYTE TO TRANSFER
 	LD	(DE),A		;SEND TO CONTROLLER
 	INC	BC		;POINT TO NEXT
 	JR	DATACH		;GET NEXT BYTE
 DONEW	LD	A,(HL)		;GET RESULT OF OPERATION
 	XOR	A		;ZERO THE REGISTER
 	RET			;TRACK IS WRITTEN
 COUNT	DEFW	0		;LOOP COUNTER
 TRACE	DEFW	0		;TRACK/SECTOR COUNT
 BUFFER	DEFS	0A00H		;RESERVE ROOM FOR 10 TRKS
 DUMMY	DEFS	100H		;PRECAUTION OF MIXING
 BUFF2	DEFB	0		;HERE ON UP
 	END	ENTRY
