	TITLE	LPTDRV - FORTRAN LINE PRINTER DRIVER

	.8080

	ENTRY	LPTDRV,$OPNFL
	EXTRN	$IOERR,$BF,$BL,$CLSFL

	DSEG

$OPNFL:	DB	0
CLSADR:	DS	2

	CSEG

LPTDRV:	DW	$IOERR
	DW	LPTFWR
	DW	$IOERR
	DW	LPTBWR
	DW	$IOERR
	DW	$IOERR
	DW	LPTCLS

LPTCLS:	LDA	$OPNFL		;MAKE SURE ALREADY 'OPEN'
	ORA	A
	JZ	$IOERR
	XRA	A		;'CLOSE' BY SENDING
	STA	$OPNFL		;  FORM FEED
OUTFF:	MVI	A,12
	JMP	LPTOUT

CLSLPT:	LDA	$OPNFL
	ORA	A
	LHLD	CLSADR
	PUSH	H
	RZ
	CALL	OUTCR		;CR
OUTLF:	MVI	A,10		;LF
	JMP	LPTOUT

MAKOPN:	LXI	H,$OPNFL
	MOV	A,M
	ORA	A
	RZ
	INR	M
SETCLS:	LHLD	$CLSFL
	LXI	D,CLSLPT
	MOV	A,L
	SUB	E
	MOV	A,H
	SBB	D
	RZ
STORAD:	SHLD	CLSADR
	XCHG
	SHLD	$CLSFL
	RET

LPTFWR:	CALL	MAKOPN
	LDA	$BL
	ORA	A
	RZ			;NUTHIN HERE

	LHLD	$BF
	DCR	A
	MOV	E,A		;INTO [E] FOR LPTLOP
	MOV	A,M
	CPI	'*'		;DO NOTHING?
	JZ	LPTNLF
	CALL	OUTCR		;OUTPUT CR
	MOV	A,M
	CPI	"+"
	JZ	LPTNLF
	CPI	"1"
	JNZ	LPTLF
	CALL	OUTFF		;FORM FEED
	JMP	LPTNLF

LPTLF:	CALL	OUTLF
	MOV	A,M
	CPI	"0"
	CZ	OUTLF

LPTNLF:	INX	H
	MVI	D,0

LPTLOP:	MOV	A,E
	ORA	D
	RZ
	MOV	A,M
	CALL	LPTOUT
	INX	H
	DCX	D
	JMP	LPTLOP

LPTBWR:	CALL	MAKOPN
	LHLD	$BL
	XCHG
	LHLD	$BF
	JMP	LPTLOP

OUTCR:	MVI	A,13
	
LPTOUT:	PUSH	H
	PUSH	D
	MVI	C,5		;CP/M LPT OUT FUNCTION
	MOV	E,A
	CALL	0005
	POP	D
	POP	H
	RET

	END
