Google
 

Trailing-Edge - PDP-10 Archives - decuslib10-12 - 43,50547/pltlib/v12/symbol.mac
There are 7 other files named symbol.mac in the archive. Click here to see a list.
SUBTTL	Revision History

;NOTE:  PLTUNV.UNV defines the following:
;	TTL			Macro to generate the TITLE statement
;	T0-T4,P1-P4,X,Y		All AC definitions
;	FTMKTB			Feature test for subroutine MKTBL
;	REAL,INTEGER,STRING	Data types
;	$RELOC,$HISEG,$LOSEG	Relocation macros
;	FLOAT,ERRSTR,PFALL	General macros

		SALL

;Edit	
; 442	  1980	   JMS	Separate SYMBOL, NUMBER, and ISETAB from the rest.
;			This allowed the use of SYMBOL.DAT for plotting
;			characters on the VERSATEC using standard calls to
;			subroutine PLOT.
;
; 505	20-Oct-82  JMS	Remove debugging HALT that limited X,Y to 11.0 inches.
;
; 506	20-Oct-82  JMS	Implemented CR, LF, TAB, BS, SI, and SO characters.
;
; 512	29-Oct-82  JMS	Implement subroutine SETSYM to replace ISETAB/MSETAB.
;
; 513	 2-Nov-82  JMS	Fix bug near ISETA6 introduced by edit 512
;
; 514	 9-Nov-82  JMS	Do not special case CR, LF for centered symbols.
;
;End of Revision History
SUBTTL	Table of contents

