.IDENT	FORMAT
;
	.LOC	100H
;
START:	IN	20H
	ANI	10H
	JNZ	XXC
	CALL	CRLF
	LXI	D,ERRTXT
	CALL	STROUT
	CALL	CRLF
	JMP	0
;
DECIN:	CALL	STROUT
	PUSH	D
	MVI	C,10
	LXI	D,80H
	MVI	A,2
	STAX	D
	CALL	5
	LXI	H,81H
	MOV	A,M
	ANA	A
	JNZ	..DEC1
..DEC2:	MVI	C,2
	MVI	E,7
	CALL	5
	POP	D
	JMP	DECIN
..DEC1:	MVI	C,0
	CPI	1
	JZ	..DEC
	INX	H
	MOV	A,M
	CPI	30H
	JC	..DEC2
	CPI	3AH
	JNC	..DEC2
	ANI	0FH
	ADD	A
	MOV	C,A
	ADD	A
	ADD	A
	ADD	C
	MOV	C,A
..DEC:	INX	H
	MOV	A,M
	CPI	30H
	JC	..DEC2
	CPI	3AH
	JNC	..DEC2
	ANI	0FH
	ADD	C
	POP	D
	RET
;
CRLF:	PUSH	H
	PUSH	D
	PUSH	B
	PUSH	PSW
	MVI	C,2
	MVI	E,0DH
	CALL	5
	MVI	C,2
	MVI	E,0AH
	CALL	5
	POP	PSW
	POP	B
	POP	D
	POP	H
	RET
;
STROUT:	PUSH	PSW
	PUSH	B
	PUSH	D
	PUSH	H
	MVI	C,9
	CALL	5
	POP	H
	POP	D
	POP	B
	POP	PSW
	RET
;
XXC:	MVI	A,50
	STA	GAPLEN
	MVI	A,80
	STA	TRACKS
	MVI	A,3
	STA	SECSIZ
	MVI	A,5
	STA	SPTRAK
	MVI	A,1
	STA	SIDES
	MVI	A,1
	STA	DENS
	LDA	80H
	ANA	A
	JZ	..C11	; LAUFWERKSANGABE FEHLT!
	MOV	C,A
	LXI	H,81H
	MOV	A,M
	CPI	20H	; BLANK VORHANDEN?
	JZ	..C1	; WENN JA, OK
	CALL	CRLF	; SONST FEHLERMELDUNG AUSGEBEN
	LXI	D,INVNAM
	CALL	STROUT
	CALL	CRLF
	JMP	0
..C1:	DCR	C
	JZ	..C11
	INX	H
	MOV	A,M
	CPI	41H
	JNC	..C2
..C11:	CALL	CRLF	; WENN DRIVE-ANGABE NICHT A ODER B IST, FEHLERMELDUNG
	LXI	D,INVDRV
	CALL	STROUT
	CALL	CRLF
	JMP	0
..C2:	CPI	43H
	JNC	..C11
	ANI	0FH
	DCR	A
	STA	DRIVE
	DCR	C
	JZ	..C11
	INX	H
	MOV	A,M
	CPI	3AH
	JNZ	..C11	; WENN DOPPELPUNKT FEHLT, FEHLERMELDUNG
	DCR	C
	JZ	..K1
	INX	H
	MOV	A,M
	CPI	3BH
	JZ	..C12
	CALL	CRLF
..C13:	LXI	D,INVOPT	; UNG]LTIGE OPTIONEN
	CALL	STROUT
	CALL	CRLF
	JMP	0
..C12:	DCR	C
	JZ	..C13
	INX	H
	MOV	A,M
	CPI	59H
	JNZ	..C13
	DCR	C
	JNZ	..C13
..L:	CALL	CRLF
	LXI	D,SPCTXT	; EINGABE SPEZIFIKATIONEN
	CALL	STROUT
	CALL	CRLF
	CALL	CRLF
	CALL	CRLF
..C14:	LXI	D,DENTXT	; DENSITY EINGEBEN
	CALL	DECIN
	MOV	C,A
	ANI	0FEH
	ANA	A
	JZ	..F
	MVI	C,2
	MVI	E,7
	JMP	..C14
