;FM80.Z80		TRiPsoft 02/04/88
;
;Amstrad CPM+ formatter for 80 track DS DD Drive B:
;Needs BDISK.COM to patch XDPB for use after formatting
;
;Note: EMS file must be patched using one of the routines
;BPAT.SUB or BCPAT.SUB prior to using this formatter.
;
;Feel free to use this programme for non-commercial application
;no responsability is accepted for any loss arising from the use
;of this programme or any of the accompanying patches.
;
;	Version 1.01
;
;.... table of equates
;
COLDST	EQU	0
BDOS	EQU	5
BVAL	EQU	04007H
COMMON	EQU	0C000H
PORT1	EQU	0FA7EH
PORT2	EQU 	0FB7FH
DLMON	EQU	00A4H

CR	EQU	0DH
LF	EQU	0AH
BELL	EQU	07H

	ORG	0100H

START:
	JP	BEGIN
	DEFB	'TRiPsoft 020488.$'
BEGIN:
	LD	DE,CLSMSG		;clear screen
	CALL	PSTRNG
DOIT:	LD	A,0
	LD	(TRK),A			;zero track no
	LD	DE,INMSG		;signon
	CALL	PSTRNG
	CALL	GETKEY			;get a keypress
	CALL	MOTON			;turn motor on
	DI
	LD	BC,PORT1
	LD	A,01H
	OUT	(C),A
	INC	B
	INC	C
	LD	HL,0000H
LOOP2:
	INC	HL
	LD	A,H
	OR	L
	JR	NZ,LOOP2
	LD	E,020H	
	CALL	CHKDRV
	LD	E,040H
	CALL	CHKDRV
	CALL	SUBR1
	XOR	A
	LD	(STO1),A
	LD	DE,FMTMSG
	CALL	PSTRNG

FMTIT:	LD	DE,STRMSG	;sector message
	CALL	PSTRNG
	LD	A,(TRK)
	INC	A
	LD	(TRK),A
	CALL	OPHX		;output trk no in hex
	LD	DE,HMSG		;hex message
	CALL	PSTRNG
	DI
	LD	BC,PORT1
	LD	A,01H
	OUT	(C),A
	LD	HL,FTAB1
	LD	A,(STO1)
	LD	B,014H
	LD	DE,0004H
LOOP1:
	LD	(HL),A
	ADD	HL,DE
	DJNZ	LOOP1
	LD	BC,PORT2
	CALL	SUBRT2
	LD	HL,FTAB1
	LD	DE,BVAL
	LD	A,04DH
	CALL	MAIN1
	LD	A,01H
	CALL	MAIN1
	LD	A,02H
	CALL	MAIN1
	LD	A,0AH
	CALL	MAIN1
	LD	A,011H
	CALL	MAIN1
	LD	A,0E5H
	OUT	(C),A
	DEC	C
LOOP3:
	IN	A,(C)
	RLA
	JR	NC,LOOP3
	AND	D
	JR	Z,SKIP1
	INC	C
	LD	A,(HL)
	OUT	(C),A
	INC	HL
	DEC	C
	JR	LOOP3	

SKIP1:
	INC	C
LOOP4:
	IN	A,(C)
	DEC	E
	JR	Z,FWD2
	CALL	MAIN2
	JR	LOOP4	

FWD2:
	LD	HL,FTAB2
	LD	DE,BVAL
	LD	BC,PORT2
	LD	A,04DH
	CALL	MAIN1
	LD	A,05H
	CALL	MAIN1
	LD	A,02H
	CALL	MAIN1
	LD	A,0AH
	CALL	MAIN1
	LD	A,011H
	CALL	MAIN1
	LD	A,0E5H
	OUT	(C),A
	DEC	C
LOOP5:
	IN	A,(C)
	RLA
	JR	NC,LOOP5
	AND	D
	JR	Z,FWD3
	INC	C
	LD	A,(HL)
	OUT	(C),A
	INC	HL
	DEC	C
	JR	LOOP5

FWD3:
	INC	C
LOOP6:
	IN	A,(C)
	DEC	E
	JR	Z,CKDONE
	CALL	MAIN2
	JR	LOOP6		

CKDONE:
	LD	A,(STO1)
	INC	A
	LD	(STO1),A
	CP	050H		;done 80 tracks ?
	JP	C,FMTIT
	JP	START

MAIN1:
	OUT	(C),A
MAIN2:
	DEC	C
NXT2:
	IN	A,(C)
	RLA
	JR	NC,NXT2
	INC	C
	RET

	LD	BC,PORT1
	LD	A,01H
	OUT	(C),A
	LD	HL,COMMON
WAIT1:
	LD	B,03H
HERE:
	DJNZ	HERE
	DEC	HL
	LD	A,H
	OR	L
	JR	NZ,WAIT1
	RET

