
;***************************************************************
;*							       *
;*	PARALLEL PRINTER DRIVER				       *
;*							       *
;***************************************************************

;****** DOS entry **********************************************

PrnSts:	call	P1Status		;no serial support
	jnz	PrnRdy
	jmp	BusExit
PrnRdy:	jmp	Exit

PrnWrt:	push	cx
	call	P1ChrOut
	pop	cx
	loop	PrnWrt
	jmp	exit
	
;****** BIOS entry INT 17h *************************************

;------	func 0: output 1 char, incl  and [\]{|} --------

;entry:	al = char, dx = printer number (0 = LPT1...)
;ret:	ah = status, like func 02

;translate characters above 80h:
GerPrn:	db	'c}ea{aaceeeiii[AEa[o|ouuY\]'

P1ChrOut:push	ax
WaitPCh:call	P1Status
	jz	WaitPCh
	pop	ax

	cmp	al,0e1h			;?
	jz	Print

	cmp	al,15h			;?
	jz	PrintPa

	cmp	al,80h
	jnc	PrnUml

;------ print not translated char ------------------------------

PRN128:	out	PbDa,al			;output 1 char
	mov	ah,PrnOk
	ret

;------ print BRD Umlaut ---------------------------------------

PrnUml:	push	ax
	call	PBRD			;switch to BRD &
WaitTxP:call	P1Status
	jz	waitTxP
	pop	ax
	lea	bx,cs:GerPrn		;tx >80h into 128 ASCII
	sub	al,80h
	xor	ah,ah
	add	bx,ax
	mov	al,[bx]
PExtra:	out	PbDa,al			;output ASCII 128 
	call	PUSA			;restore default USA
	mov	ah,PrnOk		;done
	ret

;------ print  -----------------------------------------------

Print:	call	PBRD
WaitP:	call	P1Status
	jz	WaitP
	mov	al,07eh
	jmp	PExtra

;------ print  -----------------------------------------------

PrintPa:call	PBRD
WaitPa:	call	P1Status
	jz	WaitPa
	mov	al,40h
	jmp	PExtra

;------ func 01: initialize parallel printer -------------------

;entry:	dx = printer number
;ret:	ah = printer status

PInit:	mov	al,0aah
	out	PBctl,al
	mov	byte ptr cs:[SerPrn],0	;disable serial
	mov	byte ptr cs:[ParPrn],-1	;enable parallel
	mov	ah,PrnOk
	ret

;------ func02: get printer status -----------------------------

;entry:	dx = printer number
;ret:	ah = printer status

;status bits:
;7 = not busy	6 = acknowledge	5 = out of paper	4 = Prt selected
;3 = I/O error	2 = n.c.	1 = n.c.		0 = time out

;	
P1Status:test	byte ptr cs:[ParPrn],-1
	jnz	P1Sta1
	call	PInit			;init parallel if nec.
P1Sta1:	in	al,PBsts
	and	al,PrnBusy or POBF
	jz	P1StaX
	xor	ah,ah			;ret z = not ready
	ret

P1StaX:	mov	ah,PrnOk		;ret nz = ready
	or	ah,ah
	ret

SerPrn:	db	?			;serial prn active
ParPrn:	db	?			;par. prn active

	
;------ printing subroutines: mixed BRD/USA char set -----------

PBRD:	push	ax			;switch to BRD if Umlaut
	lea	bx,cs:PT88BRD
	jmp	PString

PUSA:	push	ax			;switch to default USA
	lea	bx,cs:PT88USA		;after Umlaut

;------ general print string routine ---------------------------

PString:mov	al,byte ptr cs:[bx]	;rpt print char as
	cmp	al,'$'			;pointed to by bx,
	jz	XPStr			;rpt until char = $
	inc	bx
	
WaitStr:push	ax
	call	P1Status
	pop	ax
	jz	WaitStr
	out	PbDa,al			;output 1 char
	jmp	PString			;rpt until $

XPStr:	pop	ax
	ret

;------ switching PT88 to  BRD/USA -----------------------------

PT88BRD:db	1bh,'(K$'
PT88USA:db	1bh,'(B$'
