	.TITLE	VRSSMBCHR - GENERATE A WIDE LINE ON PRINTER
	.SBTTL	DECLARATIONS
;
;
;	LANGUAGE:  VAX-11 MACRO
;
;	OPERATING SYSTEM:  VAX/VMS
;
;	ORDER NUMBER:  12X-9XV
;
;	PART NUMBER:  000-025809-XXX REV. G  MAY, 1985
;
;	PRODUCT: VAX-11 DIAGNOSTIC,
;	PRODUCT: VAX/VMS DRIVER, SYMBIONT, AND OUTPUT PACKAGE
;
;	VERSATEC, INC., SANTA CLARA, CALIFORNIA 95051
;	A XEROX COMPANY
;
;	Copyright (C) 1985 by Xerox Corporation.  All rights reserved.
;
;	"NOTICE. THIS PROGRAM IS THE EXCLUSIVE PROPERTY OF VERSATEC,
;	INC. AND IS ISSUED IN STRICT CONFIDENCE UNDER A PREARRANGED
;	LICENSE AGREEMENT AND IS NOT TO BE DISCLOSED IN ANY MANNER TO
;	PERSONS OUTSIDE THE LICENSED ORGANIZATION AND SHALL NOT BE
;	REPRODUCED OR DISSEMINATED, IN WHOLE OR PART, TO ANYONE OUTSIDE
;	THE LICENSED ORGANIZATION WITHOUT THE PRIOR WRITTEN APPROVAL OF
;	VERSATEC, INC. UNLESS OTHERWISE PROVIDED FOR BY SUCH LICENSE
;	AGREEMENT.  THIS WORK IS PROTECTED AS AN UNPUBLISHED WORK UNDER
;	THE COPYRIGHT ACT OF 1976."
;
;
;	THIS ROUTINE WILL PRINT WIDE LINE OF CHARACTERS
;	ON THE PRINTER FOR FLAG/BURST PAGES
;
;	B.L.	MAY, 1985	INITIAL RELEASE WITH REV. G DRIVER
;
;
	.PSECT	VRSSMBCHR,EXE,RD,NOWRT,LONG
 
;
; MACROS:
;
;	MACRO TO GENERATE A TABLE FOR CHARACTER DECODING
;
	.MACRO	DECTAB	HI,LO,TABLE
	.ASCII	\HI'LO\
	.WORD	TABLE-.
	.ENDM
 
;
; EQUATED SYMBOLS:
;
;	DEFINE THE OFFSET TO INPUT ARGUMENTS AS THE APPEAR
;	AFTER BEING PUSHED INTO THE STACK
;
	COUNT	= 0			;BYTE COUNT
	ADR	= 4			;BUFFER ADDRESS
	SPACOUT	= 8			;PRECEEDING SPACE COUNT
	HEIGTH	= 9			;NUMBER OF LINES PER ROW
	WIDTH	= 10			;NUMBER OF CHARACTERS PER COLUMN
	SPACING	= 11			;INTER CHARACTER SPACING
 
;
; OWN STORAGE:
;
 
;
; THE FOLLOWING TABLES ARE USED TO GENERATE THE CHARACTERS
; EACH ENTRY IS 35 BITS LONG, 1 BIT FOR EACH POSITION IN
; A 5X7 MATRIX.
;
;
ALPHA:
	.WORD	^O143056,^O061770,^O030574,^O014276,^O007637,^O102041
	.WORD	^O057740,^O030614,^O173706,^O074103,^O176041,^O141037
	.WORD	^O020413,^O010370,^O107502,^O143056,^O061770,^O107214
	.WORD	^O041020,^O101610,^O141020,^O056430,^O164614,^O014244
	.WORD	^O004103,^O102041,^O073437,^O030615,^O014306,^O146547
	.WORD	^O135061,^O061430,^O167214,^O174305,^O004102,^O143056
	.WORD	^O111530,^O030575,^O111276,^O007642,^O040701,^O037370
	.WORD	^O102041,^O011020,^O106143,^O177061,^O061430,^O105214
	.WORD	^O014304,^O156543,^O043061,^O052105,^O030614,^O041052
	.WORD	^O174410,^O010420,^O037021,^O0
 