;              Table of Contents for SYMBOL plotter
;
;
;			   Section			      Page
;
;    1. Table of contents  . . . . . . . . . . . . . . . . . .   2
;    2. Subroutine Descriptions
;         2.1   ISETAB - Fake a call to SETSYM . . . . . . . .   3
;         2.2   MKTBL  - Make table from in-core array . . . .   4
;         2.3   MSETAB - Fake a call to SETSYM . . . . . . . .   5
;         2.4   NUMBER - Draw numbers on the plot  . . . . . .   6
;         2.5   SETABL - Change table for SYMBOL (DEC routin .   7
;         2.6   SETSYM - Get data from SYMBOL.DAT  . . . . . .   8
;         2.7   SYMBOL - Plot symbols (letters, digits, etc) .   9
;    3. NUMBER
;         3.1   Entry point  . . . . . . . . . . . . . . . . .  10
;         3.2   Convert floating point to ASCII  . . . . . . .  13
;         3.3   Variables  . . . . . . . . . . . . . . . . . .  15
;    4. Definitions for SYMBOL and MYPLOT  . . . . . . . . . .  16
;    5. SETSYM
;         5.1   Dispatch, 'QUERY' and 'WIDTH'  . . . . . . . .  17
;         5.2   'TABLE' - Change symbol tables . . . . . . . .  18
;         5.3   Get table from SYMBOL.DAT  . . . . . . . . . .  19
;    6. SYMBOL
;         6.1   Get args, set up mode  . . . . . . . . . . . .  20
;         6.2   Set up translation and rotation  . . . . . . .  21
;         6.3   Main loop, do a character  . . . . . . . . . .  22
;         6.4   Control characters, CR, LF, etc  . . . . . . .  24
;         6.5   Variables  . . . . . . . . . . . . . . . . . .  25
;    7. ISETAB table #1
;         7.1   Pointers . . . . . . . . . . . . . . . . . . .  26
;         7.2   Data . . . . . . . . . . . . . . . . . . . . .  27
SUBTTL	Subroutine Descriptions -- ISETAB - Fake a call to SETSYM
	SEARCH	PLTUNV	;Search the universal file
TTL	(<ISETAB - Calls SETSYM to read SYS:SYMBOL.DAT[1,4]>)

;	INTEGER FUNCTION ISETAB(ITABLE)
;	CALL SETSYM ('TABLE',ITABLE,IERR)
;	ISETAB = IERR
;	RETURN
;	END	

;For a description of symbols, see SETSYM routine.

	ENTRY	ISETAB
ISETAB:	MOVEI	0,ISET00	;Functions must preserve ACs
	BLT	0,ISET00+L
	MOVE	T1,@0(L)	;Get argument to ISETAB(ITABLE)
	MOVEM	T1,ITABLE	;Store as 2nd arg to SETSYM
;*;	ERRSTR	(<[Function ISETAB has called subroutine SETSYM to change tables>)
				;Call SETSYM directly to avoid the message
	MOVEI	L,[-3,,0	  ;3 args
		STRING	IFUNC	  ;'TABLE'
		INTEGER	ITABLE	  ;Postive or 0 table number
		INTEGER	IERR	  ;Error flag
		]+1		;Point to args
	PUSHJ	P,%SETSYM##	;Call the routine in SYMBOL module
	MOVSI	L,ISET00	;Restore ACs
	BLT	L,L
	MOVE	0,IERR		;Return error flag as function value
	POPJ	P,

	$LOSEG		;Variables

ISET00:	BLOCK	1+16		;Place to store ACs 0-16
IFUNC:	ASCII	/TABLE/		;Arg to change tables
ITABLE:	BLOCK	1		;Positive number for ISETAB
IERR:	BLOCK	1		;Returned error flag

	$HISEG
	PRGEND
SUBTTL	Subroutine Descriptions -- MKTBL  - Make table from in-core array
	SEARCH	PLTUNV	;Search the universal file
IFN FTMKTB,<
TTL	(<MKTBL  - Sets up the offset tables for SYMBOL>,DUMMY)

;Calling sequence:
;	CALL MKTBL(ITABLE, IARRAY)
;
;  ITABLE - The table to define.  Integer from 1 to 15.
;  IARRAY - Table of 128 pointers, the left half has the number of offsets
;	in the character, the right half points to a string of 5 bit bytes
;	in triplets (Pen up-down, X, and Y).


	ENTRY   MKTBL
	MKTBL=%MKTBL##		;Defined in SYMBOL module
	PRGEND		> ;End of IFN FTMKTB
SUBTTL	Subroutine Descriptions -- MSETAB - Fake a call to SETSYM
	SEARCH	PLTUNV	;Search the universal file
TTL	(<MSETAB - Calls SETSYM to read SYMBOL:SYMBOL.DAT[-]>)

;	INTEGER FUNCTION MSETAB(ITABLE)
;	CALL SETSYM ('TABLE',-ITABLE,IERR)	!Negative
;	MSETAB = IERR
;	RETURN
;	END	

	ENTRY	MSETAB
MSETAB:	MOVEI	0,MSET00	;Functions must preserve ACs
	BLT	0,MSET00+L
	MOVE	T1,@0(L)	;Get argument to MSETAB(ITABLE)
	MOVNM	T1,ITABLE	;Store as 2nd arg to SETSYM (negated)
;*;	ERRSTR	(<[Function MSETAB has called subroutine SETSYM to change tables>)
				;Call SETSYM directly to avoid the message
	MOVEI	L,[-3,,0	  ;3 args
		STRING	IFUNC	  ;'TABLE'
		INTEGER	ITABLE	  ;Postive or 0 table number
		INTEGER	IERR	  ;Error flag
		]+1		;Point to args
	PUSHJ	P,%SETSYM##	;Call the routine in SYMBOL module
	MOVSI	L,MSET00	;Restore ACs
	BLT	L,L
	MOVE	0,IERR		;Return error flag as function value
	POPJ	P,

	$LOSEG		;Variables

MSET00:	BLOCK	1+16		;Place to store ACs 0-16
IFUNC:	ASCII	/TABLE/		;Arg to change tables
ITABLE:	BLOCK	1		;Negative number for MSETAB
IERR:	BLOCK	1		;Returned error flag

	$HISEG
	PRGEND
SUBTTL	Subroutine Descriptions -- NUMBER - Draw numbers on the plot

;Calling sequence:
;	CALL NUMBER (X, Y, HEIGHT, FNUMB, ANGLE, NDIG)
;	CALL NUMBER (X, Y, HEIGHT, FNUMB, ANGLE, NDIG, IRAD)
;
;  (X,Y)  - The coordinate of the first char to be drawn
;  HEIGHT - The height of the numbers in inches
;  FNUMB  - The number for output (floating point real number)
;  ANGLE  - The angle of rotation
;  NDIG   - The number of digits beyond the decimal point
;  IRAD   - (optional) The output radix, from 2 to 36.

;Convert REAL number in FNUMB to a string of digits in NUMTXT, set NUMDIG,
; and then "CALL SYMBOL (X,Y,HEIGHT,NUMTXT,ANGLE,NUMDIG)".

;For example:
;	Z = 3.141592653
;	CALL NUMBER(X,Y,0.2,Z,90.0,2)
;will draw '3.14' at 90 degrees.
SUBTTL	Subroutine Descriptions -- SETABL - Change table for SYMBOL (DEC routine)
	SEARCH	PLTUNV	;Search the universal file
IFN FTMKTB,<
TTL	(<SETABL - Changes table for SYMBOL (DEC routine)>,DUMMY)

;Calling sequence:
;	CALL SETABL (ITABLE, IFLAG)
;
;  ITABLE - The table to define.  An integer from 1 to 15, or 0.
;  IFLAG  - Set to 0 if table is defined, -1 if not.  If ITABLE is zero
;	     IFLAG is returned as the number of the current table
;
;  This routine is included for compatiblity with DEC routines, subroutine
;SETSYM should be used instead.  Description of SETABL and MKTBL in MKTBL.DOC


	ENTRY	 SETABL
	SETABL=%SETABL##	;Defined in SYMBOL module
	PRGEND		>  ;End of FTMKTB
SUBTTL	Subroutine Descriptions -- SETSYM - Get data from SYMBOL.DAT
	SEARCH	PLTUNV	;Search the universal file
TTL	(<SETSYM - Gets the data tables for SYMBOL>,DUMMY)

;  This subroutine reads the SYMBOL table from either SYS:SYMBOL.DAT[1,4]
;or SYMBOL:SYMBOL.DAT[-], or returns information about the tables.
;NOTE:  In order to use the negative tables, the user must define the
;logical device SYMBOL: via the ASSIGN or PATH commands to the Monitor.

;Calling sequence:
;	CALL SETSYM(IFUNC,IARG,IANS)	!The 3rd arg may be a REAL variable
; IFUNC = (input)  Name of the function to perform
; IARG  = (input)  The argument of the function
; IANS  = (output) Returned answer (not necessarily an integer)

;	CALL SETSYM('TABLE',ITABLE,IERR)
;  IFUNC  = 'TABLE' - Change tables or return the value of the current one.
; ITABLE = The number of the table to be loaded into memory for SYMBOL.
;   + = Positive values read from SYS:SYMBOL.DAT[1,4]
;   - = Negative values read from SYMBOL:SYMBOL.DAT[-]
;   0 = ZSame as CALL SETSYM('QUERY',0,IANS)
; IERR   = The error flag .  Returned as 0 if no errors, as -1 if errors.

;	CALL SETSYM('QUERY',0,IANS)
;  IFUNC  = 'QUERY' - Read the current table number.
;  IARG   = Ignored.
;  IANS   = The table number.  Positive if the table was read from
;	    SYS:SYMBOL.DAT[1,4], negative if from SYMBOL:SYMBOL.DAT[-].

;	CALL SETSYM('WIDTH',LETTER,WIDTH)
;  IFUNC  = 'WIDTH' - Read the width for the specified letter.
;  LETTER = The ASCII code for the character in question.  "A"=65.
;  WIDTH  = The width as compared to the height, a number from 0.0 to 1.0.

		PAGE
;The tables defined in SYS:SYMBOL.DAT are:
;
;     Description	Upper	Lower	Number	Punctu-	Bracket	Symbols
;			case	case		ation	[\]^_	#$%+-<=>@
; --  --------------    -----   -----   ------  ------  ------- ---------
; 1.  CSM standard	Yes	Yes	Yes	Yes	Yes	Yes
; 2.  DEC standard	Yes	No	Yes	Yes	Yes	Yes
; 3.  Olde English	Yes	Yes	Yes	Yes	Yes	$ only
; 4.  Old German	Yes	Yes	No	No	No	No
; 5.  Old Itialian	Yes	Yes	No	No	No	No
; 6.  Script		Yes	Yes	No	No	No	No
; 7.  Double line	Yes	Yes	Yes	Yes	[]	+-/<=>
; 8.  Italics		Yes	Yes	Yes	Yes	[]	+-/<=>
; 9.  Triple line	Yes	Yes	Yes	Yes	No	#$%+-=
; 10. Triple Italics	Yes	Yes	Yes	Yes	No	#$%+-=
; 11. Round letters	Yes	Yes	Yes	Yes	No	#$%+-=
; 12. Greek letters	Yes	Yes	No	No	No	No
; 13. Double Greek	Yes	Yes	No	No	No	No

;There are 26 centered symbols in SETSYM tables +1 and +2.
;	0	Square box		 8	Z
;	1	Circle			 9	Y
;	2	Triangle		10	Square star
;	3	Plus sign		11	Asterisk
;	4	X			12	Hourglass
;	5	Diamond			13	Vertical bar
;	6	Up arrow		14	Five pointed star
;	7	X with a bar on top	15	Horizontal bar
;     16-25	Digits 0 through 9, centered about the point


	ENTRY	SETSYM
	SETSYM=%SETSYM##	;Defined in SYMBOL module
	PRGEND
SUBTTL	Subroutine Descriptions -- SYMBOL - Plot symbols (letters, digits, etc)

;Calling sequence:
;	CALL SYMBOL (X, Y, HEIGHT, ICHAR, ANGLE, NUMCHR)
;
;  (X,Y)  - The coordinate of the first character to be drawn.
;  HEIGHT - The height of the characters in inches.
;  ICHAR  - An array of characters to be plotted, or an integer number.
;  ANGLE  - The angle of rotation.
;  NUMCHR - the number of characters to be plotted.
;     If NUMCHR is zero, plot the single character whose ASCII code is in ICHAR.
;     If NUMCHR is negative, plot a centered symbol whose number is in ICHAR.
;     -2 will draw the symbol with a connecting line to the old position.
;     Any other negative number will not draw the connecting line.
;
;For a description of symbols, see SETSYM routine above.


	EXTERN	PLOT		;User's program must also request PLOT routine
SUBTTL	NUMBER -- Entry point
	SEARCH	PLTUNV	;Search the universal file
TTL	(<NUMBER - Plots numbers on the plotter>)

;Definitions

	ND MAXCHR,^D30		;Max number of digits sent to SYMBOL
	ND FTTYPE,0		;Do not use $TYPE macro

	EXTERN	SYMBOL,PLOT	;Call upon subroutine SYMBOL to do the plotting
	EXTERN	EXP2.		;Math routine from FORLIB
IFN FTKA,<EXTERN IFX.1>		;Convert REAL in T1 to INTEGER
IFN FTTYPE,< SEARCH SYSUNV	;Get definition of $TYPE macro
	.REQUEST REL:TYPER	;Floating point conversion routine >

	A=P1			;Preserved AC
	B=P2			;Byte pointer
	C=P3			;Counter
	D=P4			;Data
	PURGE	P1,P2,P3,P4
;CALL NUMBER (X,Y,HEIGHT,FNUMB,ANGEL,NDIG,IRAD)

	ENTRY	NUMBER		;Set up entry point
	SIXBIT	/NUMBER/	;For subroutine TRACE.
NUMBER:	MOVEM	L,NUMB16	;Save arg pointer

;Set up pointers to variables

	MOVEI	T0,ARGLST-1	;Set up to get the arguments
	PUSH	T0,0(L)		;Get address of X
	PUSH	T0,1(L)		;Get address of Y
	PUSH	T0,2(L)		;Get address of HEIGHT
	PUSH	T0,@3(L)	;Get value of FNUMB
	PUSH	T0,4(L)		;Get address of ANGLE
	PUSH	T0,@5(L)	;Get value of NDIG
	MOVE	T1,[POINT 7,NUMTXT] ;Set up a pointer to
	MOVEM	T1,NUMPNT	; the data array

;Get the output radix (IRAD)

IFE FTTYPE,<
	HLRZ	T1,-1(L)	;Get number of arguments on this call
	CAIE	T1,-7		;Skip if there are 7 arguments
	 JRST	NUMBE0		;Assume radix ten output
	MOVE	T1,@6(L)	;Get the radix to use
	CAIL	T1,^D2		;Keep it if between 2
	CAILE	T1,^D36		; and 36

NUMBE0:	 MOVEI	T1,^D10		;Set number of the radix to 10
	MOVEM	T1,IRAD		;Save the radix for later

;Get number of digits beyond decimal point (NDIG)

	SKIPGE	T1,NDIG		;Skip if number of digits beyond d. p. is positive
	 ADDI	T1,1		;Add 1 to the number digits trucated
	CAILE	T1,^D8		;Skip if less than 9 digits behind the d. p.
	 MOVEI	T1,^D8		;Set the number of digits to 8
	MOVNM	T1,NUMDIG	;Save negative as argument to EXP2.
;Convert number to string of characters in NUMTXT, put the count in NUMDIG

	PUSHJ	P,N2TEXT	;Convert number to text
>  ;End of IFN FTTYPE

IFN FTTYPE,<	;Create data for $NUMBER block for $TYPE macro
	MOVX	T1,<<NM%SNG_N%%TYP>+T2>  ;Set up for the $NUM substitution
					 ;Note:  Regular floating point
					 ;       and a width of 0
	MOVE	T2,NDIG		;Get the number of fractional digits
	CAILE	T2,^D8		;Skip if less 9 fractional digits
	 MOVEI	T2,^D8		;Assume 8 fractional digits
	CAIGE	T2,^D0		;Skip if an the decimal point is wanted
	 MOVEI	T2,NM%INT	;Output only the integer portion
	LSH	T2,N%%DEC	;Put it in the correct place for
	OR	T1,T2		; floating-point output routine
	MOVE	T2,FNUMB	;Get the number to output
	SETZM	NUMDIG		;Reset the character count

;Convert number to string of characters in NUMTXT, put the count in NUMDIG

	$TYPE	(N,,$NUM,<|>,N,,NUMOUT)
>  ;End of IFN FTTYPE

;Plot the data

	MOVE	T1,[INTEGER NUMTXT]
	MOVEM	T1,ARGLST+3	;Point 4th arg to NUMTXT
	MOVE	T1,[INTEGER NUMDIG]
	MOVEM	T1,ARGLST+5	;Point 6th arg to NUMDIG

	MOVEI	L,ARGLST	;Point to arguments
	PUSHJ	P,SYMBOL##	;Do the plotting

	MOVE	L,NUMB16	;Restore AC 16
CPOPJ:	POPJ	P,		;Return


IFN FTTYPE,<	;Character output routine called by $TYPE
NUMOUT:	IDPB	T1,NUMPNT	;Save the character
	AOS	NUMCNT		;Increment the digit count
	POPJ	P,		;Return
>  ;End of IFN FTTYPE
SUBTTL	NUMBER -- Convert floating point to ASCII

IFE FTTYPE,<	;Use this routine instead of REL:TYPER.REL

N2TEXT:	FLOAT	T1,IRAD		;Convert the radix to floating point
	MOVEM	T1,FRAD		;Save for EXP2.
	MOVEI	L,[-2,,0	  ;2 args
		REAL	FRAD	  ;Base
		INTEGER	NUMDIG	  ;Power to raise base to
		   ]+1		;Point to args
	PUSHJ	P,EXP2.##	;Raise floating-point base to integer exponent
	MOVE	T1,T0		;Duplicate the answer
	FSC	T1,-1		;Set up for rounding
	SKIPGE	FNUMB		;Check to see if it's negative
	 MOVNS	T1		;It was negative, therefore negate
	FADR	T1,FNUMB	;Round the number to be used

;Convert number to properly scaled integer

	FDVR	T1,T0		;Produce a whole number in floating point
IFN FTKA,< PUSHJ  P,IFX.1## >	;Go convert the number to integer
IFE FTKA,< FIX  T1,T1 >		;Convert the number to integer
	JFCL	.+1		;Tell FOROTS to ignore %FRSAPR Integer Overflow
	AOS	NDIG		;Set up to put the d. p. in the right place

;Convert integer to ASCII

	MOVSI	C,-MAXCHR	;AOBJN pointer for character count
	PUSHJ	P,RADOUT	;Go put the number into NUMTXT
	HRRZM	C,NUMDIG	;Store number of characters
	POPJ	P,		;Return from N2TEXT
;Convert integer to ASCII using radix in IRAD

RADOUT:	JUMPGE	T1,RADOU0	;Jump if the number is positive
	MOVNS	T1		;Make the number positive
	MOVEI	D,"-"
	PUSHJ	P,CHAR		;Put a '-' before the number

RADOU0:	SOSE	NDIG		;Skip if a '.' should be output
	 JRST	RADOU1		;Not yet
	MOVEI	D,"."
	HRLM	D,(P)		;Save the '.' for later
	PUSH	P,[RADOU2]	;Set up so POPJ will do the right thing

RADOU1:	IDIV	T1,IRAD		;Divide by proper radix
	MOVEI	D,"0"(T2)	;Convert to ASCII
	CAILE	D,"9"		;Skip if char is a digit
	 ADDI	D,"A"-"9"-1	;Convert the char to a letter
	SKIPG	NDIG		;Skip next test to output trailing zeros
	 JUMPE	T1,CHAR		;Jump and return if no more numbers for output
	HRLM	D,(P)		;Store char on PDL
	PUSHJ	P,RADOU0	;Go get an other number
RADOU2:	HLRZ	D,(P)		;Get char off PDL

CHAR:	AOBJP	C,NUMERR	;Count characters
	IDPB	D,NUMPNT	;Store a char
	POPJ	P,

NUMERR:	MOVE	D,[ASCII/*****/];Too many digits
	MOVEM	D,NUMTXT	;Set up to display
	MOVEI	C,5		; 5 characters
	POPJ	P,		;Unwind the stack
SUBTTL	NUMBER -- Variables

	$LOSEG		;Variables

	-6,,0			;Six args for SYMBOL
ARGLST:	BLOCK	6		;Argument pointers
	;X0=    ARGLST+0	;Address of starting coordinates
	;Y0=    ARGLST+1	; ..
	;HEIGHT=ARGLST+2	;Address of height
	 FNUMB= ARGLST+3	;The floating point number
	;ANGLE= ARGLST+4	;Address of angle
	 NDIG=  ARGLST+5	;The number of digits to be plotted

NUMB16:	BLOCK	1		;Save AC 16
IRAD:	BLOCK	1		;Radix, integer

NUMPNT:	BLOCK	1		;Byte pointer to NUMTXT
NUMDIG:	BLOCK	1		;Number of characters in NUMTXT
NUMTXT:	BLOCK	MAXCHR/5	;Room for 30 digits (including "-" and ".")

IFE FTTYPE,< FRAD: BLOCK 1 >	;Radix, floating point
IFN FTTYPE,<	;The $NUMBER argument block
NUMBLK:	NM%FLT_N%%TYP!NM%SNG_N%%DTP!NM%IMD_N%%DPT!NM%NRM_N%%%NOT!^D5_N%%FRC
	BLOCK	1		;2nd word of $NUMBER block
>  ;End of IFN FTTYPE


	$HISEG

LITS:	PRGEND
SUBTTL	Definitions for SYMBOL and MYPLOT
	SEARCH	PLTUNV	;Search the universal file
TTL	(<SYMBOL - Draws symbols on the plotter>)

	EXTERN	SIND., COSD., TRACE.	;Routines in FORLIB
	EXTERN	PLOT		;Routine to move the pen

	ND SYMDEV,SIXBIT/SYS/	;SYMBOL.DAT resides on SYS:
	ND %0,0			;Temporary I/O channel for reading SYMBOL.DAT
	ND MAXSET,^D20		;Maximum argument for SETSYM (^D127 is abs max)
	ND OLDVAL,999.0		;Flag to continue where last symbol left off
	ND SETSIZ,^D12*200	;Table can be up to 12 blocks long

FT701==0		;Do not use FILOP. with extended channels yet.
IFE FT701,<IF2,<PRINTX	[Using OPEN/LOOKUP on Channel 0 instead of FILOP.]>>

;ACs defined in PLTUNV
	A=P1			;Preserved AC
	B=P2			;Byte pointer
	C=P3			;Counter
	D=P4			;Data
	X=X			;Current position
	Y=Y			; ...
	PURGE	P1,P2,P3,P4
	SAVACL==A		;First AC to save before calling PLOT##
	SAVACH==Y		;Last   "       "       "


;Interface to the PLOT routine.  Destroys T1-T4, preserves A thru Y
;Call:
;	MOVEI	T1,ICODE	;PEN.UP or PEN.DN
;	DMOVE	X,[coordinates in inches]
;	PUSHJ	P,MYPLOT
;	 *return*

MYPLOT:	MOVE	T1,[SAVACL,,SYMB00+SAVACL]
	BLT	T1,SYMB00+SAVACH;Store X,Y,IC in memory
	MOVEI	L,[-3,,0	  ;Three args
		REAL	PLOT.X	  ;X coordinate
		REAL	PLOT.Y	  ;Y coordinate
		INTEGER	PLOT.P	  ;Pen up/down code
		   ]+1		;Point to args
	PUSHJ	P,PLOT##	;Go plot the segment
	MOVE	T1,[SYMB00+SAVACL,,SAVACL]
	BLT	T1,SAVACH	;Restore A,B,C,D,X,Y
	POPJ	P,		;Return from MYPLOT
SUBTTL	SETSYM -- Dispatch, 'QUERY' and 'WIDTH'

;	CALL SETSYM(IFUNC,IARG,IANS)

	ENTRY	%SETSYM		;Set up entry point
	SIXBIT	/SETSYM/
%SETSY:	MOVEM	L,SYMB16	;Preserve AC 16
	MOVE	T1,@0(L)	;Get 1st arg
	ANDCM	T1,[BYTE(7)40,40,40,40,40]	;Translate lower to uppercase
				;(also converts spaces to nulls)
	MOVSI	T2,-FUNLEN	;Set up AOBJN counter
SETSY1:	CAMN	T1,FUNASC(T2)	;Match?
	 JRST	@FUNDSP(T2)	;Yes, do it
	AOBJN	T2,SETSY1	;Try next
	ERRSTR	(<SETSYM - Unknown function>)
	PUSHJ	P,TRACE.##	;Trace the subroutine calls
	POPJ	P,

FUNASC:	ASCII	/TABLE/		;Change symbol tables
	ASCII	/QUERY/		;Return current table number
	ASCII	/WIDTH/		;Get width of a symbol
FUNLEN==.-FUNASC

FUNDSP:	EXP DTABLE,DQUERY,DWIDTH ;Dispatch table


;'QUERY' - Return current table number

DQUERY:	MOVE	T1,NUMB0	;Get old number (+ or -)
	MOVEM	T1,@2(L)	;Return as IANS
	POPJ	P,

;'WIDTH' - Return width of a particular letter

DWIDTH:	MOVE	D,@1(L)		;Get the character
	TLNE	D,774000	;Left justified ASCII?
	 LSH	D,-^D29		;Yes, right justify it
	SUB	D,MINC.N	;Subtract min
	CAMG	D,MAXC.N	;Within range?
	SKIPN	B,IPOINT(D)	;And pointer non-zero
	 POPJ	P,		;No, return 0
	AND	B,[777700,,007777] ;Remove byte count
	ADDI	B,STROKS	;Point to the data area
	ILDB	T1,B		;Get the width of the character
	FLOAT	T1		;To floating point
	FDVR	T1,HITE.N	;Ratio of width/height
	MOVEM	T1,@2(L)	;Return WIDTH fraction
	POPJ	P,
SUBTTL	SETSYM -- 'TABLE' - Change symbol tables

DTABLE:	MOVE	T1,@1(L)	;Get the table to use
	JUMPE	T1,DQUERY	;Zero to return current table
	CAILE	T1,MAXSET	;If out of range,
	 JRST	ISETA3		; return error
	MOVMM	T1,NUMB		;Save it for later
	MOVEM	T1,NUMB0	;Positive means table was set up by ISETAB
	CAMN	T1,OLDSET	;Is this table already set up?
	 JRST	ISETA5		;Yes, use it
	SKIPG	T1		;Positive?
	 SKIPA	T3,USRSYM	;Use SIXBIT/SYMBOL/ for negative (MSETAB)
	  MOVX	T3,SYMDEV	;Use SIXBIT/SYS/ for positive (ISETAB)
	MOVEI	T2,.IODMP	;Dump mode
	SETZ	T4,		;No buffers

IFN FT701,<PRINTX %Need to write 701 code at ISETA1: and ISETA3:>
TOPS20<	PRINTX [The non-701 code at ISETA1: should work with PA1050]>
IFE FT701,<	;Use OPEN/LOOKUP instead of FILOP.
	OPEN	%0,T2		;INIT SYS: or SYMBOL:
	  JRST	ISETA3		;No
	MOVE	T1,USRSYM	;File name 'SYMBOL'
	MOVSI	T2,'DAT'	;Extension
	SETZB	T3,T4		;Implied directory
	LOOKUP	%0,T1		;Find SYMBOL.DAT
	  JRST	ISETA2		;Not there
; The first block is an index, each entry is <-WORD.LENGTH,,BLOCK.NUMBER>

	INPUT	%0,[IOWD MAXSET,SETBUF
			0]	;Read in the index block
	MOVE	T1,NUMB		;Get requested number again
	SKIPN	T3,SETBUF-1(T1)	;Skip if the pointer to table is non-zero
	 JRST	ISETA2		;Go die
	USETI	%0,(T3)		;Get the right block to start with
	CAML	T3,[-SETSIZ,,0]	;If the IOWD is bigger than our buffer
	TLNN	T3,-1		; or zero
	 HRLI	T3,-SETSIZ	;Use the biggest we can handle
	HRRI	T3,BUFFER-1	;Complete RH of IOWD
	SETZ	T4,		;Stop word
	IN	%0,T3		;Read in the data for this table
	  JRST	ISETA4		;Data read in OK
	PFALL	ISETA2		;Error, return -1

ISETA2:	RELEAS	%0,		;Release the DSK
ISETA3:	SETO	T2,		;Set the error indicator to bad
	JRST	ISETA6		;Return the value

ISETA4:	RELEAS	%0,		;Release the DSK
>  ;End of IFE FT701
	MOVE	T1,NUMB0	;Get the number of the stoke table read in
	MOVEM	T1,OLDSET	;Save the number for later
	HLLZS	SYMPTR		;Not centered and not normal yet

ISETA5:	SETZ	T2,		;Set error indicator to good
ISETA6:	MOVE	L,SYMB16	;Restore arg pointer
	MOVEM	T2,@2(L)	;Store IERR as 3rd arg to SETSYM
	POPJ	P,		;End of ISETAB/MSETAB

IFN FTMKTB,<	SUBTTL	MKTBL & SETABL -- Entry points>
SUBTTL	SYMBOL -- Get args, set up mode

;  Subroutine SYMBOL - this routine plots char and symbols

;  Calling sequence:
;	CALL SYMBOL (X,Y,HEIGHT,ICHAR,ANGLE,NUMCHR)

	ENTRY	SYMBOL		;Set up entry point
USRSYM:	SIXBIT	/SYMBOL/	;Routine name and file name
SYMBOL:	MOVEM	L,SYMB16	;Preserve L across call
	MOVEI	T0,ARGS-1	;Set up to get the arguments
	PUSH	T0,@0(L)	;Get X
	PUSH	T0,@1(L)	;Get Y
	PUSH	T0,@2(L)	;Get HEIGHT
	PUSH	T0,3(L)		;Get the address of ICHAR
	PUSH	T0,@4(L)	;Get ANGLE
	PUSH	T0,@5(L)	;Get NUMCHR
	MOVEI	T0,@ICHAR	;The start point of the ICHAR array
	HRLI	T0,(POINT 7,)	;Make into a byte pointer
	MOVEM	T0,ICHAR	;Save it for later

;Mode 1 (NUMCHR positive) Plot left justified string of characters
;Mode 2 (NUMCHR zero)	  Plot single right justified ASCII character
;Mode 3 (NUMCHR -2 or -3) Plot centered symbol, with or without connecting line
;The RH of TABLE is IPOINT for normal chars, is IPOINT+140 for centered symbols

	SKIPL	T1,NUMCHR	;Mode 1 or 2?  (Normal)
	 JRST	SYMNOR		;Yes, set up for normal symbols
				;Mode 3 (Centered)
SYMCEN:	HRRZ	T2,SYMPTR	;Get address of current table
	CAIE	T2,IPOINT	;Set up for normal symbols?
	 JUMPN	T2,SYMBO1	;No, mode 3 set up if it is not zero
	SKIPN	HITE.C		;Skip if there is a centered symbol table height
	 JRST	SYMBER		;Go print an error
	MOVE	T2,[PENU.C,,PENU.$] ;BLT pointer
	BLT	T2,MAXC.$	;Set up PENU.$, HITE.$, MINC.$, and MAXC.$
	SKIPE	T2,MAXC.C	;Should not skip, must have some symbols
	 MOVE	T2,MAXC.N	;Get number of normal symbols
	JUMPE	T2,SYMBER	;Must have something there
	ADDI	T2,IPOINT	;Add to the start of the strokes
	HRRM	T2,SYMPTR	;Set the stroke pointer for mode 3
	JRST	SYMBO1		;Go plot the symbol

SYMNOR:	HRRZ	T2,SYMPTR	;Get the address used to point to strokes
	CAIN	T2,IPOINT	;Check if set for normal symbols
	 JRST	SYMBO1		;Already set up
	MOVE	T2,[PENU.N,,PENU.$] ;BLT pointer
	BLT	T2,MAXC.$	;Set up PENU.$, HITE.$, MINC.$, MAXC.$
	MOVEI	T2,IPOINT	;Get the start of the stroke array
	HRRM	T2,SYMPTR	;Set the stroke pointers for mode 1 and 2
SUBTTL	SYMBOL -- Set up translation and rotation

SYMBO1:	DMOVE	X,SYMB.X	;Get the requested coordinates
	CAMN	X,[OLDVAL]	;If 999.0,
	 SKIPA	X,POS.X		; use old position,
	  MOVEM	X,CRLF.X	; else remember for CR and LF
	CAMN	Y,[OLDVAL]	;Same for Y
	 SKIPA	Y,POS.Y
	  MOVEM	Y,CRLF.Y
	DMOVEM	X,POS.X		;Set current position

	MOVE	T1,NUMCHR	;Get number of chars (negative for centered)
	MOVEI	D,PEN.DN	;Assume centered symbol with connecting line
	CAMN	T1,[-2]		;If -2 draw line from old pen position to
	 PUSHJ	P,MYPLOT	; current position, if -3 do not draw line

	SKIPN	T1,HEIGHT	;Get the height of the symbols
	 MOVE	T1,OLDHIT	;Zero, use previous
	MOVEM	T1,OLDHIT
	FDVR	T1,HITE.$	;Divide by the max deltas allowed
	MOVEM	T1,ROTSIN	;Save for later
	MOVEM	T1,ROTCOS	; ..
	MOVEI	L,[-1,,0	  ;One arg
		REAL	ANGLE	  ;Number of degrees
		   ]+1		;Point to args
	PUSHJ	P,SIND.		;Go get the sine of the angle
	FMPRM	T0,ROTSIN	;Multiply by the height and save
	PUSHJ	P,COSD.		;Go get the cosine of the angle
	FMPRM	T0,ROTCOS	;Multiply by the height and save

	SKIPLE	T1,NUMCHR	;Get the character count
	 JRST	SYMLOP		;Output a string for NUMCHR=positive
	MOVE	D,@ICHAR	;Get the char code
	JUMPE	T1,SYMLP0	;Do single ASCII character if NUMCHR=0
	JRST	SYMLP2		;Do centered symbol if NUMCHR=negative
SUBTTL	SYMBOL -- Main loop, do a character

SYMLOP:	ILDB	D,ICHAR		;Get next character from string

;Special case CR and LF

SYMLP0:	SETO	C,		;Set counter in case of match
	MOVSI	T1,-SCHARS	;Get AOBJN pointer

SYMLP1:	HLRZ	T2,SCHTAB(T1)	;Get a special character
	HRRZ	T3,SCHTAB(T1)	; and its dispatch addr
	CAMN	D,T2		;Match?
	 JRST   (T3)		;Yes, handle specially
	AOBJN	T1,SYMLP1	;No try next one
	SUB	D,MINC.$	;Subtract offset (so that 0=space)

SYMLP2:	JUMPL	D,SYMB08	;Jump if the char is to small
	CAMGE	D,MAXC.$	;Skip if the char is to big
	SKIPN	B,@SYMPTR	;Get pointer to data, indexed by D
	 JRST	SYMB08		;Punt off this char, pointer is zero
	LDB	C,[POINT 12,B,23];Get the number of strokes in the char
	AND	B,[777700,,007777];Remove the count from byte pointer
	ADDI	B,STROKS	;Add in the relocation of the data area
	ILDB	T1,B		;Get the width of the character
	MOVEM	T1,SPC.X	;Save for it later
	ILDB	T1,B		;Get the subtractive offset for the X direction
	MOVEM	T1,SUB.X	;This is used to allow negative offsets
	ILDB	T1,B		;Get the offset for Y
	MOVEM	T1,SUB.Y	;This allows for negative Y, for descenders
	SOJLE	C,SYMB06	;Jump if this is the space character
				;The first move is with the pen up
SYMB03:	MOVEI	D,PEN.UP	;Set to raise the pen on this move

SYMB04:	ILDB	X,B		;Get the X value to be used
	CAMN	X,PENU.$	;Is it the pen up command?
	 SOJA	C,SYMB03	;Yes, next movement will be with the pen up
	ILDB	Y,B		;Get the Y value to be used
	SUB	Y,SUB.Y		;Relocate the Y value

SYMB05:	SUB	X,SUB.X		;Relocate the X value
	FLOAT	X		;Convert the number to floating point
	FLOAT	Y		;Convert the number to floating point
	PUSHJ	P,ROT.XY	;Rotate coordinates
	FADR	X,POS.X		;Add in the offset for the starting position
	FADR	Y,POS.Y		; for this character
	PUSHJ	P,MYPLOT	;Go move the pen to X, Y, and pen up/down in D
	MOVEI	D,PEN.DN	;Make the next segment be for pen down
	SOJG	C,SYMB04	;Loop if more strokes left to do
	JUMPL	C,SYMB07	;Stop if finished with character
				;Here on last movement for this char
SYMB06:	MOVE	X,SPC.X		;Get the width of this character
SYMB6A:	MOVEI	Y,0		;At the baseline
	MOVEI	D,PEN.UP	;Raise the pen
	JRST	SYMB05		; and move to the end of the character

SYMB07:	DMOVEM	X,POS.X		;Save current position as start of next char

;Here when finished with the current character

SYMB08:	SOSLE	NUMCHR		;Skip if no more char left
	 JRST	SYMLOP		;Loop for next character

;The coordinates for the start of the next symbol (POS.X and POS.Y) are
;available by calling subroutine WHERE(X,Y).

	MOVE	L,SYMB16	;Restore L
	POPJ	P,		;Return from SYMBOL

;ROT.XY - Normalize the data and rotate the coordinates

;X0 = arg to SYMBOL, X1 = data from table, X2 = arg passed to PLOT
;SIZE = HEIGHT / <data for tallest letter>
;X2 = X0 + ( X1*SIZE*COS(ANG) - Y1*SIZE*SIN(ANG) )
;Y2 = Y0 + ( Y1*SIZE*COS(ANG) + X1*SIZE*SIN(ANG) )

ROT.XY:	MOVE	T3,X		;Get a copy of X
	MOVE	T4,Y		;Get a copy of Y
	FMPR	T4,ROTSIN	;Rotate the X
	FMPR	X,ROTCOS	; ..
	FSBR	X,T4		; ..
	FMPR	T3,ROTSIN	;Rotate the Y
	FMPR	Y,ROTCOS	; ..
	FADR	Y,T3		; ..
	POPJ	P,
SUBTTL	SYMBOL -- Control characters, CR, LF, etc

;Table of special control characters

SCHTAB:	10,,DOBS	;Backspace
	11,,DOTAB	;Horizontal tab
	12,,DOLF	;Linefeed
	15,,DOCR	;Carriage return
	16,,DOSO	;Shift-out (superscript)
	17,,DOSI	;Shift-in (subscript)
	36,,DORS	;Record Separator (newline = CR + LF)
SCHARS==.-SCHTAB

DOTAB:	SKIPA	X,SPC.X		;TAB - go forward
DOBS:	MOVN	X,SPC.X		;BS - backspace
	JRST	SYMB6A		;Move with pen up

DOCR:	DMOVE	X,CRLF.X	;CR - Reset to start of line
	DMOVEM	X,POS.X		;Change position
	JRST	SYMB08		;Loop if more chars to do

DORS:	DMOVE	X,CRLF.X	;RS (Record Separator) - Do CR and LF
	DMOVEM	X,POS.X

DOLF:	MOVN	Y,HITE.$	;LF - Get height of chars (in increments f.p.)
	FMPRI	Y,(1.5)		;Leave room for descenders
	MOVEI	X,0		;No change in X coordinate
	PUSHJ	P,ROT.XY	;Account for rotation
	FADRM	X,CRLF.X	;Update position of "column 1"
	FADRM	Y,CRLF.Y
DOLF1:	FADRB	X,POS.X		;Update position
	FADRB	Y,POS.Y
	JRST	SYMB08		;Loop if more chars to do

DOSO:	SKIPA	Y,HITE.$	;SO - Get +height for superscripts
DOSI:	MOVN	Y,HITE.$	;SI - Get -height for subscripts
	FDVRI	Y,(2.0)		;Move only half that distance
	MOVEI	X,0		;No change in X coordinate
	PUSHJ	P,ROT.XY	;Account for rotation
	JRST	DOLF1		;Do a +/- half linefeed

SYMBER:	ERRSTR	(<SYMBOL - No centered symbols in this table>)
	PUSHJ  P,TRACE.##	;Trace the subroutine calls
	POPJ	P,		;Return to caller
SUBTTL	SYMBOL -- Variables

	$LOSEG

SYMB00:	BLOCK	17		;Place to save caller's ACs, 0-16
	PLOT.P=SYMB00+D		;Pen up/down data
	PLOT.X=SYMB00+X		;X position
	PLOT.Y=SYMB00+Y		;Y position
	SYMB16=SYMB00+L		;Accumulator L

POS.X:	BLOCK	2		;Starting position for current character
	POS.Y=POS.X+1
CRLF.X:	BLOCK	2		;Saved position for doing CR or LF
	CRLF.Y=CRLF.X+1
OLDHIT:	BLOCK	1		;Previous non-zero height

COUNT:	BLOCK	1		;Char count
NUMB:	BLOCK	1		;Argument to ISETAB/MSETAB (always positive)
NUMB0:	BLOCK	1		;Positive if from ISETAB, negative if from MSETAB
ROTSIN:	BLOCK	1		;SIN(ANG) * HEIGHT / <data for tallest char>
ROTCOS:	BLOCK	1		; for rotation


ARGS:	BLOCK 6			;Temporary storage
	SYMB.X=ARGS+0		;X coord for NUMBER or SYMBOL
	SYMB.Y=ARGS+1		;Y coord for NUMBER or SYMBOL
	HEIGHT=ARGS+2		;Size of characters
	ICHAR= ARGS+3		;Start of string to plot
	ANGLE= ARGS+4		;Degrees of rotation
	NUMCHR=ARGS+5		;Number of characters in ICHAR
SUBTTL	ISETAB table #1 -- Pointers

	.DIRECTIVE FLBLST	;First line binary list

SETBUF:	BLOCK	MAXSET		;First block of SYMBOL.DAT, index pointers

;These 3 values get set by ILDB at the start of each character plotted
SPC.X:	BLOCK	1		;The spacing for this char
SUB.X:	BLOCK	1		;The X subtractive value
SUB.Y:	BLOCK	1		;The Y subtractive value

;These 4 values get set by BLT from PENU.C or PENU.N
PENU.$:	BLOCK	1		;If X = PENU.$ the next movement will be pen up
HITE.$:	BLOCK	1		;The max height of the char in delta units
MINC.$:	BLOCK	1		;Subtract this off to get rid of unwanted chars
MAXC.$:	BLOCK	1		;Number of graphic characters this mode

SYMPTR:	Z	0,0(D)		;RH is IPOINT for NORMAL, IPOINT+140 for CENTER
OLDSET:	EXP	1		;The last symbol table used, table #1 is set up

BUFFER:		;This data gets overwritten when ISETAB is called
PENU.N:	37			;Pen-up code, -1 in 5 bits
HITE.N:	8.0			;Units of height in floating point
MINC.N:	40			;First normal character (octal code for SPACE)
MAXC.N:	140			;Number of normal chars (96 including RUBOUT)
PENU.C:	7			;-1 expressed in 3 bits
HITE.C:	6.0			;Units of height in floating point
MINC.C:	0			;First centered symbol
MAXC.C:	^D26			;Number of centered symbols
	EXP 0,0,0,0, 0,0,0,0	;Reserved for future expansion
;The next 200 words are byte pointers, the address an offset from STROKS,
; the count of strokes is in the middle 12 bits.  All zero if no such character
IPOINT:	<POINT 5,000,-1>+01_^D12	;space	40
	<POINT 5,000,14>+06_^D12	;!	41
XLIST	;Save paper
	<POINT 5,002,04>+06_^D12	;"	42
	<POINT 5,003,29>+14_^D12	;#	43
	<POINT 5,006,34>+21_^D12	;$	44
	<POINT 5,013,24>+25_^D12	;%	45
	<POINT 5,021,24>+14_^D12	;&	46
	<POINT 5,025,09>+03_^D12	;'	47
	<POINT 5,026,09>+05_^D12	;(	50
	<POINT 5,027,29>+05_^D12	;)	51
	<POINT 5,031,14>+14_^D12	;*	52
	<POINT 5,034,19>+06_^D12	;+	53
	<POINT 5,036,09>+07_^D12	;,	54
	<POINT 5,040,14>+03_^D12	;-	55
	<POINT 5,041,14>+06_^D12	;.	56
	<POINT 5,043,09>+03_^D12	;/	57
	<POINT 5,044,09>+15_^D12	;0	60
	<POINT 5,047,34>+04_^D12	;1	61
	<POINT 5,051,09>+12_^D12	;2	62
	<POINT 5,054,09>+14_^D12	;3	63
	<POINT 5,057,29>+05_^D12	;4	64
	<POINT 5,061,14>+13_^D12	;5	65
	<POINT 5,064,24>+13_^D12	;6	66
	<POINT 5,067,34>+04_^D12	;7	67
	<POINT 5,071,09>+21_^D12	;8	70
	<POINT 5,076,09>+13_^D12	;9	71
	<POINT 5,101,19>+14_^D12	;:	72
	<POINT 5,104,34>+15_^D12	;;	73
	<POINT 5,110,24>+04_^D12	;<	74
	<POINT 5,111,34>+06_^D12	;=	75
	<POINT 5,113,24>+04_^D12	;>	76
	<POINT 5,114,34>+13_^D12	;?	77
LIST
	<POINT 5,120,04>+24_^D12	;@	100
	<POINT 5,125,29>+07_^D12	;A	101
XLIST
	<POINT 5,127,29>+16_^D12	;B	102
	<POINT 5,133,29>+11_^D12	;C	103
	<POINT 5,136,19>+10_^D12	;D	104
	<POINT 5,140,34>+12_^D12	;E	105
	<POINT 5,143,24>+07_^D12	;F	106
	<POINT 5,145,24>+13_^D12	;G	107
	<POINT 5,150,34>+11_^D12	;H	110
	<POINT 5,153,14>+11_^D12	;I	111
	<POINT 5,155,29>+11_^D12	;J	112
	<POINT 5,160,14>+11_^D12	;K	113
	<POINT 5,162,29>+06_^D12	;L	114
	<POINT 5,164,19>+06_^D12	;M	115
	<POINT 5,166,14>+05_^D12	;N	116
	<POINT 5,167,34>+12_^D12	;O	117
	<POINT 5,172,34>+10_^D12	;P	120
	<POINT 5,175,14>+15_^D12	;Q	121
	<POINT 5,201,04>+13_^D12	;R	122
	<POINT 5,204,09>+13_^D12	;S	123
	<POINT 5,207,19>+06_^D12	;T	124
	<POINT 5,211,09>+07_^D12	;U	125
	<POINT 5,213,14>+04_^D12	;V	126
	<POINT 5,214,24>+06_^D12	;W	127
	<POINT 5,216,19>+06_^D12	;X	130
	<POINT 5,220,09>+07_^D12	;Y	131
	<POINT 5,222,09>+05_^D12	;Z	132
	<POINT 5,223,29>+05_^D12	;[	133
	<POINT 5,225,14>+03_^D12	;\	134
	<POINT 5,226,14>+05_^D12	;]	135
	<POINT 5,227,34>+07_^D12	;^	136
	<POINT 5,231,34>+07_^D12	;_	137
	<POINT 5,233,34>+03_^D12	;`	140
	<POINT 5,234,34>+17_^D12	;a	141
	<POINT 5,241,09>+14_^D12	;b	142
	<POINT 5,244,24>+11_^D12	;c	143
	<POINT 5,247,14>+15_^D12	;d	144
	<POINT 5,253,04>+13_^D12	;e	145
	<POINT 5,256,14>+11_^D12	;f	146
	<POINT 5,260,34>+17_^D12	;g	147
	<POINT 5,265,09>+11_^D12	;h	150
	<POINT 5,267,29>+10_^D12	;i	151
	<POINT 5,272,04>+10_^D12	;j	152
	<POINT 5,274,14>+11_^D12	;k	153
	<POINT 5,276,29>+03_^D12	;l	154
	<POINT 5,277,29>+17_^D12	;m	155
	<POINT 5,303,34>+11_^D12	;n	156
	<POINT 5,306,19>+12_^D12	;o	157
	<POINT 5,311,19>+14_^D12	;p	160
	<POINT 5,314,34>+14_^D12	;q	161
	<POINT 5,320,14>+10_^D12	;r	162
	<POINT 5,322,24>+13_^D12	;s	163
	<POINT 5,325,34>+11_^D12	;t	164
	<POINT 5,330,19>+10_^D12	;u	165
	<POINT 5,332,34>+04_^D12	;v	166
	<POINT 5,334,09>+06_^D12	;w	167
	<POINT 5,336,04>+06_^D12	;x	170
	<POINT 5,337,29>+07_^D12	;y	171
	<POINT 5,341,29>+05_^D12	;z	172
	<POINT 5,343,14>+10_^D12	;{	173
	<POINT 5,345,29>+03_^D12	;|	174
	<POINT 5,346,29>+10_^D12	;}	175
LIST	
	<POINT 5,351,09>+05_^D12	;~	176
	<POINT 5,352,29>+04_^D12	;<DEL>	177
;Centered symbols
	<POINT 3,354,04>+10_^D12	;	0
	<POINT 3,355,20>+14_^D12	;	1
XLIST
	<POINT 3,357,23>+06_^D12	;	2
	<POINT 3,360,26>+07_^D12	;	3
	<POINT 3,361,35>+07_^D12	;	4
	<POINT 3,363,08>+07_^D12	;	5
	<POINT 3,364,17>+07_^D12	;	6
	<POINT 3,365,26>+06_^D12	;	7
	<POINT 3,366,29>+07_^D12	;	8
	<POINT 3,367,35>+07_^D12	;	9
	<POINT 3,371,08>+16_^D12	;	10
	<POINT 3,373,23>+15_^D12	;	11
	<POINT 3,375,32>+07_^D12	;	12
	<POINT 3,377,05>+04_^D12	;	13
	<POINT 3,377,32>+11_^D12	;	14
	<POINT 3,401,14>+04_^D12	;	15
	<POINT 3,402,05>+14_^D12	;	16
	<POINT 3,404,05>+10_^D12	;1	17
	<POINT 3,405,17>+13_^D12	;2	18
	<POINT 3,407,11>+20_^D12	;3	19
	<POINT 3,411,35>+11_^D12	;4	20
	<POINT 3,413,14>+14_^D12	;5	21
	<POINT 3,415,14>+17_^D12	;6	22
	<POINT 3,417,32>+11_^D12	;7	23
	<POINT 3,421,14>+24_^D12	;8	24
LIST
	<POINT 3,424,26>+17_^D12	;9	25
	BLOCK 200-<.-IPOINT>	;Unused pointers
SUBTTL	ISETAB table #1 -- Data

STROKS:	BYTE (5) 10,0,6 (5)10,0,6,2,	6,2,7,-1,2,10,2
	BYTE (5) 15 (5)10,0,6,2,14,2,	16,-1,4,16,4,14 (5)10
	BYTE (5) 0,6,2,7,2,15,-1,	4,15,4,7,-1,6,11
XLIST	;More of the same
	BYTE (5) 0,11,-1,0,13,6,13	(5)10,0,6,0,10,2,6
	BYTE (5) 4,6,6,10,4,12,2,	12,0,14,2,16,4,16
	BYTE (5) 6,14,-1,4,16,4,6,	-1,2,6,2,16 (5)10,0
	BYTE (5) 6,0,6,6,14,1,14,	0,13,0,12,1,11,2
	BYTE (5) 11,3,12,3,13,2,14,	-1,4,11,3,10,3,7
	BYTE (5) 4,6,5,6,6,7,6,		10,5,11,4,11 (5)10,0
	BYTE (5) 6,6,6,1,13,1,15,	2,16,3,16,4,15,0
	BYTE (5) 11,0,7,1,6,3,6,	5,10 (5)10,0,6,2,14
	BYTE (5) 4,16 (5)10,0,6,2,6,	0,10,0,14,2,16 (5)10
	BYTE (5) 0,6,0,6,2,10,2,	14,0,16 (5)10,0,6,0
	BYTE (5) 10,4,14,-1,2,14,2,	10,-1,4,10,0,14,-1
	BYTE (5) 0,12,4,12 (5)10,0,6,	2,7,2,13,-1,0,11
	BYTE (5) 4,11 (5)10,0,6,3,6,	3,7,2,7,2,6,3
	BYTE (5) 6,2,5 (5)10,0,6,0,	11,4,11 (5)10,0,6,2
	BYTE (5) 6,3,6,3,7,2,7,		2,6 (5)10,0,6,0,6
	BYTE (5) 6,14 (5)10,0,6,0,7,	6,15,-1,6,14,4,16
	BYTE (5) 2,16,0,14,0,10,2,	6,4,6,6,10,6,14
	BYTE (5)10,0,6,1,14,3,16,	3,6 (5)10,0,6,0,14
	BYTE (5) 0,15,1,16,5,16,6,	15,6,13,0,7,0,6
	BYTE (5) 6,6 (5)10,0,6,0,15,	1,16,5,16,6,15,6
	BYTE (5) 14,4,12,6,10,6,7,	5,6,1,6,0,7 (5)10
	BYTE (5) 0,6,5,6,5,16,0,	11,6,11 (5)10,0,6,0
	BYTE (5) 7,1,6,4,6,6,10,	6,11,5,12,1,12,0
	BYTE (5) 11,0,16,6,16 (5)10,0,	6,0,11,1,12,5,12
	BYTE (5) 6,11,6,7,5,6,1,	6,0,7,0,12,4,16
	BYTE (5)10,0,6,0,16,6,16,	1,6 (5)10,0,6,1,12
	BYTE (5) 0,11,0,7,1,6,5,	6,6,7,6,11,5,12
	BYTE (5) 6,13,6,15,5,16,1,	16,0,15,0,13,1,12
	BYTE (5) 5,12 (5)10,0,6,2,6,	6,12,6,15,5,16,1
	BYTE (5) 16,0,15,0,13,1,12,	5,12,6,13 (5)10,0,6
	BYTE (5) 2,6,3,6,3,7,2,		7,2,6,-1,2,12,3
	BYTE (5) 12,3,13,2,13,2,12	(5)10,0,6,3,6,3,7
	BYTE (5) 2,7,2,6,3,6,2,		5,-1,2,12,3,12,3
	BYTE (5) 13,2,13,2,12 (5)10,0,	6,3,7,0,12,3,15
	BYTE (5)10,0,6,0,10,6,10,	-1,6,12,0,12 (5)10,0
	BYTE (5) 6,0,7,3,12,0,15	(5)10,0,6,1,15,2,16
	BYTE (5) 4,16,5,15,5,14,3,	12,3,10,-1,3,7,3
	BYTE (5) 6 (5)10,0,6,1,6,0,	7,0,13,1,14,5,14
	BYTE (5) 6,13,6,10,5,7,4,	10,4,13,-1,4,12,3
	BYTE (5) 13,2,13,1,12,1,11,	2,10,3,10,4,11 (5)10
	BYTE (5) 0,6,0,6,3,16,6,	6,-1,1,11,5,11 (5)10
	BYTE (5) 0,6,0,6,0,16,5,	16,6,15,6,13,5,12
	BYTE (5) 0,12,-1,5,12,6,11,	6,7,5,6,0,6 (5)10
	BYTE (5) 0,6,6,15,5,16,2,	16,0,14,0,10,2,6
	BYTE (5) 5,6,6,7 (5)10,0,6,	0,6,0,16,4,16,6
	BYTE (5) 14,6,10,4,6,0,6	(5)10,0,6,0,6,0,16
	BYTE (5) 6,16,-1,4,12,0,12,	-1,0,6,6,6 (5)10,0
	BYTE (5) 6,0,6,0,16,6,16,	-1,4,12,0,12 (5)10,0
	BYTE (5) 6,6,15,5,16,2,16,	0,14,0,10,2,6,4
	BYTE (5) 6,6,10,6,12,4,12	(5)10,0,6,0,6,0,16
	BYTE (5) -1,6,16,6,6,-1,0,	12,6,12 (5)10,0,6,1
	BYTE (5) 6,5,6,-1,3,6,3,	16,-1,1,16,5,16 (5)10
	BYTE (5) 0,6,1,7,2,6,3,		6,4,7,4,16,-1,2
	BYTE (5) 16,6,16 (5)10,0,6,1,	6,1,16,-1,1,12,5
	BYTE (5) 16,-1,1,12,5,6 (5)10,	0,6,0,6,0,16,-1
	BYTE (5) 0,6,6,6 (5)10,0,6,	0,6,0,16,3,13,6
	BYTE (5) 16,6,6 (5)10,0,6,0,	6,0,16,6,6,6,16
	BYTE (5)10,0,6,0,10,0,14,	2,16,4,16,6,14,6
	BYTE (5) 10,4,6,2,6,0,10	(5)10,0,6,0,6,0,16
	BYTE (5) 5,16,6,15,6,13,5,	12,0,12 (5)10,0,6,0
	BYTE (5) 10,0,14,2,16,4,16,	6,14,6,10,4,6,2
	BYTE (5) 6,0,10,-1,4,10,6,	6 (5)10,0,6,0,6,0
	BYTE (5) 16,5,16,6,15,6,13,	5,12,0,12,-1,2,12
	BYTE (5) 6,6 (5)10,0,6,0,10,	2,6,4,6,6,10,4
	BYTE (5) 12,2,12,0,14,2,16,	4,16,6,14 (5)10,0,6
	BYTE (5) 3,6,3,16,-1,0,16,	6,16 (5)10,0,6,0,16
	BYTE (5) 0,7,1,6,5,6,6,		7,6,16 (5)10,0,6,0
	BYTE (5) 16,3,6,6,16 (5)10,0,	6,0,16,0,6,3,11
	BYTE (5) 6,6,6,16 (5)10,0,6,	0,6,6,16,-1,0,16
	BYTE (5) 6,6 (5)10,0,6,0,16,	3,13,6,16,-1,3,13
	BYTE (5) 3,6 (5)10,0,6,0,16,	6,16,0,6,6,6 (5)10
	BYTE (5) 0,6,3,4,0,4,0,		16,3,16 (5)10,0,6,0
	BYTE (5) 14,6,6 (5)10,0,6,3,	4,6,4,6,16,3,16
	BYTE (5)10,0,6,0,13,3,16,	6,13,-1,3,16,3,6
	BYTE (5)10,0,6,3,7,0,12,	3,15,-1,0,12,6,12
	BYTE (5)10,0,6,2,16,4,14	(5)10,0,6,0,11,1,12
	BYTE (5) 3,12,4,11,4,6,-1,	4,10,3,11,1,11,0
	BYTE (5) 10,0,7,1,6,3,6,	4,7 (5)10,0,6,0,6
	BYTE (5) 0,15,-1,0,11,1,12,	3,12,4,11,4,7,3
	BYTE (5) 6,1,6,0,7 (5)10,0,	6,4,11,3,12,1,12
	BYTE (5) 0,11,0,7,1,6,3,	6,4,7 (5)10,0,6,0
	BYTE (5) 7,0,11,1,12,3,12,	4,11,4,7,3,6,1
	BYTE (5) 6,0,7,-1,4,6,4,	15 (5)10,0,6,4,7,3
	BYTE (5) 6,1,6,0,7,0,11,	1,12,3,12,4,11,4
	BYTE (5) 10,0,10 (5)10,0,6,2,	6,2,14,3,15,4,15
	BYTE (5) 5,14,-1,0,13,4,13	(5)10,0,6,4,11,3,12
	BYTE (5) 1,12,0,11,0,7,1,	6,3,6,4,7,-1,4
	BYTE (5) 12,4,5,3,4,1,4,	0,5 (5)10,0,6,0,6
	BYTE (5) 0,15,-1,0,11,1,12,	3,12,4,11,4,6 (5)10
	BYTE (5) 0,6,3,14,3,13,-1,	3,12,3,7,4,6,5
	BYTE (5) 6 (5)10,0,6,3,14,3,	13,-1,3,12,3,5,2
	BYTE (5) 4,1,4 (5)10,0,6,0,	6,0,15,-1,0,10,2
	BYTE (5) 12,-1,0,10,2,6 (5)10,	0,6,2,6,2,15 (5)10
	BYTE (5) 0,6,0,6,0,12,-1,	0,11,1,12,2,12,3
	BYTE (5) 11,3,6,-1,3,11,4,	12,5,12,6,11,6,6
	BYTE (5)10,0,6,0,6,0,12,	-1,0,11,1,12,2,12
	BYTE (5) 3,11,3,6 (5)10,0,6,	0,7,0,11,1,12,3
	BYTE (5) 12,4,11,4,7,3,6,	1,6,0,7 (5)10,0,6
	BYTE (5) 0,4,0,12,-1,0,11,	1,12,3,12,4,11,4
	BYTE (5) 7,3,6,1,6,0,7		(5)10,0,6,4,11,3,12
	BYTE (5) 1,12,0,11,0,7,1,	6,3,6,4,7,-1,4
	BYTE (5) 12,4,4 (5)10,0,6,0,	6,0,12,-1,0,11,1
	BYTE (5) 12,3,12,4,11 (5)10,0,	6,0,7,1,6,3,6
	BYTE (5) 4,7,3,10,1,10,0,	11,1,12,3,12,4,11
	BYTE (5)10,0,6,2,15,2,7,	3,6,4,6,5,7,-1
	BYTE (5) 1,13,3,13 (5)10,0,6,	0,12,0,7,1,6,3
	BYTE (5) 6,4,7,4,12,4,6		(5)10,0,6,0,12,2,6
	BYTE (5) 4,12 (5)10,0,6,0,12,	0,6,2,10,4,6,4
	BYTE (5) 12 (5)10,0,6,0,6,4,	12,-1,0,12,4,6 (5)10
	BYTE (5) 0,6,0,12,2,6,-1,	4,12,1,4,0,4 (5)10
	BYTE (5) 0,6,0,12,4,12,0,	6,4,6 (5)10,0,6,3
	BYTE (5) 16,2,15,2,13,0,11,	2,7,2,5,3,4 (5)10
	BYTE (5) 0,6,2,4,2,16 (5)10,	0,6,0,16,1,15,1
LIST
	BYTE (5) 13,3,11,1,7,1,5,	0,4 (5)0,0,6,2,20	;350 & 351 = "~"
	BYTE (5) 3,21,4,20,5,21 (5)0,	0,6,1,20,4,20,4		;352 & 353
	BYTE (5) 17 (3) 3,3,3,3,5,5,5,5,1,1  ;Start of centered symbols
	BYTE (3) 1,1,5,3,5,3,3,3,3,3,3,5			;355
	BYTE (3) 4,5,5,4,5,2,4,1,2,1,1,2,	1,4,2,5,3,5,3,3,3,3,3,3
	BYTE (3) 5,5,1,1,1,3,5,3,3,3,3,3,	3,5,3,1,3,3,1,3,5,3,3,3
XLIST
	BYTE (3) 3,3,3,5,5,1,1,3,3,1,5,5,	1,3,3,3,3,3,3,5,5,3,3,1
	BYTE (3) 1,3,3,5,3,3,3,3,3,3,1,3,	5,5,3,1,3,3,5,3,3,3,3,3
	BYTE (3) 1,1,5,5,1,5,5,1,3,3,3,3,	3,1,5,5,5,1,1,5,1,-1,3,3
	BYTE (3) 3,3,3,1,5,3,3,5,5,3,3,3,	1,3,3,3,3,3,5,5,4,4,2,4
	BYTE (3) 1,5,2,4,2,2,1,1,2,2,4,2,	5,1,4,2,4,4,3,3,3,3,3,3
	BYTE (3) 5,3,1,3,3,5,5,1,1,3,3,5,	3,1,3,3,3,5,1,1,5,3,3,3
	BYTE (3) 3,3,3,3,5,5,1,5,5,1,1,1,	3,3,3,3,3,3,5,3,1,3,3,3
	BYTE (3) 3,3,3,6,5,1,1,4,5,4,1,1,	3,6,-1,3,3,3,3,3,1,3,5,3
	BYTE (3) 3,3,3,3,3,2,0,4,0,5,1,5,	5,4,6,2,6,1,5,1,1,2,0,-1
	BYTE (3) 3,3,3,3,3,2,5,3,6,3,0,2,	0,4,0,-1,3,3,3,3,3,1,5,2
	BYTE (3) 6,4,6,5,5,5,4,1,1,1,0,5,	0,-1,3,3,3,3,3,1,5,2,6,4
	BYTE (3) 6,5,5,5,4,4,3,2,3,4,3,5,	2,5,1,4,0,2,0,1,1,-1,3,3
	BYTE (3) 3,3,3,1,6,1,3,5,3,-1,4,6,	4,0,-1,3,3,3,3,3,1,1,2,0
	BYTE (3) 4,0,5,1,5,2,4,3,1,3,1,6,	5,6,-1,3,3,3,3,3,5,5,4,6
	BYTE (3) 2,6,1,5,1,1,2,0,4,0,5,1,	5,2,4,3,2,3,1,2,-1,3,3,3
	BYTE (3) 3,3,1,5,1,6,5,6,5,5,3,1,	3,0,-1,3,3,3,3,3,1,5,2,6
	BYTE (3) 4,6,5,5,5,4,4,3,2,3,4,3,	5,2,5,1,4,0,2,0,1,1,1,2
	BYTE (3) 2,3,1,4,1,5,-1,3,3,3,3,3,	1,1,2,0,4,0,5,1,5,5,4,6
LIST
	BYTE (3) 2,6,1,5,1,4,2,3,4,3,5,4,	-1,3,3,0  ;End of centered data
	BLOCK	SETSIZ-<.-BUFFER>	;Reserve the rest of the space
	SETEND==.-1

	$HISEG		;For the literals

LITS:	END