..F:	MOV	A,C
	ANI	1
	STA	DENS
..C15:	CALL	CRLF
	CALL	CRLF
	LXI	D,TRKTXT	; TRACKDICHTE EINGEBEN
	CALL	DECIN
	MOV	C,A
	ANI	0FEH
	JZ	..G
	MVI	C,2
	MVI	E,7
	CALL	5
	CALL	CRLF
	JMP	..C15
..G:	MVI	A,40
	DCR	C
	JM	..G1
	MVI	A,80
..G1:	STA	TRACKS
..C18:	CALL	CRLF
	CALL	CRLF
	LXI	D,SIDTXT	; SINGLE- ODER DOUBLE-SIDED
	CALL	DECIN
	MOV	C,A
	ANI	0FEH
	JZ	..J
	MVI	C,2
	MVI	E,7
	CALL	5
	CALL	CRLF
	JMP	..C18
..J:	MOV	A,C
	STA	SIDES 
..C16:	CALL	CRLF
	CALL	CRLF
	LXI	D,SECTXT	; SEKTORGR\SSE EINGEBEN
	CALL	DECIN
	MOV	C,A
	ANI	0FCH
	JZ	..H
	MVI	C,2
	MVI	E,7
	CALL	5
	CALL	CRLF
	JMP	..C16
