PURGE  ;		* * * * * * * * * * * * *
 ;		*  PROGRAM BY KIM WATT  *
 ;		* BREEZE COMPUTING INC. *
 ;		*     P.O. BOX  1013    *
 ;		* BERKLEY, MICH.  48072 *
 ;		*    (313)  288-9422    *
 ;		* * * * * * * * * * * * *
 ;
 ;
 	ORG	7000H		;SPARE THE DOS
 ENTRY	DI			;KEEP OUT INTRUDERS
 	LD	SP,ENTRY	;BELOW THE PROGRAM
 	CALL	HDING		;DISPLAY HEADING
 	CALL	DISPLY		;DISPLAY MESSAGE
 	DEFB	0DH
 	DEFM	'BY '
 KIM	DEFM	'KIM WATT'
 	DEFB	0DH
 COPYR	DEFM	'COPYRIGHT (C) 1980'
 	DEFB	0DH
 BREEZE	DEFM	'BREEZE COMPUTING INC.'
 	DEFB	0DH
 POBOX	DEFM	'P.O. BOX 1013'
 	DEFB	0DH
 BERKLY	DEFM	'BERKLEY, MICH. 48072'
 	DEFB	0DH
 AREA	DEFM	'(313)  '
 PHONE	DEFM	'288-9422'
 	DEFW	0D0DH
 	DEFM	'INSERT TARGET DISKETTE INTO DRIVE 0'
 	DEFW	0D0DH
 	DEFM	'<ENTER> TO BEGIN ! '
 	DEFB	0
 	LD	B,1		;ONE CHARACTER
 	CALL	GETSTR		;	FROM KEYBOARD
 	CALL	HDING		;CLEAR LOWER SCREEN
 	LD	A,0DH		;LEAVE ONE LINE
 	CALL	33H		;BLANK
 	CALL	GETDIR		;GET THE DIRECTORY
 	JP	START		;DISPLAY DIRECTORY-WAIT
 GOAGN	CALL	HDING		;CLEAR SCREEN & HEADING
 	CALL	DISPLY
 	DEFM	'*******   DIRECTORY CHANGES ARE NOT '
 	DEFM	'PERMANENT UNTIL OPTION <K>'
 	DEFB	0DH
 	DEFB	0
 	CALL	DISPLY		;RESUME
 	DEFM	'<A>  SELECTIVE PURGE'
 	DEFB	0DH
 	DEFM	'<B>  KILL ALL VISIBLE FILES'
 	DEFB	0DH
 	DEFM	'<C>  KILL ALL INVISIBLE FILES'
 	DEFB	0DH
 	DEFM	'<D>  KILL ALL INVISIBLE, NON-SYSTEM'
 	DEFM	' FILES'
 	DEFB	0DH
 	DEFM	'<E>  KILL ALL  /CMD  FILES'
 	DEFB	0DH
 	DEFM	'<F>  KILL ALL  /BAS  FILES'
 	DEFB	0DH
 	DEFM	'<G>  KILL ALL SYSTEM FILES'
 	DEFB	0DH
 	DEFM	'<H>  KILL ALL FILES EXCEPT BOOT AND DIR'
 	DEFB	0DH
 	DEFM	'<I>  ZERO OUT ALL UNUSED DIRECTORY'
 	DEFM	' ENTRIES'
 	DEFB	0DH
 	DEFM	'<J>  ZERO OUT ALL UNUSED DISK SECTORS'
 	DEFB	0DH
 	DEFM	'<K>  WRITE UPDATED DIRECTORY BACK TO'
 	DEFM	' DISK'
 	DEFB	0DH
 	DEFM	'<L>  CANCEL CHANGES AND RESTART'
 	DEFB	0DH
 	DEFB	'?'
 	DEFB	0
 	LD	B,1
 	CALL	GETSTR		;PROMPT
 	CP	41H		;	SELECTIVE ?
 	JP	Z,TCELES
 	CP	42H		;	VISABLE ?
 	JP	Z,VISAB
 	CP	43H		;	INVISABLE ?
 	JP	Z,INVIS
 	CP	44H		;	INVIS, NON-SYS ?
 	JP	Z,INNSYS
 	CP	45H		;	COMMAND FILES ?
 	JP	Z,CMD
 	CP	46H		;	BASIC FILES ?
 	JP	Z,BAS
 	CP	47H		;	SYSTEM FILES ?
 	JP	Z,SYS
 	CP	48H		;	WHOLE THING ?
 	JP	Z,ALL
 	CP	49H		;	ZERO DIR ENTRIES?
 	JP	Z,ZERO
 	CP	4AH		;	ZERO UNUSED SECS
 	JP	Z,ERASE
 	CP	4BH		;	WRITE DIRECTORY ?
 	JP	Z,WRITE
 	CP	4CH		;	CANCEL ?
 	JP	Z,ENTRY
 	JP	GOAGN		;BAD INPUT
 DISPLY	LD	A,(BREEZE)	;NAME STILL THERE ?
 	CP	'B'		;TESTING
 	JP	NZ,REPAIR	;FIX IT
 	POP	HL		;DATA POINTER ON STACK
 LOOPA	LD	A,(HL)		;GET A BYTE
 	INC	HL		;POINT TO NEXT
 	OR	A		;SET FLAGS
 	JR	Z,DONE1		;TERMINATOR FOUND
 	CALL	33H		;DISPLAY THE BYTE
 	JR	LOOPA		;DO IT AGAIN
 DONE1	PUSH	HL		;SAVE RETURN ADDRESS
 	RET			;GO TO IT
 STRING	DEFS	40H		;255 BYTE STRING BUFFER
 LENGTH	DEFB	0		;LENGTH OF INPUT STRING
 REQLEN	DEFB	0		;REQUESTED LENGTH
 CHAR	DEFB	0		;LAST INPUT CHARACTER
 NEWST	XOR	A
 	LD	(LENGTH),A	;ZERO THE LENGTH
 	LD	HL,(4020H)	;GET START CURSOR POSIT
 	JR	LOOP15		;BACK TO ROUTINE
 GETSTR	EXX			;ALTERNATE
 	LD	A,(KIM)		;TEST FOR TAMPERING
 	CP	'K'		;IS IT RIGHT ?
 	JP	NZ,REPAIR	;TERMINATE !
 	EXX			;CONTINUE
 	LD	HL,(4020H)	;GET CURSOR POSITION
 	LD	A,B		;GET REQUESTED LENGTH
 	LD	(REQLEN),A	;SAVE IT
 LOOP15	LD	(HL),20H	;PUT SPACES ON AREA TO BE
 	INC	HL		;    TYPED INTO
 	DJNZ	LOOP15		;NEXT SPACE
 	XOR	A		;ZERO THE ACCUMULATOR
 	LD	(LENGTH),A	;INITIALIZE LENGTH
 	LD	HL,STRING	;SET POINTER TO BEGINNING
 ;					OF BUFFER AREA
 	LD	DE,(4020H)	;GET CURSOR POSITION
 SCAN	LD	A,8FH		;CURSOR CHARACTER
 	LD	(DE),A		;CURSOR ON
 	LD	BC,4FFH		;DELAY COUNT
 LOOP1	DEC	BC		;START COUNT
 	PUSH	BC		;SAVE COUNT
 	PUSH	DE		;MUST SAVE
 	PUSH	IY		;   <DE> AND <IY>
 	CALL	2BH		;ROM KEYBOARD SCAN
 	POP	IY		;RESTORE
 	POP	DE		;   <DE> AND <IY>
 	POP	BC		;RESTORE COUNT
 	OR	A		;SET FLAGS
 	JP	NZ,GOTONE	;IF KEY WAS PRESSED
 	LD	A,B		;TEST <BC> REG. FOR
 	OR	C		;   ZERO VALUE
 	JR	NZ,LOOP1	;GO BACK IF NOT DONE
 	LD	A,20H		;CURSOR CHARACTER
 	LD	(DE),A		;CURSOR OFF
 	LD	BC,4FFH		;DELAY COUNT
 LOOP2	DEC	BC		;START COUNT
 	PUSH	BC		;SAVE COUNT
 	PUSH	DE		;MUST SAVE
 	PUSH	IY		;   <DE> AND <IY>
 	CALL	2BH		;ROM KEYBOARD SCAN
 	POP	IY		;RESTORE
 	POP	DE		;   <DE> AND <IY>
 	POP	BC		;RESTORE COUNT
 	OR	A		;SET FLAGS
 	JP	NZ,GOTONE	;NEW KEY IF <ACC> >< 0
 	LD	A,B		;GET VALUE OF B
 	OR	C		;ANY BITS ON ?
 	JR	NZ,LOOP2	;NEXT LOOP
 	JR	SCAN		;DO IT AGAIN
 ;  KEY PRESSED IS IN <A> REG.
 GOTONE	LD	(CHAR),A	;SAVE INPUT CHARACTER
 	CP	0DH		;IS IT A CARRIAGE RETURN
 	JP	Z,DONE		;GO IF IT IS
 	CP	8		;IS IT A BACKSPACE
 	JR	Z,BCKSPA	;SEE IF IT'S OK
 	CP	18H		;SHIFT LEFT ARROW
 	JR	Z,NEWST		;INITIALIZE IF YES
 	CP	20H		;SEE IF A NON-ALPHA KEY
 	JP	C,SCAN		;   WAS PRESSED
 	LD	A,(REQLEN)	;GET REQUESTED LENGTH
 	LD	B,A		;GIVE VALUE TO <B> REG.
 	LD	A,(LENGTH)	;GET CURRENT LENGTH
 	CP	B		;COMPARE VALUES
 	JR	NC,SCAN		;TOO MANY CHARACTERS
 ;  HERE THE NEW KEY IS DISPLAYED AND STORED IN <STRING>
 	LD	A,(CHAR)	;RESTORE INPUT CHARACTER
 	LD	(DE),A		;PUT IT ON VIDEO
 	LD	(HL),A		;PUT IT IN BUFFER
 	INC	DE		;INCREMENT <HL> AND <DE>
 	INC	HL		;    TABLE POINTERS
 	LD	A,(LENGTH)	;GET LENGTH
 	INC	A		;ADD 1
 	LD	(LENGTH),A	;SAVE VALUE
 	JR	SCAN		;GET NEXT KEY
 BCKSPA	LD	A,(LENGTH)	;GET CURRENT LENGTH
 	OR	A		;SET FLAGS
 	JR	Z,SCAN		;NO CHARACTERS IN BUFFER
 	DEC	A		;SUBTRACT 1
 	LD	(LENGTH),A	;NEW LENGTH
 	LD	A,20H		;CURSOR OFF CHAR.
 	LD	(DE),A		;CURSOR OFF
 	LD	(HL),A		;PUT SPACE IN BUFFER
 	DEC	HL		;DECREMENT BOTH
 	DEC	DE		;    TABLE POINTERS
 	JR	SCAN		;GET ANOTHER KEY
 DONE	LD	A,20H		;ASCII - SPACE
 	LD	(DE),A		;CURSOR OFF
 	LD	(HL),0DH	;CARRIAGE RETURN
 	LD	A,(LENGTH)	;GET LENGTH
 	LD	B,A		;GIVE TO B REG.
 	LD	A,(STRING)	;GET FIRST INPUT CHAR.
 	LD	HL,STRING	;POINT TO BUFFER
 	RET			;ALL DONE
 CLRBOT	LD	HL,3C40H	;ROUTINE TO CLEAR
 	LD	(4020H),HL	;	LOWER SCREEN
 	LD	A,1FH
 	CALL	33H
 	RET			;DONE
 GETDIR	LD	A,(BERKLY)	;NAME STILL THERE ?
 	CP	'B'		; WELL ?
 	JP	NZ,REPAIR	;FIX IT UP
 	CALL	DISPLY		;BACK TO NORMAL
 	DEFW	0D0DH
 	DEFM	'LOADING BOOT TO LOCATE DIRECTORY'
 	DEFB	0
 	LD	BC,0A000H	;BUFFER TO LOAD BOOT
 	LD	DE,0		;TRACK/SECTOR
 	LD	HL,1		;# OF SECTORS
 	CALL	READ		;READ SECTOR
 	JP	NZ,ERROR	;DIDN'T WORK RIGHT
 	LD	A,(0A000H)	;GET FIRST BYTE
 	LD	D,A		;SAVE IT
 	LD	A,(0A001H)	;GET NEXT
 	LD	E,A		;SAVE IT
 	LD	A,(0A002H)	;GET DIRECTORY TRACK
 	LD	C,A		;SAVE IT
 	LD	A,D		;GET FIRST BYTE
 	OR	A		;SET FLAGS
 	JP	NZ,NOBOOT	;NOT DOS BOOT
 	LD	A,E		;GET SECOND BYTE
 	CP	0FEH		;COMPARE
 	JP	NZ,NOBOOT	;NOT DOS BOOT
 	LD	A,C		;GET DIRECTORY TRACK
 	CP	61H		;	> 96 ?
 	JP	NC,NOBOOT	;BAD TRACK COUNT
 	PUSH	BC		;SAVE DIRECTORY TRACK
 	CALL	DISPLY		;PRINT WHICH TRACK
 	DEFB	0DH
 	DEFM	'DIRECTORY IS ON TRACK '
 	DEFB	0
 	LD	A,C		;GET TRACK BACK
 	CALL	HEXCV		;CONVERT TO ASCII
 	PUSH	HL		;SAVE IT
 	LD	A,H		;GET HIGH ORDER BYTE
 	CALL	33H		;DISPLAY IT
 	POP	HL
 	LD	A,L		;GET LOW ORDER BYTE
 	CALL	33H		;DISPLAY IT
 	LD	A,'H'		;SHOW AS HEX VALUE
 	CALL	33H		;DISPLAY IT
 	CALL	DISPLY		;NEW MESSAGE
 	DEFW	0D0DH
 	DEFM	'LOADING DIRECTORY'
 	DEFB	0
 	POP	BC		;RESTORE DIRECTORY TRACK
 	LD	D,C		;GIVE IT TO D REG.
 	LD	E,0		;SECTOR 0
 	EX	DE,HL		;SWAP
 	LD	(DIRTRK),HL	;SAVE IT
 	EX	DE,HL		;BACK
 	LD	BC,0B000H	;LOAD BUFFER
 	LD	HL,0AH		;# OF SECTORS TO READ
 	CALL	READ		;GET THEM
 	RET			;DONE
 DIRTRK	DEFW	00		;DIRECTORY TRACK/SECTOR
 READ	PUSH	BC		;SAVE LOAD ADDRESS
 	PUSH	HL		;SAVE # OF SECTORS
 AGAIN	CALL	READA		;READ A SECTOR
 	JP	NZ,ERROR	;ERROR DETECTED
 	POP	HL		;GET LOOP COUNT
 	DEC	L		;REDUCE COUNT
 	JR	Z,DONERD	;DONE READING
 	PUSH	HL		;RESAVE IT
 	INC	E		;NEXT SECTOR POINTER
 	LD	A,E		;PASS TO ACCUMULATOR
 	SUB	0AH		;10 SECTORS
 	JP	NZ,AGAIN	;NOT DONE
 	LD	E,A		;SECTOR COUNT -10
 	INC	D		;NEXT TRACK
 	JP	AGAIN		;GET NEXT SECTOR
 DONERD	POP	BC		;RELEASE LOAD POINT
 	RET			;DONE WITH READ
 READA	PUSH	BC		;SAVE POINTER
 	CALL	READB		;READ THE SECTOR
 	POP	HL		;GET LOAD POINTER
 	RET	Z		;SUCCESSFUL
 	LD	B,H		;TRY ONE MORE TIME
 	LD	C,L		;	IF BAD READ
 READB	LD	(37EEH),DE	;TRACK/SECTOR
 	LD	A,1		;SELECT
 	LD	(37E1H),A	;	DRIVE 0
 	PUSH	AF
 	POP	AF
 	LD	HL,37ECH	;COMMAND REGISTER
 	LD	(HL),1BH	;SEEK BYTE
 	PUSH	AF
 	POP	AF
 	PUSH	AF
 	POP	AF
 TESTBZ	LD	A,(HL)		;GET STATUS
 	RRCA			;COMMAND IN PROGRESS ?
 	JP	C,TESTBZ	;NOT DONE
 	LD	(HL),88H	;READ SECTOR BYTE
 	PUSH	DE		;SAVE TRACK/SECTOR
 	LD	DE,37EFH	;DATA TRANSFER ADDRESS
 	PUSH	BC
 	POP	BC
 	JR	BZTEST		;WAIT FOR OK TO CONTINUE
 TEST	RRCA			;BIT 0 SET IF BUSY
 	JP	NC,TEST1	;DONE WITH COMMAND
 BZTEST	LD	A,(HL)		;GET STATUS BYTE
 	BIT	1,A		;VALID DATA PRESENT ?
 	JP	Z,TEST		;GUESS NOT
 	LD	A,(DE)		;GET NEW BYTE
 	LD	(BC),A		;PUT IT IN BUFFER
 	INC	BC		;POINT TO NEXT
 	JP	BZTEST		;ANY MORE ?
 TEST1	LD	A,(HL)		;GET RESULT
 	BIT	2,A		;DATA LOST ?
 	POP	DE		;RESTORE TRACK/SECTOR
 	RET	Z		;EVERYTHING OK
 	LD	(HL),0D0H	;FORCE INTERRUPT
 	RET			;BACK ANYWAY
 ERROR	LD	C,A		;SAVE ERROR CODE
 	CALL	DISPLY		;SOMETHING HAPPENED
 	DEFW	0D0DH
 	DEFM	'AN ERROR WAS DETECTED !'
 	DEFB	0DH
 	DEFM	'ERROR CODE IS '
 	DEFB	0
 	LD	A,C		;GET ERROR CODE
 	CALL	HEXCV		;CONVERT TO ASCII
 	PUSH	HL		;SAVE A MINUTE
 	LD	A,H		;GET HIGH NIBBLE
 	CALL	33H		;DISPLAY IT
 	POP	HL		;RESTORE
 	CALL	33H		;THAT TOO
 	LD	A,'H'		;HEX !
 	CALL	33H
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'<ENTER> TO RESTART PROGRAM ? '
 	DEFB	0
 TRYAGN	LD	B,1
 	CALL	GETSTR		;GET ENTER KEY
 	JP	ENTRY		;START IT OVER
 NOBOOT	CALL	DISPLY		;NO DOS BOOT ON DISK
 	DEFW	0D0DH
 	DEFM	'BOOT ON DISKETTE IS NON STANDARD !'
 	DEFB	0DH
 	DEFM	'<ENTER> TO RESTART PROGRAM ? '
 	DEFB	0
 	JR	TRYAGN		;GO AGAIN
 HEXCV	LD	C,A		;PASS TO C REG.
 	SRL	A		;SHIFT TO UPPER NIBBLE
 	SRL	A
 	SRL	A
 	SRL	A
 	CALL	TESTA		;CONVERT TO ASCII
 	LD	H,A		;PASS TO H FOR RETURN
 	LD	A,C		;GET ORIGINAL
 	AND	0FH		;GET LOW DIGIT
 	CALL	TESTA		;CONVERT TO ASCII
 	LD	L,A		;PASS TO L REG.
 	RET			;DONE
 TESTA	ADD	A,30H		;ADD CONVERSION FACTOR
 	CP	3AH		;TEST FOR 0-9
 	JP	M,TESTB		;GO IF 0-9
 	ADD	A,7		;ADJUST FOR LETTER
 TESTB	RET			;DONE
 WRITE	LD	A,(KIM)		;NAME STILL THERE ?
 	CP	'K'
 	JP	NZ,REPAIR	;FIX THE NAME
 	LD	A,(KIM+1)
 	CP	'I'
 	JP	NZ,REPAIR
 	LD	A,(KIM+2)
 	CP	'M'
 	JP	NZ,REPAIR		;BETTER BE !
 	CALL	DISPLY		;EVERYTHING OK !
 	DEFB	0DH
 	DEFM	'WRITING DIRECTORY TRACK'
 	DEFB	0
 	LD	BC,0B000H	;BUFFER FOR DATA
 	LD	HL,(DIRTRK)	;GET DIRECTORY TRACK
 	EX	DE,HL		;GIVE TO DE
 	LD	E,0		;SECTOR 0
 	LD	HL,0AH		;10 SECTORS TO WRITE
 	CALL	PUTIT		;PUT IT TO THE DISK
 	JP	NZ,ERROR	;DIDN'T WORK SO WELL !
 	JP	OKGO		;DONE WITH ROUTINE
 PUTIT	PUSH	BC		;SAVE LOAD ADDRESS
 	PUSH	HL		;SAVE SECTOR COUNT
 MORE	LD	(37EEH),DE	;SELECT TRACK/SECTOR
 	LD	A,1		;SELECT
 	LD	(37E1H),A	;	DRIVE 0
 	CALL	WRITEA		;WRITE A SECTOR
 	JP	NZ,ERROR	;DIDN'T WORK
 	POP	HL		;GET COUNT
 	DEC	L		;DECREMENT COUNTER
 	JP	Z,DONEWR	;DONE WRITING
 	PUSH	HL		;PUT IT BACK ON STACK
 	INC	E		;INCREMENT SECTOR
 	LD	A,E		;PASS TO ACCUMULATOR
 	SUB	0AH		;10 SECTORS/TRACK
 	JP	NZ,MORE		;NOT DONE
 	LD	E,A		;SECTOR COUNT -10
 	INC	D		;NEXT TRACK
 	JP	MORE		;DO IT SO MORE
 DONEWR	POP	BC		;RESTORE LOAD POINT
 	RET			;DONE WRITING
 WRITEA	PUSH	BC		;SAVE IT
 	CALL	WRITEB		;WRITE SECTOR
 	POP	HL		;CURRENT LOAD POSITION
 	RET	Z		;SUCCESSFUL
 	LD	B,H		;TRY ONCE MORE
 	LD	C,L		;	IF BAD READ
 WRITEB	LD	(37EEH),DE	;TRACK/SECTOR TO WRITE
 	LD	HL,37ECH	;COMMAND REGISTER
 	LD	A,1		;RESELECT DRIVE 0
 	LD	(37E1H),A
 	LD	(HL),1BH	;SEEK BYTE
 	PUSH	AF
 	POP	AF
 	PUSH	AF
 	POP	AF
 BYTEST	LD	A,(HL)		;GET STATUS
 	RRCA			;SHIFT OUT BIT 0
 	JP	C,BYTEST	;NOT FOUND YET
 	LD	(HL),0A9H	;WRITE SECTOR BYTE
 ;  A9 = READ PROTECTED  A8 = DATA MARK  AA = DELETED DATA
 	PUSH	DE		;SAVE TRACK/SECTOR
 	LD	DE,37EFH	;DATA TRANSFER ADDRESS
 	PUSH	BC
 	POP	BC
 	PUSH	BC
 	POP	BC
 	JP	TESTBY		;WAIT TILL READY
 TESTZ	RRCA			;SHIFT BIT 0
 	JP	NC,TESTX	;DONE WITH COMMAND
 TESTBY	LD	A,(HL)		;GET STATUS
 	BIT	1,A		;READY FOR DATA ?
 	JP	Z,TESTZ		;WAIT SOME MORE
 	LD	A,(BC)		;GET BYTE FROM BUFFER
 	LD	(DE),A		;PASS TO CONTROLLER
 	INC	BC		;NEXT BYTE IN BUFFER
 	JP	TESTBY		;WAIT FOR READY
 TESTX	LD	A,(HL)		;CLEAR LATCH
 	BIT	2,A		;DATA LOST ?
 	POP	DE		;RESTORE TRACK/SECTOR
 	RET	Z		;DONE WITH SECTOR
 	LD	(HL),0D0H	;FORCE INTERRUPT
 	RET			;DISK ERROR
 ALL	LD	HL,0B220H	;FIRST ENTRY AFTER BOOT
 	LD	B,7		;7 ENTRIES
 	LD	DE,20H		;DISPLACEMENT BETWEEN
 ALL1	LD	(HL),0		;KILL FILE
 	ADD	HL,DE		;POINT TO NEXT
 	DJNZ	ALL1		;GO TO IT
 	LD	HL,0B320H	;ENTRY AFTER DIR
 	LD	B,7		;7 ENTRIES
 ALL2	LD	(HL),0		;KILL FILE
 	ADD	HL,DE		;POINT TO NEXT
 	DJNZ	ALL2		;KEEP GOING
 	LD	HL,0B400H	;SECTOR 4
 	LD	B,30H		;48 MORE ENTRIES
 ALL3	LD	(HL),0		;KILL IT
 	ADD	HL,DE		;NEXT
 	DJNZ	ALL3		;AGAIN
 	LD	HL,0B060H	;POINT TO LOCKOUT INFO
 	LD	DE,0B000H	;USED/UNUSED GRANS
 	LD	BC,60H		;96 BYTES OF INFO
 	LDIR			;MOVE LOCKOUT TO USED
 	LD	HL,0B000H	;FIRST BYTE
 	LD	(HL),0FDH	;LOCK GRANULE FOR BOOT
 	LD	HL,(DIRTRK)	;GET DIRECTORY TRACK
 	EX	DE,HL		;PASS TO DE
 	LD	E,D		;GET TRACK
 	LD	D,0		;ZERO IT
 	LD	HL,0B000H	;POINT TO TABLE
 	ADD	HL,DE		;POINT TO BYTE
 	LD	(HL),0FFH	;TRACK IS USED
 	LD	HL,0B102H	;HASH INDEX TABLE
 	LD	DE,0B103H	;NEXT
 	LD	BC,0FDH		;NUMBER OF BYTES
 	LD	(HL),0		;ZERO THE ENTRY
 	LDIR			;FIX THE HIT SECTOR
 OKGO	CALL	HDING		;DISPLAY HEADING
 	CALL	DISPLY		;MESSAGE
 	DEFW	0D0DH
 	DEFB	0DH
 	DEFM	'ROUTINE COMPLETED !'
 	DEFW	0D0DH
 	DEFM	'<ENTER> FOR DIRECTORY ? '
 	DEFB	0
 	LD	B,1
 	CALL	GETSTR		;GET ENTER KEY
 START	CALL	DIR		;DISPLAY DIRECTORY
 	LD	HL,3FFEH	;END OF DISPLAY
 	LD	B,1		;NO INPUT
 	LD	(4020H),HL	;PASS TO CURSOR
 	CALL	GETSTR		;FLASH CURSOR
 	JP	GOAGN		;GO AGAIN
 HDING	CALL	DISPLY		;MESSAGE
 	DEFW	1F1CH		;CLEAR SCREEN
 	DEFM	'-'
 BREEZ2	DEFM	'BREEZE SPECIAL PURGE UTILITY-'
 	DEFW	0D0DH
 	DEFB	0
 	RET
 DIR	LD	A,1CH		;HOME CURSOR
 	CALL	33H
 	LD	A,1FH		;CLEAR SCREEN
 	CALL	33H
 	LD	IX,0B200H	;START OF SECTOR 2
 	LD	B,40H		;64 ENTRIES
 	LD	DE,20H		;LENGTH OF ENTRY
 DIRLP	LD	A,(IX)		;GET STATUS OF ENTRY
 	OR	A		;	ACTIVE ?
 	JR	Z,NONACT	;NONACTIVE IF ZERO
 	LD	C,A		;STORE IN C
 	BIT	7,A		;FPDE OR FXDE ?
 	JP	NZ,NONACT	;NZ=EXTENDED ENTRY
 	PUSH	IX		;PASS POINTER
 	POP	HL		;	TO HL
 	LD	A,5		;MOVE HL POINTER
 	ADD	A,L		;	5 PLACES FOR
 	LD	L,A		;	DIR NAME
 	CALL	SHOW		;SHOW NAME
 NONACT	ADD	IX,DE		;POINT TO NEXT ENTRY
 	DJNZ	DIRLP		;NEXT LOOP
 	RET
 SHOW	PUSH	BC		;MUST SAVE COUNTER
 	PUSH	DE		;	AND INCREMENT
 	LD	DE,(4020H)	;GET CURSOR POSITION
 	PUSH	DE		;SAVE ON STACK
 	LD	B,8		;GET NAME
 LO5	LD	A,(HL)		;GET CHAR
 	CP	20H		;SPACE ?
 	JR	Z,NOSHOW	;DON'T DISPLAY IT
 	CALL	33H		;DO DISPLAY IT
 NOSHOW	INC	HL		;NEXT CHAR
 	DJNZ	LO5		;DO IT
 	LD	A,(HL)		;EXTENSION FIRST CHAR
 	CP	20H		;SPACE ?
 	JR	Z,FIXCUR	;FIX CURSOR POSITION
 	LD	A,'/'		;SLASH BEFORE NAME
 	CALL	33H		;DISPLAY
 	LD	B,3		;EXTENSION
 LO6	LD	A,(HL)		;GET CHARACTER
 	CP	20H		;SPACE ?
 	JR	Z,SHOWNO	;DON'T DISPLAY IT
 	CALL	33H		;DO DISPLAY IT
 SHOWNO	INC	HL		;NEXT CHAR
 	DJNZ	LO6		;AGAIN
 FIXCUR	LD	A,20H		;SPACE
 	PUSH	DE
 	PUSH	IY		;SAVE 'EM
 	CALL	33H
 	LD	A,'S'
 	BIT	6,(IX)		;SYSTEM FILE ?
 	CALL	NZ,33H
 	LD	A,'I'
 	BIT	3,(IX)		;INVISIBLE ?
 	CALL	NZ,33H
 	LD	A,(IX)		;GET FIRST BYTE
 	AND	7		;GET LOWER 3 BITS
 	LD	A,'P'
 	CALL	NZ,33H
 	POP	IY
 	POP	DE
 	POP	DE
 	LD	HL,10H		;16 CHARACTER PRINT
 	ADD	HL,DE		;POINT TO NEXT AREA
 	LD	(4020H),HL	;PASS TO CURSOR
 	POP	DE		;RESTORE
 	POP	BC		;	DE AND BC
 	RET			;ALL DONE
 REPAIR	LD	DE,KIM
 	LD	HL,KIMFIX
 	CALL	BETTER
 	LD	DE,COPYR
 	LD	HL,COPFIX
 	CALL	BETTER
 	LD	DE,BREEZE
 	LD	HL,BREFIX
 	CALL	BETTER
 	LD	DE,POBOX
 	LD	HL,BOXFIX
 	CALL	BETTER
 	LD	DE,BERKLY
 	LD	HL,BERFIX
 	CALL	BETTER
 	LD	DE,AREA
 	LD	HL,AREFIX
 	CALL	BETTER
 	LD	DE,BREEZ2
 	LD	HL,BR2FIX
 	CALL	BETTER
 	JP	ENTRY
 KIMFIX	DEFW	0C9CBH
 	DEFW	0A0CDH
 	DEFW	0C1D7H
 	DEFW	0D4D4H
 	DEFB	3
 COPFIX	DEFW	0CFC3H
 	DEFW	0D9D0H
 	DEFW	0C9D2H
 	DEFW	0C8C7H
 	DEFW	0A0D4H
 	DEFW	0C3A8H
 	DEFW	0A0A9H
 	DEFW	0B9B1H
 	DEFW	0B0B8H
 	DEFB	3
 BREFIX	DEFW	0D4C2H
 	DEFW	0C5C5H
 	DEFW	0C5DAH
 	DEFW	0C3A0H
 	DEFW	0CDCFH
 	DEFW	0D5D0H
 	DEFW	0C9D4H
 	DEFW	0C7CEH
 	DEFW	0C9A0H
 	DEFW	0C3CEH
 	DEFB	0AEH
 	DEFB	3
 BOXFIX	DEFW	0AED0H
 	DEFW	0AECFH
 	DEFW	0C2A0H
 	DEFW	0D8CFH
 	DEFW	0B1A0H
 	DEFW	0B1B0H
 	DEFB	0B3H
 	DEFB	3
 BERFIX	DEFW	0C5C2H
 	DEFW	0CBD2H
 	DEFW	0C5CCH
 	DEFW	0ACD9H
 	DEFW	0CDA0H
 	DEFW	0C3C9H
 	DEFW	0AEC8H
 	DEFW	0B4A0H
 	DEFW	0B0B8H
 	DEFW	0B2B7H
 	DEFB	3
 AREFIX	DEFW	0B3A8H
 	DEFW	0B3B1H
 	DEFW	0A0A9H
 	DEFW	0B2A0H
 	DEFW	0B8B8H
 	DEFW	0B9ADH
 	DEFW	0B2B4H
 	DEFB	0B2H
 	DEFB	3
 BR2FIX	DEFB	0C2H
 	DEFW	0C5D2H
 	DEFW	0DAC5H
 	DEFW	0A0C5H
 	DEFW	0D0D3H
 	DEFW	0C3C5H
 	DEFW	0C1C9H
 	DEFW	0A0CCH
 	DEFW	0D5D0H
 	DEFW	0C7D2H
 	DEFW	0A0C5H
 	DEFW	0D4D5H
 	DEFW	0CCC9H
 	DEFW	0D4C9H
 	DEFW	0ADD9H
 	DEFB	3
 BETTER	LD	A,(HL)		;GET A CHARACTER
 	CP	3		;TERMINATOR ?
 	RET	Z		;DONE
 	RES	7,A		;ADJUST TO ASCII
 	LD	(DE),A		;SAVE IT
 	INC	HL		;NEXT
 	INC	DE		;NEXT
 	JR	BETTER		;KEEP GOING
 ZERO	LD	IX,0B200H	;POINT TO SECTOR 2
 	LD	B,40H		;64 DIRECTORY ENTRIES
 	LD	DE,20H		;DISPLACEMENT BETWEEN
 ZEROLP	LD	A,(IX)		;GET 1'ST BYTE OF ENTRY
 	OR	A		;SET THE FLAGS
 	JR	NZ,NOZERO	;NZ=ACTIVE ENTRY
 	PUSH	DE		;SAVE DISPLACEMENT
 	PUSH	IX		;PASS TO
 	POP	HL		;	HL REGS.
 	LD	E,L		;PASS TO
 	LD	D,H		;	DE REGS.
 	INC	DE		;NEXT
 	PUSH	BC		;SAVE CURRENT COUNT
 	LD	BC,1FH		;NUMBER OF BYTES TO FIX
 	LD	(HL),0		;ZERO THE FIRST ENTRY
 	LDIR			;ZERO 'EM ALL
 	POP	BC		;RESTORE
 	POP	DE		;RESTORE
 NOZERO	ADD	IX,DE		;POINT TO NEXT
 	DJNZ	ZEROLP		;GO TILL ALL DONE
 	JP	OKGO		;DONE WITH ROUTINE
 TCELES	LD	A,(3804H)	;GET "SPECIAL" INFO
 	CP	8
 	JR	NZ,SELECT	;OK FINE
 	LD	A,(3808H)
 	CP	1
 	JR	NZ,SELECT
 	JP	BONUS
 SELECT	LD	IX,0B200H	;POINT TO SECTOR 2
 	CALL	DISPLY		;SHOW OPTIONS
 	DEFW	1F1CH		;CLEAR SCREEN
 	DEFM	'<K>ILL THIS ONE - <S>AVE THIS ONE - '
 	DEFM	'<J>UMP OVER THE REST'
 	DEFB	0DH
 	DEFB	0
 	LD	DE,20H		;SAVE DISPLACEMENT
 	LD	B,40H		;64 DIRECTORY ENTRIES
 SELLP	PUSH	BC		;SAVE COUNT ON STACK
 	PUSH	IX		;SAVE IT
 	PUSH	DE		;SAVE IT
 	LD	A,(IX)		;GET 1'ST BYTE
 	OR	A		;SET FLAGS
 	JR	Z,NOSEL		;Z=NOT ACTIVE
 	PUSH	IX		;PASS TO
 	POP	HL		;	HL FOR POINTER
 	LD	A,5		;DISPLACEMENT TO NAME
 	ADD	A,L		;POINT TO IT
 	LD	L,A		;GIVE IT BACK
 	CALL	SHOW		;SHOW THE ENTRY
 BADZ	PUSH	DE		;MUST SAVE DISPLACEMENT
 	LD	B,1		;ONE INPUT KEY
 	CALL	GETSTR		;	FROM KEYBOARD
 	POP	DE		;RESTORE DISPLACEMENT
 	CP	0DH		;NO INPUT ?
 	JR	Z,NOSEL		;DO NOTHING
 	CP	'K'		;	KILL ?
 	JP	Z,DOKILL	;FINE
 	CP	'S'		;	SAVE IT ?
 	JR	Z,NOSEL		;OK
 	CP	'J'		;	SKIP OVER REST ?
 	JR	NZ,BADZ		;NOGOOD
 	POP	BC		;RESTORE STACK
 	JP	OKGO		;DONE WITH ROUTINE
 NOSEL	POP	DE		;RESTORE
 	POP	IX		;RESTORE
 	ADD	IX,DE
 	POP	BC		;RESTORE BYTE COUNT
 	DJNZ	SELLP		;BACK FOR NEXT
 	JP	OKGO		;DONE WITH ALL
 KILLIT	LD	A,(IX)		;GET FIRST BYTE IN ENTRY
 	LD	C,A		;SAVE IT IN C
 	OR	A		;SET FLAGS
 	RET	Z		;NOT ACTIVE
 	XOR	A		;ZERO THE ACCUMULATOR
 	LD	(IX),A		;KILL THE FILE
 	PUSH	IX		;PASS TO HL
 	POP	HL		;	FOR GAT & HIT
 	PUSH	IX		;PASS TO
 	POP	IY		;	IY ALSO
 	LD	A,C		;GET FIRST BYTE
 	BIT	7,A		;FPDE OR FXDE ?
 	RET	NZ		;THIS IS AN EXTENSION !!!
 KILLLP	LD	A,(IY+16H)	;GET DISK AREA OF FILE
 	CP	0FFH		;END OF EXTENTS ?
 	RET	Z		;Z=YES (KILL COMPLETE)
 	CP	0FEH		;EXTENDED DIRECTORY ?
 	JP	Z,EXTEND	;Z=YES
 	LD	D,A		;TRACK OF DATA
 	LD	A,(IY+17H)	;GET START & SECTOR COUNT
 	LD	C,A		;SAVE FOR NOW
 	LD	B,0		;START WITH THIS
 	BIT	5,A		;WHERE ON TRACK IS START?
 	JR	Z,PASTAA	;SECTOR 0 IS START
 	LD	B,5		;SECTOR 5 IS START
 PASTAA	AND	1FH		;MASK UPPER 3 BITS
 	LD	E,B		;START SECTOR
 	INC	A		;CORRECT FOR LOOP
 	LD	B,A		;# OF SECTORS
 	CALL	RELEAS		;RELEASE DISK SPACE
 	CALL	ZERHIT		;ZERO THE HIT BYTE
 	INC	IY		;POINT TO NEXT
 	INC	IY		;	EXTENT PAIR
 	JP	KILLLP		;CHECK IT OUT
 RELEAS	PUSH	DE		;SAVE THIS TOO
 	PUSH	HL		;MAYBE THIS TOO
 	LD	L,D		;TRACK NUMBER OF START
 	LD	H,0		;MAKE SURE IT'S ZERO
 	LD	C,E		;SAVE START
 	LD	DE,0B000H	;START OF GAT TABLE
 	ADD	HL,DE		;POINT TO GAT BYTE
 	LD	A,C		;GET START SECTOR
 	OR	A		;SET FLAGS
 	JR	NZ,SECOND	;SKIP OVER FIRST GRAN
 RELLP	LD	A,(HL)		;GET THE BYTE
 	RES	0,A		;RELEASE THE FIRST GRAN
 	LD	(HL),A		;GIVE IT BACK
 	DJNZ	SECOND		;DO WE NEED A SECOND ?
 	JP	RELDON		;DONE WITH RELEASE
 SECOND	LD	A,(HL)		;GET BYTE TO TEST
 	RES	1,A		;OPEN SECOND GRANULE
 	LD	(HL),A		;GIVE IT BACK
 	INC	HL		;POINT TO NEXT GAT BYTE
 	DJNZ	RELLP		;DO IT SOME MORE
 RELDON	POP	HL		;RESTORE
 	POP	DE		;	DE & HL
 	RET			;DONE WITH RELEASE
 ZERHIT	PUSH	HL		;SAVE ENTRY POINTER
 	LD	DE,0B200H	;START OF SECTOR 2
 	OR	A		;RESET CARRY FLAG
 	SBC	HL,DE		;FIND RELATIVE POSITION
 	EX	DE,HL		;SAVE IN DE
 	LD	A,E		;RELATIVE SECTOR POSITON
 	AND	0E0H		;MASK LOWER 5 BITS
 	LD	E,A		;GIVE IT BACK
 	LD	A,D		;RELATIVE SECTOR 2-9
 	AND	7		;MASK UPPER 5 BITS
 	OR	E		;A NOW CONTAINS DEC
 	LD	E,A		;PUT DISPLACEMENT FROM
 	LD	D,0		;BEGINNING OF HIT SECTOR
 	LD	HL,0B100H	;POINT TO BEGINNING
 	ADD	HL,DE		;POINT TO HIT BYTE
 	LD	(HL),0		;ZERO IT
 	POP	HL		;RESTORE HL
 	RET			;DONE WITH IT
 EXTEND	LD	A,(IY+17H)	;GET DEC FOR FXDE
 	LD	C,A		;SAVE IT A MINUTE
 	AND	7		;MASK UPPER 5 BITS
 	LD	D,A		;RELATIVE SECTOR IN DIR
 	LD	A,C		;GET IT BACK
 	AND	0E0H		;MASK LOWER 5 BITS
 	LD	E,A		;RELATIVE ENTRY IN SECTOR
 	PUSH	HL		;SAVE A MINUTE
 	LD	HL,0B200H	;POINT TO BEGINNING
 	ADD	HL,DE		;POINT TO FXDE MEMORY
 	PUSH	HL		;PASS TO
 	POP	IY		;	IY INDEX
 	POP	HL		;RESTORE HL
 	LD	A,0		;ZERO THE ENTRY
 	LD	(IY),A		;	TO KILL IT
 	JP	KILLLP		;KILL IT TOO
 DOKILL	CALL	KILLIT		;KILL & RELEASE SPACE
 	PUSH	HL		;SAVE A MINUTE
 	LD	HL,(4020H)	;GET CURSOR POSITION
 	DEC	HL		;MOVE IT BACK SOME
 	DEC	HL
 	DEC	HL
 	DEC	HL
 	DEC	HL
 	DEC	HL
 	DEC	HL
 	DEC	HL
 	LD	(HL),5DH	;ARROW
 	INC	HL		;NEXT
 	LD	(HL),'D'
 	INC	HL
 	LD	(HL),'E'
 	INC	HL
 	LD	(HL),'A'
 	INC	HL
 	LD	(HL),'D'
 	POP	HL		;RESTORE
 	JP	NOSEL		;NEXT ENTRY ?
 VISAB	LD	IX,0B200H	;SECTOR 2
 	LD	B,40H		;64 ENTRIES
 	LD	DE,20H		;INCREMENT
 VISLP	LD	A,(IX)		;GET FIRST BYTE
 	BIT	3,A		;SET IF INVISIBLE
 	JP	NZ,NODO1	;DON'T KILL IT
 	PUSH	IX		;SAVE IT
 	EXX			;ALTERNATE REGS.
 	CALL	KILLIT		;DO IT
 	EXX			;GET 'EM BACK
 	POP	IX		;THAT TOO
 NODO1	ADD	IX,DE		;NEXT ONE
 	DJNZ	VISLP		;AGAIN ?
 	JP	OKGO		;DONE !
 INVIS	LD	IX,0B200H	;SECTOR 2
 	LD	B,40H		;64 ENTRIES
 	LD	DE,20H		;INCREMENT
 INVLP	LD	A,(IX)		;GET BYTE
 	BIT	3,A		;IS SET IF INVISIBLE
 	JP	Z,NODO2		;DON'T KILL VISIBLE
 	PUSH	IX
 	EXX
 	CALL	KILLIT
 	EXX
 	POP	IX
 NODO2	ADD	IX,DE
 	DJNZ	INVLP
 	JP	OKGO		;DONE !
 INNSYS	LD	IX,0B200H	;SECTOR 2
 	LD	B,40H		;64 TIMES
 	LD	DE,20H
 INNLP	LD	A,(IX)
 	BIT	3,A		;SET IF INVISIBLE
 	JP	Z,NODO3		;DON'T KILL VISIBLE
 	BIT	6,A		;SET IF SYSTEM FILE
 	JP	NZ,NODO3	;DON'T KILL NON-SYSTEM
 	PUSH	IX
 	EXX
 	CALL	KILLIT
 	EXX
 	POP	IX
 NODO3	ADD	IX,DE
 	DJNZ	INNLP
 	JP	OKGO		;DONE !
 SPECIL	LD	IX,0B200H	;SECTOR 2
 	LD	DE,20H
 	LD	B,40H
 	LD	IY,TYPE		;POINT TO REQUEST TYPE
 CMDLP	LD	A,(IX+0DH)	;FIRST CHAR OF EXTEN.
 	LD	C,(IY)		;GET FIRST REQUEST
 	CP	C		;THE SAME ?
 	JP	NZ,NODO6	;DON'T KILL IT
 	LD	A,(IX+0EH)
 	LD	C,(IY+1)
 	CP	C
 	JP	NZ,NODO6
 	LD	A,(IX+0FH)
 	LD	C,(IY+2)
 	CP	C
 	JP	NZ,NODO6
 	PUSH	IY		;SAVE EVERYTHING
 	PUSH	IX
 	EXX
 	CALL	KILLIT
 	EXX
 	POP	IX
 	POP	IY
 NODO6	ADD	IX,DE
 	DJNZ	CMDLP
 	JP	OKGO		;DONE !
 TYPE	DEFM	'   '
 CMD	LD	HL,TYPE
 	LD	(HL),'C'
 	INC	HL
 	LD	(HL),'M'
 	INC	HL
 	LD	(HL),'D'
 	JP	SPECIL
 BAS	LD	HL,TYPE
 	LD	(HL),'B'
 	INC	HL
 	LD	(HL),'A'
 	INC	HL
 	LD	(HL),'S'
 	JP	SPECIL
 SYS	LD	IX,0B220H	;BELOW BOOT
 	LD	DE,20H
 	LD	B,7
 	CALL	SYSLP
 	LD	IX,0B320H
 	LD	DE,20H
 	LD	B,7
 	CALL	SYSLP
 	LD	IX,0B400H
 	LD	DE,20H
 	LD	B,30H		;6 MORE SECTORS
 	CALL	SYSLP
 	JP	OKGO		;DONE !
 SYSLP	LD	A,(IX)		;GET FIRST BYTE
 	BIT	6,A		;SECOND BIT 1 = SYSTEM
 	JR	Z,NODOX
 	PUSH	IX
 	EXX
 	CALL	KILLIT
 	EXX
 	POP	IX
 NODOX	ADD	IX,DE
 	DJNZ	SYSLP
 	RET
 ERASE	LD	HL,0D000H	;NEW BUFFER
 	LD	DE,0D001H	;ONE AFTER THAT
 	LD	BC,100H		;ONE SECTOR LENGTH
 	LD	(HL),0		;LOAD ZERO'S
 	LDIR			;INTO THE WHOLE THING
 	CALL	DISPLY		;SHOW WHICH ONES
 	DEFW	1F1CH
 	DEFM	'-ERASING TRACK/SECTORS-'
 	DEFB	0DH
 	DEFB	0
 	LD	BC,4000H	;64 ENTRIES
 	PUSH	BC		;SAVE ON STACK
 	LD	IX,0B000H	;GAT SECTOR
 	LD	DE,00H		;TRACK SECTOR
 ERASLP	LD	A,(IX+60H)	;GET LOCKOUT BYTE
 	INC	A		;TEST FOR 0FFH
 	JP	Z,NOERAS	;SKIP THAT ONE
 	LD	A,(IX)		;GET ALLOCATION BYTE
 	LD	E,0		;SECTOR ZERO
 	BIT	0,A		;EMPTY GRAN ?
 	JR	NZ,PASTIT	;USED !
 	POP	BC		;GET CURRENT TRACK
 	LD	D,C		;GIVE IT TO D
 	PUSH	BC		;SAVE AGAIN
 	CALL	PUT5		;ZERO 5 SECTORS
 PASTIT	LD	A,(IX)		;GET BYTE BACK
 	LD	E,5		;SECTOR 5 TO START
 	BIT	1,A		;EMPTY GRAN ?
 	JR	NZ,NOERAS	;DON'T TOUCH IT
 	POP	BC		;GET CURRENT TRACK
 	LD	D,C		;GIVE IT TO D
 	PUSH	BC		;PUT IT BACK
 	CALL	PUT5		;ZERO 5 SECTORS
 NOERAS	INC	IX		;POINT TO NEXT GAT BYTE
 	POP	BC		;GET BYTE COUNT
 	INC	C		;NEXT TRACK
 	DEC	B		;NEXT LOOP (SET FLAGS)
 	PUSH	BC		;SAVE IN CASE OF REPEAT
 	JP	NZ,ERASLP	;KEEP GOING
 	POP	BC		;RESTORE STACK
 	CALL	DISPLY
 	DEFM	'DONE !  '
 	DEFB	0
 	LD	B,1		;LEAVE ERASED TRACKS ON
 	CALL	GETSTR		;VIDEO 'TILL ENTER KEY
 	JP	OKGO		;DONE WITH ROUTINE
 PUT5	CALL	WHICH		;SHOW WHICH ONES
 	LD	HL,5		;WRITE 5 SECTORS
 LOOPVV	LD	BC,0D000H	;BUFFER
 	PUSH	HL		;SAVE COUNT
 	CALL	WRITEA		;WRITE A SECTOR
 	POP	HL		;RESTORE
 	INC	E		;NEXT SECTOR
 	DEC	L		;ONE LESS
 	JR	NZ,LOOPVV	;KEEP GOING
 	RET			;DONE
 BONUS	CALL	DISPLY		;MESSAGE
 	DEFW	1F1CH		;CLEAR SCREEN
 	DEFM	'-SPECIAL ROUTINES-'
 	DEFB	0DH
 	DEFB	0DH
 	DEFM	'1. MAKE ALL FILES VISIBLE'
 	DEFB	0DH
 	DEFM	'2. MAKE ALL FILES INVISIBLE'
 	DEFB	0DH
 	DEFM	'3. REMOVE PASSWORDS FROM ALL FILES'
 	DEFB	0DH
 	DEFM	'4. CHANGE DISK NAME AND DATE'
 	DEFB	0DH
 	DEFM	'5. CHANGE AUTO COMMAND'
 	DEFB	0DH
 	DEFM	'6. RETURN TO MASTER MENU'
 	DEFB	0DH
 	DEFB	0
 NOGOOD	LD	B,1
 	CALL	GETSTR
 	CP	31H
 	JP	Z,ALLVIS
 	CP	32H
 	JP	Z,NOVIS
 	CP	33H
 	JP	Z,NOPASS
 	CP	34H
 	JP	Z,NEWNAM
 	CP	35H
 	JP	Z,AUTO
 	CP	36H
 	JP	Z,OKGO
 	JP	NOGOOD
 ALLVIS	LD	HL,0B200H
 	LD	DE,20H
 	LD	B,40H
 ALVLP	LD	A,(HL)		;GET FIRST BYTE
 	RES	3,A		;RESET INVISIBLE BIT
 	LD	(HL),A		;GIVE IT BACK
 	ADD	HL,DE		;POINT TO NEXT
 	DJNZ	ALVLP		;ANY MORE ?
 	JP	BYEBYE		;DONE
 NOVIS	LD	HL,0B200H	;SECTOR 2 OF DIRECTORY
 	LD	DE,20H
 	LD	B,40H
 NOLP	LD	A,(HL)
 	OR	A		;ACTIVE ENTRY ?
 	JR	Z,POOP		;DON'T FIX IT
 	SET	3,A
 	LD	(HL),A
 POOP	ADD	HL,DE
 	DJNZ	NOLP
 	JP	BYEBYE
 NOPASS	LD	IY,0B200H	;SECTOR 2
 	LD	DE,20H
 	LD	B,40H
 NOPLP	LD	A,(IY)
 	OR	A		;SET FLAGS
 	JR	Z,NOACT		;NON ACTIVE ENTRY
 	AND	0F8H		;MASK OUT LOWER 3 BITS
 	LD	(IY),A
 	LD	A,96H
 	LD	(IY+10H),A	;NO PASSWORD
 	LD	(IY+12H),A
 	LD	A,42H
 	LD	(IY+11H),A
 	LD	(IY+13H),A
 NOACT	ADD	IY,DE		;NON ACTIVE
 	DJNZ	NOPLP
 	JP	BYEBYE
 NEWNAM	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'ENTER NAME: '
 	DEFB	0
 	LD	B,8
 	CALL	GETSTR		;GET NEW NAME
 	CP	0DH		;NO INPUT ?
 	JP	Z,NONWNM	;NO CHANGES
 	LD	HL,STRING	;POINT TO INPUT
 	LD	DE,0B0D0H	;POINT TO DISK NAME
 	LD	BC,8		;8 CHARACTERS
 	LDIR			;PUT 'EM THERE
 NONWNM	CALL	DISPLY		;NEW DATE
 	DEFB	0DH
 	DEFM	'ENTER DATE: '
 	DEFB	0
 	LD	B,8
 	CALL	GETSTR
 	CP	0DH
 	JP	Z,BONUS		;NO CHANGES
 	LD	HL,STRING
 	LD	DE,0B0D8H	;POINT TO DISK DATE
 	LD	BC,8
 	LDIR
 	JP	BYEBYE
 AUTO	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'ENTER NEW AUTO COMMAND: '
 	DEFB	0
 	LD	B,31		;31 CHARACTERS ALLOWED
 	CALL	GETSTR
 	LD	HL,STRING
 	LD	DE,0B0E0H	;POINT TO AUTO INFO
 	LD	BC,31
 	LDIR			;PUT IT THERE
 	JP	BYEBYE
 BYEBYE	CALL	DISPLY		;PRINT DONE MESSAGE
 	DEFB	0DH
 	DEFM	'ROUTINE COMPLETED.  PRESS <ENTER> ? '
 	DEFB	0
 	LD	B,1
 	CALL	GETSTR
 	JP	BONUS
 WHICH	PUSH	BC		;SAVE FOR WRITE OPERATION
 	PUSH	DE		;THIS TOO
 	LD	A,D		;GET TRACK
 	CALL	HEXCV		;CONVERT TO ASCII
 	PUSH	HL		;SAVE CONVERSION
 	LD	A,H		;GET HIGH NIBBLE
 	CALL	33H		;DISPLAY IT
 	POP	HL		;GET IT BACK
 	LD	A,L		;GET LOW NIBBLE
 	CALL	33H		;DISPLAY IT
 	LD	A,'/'		;SEPARATOR
 	CALL	33H		;DISPLAY IT
 	POP	DE
 	PUSH	DE
 	LD	A,E		;GET SECTOR
 	OR	A		;SET FLAGS
 	JR	NZ,NOWO		;NZ=GRANULE 2
 	LD	A,30H		;0
 	CALL	33H		;DISPLAY
 	LD	A,'-'
 	CALL	33H
 	LD	A,34H
 	CALL	33H
 	JR	DONWH
 NOWO	LD	A,34H
 	CALL	33H
 	LD	A,'-'
 	CALL	33H
 	LD	A,39H
 	CALL	33H
 DONWH	LD	A,20H
 	CALL	33H
 	CALL	33H
 	POP	DE
 	POP	BC
 	RET
 	END	ENTRY
