TRAKFI ;		* * * * * * * * * * * * *
 ;		*  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	7000H		;ABOVE DOS
 ENTRY	DI			;NO INTERRUPTIONS
 	LD	SP,7000H	;RIGHT BELOW PROGRAM
 	CALL	DISPLY		;DISPLAY FOLLOWING DATA
 	DEFW	1F1CH		;CLEAR SCREEN
 	DEFW	0A0AH		;LINEFEEDS
 	DEFM	'PRESS <ENTER> TO ALTER SECTOR MARKERS'
 	DEFB	0AH
 	DEFM	'ON TRACKS 1 - 15 IN DRIVE 0.'
 	DEFW	000AH		;CR AND TERMINATOR
 GETKEY	CALL	2BH		;SCAN KEYBOARD
 	CP	0DH		; <ENTER> KEY ?
 	JR	NZ,GETKEY	;WAIT SOME MORE
 	CALL	RESTOR		;RESTORE REGISTERS
 	LD	HL,150		;150 SECTORS TO LOAD
 	LD	DE,0100H	;TRACK/SECTOR OF DATA
 	LD	BC,BUFFER	;LOAD ADDRESS
 	CALL	RAEDIT		;READ 15 TRACKS
 	LD	HL,150		;150 SECTORS TO WRITE
 	LD	DE,0100H	;TRACK/SECTOR TO WRITE
 	LD	BC,BUFFER	;ADDRESS OF DATA
 	CALL	WRITIT		;PERFORM THE OPERATION
 	CALL	DISPLY		;DISPLAY DONE MESSAGE
 	DEFW	0D0DH		;CARRIAGE RETURNS
 	DEFM	'OPERATION COMPLETED SUCCESSFULLY.'
 	DEFB	0AH
 	DEFM	'COPY COMMAND NOW DISABLED.'
 	DEFB	0AH
 	DEFM	'1 TO RUN AGAIN'
 	DEFB	0AH
 	DEFM	'2 TO RE-BOOT'
 	DEFW	000AH
 WAITFR	CALL	2BH		;SCAN KEYBOARD
 	CP	31H		;	1 ?
 	JP	Z,ENTRY		;DO OVER
 	CP	32H		;	2 ?
 	JP	Z,0H		;RE-BOOT
 	JR	WAITFR		;INVALID KEY INPUT
 RAEDIT	PUSH	HL		;SAVE TRACK/SECTOR
 AGAIN	LD	A,1		;SELECT
 	LD	(37E1H),A	;	DRIVE 0
 ;
 	CALL	READ		;READ A SECTOR
 	POP	HL		;GET SECTOR COUNT
 	DEC	L		;DECREMENT COUNTER
 	RET	Z		;DONE READING
 ; THIS RETURN INSTRUCTION WILL TRANSFER CONTROL
 ;	TO THE PROGRAM THAT WAS JUST LOADED.
 ;	USER MAY POP THIS VALUE AND JUMP ELSEWHERE.
 	PUSH	HL		;PUSH COUNT BACK ON STACK
 	INC	E		;INCREMENT SECTOR POINTER
 	LD	A,E		;TEST IS SECTOR COUNT IS
 	SUB	0AH		;   OVER 10
 	JP	NZ,AGAIN	;BACK FOR NEXT SECTOR
 	LD	E,A		;SECTOR COUNT -10
 	INC	D		;INCREMENT TRACK COUNT
 	JP	AGAIN		;GET NEXT SECTOR
 READ	PUSH	BC		;SAVE BEGINNING POINTER
 	CALL	READIT		;READ THE SECTOR
 	POP	HL		;CURRENT LOAD POINTER
 	RET	Z		;READ WAS SUCCESSFUL
 ;  IF THE FIRST READ IS UNSUCCESSFUL, ONE MORE TRY !
 	LD	B,H		;TRANSFER POINTER
 	LD	C,L		;   TO BYTE COUNTER
 READIT	LD	(37EEH),DE	;TRACK/SECTOR TO SEEK
 	LD	HL,37ECH	;COMMAND REGISTER
 	LD	(HL),1FH	;SEEK BYTE
 ;	RESULT:	LOAD HEAD
 ;		DO NOT VERIFY
 ;		STEPPER MOTOR AT 20 MS.
 ;		SEEK TRACK AND SECTOR
 	PUSH	AF
 	POP	AF
 	PUSH	AF
 	POP	AF
 ;  SMALL DELAY FOR THE CONTROLLER STATUS TO BECOME VALID
 TESTBZ	LD	A,(HL)		;GET CONTROLLER STATUS
 	RRCA			;BIT 0 IS SET IF COMMAND
 	JP	C,TESTBZ	;	IN PROGRESS
 	LD	(HL),8CH	;READ SECTOR BYTE
 ;	RESULT:	SINGLE SECTOR READ/WRITE
 ;		IBM 3740 DATA FORMAT (STANDARD)
 ;		HEAD ASSUMED ENGAGED
 	PUSH	DE		;SAVE TRACK/SECTOR
 	LD	DE,37EFH	;DATA TRANSFER ADDRESS
 	PUSH	BC
 	POP	BC
 	PUSH	BC
 	POP	BC
 ;  SMALL DELAY FOR THE CONTROLLER STATUS TO BECOME VALID
 	JP	BZTEST		;WAIT FOR READY
 TEST	RRCA			;BIT 0 SET IF BUSY
 	JP	NC,TEST1	;NOT READY YET
 BZTEST	LD	A,(HL)		;GET STATUS BYTE
 	BIT	1,A		;BIT 1 IS SET IF 37EF
 	JP	Z,TEST		;  CONTAINS VALID BYTE
 	LD	A,(DE)		;GET THE NEW BYTE
 	LD	(BC),A		;SAVE IN BUFFER
 	INC	BC		;POINT TO NEXT LOAD ADDR.
 	JP	BZTEST		;WAIT FOR NEXT BYTE
 TEST1	LD	A,(HL)		;GET STATUS BYTE
 	AND	5CH		;WAS READ OK ?
 	POP	DE		;RESTORE LOAD POINTER
 	RET	Z		;SUCCESSFUL READ
 	LD	(HL),0D0H	;FORCE INTERRUPT OF DISK
 	RET			;DISK ERROR
 ERROR	CALL	DISPLY		;DISPLAY MESSAGE
 	DEFB	17H		;VIDEO DOUBLE SIZE
 ;  USER ERROR MESSAGE IF I/O ERROR DURING LOAD PROCESS
 	DEFM	'!!   DISK ERROR   !!'
 	DEFB	0		;END OF MESSAGE
 	HALT
 	JP	ENTRY		;DO IT AGAIN
 ;  ADDRESS OF WHERE ERROR WAS GENERATED IS ON STACK
 ;	USER MAY RETRY-TO READ BY PRESSING ANY KEY
 DISPLY	POP	HL
 ;  FIRST BYTE AFTER CALL IS FIRST BYTE OF MESSAGE
 LOOPER	LD	A,(HL)		;GET MESSAGE BYTE
 	OR	A		;SET FLAGS
 	INC	HL		;POINT TO NEXT BYTE
 	JP	Z,DONE		;END OF MESSAGE READ
 	CALL	33H		;DISPLAY BYTE ON VIDEO
 	JP	LOOPER		;DO IT AGAIN
 DONE	PUSH	HL
 ;  HL POINTS TO NEXT BYTE AFTER DATA WHICH IS ALSO
 ;	THE RETURN ADDRESS OF THE ROUTINE.
 	RET			;BACK TO WORK
 DONERW	POP	HL		;REMOVE LOAD ADDRESS
 	RET			;BACK TO CALLER
 TYPE	DEFB	0		;READ/WRITE TYPE
 WRITIT	PUSH	HL		;SAVE TRACK/SECTOR
 AGAIN2	LD	A,1		;SELECT
 	LD	(37E1H),A	;	DRIVE 0
 	CALL	RESTOR		;RESTOR REGISTER
 	CALL	WRITE		;WRITE A SECTOR
 	POP	HL		;GET SECTOR COUNT
 	DEC	L		;DECREMENT COUNTER
 	RET	Z		;SECTORS WRITTEN
 	PUSH	HL		;RE-SAVE COUNT
 	INC	E		;INCREMENT SECTOR
 	LD	A,E		;SEE IF >10
 	SUB	0AH		;	SECTOR COUNT
 	JP	NZ,AGAIN2	;BACK FOR NEXT SECTOR
 	LD	E,A		;SECTOR COUNT -10
 	INC	D		;INCREMENT TRACK COUNT
 	JP	AGAIN2		;NEXT SECTOR
 WRITE	PUSH	BC		;SAVE BUFFER POINTER
 	CALL	WRITI2		;WRITE THE SECTOR
 	POP	HL		;CURRENT LOAD POINTER
 	RET			;ASSUME SUCCESSFUL WRITE
 WRITI2	LD	(37EEH),DE	;TRACK/SECTOR TO SEEK
 	LD	HL,37ECH	;COMMAND REGISTER
 	LD	(HL),1FH	;SEEK BYTE
 	PUSH	AF
 	POP	AF
 	PUSH	AF
 	POP	AF
 TESBZ2	LD	A,(HL)		;GET STATUS
 	RRCA			;BIT 0 SET IF COMMAND
 	JP	C,TESBZ2	;	IN PROGRESS
 	LD	(HL),0ADH	;WRITE SECTOR
 	PUSH	DE
 	LD	DE,37EFH	;DATA TRANSFER ADDRESS
 	PUSH	BC
 	POP	BC
 	PUSH	BC
 	POP	BC
 	JP	BZTES2		;WAIT FOR READY
 TEST2	RRCA			;BIT 0 SET IF BUSY
 	JP	NC,TEST12	;NOT READY YET
 BZTES2	LD	A,(HL)		;GET STATUS
 	BIT	1,A		;BIT 1 IS SET IF 37EF
 	JP	Z,TEST		;  WROTE THE DATA
 	LD	A,(BC)		;GET BYTE TO WRITE
 	LD	(DE),A		;WRITE BYTE TO DISK
 	INC	BC		;POINT TO NEXT BYTE
 TEST12	LD	A,(HL)		;GET STATUS
 	XOR	A		;SET WRITE TO OK
 	POP	DE		;RESTORE LOAD POINT
 	RET			;SUCCESSFUL WRITE
 RESTOR	EXX			;ALTERNATE REGISTERS
 	LD	A,3		;RESTORE BYTE
 	LD	(37ECH),A	;	DO IT
 	LD	BC,0		;DELAY FOR WAIT
 	CALL	60H		;	LOOP
 RESWAT	LD	A,(37ECH)	;GET STATUS
 	AND	1		;CHECK BIT 0
 	JR	NZ,RESWAT	;WAIT TILL READY
 	EXX			;SWAP BACK
 	RET			;RESTORE DONE
 BUFFER	DEFB	0		;MEMORY TO USE
 	END	ENTRY
