Compucolor.org – Virtual Media

Listing of file='PRTCHR.MAC;13' on disk='vmedia/printer_pkg_src-sideB-sector.ccvf'

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	PRTCHR - PRINTER DRIVER
;
;	   1. USES CLEAR-TO-SEND PROTOCOL
;	   2. EXPANDS TABS
;	   3. COUNTS CHARS ON LINE
;	   4. COUNTS LINES ON PAGE
;	   5. REPLACES CONTROL CHRS AND INVALID CODES
;	   6. REMOVES 'DEL'
;	   7. PRINTS HEADER MESSAGE
;
;	VALUES ON ENTRY:
;	   A REG - CHARACTER TO PRINT AND DISPLAY
;
;	DESTROYS:
;	   NOTHING
;
;	REQD ROUTINES:
;
	EXTRN	OSTR,CO,SAVE
	EXTRN	TXSER
	EXTRN	NEWLIN,NEWPAG
	EXTRN	WAIT
;
;	PARAMETERS IN MAIN PROGRAM:
;
	EXTRN	LINLEN,PAGLEN,DELTIM
;
;	OTHER PARAMETERS:
;
	EXTRN	CHRCNT,LINCNT
;
;	EQUATES
;
TAB	EQU	9
LF	EQU	10
FF	EQU	12
CR	EQU	13
SPACE	EQU	32
DEL	EQU	127

	ENTRY	PRTCHR

PRTCHR:	CALL	SAVE		;SAVE ALL REGS
	CPI	SPACE		;CHECK FOR CONTROL CHRS
	JC	CHKCC
	CPI	DEL		;SEE IF DELETE CHR OR
	JC	COUNT		;   INVALID ASCII
	JNZ	HIBIT
	MVI	A,'#'		;DEL PRINTS AS '#'

COUNT:	CALL	SEND		;SEND IT
	LXI	H,CHRCNT	;ONE MORE CHAR ON THIS LINE
	INR	M		;COUNT IT
	LDA	LINLEN		;MAX LINE SIZE
	CMP	M		;OUR COUNT
	JM	CRLF		;FORCE LF IF LINLEN EXCEEDED
	JZ	CRLF
	RET

HIBIT:	MOV	B,A		;MSB OF CHR IS SET
	LDA	LINLEN		;SEE IF "ESCAPE" SEQUENCE
	MOV	C,A		;   WILL FIT ON CURRENT LINE
	LDA	CHRCNT
	INR	A		;ALLOW FOR 4 CHR SEQUENCE,
	INR	A		;   EVEN THOUGH IT MAY ONLY
	INR	A		;   BE 3 CHRS.
	INR	A
	SUB	C
	CP	CRLF
	MVI	A,'['		;PRINT [X] (WHERE X IS THE CHR)
	CALL	PRTCHR		;   TO INDICATE THAT IT IS
	MOV	A,B		;   NOT VALID ASCII
	ANI	7FH		;REMOVE MSB
	CPI	SPACE
	JNC	OK		;CONTROL CHARACTERS ALWAYS GET
	CALL	CTLCHR		;   SUBTITUTED, EVEN CR, LF,
	JMP	RGTBRK		;   FF ETC. TO AVOID SURPRISES
OK:	CALL	PRTCHR
RGTBRK:	MVI	A,']'
	CALL	PRTCHR
	RET


CHKCC:	CPI	CR		;CARRIAGE RETURN IS OK
	JNZ	CHKFF
	CALL	SEND		;DON'T COUNT CR IN LINE LENGTH
	LDA	DELTIM		;WAIT WHILE PRINT HEAD MOVES
	ADD	A		;MULTIPLY DELAY TIME BY 4
	ADD	A
	CALL	WAIT
	RET

CHKFF:	CPI	FF		;FORM FEED?
	JNZ	CHKTAB
	CALL	NEWPAG
	RET

CHKTAB:	CPI	TAB		;SEE IF TAB
	JNZ	CHKLF
	CALL	TABOUT		;SEND BLANKS FOR DUMB PRINTERS
	RET

CHKLF:	CPI	LF		;LF? END OF LINE
	JNZ	CTLCHR
	CALL	NEWLIN
	RET


CTLCHR:	MOV	B,A		;IT IS A CONTROL CHR
	LDA	LINLEN		;SEE IF ENOUGH SPACE ON THE
	MOV	C,A		;   CURRENT LINE FOR THE
	LDA	CHRCNT		;   "ESCAPE" SEQUENCE
	INR	A
	INR	A
	SUB	C
	CP	CRLF
	MVI	A,'^'		;PRINT ^X (WHERE X IS THE CHR)
	CALL	PRTCHR		;   TO INDICATE THAT IT IS
	MOV	A,B		;   A CONTROL CHR
	ADI	'@'
	CALL	PRTCHR
	RET

;..............................................................
;

	ENTRY	CRLF

CRLF:	MVI	A,CR	;SEND CR
	CALL	PRTCHR
	MVI	A,LF	;SEND LF, RESET CHR COUNT,
	CALL	PRTCHR	;   TEST FOR END OF PAGE, AND
	RET		;   ALL THAT GOOD STUFF

;..............................................................
;
	ENTRY	TABOUT

TABOUT:	MVI	A,' '	;SEND SPACES
	CALL	PRTCHR
	LDA	CHRCNT	;TILL CHRCNT = EVEN
	ANI	7	;   MULTIPLE OF 8
	JNZ	TABOUT
	RET

;..............................................................
;
;	SEND SINGLE CHARACTER WITH ECHO TO SCREEN
;
;	VALUES ON ENTRY:
;	   A REG - CHARACTER TO PRINT AND DISPLAY
;
;	DESTROYS:
;	   E REG ONLY
;
	ENTRY	SEND


SEND:	PUSH 	PSW	;SAVE CHAR
	MOV	E,A	;E FOR SERVICE ROUTINE
	CALL	TXSER	;TEST CLEAR-TO-SEND THEN SEND
	POP	PSW	;GET CHAR BACK
	CALL	CO	;DISPLAY IT
	RET

	END