;
;
;     NEC 3550 Printer install for Wordstar ver 3.30.
;                    by Brad Harrison
; 	                 12/03/86
;
; NOTE: This patch will only work if you use the Wordstar Port driver.
;
; This patch allows Wordstar ver 3.3 to function correctly with
; a NEC 3550 printer. The WINSTALL program has a selection for
; the NEC-3550 but this definition is flawed. There are two
; basic errors in the NEC-3550 definition as supplied by Micropro:
;
;    1. The DRLF sequence is incorrect. This sequence is used to
;	reverse line feed a daisy wheel printer. The sequence
;	supplied is - 1B 0A <ESC LF>. This patch will correct the
;	sequence to 1B 37 <ESC 7>.
;
;    2. The NEC 3550 printer is unique in that it requires an escape
;	sequence after the VMI (vertical motion index) sequence.
;	WS 3.3 added the DVMITR area to accomplish this but when
;	it is used, Wordstar seems to lose track of the page length
;	and basically just doesn't work right. This patch will clear
;	out the DVMITR sequence so that WS will print correctly.
;	In order to send the VMI trailer sequence, the Wordstar port
;	driver will be changed to look at the characters being printed
;	and append a 1B 32 <ESC 2> after it finds a 1B 41 xx.
;
;	Example:				    (DVMITR)
;					<---->  --- VMI trailer sequence
;			1B   41   01   1B   42
;         VMI header --	<---->    ! 
;	  (DVMILE)		  !----- VMI value (0 to 56)
;
; INSTALLATION:
;    1. Use the WINSTALL program to set up wordstar. Install the NEC-3550
;	printer and use the port driver.
;    2. Change the DATOUT equate below to match the output port for
;	your printer. (should be the same value you used with WINSTALL)
;    3. Assemble this patch.  ex: ASM WS3550
;    4. Overlay the resulting hex file onto your installed WS COM file.
;	example:   MLOAD WS.COM=WS.COM,WS3550.HEX
;
DATOUT:	EQU	0F8H		; output port  ** HARDWARE DEPENDANT **
;
;
; change signon message	- show date of this mod
	ORG	1AEH
	DB	'NEC-3550 Printer   (12/03/86 BH)'
;
;
; ---- begin of WS port driver patch for NEC 3550
;	scan all outgoing characters to printer and when
;	a ESC,'A',x is found, append a ESC,'2' afterwards
	ORG	2BDH		; space in user1 for patch
NECOUT: EQU	$
	PUSH	A		; save registers
	PUSH	H
	PUSH	B
	LXI	H,NSTAT		; (HL) is our status flag
	MOV	C,A		; char to be sent in C
	LDA	NSTAT		; find out where we are
	ORA	A
	JZ	NEC00		; nstat=0 (looking for esc)
	CPI	1
	JZ	NEC01		; nstat=1 (looking for 'A')
; nstat must be a 2 - we need to append esc '2' after this char
	DCR	M		; put nstat back to 0
	DCR	M
	CALL	CHOUT
	MVI	C,ESC		; add on an ESC '2'
	CALL	CHOUT
	MVI	C,'2'
NEC99:	CALL	CHOUT		; send char and return
	POP	B		; restore registers
	POP	H
	POP	A
	RET			; back to the ws driver
;
; nstat must be a 0 - we need to look for ESC that begins ESC 'A'
NEC00:	EQU	$
	MOV	A,C
	CPI	ESC		; first thing to look for is esc
	JNZ	NEC99		; n - just send char
	INR	M		; y - change from 0 to 1
	JMP	NEC99		;     send char and return
;
; nstat must be a 1 - we found an ESC now check for 'A'
NEC01:	EQU	$
	DCR	M		; put back to 0 just in case
	MOV	A,C
	CPI	'A'
	JNZ	NEC99		; nstat is back to 0 : look for esc
	INR	M		; 0 --> 1
	INR	M		; 1 --> 2 
	JMP	NEC99
;
CHOUT:	CALL	POBSY		; printer busy?
	JC	CHOUT		; y- we will wait
	MOV	A,C		; get back the char to print
	OUT	DATOUT		; send the char
	RET
;
NSTAT:	DB	0		; 0= check for esc
				; 1= found esc, check for 'A'
				; 2= found esc and 'A' append after this chr
;
; ---- end of wordstar port driver patch
;
;
BS:	EQU	8			; backspace
LF:	EQU	10			; line feed	
FF:	EQU	12			; form feed	
CR:	EQU	13			; carriage return
DEL:	EQU	7FH			; delete or rubout
ESC:	EQU	01BH			; escape
;
;
; ********************************************************************
; we must modify the WS port driver so that it calls our
; extension which is located in USER1 (and listed above).	
;
POBSY:	EQU	727H			; port driver : status check
;
	ORG	732H			; port driver : character out
POSEND:	EQU	$
	CALL	NECOUT			; call our modified driver
	RET
;
; ----- daisy wheel printer stuff ------------------
; the nec 3550 driver normally has WS append a ESC '2' after
; a VMI sequence. WS doesn't do this correctly, so we blank
; out the VMI trailing sequence and let the printer driver
; (above) append the ESC '2'
;
	ORG	77FH
DVMITR:	DB	0
	DB	0,0,0,0
;
;
; this was just a bug in the NEC driver as supplied from MICROPRO
; The reverse line feed sequence shoud be 1B 37 <ESC 7>
;
; ----- fix up :drlf+2 from 0A to 37
	ORG	7ABH+2
	DB	'7'
;
	END
