	.TITLE	MZFORM
	.MCALL	.GTLIN	.PRINT
	.DSABL	GBL
	.GLOBL	BLOCKS

C2$CSR	=	176674	
C2$DAT	=	176676

TRACKS	=	40.

MZFORM:	.PRINT	#T.MZ
ENTRY:	MOV	#BUFF,R1
	.GTLIN	R1,#T.PRMT
	MOVB	(R1)+,R0
	BEQ	MZFORM
	BR	CNT

E.INP:	.PRINT	#T.INVD
	MOV	#BUFF,R0
E.:	.PRINT
	BR	ENTRY

CNT:	SUB	#'0,R0
	BMI	E.INP
	CMP	R0,#3
	BHI	E.INP
	TSTB	@R1
	BNE	E.INP
	MOVB	R0,DRIVE
	MOVB	R0,W.DRIVE
	MOVB	R0,R.DRIVE

	.PRINT	#T.80
	CLR	.SIDE
	CLRB	TRACK
ONE:	MOV	.SIDE,R0
	.PRINT	.T.SIDE(R0)

RETRY:	CALL	FORMAT
	BEQ	OK
	MOV	.SIDE,R0
	.PRINT	.T.ER(R0)
	BR	RETRY

OK:	.PRINT	#T.VER
	MOVB	DRIVE,.DRIVE
	MOVB	TRACK,.TRACK
	CALL	CHECK
	BNE	RETRY

	MOV	WCNT,R0
	MOV	CPADR,R1
1$:	CMP	DATA,(R1)+
	BNE	RETRY
	SOB	R0,1$

	MOV	#2,R0
	XOR	R0,.SIDE

	MOV	#100000,R0
	XOR	R0,DRIVE-1
	BMI	ONE

	.PRINT	#T.OK

	INCB	TRACK
	CMPB	TRACK,#TRACKS
	BNE	ONE

INIT:
	.PRINT	#T.INI

	MOV	#BLOCKS,DIRBUF
	MOVB	#0 +1,W.SEC

	CALL	W
	INCB	W.SEC
	CALL	W
	MOVB	#6 +1,W.SEC
	CALL	W

	.PRINT	#T.IOK
	JMP	ENTRY


W:	CALL	WRITE
	BNE	W

	MOVB	W.SEC,R.SEC
	CALL	READ
	BNE	W

	MOV	#400,R0
	MOV	DIRBUF,R1
	MOV	#BUFF,R2
1$:	CMP	(R1)+,(R2)+
	BNE	W
	SOB	R0,1$

	.PRINT	#T.DOT
	ADD	#1000,DIRBUF
	RETURN

;---------------------------------------------
F.BLK:	.BYTE	-1	; ERR CODE
	.BYTE	30	; FORMAT
	.BYTE	2	; DISK TYPE = 2 SIDES
DRIVE:	.BYTE	0	; SIDE * 200 + DRIVE
TRACK:	.BYTE	0	; TRACK
	.BYTE	2	; 10 SECTORS PER TRACK
DATA:	.WORD	"UU	; DATA
;---------------------------------------------
C.BLK:	.BYTE	-1	; ERR CODE
	.BYTE	10	; READ
	.BYTE	2	; DISK TYPE = 2 SIDES
.DRIVE:	.BYTE	0	; SIDE * 200 + DRIVE
.TRACK:	.BYTE	0	; TRACK
	.BYTE	1	; SECTOR
CPADR:	.WORD	BUFF	; CP ADRESS
WCNT:	.WORD	400*10.	; WCNT
;---------------------------------------------
W.BLK:	.BYTE	-1	; ERR CODE
	.BYTE	20	; WRITE
	.BYTE	2	; DISK TYPE = 2 SIDES
W.DRIVE:.BYTE	0	; SIDE * 200 + DRIVE
	.BYTE	0	; TRACK
W.SEC:	.BYTE	1	; SECTOR
DIRBUF:	.WORD	BLOCKS	; CP ADRESS
	.WORD	400	; WCNT
;---------------------------------------------
R.BLK:	.BYTE	-1	; ERR CODE
	.BYTE	10	; READ
	.BYTE	2	; DISK TYPE = 2 SIDES
R.DRIVE:.BYTE	0	; SIDE * 200 + DRIVE
	.BYTE	0	; TRACK
R.SEC:	.BYTE	1	; SECTOR
	.WORD	BUFF	; CP ADRESS
	.WORD	400	; WCNT
;---------------------------------------------

TEST:	TSTB	@#C2$CSR
	BPL	TEST
	RETURN

OUT$B:	CALL	TEST
	MOVB	R0,@#C2$DAT
	RETURN

OUT$W:	CALL	OUT$B
	SWAB	R0
	CALL	OUT$B
	SWAB	R0
	RETURN

WRITE:	MOV	#W.BLK,R0
 	BR	OUT$AD

READ:	MOV	#R.BLK,R0
 	BR	OUT$AD

FORMAT:	MOV	#F.BLK,R0
	BR	OUT$AD

CHECK:	MOV	#C.BLK,R0

OUT$AD:	MOVB	#-1,@R0
	CALL	OUT$W
	MOV	R0,-(SP)
	MOV	#-1,R0
	CALL	OUT$W
	CALL	TEST
	MOV	(SP)+,R0
	MOVB	@R0,R0
	RETURN

.SIDE:		.WORD
.T.SIDE:	.WORD	T.FD	,T.FU
.T.ER:		.WORD	T.ED	,T.EU

T.MZ:	.ASCIZ	"The PAF40, Copyright (C) 1992, 93 by Petrosyan Alexander"<12>
T.PRMT:	.ASCII	"Drive #"<200>
T.INVD:	.ASCII	"Invalid drive # "<200>

T.80:	.ASCIZ	"Formatting 40 tracks"

BS	=	8.

T.FD:	.BYTE	'_,BS,200
T.FU:	.BYTE	'~,BS,200

T.ED:	.BYTE	'D,BS,200
T.EU:	.BYTE	'U,BS,200

T.VER:	.BYTE	177,BS,200
T.OK:	.BYTE	'=,200

T.DOT:	.BYTE	'.,200
T.INI:	.ASCII	<15><12>"Initializing "<200>
T.IOK:	.ASCIZ	<15>"OK"<33>"K"<12>

	.EVEN

BUFF:	.END	MZFORM

                                                                                                                                                                                                                                                                                                                       