;
; BIT MASK TABLE FOR NUMBERS 0-9
;
 
NUMERIC:
	.WORD	^O163056,^O121472,^O103043,^O041020,^O105634
	.WORD	^O010420,^O056761,^O004204,^O113506,^O175122,^O120410,^O007037
	.WORD	^O150602,^O010271,^O106136,^O040756,^O104210,^O027010,^O013506
	.WORD	^O071643,^O075061,^O016410
 
;
; BIT MASK FOR UNDER SCORE CHARACTER
;
UNDERSCORE:
	.WORD	^O0,^O140000,^O7
 
;
; THE DOLLAR SIGN
;
 
DOLLARS:
	.WORD	^O013704,^O017507,^O1
 
;
; BIT MASK TABLE FOR '.'
;
 
DOT:
	.WORD	^O0,^O14000,^O3
 
;
; BIT MASK FOR ':;'
;
 
COLONS:	.WORD	^O30600,^O14300,^O006140,^O103060,^O10
 
;
; BIT MASK TABLE FOR ' '
;
 
BLANK:
	.WORD	^O0,^O0,^O0
 
; THE FOLLOWING TABLE IS USED TO DECODE WHICH BIT TABLE CONTAINS
; THE INFORMATION ABOUT A GIVEN CHARACTER.
;
DECODE:	
	DECTAB	Z,A,ALPHA		;DECODE ALPHAS
	DECTAB	9,0,NUMERIC		;AND NUMBERS
	DECTAB	<;>,<:>,COLONS		;THE COLONS
	DECTAB	<_>,<_>,UNDERSCORE	;THE UNDERSCORE CHARACTER
	DECTAB	<$>,<$>,DOLLARS		;THE OLD BUCK MARKER
	DECTAB	<.>,<.>,DOT		;THE PERIOD
	.BYTE	255,0			;CATCH ALL
	.WORD	BLANK-.			;PRINT A SPACE
	.PAGE
	.SBTTL	GENERATE THE CHARACTERS	
;++
; FUNCTIONAL DESCRIPTION:
;
;	THIS ROUTINE USES A 5X7 ARRAY OF BITS TO GENERATE
;	CHARACTERS ON THE PRINTER.  THE ROUTINE IS USED TO GENERATE
;	THE FLAG PAGE.
;
; CALLING SEQUENCE:
;
;	BSB/JSB	VRSSMB$CHRGEN
;
; INPUT PARAMETERS:
;
;	R2 CONTAINS THE COUNT OF CHARACTER TO OUTPUT
;	R3 CONTAINS THE ADDRESS
;	R4 CONTAINS:
;
;		+--------+--------+--------+--------+
;		! SPACING! HEIGTH ! WIDTH  ! SPACOUT!
;		+--------+--------+--------+--------+
; WHERE:
;	SPACOUT IS THE NUMBER OF LEADING SPACES ON EACH LINE
;	WIDTH   IS THE NUMBER OF TIMES TO REPEAT A CHARACTER ON A ROW
;	HEIGTH  IS THE NUMBER OF TIMES EACH LINE IS PRINTED
;	SPACING IS THE NUMBER IF BLANK CHARACTERS BETWEEN BIG CHARACTERS
;
; OUTPUT PARAMETERS:
;
;	THE WIDE LINE IS PRINTED
;
; IMPLICIT OUTPUTS:
;
;	NONE
;
; COMPLETION CODES:
;
;	NONE
;
; SIDE EFFECTS:
;
;	NONE
;
;--
 
 
 
VRSSMB$CHRGEN::				;PRINT A WIDE LINE
	PUSHR	#^M<R2,R3,R4,R5,R6,R7,R8> ; SAVE NON-VOLATILE REGISTERS
	CLRL	R8			;ZERO ROW COUNTER
