;4-15-77;DISK FORMAT PROGRAM TO WORK WITH THE FDC-3 DISK CONTROLLER;FORMATS DISKETTES TO WORK WITH VERSION 4.1 OF THE;CP/M OPERATING SYSTEM.  EITHER SINGLE OR DOUBLE DENSITY CAN;BE FORMATTED.  IF DOUBLE DENSITY IS SPECIFIED, TRACK 0 IS ;IN SINGLE DENSITY AND THE REST ARE DOUBLE.;;SINCE THE FDC-3 IS USED WITH BOTH S100 AND ;DSC-2 COMPUTER SYSTEMS, THE ASSEMBLY TIME SWITCH DSC2;MUST BE SET CORRECTLYTRUE	EQU	0FFFFHFALSE	EQU	NOT TRUE;DSC2	EQU	TRUE	;THIS SHOULD BE SET TO FALSE FOR S100 SYSTEMS;;DEFINE DISK PORTS;	IF DSC2I127	EQU	80HI126	EQU	81HI125	EQU	82HI124	EQU	83H	ENDIF;	IF NOT DSC2I127	EQU	7FHI126	EQU	7EHI125	EQU	7DHI124	EQU	7CH	ENDIF;;PORT	EQU	4AHDENSITY	EQU	4CH;	ORG 100H	LXI	SP,2000HMONITOR	EQU	0005H;FIGURE WHERE THE CBIOS JUMP TABLE IS FOR THIS SYSTEM	LHLD	1	MVI	L,0	SHLD	JUMPTAB;;INITIALIZE DISKETTES;;SET UP DATA BUFFER OF E5	LXI	H,WRITEBUF	MVI	B,128DL0:	MVI	M,0E5H	INX	H	DCR	B	JNZ	L0;CHANGE ERROR LOCATION IN CBIOS TO THIS PROGRAM	LHLD	JUMPTAB	LXI	D,2EH	DAD	D	LXI	D,ERR	MOV	A,M	;SAVE OLD ERROR LOCATION	STA	OLDL	MOV	M,E	INX	H	MOV	A,M	STA	OLDH	MOV	M,D;SAVE OLD STATE OF DISK SELECT AND DENSITY	LDA	PORT	STA	SAVEPORT	LDA	DENSITY	STA	SAVEDENS	MVI	C,9	;PRINT LOGON MESSAGE	LXI	D,MESS0	CALL	MONITORAGAIN:;PRINT MESSAGE TO SELECT INITIALIZE ROM	MVI	C,9D	;MONITOR CALL TO PRINT BUFFER	LXI	D,MESS1	CALL	MONITOR;WAIT FOR ANSWER	MVI	C,01	CALL	MONITOR;CHECK FOR NO	CPI	'N'	JZ	DONE	CPI	06EH	JZ	DONE;NOW SELECT THE CORRECT DIRVE     8 ARE POSSIBLE	DCR	A	ANI	07H	MOV	C,A;PUT INTO MESSAGE	ORI	40H	INR	A	STA	DRV	CALL	SELDISKOK:;START WITH TRACK 0	XRA	A	STA	TRK	MVI	C,9D	;PRINT BUFFER CALL	LXI	D,MESS3	;PROMPT TO SELECT DENSITY	CALL	MONITOR;WAIT FOR RESPONSE	MVI	C,01	CALL	MONITOR	CPI	'S'	JZ	FILL0	CPI	'D'	JNZ	OK	;DO NOT ASSUME ANYTHINGFILL0:;SET UP SINGLE DENSITY	STA	DENS;SET UP DENSITY SELECTS IN LOW MEMORY 	XRA	A	STA	DENSITY		;DENSITY	LDA	PORT	ANI	0F7H	STA	PORT;SET UP PROPER ADDRESS MARKS FOR INITIALIZING	MVI	A,0FEH	STA	ID	MVI	A,0FCH	STA	INDEXAM	MVI	A,0C0H	STA	FINISH	;TRACK FINISHED	MVI	A,0E0H	STA	ECODE;SET UP CORRECT TABLE FOR USE IN WRITING THE E5 DATA PATTERN	LXI	H,SINTAB	SHLD	E5TABLE;SET UP CORRECT TABLE FOR WRITING THE ID FIELDS	LXI	B,SINTAB	MVI	A,26D	CALL	FILL	JMP	OK8FILL:	STA	SECTORS;NOW MAKE A IMAGE OF THE TRACK	LXI	H,BUFFER	PUSH	B	MOV	C,A	;NUMBER OF SECTORSLOOP:	MVI	B,6	;6 BYTES PER SECTOR	LXI	D,IDLOOP1:	LDAX	D	MOV	M,A	INX	H	INX	D	DCR	B	JNZ	LOOP1	DCR	C	JNZ	LOOP;NOW BUFFER +3 AND EVERY 6 BYTES ARE SECTOR #;FILL IN SECTOR NUMBERS	POP	B	;ADDRESS OF TABLE OF SECTOR NUMBERS	CALL	FILSECT	JMP	FINCODEFILSECT:	LXI	H,BUFFER+3	LXI	D,6LOOP3:	LDAX	B	CPI	0FFH	RZ	MOV	M,A	INX	B	DAD	D	JMP	LOOP3;NOW PUT FINNISH CODE AT THE LAST WORDFINCODE:	DCX	H	DCX	H	DCX	H	DCX	H	LDA	FINISH	MOV	M,A	RETOK8:;PRINT MESSAGE TO PUT IN CORRECT DISKETTE	LXI	D,MESS2	MVI	C,9	CALL	MONITOR	MVI	C,1	;WAIT FOR REPLY	CALL	MONITOR;ENABLE FORMATTING	LDA	PORT	ANI	0BFH	XRI	40H	STA	PORT;HOME THE DISK	LHLD	JUMPTAB	LXI	D,18H	DAD	D	CALL	SYST;NOW GO AHEAD AND INITIALIZE;INIT:;SET UP TRACK EROR COUNTER	XRA 	A	STA	ERRORS;;INITIAL:;DELAY 200 MILLISEC	LXI	B,8000HL6:	DCR	C	JNZ	L6	DCR	B	JNZ	L6;HERE WE GO - TURN MICROCODE ON;	LXI	H,INDEXAM	MOV	A,H;	IF NOT DSC2	CMA	ENDIF;	OUT	I126	;SET DMA ADDRESS OM FCD	MOV	A,L;	IF NOT DSC2	CMA	ENDIF;	OUT	I125	;POINTS TO INDEX AM	MVI	A,0A0H	;SELECT INITIALIZATION CODE AND WRITE DATA;	IF NOT DSC2	CMA	ENDIF;	OUT	I127WW:	IN	I127	ANI	88H	;WAIT FOR IO FINISH	JZ	WW	IN	I127	;CHECK FOR ERROR	ANI	0F0H	JZ	FILTRK	LXI	D,FORMATERR	JMP	ERR1;;INCREMENT TRACK, STEP;FILTRK:;NOW WRITE THA DATA PATTERN OF E5 IN EACH SECTOR	LXI	B,WRITEBUF	CALL	SETDMA;THIS IS TABLE DRIVEN TO SPEED IT UP;USE SINTAB FOR SD TRACKS;USE TABLE4 FOR DD TRACKS	LHLD	E5TABLEF6:	PUSH	H	MOV	C,M	CALL	SETSEC	CALL	WRITE	POP	H	INX	H	MVI	A,0FFH	CMP	M	JNZ	F6	;MORE SECTORS TO GONEXTRK:	LDA	TRK	INR	A	STA	TRK	CPI	1	JZ	CHECKDENS	CPI	2	JZ	NEWSECT	CPI	77	JNZ	DOSTP	JMP	AGAIN	;DO ANOTHERCHECKDENS:	LDA	DENS	CPI	'D'	JNZ	DOSTP;TIME TO CHANGE DENSTIY	LDA	PORT	ANI	0F7H	ORI	08H	STA	PORT	MVI	A,0FFH	STA	DENSITY	MVI	A,0EH	STA	ID	;ID ADDRESS MARK	MVI	A,0CH	STA	INDEXAM	XRA	A	STA	FINISH	INR	A	STA	ECODE	;SECTOOR FINISH CODE	LXI	H,TABLE4	SHLD	E5TABLE	LXI	B,DOBTAB	MVI	A,58D	;NUMBER OF SECTORS	CALL	FILL	JMP	DOSTPNEWSECT:;FOR OPTIMAL CPPM ACCESS, THE CPM TRACKS MUST BE INITIALIZED;DIFFERENTLY	LDA	SECTORS	CPI	26D	JZ	DOSTP	;ONLY NECESSARY FOR DD;FOR DD THE LOGIACAL SECTORS ARE EVERY 13TH PHYSICAL SECTOR	LXI	B,TABLE2	CALL	FILSECTDOSTP:;FIGURE ADDRESS OF SEEK	LHLD	JUMPTAB	LXI	D,01EH	DAD	D	LDA	TRK	MOV	C,A	;SEND PARAMETER IN C	CALL	SYST;FILL IN NEW TRACK BYTES	LXI	H,BUFFER+1	LXI	D,006	LDA	SECTORS	MOV	C,A	LDA	TRKLOOP5:	MOV	M,A	DAD	D	DCR	C	JNZ	LOOP5	JMP	INITDONE:	LXI	D,MESS4	MVI	C,09	CALL	MONITOR	MVI	C,01	CALL	MONITOR	JMP	REBOOTSELDISK:	LXI	D,01BH	LHLD	JUMPTAB	DAD	D	JMP	SYSTSETDMA:	LXI	D,24H	LHLD JUMPTAB	DAD	D	JMP	SYSTSETSEC:	LXI	D,21H	LHLD	JUMPTAB	DAD	D	JMP	SYSTWRITE:	LXI	D,2AH	LHLD	JUMPTAB	DAD	D	JMP	SYSTERR:	POP	H	;GET RID OF STACK RETURN	LXI	D,WRITERRERR1:	MVI	C,9	CALL	MONITOR	LDA	ERRORS	INR	A	CPI	10	STA	ERRORS	JNZ	INITIAL	LXI	D,GIVEUP	MVI	C,9	CALL	MONITORREBOOT:;RESTORE CBIOS JUMP TO ERROR RECOVERY	LHLD	JUMPTAB	LXI	D,2EH	DAD	D	LDA	OLDL	MOV	M,A	INX	H	LDA	OLDH	MOV	M,AWARMBT:; FIND OLD PORT INFO AND DISABLE FORMATTING	LDA	SAVEPORT	STA	PORT;RESTORE DENSITY 	LDA	SAVEDENS	STA	DENSITY	JMP	0000SYST:	PCHL	;GO TO CBIOSOLDL:	DB	0OLDH:	DB	0DENS:	DB	0SAVEPORT: DB	0SAVEDENS: DB	0JUMPTAB:	DW	0000E5TABLE:	DW	0000ERRORS:	DB	0SECTORS:	DB	0ID:	DB	0TRK:	DB	0	DB	0SECT:	DB	0	DB	0ECODE:	DB	01FINISH:	DB	0MESS0:	DW	0D0AH	IF DSC2	DB	'DISKETTE FORMAT PROGRAM VERSION DSC4.1$'	ENDIF;	IF NOT DSC2	DB	'DISKETTE FORMAT PROGRAM VERSION 4.1$'	ENDIF;MESS1:	DW	0D0AH	DB	'WHICH DRIVE DO YOU WANT TO FORMAT? $'MESS2:	DW	0D0AH	DB	'PUT DISKETTE TO BE INITIALIZED IN DRIVE  'DRV:	DB	0	DB	'$'MESS3:	DW	0D0AH	DB	'SINGLE OR DOUBLE DENSITY $'MESS4:	DW	0D0AH	DB	'REBOOTING $'FORMATERR:DW 0D0AH	DB	'HAVING TROUBLE FORMATING $'WRITERR:DW	0D0AH	DB	'HAVING TROUBLE WRITING $'GIVEUP: DW	0D0AH	DB	'CAN NOT DO IT $'SINTAB:	DB	1,2,3,4	DB	5,6,7,8	DB	9,10,11,12	DB	13,14,15,16	DB	17,18,19,20	DB	21,22,23,24	DB	25,26	DB	0FFHDOBTAB:	DB	1,30,2,31	DB	3,32,4,33	DB	5,34,6,35	DB	7,36,8,37	DB	9,38,10,39	DB	11,40,12,41	DB	13,42,14,43	DB	15,44,16,45	DB	17,46,18,47	DB	19,48,20,49	DB	21,50,22,51	DB	23,52,24,53	DB	25,54,26,55	DB	27,56,28,57	DB	29,58	DB	0FFHTABLE2: DB	1,10,19,28	DB	37,46,55,6	DB	15,24,33,42	DB	51,2,11,20	DB	29,38,47,56	DB	7,16,25,34	DB	43,52,3,12	DB	21,30,39,48	DB	57,8,17,26	DB	35,44,53,4	DB	13,22,31,40	DB	49,58,9,18	DB	27,36,45,54	DB	5,14,23,32	DB	41,50	DB	0FFHTABLE4: DB	1,19,37,55	DB	15,33,51,11	DB	29,47,7,25	DB	43,3,21,39	DB	57,17,35,53	DB	13,31,49,9	DB	27,45,5,23	DB	41,10,28,46	DB	6,24,42,2	DB	20,38,56,16	DB	34,52,12,30	DB	48,8,26,44	DB	4,22,40,58	DB	18,36,54,14	DB	32,50	DB	0FFHWRITEBUF: DS 128DINDEXAM:	DB	0BUFFER:	DS	360D	END