FORMAT ;		* * * * * * * * * * * * *
 ;		*  Program by Kim Watt  *
 ;		* Breeze Computing Inc. *
 ;		*     P.O. Box  1013    *
 ;		* Berkley, Mich.  48072 *
 ;		*    (313) 288-9422     *
 ;		* * * * * * * * * * * * *
 ;
 ;
 ;
 ;
 ;
 ;
 ;
 ;
 	ORG	6D00H
 ENTRY	DI
 	LD	SP,ENTRY	;BELOW PROGRAM
 FIXIT	CALL	LINK		;CHECK FOR COPY LINK
 START	LD	HL,7F00H	;POINT TO BOOT/SYS
 	LD	DE,4200H	;WHERE IT SHOULD BE
 	LD	BC,100H		;SECTOR LENGTH 256 BYTES
 	LDIR			;PUT IT THERE
 	LD	HL,O5CCB
 	LD	DE,5CCBH
 	LD	BC,50
 	LDIR
 	CALL	CREDIT		;SHOW AUTHOR CREDIT
 	CALL	GETDRV		;GET DESIRED DRIVES
 	CALL	STATCK		;CHECK STATUS & RESTORE
 	LD	IX,ONES		;WHICH DRIVES TO FORMAT
 	LD	IY,TRACKS	;# TRACKS ON DISK
 	CALL	DISPLY
 	DEFW	0D0DH
 	DEFM	'Enter diskette name: '
 	DEFB	0
 	LD	HL,SPACES	;DUMMY NAME
 	LD	DE,5CD0H	;WHERE IT GOES
 	LD	BC,16
 	LDIR			;PUT 'EM THERE
 	LD	B,8		;ALLOW 8 CHARACTERS
 	CALL	GETSTR		;GET ANSWER
 	JR	Z,BAD1		;NO INPUT
 	LD	B,0
 	JR	BADAA
 BAD1	LD	HL,NAME
 	LD	BC,8
 BADAA	LD	DE,5CD0H
 	LDIR
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Enter creation date: '
 	DEFB	0
 	LD	B,8
 	CALL	GETSTR
 	JR	Z,BAD3		;NO INPUT
 	LD	B,0
 	JR	BADB
 BAD3	LD	HL,DATE
 	LD	BC,8
 BADB	LD	DE,5CD8H
 	LDIR
 OVER2	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Enter master password: '
 	DEFB	0
 	LD	B,8
 	CALL	GETSTR
 	JR	NZ,BADC		;CODE INPUT
 	LD	HL,42E0H	;"PASSWORD" PASSWORD
 	JR	RESUME
 BADC	CALL	CODE		;CODE THE PASSWORD
 RESUME	LD	(5CCEH),HL	;PUT INTO SECTOR
 	LD	HL,5CE0H	;AUTO COMMAND
 	PUSH	HL
 	LD	DE,5CE1H
 	LD	BC,31
 	LD	(HL),20H
 	LDIR
 	POP	HL
 	LD	(HL),0DH
 BAD88	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Enter diskette track count (2-96): '
 	DEFB	0
 	LD	B,2
 	CALL	GETSTR		;GET RESPONSE
 	JR	Z,BAD8		;USE 35
 	CALL	VALUE		;COMPUTE VALUE
 	LD	A,E		;GET VALUE
 	CP	2		;LESS THAN 2?
 	JR	C,BAD88
 	CP	61H		;MORE THAN 96?
 	JR	NC,BAD88
 	JR	RESUM2
 BAD8	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'35 Tracks assumed !'
 	DEFB	0
 	LD	A,35		;35 TRACKS DEFAULT
 RESUM2	LD	(IY),A		;SAVE TRACK COUNT
 	LD	HL,5C00H	;POINT TO GAT SECTOR
 	XOR	A		;ZERO IT FOR COUNT
 OPEN1	LD	(HL),0FCH	;OPEN BOTH GRANS
 	INC	HL		;BUMP POINTER
 	INC	A		;BUMP COUNTER
 	CP	(IY)		;AT THE END ?
 	JR	NZ,OPEN1	;KEEP UNLOCKING
 OPEN2	CP	0CBH		;END OF LOCKOUT TABLE ?
 	JR	Z,OPENDN	;DONE WITH LOADING
 	LD	(HL),0FFH	;LOCK OUT BYTE
 	INC	HL
 	INC	A
 	JR	OPEN2
 BAD4	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Invalid track number !'
 	DEFB	0
 OPENDN	LD	A,(IY)		;GET TRACK COUNT
 	LD	(5CC0H),A	;PUT INTO DIRECTORY
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Do you want to lock out any tracks ? '
 	DEFB	0
 	LD	B,3
 	CALL	GETSTR
 	CP	59H		;YES ?
 	JP	NZ,BAD5		;DON'T LOCK OUT ANY
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Lockout which tracks ? '
 	DEFB	0
 	LD	B,1EH
 	CALL	GETSTR
 LOKLP	CALL	VALUE		;CONVERT ASCII TO NUMERIC
 	LD	D,E		;GET NUMBER
 	CP	2DH		;RANGE SPECIFIED ?
 	JR	NZ,NORANG
 	CALL	VALUE		;GET NEXT NUMBER
 NORANG	EX	AF,AF'		;ALTERNATE REGISTERS
 	LD	A,D		;GET LOW TRACK
 	OR	A		;IS IT ZERO
 	JP	Z,BAD4		;BAD TRACK COUNT
 	CP	(IY)		;HIGHER THAN ALLOWED ?
 	JP	NC,BAD4		;TOO MANY
 	LD	A,E		;GET HIGH INPUT
 	CP	(IY)		;HIGHER THAN ALLOWED ?
 	JP	NC,BAD4
 	SUB	D		;COMPARE TWO NUMBERS
 	JP	C,BAD4		;START LESS THAN END
 	INC	A		;LENGTH OF RANGE
 	LD	B,A		;SAVE IN BYTE COUNTER
 	PUSH	HL		;SAVE POINTER
 	LD	L,D		;POINT TO BYTE IN SECTOR
 	LD	H,5CH		;POINT TO SECTOR
 LOCKLP	LD	(HL),0FFH	;LOCK OUT THE TRACK
 	INC	HL		;POINT TO NEXT BYTE
 	DJNZ	LOCKLP		;DO IT FOR RANGE
 	POP	HL		;RESTORE STRING POINTER
 	EX	AF,AF'		;GET TERMINATOR BACK
 	CP	0DH		;DONE WITH COMMAND ?
 	JR	NZ,LOKLP	;GET NEXT RANGE
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Format the locked out tracks ? '
 	DEFB	0
 	LD	B,3
 	CALL	GETSTR
 	LD	(FMTLCK),A	;SAVE INPUT FOR FORMAT
 BAD5	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Put directory on which track ? '
 	DEFB	0
 	LD	B,2
 	CALL	GETSTR
 	JR	Z,FINDTR	;FIND A DIRECTORY TRACK
 	CALL	VALUE
 	LD	A,E		;GET VALUE
 	OR	A
 	JR	Z,BAD5		;NO INPUT, FIND ONE
 	CP	(IY)
 	JR	NC,BAD5		;TOO HIGH
 	JP	DIRFND		;DIRECTORY FOUND
 FINDTR	LD	H,5CH
 	LD	L,11H
 	LD	C,0
 FINLP1	LD	A,(HL)		;GET LOCKOUT BYTE
 	CP	0FCH		;AVAILABLE ?
 	JR	Z,DIRFN1	;THAT ONE IS OK
 	INC	C		;BUMP COUNTER
 	LD	A,C		;GET IT
 	RRCA			;SHIFT OUT BIT 0
 	LD	A,L		;GET TRACK
 	JR	NC,FINLP2
 	ADD	A,C
 	LD	L,A
 	CP	(IY)
 	JR	NZ,FINLP1
 	JR	BAD6		;NO TRACKS AVAILABLE
 FINLP2	SUB	C
 	LD	L,A
 	JR	NZ,FINLP1
 BAD6	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'No tracks available for directory !'
 	DEFB	0
 	JP	ERRORD		;TERMINATE
 DIRFN1	LD	A,L		;GET TRACK
 DIRFND	LD	(4202H),A	;SAVE IT
 	LD	E,A		;SAVE IT A MINUTE
 	LD	L,A		;TRACK
 	LD	H,5CH		;GAT SECTOR
 	LD	A,(HL)		;GET LOCKOUT BYTE
 	INC	A		;IS IT LOCKED ?
 	JP	Z,BAD5		;TRY AGAIN
 	LD	A,E		;RESTORE TRACK
 	CALL	ASCII		;CONVERT TO ASCII
 	LD	(DIRTRK),BC	;PUT INTO DISPLAY
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Fill empty sectors with what byte ? '
 	DEFB	0
 	LD	B,2
 	CALL	GETSTR
 	JR	Z,FILE5
 	CALL	VALUE
 	LD	A,E
 	JR	DODO
 FILE5	LD	A,0E5H
 DODO	LD	(FILBYT),A
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Do you want to leave a message on the disk ? '
 	DEFB	0
 	LD	B,3
 	CALL	GETSTR
 	JR	Z,BAD10		;SKIP IT
 	LD	A,(STRING)	;GET FIRST CHARACTER
 	CP	'Y'
 	JR	NZ,BAD10	;SKIP IT TOO
 	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Message located on Track '
 DIRTRK	DEFM	'00, Sector 0, Bytes F0-FF.'
 	DEFB	0DH
 	DEFM	'Enter 16 character message: '
 	DEFB	0
 	LD	B,16
 	CALL	GETSTR
 	JR	Z,BAD10
 	LD	DE,5CF0H	;POINT TO GAT SECTOR
 	LD	B,0
 	LDIR			;MOVE IT THERE
 BAD10	CALL	SETGAT		;SETUP GAT TABLES
 GOMORE	XOR	A		;START WITH TRACK 0
 	LD	(TRAK),A	;SAVE FOR FORMAT
 	LD	A,(IX)		;WORKING DRIVE
 	CP	0FFH		;TERMINATOR ?
 	JP	Z,FMTBYE	;DONE WITH FORMATTING
 	CP	99		;NOT THIS ONE
 	JR	Z,SKIP1
 	LD	(DRIVE),A	;SAVE DRIVE
 	CALL	FORMAT
 SKIP1	INC	IX		;BUMP DRIVE POINTER
 	JR	GOMORE
 CREDIT	CALL	DISPLY
 	DEFW	1F1CH		;CLEAR SCREEN
 	DEFM	'- BREEZE SPECIAL FORMAT UTILITY -'
 	DEFW	0D0DH
 	DEFM	'Program by '
 KIM	DEFM	'Kim Watt'
 	DEFB	0DH
 BREEZE	DEFM	'Breeze Computing Inc.'
 	DEFB	0DH
 	DEFM	'Version 1.2'
 	DEFB	0DH
 	DEFB	0DH
 	DEFM	'Distributed by'
 	DEFB	0DH
 BERK	DEFM	'Level IV Products'
 	DEFB	0DH
 AREA	DEFM	'32238 Schoolcraft suite F4'
 	DEFB	0DH
 	DEFM	'Livonia, Mich.  48150'
 	DEFW	0D0DH
 	DEFM	'Press <ENTER> to continue ! '
 	DEFB	0
 	LD	B,1
 	CALL	GETSTR
 	RET			;DONE WITH CREDITS
 GETDRV	CALL	DISPLY
 	DEFW	1F1CH
 	DEFM	'- BREEZE FORMATTER -'
 	DEFW	0D0DH
 	DEFB	0
 	LD	A,1		;START WITH DRIVE 0
 	LD	C,0		;ACTUAL DRIVE
 	LD	B,4		;GO FOR 4 DRIVES
 	LD	IX,ONES		;WHICH DRIVES TO FORMAT
 GETLP	PUSH	BC
 	PUSH	AF
 	LD	A,C		;GET DRIVE
 	CALL	ASCII		;MAKE IT ASCII
 	LD	A,B		;GET LOW BYTE
 	LD	(WHDRIV),A	;SAVE INTO STRING
 BAD7	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Do you want to format Drive '
 WHDRIV	DEFM	'0 ? '
 	DEFB	0
 	LD	B,3
 	CALL	GETSTR
 	CP	'Y'		;YES ?
 	JR	Z,OKYES
 	CP	'N'
 	JR	NZ,BAD7
 	LD	A,99
 	LD	(IX),A
 	JR	NEXT
 OKYES	POP	AF
 	LD	(IX),A
 	PUSH	AF
 NEXT	POP	AF
 	POP	BC
 	INC	IX
 	RLA			;SHIFT TO NEXT BIT
 	INC	C
 	DJNZ	GETLP
 	LD	IX,ONES		;RESET POINTER
 	RET			;DONE
 ONES	DEFW	00H
 	DEFW	00H
 	DEFB	0FFH		;TERMINATOR
 TESTIN	LD	HL,0
 TESTLP	LD	A,(IX)
 	INC	IX
 	LD	E,A
 	LD	D,0
 	ADD	HL,DE
 	DJNZ	TESTLP
 	RET
 STATCK	LD	A,(IX)		;GET A DRIVE BYTE
 	CP	0FFH		;TERMINATOR ?
 	RET	Z		;DONE
 	CP	99
 	JP	Z,NOCHK		;NOT THIS DRIVE
 	LD	(DRIVE),A	;PASS DRIVE
 	CALL	RESTOR
 	LD	BC,0
 	CALL	60H		;WAIT FOR MOTOR SPEED
 	CALL	SELECT		;RESELECT THE DRIVE
 	LD	A,(37ECH)	;GET STATUS BYTE
 	LD	HL,ERMSG5	;DRIVE NOT READY
 	BIT	7,A
 	JP	NZ,DERROR
 	LD	HL,ERMSG6	;DRIVE NOT IN SYSTEM
 	BIT	2,A
 	JP	Z,DERROR
 	LD	HL,ERMSG7	;DISKETTE WRITE PROTECTED
 	BIT	6,A
 	JP	NZ,DERROR
 	LD	B,00CDH
 	LD	HL,ERMSG8	;NO SYSTEM IN DRIVE
 TST1	DEC	BC
 	LD	A,B
 	OR	C		;ANY BITS ON STILL ?
 	JP	Z,DERROR
 	LD	A,(37ECH)
 	AND	2
 	JR	NZ,TST1
 	LD	BC,199DH
 	LD	HL,ERMSG9	;DOOR NOT CLOSED
 TST2	DEC	BC
 	LD	A,B
 	OR	C
 	JP	Z,DERROR
 	LD	A,(37ECH)
 	AND	2
 	JP	Z,TST2
 	LD	DE,0
 	LD	BC,00BAH
 	LD	HL,ERMSG0	;NO DISKETTE IN DRIVE
 TST3	DEC	BC
 	LD	A,B
 	OR	C
 	JP	Z,DERROR
 	INC	DE
 	LD	A,(37ECH)
 	AND	2
 	JR	NZ,TST3
 	LD	BC,1720H
 	LD	HL,ERMSG9	;DOOR NOT CLOSED
 TST4	DEC	BC
 	LD	A,B
 	OR	C
 	JP	Z,DERROR
 	INC	DE
 	LD	A,(37ECH)
 	AND	2
 	JR	Z,TST4
 	LD	HL,0EACBH
 	ADD	HL,DE
 	LD	HL,ERMSG1	;HARD SECTORED
 	JP	NC,DERROR
 NOCHK	INC	IX		;POINT TO NEXT BYTE
 	JP	STATCK		;GO AGAIN
 DISPLY	POP	DE		;POINT TO DATA
 DISLP	LD	HL,(4020H)	;GET CURSOR POSITION
 	LD	A,(DE)		;GET A BYTE
 	INC	DE		;POINT TO NEXT
 	OR	A		;SET FLAGS
 	JR	Z,DISDN		;TERMINATOR
 	CP	20H		;CHECK FOR CONTROL CODE
 	JR	C,DISCTL	;DISPLAY CONTROL CODE
 	LD	(HL),A		;DISPLAY BYTE
 	CP	(HL)		;STILL THERE ?
 	JR	Z,DISOK		;LOWER CASE INSTALLED
 	SUB	20H		;MAKE IT UPPER CASE
 	LD	(HL),A		;DISPLAY IT
 DISOK	INC	HL		;POINT TO NEXT
 	LD	(4020H),HL	;UPDATE CURSOR
 	JR	DISLP		;GET NEXT CHARACTER
 DISCTL	PUSH	DE		;MUST SAVE
 	PUSH	IY		;DE AND IY
 	CALL	33H		;DISPLAY CONTROL
 	POP	IY		;RESTORE
 	POP	DE		;DE AND IY
 	JR	DISLP		;GET SOME MORE
 DISDN	PUSH	DE		;RETURN ADDRESS
 	RET			;GO TO IT
 SELECT	DEFB	3EH		;LOAD A OPCODE
 DRIVE	DEFB	1		;DRIVE ONE
 	LD	(37E1H),A	;SELECT IT
 	RET
 ERMSG5	DEFB	0DH
 	DEFM	'Drive NOT READY !'
 	DEFB	0
 	JP	ERRORD
 ERMSG6	DEFB	0DH
 	DEFM	'Drive NOT IN SYSTEM !'
 	DEFB	0
 	JP	ERRORD
 ERMSG7	DEFB	0DH
 	DEFM	'Diskette WRITE PROTECTED !'
 	DEFB	0
 	JP	ERRORD
 ERMSG8	DEFB	0DH
 	DEFM	'No SYSTEM in DRIVE !'
 	DEFB	0
 	JP	ERRORD
 ERMSG9	DEFB	0DH
 	DEFM	'DOOR NOT CLOSED on drive !'
 	DEFB	0
 	JP	ERRORD
 ERMSG0	DEFB	0DH
 	DEFM	'NO DISKETTE in drive !'
 	DEFB	0
 	JP	ERRORD
 ERMSG1	DEFB	0DH
 	DEFM	'Diskette is HARD SECTORED !'
 	DEFB	0
 	JP	ERRORD
 LINK	LD	HL,KIM
 	LD	A,(HL)
 	CP	'K'
 	JP	NZ,ENTRY
 	INC	HL
 	LD	A,(HL)
 	CP	'i'
 	JP	NZ,ENTRY
 	INC	HL
 	LD	A,(HL)
 	CP	'm'
 	JP	NZ,ENTRY
 	LD	HL,BREEZE
 	LD	A,(HL)
 	CP	'B'
 	JP	NZ,ENTRY
 	INC	HL
 	LD	A,(HL)
 	CP	'r'
 	JP	NZ,ENTRY
 	INC	HL
 	LD	A,(HL)
 	CP	'e'
 	JP	NZ,ENTRY
 	LD	A,(BERK)
 	CP	'L'
 	JP	NZ,ENTRY
 	LD	A,(AREA)
 	CP	'3'
 	JP	NZ,ENTRY
 	PUSH	IX
 	LD	IX,KIM
 	LD	B,8
 	CALL	TESTIN
 	LD	DE,737
 	OR	A
 	SBC	HL,DE
 	JP	NZ,0
 	LD	IX,BREEZE
 	LD	B,21
 	CALL	TESTIN
 	LD	DE,1947
 	OR	A
 	SBC	HL,DE
 	JP	NZ,0
 	LD	IX,BERK
 	LD	B,17
 	CALL	TESTIN
 	LD	DE,1579
 	OR	A
 	SBC	HL,DE
 	JP	NZ,0
 	LD	IX,AREA
 	LD	B,48
 	CALL	TESTIN
 	LD	DE,3738
 	OR	A
 	SBC	HL,DE
 	JP	NZ,0
 	POP	IX
 	LD	HL,0
 	LD	(FIXIT),HL
 	XOR	A
 	LD	(FIXIT+2),A
 	LD	HL,3801H
 	LD	B,6
 CHKLOP	LD	A,(HL)
 	OR	A
 	JP	NZ,ENTRY
 	SLA	L
 	DJNZ	CHKLOP
 	LD	A,(3880H)
 	OR	A
 	JP	Z,ENTRY
 	LD	A,(3840H)
 	CP	4
 	JP	NZ,ENTRY
 BADZU	CALL	1C9H		;CLEAR SCREEN
 BADMU	CALL	DISPLY
 	DEFM	'- Mount BREEZE COPY DISKETTE into Drive 0 -'
 	DEFW	0D0DH
 	DEFM	'<P>roceed or <C>ancel ? '
 	DEFB	0
 	LD	B,1
 	CALL	GETSTR
 	CP	'C'
 	JP	Z,ENTRY
 	CP	'P'
 	JR	NZ,BADZU
 	CALL	DISPLY
 	DEFW	0D0DH
 	DEFM	'Loading LINK program.'
 	DEFB	0
 	LD	A,1
 	LD	(DRIVE),A		;SELECT DRIVE 0
 	CALL	RESTOR
 	LD	BC,0
 	CALL	60H
 	LD	DE,0
 	LD	BC,5200H
 	CALL	READ
 	JR	NZ,BADUU
 	LD	A,(5200H)
 	CP	99
 	JR	NZ,BADUU
 	LD	A,(52FFH)
 	OR	A
 	JR	NZ,BADUU
 	JP	5200H
 BADUU	CALL	DISPLY
 	DEFW	0D0DH
 	DEFM	'Invalid Diskette !'
 	DEFW	0D0DH
 	DEFB	0
 	JP	BADMU
 TRACKS	DEFB	0		;# OF TRACKS ON DISK
 NAME	DEFM	'********'	;IF NAME NOT SPECIFIED
 DATE	DEFM	'00/00/00'	;IF DATE NOT SPECIFIED
 SPACES	DEFM	'                '	;NAME/DATE
 CODE	EX	DE,HL		;DE => BEGINNING OF INPUT
 	LD	A,B		;GET LENGTH
 	ADD	A,E		;A = LENGTH
 	LD	L,A		;SAVE TO LOW NYBBLE
 	LD	A,D		;GET HIGH INPUT NYBBLE
 	ADC	A,0		;ADD CARRY
 	LD	H,A		;SAVE TO HIGH NYBBLE
 	LD	A,8		;8 CHARACTERS MAX
 	SUB	B		;ACTUAL LENGTH
 	LD	B,A		;GIVE TO COUNTER
 CODLP1	LD	(HL),20H	;PUT SPACES TILL END
 	INC	HL		;POINT TO NEXT
 	DJNZ	CODLP1		;GO TILL END
 	LD	HL,0FFFFH	;PASSWORD START
 	LD	B,8		;GO FOR 8 CHARACTERS
 	LD	A,E		;GET HIGH POINTER
 	ADD	A,7
 	LD	E,A
 	JR	NC,CODLP2
 	INC	D
 CODLP2	LD	A,(DE)		;GET A BYTE IN STRING
 	PUSH	DE		;SAVE POINTER
 	LD	D,A
 	LD	E,H
 	LD	A,L
 	AND	7
 	RRCA
 	RRCA
 	RRCA
 	XOR	L
 	LD	L,A
 	LD	H,0
 	ADD	HL,HL
 	ADD	HL,HL
 	ADD	HL,HL
 	ADD	HL,HL
 	XOR	H
 	XOR	D
 	LD	D,A
 	LD	A,L
 	ADD	HL,HL
 	XOR	H
 	XOR	E
 	LD	E,A
 	EX	DE,HL
 	POP	DE
 	DEC	DE		;WORK BACKWARDS
 	DJNZ	CODLP2
 	RET			;PASSWORD IN HL
 DERROR	PUSH	HL		;STRING POINTER
 	JP	DISPLY		;GO DISPLAY
 ;  ALL ERROR ROUTINES END HERE
 ERRORD	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'FORMAT CANNOT CONTINUE because of detected ERROR !'
 	DEFB	0DH
 	DEFM	'Press <ENTER> to restart program ! '
 	DEFB	0
 	LD	B,1
 	CALL	GETSTR		;WAIT FOR ENTER KEY
 	JP	ENTRY		;TERMINATE
 REQLEN	DEFB	0
 LENGTH	DEFB	0
 CHAR	DEFB	0
 NEWST	XOR	A		;ZERO THE LENGTH
 	LD	(LENGTH),A	;STASH IT
 	LD	HL,(4020H)	;START CURSOR POSIT
 	LD	A,(REQLEN)
 	LD	B,A
 	JR	GET15		;GO TO IT
 GETSTR	LD	HL,(4020H)	;GET CURSOR POSITION
 	LD	A,B		;GET REQUESTED LENGTH
 	LD	(REQLEN),A	;SAVE IT
 GET15	LD	(HL),20H	;PUT SPACES ON VIDEO
 	INC	HL		;POINT TO NEXT
 	DJNZ	GET15		;GO TILL END
 	XOR	A		;ZERO IT
 	LD	(LENGTH),A	;SAVE CURRENT LENGTH
 	LD	HL,STRING	;POINT TO INPUT BUFFER
 	LD	DE,(4020H)	;GET CURSOR
 SCAN	LD	A,8FH		;CURSOR CHARACTER
 	LD	(DE),A		;TURN IT ON
 	LD	BC,500H		;DELAY COUNT
 LOOP1	DEC	BC		;REDUCE COUNT
 	PUSH	BC		;SAVE IT
 	PUSH	DE
 	PUSH	IY
 	CALL	2BH
 	POP	IY
 	POP	DE
 	POP	BC
 	OR	A		;SET FLAGS
 	JR	NZ,GOTONE	;KEY WAS PRESSED
 	LD	A,B
 	OR	C		;ANY COUNT LEFT ?
 	JR	NZ,LOOP1	;GO SOME MORE
 	LD	A,20H		;CURSOR OFF CHARACTER
 	LD	(DE),A		;TURN IT OFF
 	LD	BC,500H		;DELAY COUNT
 LOOP2	DEC	BC
 	PUSH	BC
 	PUSH	DE
 	PUSH	IY
 	CALL	2BH
 	POP	IY
 	POP	DE
 	POP	BC
 	OR	A
 	JR	NZ,GOTONE
 	LD	A,B
 	OR	C
 	JR	NZ,LOOP2
 	JR	SCAN		;CURSOR BACK ON
 GOTONE	LD	(CHAR),A	;SAVE CHARACTER
 	CP	0DH		;ENTER KEY ?
 	JR	Z,DONEST	;TERMINATOR
 	CP	8		;BACKSPACE ?
 	JR	Z,BCKSPA
 	CP	18H		;SHIFT LEFT ARROW ?
 	JR	Z,NEWST		;START OVER
 	CP	20H		;DISPLAYABLE ?
 	JP	C,SCAN		;NOPE
 	LD	A,(REQLEN)	;GET REQUESTED LENGTH
 	LD	B,A		;SAVE IT HERE
 	LD	A,(LENGTH)	;GET ACTUAL LENGTH
 	CP	B
 	JR	NC,SCAN		;TOO MANY CHARACTERS
 	LD	A,(CHAR)	;GET CHARACTER BACK
 	LD	(DE),A		;PUT ON VIDEO
 	LD	(HL),A		;PUT INTO BUFFER
 	INC	DE
 	INC	HL		;BUMP POINTERS
 	LD	A,(LENGTH)	;GET LENGTH
 	INC	A		;ONE MORE
 	LD	(LENGTH),A	;SAVE NEW VALUE
 	JR	SCAN		;GO SOME MORE
 BCKSPA	LD	A,(LENGTH)	;GET LENGTH
 	OR	A		;SET FLAGS
 	JR	Z,SCAN		;NO CHARACTERS
 	DEC	A		;REDUCE NUMBER
 	LD	(LENGTH),A	;SAVE NEW LENGTH
 	LD	A,20H		;SPACE
 	LD	(DE),A
 	LD	(HL),A		;PUT INTO BUFFERS
 	DEC	HL
 	DEC	DE		;REDUCE POINTERS
 	JR	SCAN		;GO SOME MORE
 DONEST	LD	A,20H		;SPACE
 	LD	(DE),A		;CURSOR OFF
 	LD	(HL),0DH	;TERMINATOR
 	LD	A,(LENGTH)	;GET LENGTH
 	OR	A		;SET LENGTH FLAGS
 	LD	B,A		;GIVE TO B
 	LD	C,A		;HERE TO FOR BC=LENGTH
 	LD	A,(STRING)	;GET FIRST CHARACTER
 	LD	HL,STRING	;POINT TO INPUT
 	LD	(4020H),DE	;UPDATE CURSOR POSITION
 	RET			;DONE
 VALUE	LD	E,0		;PASS IN E REG.
 VALLP	LD	A,(HL)		;GET A BYTE FROM STRING
 	INC	HL		;POINT TO NEXT
 	CP	30H		;NUMERIC ?
 	RET	C		;NOPE
 	CP	3AH		;NUMERIC ?
 	RET	NC		;NOPE
 	SUB	30H		;REMOVE ASCII
 	LD	B,A
 	LD	A,E
 	ADD	A,A
 	ADD	A,A
 	ADD	A,E
 	ADD	A,A
 	ADD	A,B
 	LD	E,A
 	JR	VALLP		;GO SOME MORE
 ASCII	LD	C,30H		;START WITH 0
 ASCII1	SUB	0AH		;MINUS 10
 	JR	C,ASCII2
 	INC	C
 	JR	ASCII1
 ASCII2	ADD	A,3AH
 	LD	B,A
 	RET			;ASCII IN BC
 FMTBYE	CALL	DISPLY
 	DEFW	1F1CH		;CLEAR SCREEN
 	DEFM	'Formatting completed !'
 	DEFW	0D0DH
 	DEFM	'<E>xit program or <R>estart again ? '
 	DEFB	0
 	LD	B,1
 	CALL	GETSTR
 	CP	'R'		;RESTART ?
 	JP	Z,RSTART	;OK
 	CP	'E'		;EXIT ?
 	JR	NZ,FMTBYE	;BAD INPUT
 	CALL	DISPLY
 	DEFW	0D0DH
 	DEFM	'Format utility TERMINATED !'
 	DEFW	0D0DH
 	DEFM	'Press <ENTER> when SYSTEM disk mounted on drive 0 ! '
 	DEFB	0
 	LD	B,1
 	CALL	GETSTR
 	JP	0		;RE-BOOT
 FORMAT	LD	A,(DRIVE)	;GET DRIVE
 	LD	C,0		;START WITH 0
 FMTLP1	RRCA			;SHIFT OUT A BIT
 	JR	C,DRVFND
 	INC	C		;BUMP DRIVE
 	JR	FMTLP1		;TEST AGAIN
 DRVFND	LD	A,C		;GET DRIVE
 	CALL	ASCII		;CONVERT TO ASCII
 	LD	A,B		;GET LOW NYBBLE
 	LD	(FMTDRV),A	;PUT INTO STRING
 	CALL	DISPLY
 	DEFW	1F1CH		;CLEAR SCREEN
 	DEFM	'- BREEZE FORMATTER -'
 	DEFW	0D0DH
 	DEFM	'Formatting on Drive '
 FMTDRV	DEFM	'0.'
 	DEFW	0D0DH
 	DEFB	0
 	CALL	FIXGAT		;RESTORE GAT SECTOR
 	CALL	SELECT
 	LD	BC,0
 	CALL	60H
 FMTLP	LD	A,(TRAK)	;GET CURRENT TRACK
 	CALL	ASCII		;MAKE IT ASCII
 	LD	(FMTTR),BC	;PUT INTO STRING
 	CALL	DISPLY
 	DEFB	1DH		;BEGINNING OF LINE
 	DEFM	'Formatting Track '
 FMTTR	DEFM	'00.'
 	DEFB	0
 	LD	A,(TRAK)	;GET TRACK BACK
 	LD	B,A		;SAVE IT
 	LD	A,(4202H)	;GET DIRECTORY TRACK
 	CP	B		;IS THIS IT
 	LD	B,0FAH		;READ PROTECTED
 	JR	Z,GOFMT1	;YES IF ZERO
 	LD	L,A		;TRACK TO L
 	LD	HL,5CH		;LOCKOUT TABLE
 	LD	A,(HL)		;GET LOCKOUT BYTE
 	INC	A		;TEST FOR 0FFH
 	LD	B,0FBH		;DELETED DATA MARK
 	JR	NZ,GOFMT1
 	DEFB	3EH		;LOAD A OPCODE
 FMTLCK	DEFB	0		;59 IF FORMAT LOCKED
 	CP	59H		;YES ?
 	JP	NZ,NXTFMT	;GO TO NEXT TRACK
 	LD	B,0F9H		;DATA MARK
 GOFMT1	LD	A,B		;GET TYPE OF WRITE BYTE
 	LD	(DATMRK),A	;SAVE INTO BUFFER
 	LD	HL,5F00H	;TRACK BUFFER
 	LD	DE,ORDER	;SECTOR ORDER ON TRACK
 	LD	B,0EH
 	CALL	FILLFF		;POST INDEX GAP
 SECLP	LD	B,6
 	LD	C,0
 	CALL	FILL		;SYNC FIELD
 	LD	C,0FEH		;ID ADDRESS MARK
 	CALL	FILL1		;PUT INTO BUFFER
 	DEFB	0EH		;LOAD C OPCODE
 TRAK	DEFB	0		;FORMAT TRACK
 	CALL	FILL1
 	LD	C,0		;HEAD NUMBER
 ;  COULD BE 1 WITH DOUBLE SIDED DISKS
 	CALL	FILL1
 	LD	A,(DE)		;GET SECTOR
 	LD	C,A
 	CALL	FILL1
 	LD	C,1		;SECTOR LENGTH 256 BYTES
 	CALL	FILL1
 	LD	C,0F7H		;CRC GENERATOR
 	CALL	FILL1
 	LD	C,0FFH
 	CALL	FILL1
 	LD	B,0BH
 	CALL	FILLFF
 	LD	B,6
 	LD	C,0
 	CALL	FILL
 	DEFB	0EH		;LOAD C OPCODE
 DATMRK	DEFB	0		;DATA MARK TYPE
 	CALL	FILL1
 	LD	B,0
 	DEFB	0EH		;LOAD C OPCODE
 FILBYT	DEFB	0E5H		;FILL BYTE FOR EMPTY SECS
 	CALL	FILL		;FILL EMPTY SECTORS
 	LD	C,0F7H		;CRC GENERATOR
 	CALL	FILL1
 	LD	C,0FFH
 	CALL	FILL1
 	LD	B,0BH
 	CALL	FILLFF
 	INC	DE		;NEXT SECTOR
 	LD	A,(DE)		;GET BYTE
 	INC	A		;CHECK FOR FF TERMINATOR
 	JR	NZ,SECLP	;NEXT SECTOR
 	LD	B,5BH		;PRE-INDEX GAP
 	CALL	FILLFF
 	CALL	WRITTR		;WRITE TRACK
 NXTFMT	LD	A,(TRAK)	;GET CURRENT TRACK
 	INC	A		;NEXT
 	LD	(TRAK),A	;SAVE IT
 	CP	(IY)		;END ?
 	JP	Z,VERIFY	;VERIFY SECTORS
 	LD	A,5BH		;STEP IN BYTE
 	LD	(37ECH),A	;GIVE TO CONTROLLER
 	PUSH	AF
 	POP	AF
 	PUSH	AF
 	POP	AF
 STEPWT	LD	A,(37ECH)	;GET STATUS
 	RRCA			;SHIFT OUT BUSY BIT
 	JR	C,STEPWT	;WAIT TILL DONE
 	JP	FMTLP		;GO AGAIN
 WRITTR	CALL	TRWRIT		;TRY IT ONCE
 	RET	Z		;GOOD WRITE
 TRWRIT	CALL	SELECT		;SELECT DRIVE
 	LD	BC,5F00H	;TRACK BUFFER
 	LD	HL,37ECH	;CONTROLLER ADDRESS
 	LD	(HL),0F4H	;WRITE TRACK BYTE
 	LD	DE,37EFH	;DATA TRANSFER ADDRESS
 	PUSH	BC
 	POP	BC
 	PUSH	BC
 	POP	BC
 	DI
 	JR	WRBZZ
 BZWRZ	RRCA
 	JR	NC,WRDNZ
 WRBZZ	LD	A,(HL)
 	BIT	1,A
 	JR	Z,BZWRZ
 	LD	A,(BC)		;GET A BYTE
 	LD	(DE),A		;GIVE TO DISK
 	INC	BC		;BUMP POINTER
 	JP	WRBZZ
 WRDNZ	LD	A,(HL)		;GET STATUS/CLEAR LATCH
 	LD	(HL),0D0H	;FORCE INTERRUPT
 	LD	HL,ERMSG2	;TRANSFER TOO FAST
 	BIT	2,A		;DATA LOST ?
 	JP	NZ,DERROR
 	LD	HL,0A100H
 	ADD	HL,BC
 	EX	DE,HL
 	LD	HL,0F413H
 	ADD	HL,DE
 	LD	HL,ERMSG3
 	JP	NC,DERROR
 	LD	HL,0F397H
 	ADD	HL,DE
 	LD	HL,ERMSG4
 	JP	C,DERROR
 	RET			;EVERYTHING IS OK
 ERMSG2	DEFB	0DH
 	DEFM	'Can'
 	DEFB	27H
 	DEFM	't format.  Transfer rate TOO FAST !'
 	DEFB	0
 	JP	ERRORD
 ERMSG3	DEFB	0DH
 	DEFM	'Can'
 	DEFB	27H
 	DEFM	't format.  Motor speed TOO SLOW !'
 	DEFB	0
 	JP	ERRORD
 ERMSG4	DEFB	0DH
 	DEFM	'Can'
 	DEFB	27H
 	DEFM	't format.  Motor speed TOO FAST !'
 	DEFB	0
 	JP	ERRORD
 VERIFY	CALL	RESTOR
 	CALL	DISPLY
 	DEFW	0D0DH
 	DEFB	0
 	LD	D,0		;TRACK 0
 VERLP	LD	L,D
 	LD	H,5CH
 	LD	A,(HL)		;LOCKOUT BYTE
 	INC	A		;COMPARE TO 0FFH
 	JP	Z,VERNO
 	LD	A,D		;GET TRACK
 	CALL	ASCII
 	LD	(ASDR),BC	;PUT INTO STRING
 	LD	E,0		;START WITH SECTOR 0
 VERLP1	PUSH	DE		;SAVE TRACK SECTOR
 	CALL	SELECT		;SELECT DRIVE
 	LD	A,E		;GET SECTOR
 	CALL	ASCII
 	LD	A,B
 	LD	(ASSC),A
 	CALL	DISPLY
 	DEFB	1DH
 	DEFM	'Verifying Track '
 ASDR	DEFM	'00, Sector '
 ASSC	DEFM	'0.'
 	DEFB	0
 	POP	DE		;RESTORE TRACK/SECTOR
 	LD	BC,5D00H	;BUFFER
 	CALL	READ		;READ SECTOR
 	LD	HL,ERMSGA	;NOT FOUND
 	BIT	4,A
 	JP	NZ,LOKIT
 	LD	HL,ERMSGB
 	BIT	3,A
 	JP	NZ,LOKIT	;CRC ERROR
 	LD	HL,ERMSGC
 	BIT	2,A
 	JP	NZ,LOKIT	;TRANSFER TOO FAST
 	INC	E		;ADVANCE SECTOR
 	LD	A,E
 	CP	0AH		;END OF TRACK ?
 	JP	NZ,VERLP1	;CONTINUE
 VERNO	INC	D		;BUMP TRACK
 	LD	A,D
 	CP	(IY)		;END OF DISK ?
 	JP	NZ,VERLP
 	LD	HL,5C00H	;DIRECTORY SECTOR 0
 	LD	DE,5C60H	;LOCKOUT TABLE
 	LD	A,(IY)		;NUMBER OF TRACKS
 	LD	C,A
 	LD	B,0		;BC = NUMBER OF TRACKS
 	LDIR			;LOCKOUT TABLE=GAT TABLE
 	LD	A,(4202H)	;GET DIRECTORY TRACK
 	CALL	ASCII
 	LD	(DIRTK),BC	;PUT INTO STRING
 	CALL	DISPLY
 	DEFW	0D0DH
 	DEFM	'Writing directory on Track '
 DIRTK	DEFM	'00.'
 	DEFB	0
 	LD	HL,5C00H
 	LD	A,(HL)
 	OR	1
 	LD	(HL),A
 	LD	A,(4202H)
 	LD	(DRTRK),A	;SAVE INTO DIRECTORY
 	LD	L,A
 	LD	H,5CH
 	LD	A,(HL)		;GET LOCKOUT BYTE
 	INC	A		;SEE IF IT'S AVAILABLE
 	JP	Z,DIRERR
 	LD	(HL),0FFH	;LOCKOUT TRACK
 	LD	DE,0
 	LD	BC,4200H	;BOOT
 	LD	A,0A8H		;WRITE BYTE
 	CALL	WRITE		;WRITE SECTOR
 	LD	A,(37ECH)
 	AND	60H
 	JP	NZ,DIRERR
 	LD	BC,5C00H
 	LD	A,(4202H)
 	LD	D,A
 	LD	E,0
 	LD	A,0A9H		;READ PROTECTED
 	CALL	WRITE
 	LD	A,(37ECH)
 	AND	60H
 	CP	20H
 	JP	NZ,DIRERR
 	LD	HL,5D00H
 LP1	LD	(HL),0
 	INC	L
 	JR	NZ,LP1
 	LD	(HL),0A2H
 	INC	HL
 	LD	(HL),2CH	;HIT BYTES
 	DEC	HL
 	LD	E,1
 	LD	BC,5D00H
 	LD	A,0A9H
 	CALL	WRITE
 	LD	A,(37ECH)
 	AND	60H
 	CP	20H
 	JP	NZ,DIRERR
 	LD	DE,5D00H
 	LD	HL,BOOT
 	LD	BC,20H
 	LDIR			;BOOT/SYS DIRECTORY ENTRY
 	LD	A,(4202H)
 	LD	D,A
 	LD	E,2
 	LD	BC,5D00H
 	LD	A,0A9H
 	CALL	WRITE
 	LD	A,(37ECH)
 	AND	60H
 	CP	20H
 	JP	NZ,DIRERR
 	LD	HL,DIR
 	LD	DE,5D00H
 	LD	BC,20H
 	LDIR			;DIR/SYS DIRECTORY ENTRY
 	LD	A,(4202H)
 	LD	D,A
 	LD	E,3
 	LD	BC,5D00H
 	LD	A,0A9H
 	CALL	WRITE
 	LD	A,(37ECH)
 	AND	60H
 	CP	20H
 	JP	NZ,DIRERR
 	LD	HL,5D00H
 	LD	B,20H
 LP2	LD	(HL),0
 	INC	HL
 	DJNZ	LP2
 	LD	A,(4202H)
 	LD	D,A
 	LD	E,4
 LP3	LD	BC,5D00H
 	LD	A,0A9H
 	CALL	WRITE
 	LD	A,(37ECH)
 	AND	60H
 	CP	20H
 	JP	NZ,DIRERR
 	INC	E
 	LD	A,E
 	CP	0AH		;END OF TRACK ?
 	JR	NZ,LP3
 	CALL	RESTOR		;RESTORE DRIVE
 	RET			;DONE WITH FORMAT
 RESTOR	CALL	SELECT		;SELECT DRIVE
 	LD	A,0BH
 	LD	(37ECH),A
 	PUSH	AF
 	POP	AF
 	PUSH	AF
 	POP	AF
 RESLP	CALL	SELECT
 	LD	A,(37ECH)
 	RRCA
 	JR	C,RESLP
 	RET			;DONE WITH RESTORE
 DIRERR	CALL	DISPLY
 	DEFW	0D0DH
 	DEFM	'Can'
 	DEFB	27H
 	DEFM	't initialize SYSTEM information !'
 	DEFB	0
 	JP	ERRORD		;TERMINATE
 ERMSGA	DEFM	'   Not found, TRACK LOCKED OUT !'
 	DEFB	0DH
 	DEFB	0
 	POP	DE
 	JP	VERNO
 ERMSGB	DEFM	'   CRC error, TRACK LOCKED OUT !'
 	DEFB	0DH
 	DEFB	0
 	POP	DE
 	JP	VERNO
 ERMSGC	DEFM	'   Can'
 	DEFB	27H
 	DEFM	't verify, TRACK LOCKED OUT !'
 	DEFB	0DH
 	DEFB	0
 	POP	DE
 	JP	VERNO
 LOKIT	PUSH	DE
 	PUSH	HL
 	LD	L,D
 	LD	H,5CH
 	LD	(HL),0FFH	;LOCK IT OUT
 	JP	DISPLY		;CONTINUE
 ;  ORDER THAT SECTORS APPEAR ON TRACK
 ORDER	DEFB	0
 	DEFB	5
 	DEFB	1
 	DEFB	6
 	DEFB	2
 	DEFB	7
 	DEFB	3
 	DEFB	8
 	DEFB	4
 	DEFB	9
 	DEFB	0FFH		;TERMINATOR
 ;  32 BYTE DIRECTORY ENTRY FOR BOOT
 BOOT	DEFB	5EH
 	DEFW	0
 	DEFW	0
 	DEFB	42H
 	DEFB	4FH
 	DEFB	4FH
 	DEFB	54H
 	DEFW	2020H
 	DEFW	2020H
 	DEFB	53H
 	DEFB	59H
 	DEFB	53H
 	DEFB	60H
 	DEFB	7FH
 	DEFB	1FH
 	DEFB	0B2H
 	DEFB	5
 	DEFW	0
 	DEFB	0
 	DEFW	0FFFFH
 	DEFW	0
 	DEFW	0
 	DEFW	0
 ;  DIR/SYS DIRECTORY ENTRY 32 BYTES
 DIR	DEFB	5DH
 	DEFW	0
 	DEFW	0
 	DEFB	44H
 	DEFB	49H
 	DEFB	52H
 	DEFW	2020H
 	DEFW	2020H
 	DEFB	20H
 	DEFB	53H
 	DEFB	59H
 	DEFB	53H
 	DEFB	0A7H
 	DEFB	1DH
 	DEFB	0F9H
 	DEFB	0E5H
 	DEFB	0AH
 	DEFB	0
 DRTRK	DEFB	11H		;DIRECTORY TRACK
 	DEFB	01
 	DEFW	0FFFFH
 	DEFW	0
 	DEFW	0
 	DEFW	0
 FILLFF	LD	C,0FFH
 FILL	CALL	FILL1
 	DJNZ	FILL
 	RET
 FILL1	LD	(HL),C
 	INC	HL
 	RET
 WRITE	CALL	WRITE1
 	JR	NZ,BADA
 	PUSH	BC
 	LD	BC,5D00H
 	CALL	READ
 	POP	BC
 	RET	Z		;GOOD VERIFY
 BADA	CALL	DISPLY
 	DEFB	0DH
 	DEFM	'Can'
 	DEFB	27H
 	DEFM	't initialize system information, DIRECTORY TRACK FLAWED !'
 	DEFB	0DH
 	DEFB	0
 	JP	ERRORD		;TERMINATE
 WRITE1	LD	(WRTYPE),A	;WRITE TYPE
 	PUSH	BC
 	CALL	WRITE2
 	POP	HL
 	RET	Z
 	LD	B,H
 	LD	C,L
 WRITE2	LD	(37EEH),DE	;TRACK/SECTOR
 	PUSH	DE
 	CALL	SELECT
 	LD	HL,37ECH
 	LD	(HL),1BH	;SEEK COMMAND
 	PUSH	AF
 	POP	AF
 	PUSH	AF
 	POP	AF
 SKWT	CALL	SELECT
 	LD	A,(HL)
 	RRCA
 	JR	C,SKWT
 	DEFB	36H		;LD (HL),X OPCODE
 WRTYPE	DEFB	0A8H
 	LD	DE,37EFH
 	PUSH	BC
 	POP	BC
 	PUSH	BC
 	POP	BC
 	NOP
 	JR	WRBZ
 BZWR	RRCA
 	JR	NC,WRDN
 WRBZ	LD	A,(HL)
 	BIT	1,A
 	JR	Z,BZWR
 	LD	A,(BC)
 	LD	(DE),A
 	INC	BC
 	JP	WRBZ
 WRDN	LD	A,(HL)
 	AND	7CH
 	POP	DE
 	RET	Z
 	LD	(HL),0D0H
 	RET			;DONE WITH WRITE
 READ	PUSH	BC		;SAVE LOAD ADDRESS
 	CALL	R2
 	POP	HL
 	RET	Z
 	LD	B,H
 	LD	C,L
 R2	LD	(37EEH),DE
 	LD	HL,37ECH
 	LD	(HL),1BH
 	PUSH	AF
 	POP	AF
 	PUSH	AF
 	POP	AF
 R1	CALL	SELECT
 	LD	A,(HL)
 	RRCA
 	JR	C,R1
 	LD	(HL),88H
 	PUSH	DE
 	LD	DE,37EFH
 	PUSH	BC
 	POP	BC
 	JR	R5
 R3	RRCA
 	JR	NC,R6
 R4	LD	A,(HL)
 	BIT	1,A
 	JR	Z,R3
 	LD	A,(DE)
 	LD	(BC),A
 	INC	BC
 R5	JR	R4
 R6	LD	A,(HL)
 	AND	1CH
 	POP	DE
 	RET	Z
 	LD	(HL),0D0H
 	RET
 FIXGAT	EXX
 	LD	HL,BUFF
 	LD	DE,5C00H
 	LD	BC,100H
 	LDIR
 	RET
 SETGAT	LD	HL,5C00H
 	LD	DE,BUFF
 	LD	BC,100H
 	LDIR
 	RET
 RSTART	CALL	DISPLY
 	DEFW	0D0DH
 	DEFM	'<S>ame parameters, or <N>ew ones ? '
 	DEFB	0
 	LD	B,1
 	CALL	GETSTR
 	CP	'N'
 	JP	Z,ENTRY
 	CP	'S'
 	JR	NZ,RSTART
 	LD	IX,ONES
 	CALL	DISPLY
 	DEFW	0D0DH
 	DEFM	'Press <ENTER> when disks are mounted ! '
 	DEFB	0
 	LD	B,1
 	CALL	GETSTR
 	CALL	STATCK		;CHECK STATUS NEW DISKS
 	LD	IX,ONES		;RESET POINTER
 	JP	GOMORE
 STRING	DEFS	80H		;INPUT BUFFER
 BUFF	DEFS	100H		;GAT TABLE BUFFER
 O5CCB	DEFB	21H
 	DEFW	0
 	DEFW	0
 	DEFW	2020H
 	DEFW	2020H
 	DEFW	2020H
 	DEFW	2020H
 	DEFW	4D4DH
 	DEFB	2FH
 	DEFW	4444H
 	DEFB	2FH
 	DEFW	5959H
 	DEFB	0DH
 	DEFW	0
 	DEFW	0
 	DEFW	0
 	DEFW	0
 	DEFW	0
 	DEFW	0
 	DEFW	0
 	DEFW	0
 	DEFW	0
 	DEFW	0
 	DEFW	0
 	DEFW	0
 	DEFW	0
 	DEFW	0
 	ORG	7F00H
 	NOP
 	CP	0
 	DI
 	LD	SP,41FCH
 	LD	HL,42E2H
 	CALL	429AH
 	LD	A,1
 	LD	(37E1H),A
 	LD	A,(4202H)
 	LD	D,A
 	LD	E,4
 	LD	BC,4D00H
 	CALL	42AAH
 	JR	NZ,7F90H
 	LD	A,(4D00H)
 	AND	10H
 	LD	HL,42E5H
 	JR	Z,7F93H
 	EXX
 	LD	HL,(4D16H)
 	LD	D,L
 	LD	A,H
 	RLCA
 	RLCA
 	RLCA
 	AND	07H
 	LD	H,A
 	RLCA
 	RLCA
 	ADD	A,H
 	LD	E,A
 	LD	BC,4DFFH
 	EXX
 	CALL	4275H
 	DEC	A
 	JR	NZ,7F5BH
 	CALL	4275H
 	LD	B,A
 	CALL	4275H
 	LD	L,A
 	DEC	B
 	CALL	4275H
 	LD	H,A
 	DEC	B
 	JR	Z,7F3EH
 	CALL	4275H
 	LD	(HL),A
 	INC	HL
 	JR	7F51H
 	DEC	A
 	JR	Z,7F69H
 	CALL	4275H
 	LD	B,A
 	CALL	4275H
 	DJNZ	7F62H
 	JR	7F3EH
 	CALL	4275H
 	CALL	4275H
 	LD	L,A
 	CALL	4275H
 	LD	H,A
 	JP	(HL)
 	EXX
 	INC	C
 	JR	NZ,7F8DH
 	PUSH	BC
 	LD	A,1
 	LD	(37E1H),A
 	CALL	42AAH
 	JR	NZ,7F90H
 	POP	BC
 	INC	E
 	LD	A,E
 	SUB	0AH
 	JR	NZ,7F8DH
 	LD	E,A
 	INC	D
 	LD	A,(BC)
 	EXX
 	RET
 	LD	HL,42F1H
 	CALL	429AH
 	CALL	40H
 	HALT
 	PUSH	HL
 	LD	A,(HL)
 	CP	3
 	JR	Z,7FA8H
 	CALL	33H
 	INC	HL
 	CP	0DH
 	JR	NZ,7F9BH
 	POP	HL
 	RET
 	PUSH	BC
 	CALL	42B2H
 	POP	HL
 	RET	Z
 	LD	B,H
 	LD	C,L
 	LD	(37EEH),DE
 	LD	HL,37ECH
 	LD	(HL),1BH
 	PUSH	AF
 	POP	AF
 	PUSH	AF
 	POP	AF
 	LD	A,(HL)
 	RRCA
 	JR	C,7FBFH
 	LD	(HL),88H
 	PUSH	DE
 	LD	DE,37EFH
 	PUSH	BC
 	POP	BC
 	JR	7FD8H
 	RRCA
 	JR	NC,7FDAH
 	LD	A,(HL)
 	BIT	1,A
 	JR	Z,7FCDH
 	LD	A,(DE)
 	LD	(BC),A
 	INC	BC
 	JR	7FD0H
 	LD	A,(HL)
 	AND	5CH
 	POP	DE
 	RET	Z
 	LD	(HL),0D0H
 	RET
 	DEFW	1F1CH
 	DEFB	3
 	DEFB	17H
 	DEFB	0E8H
 	DEFM	'NO SYSTEM'
 	DEFB	0DH
 	DEFB	17H
 	DEFB	0E8H
 	DEFM	'DISK ERROR'
 	DEFB	0DH
 	DEFB	0EBH
 	DEFB	5FH	;?
 	END	ENTRY
D	(HL),0D0H
 	RET
 	DEFW	1F1CH
 	DEFB	3
 	DEFB	17H
 	DEFB	0E8H
 	DEFM	'NO SYSTEM'
 	DEFB	0DH
 	DEFB	17H
 	DEFB	0E8H
