NUFORM ;		* * * * * * * * * * * * *
 ;		*  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	DISPLY		;DISPLAY MESSAGE
 	DEFW	1F1CH		;CLEAR SCREEN
 	DEFM	'-BREEZE SPECIAL FORMATTER PROGRAM-'
 	DEFW	0D0DH
 	DEFM	'BY KIM WATT'
 	DEFB	0DH
 	DEFM	'COPYRIGHT (C) 1980'
 	DEFB	0DH
 	DEFM	'BREEZE COMPUTING INC.'
 	DEFB	0DH
 	DEFM	'P.O. BOX 1013'
 	DEFB	0DH
 	DEFM	'BERKLEY, MICH. 48072'
 	DEFB	0DH
 	DEFM	'(313)  288-9422'
 	DEFW	0D0DH
 	DEFM	'<ENTER> TO BEGIN ! '
 	DEFB	0
 	LD	B,1		;ONE CHARACTER
 	CALL	GETSTR		;	FROM KEYBOARD
 	LD	HL,3C40H	;ROUTINE TO
 	LD	(4020H),HL	;	CLEAR THE
 	LD	A,1FH		;	LOWER SCREEN
 	CALL	33H		;	& LEAVE HEADING
 	CALL	DISPLY		;RESUME
 	DEFW	0D0DH
 	DEFM	'<1>  REGULAR DOS FORMAT'
 	DEFB	0DH
 	DEFM	'<2>  SELECTABLE FORMAT'
 	DEFB	0DH
 	DEFB	'?'
 	DEFB	0		;TERMINATOR
 BAD1	LD	B,1		;ONE KEY
 	CALL	GETSTR		;	FROM USER
 	CP	31H		;	1 ?
 	JR	REGULR		;REGULAR FORMAT
 	CP	32H		;	2 ?
 	JR	NZ,BAD1		;BAD INPUT
 	CALL	GETSPS		;GET FORMAT SPECS
 REPETS	CALL	SFMT		;SPECIAL FORMAT
 	JR	FMTBYE		;DONE WITH FORMATTING
 REGULR	CALL	GETSPR		;GET FORMAT SPECS
 REPETR	CALL	RFMT		;REGULAR FORMAT
 	JR	FMTBYE		;DONE WITH FORMATTING
 DISPLY	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
 BDIR	DEFB	0FFH		;LOG BOOT INTO DIR FLAG
 DDIR	DEFB	0FFH		;LOG DIR INTO DIR FLAG
 FMTBYE	CALL	DISPLY		;PUT A MESSAGE
 	DEFW	1F1CH		;CLEAR SCREEN
 	DEFM	'-FORMAT COMMAND WAS '
 	DEFM	'COMPLETED SUCCESSFULLY-'
 	DEFW	0D0DH
 	DEFM	'<1>  EXIT VIA DOS AT 402DH'
 	DEFB	0DH
 	DEFM	'<2>  EXIT VIA BASIC AT 1A19H'
 	DEFB	0DH
 	DEFM	'<3>  EXIT AND RE-BOOT VIA 0H'
 	DEFB	0DH
 	DEFM	'<4>  RETURN TO CALLING ROUTINE'
 	DEFB	0DH
 	DEFM	'<5>  RUN PROGRAM AGAIN'
 	DEFB	0DH
 	DEFB	'?'
 	DEFB	0
 BAD2	LD	B,1		;ONE CHARACTER TO GET
 	CALL	GETSTR		;GET ANSWER
 	CP	31H		;	1 ?
 	JP	Z,402DH		;BACK TO DOS
 	CP	32H		;	2 ?
 	JP	Z,1A19H		;BACK TO BASIC
 	CP	33H		;	3 ?
 	RET	Z		;BACK TO CALLER
 	CP	34H		;	4 ?
 	JP	Z,0		;RE-INITIALIZE
 	CP	35H		;	5 ?
 	JR	NZ,BAD2		;NO GOOD
 	CALL	DISPLY		;NEW MESSAGE
 	DEFW	0D0DH		;SEPARATE TEXT
 	DEFM	'<S>AME PARAMETERS OR <N>EW ONES ? '
 	DEFB	0		;TERMINATOR
 	LD	SP,ENTRY	;RESET STACK
 BAD3	LD	B,1		;ONE CHARACTER
 	CALL	GETSTR		;GET USER RESPONSE
 	CP	'N'		;NEW PARAM
 	JP	Z,ENTRY		;START OVER
 	CP	'S'		;SAME ONES
 	JR	NZ,BAD3		;BAD INPUT
 	LD	A,(TYPE)	;TYPE OF INPUT
 	CP	0FFH		;SPECIAL FLAG
 	JP	NZ,REPETS	;REPEAT SPECIAL FORMAT
 	JP	REPETR		;REPEAT REGULAR FORMAT
 GETSPR	CALL	DISPLY		;GET REGUALR FORMAT SPECS
 	DEFW	1F1CH		;CLEAR SCREEN
 	DEFM	'-REGULAR DOS FORMAT-'
 	DEFW	0D0DH
 	DEFB	0
 	CALL	SETUP		;SET UP INITIAL VALUES
 	LD	A,0FFH		;FLAG FOR REGULAR FORMAT
 	LD	(TYPE),A	;SET FLAG
 	CALL	GETDR		;GET DRIVE NUMBER
 	CALL	GETTR		;GET NUMBER OF TRACKS
 	CALL	GETLCK		;GET LOCKOUT INFO
 	CALL	FMTLCK		;FORMAT LOCKED OUT TRACKS
 	CALL	GETDIR		;GET DIRECTORY REQUEST
 	CALL	REAPTC		;READ PROTECT ANY TRACKS
 	CALL	BOOTRQ		;GET BOOT REQUEST
 	CALL	EMPBYT		;GET EMPTY SECTOR BYTES
 	RET			;DONE WITH REQUEST INFO
 TYPE	DEFB	0FFH		;TYPE OF FORMAT FLAG
 GETDR	CALL	DISPLY		;GET DRIVE TO FORMAT
 	DEFB	0DH
 	DEFM	'FORMAT DISKETTE ON WHICH DRIVE (0-3) ? '
 	DEFB	0
 	LD	B,1		;ONE CHARACTER TO GET
 	CALL	GETSTR		;GET REPLY
 	CP	0DH		;NO INPUT ?
 	RET	Z		;DON'T CHANGE IT
 	SUB	30H		;REDUCE ASCII
 	JP	C,GETDR		;BAD INPUT
 	CP	4		;IS IT TOO BIG ?
 	JP	NC,GETDR	;BAD INPUT
 	LD	(DRIVE),A	;SAVE IT
 	RET			;GOT IT
 DRIVE	DEFB	1		;DEFAULT 1
 TRACKS	DEFB	23H		;DEFAULT 35
 DIRECT	DEFB	0FCH		;DIRECTORY FLAG
 DIRTRK	DEFB	11H		;DIRECTORY TRACK
 BOOT	DEFB	0FCH		;BOOT FLAG
 IBMFMT	DEFB	0FCH		;IBM FORMAT FLAG
 SECLEN	DEFW	0FFH		;SECTOR LENGTH
 SECOFF	DEFB	0		;SECTOR NUMBERING OFFSET
 TRKOFF	DEFB	0		;TRACK NUMBERING OFFSET
 LOADER	DEFB	0FFH		;LOADER FLAG
 STTRK	DEFB	1		;LOADER STARTING TRACK
 STSEC	DEFB	0		;LOADER STARTING SECTOR
 NOSEC	DEFB	0AH		;# OF SECTORS TO LOAD
 LDADDR	DEFW	4300H		;LOAD ADDRESS OF PROGRAM
 ENTPT	DEFW	4300H		;ENTRY POINT TO PROGRAM
 DISKNM	DEFM	'        '	;DISK NAME
 DISKDT	DEFM	'MM/DD/YY'	;DISK CREATION DATE
 PASWRD	DEFW	00H		;PASSWORD ENCODE
 VERIFY	DEFB	0FCH		;VERIFY FLAG
 GETTR	CALL	DISPLY		;GET # OF TRACKS
 	DEFB	0DH
 	DEFM	'HOW MANY TRACKS (1-60H) ? '
 	DEFB	0
 	LD	B,2		;2 CHARACTERS
 	CALL	GETSTR		;GET RESPONSE
 	CP	0DH		;NO INPUT ?
 	RET	Z		;DON'T CHANGE INITIAL
 	CALL	VALUE		;CONVERT TO ONE BYTE VAL.
 	LD	A,C		;VALUE IN BC
 	OR	A		;SET FLAGS
 	JR	Z,GETTR		;NO TRACKS ?
 	CP	61H		;MORE THAN 96 TRACKS
 	JP	NC,GETTR	;TOO MANY
 	LD	(TRACKS),A	;SAVE IT
 	LD	B,A		;PASS TO B
 	LD	A,61H		;SET UP WITH MAX VAL
 	SUB	B		;SUBTRACT
 	INC	A		;# TO FILL
 	LD	C,A		;PASS TO COUNTER
 	LD	B,0		;MAKE SURE <255
 	LD	A,(TRACKS)	;GET IT BACK
 	LD	E,A		;GIVE TO E
 	LD	D,0		;ZERO D REG.
 	LD	HL,LCKBUF	;POINT TO LOCKOUT TABLE
 	ADD	HL,DE		;POINT TO LAST TRACK
 	INC	HL		;FIRST BYTE TO LOCKOUT
 	LD	A,0FFH		;LOCKOUT BYTE
 	CALL	FILL		;LOCK 'EM OUT
 	RET			;DONE
 SETUP	LD	A,1		;DEFAULT DRIVE
 	LD	(DRIVE),A
 	LD	A,23H		;DEFAULT # OF TRACKS
 	LD	(TRACKS),A
 	LD	A,0FCH		
 	LD	(DIRECT),A	;DIRECTORY YES FLAG
 	LD	(BOOT),A	;BOOT YES FLAG
 	LD	(IBMFMT),A	;IBM FORMAT
 	LD	(VERIFY),A	;VERIFY YES FLAG
 	LD	(BDIR),A	;BOOT IN DIRECTORY YES
 	LD	(DDIR),A	;DIRECTORY IN DIR. YES
 	LD	A,0FFH		;OFF BYTE
 	LD	(LOADER),A	;NO LOADER
 	LD	HL,DISKNM	;POINT TO DISKNAME
 	LD	BC,10H		;	AND DATE
 	LD	A,20H		;FILL BYTE
 	CALL	FILL		;LOAD SPACES
 	LD	HL,LCKBUF	;LOCKOUT BUFFER
 	LD	BC,60H		;NUMBER OF TRACKS
 	LD	A,0FCH		;OPEN ALL TRACKS
 	CALL	FILL
 	LD	HL,FMTBUF	;FORMAT TRACK BUFFER
 	LD	BC,60H		;# OF TRACKS
 	LD	A,0FFH		;FORMAT YES BYTE
 	CALL	FILL
 	LD	HL,BYTBUF	;FILL FOR UNUSED SECS
 	LD	BC,60H		;# OF TRACKS
 	LD	A,0E5H		;DEFAULT VALUE
 	CALL	FILL
 	LD	HL,IDBUF	;ID ADDRESS BUFFER
 	LD	BC,60H		;# OF TRACKS
 	LD	A,0FBH		;STANDARD ID
 	CALL	FILL
 	LD	HL,00H		;PASSWORD ENCODE
 	LD	(PASWRD),HL	;SAVE IT
 	RET			;DONE WITH SETUP
 LCKBUF	DEFB	0		;LOCKOUT INFORMATION
 	DEFS	0FFH
 FMTBUF	DEFB	0		;WHICH TRACKS TO FORMAT
 	DEFS	0FFH
 BYTBUF	DEFB	0		;FILL BYTE TABLE
 	DEFS	0FFH
 IDBUF	DEFB	0		;ID MARK TABLE FOR TRACKS
 	DEFS	0FFH
 GETLCK	CALL	DISPLY		;DISPLAY PROMPT
 	DEFB	0DH
 	DEFM	'DO YOU WANT TO LOCK OUT ANY TRACKS ? '
 	DEFB	0
 	LD	B,3
 	CALL	GETSTR		;GET ANSWER
 	CP	0DH		;NO INPUT ?
 	RET	Z		;NOTHING DONE
 	CP	59H		;	Y ?
 	JR	Z,YESLCK	;GO IF YES
 	CP	4EH		;	N ?
 	JR	NZ,GETLCK	;BAD INPUT
 	RET			;NOTHING LOCKED
 YESLCK	CALL	DISPLY		;PROMPT
 	DEFB	0DH
 	DEFM	'LOCKOUT WHICH TRACKS (HEX) ? '
 	DEFB	0
 	LD	B,1EH		;30 CHARACTERS
 	CALL	GETSTR		;GET KEYBOARD INPUT
 	CP	0DH		;NO INPUT ?
 	RET	Z		;NOTHING DONE
 	LD	DE,LCKBUF	;LOCKOUT TABLE
 	LD	A,0FFH		;BYTE TO ENTER
 	CALL	TABLFX		;ENTER INPUT INTO TABLE
 	JP	NZ,GETLCK	;BAD INPUT
 	RET			;OK
 STRING	DEFS	0FFH		;255 BYTE STRING BUFFER
 LENGTH	DEFB	0		;LENGTH OF INPUT STRING
 REQLEN	DEFB	0		;REQUESTED LENGTH
 CHAR	DEFB	0		;LAST INPUT CHARACTER
 GETSTR	LD	HL,(4020H)	;CURRENT CURSOR POS
 	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,GETSTR	;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 <.> ARE OFF
 FILL	LD	E,A		;PASS FILL BYTE
 LOOPAB	LD	(HL),E		;STORE IT
 	INC	HL		;INCREMENT POINTER
 	DEC	BC		;DECREMENT COUNTER
 	LD	A,B		;GET B REG.
 	OR	C		;SET FLAGS
 	RET	Z		;DONE WITH FILL
 	JR	LOOPAB		;DO IT AGAIN IF NOT DONE
 TEMPST	DEFS	10H		;TEMPORARY STORAGE
 VALUE	LD	A,(HL)		;GET 1'ST CHAR.
 	INC	HL		;POINT TO NEXT
 	CP	0DH		;NO INPUT ?
 	JP	Z,BADINP	;NO GOOD
 	SUB	30H		;REMOVE ASCII
 	JP	C,BADINP	;NO GOOD
 	CP	0AH		;BIGGER THAN 9 ?
 	JP	C,NOADJ		;DON'T ADJUST
 	SUB	7		;ADJUST FOR LETTER
 NOADJ	CP	10H		;BIGGER THAN 1 HEX DIGIT?
 	JP	NC,BADINP	;NO GOOD
 	LD	C,A		;SAVE IN CASE OF ONE CHAR
 	SLA	A		;SHIFT TO UPPER NIBBLE
 	SLA	A
 	SLA	A
 	SLA	A
 	LD	(TEMPST),A	;SAVE FOR A MINUTE
 	LD	A,(HL)		;GET IT
 	INC	HL		;POINT TO NEXT
 	CP	0DH		;ONE DIGIT SUPPLIED ?
 	RET	Z		;	YES IF ZERO
 	CP	2CH		;COMMA ?
 	RET	Z		;	YES IF ZERO
 	CP	2DH		;DASH ?
 	RET	Z		;	YES IF ZERO
 	SUB	30H		;REMOVE ASCII
 	JP	C,BADINP	;NO GOOD
 	CP	0AH		;BIGGER THAN 9 ?
 	JP	C,NOADJ2	;DON'T ADJUST
 	SUB	7		;ADJUST FOR LETTER
 NOADJ2	CP	10H		;BIGGER THAN 1 HEX DIGIT?
 	JP	NC,BADINP	;NO GOOD
 	LD	C,A		;PASS TO C REG.
 	LD	A,(TEMPST)	;GET LAST CHAR.
 	ADD	A,C		;ADD 'EM
 	LD	C,A		;GIVE IT BACK
 	LD	A,(HL)		;PASS BACK TERMINATOR
 	INC	HL		;POINT TO NEXT BYTE
 	RET			;DONE WITH IT
 BADINP	LD	C,0		;NO VALUE
 	DEC	HL		;POINT TO BAD POINT
 	RET			;DONE
 TABLFX	PUSH	AF		;SAVE TILL NEEDED
 TABLLP	CALL	VALUE		;GET NEXT STRING VALUE
 	LD	A,C		;GET VALUE
 	OR	A		;SET FLAGS
 	JP	Z,INVAL		;BAD INPUT
 	LD	B,C		;PASS VALUE
 	CP	2DH		;DASH ?
 	JR	NZ,OVER1	;JUMP OVER CALL
 	CALL	VALUE		;GET NEXT VALUE
 OVER1	EX	AF,AF'		;SWAP REGISTERS
 	LD	A,B		;GET FIRST VALUE
 	OR	A		;SET FLAGS
 	JR	Z,INVAL		;BAD INPUT
 	LD	A,(TRACKS)	;GET NUMBER OF TRACKS
 	CP	B		;IS IT MORE ?
 	JP	C,INVAL		;TOO MANY TRACKS !
 	CP	C		;IS IT MORE ?
 	JP	C,INVAL		;TOO MANY TRACKS !
 	LD	A,C		;GET LAST VALUE
 	SUB	B		;SUBTRACT FIRST
 	INC	A		;ADD 1 FOR # OF TRACKS
 	LD	C,A		;PASS TO COUNTER
 	PUSH	HL		;SAVE BUFFER POINTER
 	PUSH	DE		;MUST SAVE FROM FILL
 	LD	L,B		;PASS TO L
 	LD	H,0		;	FOR DISPLACEMENT
 	LD	B,0		;< 256 BYTES TO FOLLOW
 	ADD	HL,DE		;FIND BYTE IN TABLE
 	POP	AF		;GET FILL BYTE
 	PUSH	AF		;	AND SAVE
 	CALL	FILL		;LOAD 'EM
 	POP	DE		;RESTORE
 	POP	HL		;	HL & DE
 	DEC	HL		;GET LAST TERMINATOR
 	LD	A,(HL)		;	USED
 	INC	HL		;FIX IT
 	CP	0DH		;TEMINATOR ?
 	JP	NZ,TABLLP	;KEEP GOING
 	POP	AF
 	XOR	A		;SET FLAG TO SUCCESS
 	RET			;DONE
 INVAL	LD	C,0		;NO NUMBER
 	POP	AF		;RESTORE
 	OR	0FFH		;SET ALL BITS
 	RET			;DONE
 FMTLCK	CALL	DISPLY		;MESSAGE
 	DEFB	0DH
 	DEFM	'LOCKED OUT TRACKS TO BE FORMATTED ? '
 	DEFB	0
 	LD	B,3
 	CALL	GETSTR		;GET KEYBOARD RESPONSE
 	CP	0DH		;FIRST KEY PRESSED
 	RET	Z		;NO CHANGES
 	CP	59H		;	Y ?
 	RET	Z		;Z=YES
 	CP	4EH		;	N ?
 	JR	NZ,FMTLCK	;BAD INPUT
 BAD9	CALL	DISPLY		;NEW PROMPT
 	DEFB	0DH
 	DEFM	'FORMAT <S>OME TRACKS, OR <N>ONE ? '
 	DEFB	0
 	LD	B,1
 	CALL	GETSTR		;GET ANSWER
 	CP	'N'		;NONE OF THEM ?
 	JR	Z,NONO		;	NOPE !
 	CP	'S'		;SOME OF THEM ?
 	JR	NZ,BAD9		;BAD INPUT
 BAD0	CALL	DISPLY		;PROMPT
 	DEFB	0DH
 	DEFM	'LIST ALL TRACKS TO FORMAT '
 	DEFM	'REGARDLESS OF LOCKOUT STATUS'
 	DEFB	0DH
 	DEFM	'? '
 	DEFB	0
 	LD	B,30H		;LOT'S OF ROOM FOR INPUT
 	CALL	GETSTR		;GET THE ANSWER
 	CP	0DH		;NO INPUT
 	RET	Z		;NO CHANGES
 	LD	DE,FMTBUF	;FORMAT YES/NO TABLE
 	LD	A,0FFH		;NO FORMAT BYTE
 	CALL	TABLFX		;LOG INTO TABLE
 	JP	NZ,BAD0		;BAD INPUT
 	RET			;EVERYTHING OK
 NONO	LD	HL,LCKBUF	;POINT TO LOCKOUT TABLE
 	LD	DE,FMTBUF	;POINT TO FORMAT TABLE
 	LD	BC,100H		;256 BYTES TO MOVE
 	LDIR			;MOVE 'EM
 	RET			;DONE
 GETDIR	CALL	DISPLY		;PROMPT
 	DEFB	0DH
 	DEFM	'DO YOU WANT A DIRECTORY ON THE DISK ? '
 	DEFB	0
 	LD	B,3
 	CALL	GETSTR		;GET ANSWER
 	CP	59H		;	Y ?
 	JR	Z,YESIDO	;OK
 	CP	4EH		;	N ?
 	JR	NZ,GETDIR	;BAD INPUT
 	LD	A,0FFH		;OFF BYTE
 	LD	(DIRECT),A	;NO DIRECTORY
 	RET			;THAT'S IT
 YESIDO	CALL	DISPLY		;PROMPT
 	DEFB	0DH
 	DEFM	'PUT DIRECTORY ON WHICH TRACK ? '
 	DEFB	0
 	LD	B,2
 	CALL	GETSTR		;GET RESPONSE
 	CP	0DH		;NO INPUT ?
 	JR	Z,YESIDO	;BAD INPUT
 	CALL	VALUE		;WHICH ONE ?
 	LD	E,C		;THAT ONE
 	LD	D,0		;DON'T NEED THAT
 	LD	HL,LCKBUF	;POINT TO LOCKOUT TABLE
 	ADD	HL,DE		;THAT'S THE ONE I NEED
 	LD	A,(HL)		;GET IT
 	CP	0FFH		;IS IT LOCKED OUT ?
 	JR	Z,TOOBAD	;YES IT IS
 	LD	A,C		;GET THE TRACK
 	LD	(DIRTRK),A	;SAVE IT
 	RET			;DONE
 TOOBAD	PUSH	BC		;SAVE TRACK IN CASE
 	CALL	DISPLY		;PROMPT
 	DEFB	0DH
 	DEFM	'THAT TRACK IS LOCKED OUT !'
 	DEFB	0DH
 	DEFM	'<U>SE IT ANYWAY, OR <S>ELECT ANOTHER ? '
 	DEFB	0
 	LD	B,1
 	CALL	GETSTR		;GET ANSWER
 	POP	BC		;RESTORE TRACK REQUEST
 	CP	0DH		;NO ANSWER !
 	JR	Z,TOOBAD	;TRY AGAIN
 	CP	'U'		;	USE IT ?
 	JR	Z,FINE1		;OK
 	CP	'S'		;	ANOTHER ?
 	JR	NZ,TOOBAD	;BAD INPUT
 	JP	YESIDO		;GET ANOTHER
 FINE1	LD	A,C		;GET REQUESTED TRACK
 	LD	(DIRTRK),A	;SAVE IT
 	LD	E,A		;PASS TO DE
 	LD	D,0		;<256
 	LD	HL,LCKBUF	;POINT TO LOCKOUT TABLE
 	ADD	HL,DE		;POINT TO DIR BYTE
 	LD	(HL),0FCH	;UNLOCK IT
 	LD	HL,FMTBUF	;POINT TO FORMAT TABLE
 	ADD	HL,DE		;POINT TO BYTE
 	LD	(HL),0FCH	;FORMAT IT
 	RET			;DONE
 REAPTC	CALL	DISPLY		;PROMPT
 	DEFB	0DH
 	DEFM	'DO YOU WANT ANY TRACKS '
 	DEFM	'READ PROTECTED ? '
 	DEFB	0
 	LD	B,3
 	CALL	GETSTR		;GET RESPONSE
 	CP	59H		;	Y ?
 	JR	Z,YUPIDO	;SURE DO !
 	CP	4EH		;NOPE
 	JR	NZ,REAPTC	;BAD INPUT
 	JP	FIXDIR		;READ PROTECT DIR TRACK
 YUPIDO	CALL	DISPLY		;PROMPT
 	DEFB	0DH
 	DEFM	'WHICH ONES TO READ PROTECT ? '
 	DEFB	0
 	LD	B,1EH		;30 CHARACTERS
 	CALL	GETSTR		;GET ANSWER
 	CP	0DH		;NO INPUT ?
 	RET	Z		;NOTHING DONE
 	LD	DE,IDBUF	;ID ADDRESS TABLE
 	LD	A,0FAH		;READ PROTECT BYTE
 	CALL	TABLFX		;ENTER INTO TABLE
 	JP	NZ,YUPIDO	;BAD INPUT
 	RET			;DONE SUCCESSFUL
 BOOTRQ	CALL	DISPLY		;PROMPT
 	DEFB	0DH
 	DEFM	'DO YOU WANT A DOS LOADER ON THE DISK ? '
 	DEFB	0
 	LD	B,3
 	CALL	GETSTR		;GET ANSWER
 	CP	0DH		;NO ANSWER ?
 	RET	Z		;NO CHANGES
 	CP	'Y'		;	YES ?
 	RET	Z		;OK
 	CP	4EH		;	NO ?
 	JR	NZ,BOOTRQ	;BAD INPUT
 	LD	A,0FFH		;NO BOOT SIGNAL
 	LD	(BOOT),A	;DONE
 	RET			;THAT'S ALL
 FIXDIR	LD	A,(DIRTRK)	;GET DIRECTORY TRACK
 	LD	E,A		;PASS IT
 	LD	D,0
 	LD	HL,IDBUF	;ID ADDRESS MARK TABLE
 	ADD	HL,DE		;POINT TO DIR TRACK
 	LD	(HL),0FAH	;READ PROTECT IT
 	RET			;DONE
 	END	ENTRY