..H:	MOV	A,C
	ANI	3
	STA	SECSIZ
	CALL	CRLF
	CALL	CRLF
	LXI	D,SECTRK	; SEKTOREN PRO SPUR
	CALL	DECIN
	STA	SPTRAK
	CALL	CRLF
	CALL	CRLF
	LXI	D,GAPTXT	; GAP-L[NGE
	CALL	DECIN
	STA	GAPLEN
	CALL	CRLF
..E:	CALL	CRLF
	LXI	D,OKTXT	; OK ZUM FORMATIEREN?
	CALL	DECIN
	CPI	1
	JNZ	..L
	CALL	CRLF
..K1:	CALL	CRLF
..K:	MVI	C,26
	LDA	DRIVE
	MOV	E,A
	MVI	D,80H
	CALL	50H	; FLUSH/FREE BUFFERS
	LXI	D,CHGTXT	; CHANGE DISK
	CALL	STROUT
	LDA	DRIVE
	INR	A
	ORI	40H
	MOV	E,A
	MVI	C,2
	CALL	5
	CALL	CRLF
	LXI	D,CHGTX1
	CALL	STROUT
..C17:	MVI	C,3
	CALL	5
	CPI	0DH
	JZ	..I
	CPI	3
	JZ	0
	MVI	C,2
	MVI	E,7
	CALL	5
	JMP	..C17
..I:	CALL	CRLF
	CALL	CRLF
	LXI	D,FRMTXT
	CALL	STROUT
	CALL	CRLF
	MVI	E,1	; PRESET SECTOR NUMBER =1
	MVI	D,0	; PRESET HEAD NUMBER =0
	LXI	H,0
	SHLD	PDR+2	; START WITH TRACK 0
..B:	MVI	A,4	; PDR OPCODE =FORMAT
	STA	PDR
	LDA	DRIVE
	STA	PDR+1	; SELECT DRIVE B
	LDA	GAPLEN
	MOV	H,A
	LDA	SECSIZ
	MOV	L,A
	MOV	A,D	; GET HEAD INFORMATION
	ANI	80H
	ORA	H
	MOV	H,A	; SET/RESET HEAD NUMBER ONE FLAG
	LDA	DENS
	RRC
	ORA	L
	MOV	L,A	; SET/RESET DOUBLE-DENSITY FLAG
	SHLD	PDR+4
	LDA	SPTRAK
	MOV	L,A
	MVI	H,0
	SHLD	PDR+6	; SET SECTORS/TRACK
	DAD	H
	DAD	H
	SHLD	PDR+8	; TOTAL OF BYTES TO TRANSFER
	LXI	H,BUFFER   ; SET DMA ADDRESS
	SHLD	PDR+10
	LXI	H,DST
	SHLD	PDR+12
    	LHLD	PDR+10	; GET DMA ADDRESS
	LDA	PDR+6	; GET NUMBER OF SECTORS/TRACK
	MOV	B,A
	CALL	SETUP	; SET UP CHRN-TABLE
	PUSH	D
	LXI	D,PDR	; GET PDR TABLE ADDRESS
	MVI	C,22
	CALL	50H
	MVI	C,6
	MVI	E,0FFH
	CALL	5
	ANA	A
	JZ	..M
	CPI	3
	JNZ	..M
	POP	D
	LXI	D,ABBTXT
	CALL	CRLF
	CALL	STROUT
	CALL	CRLF
	JMP	0	
..M:	POP	D
	LDA	SIDES
	ANA	A
	JZ	..ONE
	MOV	A,D
	XRI	0FFH
	MOV	D,A
	JNZ	..B
..ONE:	PUSH	D
	MVI	C,2
	MVI	E,2EH
	CALL	5
	POP	D
	LHLD	PDR+2
	INX	H
	SHLD	PDR+2
	LDA	TRACKS	; GET MAX NUMBER OF TRACKS
	MOV	C,A
	MVI	B,0
	DSBC	B
	JNZ	..B
	CALL	CRLF
	LXI	D,NEWTXT
	CALL	DECIN
	CPI	1
	JZ	..K1
	CALL	CRLF
	JMP	0

ERRTXT:	.BYTE	0DH,0AH
	.ASCII	'Programm nicht auf Master ausgef}hrt '
	.BYTE	0DH,0AH,0AH,24H

; ********************************************************************

SETUP:	MVI	E,1
..A:	LDA	PDR+2
	MOV	M,A
	INX	H
	MOV	A,D
	ANI	1
	MOV	M,A
	INX	H
	MOV	M,E
	INX	H
	LDA	PDR+4
	ANI	3
	MOV	M,A
	INX	H
	INR	E
	DJNZ	..A
	RET


GAPLEN:	.BYTE	0
TRACKS:	.BYTE	0
SECSIZ:	.BYTE	0
SPTRAK:	.BYTE	0
SIDES:	.BYTE	0
DENS:	.BYTE	0
DRIVE:	.BYTE	0
INVNAM:	.ASCII	'Ung}ltiger Befehl $'
INVDRV:	.ASCII	'Ung}ltige Laufwerksangabe $'
INVOPT:	.ASCII	'Ung}ltige Option $'
SPCTXT:	.BYTE	0DH,0AH
	.ASCII	'Bitte geben Sie nun die FORMAT-Spezifikationen ein:'
	.BYTE	0DH,0AH,24H
DENTXT:	.ASCII	'Schreibdichte       (einfache S. = 0 , doppelte S.  = 1): $'
TRKTXT:	.ASCII	'Spurdichte          (einfache S. = 0 , doppelte S.  = 1): $'
SIDTXT:	.ASCII	'Formatierung        (einseitig   = 0 , doppelseitig = 1): $'
SECTXT:	.ASCII	'Sektorgr|~e (Bytes) ( 0=128,   1=256,   2=512,   3=1024): $'
SECTRK:	.ASCII	'Anzahl der Sektoren pro Spur                            : $'
GAPTXT:	.ASCII	'Gap-L{nge (Standard = 50)                               : $'
OKTXT:	.ASCII	'Sind diese Angaben korrekt (Ja=1, Nein=0)               ? $'
CHGTXT:	.ASCII	'Bitte die zu formatierende Diskette in Laufwerk $'
CHGTX1:	.ASCII	'einlegen und Formatieren mit <RETURN> starten $'
FRMTXT:	.ASCII	'Formatiervorgang l{uft $'
ABBTXT:	.ASCII	'Formatieren vorzeitig abgebrochen $'
NEWTXT:	.ASCII	'Formatieren beendet. '
	.BYTE	0DH,0AH
	.ASCII	'Sollen noch weitere Disketten formatiert werden (Ja=1, Nein=0)? $'
PDR:	.BLKB	16
DST:	.BLKB	16
BUFFER:	.BLKB	1024
.END