10$:	MOVQ	COUNT(SP),R6		;GET COUNT TO R6, LINE ADDRESS TO R7
	MOVAL	SD_T_TBUF,R0		;BASE ADDRESS OF LINE BUFFER
	MOVZBL	SPACOUT(SP),R2		;COUNT OF LEADING SPACES ON THE LINE
	BEQL	30$			;BR IF NO LEADING SPACES WANTED
20$:	MOVZBL	#^A/ /,R1		;GET A SPACE
	BSBB	200$			;OUTPUT SPACE CHARACTERS TO LINE
30$:
	MOVZBL	(R7),R3			;GET CHARACTER TO PRINT
	MOVAL	DECODE-3,R4		;ADDRESS OF DECODE TABLE
40$:
	ADDL	#3,R4			;ADVANCE TO NEXT TABLE ENTRY
	CMPB	R3,(R4)+		;CHECK AGAINST HIGH LIMIT
	BGTRU	40$			;BR IF OUT OF LIMIT
	CMPB	R3,(R4)			;NOW CHECK LOW LIMIT
	BLSSU	40$			;BR IF IN RANGE OF TABLE
	SUBB	(R4)+,R3		;REMOVE TABLE BIAS
	CVTWL	(R4),R1			;GET OFFSET TO BIT TABLE
	ADDL	R1,R4			;FIND REAL ADDRESS OF TABLE
	MULL	#35,R3			;FIND INDEX TO FIRST BIT IN CHARACTER
	MULL3	#5,R8,R1		;FIND INDEX FOR PROPER ROW
	ADDL	R1,R3			;FIND FIRST BIT TO TEST FOR THIS ROW
	MOVL	#5,R5			;SET NUMBER OF COLUMNS TO OUTPUT
70$:	MOVZBL	(R7),R1			;GET THE CHARACTER
	BBS	R3,(R4),80$		;BR IF NO SPACE THIS TIME
	MOVZBL	#^A/ /,R1		;PRINT SPACES
80$:	MOVZBL	WIDTH(SP),R2		;GET NUMBER OF CHARACTERS PER COLUMN
	BSBB	200$			;OUTPUT CHARACTERS TO THE LINE
	INCL	R3			;ADJUST BIT NUMBER UP 1
	SOBGTR	R5,70$			;REPEAT FOR 5 TIMES-NUMBER COLUMNS PER
	MOVZBL	SPACING(SP),R2		;GET NUMBER OF BLANKS FOR SEPARATION
	INCL	R7			;ADVANCE CHARACTER POINTER
	SOBGTR	R6,20$			;LOOP AROUND IF MORE CHARACTERS TO DO
	MOVZBL	HEIGTH(SP),R4		;GET THE NUMBER OF TIMES TO PRINT LINE
85$:	PUSHL	R0			;SAVE BUFFER POINTER
	MOVAL	SD_T_TBUF,R1		;GET START OF LINE BUFFER
	SUBL	R1,R0			;COMPUTE LENGTH TO R0
	CLRL	R2			;SET I/O STATUS INDEX
	BSBW	VRSSMB$WRITELINN	;PRINT THE LINE
	BLBS	R0,90$			;BR IF OK
	POPR	#^M<R1>			;CLEAN UP THE STACK
	BRB	100$			;RETURN
90$:
	POPR	#^M<R0>			;GET THE BUFFER ADDRESS BACK
	SOBGTR	R4,85$			;REPEAT THE LINE FOR HEIGTH
	ACBL	#6,#1,R8,10$		;INC ROW COUNT AND REPEAT UNTIL DONE
	MOVZWL	#SS$_NORMAL,R0		;SET SUCCESS
100$:
	POPR	#^M<R2,R3,R4,R5,R6,R7,R8> ; RESTORE REGISTERS USED
	RSB
 
;
; LOCAL SUBROUTINE TO OUTPUT CHARACTERS TO THE PRINT BUFFER
;
;	R0 IS BUFFER ADDRESS
;	R1 IS CHARACTER
;	R2 IS COUNT
;
200$:	MOVB	R1,(R0)+		;STORE THE CHARACTER
	SOBGTR	R2,200$			;REPEAT IF NECESSARY
	RSB
 
	.END