CHKDRV:
	LD	A,04H
	CALL	MAIN1
	LD	A,01H
	CALL	MAIN1
	IN	A,(C)
	LD	L,A
	AND	020H
	JR	Z,ERR1
	LD	A,L
	AND	040H
	JR	NZ,ERR2
	JP	MAIN2

ERR1:
	CALL	PDRIV		;print drive b:
	LD	DE,ERMS1	;disk missing
	JR	REPEAT

ERR2:
	CALL	PDRIV		;print drive b:
	LD	DE,ERMS2	;disk wite protected
REPEAT:
	CALL	PSTRNG
	JP	DOIT

PDRIV:
	LD	DE,DRVMSG
	JP	PSTRNG

SUBR1:
	CALL	MAIN2
	LD	A,07H
	CALL	MAIN1
	LD	A,01H
	OUT	(C),A
	LD	L,0FFH
NXT4:
	CALL	MAIN2
	LD	A,04H
	CALL	MAIN1
	LD	A,01H
	CALL	MAIN1
	IN	A,(C)
	AND	010H
	JP	NZ,MAIN2
	DEC	L
	JR	NZ,NXT4	
	JR	SUBR1	

SUBRT2:
	CALL	MAIN2
	LD	A,0FH
	CALL	MAIN1
	LD	A,01H
	CALL	MAIN1
	LD	A,(STO1)
	CALL	MAIN1
	LD	A,08H
	CALL	MAIN1
	IN	L,(C)
	CALL	MAIN2
	IN	A,(C)
	LD	A,L
	AND	0C0H
	JP	Z,MAIN2
	JR	SUBRT2

;....	utility subroutines

PSTRNG:
	LD	C,09H
	JP	BDOS

GETKEY:
	LD	C,01H
	CALL	BDOS
	CP	03H
	JR	Z,QUIT		
	RET

MOTON:	LD	IX,(0001)	;get base of jump table
	LD	DE,87		;add	 offset for userf
	ADD	IX,DE
	CALL	JUMP		;do it
	DEFW	DLMON		;turn motor on
	RET
;
JUMP:	JP	(IX)
	RET

QUIT:
	LD	BC,PORT1
	XOR	A
	OUT	(C),A
	LD	DE,FINMSG
	CALL	PSTRNG
	JP	0000H		;quit to cpm

;....	output number as hex pair

OPHX:	PUSH	BC
	LD	C,A
	RRA	
	RRA	
	RRA	
	RRA	
	CALL	H1
	LD	A,C
	CALL	H1
	LD	A,C
	POP	BC
	RET	
H1:	AND	0FH
	ADD	'0'
	CP	'9'+1
	JP	C,H2
	ADD	'A'-'9'-1
H2:	CALL	PCHAR
	RET	

;....	print char in A

PCHAR:	PUSH	BC
	PUSH	AF
	PUSH	DE
	PUSH	HL
	LD	C,02
	LD	E,A
	CALL	0005
	POP	HL
	POP	DE
	POP	AF
	POP	BC
	RET	

;....	data storgae amd message area

DRVMSG:
	DB	CR,LF,'Drive B: $'
ERMS1:
	DB	'Error - disk missing',BELL,CR,LF,'$'
ERMS2:
	DB	'Error - disk is write protected',BELL,CR,LF,'$'
CLSMSG:
	DB	27,'E',27,'H',CR,LF,'80 TRACK DS FORMATTER V 1.01',CR,LF,'$'
INMSG:	DB	LF,CR,LF,'Put Disk for formatting in Drive B:',CR,LF
	DB	'Press SPACE when ready or ^C to quit.',CR,LF,'$'
FMTMSG:
	DB	CR,LF,'Formatting Disk in B: for 80 track DS DD',CR,LF,LF,'$'
STRMSG:
	DB	CR,' Formatting track: $'
HMSG:	DB	' (hex).',CR,'$'
TRK:	DB	0,0
FINMSG:	DB	CR,LF,LF,'Formatting finished - Reboot CPM',CR,LF,'$'
STO1:
	DB	0
FTAB1:
	DB	0,0,'A',2
	DB	0,0,'F',2
	DB	0,0,'B',2
	DB	0,0,'G',2
	DB	0,0,'C',2
	DB	0,0,'H',2
	DB	0,0,'D',2
	DB	0,0,'I',2
	DB	0,0,'E',2
	DB	0,0,'J',2
FTAB2:
	DB	0,1,'A',2
	DB	0,1,'F',2
	DB	0,1,'B',2
	DB	0,1,'G',2
	DB	0,1,'C',2
	DB	0,1,'H',2
	DB	0,1,'D',2
	DB	0,1,'I',2
	DB	0,1,'E',2
	DB	0,1,'J',2

	END
DB	0,1,'B',2
	DB	0,1,