/TK4013.PA-GRAPHICS TERMINAL SIMULATOR
/
/
/JOHN P. RANCK
/DEPARTMENT OF CHEMISTRY
/ELIZABETHTOWN COLLEGE
/ELIZABETHTOWN, PENNA. 17022
/
/
/
/
/
/A PROGRAM TO SIMULATE A TEKTRONIX 4013 GRAPHICS TERMINAL
/CONNECTED TO A HOST COMPUTER (DEC-10 IN THIS APPLICATION)
/
/
/HARDWARE REQUIRED:
/
/	1. PDP-8 WITH 8K MEMORY (OR CONDITIONALLY 4K; SEE BELOW)
/	2. TEKTRONIX 613 (OR 611 PRESUMABLY) OR SIMILAR STORAGE MONITOR
/	3. VC8E X-Y INTERFACE FOR STORAGE MONITOR
/	4. KL8E OR SIMILAR SERIAL LINE INTERFACE FOR HOST COMPUTER
/	5. TELETYPE OR SIMILAR TERMINAL.  DECWRITER WITH NUMERIC KEYPAD
/	   FOR CURSOR CONTROL IS EXCELLENT
/	6. (OPTIONAL) 10 V. FULL SCALE X-Y PLOTTER WITH REMOTE PEN LIFT
/	   SUCH AS HEWLETT PACKARD 7015A
/	7. (OPTIONAL) USER CONSTRUCTED ANALOG SWITCH CIRCUIT FOR COMPUTER
/	   MUTING OF PLOTTER SERVO MOTORS
/PROGRAM DESCRIPTION:
/
/THE PROGRAM ITSELF OCCUPIES ALL OF MEMORY FIELD 0 EXCEPT FOR THE LAST
/PAGE (7600-7777) WHICH IS LEFT FOR THE MONITOR.  A SHORTENED 
/VERSION OF UTIL10.PA (DECUS NO. 8-XXX) WHICH CONTAINS A GROUP OF
/ROUTINES TO LOG ON AND OFF THE DEC-10 AND TO SET LINE CHARACTERISTICS
/RESIDES IN LOCATIONS 6600-7577.  THESE ROUTINES MAY BE REPLACED BY
/OTHERS ADAPTED TO OTHER HOST COMPUTERS OR THESE FUNCTIONS MAY
/BE PERFORMED MANUALLY, IN WHICH CASE THESE MEMORY LOCATIONS ARE NOT USED.
/
/THE ENTIRE MEMORY FIELD 1 (EXCEPT FOR 17600-17777) IS USED AS A CIRCULAR
/BUFFER FOR CHARACTERS RECEIVED FROM THE HOST COMPUTER.  THIS IS 
/EXTRAVAGANT AND UNNECESSARY; IT WAS DONE ONLY BECAUSE THE MEMORY WAS
/AVAILABLE.  IF UTIL10 OR ITS EQUIVALENT IS NOT USED IN FIELD 0, THIS
/BUFFER MAY BE SHORTENED AND PLACED IN LOCATIONS 6600-7577 AND THE ENTIRE
/PROGRAM CAN BE PACKED INTO A 4K SYSTEM.  IT MAY BE NECESSARY TO USE
/THE XON AND XOF COMMANDS TO THE HOST MONITOR TO PREVENT THE HOST FROM
/OVERFILLING THIS SMALLER BUFFER.  NORMALLY THE PROGRAM CAN KEEP UP
/WITH A 1200 BAUD SERIAL TRANSMISSION FROM THE HOST COMPUTER AND THE
/LARGER BUFFER IS SUPERFLUOUS.  AN EXCEPTION OCCURS WHEN THE (SLOW)
/PLOTTER IS USED.
/
/IN THIS IMPLEMENTATION LOCATION 17777, WHICH IS IN THE SYS AREA BUT
/WHICH IS UNUSED BY THE MONITOR, HAS BEEN USED AS A STATUS WORD
/FOR THE HOST COMPUTER.
/
/THE MAIN PROGRAM (BEGINNING AT LOCATION 200) IS A SHORT ENDLESS LOOP WHICH
/	1. CHECKS THE HEYBOARD FOR A CHARACTER AND UPON FINDING ONE EITHER
/		A. EXERCISES THE APPROPRIATE "TERMINAL" CONTROL OR
/		B. TRANSMITS THE CHARACTER TO THE HOST COMPUTER
/   AND 2. CHECKS THE BUFFER AREA FOR UNTREATED CHARACTERS FROM THE HOST AND
/	   UPON FINDING ONE, INITIATES THE APPROPRIATE "GRAPHICS TERMINAL"
/	   RESPONSE.
/COMMUNICATION WITH THE HOST COMPUTER IS HANDLED BY THE INTERRUPT SERVICE
/ROUTINE IN LOCATIONS 50-101.
/SPECIAL KEYBOARD FUNCTIONS
/
/PAGE, RESET, VIEW, ETC., KEYS AND CURSOR CONTROLS NORMALLY
/FOUND ON THE TEKTRONIX TERMINALS ARE ABSENT FROM THE DECWRITER KEYBOARD
/AND MUST BE SIMULATED.
/
/	TILDE-	(ASCII 176) IS USED FOR THE PAGE COMMAND.
/	GRAVE- 	(ASCII 140) IS USED TO RESTORE OR INTENSIFY THE DISPLAY
/		AS WELL AS A TRAP CHARACTER.
/
/	THE FOLLOWING CONTROL CHARACTERS HAVE SPECIAL EFFECTS WHEN THEY
/	IMMEDIATELY FOLLOW THE TRAP CHARACTER (GRAVE).
/
/	CTRL R-	RESET.
/	CTRL A-	SELECT ALTERNATE (APL) CHARACTER SET (CRT ONLY).
/	CTRL N-	SELECT NORMAL CHARACTER SET.
/	CTRL T-	PRINT ALPHANUMERICS ON TTY.
/	CTRL D-	PRINT ALPHANUMERICS ON CRT DISPLAY.
/	CTRL P-	PLOTTER ON (CRT OFF).
/	CTRL C-	PLOTTER OFF (CRT ON).
/	CTRL E-	EXIT TO OS/8 MONITOR.
/	CTRL K-	LOG OFF HOST AND EXIT TO OS/8 MONITOR.
/
/THE NUMERIC KEYPAD IS USED FOR CURSOR CONTROL.  ON DECWRITERS WITHOUT
/NUMERIC KEYPAD, ANOTHER GROUP OF 3 X 3 KEYS MAY BE USED.  PRESSING
/ANY OF THE 8 CHARACTERS AROUND THE PERIPHERY OF THE 3 X 3 ARRAY 
/(I.E., 1 THROUGH 4 AND 6 THROUGH 9) RESULTS IN MOVING THE CURSOR ONE
/STEP IN THE DIRECTION THAT THE KEY IS FROM THE CENTER OF THE ARRAY
/(I.E., 1=SOUTHWEST, 2=SOUTH, 6=EAST, 7=NORTHWEST, ETC.).
/LARGE (8 RASTER POINTS) AND SMALL (1 RASTER POINT) STEPSIZES EXIST.
/THE LARGE STEP IS INITIALLY CHOSEN.  THE SMALL STEP IS SPECIFIED BY
/PRESSING THE "." (PERIOD) KEY (THE SMALLER KEY AT THE BOTTOM OF THE NUMERIC
/KEYPAD) AND THE LARGER STEP IS SPECIFIED BY PRESSING THE "0" (ZERO)
/KEY (THE LARGER KEY AT THE BOTTOM OF THE NUMERIC KEYPAD). THE REPEAT KEY IS
/USEFUL FOR MOVING THE CURSOR LONG DISTANCES.  PRESSING THE "5" KEY IN THE
/CENTER OF THE NUMERIC KEYPAD RETURNS THE CURSOR TO ITS ORIGINAL OR 
/HOME POSITION (WHERE IT WAS BEFORE CURSOR CONTROL WAS EXERCISED).
/THE PROGRAM IS THOROUGHLY DOCUMENTED WITH COMMENTS IN NEARLY EVERY LINE OF THE
/LISTING AND A LOGIC FLOW CHART IS GIVEN AT THE BEGINNING OF EACH SUBROUTINE.
/
/
/ALL PARAMETERS TO BE SET BY THE USER ARE CONTAINED IN THE FIRST PAGE OF CODE.
/CONDITIONAL ASSEMBLY PARAMETERS KEEP THE CODE AS SHORT AS POSSIBLE.
/THE CODE ACTUALLY ASSEMBLED WILL BE SSHORTER IF (1) THE EXTENDED ARITHMETIC
/ELEMENT WITH HARDWARE MULTIPLY/DIVIDE IS PRESENT, OR (2) NO PLOTTER
/IS PRESENT.
/ASSEMBLY PARAMETERS TO BE SET BY USER

	EAE=0		/=1 IF EXTENDED ARITHMETIC ELEMENT (HARDWARE
			/MULTIPLY-DIVIDE) IS AVAILABLE
	PLOTER=1	/=1 IF X-Y PLOTTER IS AVAILABLE

/DEVICE CODES TO BE SET BY USER

	DISDEV=05	/DEVICE CODE SET FOR VC8E (OS/8 DEC STANDARD=05)
	INTEN=16	/DEVICE CODE FOR INPUT FROM HOST COMPUTER (SET ON KL8-E BOARD)
	OUTTEN=17	/DEVICE CODE FOR OUTPUT FROM HOST COMPUTER (SET ON KL8-E BOARD)

/VC8E COMMANDS

	DICL=10^DISDEV+6001
	DISD=10^DISDEV+6002
	DILX=10^DISDEV+6003
	DILY=10^DISDEV+6004
	DIXY=10^DISDEV+6005
	DILE=10^DISDEV+6006
	DIRE=10^DISDEV+6007

/KL8E INPUT COMMANDS

	TENKCF=10^INTEN+6000
	TENKSF=10^INTEN+6001
	TENKIE=10^INTEN+6005
	TENKRB=10^INTEN+6006

/KL8E OUTPUT COMMANDS

	TENTFL=10^OUTTEN+6000
	TENTSF=10^OUTTEN+6001
	TENTCF=10^OUTTEN+6002
	TENTLS=10^OUTTEN+6006

/DEFINITION OF MULTIPLY AND DIVIDE COMMANDS, DEPENDING ON WHETHER EAE PRESENT

	IFZERO EAE <
	MUY=JMS I [MULTPY
	DVI=JMS I [DIVIDE
	>

	IFNZRO EAE <
	MUY=7405
	DVI=7407
	>


	FIXTAB
/INTERRUPT IS VECTORED TO LOCATION 0

	*0
	0
	JMP INTER	/JUMP TO INTERRUPT WERVICE ROUTINE



/STATUS REGISTER

STATUS,	0		/A SOFTWARE STATUS REGISTER USED FOR MANY HOUSEKEEPING
			/FUNCTIONS (SEE FOLLOWING)



/BITS FOR STATUS REGISTER

MODMSK,	6000		/COMBIIATION OF BITS 0 AND 1
GRMODE,	4000		/BIT 0; GRAPHICS (GR) MODE
GIMODE,	2000		/BIT 1; GRAPHIC INPUT (GI) MODE
	IFNZRO PLOTER <
ALTDIS,			/BIT 2; ALTERNATE DISPLAY DEVICE (PLOTTER)
HCMODE,	1000		/OR HARDCOPY (HC) MODE
	>
ALTAN,	0400		/BIT 3; ALTERNATE ALPHANUMERIC DEVICE (TTY)
ALTCHR,	0200		/BIT 4; ALTERNATE CHARACTER SET
MARGIN,	0100		/BIT 5; MARGIN 1 (ALTERNATE MARGIN)
ESCTRP,	0040		/BIT 6; ESCAPE CHARACTER RECEIVED FROM HOST
KBTRAP,	0020		/BIT 7; TRAP CHARACTER RECEIVED FROM KEYBOARD



/AUTO-INDEX REGISTERS (BE SURE NOT TO MOVE FROM MEMORY LOCATIONS 10-17)

RECPT,	-1		/POINTER TO BUFFER FOR INCOMING CHARACTER
GETPT,	-1		/POINTER TO BUFFER FOR OUTGOING CHARACTER



/BITS FOR VC8E STATUS REGISTER

CRSBT,	0040		/CURSOR BIT
MCRSBT,	7737		/COMPLEMENT OF CURSOR BIT
STORE,	0020		/STORE BIT
ERASBT,	0010		/ERASE BIT
	IFNZRO PLOTER <
PLTON,	0004		/PLOTTER SERVO ON BIT
PLTOF,	7773		/COMPLEMENT OF PLOTTER SERVO BIT
PEN,	0002		/PEN DOWN BIT
PENUP,	7775		/COMPLEMENT OF PEN DOWN BIT
	>



/SOME CONSTANTS AND VARIABLES CONVENIENTLY STORED ON PAGE ZERO

HOMEX,	-1000		/X COORDINATE OF "HOME" LOCATION
HOMEY,	577		/Y COORDINATE OF "HOME" LOCATION
LASTX,	0		/LAST X COORDINATE DISPLAYED
LASTY,	0		/LAST Y COORDINATE DISPLAYED
NEWX,	0		/NEXT X COORDINATE TO BE DISPLAYED
NEWY,	0		/NEXT Y COORDINATE TO BE DISPLAYED
CURSX,	0		/X COORDINATE OF CURSOR
CURSY,	0		/Y COORDINATE OF CURSOR

KBMON,	7600		/ADDRESS TO RETURN TO OS/8

	IFNZRO PLOTER <
VECTIM,	-2400		/TIME CONSTANT IN VECTOR PLOTTING ROUTINE
PENTIM,	-3000		/TIME CONSTANT IN PEN RAISE/LOWER ROUTINE
	>
MTTWID,	-204		/MINUS NO. CHARACTERS PER LINE ON CONSOLE OUTPUT DEVICE
			/132 DECIMAL = 204 OCTAL FOR DECWRITER; 72 DECIMAL = 110 OCTAL FOR TTY)
MDIWID,	-112		/74 CHARACTERS LINE WIDTH FOR DISPLAY
DKVECT,	0		/FLAG FOR DARK VECTOR
PNTTAB,	0		/POINTER TO CHARACTER TABLES
CHARCT,	0		/COUNT OF CHARACTERS IN PRESENT LINE
LINECT,	0		/COUNT OF LINES IN THIS COLUMN ON DISPLAY DEVICE
TENTPF,	0		/SOFTWARE FLAG FOR OUTPUT SIDE OF HOST COMPUTER INTERFACE



/INTERRUPT SERVICE ROUTINE
/	SAVE ACCUMULATOR AND LINK
/	SELECT (DEVICE)
/	/	(DEC-10 INPUT)
/	/	/	READ CHARACTER
/	/	/	STORE CHARACTER IN BUFFER
/	/	/	IF (END OF BUFFER) RESET POINTER
/	/	////////FIN
/	/	(DEC-10 OUTPUT)
/	/	/	CLEAR HARDWARE FLAG
/	/	/	SET SOFTWARE FLAG
/	/	////////FIN
/	////////FIN
/	RESTORE ACCUMULATOR AND LINK
/	TURN INTERRUPT FACILITY ON
////////FIN




INTER,	DCA SAVEAC	/SAVE AC
	RAL
	DCA SAVEL	/AND LINK
	TENKSF		/IS INTERRUPT FOR HOST INPUT?
	JMP OUTFLT	/NO; TRY HOST OUTPUT
	TENKRB		/YES; READ CHARACTER
	CDF 10		/CHANGE TO FIELD 1
	DCA I RECPT	/AND STORE CHAR IN BUFFER AND INCREMENT POINTER
	CDF 0		/RESET FIELD 0
	TAD RECPT	/CHECK BUFFER POINTER
	TAD M7577	/IS IT POINTING
	SZA CLA		/TO SYSTEM AREA?
	JMP INTEX	/NO; EXIT INTERRUPT SERVICE ROUTINE
	CMA		/YES; RESET POINTER TO -1
	DCA RECPT	/SO IT INCREMENTS TO LOCATION 0 NEXT
	JMP INTEX	/AND EXIT INTERRUPT SERVICE ROUTINE
OUTFLT,	TENTSF		/IS INTERRUPT BECAUSE HOST OUTPUT CHARACTER CLEAR?
	JMP INTEX	/NO; EXIT INTERRUPT SERVICE ROUTINE
	TENTCF		/YES; CLEAR FLAG SO NO FURTHER INTERRUPTS OCCUR
	ISZ TENTPF	/AND SET SOFTWARE FLAG
INTEX,	CLA CLL		/EXIT INTERRUPT SERVICE ROUTINE
	TAD SAVEL	/GET LINK
	RAR		/AND RESTORE IT
	TAD SAVEAC	/GET AC
	ION		/TURN INTERRUPT FACILITY ON
	JMP I 0		/AND RETURN FROM WHENCE INTERRUPT OCCURRED

SAVEAC,	0		/LOCATION TO HOLD AC DURING INTERRUPT
SAVEL,	0		/LOCATION TO HOLD LINK DURING INTERRUPT
M7577,	-7577		/ADDRESS BEFORE BEGINNING OF SYSTEM AREA



/TO INITIALIZE-
/	FIX ALL DEVICE FLAGS
/	SET DISPLAY TO STORE
/	ERASE-
/	SET AN MODE
/	SET AND DEVICE TO DISPLAY
/	SET GR DEVICE TO DISPLAY
/	SET NORMAL CHARACTER SET
/	HOME-
/	LOGIN DEC-10
/	TURN DEC-10 INTERRUPT ON
////////FIN


INIT,	0		/BEGINNING OF INITIALIZE PROCEDURE
	KSF; TENKCF; TFL; TENTFL; DICL	/INITIALIZE ALL FLAGS
	TAD STORE	/SET DISPLAY
	DILE		/TO STORE
	JMS ERASE	/ERASE SCREEN
	DCA STATUS	/CLEAR STATUS REGISTER (AN MODE;NORMAL DEVICES AND CHAR SET)
	JMS HOME	/MOVE BEAM TO HOME POSITION
	JMS UTIL10	/USE UTILITY ROUTINE TO LOGIN DEC-10 IF NECESSARY
	4000		/ARGUMENT FOR LOGIN
	KIE		/SET TTY INTERRUPT OFF
	IAC
	TENKIE		/SET HOST INTERRUPT ON
	CLA
	ION		/ENABLE INTERRUPT FACILITY
	JMP I INIT	/EXIT INITIALIZE PROCEDURE




/TO EXIT-
/	ERASE AND SET TO NON-STORE
/	TURN DEC-10 INTERRUPT OFF
/	IF (PLOTTER PRESENT) TURN PLOTTER OFF PROPERLY
/	IF (^K ON KEYBOARD) LOG OFF DEC-10
/	RETURN TO KEYBOARD MONITOR
////////FIN


EXIT,	IOF		/TURN INTERRUPT FACILITY OFF
	TAD ERASBT	/CLEAR ALL BITS IN DISPLAY REGISTER
	DILE		/EXCEPT ERASE BIT WHICH WILL CLEAR AFTER ERASE
	CLA
	TENKIE		/SET HOST COMPUTER INTERRUPT OFF
	IFNZRO PLOTER <
	TAD HCMODE	/GET HC MODE BIT
	AND STATUS	/FROM STATUS REGISTER
	SZA CLA		/IF PLOTTER IS TURNED ON
	JMS CLRHC	/TURN IT OFF PROPERLY
	>
	TAD KBCHAR	/GET LAST CHARACTER ENTERED FROM KEYBOARD
	TAD MCTRLK	/AND COMPARE TO ^K
	SZA CLA		/IS IT ^K?
	JMP .+3		/NO; MUST BE ^E; SIMPLE EXIT
	JMS UTIL10	/YES; LOG OFF DEC-10
	0		/ARGUMENT FOR LOG OFF
	JMP I KBMON	/AND EXIT THE PROGRAM BY RETURNING TO KB MONITOR


/TO HOME-
/	MOVE TO HOME POSITION
/	FIX AN CURSOR
/	SET MARGIN 0
/	RESET CHARACTER COUNTER
/	RESET LINE COUNTER
////////FIN

HOME,	0
	TAD HOMEX	/GET X COORDINATE OF HOME LOCATION
	DCA NEWX	/AND STORE IT AS NEXT LOCATION
	TAD HOMEY	/GET Y COORDINATE OF HOME LOCATION
	DCA NEWY	/AND STORE IT AS NEXT LOCATION
	ISZ DKVECT	/SET DARK VECTOR
	JMS DISVEC	/AND MOVE TO HOME
	JMS ACRSON	/TURN ALPHANUMERIC CURSOR ON
			/(SUBROUTINE WILL CHECK FOR AN MODE)
	TAD MARGIN	/GET MASK FOR ALTERNATE MARGIN BIT
	CMA		/COMPLEMENT IT
	AND STATUS	/SO IT MASKS ALL OTHER BITS FROM STATUS REGISTER
	DCA STATUS	/AND EFFECTIVELY CLEARS THE MARGIN BIT
	DCA CHARCT	/SET CHARACTER COUNTER TO ZERO
	DCA LINECT	/SET LINE COUNTER TO ZERO
	JMP I HOME	/EXIT HOME SUBROUTINE

	PAGE









/TEKTRONIX 4010 GRAPHICS TERMINAL PROGRAM--BEGINNING OF PROGRAM
/	INITIALIZE-
/	WHILE (TRUE)  ,I.E. FOREVER
/	/	IF (CHARACTER AT KEYBOARD)
/	/	/	READ KEYBOARD
/	/	/	HANDLE-KEYBOARD-CHARACTER
/	/	////////FIN
/	/	TEST-FOR-HOST-CHARACTER AND IF PRESENT HANDLE-HOST-CHARACTER
/	////////FIN
////////FIN


	JMS INIT	/INITIALIZE-
FOREVR,	KSF		/HAS CHARACTER BEEN RECEIVED FROM KEYBOARD?
	JMP .+3		/NO; CHECK HOST FOR INPUT
	KRB		/YES; READ IT
	JMS KBHNDL	/AND TAKE CARE OF IT
	JMS HOCHIN	/TO CHACK FOR CHARACTER FROM HOST AND TAKE CARE OF IT IF ANY
	JMP FOREVR	/LOOP ENDLESSLY; THE PROGRAM IS EXITED BY KEYBOARD COMMAND




/TO TEST-FOR-HOST-CHARACTER
/	IF (CHARACTER PRESENT)
/	/	IF (END OF BUFFER) RESET POINTER
/	/	GET CHARACTER FROM HOST
/	/	HANDLE HOST CHARACTER
/	////////FIN
////////FIN




HOCHIN,	0
	TAD RECPT	/GET INPUT POINTER TO BUFFER
	CIA		/AND COMPARE IT
	TAD GETPT	/TO OUTPUT POINTER
	SNA CLA		/SAME?
	JMP HOINEX	/YES; NOTHING FROM HOST COMPUTER SO LEAVE
	CDF 10		/NO; CHANGE TO FIELD 1
	TAD GETPT	/GET BUFFER OUTPUT POINTER
	TAD M7576	/COMPARE TO NEXT TO LAST LOCATION IN BUFFER
	SZA CLA		/SAME?
	JMP NOTLST	/NO; LEAVE IT ALONE
	CMA		/YES; RESET
	DCA GETPT	/POINTER TO -1
	TAD I L7577	/GET LAST CHARACTER
	SKP
NOTLST,	TAD I GETPT	/GET NEXT CHARACTER
	CDF 0		/RESET DATA FIELD
	JMP HOHNDL	/GO HANDLE HOST CHARACTER
HOINEX,	JMP I HOCHIN	/EXIT FROM HOST CHARACTER SUBROUTINE

M7576,	-7576
L7577,	7577




/TO ERASE-
/	WHEN (HC MODE)
/	/	TYPE MESSAGE FOR NEW SHEET
/	/	MOVE PEN AWAY
/	/	WAIT-FOR-KEYBOARD-ENTRY
/	/	MOVE PEN BACK
/	////////FIN
/	ELSE ERASE DISPLAY
////////FIN

ERASE,	0
	IFNZRO PLOTER <
	TAD HCMODE	/GET HC MODE BIT
	AND STATUS	/MASK FROM STATUS WORD
	SNA CLA		/HC MODE?
	JMP ERAS	/NO; SO ERASE SCREEN
	TAD (ERATXT	/YES; GET STARTING ADDRESS OF TELETYPE MESSAGE
	DCA TYTXPT	/AND STORE AS POINTER
	JMS TYPTXT	/GO TYPE THE MESSAGE
	JMS KBWAIT	/AND WAIT FOR USER RESPONSE ON KEYBOARD
	JMP ERASEX	/GO TO EXIT
	>
ERAS,	TAD ERASBT	/GET ERASE BIT
	MQL		/PUT IT IN MQ
	DIRE		/READ VC8E REGISTER
	MQA		/ADD ERASE BIT
	DILE		/AND STORE IN VC8E REGISTER
ERASEX,	JMP I ERASE	/EXIT ERASE SUBROUTINE

	IFNZRO PLOTER <
ERATXT,	TEXT /PUT CLEAN PAPER ON PLOTTER; PRESS KEY WHEN READY/
/TO SET-HC-MODE////////////////////////////////////////////
/	SET STATUS WORD
/	TURN CURSOR OFF
/	TURN ON SERVO
/	TYPE MESSAGE
/	MOVE PEN AWAY
/	WAIT-FOR-KB-INPUT
/	MOVE PEN BACK
////////FIN


SETHC,	0
	TAD HCMODE	/GET HC MODE BIT
	MQL		/STORE IN MQ REGISTER
	TAD STATUS	/GET STATUS REGISTER
	MQA		/SET HC MODE BIT
	DCA STATUS	/AND PUT ALL BACK IN STATUS REGISTER
	TAD PLTON	/GET PLOTTER SERVO ON BIT
	MQL		/PUT IT IN MQ
	DIRE		/READ BC8E REGISTER
	AND MCRSBT	/MASK ALL BUT CURSOR BIT(I.E.,TURN CURSOR OFF)
	MQA		/SET PLOTTER SERVO BIT
	DILE		/AND RELOAD VC8E REGISTER
	TAD (SETTXT	/GET BEGINNING OF TELETYPE MESSAGE
	DCA TYTXPT	/STORE IT AS A POINTER
	JMS TYPTXT	/GO TYPE IT
	JMS KBWAIT	/AND WAIT FOR USER RESPONSE
	JMP I SETHC	/EXIT SET HARD COPY ROUTINE

SETTXT,	TEXT /PREPARE PLOTTER; PRESS KEY WHEN READY/






/TO CLEAR-HC-MODE
/	CLEAR STATUS WORD
/	TURN CURSOR ON
/	MOVE PEN AWAY
/	TURN SERVO OFF
////////FIN


CLRHC,	0
	TAD P777	/GET VALUE OF MAXIMUM X COORDINATE
	DILX		/AND LOAD IT INTO X DAC
	JMS WAITSL	/WAIT FOR PEN TO SLEW OFF PAGE
	TAD HCMODE	/GET HC MODE BIT
	CMA		/COMPLEMENT IT TO MAKE MASK TO
	AND STATUS	/MASK ALL OTHER BITS FROM STATUS REGISTER
	DCA STATUS	/RESTORE STATUS REGISTER WITH HC BIT OFF
	DIRE		/READ VC8E REGISTER
	AND PLTOF	/MASK ALL BITS EXCEPT PLOTTER SERVO BIT
			/(I.E., TURN SERVO OFF)
	DILE		/AND RELOAD VC8E REGISTER
	JMS ACRSON	/TURN AN CURSOR ON (IF AN MODE)
	JMP I CLRHC	/EXIT CLEAR HC MODE SUBROUTINE

P777,	777		/MAXIMUM X COORDINATE
	>





	PAGE
/TO HANDLE-KB-CHARACTER
/	WHEN (KEYBOARD TRAP SET)
/	/	CLEAR KEYBOARD TRAP
/	/	SELECT (CHARACTER)
/	/	/	(^R)	RESET-
/	/	/	(^N)	SET NORMAL CHARACTER SET
/	/	/	(^A)
/	/	/	/	SET ALTERNATE CHARACTER SET
/	/	/	/	SET AN DEVICE TO DISPLAY
/	/	/	////////FIN
/	/	/	(^D)	SET AN DEVICE TO DISPLAY
/	/	/	(^T)	UNLESS (ALTERNATE CHARACTER SET) SET AN DEVICE TO TELETYPE
/	/	/	(^P)	IF (PLOTTER) SET-HC-MODE
/	/	/	(^C)	IF (PLOTTER) CLEAR-HC-MODE
/	/	/	(^E)	EXIT-
/	/	/	(^K)	EXIT-(WITH LOG OFF)
/	/	/	(`)
/	/	/	/	VIEW-
/	/	/	/	SET KEYBOARD TRAP
/	/	/	////////FIN
/	/	////////FIN
/	////////FIN
/	ELSE
/	/	SELECT (CHARACTER)
/	/	/	(~)	PAGE-
/	/	/	(`)
/	/	/	/	VIEW-
/	/	/	/	SET KEYBOARD TRAP
/	/	/	////////FIN
/	/	/	(OTHERWISE)
/	/	/	/	WHEN (GI MODE)
/	/	/	/	/	SELECT (CHARACTER)
/	/	/	/	/	/	(CR)	RETURN-CHARACTER-AND-COORDIANTES
/	/	/	/	/	/	(NUMERAL OR PERIOD) CONTROL CURSOR
/	/	/	/	/	/	(OTHERWISE) HOLD CHARACTER FOR TRANSMIT
/	/	/	/	/	////////FIN
/	/	/	/	////////FIN
/	/	/	/	ELSE TRANSMIT-TO-HOST
/	/	/	////////FIN
/	/	////////FIN
/	/////////FIN
////////FIN
KBHNDL,	0
	DCA KBCHAR	/STORE CHARACTER TEMPORARILY
	TAD STATUS	/GET STATUS WORD
	AND KBTRAP	/MASK KEYBOARD TRAP BIT
	SNA CLA		/IS TRAP SET?
	JMP KBTPCL	/NO; JUMP AHEAD
	TAD KBTRAP	/YES; GET TRAP BIT
	CMA		/AND FORM MASK TO CLEAR IT
	AND STATUS	/MASK ALL OTHER BITS FROM STATUS WORD
	DCA STATUS	/AND RESET STATUS WORD WITH TRAP BIT CLEAR
SELCTR,	TAD KBCHAR	/GET KEYBOARD CHARACTER
	TAD MCTRLR	/ADD MINUS ^R
	SZA CLA		/IS IT ^R?
	JMP SELCTN	/NO; CHECK NEXT OPTION
	JMS RESET	/YES; RESET
	JMP KBHNEX	/AND JUMP TO SUBROUTINE EXIT

SELCTN,	TAD KBCHAR	/GET KEYBOARD CHARACTER
	TAD MCTRLN	/ADD MINUS ^N
	SZA CLA		/IS IT ^N?
	JMP SELCTA	/NO; CHECK NEXT OPTION
	TAD ALTCHR	/YES; GET ALTERNATE CHARACTER SET BIT
	JMP CLRSTA	/AND EXIT SUBROUTINE THROUGH BIT CLEAR SEQUENCE

SELCTA,	TAD KBCHAR	/GET KEYBOARD CHARACTER
	TAD MCTRLA	/ADD MINUS ^A
	SZA CLA		/IS IT ^A?
	JMP SELCTD	/NO; CHECK NEXT OPTION
	TAD ALTAN	/YES; GET ALTERNATE ALPHANUMERIC DEVICE BIT
	CMA		/AND FORM COMPLEMENTARY MASK
	AND STATUS	/MASK ALL OTHER BITS FROM STATUS WORD
	DCA STATUS	/AND RESET STATUS WORD
	TAD ALTCHR	/GET  ALTERNATE CHARACTER SET BIT
	JMP SETSTA	/AND EXIT SUBROUTINE THROUGH BIT SET SEQUENCE

SELCTD,	TAD KBCHAR	/GET KEYBOARD CHARACTER
	TAD MCTRLD	/ADD MINUS ^D
	SZA CLA		/IS IT ^D?
	JMP SELCTT	/NO; CHECK NEXT OPTION
	JMS ACRSON	/YES; TURN ALPHANUMERIC CURSOR ON
	TAD ALTAN	/GET ALTERNATE ALPHANUMERIC DEVICE (TTY) BIT
	JMP CLRSTA	/AND EXIT SUBROUTINE THROUGH BIT CLEAR SEQUENCE

SELCTT,	TAD KBCHAR	/GET KEYBOARD CHARACTER
	TAD MCTRLT	/ADD MINUS ^T
	SZA CLA		/IS IT ^T?
	JMP SELCTP	/NO; CHECK NEXT OPTION
	TAD ALTCHR	/YES; GET ALTERNATE CHARACTER SET BIT
	AND STATUS	/AND MASK FROM STATUS WORD
	SZA CLA		/IS ALTERNATE CHARACTER SET REQUIRED?
	JMP KBHNEX	/YES; SO EXIT SUBROUTINE WITHOUT SWITCHING TO TTY
			/WHICH CAN'T PRINT ALTERNATE CHARACTER SETS
	JMS ACRSOF	/NO; TURN ALPHANUMERIC CURSOR OFF
	TAD ALTAN	/GET ALTERNATE ALPHANUMERIC DEVICE BIT
	JMP SETSTA	/AND EXIT SUBROUTINE THROUGH BIT SET SEQUENCE
SELCTP, TAD KBCHAR	/GET KEYBOARC CHARACTER
	IFNZRO PLOTER <
	TAD MCTRLP	/ADD MINUS ^P
	SZA CLA		/IS IT ^P?
	JMP SELCTC	/NO; CHECK NEXT OPTION
	JMS SETHC	/YES; SET HC MODE
	JMP KBHNEX	/AND EXIT SUBROUTINE

SELCTC,	TAD KBCHAR	/GET KEYBOARD CHARACTER
	TAD MCTRLC	/ADD MINUS ^C
	SZA CLA		/IS IT ^C?
	JMP SELCTE	/NO; CHECK NEXT OPTION
	JMS CLRHC	/YES; CLEAR HC MODE
	JMP KBHNEX	/AND EXIT SUBROUTINE

SELCTE,	TAD KBCHAR	/GET KEYBOARD CHARACTER
	>
	TAD MCTRLE	/ADD MINUS ^E
	SNA CLA		/IS IT ^E?
	JMP EXIT	/YES; EXIT PROGRAM

SELCTK,	TAD KBCHAR	/GET KEYBOARD CHARACTER
	TAD MCTRLK	/ADD MINUS ^K
	SNA CLA		/IS IT ^K?
	JMP EXIT	/YES; EXIT THE PROGRAM

SELVIE,	TAD KBCHAR	/GET KEYBOARD CHARACTER
	TAD MVIEW	/ADD MINUS `
	SZA CLA		/IS IT `?
	JMP KBHNEX	/NO; EXIT SUBROUTINE
VIE,	JMS VIEW	/YES; INTENSIFY SCREEN
	TAD KBTRAP	/GET KEYBOARD TRAP BIT
	JMP SETSTA	/AND EXIT SUBROUTINE THROUGH BIT SET SEQUENCE



KBTPCL,	TAD KBCHAR	/KEYBOARD TRAP IS CLEAR; GET KEYBOARD CHARACTER
	TAD MPAGE	/ADD MINUS ~
	SZA CLA		/IS IT ~?
	JMP SELVU	/NO; CHECK NEXT OPTION
	JMS NEWPAG	/YES; GO TO NEW PAGE SEQUENCE
	JMP KBHNEX	/AND EXIT SUBROUTINE

SELVU,	TAD KBCHAR	/GET KEYBOARD CHARACTER
	TAD MVIEW	/ADD MINUS `
	SNA CLA		/IS IT `?
	JMP VIE		/YES; GO TO INTENSIFY SEQUENCE

SELOTH,	TAD GIMODE	/GET GI MODE BIT
	AND STATUS	/AND MASK FROM STATUS WORD
	SNA CLA		/IS GI MODE SET?
	JMP SENDIT	/NO;  CHARACTER IS TO BE TRANSMITTED TO HOST
	TAD KBCHAR	/YES; GET KEYBOARD CHARACTER
	TAD MCRET	/ADD MINUS <CR>
	SZA CLA		/IS IT <CR>?
	JMP CURS	/NO; SO IT MUST BE CURSOR CONTROL
	JMP CLSGIN	/YES; SO PREPARE TO CLESE GI MODE

SENDIT,	TAD KBCHAR	/GET KEYBOARD CHARACTER
	JMS XMITEN	/AND GO SEND IT TO HOST


KBHNEX,	JMP I KBHNDL	/EXIT FROM KEYBOARD SUBROUTINE


KBCHAR,	0		/STORAGE FOR KEYBOARD CHARACTER
MCTRLR,	-222		/MINUS ^R
MCTRLN,	-216		/MINUS ^N
MCTRLA,	-201		/MINUS ^A
MCTRLD,	-204		/MINUS ^D
MCTRLT,	-224		/MINUS ^T
MCTRLC,	-203		/MINUS ^C
MCTRLP,	-220		/MINUS ^P
MCTRLE,	-205		/MINUS ^E
MCTRLK,	-213		/MINUS ^K
MVIEW,	-340		/MINUS `
MPAGE,	-376		/MINUS ~
MCRET,	-215		/MINUS <CR>


	PAGE


CLRSTA,	CMA		/COMPLEMENT AC TO FORM MASK TO CLEAR ALL BITS SAVE THOSE IN AC
	AND STATUS	/AND MASK ALL OTHERS FROM STATUS WORD
	JMP DCASTA	/AND RESET STATUS WORD AS THE SUBROUTINE IS EXITED

SETSTA,	MQL		/PUT BITS TO BE SET INTO MQ REGISTER
	TAD STATUS	/GET STATUS WORD
	MQA		/INCLUSIVE OR ALL BITS TO BE ADDED TO STATUS WORD
DCASTA,	DCA STATUS	/AND RESTORE STATUS WORD
	JMP KBHNEX	/AND EXIT THE SUBROUTINE

CLSGIN,	TAD GICHAR	/GET GRAPHIC INPUT CHARACTER
	JMS XMITEN	/AND SEND IT TO HOST
	JMS RETCOR	/GO TO SUBROUTINE TO SEND COORDINATES TO HOST
	JMP KBHNEX	/AND EXIT THIS SUBROUTINE

/TO READ-CURSOR-INPUT
/	SELECT (CHARACTER)
/	/	(0)	SET LARGE STEP SIZE
/	/	(.)	SET SMALL STEP SIZE
/	/	(5)	RESET CURSOR TO INITIAL VALUE
/	/	(1)	DECREMENT X; DECREMENT Y
/	/	(2)	DECREMENT Y
/	/	(3)	INCREMENT X; DECREMENT Y
/	/	(4)	DECREMENT X
/	/	(6)	INCREMENT X
/	/	(7)	DECREMENT X; INCREMENT Y
/	/	(8)	INCREMENT Y
/	/	(9)	INCREMENT X; INCREMENT Y
/	/	(OTHERWISE) STORE GI CHARACTER
/	////////FIN
/	MOVE-CURSOR
////////FIN




CURS,	TAD KBCHAR	/GET KEYBOARD CHARACTER
	TAD MZERO	/ADD MINUS 0
	SZA CLA		/IS IT 0?
	JMP TRYPER	/NO; TRY NEXT OPTION
	TAD LGSTEP	/YES; GET LARGE CURSOR STEP SIZE
	DCA CURSTP	/AND SET CURSOR STEP SIZE WORD
	JMP KBHNEX	/AND EXIT SUBROUTINE

TRYPER,	TAD KBCHAR	/GET KEYBOARD CHARACTER
	TAD MPER	/ADD MINUS .
	SZA CLA		/IS IT .?
	JMP TRYFIV	/NO; CHECK NEXT OPTION
	TAD SMSTEP	/YES; GET SMALL CURSOR STEP SIZE
	DCA CURSTP	/AND SET CURSOR STEP SIZE WORD
	JMP KBHNEX	/AND EXIT SUBROUTINE

TRYFIV,	TAD KBCHAR	/GET KEYBOARD CHARACTER
	TAD M265	/ADD MINUS 5
	SZA CLA		/IS IT 5?
	JMP TRYNUM	/NO; CHECK NUXT OPTION
	TAD LASTX	/YES; GET LAST X COORDINATE (BEFORE CURSOR MOVEMENT)
	DILX		/AND RESTORE X DAC
	DCA CURSX	/ALSO SET LAST CURSOR VALUE OF X
	TAD LASTY	/GET LAST Y COORDINATE (BEFORE CURSOR MOVEMENT)
	DILY		/RESTORE Y DAC
	DCA CURSY	/AND SET LAST CURSOR VALUE OF Y
	JMP KBHNEX	/EXIT SUBROUTINE

TRYNUM,	TAD KBCHAR	/GET KEYBOARD CHARACTER
	TAD M261	/ADD MINUS 1
	SPA CLA		/IS IT LESS THAN 1?
	JMP NOTCUR	/YES; THEREFORE CHARACTER CANNOT BE CURSOR CONTROL
	TAD KBCHAR	/NO; GET CHARACTER AGAIN
	TAD M272	/ADD MINUS 10
	SMA CLA		/IS IT LESS THAN 10?
	JMP NOTCUR	/NO; THEREFORE CHARACTER CANNOT BE CURSOR CONTROL
	TAD KBCHAR	/YES; CHARACTER IS CURSOR CONTROL; GET IT AGAIN
	AND IIOO	/MASK 10'S (OCTAL) AND 4'S BIT
	SZA CLA		/IS EITHER BIT SET?
	JMP .+3		/YES; JUMP AHEAD
	CMA		/NO; CHARACTER IS 1,2,OR 3; SET AC TO -1
	JMP LOADMQ	/AND SET IT IN MQ FOR Y CONTROL
	IAC		/CHARACTER IS 4,5,7,8,OR 9; SET AC=1
	TAD KBCHAR	/AND ADD CHARACTER (CHAR IS INCREMENTED)
	AND IOOO	/MASK 10'2 BIT
	SZA CLA		/IS 10'S BIT SET?
	IAC		/YES; CHAR IS 7,8,OR 9 (REMEMBER INCREMENT);SET AC=1
LOADMQ,	MQL		/AND SET IT IN MQ FOR Y CONTROL
	TAD KBCHAR	/GET KEYBOARC CHARACTER AGAIN
	CLL RTR		/DO SOME FUNNY STUFF
	TAD KBCHAR	/AND SOME MORE
	AND OOIO	/MASK 2'S BIT FROM MODIFIED CHARACTER
	SZA CLA		/IS 2'S BIT SET
	JMP .+3		/YES; JUMP AHEAD
	CMA		/NO; CHARACTER MUST BE  1,4,OR 7;SET AC=-1 FOR X MOVEMENT
	JMP DONCUR	/AND JUMP TO CURSOR EXIT
	TAD KBCHAR	/2'S BIT IS NOT SET; GET CHARACTER AGAIN
	CLL RTR		/DO THE SAME FUNNY
	TAD KBCHAR	/STUFF TO THE CHARACTER AGAIN
	AND OOOI	/MASK THE 1'S BIT
	SZA CLA		/IS THE 1'S BIT SET?
	IAC		/YES; CHARACTER IS 3,6,OR 9; SET AC=1 FOR +X MOVEMENT OF CURSOR

DONCUR,	JMS MOVCUR	/+1 OR -1 IS IN MQ FOR Y MOVEMENT OF CURSOR
			/+1 OR -1 IS IN ACCUMULATOR FOR X MOVEMENT OF CURSOR
			/GO TO A SUBROUTINE WHICH CAN USE THESE TO MOVE THE CURSOR
	JMP KBHNEX	/AND EXIT THE KEYBOARD SUBROUTINE

NOTCUR,	TAD KBCHAR	/CHARACTER IS NOT CURSOR CONTROL; GET IT AGAIN
	DCA GICHAR	/IT IS A GRAPHIC INPUT CHARACTER; PUT IT AWAY WHERE IT CAN BE USED
	JMP KBHNEX	/AND EXIT KEYBOARD SUBROUTINE

MZERO,	-260		/MINUS 0
MPER,	-256		/MINUS .
M265,	-265		/MINUS 5
M261,	-261		/MINUS 1
M272,	-272		/MINUS 2
IIOO,	0014		/MASK FOR SELECTING CURSOR CONTROL CHARACTERS
IOOO,	0010		/MASK FOR SELECTING CURSOR CONTROL CHARACTERS
OOIO,	0002		/MASK FOR SELECTING CURSOR CONTROL CHARACTERS
OOOI,	0001		/MASK FOR SELECTING CURSOR CONTROL CHARACTERS
GICHAR,	0		/SOTRAGE OF GRAPHIC INPUT CHARACTER
/TO MOVE-CURSOR
/	IF (MOVE X)
/	/	GET STEPSIZE
/	/	IF (NEGATIVE MOVEMENT) NEGATE STEPSIZE
/	/	ADD TO OLD X VALUE OF CURSOR
/	////////FIN
/	ELSE GET OLD X VALUE OF CURSOR
/	LOAD X DAC
/	STORE X VALUE OF CURSOR
/	IF (MOVE Y)
/	/	GET STEPSIZE
/	/	IF (NEGATIVE MOVEMENT) NEGATE STEPSIZE
/	/	ADD TO OLD Y VALUE OF CURSOR
/	////////FIN
/	ELSE GET OLD Y VALUE OF CURSOR
/	LOAD Y DAC
/	STORE Y VALUE OF CURSOR
////////FIN




MOVCUR,	0
	CLL RAL		/MOVE SIGN TO LINK
	SZA CLA		/IS X MOVEMENT OF CURSOR ZERO?
	TAD CURSTP	/NO; GET STEP SIZE
	SZL		/YES; ALSO HERE WITH STEP SIZE IN AC; IS MOVEMENT NEGATIVE?
	CIA CLL		/YES: SO NEGATE STEPSIZE (NEGATING ZERO DOES NOTHING)
	TAD CURSX	/ADD STEP TO  OLD VALUE OF X COORDINATE OF CURSOR
	DILX		/LOAD X DAC
	DCA CURSX	/AND STORE UPDATED VALUE OF X COORDINATE OF CURSOR
	MQA		/GET THE Y INCREMENT FROM THE MQ REGISTER
	CLL RAL		/MOVE SIGN TO LINK
	SZA CLA		/IS Y MOVEMENT OF CURSOR ZERO?
	TAD CURSTP	/NO; GET STEP SIZE
	SZL		/YES; ALSO HERE WITH STEP SIZE IN AC; IS MOVEMENT NEGATIVE?
	CIA CLL		/YES; SO NEGATE STEPSIZE (INCLUDING ZERO)
	TAD CURSY	/ADD STEP TO OLD VALUE OF Y COORDINATE OF CURSOR
	DILY		/LOAD Y DAC
	DCA CURSY	/AND STORE UPDATED VALUE OF Y COORDINATE OF CURSOR
	JMP I MOVCUR	/EXIT SUBROUTINE

LGSTEP,	0020		/LARGE CURSOR STEP = 16 RASTER UNITS
SMSTEP,	0002		/SMALL CURSOR STEP = 2 RASTER UNITS
CURSTP,	0		/STORAGE OF PRESENT CURSOR STEP SIZE






/TO TYPE A CHARACTER
/	REPEAT UNTIL (TELEPRINTER READY)
/	////////FIN
/	TYPE CHARACTER
/	CLEAR AC
////////FIN


TYPE,	0
	TSF		/IS TELEPRINTER FLAG SET?
	JMP .-1		/NO; GO BACK AND TRY AGAIN
	TLS		/YES; TYPE CHARACTER
	CLA		/CLEAR AC ALWAYS BEFORE RETURN
	JMP I TYPE	/AND RETURN FROM SUBROUTINE




/TO RESET-
/	SET ALPHANUMERIC (AN) MODE
/	HOME-
////////FIN


RESET,	0
	TAD MODMSK	/GET BITS FOR GI AND GR MODES
	CMA		/COMPLEMENT TO MAKE MASK
	AND STATUS	/TO GET ALL OTHER BITS FROM STATUS WORD
	DCA STATUS	/AND RESET STATUS WORD WITH GI AND GR MODE BITS CLEAR
	JMS HOME	/MOVE BEAM TO HOME POSITION
	JMP I RESET	/AND LEAVE RESET SUBROUTINE



	PAGE


/TO VIEW-
/	UNLESS (HC MODE) RESTORE TO FULL INTENSITY
////////FIN


VIEW,	0
	IFNZRO PLOTER <
	TAD HCMODE	/GET HC MODE BIT
	AND STATUS	/MASK IT FROM STATUS WORD
	SNA CLA		/HC MODE?
	>
	DIXY		/NO; INTENSIFY
	JMP I VIEW	/RETURN FROM INTENSIFY SUBROUTINE (DOING NOTHING IF HC MODE)

/TO HANDLE-HOST-CHARACTER
/	WHEN (ESCAPE TRAP SET)
/	/	CLEAR ESCAPE TRAP
/	/	SELECT (CHARACTER)
/	/	/	(FF)	PAGE-
/	/	/	(ENQ)
/	/	/	/	UNLESS (GI MODE) RETURN-STATUS
/	/	/	/	RETURN COORDINATES
/	/	/	////////FIN
/	/	/	(SUB)	SET GI MODE
/	/	/	(OTHERWISE) ERROR-
/	/	////////FIN
/	////////FIN
/	ELSE
/	/	WHEN (CONTROL CHARACTER)
/	/	/	SELECT (CHARACTER)
/	/	/	/	(EXC)	SET EXCAPE TRAP
/	/	/	/	(CR)
/	/	/	/	/	UNLESS (AN MODE) SET AN MODE
/	/	/	/	/	MARGIN-
/	/	/	/	////////FIN
/	/	/	/	(LF)	LINEFEED-
/	/	/	/	(GS)	SET GR MODE
/	/	/	/	(US)	SET AN MODE
/	/	/	/	(HT)	SPACE-
/	/	/	/	(VT)	LINEFEED-
/	/	/	/	(BS)	BACKSPACE
/	/	/	/	(BEL)	RING BELL
/	/	/	/	(SO)	SET ALTERNATE CHARACTER SET
/	/	/	/	(SI)	SET NORMAL CHARACTER SET
/	/	/	/	(OTHERWISE) ERROR-
/	/	/	////////FIN
/	/	////////FIN
/	/	ELSE
/	/	/	CONDITIONAL
/	/	/	/	(GR MODE)	TREAT-COORDINATE-CHARACTER
/	/	/	/	(OTHERWISE)	/PRINT-CHARACTER
/	/	/	////////FIN
/	/	////////FIN
/	////////FIN
////////FIN

HOHNDL,	DCA HOCHAR	/STORE CHARACTER FROM HOST TEMPORARILY
	TAD ESCTRP	/GET ESCAPE TRAP BIT
	AND STATUS	/AND MASK FROM STATUS WOOD
	SNA CLA		/IS ESCAPE TRAP SET?
	JMP ESCCLR	/NO; JUMP AHEAD TO NEXT SECTION
	TAD ESCTRP	/YES; GET ESCAPE TRAP BIT AGAIN
	CMA		/AND FORM COMPLEMENTARY MASK
	AND STATUS	/TO CLEAR BIT FROM STATUS WORD
	DCA STATUS	/RESET STATUS WORD
SELENQ,	TAD HOCHAR	/GET CHARACTER RECEIVED FROM HOST
	TAD MENQ	/ADD MINUS ENQ
	SZA CLA		/IS IT ENQ?
	JMP SELFF	/NO; CHECK NEXT OPTION
	JMS RETCOR	/YES; RETURN COORDINATES
	JMP HOHNEX	/AND EXIT SUBROUTINE

SELFF,	JMS CLRGI	/PRESUME GI MODE AND CLEAR IT
	TAD HOCHAR	/GET CHARACTER RECEIVED FROM HOST
	TAD MFF		/ADD MINUS FF
	SZA CLA		/IS IT FF?
	JMP SELSUB	/NO; CHECK NEXT OPTION
	JMS NEWPAG	/YES; GO TO NEW PAGE
	JMP HOHNEX	/AND EXIT SUBROUTINE

SELSUB,	TAD HOCHAR	/GET CHARACTER RECEIVED FROM HOST
	TAD MSUB	/ADD MINUS SUB
	SZA CLA		/IS IT SUB?
	JMP SELERR	/NO; CHECK NEXT OPTION
	TAD GIMODE	/YES; GET GI MODE BIT
	MQL		/PUT IT IN MQ REGISTER
	TAD STATUS	/GET STATUS WORD
	MQA		/INCLUSIVE OR GI MODE BIT INTO STATUS WORD
	DCA STATUS	/AND RESTORE STATUS WORD
	JMS CURSON	/TURN CURSOR ON
	JMP HOHNEX	/AND EXIT SUBROUTINE

SELERR,	JMP HOHNEX	/NO ERROR ROUTINE AT PRESENT; SIMPLY EXIT SUBROUTINE

ESCCLR,	TAD HOCHAR	/ESCAPE TRAP NOT SET; GET CHARACTER RECEIVED FROM HOST
	AND BITS56	/GET MASK FOR 100'S AND 40'S BITS
	SZA CLA		/IS EITHER BIT SET? (IF NOT, IT IS A CONTROL CHARACTER)
	JMP NOTCTL	/BITS NOT SET; CHARACTER IS CONTROL CHARACTER
	TAD HOCHAR	/BITS SET; CHARACTER IS NOT A CONTROL CHARACTER; GET IT AGAIN
	TAD MESC	/ADD MINUS ESC
	SZA CLA		/IS IT ESC?
	JMP SELCR	/NO; CHECK NEXT OPTION
	TAD ESCTRP	/YES; GET EXCAPE TRAP BIT
	JMP SETST	/AND EXIT SUBROUTINE THROUGH BIT SET SEQUENCE

SELCR,	TAD HOCHAR	/GET CHARACTER RECEIVED FFOM HOST
	TAD MCR		/ADD MINUS CR
	SZA CLA		/IS IT CR?
	JMP SELLF	/NO; CHECK NEXT OPTION
	TAD STATUS	/YES; GET STATUS WORD
	AND GIMODE	/AND MASK GI MODE BIT
	SZA CLA		/IS GI MODE SET?
	JMS CLRGI	/YES; CLEAR GI MODE
	JMS GOMARG	/MOVE TO MARGIN
	TAD GRMODE	/GET GR MODE BIT
	TAD GIMODE	/AND GI MODE BIT
	AND STATUS	/MASK BOTH FROM STATUS WORD
	SNA CLA		/IS EITHER SET?
	JMP HOHNEX	/NO; EXIT SUBROUTINE
	JMP SETAN	/YES; SET ALPHANUMERIC MODE (AND EXIT SUBROUTINE)

SELLF,	TAD HOCHAR	/GET CHARACTER RECEIVED FROM HOST
	TAD MLF		/ADD MINUS LF
	SZA CLA		/IS IT LF?
	JMP SELGS	/NO; CHECK NEXT OPTION
	JMS LINFED	/YES; LINEFEED
	JMP HOHNEX	/AND EXIT SUBROUTINE

SELGS,	TAD HOCHAR	/GET CHARACTER RECEIVED FROM HOST
	TAD MGS		/ADD MINUS GS
	SNA CLA		/IS IT GS?
	JMP SETGR	/YES; SET GR MODE (AND EXIT SUBROUTINE)

SELUS,	TAD HOCHAR	/GET CHARACTER RECEIVED FROM HOST
	TAD MUS		/ADD MINUS US
	SNA CLA		/IS IT US?
	JMP SETAN	/YES; SET ALPHANUMERIC MODE (AND EXIT SUBROUTINE)

SELHT,	TAD HOCHAR	/GET CHARACTER RECEIVED FROM HOST
	TAD MHT		/ADD MINUS HT
	SZA CLA		/IS IT HT?
	JMP SELVT	/NO; CHECK NEXT OPTION
	JMS SPACE	/YES; SPACE
	JMP HOHNEX	/AND EXIT SUBROUTINE

SELVT,	TAD HOCHAR	/GET CHARACTER RECEIVED FROM HOST
	TAD MVT		/ADD MINUS VT
	SZA CLA		/IS IT VT?
	JMP SELBS	/NO; CHECK NEXT OPTION
	JMS LINFED	/YES; LINEFEED
	JMP HOHNEX	/AND EXIT SUBROUTINE

SELBS,	TAD HOCHAR	/GET CHARACTER RECEIVED FROM HOST
	TAD MBS		/ADD MINUS BS
	SZA CLA		/IS IT BS?
	JMP SELBEL	/NO; CHECK NEXT OPTION
	JMS BACKSP	/YES; BACKSPACE
	JMP HOHNEX	/AND EXIT SUBROUTINE

HOCHAR,	0		/TEMPORARY STORAGE ON THIS PAGE OF CHARACTER RECEIVED FROM HOST

			/FOLLOWING CHARACTERS ARE SET FOR EVEN PARITY 
			/RECEIVED FROM HOST COMPUTER.
MFF,	-14		/MINUS FF
MENQ,	-5		/MINUS ENQ
MSUB,	-232		/MINUS SUB
MESC,	-33		/MINUS ESC
MCR,	-215		/MINUS CR
MLF,	-12		/MINUS LF
MGS,	-35		/MINUS GS
MUS,	-237		/MINUS US
MHT,	-11		/MINUS HT
MVT,	-213		/MINUS VT
MBS,	-210		/MINUS BS

BITS56,	140		/MASK FOR BITS WHICH INDICATE NON-CONTROL CHARACTER IF EITHER SET




	PAGE
SELBEL,	TAD HOCHAR	/GET CHARACTER RECEIVED FROM HOST
	TAD MBEL	/ADD MINUS BEL
	SZA CLA		/IS IT BEL?
	JMP SELSO	/NO; CHECK NEXT OPTION
	TAD BEL		/YES; GET ASCII FOR BELL
	JMS TYPE	/AND TRANSMIT TO TELETYPE
	JMP HOHNEX	/AND EXIT SUBROUTINE

SELSO,	TAD HOCHAR	/GET CHARACTER RECEIVED FROM HOST
	TAD MSO		/ADD MINUS SO
	SZA CLA		/IS IT SO?
	JMP SELSI	/NO; CHECK NEXT OPTION
	TAD ALTCHR	/YES; GET ALTERNATE CHARACTER SET BIT
	JMP SETST	/AND LEAVE SUBROUTINE THROUGH BIT SET SEQUENCE

SELSI,	TAD HOCHAR	/GET CHARACTER RECEIVED FROM HOST
	TAD MSI		/ADD MINUS SI
	SZA CLA		/IS IT SI?
	JMP SELOT	/NO; CHECK NEXT OPTION
	MQL		/YES; CLEAR MQ REGISTER
	TAD ALTCHR	/AND GET ALTERNATE CHARACTER SET BIT IN AC
	JMP CLRST	/AND EXIT SUBROUTINE THROUGH BIT CLEAR SEQUENCE

SELOT,	JMP HOHNEX	/NO ERROR HANDLING ROUTINE SO JUST EXIT
NOTCTL,	TAD STATUS	/CHARACTER IS NOT CONTROL CHARACTER; GET STATUS WORD
	AND GRMODE	/AND MASK GR MODE BIT
	SNA CLA		/IS GR MODE SET?
	JMP NOTGR	/NO; JUMP AHEAD
	JMS COORD	/YES; TREAT CHARACTER AS A COORDINATE
	JMP HOHNEX	/AND EXIT SUBROUTINE

NOTGR,	JMS PRCHAR	/NOT GR MODE SO PRINT CHARACTER
	JMP HOHNEX	/AND EXIT SUBROUTINE

SETGR,	ISZ DKVECT	/BEGINNING OF SEQUENCE TO SET GR MODE; SET DARK VECTOR FLAG FIRST
	JMS ACRSOF	/TURN AN CURSOR OFF
	TAD GRMODE	/GET GR MODE BIT
	SKP
SETAN,	JMS ACRSON	/BEGINNING OF SEQUENCE TO SET AN MODE; TURN AN CURSOR ON
	MQL		/LOAD MQ (GR MODE BIT OR 0 IF AN MODE)
	IFNZRO PLOTER <
	TAD HCMODE	/GET HC MODE BIT
	AND STATUS	/AND MASK FROM STATUS WORD
	SZA CLA		/IS HC MODE SET?
	TAD HCMODE	/YES; GET HC MODE BIT AGAIN
	MQA		/INCLUSIVE OR GR MODE BIT IF SET ABOVE
	MQL		/MOVE ALL THESE BITS (HC AND PERHAPS GR) TO MQ REGISTER
	>
	DCA CHARCT	/RESET CHARACTER COUNTER (THIS LINE) TO ZERO
	TAD LASTX	/GET LAST VALUE OF X COORDINATE
	DILX		/LOAD IT INTO X DAC
	TAD K1000	/ADD 1000 TO X COORDINATE (OFFSET IT) SO THAT IT IS POSITIVE
	TAD M16		/SUBTRACT ONE CHARACTER WIDTH
	SMA		/IF THE RESULT IS NEGATIVE, EXIT THE LOOP
	ISZ CHARCT	/OTHERWISE INCREMENT THE CHARACTER COUTN
	SMA		/STILL PART OF THE EXIT
	JMP .-4		/IF THE RESULT IS NOT NEGATIVE, GO SUBTRACT ANOTHER CHARACTER WIDTH
	CLA		/OUT OF THE LOOP HERE; GET RID OF RESIDUAL IN AC
	DCA LINECT	/CLEAR LINE COUNTER (THIS COLUMN)
	TAD LASTY	/GET LASY VALUE OF Y COORDINATE
	DILY		/LOAD Y DAC
	TAD M767	/OFFSET Y COORDINATE SO IT IS ALWAYS NEGATIVE
	TAD D22		/AND ADD HEIGHT OF ONE CHARACTER (AND SPACE BETWEEN LINES)
	SPA		/IF RESULT IS POSITIVE, EXIT LOOP
	ISZ LINECT	/OTHERWISE, INCREMENT LINE COUNTER
	SPA		/STILL PART OF THE EXIT
	JMP .-4		/IF RESULT WAS NOT POSITIVE, GO ADD ANOTHER LINE HEIGHT
	CLA		/OUT OF LOOP; GET RID OF RESIDUE IN AC
	TAD GRMODE	/GET GR MODE BIT
	TAD MARGIN	/GET ALTERNATE MARGIN BIT
CLRST,	CMA		/COMPLEMENT THESE BITS TO FORM MASK TO CLEAR THESE BITS
	AND STATUS	/CLEAR THE BITS FROM THE STATUS WORD
	JMP .+3		/AND JUMP AHEAD
SETST,	MQL		/PUT ALL BITS IN AC INTO MQ REGISTER
	TAD STATUS	/GET STATUS WORD
	MQA		/AND INCLUSIVE OR (SET) THE REQUIRED BITS (IF NOT ALREADY SET)
DCAST,	DCA STATUS	/RESTORE STATUS WORD

HOHNEX,	JMP HOINEX	/EXIT THIS ROUTINE BY JUMPING BACK TO HOST INPUT ROUTINE

MBEL,	-207		/MINUS BEL
BEL,	207		/BEL FOR TTY
MSO,	-216		/MINUS SO
MSI,	-17		/MINUS SI
K1000,	1000		/A NEEDED CONSTANT
M16,	-16		/MINUS THE WIDTH OF A CHARACTER SPACE IN RASTER UNITS
M767,	-767		/A NEEDED CONSTANT
D22,	26		/THE HEIGHT OF A CHARACTER SPACE IN RASTER UNITS

/TO CLEAR-GI-MODE
/	CLEAR BI MODE BIT IN STATUS WORD
/	CLEAR CURSOR BIT IN VC8E REGISTER
////////FIN




CLRGI,	0
	TAD GIMODE	/GET GI MODE BIT
	CMA		/COMPLEMENT IT TO FORM MASK TO
	AND STATUS	/CLEAR BIT FROM STATUS WORD
	DCA STATUS	/AND RESTORE STATUS WORD
	DIRE		/READ VC8E REGISTER
	AND MCRSBT	/MASK ALL BUT CURSOR BIT
	DILE		/AND RESOTRE VC8E REGISTER
	JMP I CLRGI	/EXIT SUBROUTINE





/TO TURN-CURSOR-ON
/	SET CURSOR BIT IN VC8E REGISTER
/	INTENSIFY
/	SET LARGE STEP
/	SET LAST CURSOR COORDINATES TO REMEMBER
/	PRESET GRAPHIC INPUT DEFAULT CHARACTER (SPACE)
////////FIN




CURSON,	0
	DIRE		/READ VC8E REGISTER
	AND MCRSBT	/MASK ALL BUT CURSOR BIT
	TAD CRSBT	/ADD CURSOR BIT
	DILE		/RESTORE VC8E REGISTER
	DISD		/SKIP IF DISPLAY READY
	JMP .-1		/ELSE TRY AGAIN
	DIXY		/INTENSIFY
	TAD LGSTEP	/GET LARGE STEP VALUE FOR CURSOR MOVEMENT
	DCA CURSTP	/STORE LARGE VALUE AS DEFAULT CURSOR STEP SIZE
	TAD LASTX	/GET LAST VALUE OF X DISPLAYED
	DCA CURSX	/AND STORE IT
	TAD LASTY	/GET LAST VALUE OF Y DISPLAYED
	DCA CURSY	/AND STORE IT
	TAD ASCSP	/GET ASCII FOR SPACE
	DCA GICHAR	/AND STORE IT AS DEFAULT FOR GRAPHIC INPUT CHARACTER
	JMP I CURSON	/EXIT SUBROUTINE

ASCSP,	240
/TO TRANSMIT-A-CHARACTER-TO-HOST
/	REPEAT UNTIL (SOFTWARE TELEPRINTER FLAG SET)
/	////////FIN
/	CLEAR SOFTWARE TELEPRINTER FLAG
/	TRANSMIT CHARACTER
////////FIN




XMITEN,	0
	DCA CHRHLD	/STORE CHARACTER TO BE TRANSMITTED
	TAD TENTPF	/GET SOFTWARE TELEPRINTER FLAG
	SNA CLA		/IS FLAG SET?
	JMP .-2		/NO; TRY AGAIN
	DCA TENTPF	/YES; CLEAR FLAG
	TAD CHRHLD	/GET CHARACTER BACK
	TENTLS		/AND TRANSMIT IT TO HOST
	CLA		/CLEAR AC
	JMP I XMITEN	/AND EXIT SUBROUTINE

CHRHLD,	0		/TEMPPRARY STORAGE FOR CHARACTER TO BE TRANSMITTED





	PAGE
	IFNZRO PLOTER <

/TO TYPE-A-TEXT-MESSAGE
/	DO (I=1,2)
/	/	GET NEXT WORD FROM TEXT
/	/	IF (I=2) INTERCHANGE BYTES
/	/	GET MOST SIGNIFICANT BYTE
/	/	FIX SEVENTH BIT
/	/	IF (END OF MESSAGE,I.E.,NULL) EXIT
/	/	TYPE-CHARACTER
/	/	IF (I=2) BUMP WORD POINTER
/	////////FIN
/	SEND CR AND LF
////////FIN




TYPTXT,	0
	CLL		/CLEAR LINK AS LOOP COUNTER
SEC,	TAD I TYTXPT	/GET WORD CONTAINING TWO CHARACTERS
	SZL		/DO NOTHING FIRST TIME, BUT
	BSW		/EXCHANGE BYTES SECOND TIME
	AND MSBYTE	/MASK THE LEFT-HAND BYTE WHICH IS THE SIXBIT CHARACTER
	SMA SZA		/SKIP IF SIXTH BIT IS SET OF IF CHAR IS NULL
	IAC		/ELSE SET 7TH BIT; AT THE MOMENT IT IS IN THE WRONG PLACE
	BSW CML		/BUT NOW IT AND THE LS SIX BITS ARE ALL PROPERLY
			/IN THE 7 LS BITS OF THE 12-BIT WORD;
			/ALSO, COMPLEMENT LOOP COUNTER WHILE CONVENIENT
	SNA		/IS THE CHARACTER A NULL?
	JMP END		/YES; END OF TEXT SO JUMP TO EXIT
	JMS TYPE	/NO; GO TYPE THE CHARACTER
	SNL		/SKIP FIRST TIME THROUGH (COUNTER WAS COMPLEMENTED ALREADY)
	ISZ TYTXPT	/BUMP TEXT POINTER SECOND TIME ONLY
	JMP SEC		/LOOP ENDLESSLY; (EXIT UPON FINDING A NULL CHARACTER)
END,	TAD CR		/EXIT SEQUENCE; GET ASCII FOR CR
	JMS TYPE	/AND TYPE IT
	TAD LF		/GET ASCII FOR LF
	JMS TYPE	/AND TYPE IT
	JMP I TYPTXT	/EXIT SUBROUTINE

TYTXPT,	0		/STORAGE FOR POINTER TO TEXT
MSBYTE,	7700		/MASK FOR MOST SIGNIFICANT BYTE
/TO WAIT-FOR-USER-RESPONSE
/	REMEMBER PEN STATUS
/	IF (PEN DOWN) RAISE PEN
/	REMEMBER PRESENT PEN LOCATION
/	MOVE PEN TO RIGHT MARGIN
/	WAIT FOR KEYBOARD ENTRY
/	MOVE PEN BACK TO WHERE IT WAS
/	RESTORE PEN STATUS
////////FIN




KBWAIT,	0
	DIRE		/GET VC8E REGISTER
	DCA HOLDDI	/AND PUT IT AWAY
	TAD HOLDDI	/GET IT AGAIN
	AND PENUP	/CLEAR PEN-DOWN BIT
	DILE		/AND SET REGISTER TO EFFECT ACTION
	JMS WAITPN	/WAIT FOR PEN TO MOVE
	TAD LASTX	/GET PRESENT VALUE OF PEN X COORDINATE
	DCA HOLDX	/AND STORE IT
	TAD L777	/GET X COORDINATE FOR RIGHT MARGIN
	DILX		/AND LOAD DAC TO MOVE PEN
	KSF		/HAS A CHARACTER BEEN ENTERED AT KEYBOARD?
	JMP .-1		/NO; LOOK AGAIN UNTIL
	KCF		/IT IS THERE AND THEN LOWER THE FLAG IGNORING THE CHARACTER
	TAD HOLDX	/GET X COORDINATE BACK
	DILX		/AND LOAD DAC TO MOVE THE PEN BACK
	CLA		/CLEAR THE AC SINCE DILX DOESN'T DO IT
	TAD HOLDDI	/GET BACK VC8E STATUS
	DILE		/AND RESTORE IT. THIS INCLUDES PEN UP/DOWN INFO
	JMP I KBWAIT	/EXIT THE SUBROUTINE

HOLDDI,	0		/STORAGE FOR VC8E REGISTER
HOLDX,	0		/STORAGE FOR X COORDINATE OF PEN
L777,	777		/X COORDINATE OF RIGHT-HAND MARGIN
	>
/TO RETURN-STATUS-AND-COORDINATES
/	UNLESS (GI MODE) SEND STATUS
/	SEND HI X
/	SEND LO X
/	SEND HI Y
/	SEND LO Y
/	IF (CR TERMINATOR)
/	/	SEND CR
/	/	IF (EOT TERMINATOR) SEND EOT
/	////////FIN
////////FIN






RETCOR,	0
	TAD GIMODE	/GET GI MODE BIT
	AND STATUS	/AND MASK IT FROM STATUS WORD
	SZA CLA		/IS GI MODE SET?
	JMP CRSCRD	/YES; SKIP STATUS WORD AND SEND COORDINATES ONLY
	TAD GRMODE	/GET GR MODE BIT
	AND STATUS	/AND MASK IT FROM STATUS WORD
	SZA CLA		/IS GR MODE SET?
	IAC		/YES; SET BIT IN STATUS REPORT CHARACTER
	CLL RAL		/MOVE BIT LEFT PREPARATORY TO SETTING MARGIN BIT
	MQL		/STORE STATUS REPORT WORD THAT IS BEING FORMED
	TAD MARGIN	/GET ALTERNATE MARGIN BIT
	AND STATUS	/AND MASK IT FROM STATUS WORD
	SZA CLA		/IS ALTERNATE MARGIN SET?
	IAC		/YES; SET A BIT
	MQA		/BRING BACK THE GR MODE BIT
	CLL RAL		/SHIFT ONCE MORE AND STATUS BITS ARE READY TO SEND TO HOST
	TAD GINTAG	/ADD THE IDENTIFYING TAG BITS AND THE ENTIRE CHARACTER IS READY TO SEND
	JMS XMITEN	/SEND THE STATUS CHARACTER
ALCORD,	TAD LASTX	/GET THE LAST X COORDINATE
	DCA CORDX	/AND STORE IT AS THE CURSOR COORDINATE
	TAD LASTY	/GET THE LAST Y COORDINATE
	DCA CORDY	/AND STORE IT AS THE CURSOR COORDINATE
	JMP SENCOR	/JUMP OVER THE NEXT FEW LINES
CRSCRD,	TAD CURSX	/COME HERE IF GI MODE; GET THE LAST CURSOR X COORDINATE
	DCA CORDX	/AND STORE IT WHERE IT CAN BE FOUND TO SEND
	TAD CURSY	/LIKEWISE GET THE LAST CURSOR Y COORDINATE
	DCA CORDY	/AND STORE IT WHERE IT CAN BE FOUND TO SEND
SENCOR,	TAD CORDX	/NOW GET THE PROPER X COORDINATE 
	TAD L1000	/RESTORE IT TO THE EXPECTED RANGE
	RAL		/MOVE IT OVER SO MS 5 BITS IN MS HALF OF WORD
	BSW		/MOVE THE MS 5 BITS TO THE LS BYTE OF THE WORD
	AND FIVBTS	/MASK THE 5 LS BITS
	TAD GINTAG	/ADD THE TAG BITS
	JMS XMITEN	/AND SEND THE HI HALF OF THE X COORDINATE
	TAD CORDX	/GET THE X COORDINATE AGAIN
	TAD L1000	/RESTORE THE RANGE AGAIN
	AND FIVBTS	/MASK THE LS 5 BITS
	TAD GINTAG	/ADD THE TAG BITS
	JMS XMITEN	/AND SEND THE LO HALF OF THE  X COORCINATE
	TAD CORDY	/GET THE Y COORDINATE
	TAD P600	/RESOTRE TO THE EXPECTED RANGE
	RAL		/MOVE 5 MS BITS TO MS BYTE OF WORD
	BSW		/MOVE 5 MS BITS TO LS BYTE OF WORD
	AND FIVBTS	/MASK THE 5 LS BITS
	TAD GINTAG	/ADD THE TAG BITS
	JMS XMITEN	/AND SEND THE HIGH HALF OF THE Y COORDINATE
	TAD CORDY	/GET THE Y COORDINATE AGAIN
	TAD P600	/AND RESTORE THE RANGE AGAIN
	AND FIVBTS	/MASK THE 5 LS BITS
	TAD GINTAG	/ADD THE TAG BITS
	JMS XMITEN	/AND SEND THE LO HALF OF THE Y COORDINATE
	TAD TRMNTR	/GET THE TERMINATOR CODE WORD
	CLL RAL		/MOVE EOT BIT INTO LINK AND CR BIT INTO SIGN
	SNA CLA		/IS CR BIT SET?
	JMP RETCEX	/NO; SKIP TERMINATORS; GO TO END OF ROUTINE
	TAD CR		/YES; GET ASCII FOR CR
	JMS XMITEN	/AND SEND IT
	SNL		/IS EOT BIT SET?
	JMP RETCEX	/NO; SKIP TO END OF ROUTINE
	TAD EOT		/YES; GET ASCII FOR EOT
	JMS XMITEN	/AND SEND IT
RETCEX,	JMP I RETCOR	/LEAVE SUBROUTINE

GINTAG,	240		/TAG BITS FOR STATUS AND COORDINATE RETURN CHARACTERS
CORDX,	0		/STORAGE FOR PROPER (ALPHANUMERIC OF GRAPHIC) CURSOR X COORDINATE
CORDY,	0		/DITTO FOR Y COORDINATE
L1000,	1000		/SCALE RESTORATION FACTOR; SOFTWARE X COORDINATES RANGE FROM 0-1777;
			/HARDWARE COORDINATES ARE SET FOR -1000 TO 777 BY HARDWARE JUMPER
P600,	600		/SCALE RESTORATION FACTOR; SOFTWARE Y COORDINATES RANGE FROM 780 TO 0
			/HARDWARE COORDINATES RANGE FROM -1000 TO 777 BY HARDWARE JUMPER
FIVBTS,	37		/MASK FOR 5 LS BITS
EOT,	204		/ASCII FOR EOT 
TRMNTR,	2000		/TERMINATOR CODE SET BY USER; BIT 0 SET FOR EOT; BIT 1 SET FOR CR
CR,	215		/ASCII FOR CR
/TO PAGE-
/	ERASE-
/	RESET-
////////FIN


NEWPAG,	0
	JMS ERASE	/ERASE SCREEN
	JMS RESET	/RESET
	JMP I NEWPAG	/LEAVE NEW PAGE SUBROUTINE


	PAGE

/TO TREAT-COORDINATE-CHARACTER
/	WHEN (HI)
/	/	WHEN (LAST=X) SET HI Y
/	/	ELSE SET HI X
/	////////FIN
/	ELSE
/	/	WHEN (Y) SET LO Y
/	/	ELSE
/	/	/	SET LO X
/	/	/	DISPLAY-VECTOR
/	/	////////FIN
/	////////FIN
/	UPDATE LAST
////////FIN

COORD,	0
	TAD HOCHAR	/GET CHARACTER RECEIVED FROM HOST
	AND LOBIT	/MASK THE LO BIT
	SZA CLA		/IS IT A LO HALF OF A COORDINTAE?
	JMP LO		/YES; JUMP AHEAD
	TAD LAST	/NO; SO IT MUST BE A HI HALF; GET LAST FLAG
	SZA CLA		/WAS LAST CHARACTER AN X COORDINATE?
	JMP SETHIX	/NO; THE PRESENT CHARACTER IS THE HI HALF OF AN X COORDINATE
	JMS FIXHI	/YES; THE PRESENT CHARACTER IS THE HI HALF OF A Y COORDINATE
			/GO TO A SUBROUTINE THAT FIXES THE CHARACTER AS A HI HALF
	TAD NEWY	/GET THE HOLDING REGISTER FOR Y COORDINATES BEING FORMED
	AND LS5BTS	/MASK THE 5 LS BITS
	MQA		/AND  BRING IN THE 5 MS BITS WHICH WERE STORED IN MQ BY THE SUBROUTINE FIXHI
	TAD M600	/OFFSET PROPERLY FOR THE HARDWARE
	DCA NEWY	/STORE THE RESULTING Y COORDINATE
	IAC		/SET THE AC
	DCA LAST	/AND SET THE LAST = Y FLAG
	JMP COOREX	/AND EXIT THE SUBROUTINE
SETHIX,	JMS FIXHI	/GO TO A SUBROUTINE THAT FIXES THE CHARACTER AS A HI HALF
	MQA		/BRING THE HI HALF INTO THE AC
	TAD M1000	/SET THE OFFSET EXPECTED BY THE HARDWARE
	DCA NEWX	/AND STORE THE COORDINTE THAT IS BEING FORMED
	DCA LAST	/CLEAR THE LAST = Y FLAG
	JMP COOREX	/AND EXIT THE SUBROUTINE
LO,	TAD HOCHAR	/CHARACTER IS THE LO HALF OF A COORDINATE; GET CHARACTER AGAIN
	AND YBIT	/MASK THE Y BIT
	SNA CLA		/IS THE Y BIT SET?
	JMP LOX		/NO; SO IT MUST BE LO X
	TAD HOCHAR	/YES; IT IS LO Y; GET THE CHARACTER AGAIN
	AND LS5BTS	/MASK THE 5 LS BITS
	MQL		/PUT THEM IN MQ
	TAD NEWY	/GET THE MS 5 BITS AND OFFSET
	AND MS7BTS	/MASK OUT ALL OLD JUNK
	MQA		/AND SET THE LS BITS
	DCA NEWY	/AND STORE THE COMPLETED COORDINATE
	IAC		/SET THE AC
	DCA LAST	/AND THE LAST = Y FLAG
	JMP COOREX	/EXIT THE SUBROUTINE
LOX,	TAD NEWX	/GET THE X COORDINTAE THAT IS BEING FORMED
	AND MS7BTS	/CANCEL OUT ALL THE OLD JUNK IN THE LS 5 BITS
	MQL		/STORE THE HI 5 BITS AND OFFSET IN THE MQ
	TAD HOCHAR	/GET THE CHARACTER AGAIN
	AND LS5BTS	/MASK THE 5 LS BITS
	MQA		/AND BRING BACK THE HI HALF AND OFFSET FROM THE MQ
	DCA NEWX	/STORE THE COMPLETE X COORDINATE
	DCA LAST	/CLEAR THE LAST = Y FLAG
	JMS DISVEC	/ALL COORDINATE SETS END WITH LO X SO GO DISPLAY THE VECTOR
COOREX,	JMP I COORD	/AND LEAVE THE SUBROUTINE

LOBIT,	100		/BIT IDENTIFYING THE LO HALF OF A COORDINATE PAIR
M600,	-600		/OFFSET FOR Y COORDINATES; (SEE SUBROUTINE RETCOR (ABOVE))
M1000,	-1000		/OFFSET FOR X COORDINATES; (SEE SUBROUTINE RETCOR (ABOVE))
YBIT,	40		/A BIT IDENTIFYING THE CHARACTER AS PART OF A Y COORDINATE
LAST,	0		/=1 IF LAST CHARACTER RECEIVED AND TREATED WAS PART OF A Y COORDINAAE
MS7BTS,	7740		/MASK FOR THE MS 7 BITS
LS5BTS,	37		/MASK FOR THE LS 5 BITS


FIXHI,	0		/A SUBROUTINE TO STRIP THE COORDINATE BITS FROM A HI CHARACTER
			/SHIFT THEM TO THE RIGHT LOCATION, AND STORE IN MQ
	TAD HOCHAR	/GET THE CHARACTER THAT WAS RECEIVED FROM HOST
	AND LS5BTS	/MASK OUT THE COORDINATE BITS (FROM TAG BITS, ETC.)
	BSW		/MOVE THEM LEFT 6 PLACES
	CLL RAR		/AND RIGHT ONE PLACE; NET = LEFT 5 PLACES
	MQL		/PUT THE RESULT IN MQ
	JMP I FIXHI	/AND RETURN

/TO DISPLAY-VECTOR
/	IF (HC MODE) FIX-PEN
/	WHEN (LIGHT VECTOR) USE VECTOR SUBROUTINE
/	ELSE
/	/	UNLESS (HC MODE) MOVE BEAM INSTANTLY
/	////////FIN
/	UPDATE LAST X, LAST Y
/	SET LIGHT VECTOR
////////FIN






DISVEC,	0
	IFNZRO PLOTER <
	TAD HCMODE	/GET HC MODE BIT
	AND STATUS	/AND MASK FROM STATUS WORD
	SNA CLA		/IS HC MODE SET?
	JMP .+3		/NO; SKIP PEN STUFF
	JMS FIXPEN	/YES; FIS PEN AS NECESSARY
	JMP GOVECT	/AND GO TO THE VECTOR DRAWING PART
	>
	JMS ACRSOF	/HC MODE NOT SET; TURN THE AN CURSOR OFF
	TAD DKVECT	/GET THE DARK VECTOR FLAG
	SNA CLA		/IS IT A DARK (INVISIBLE) VECTOR?
	JMP GOVECT	/NO; GO TH THE VECTOR DRAWING PART
	TAD NEWX	/YES; GET THE NEW X
	DILX		/AND LOAD THE DAC INSTANTLY
	CLA		/DILX DOES NOT CLEAR AC SO DO IT
	TAD NEWY	/GET THE NEW Y
	DILY		/AND LOAD THE Y DAC
	CLA		/CLEAR AC AGAIN
	SKP		/SKIP THE VECTOR DRAWING ROUTINE SINCE THE VECTOR IS DARK
GOVECT,	JMS VECT	/THE VECTOR IS LIGHT (DISPLAYED) SO GO DRAW IT
	TAD NEWX	/UPDATE SOME REGISTERS
	DCA LASTX
	TAD NEWY
	DCA LASTY
	IFNZRO PLOTER <
	TAD HCMODE	/GET HC MODE BIT
	AND STATUS	/AND MASK IT FROM STATUS WORD
	SNA CLA		/IS HC MODE SET?
	>
	JMS ACRSON	/NO; TURN AN CURSOR BACK ON
	DCA DKVECT	/BECAUSE A VECTOR WAS JUST DISPLAYED, NEXT VECTOR SHOULD ALSO BE
			/DISPLAYED UNLESS THIS FLAG IS TURNED OFF ELSEWHERE
	JMP I DISVEC	/LEAVE THE SUBROUTINE
	IFNZRO PLOTER <
/TO FIX-PEN
/	WHEN (DARK VECTOR)
/	/	IF (DOWN) RAISE PEN
/	////////FIN
/	ELSE
/	/	IF (UP) LOWER PEN
/	////////FIN
////////FIN






FIXPEN,	0
	TAD DKVECT	/GET DARK VECTOR FLAG
	SNA CLA		/IS DARK VECTOR FLAG SET:
	JMP LTVECT	/NO; SO VECTOR IS TO BE DISPLAYED
	DIRE		/YES; VECTOR IS NOT TO BE DISPLAYED; GET VC8E REGISTER
	AND PEN		/MASK THE PEN BIT
	SNA CLA		/IS PEN ALREADY UP?
	JMP FIXEX	/YES; NOTHING TO DO SO LEAVE
	DIRE		/NO; GET VC8E REGISTER AGAIN
	AND PENUP	/AND MASK ALL BITS EXCEPT PEN BIT (I.E., CLEAR PEN BIT)
	DILE		/AND RESTORE VC8E REGISTER TO INITIATE PEN CHANGE
	JMS WAITPN	/JUMP TO A SOFTWARE TIMING LOOP TO WAIT FOR PEN CHANGE
	JMP FIXEX	/AND LEAVE THE SUBROUTINE
LTVECT,	DIRE		/VECTOR IS TO BE DISPLAYED; PEN MUST BE DOWN; GET VC8E REGISTER
	AND PEN		/MASK THE PEN BIT
	SZA CLA		/IS PEN ALREADY DOWN?
	JMP FIXEX	/YES; NOTHING TO  DO SO LEAVE THE SUBROUTINE
	DIRE		/NO; IT MUST BE LOWERED; GET VC8E REGISTER
	TAD PEN		/ADD THE PEN DOWN BIT
	DILE		/AND RESTORE VC8E REGISTER TO INITIATE PEN CHANGE
	JMS WAITPN	/WAIT IN A SOFTWARE TIMING LOOP UNTIL PEN IS CHANGED
FIXEX,	JMP I FIXPEN	/EXIT FROM PEN FIX SUBROUTINE

WAITPN,	0		/A SOFTWARE TIMING LOOP TO WAIT FOR PEN CHANGE
	TAD PENTIM	/GET TIMING CONSTANT SET BY USER ON PAGE ZERO
	DCA WAIT	/STORE LOCALLY
	ISZ WAIT	/INCREMENT COUNTER
	JMP .-1		/GO BACK AS OFTEN AS NECESSARY UNTIL COUNTER IS SATISFIED 
	JMP I WAITPN	/THEN LEAVE LOOP AND LEAVE TIMING SUBROUTINE

WAIT,	0		/LOCAL STORAGE OF LOOP COUNTER
	>



	PAGE
/TO PRINT-CHARACTER
/	UNLESS (RUBOUT)
/	/	WHEN (ALTAN)
/	/	/	TYPE-CHARACTER
/	/	/	INCREMENT CHARACTER COUNT
/	/	/	IF (CHARACTER COUNT > TTY WIDTH) NEXTLINE-
/	/	////////FIN
/	/	ELSE
/	/	/	WHEN (SCOPE)
/	/	/	/	POINT TO CHARACTER IN TABLE
/	/	/	/	DISPLAY-CHARACTER
/	/	/	////////FIN
/	/	/	ELSE
/	/	/	/	POINT TO CHARACTER IN TABLE
/	/	/	/	PLOT-CHARACTER
/	/	/	////////FIN
/	/	/	INCREMENT CHARACTER COUNT
/	/	/	IF (CHARACTER COUNT > DISPLAY WIDTH) NEXTLINE-
/	/	////////FIN
/	////////FIN
////////FIN






PRCHAR,	0
	TAD HOCHAR	/GET CHARACTER THAT WAS RECEIVED FROM HOST
	TAD MRO		/SUBTRACT ASCII FOR RO
	SNA CLA		/IS IT RO?
	JMP PREXIT	/YES; IGNORE IT
	TAD ALTAN	/NO; GET ALTERNATE ALPHANUMERIC DEVICE BIT
	AND STATUS	/AND MASK FROM STATUS WORD
	SNA CLA		/IS IT SET?
	JMP NOTTTY	/NO; DEVICE IS NOT ALT AN DEVICE (TTY)
	TAD HOCHAR	/YES; GET THE CHARACTER AGAIN
	JMS TYPE	/AND TYPE IT ON THE ALTERNATE AN DEVICE (CONSOLE TTY)
	TAD MTTWID	/GET NEGATIVE OF TTY LINE WIDTH (SET BY USER ON PAGE ZERO)
	JMP PRCHEX	/AND GO CHECK AGAINST ACTUAL CHARACTER COUNT

NOTTTY,	TAD HOCHAR	/GET CHARACTER AGAIN
	TAD M40		/SUBTRACT 40 FROM ASCII VALUE OF CHARACTER TO GET PLACE VALUE IN TABLE
			/(FIRST 0-37 CHARACTERS ARE NON-PRINTING, SO THEY DO NOT EXIST IN TABLE)
	AND MASK7	/MASK ALL BUT THE TABLE PLACE BITS
	DCA TABPOS	/STORE TABLE PLACE VALUE
	IFNZRO PLOTER <
	TAD ALTDIS	/GET ALTERNATE DISPLAY (PLOTTER) BIT
	AND STATUS	/AND MASK IT FROM STATUS WORD
	SZA CLA		/IS ALTERNATE DISPLAY (PLOTTER) BIT SET?
	JMP PLTER	/YES; GO TO THE PLOTTER PART
	>
	TAD ALTCHR	/NO; GET ALTERNATE CHARACTER SET BIT
	AND STATUS	/AND MASK FROM STATUS WORD
	SZA CLA		/IS ALTERNATE CHARACTER SET REQUIRED?
	TAD PNTOF	/YES; ADD ADDITIONAL OFFSET FOR DOT CHARACTER TABLE
	TAD TABPOS	/TO THE PREVIOUSLY STOREC TABLE PLACE VALUE
	CLL RAL		/JUGGLE SOME MORE TO FIX IT RIGHT
	TAD TABPOS	/AND JUGGLE SOME MORE
	TAD DOTTBP	/AND ADD THE POINTER TO THE BEGINNING OF THE TABLE
	DCA PNTTAB	/STORE THE POINTER TO THE CHARACTER IN THE DOT TABLE
	JMS DICHAR	/GO DISPLAY THE CHARACTER
	IFNZRO PLOTER <
	JMP PRCHEX-1	/AND PREPARE TO LEAVE THE PRINT SUBROUTINE

PLTER,	TAD ALTCHR	/CHARACTER IS TO BE PRINTED ON PLOTTER; GET ALTERNATE CHARACTER SET BIT
	AND STATUS	/AND MASK IT FROM STATUS WORD
	SZA CLA		/IS ALTERNATE CHARACTER SET REQUIRED?
	TAD VECOF	/YES; GET OFFSET FACTOR FOR ALT CHAR SET IN VECTOR TABLE
	TAD TABPOS	/ADD TO PREVIOUSLY STOREC TABLE POSITION VALUE
	TAD VECTBP	/AND ADD POINTER TO BEGINNING OF VECOTR TABLE
	DCA PNTTAB	/AND STORE POINTER TO CHARACTER IN VECTOR TABLE
	TAD I PNTTAB	/VECTOR TABLE IS DOUBLY INDEXED SO USE POINTER AS A POINTER TO
	DCA PNTTAB	/A POINTER AND SET UP CHARACTER POINTER  CORRECTLY
	JMS PLCHAR	/NOW GO PLOT THE CHARACTER
	>
	TAD MDIWID	/GET THE NEGATIVE OF THE MAXIMUM CHARACTER COUNT ON THE DISPLAY DEVICE
PRCHEX,	ISZ CHARCT	/INCREMENT THE CHARACTER COUNTER
	TAD CHARCT	/COMPARE THE CURRENT CHARACTER COUNT WITH THE MAXIMUM VALUE
	SMA CLA		/IS MAXIMUM EXCEEDED?
	JMS NXTLIN	/YES; GO TO THE NEXT LINE
PREXIT,	JMP I PRCHAR	/NO; EXIT THE SUBROUTINE

MRO,	-377		/NEGATIVE OF ASCII FOR RO
PNTOF,	220		/A CONSTANT USED IN CALCULATING OFFSET IN THE DOT TABLE
DOTTBP,	DOTTAB		/POINTER TO THE BEGINNING OF THE DOT TABLE
	IFNZRO PLOTER <
VECOF,	140		/A CONSTANT USED IN CALCULATING OFFSET IN THE VECTOR TABLE
VECTBP,	VECTAB		/POINER TO BEGINNING OF VECTOR TABLE
	>
M40,	-40		/CONSTANT TO SUBTRACT TO ACCOUNT FOR NON-PRINTING (CONTROL) CHARACTERS
MASK7,	177		/MASK FOR 7 LS BITS
TABPOS,	0		/VALUE OF CHARACTER POISTION IN TABLE
/TO DISPLAY-CHARACTER
/	IF (SUBSCRIPT) SHIFT DOWN
/	REPEAT UNTIL (ALL BITS USED)
/	/	GET BIT
/	/	IF (BIT SET) DISPLAY-POINT
/	/	IF (12 BITS)
/	/	/	IF (3 WORDS)
/	/	/	/	MOVE TO NEW CHARACTER START POSITION
/	/	/	/	EXIT THE ROUTINE
/	/	/	////////FIN
/	/	/	NEW WORD
/	/	/	RESET 12 BITS PER WORD COUNTER
/	/	////////FIN
/	/	WHEN (<7 BITS) INCREMENT Y
/	/	ELSE
/	/	/	RESET 7 BITS PER COLUMN COUNTER
/	/	/	INCREMENT X
/	/	////////FIN
/	////////FIN
////////FIN


DICHAR,	0
	JMP SETDOT	/OUT OF SPACE ON THIS PAGE SO GO TO A SMALL PART ELSEWHERE
	TAD I PNTTAB	/GET FIRST WORD OF CHARACTER DOT MATRIX INFORMATION
	SPA CLA		/IS FIRST BIT SET:
	TAD M6		/YES; CHARACTER IS SUBSCRIPTED; ADD -6 TO Y COORDINATE
	TAD LASTY	/ADD Y COORDINATE OF BEGINNING OF CHARACTER
	DCA BASEY	/AND STORE AS A BASE LINE VALUE FOR THE CCARACTER
	TAD BASEY	/GET THE BASELINE VALUE BACK
	DCA RUNY	/AND STORE IT AS A RUNNING VALUE FOR Y COORD@NATE
	TAD LASTX	/GET THE INITIAL VALUE FOR THE X COORDINATE OF THE CHARACTER
	DCA RUNX	/AND STORE IT AS A RUNNING VALUE FOR X COORDINATE
	TAD M7		/GET A MINUS 7
	DCA COUNT7	/AND STORE IT AS A COUNTER FOR 7 DOT POSITIONS PER COLUMN
	TAD M3		/GET A MINUS 3
	DCA COUNT3	/AND STORE IT AS A COUNTER FOR 3 12-BIT WORDS PER 35 BIT CHARACTER
	TAD M14		/GET A MINUS 12 (DECIMAL)
	DCA COUN14	/AND STORE IT AS A COUNTER FOR 12 BITS PER WORD
	TAD I PNTTAB	/GET THE  WORD POINTED TO IN THE TABLE
	CLL RAL		/MOVE THE SUBSCRIPT BIT OUT AND MOVE THE FIRST BIT TO SIGN
	DCA SHREG	/STORE THE SHIFTED WORD
	ISZ COUN14	/INCREMENT THE BITS PER WORD COUNTER
DOTLOP,	TAD SHREG	/GET THE SHIFTED DOT INFORMATION
	CLL RAL		/SHIFT THE NEXT DOT BIT TO THE LINK
	DCA SHREG	/AND STORE THE SHIFTED WORD AGAIN
	SZL		/IS BIT SET?
	JMS DISPPT	/YES; GO DISPLAY A POINT
	ISZ COUN14	/INCREMENT THE BITS PER WORD COUNTER
	JMP NOT14	/IF THE WORD IS NOT FININSHED, SKIP THE TERMINATE STUFF
	ISZ COUNT3	/ALL 12 BITS HAVE BEEN TAKEN OUT OF A WORD SO INCREMENT 
			/THE WORDS PER CHARACTER COUNTER
	JMP NOT3	/IF THREE WORDS HAVE NOT BEEN USED UP, SKIP THE TERMINATE CHARACTER STUFF
	TAD D14		/ALL 3 WORDS HAVE BEEN USED AND CHARACTER IS COMPLETE SO
			/GET A (DECIMAL) 14 TO
	TAD LASTX	/ADD TO THE BEGINNING X COORDINATE
	DCA LASTX	/AND STORE THE VALUE AS THE BEGINNING COORDINATE OF THE NEXT CHARACTER
	JMS ACRSON	/TURN THE ALPHANUMERIC CURSOR ON
	JMP I DICHAR	/AND LEAVE THE SUBROUTINE

NOT3,	ISZ PNTTAB	/POINT TO THE NEXT WORD IN THE DOT TABLE
	TAD I PNTTAB	/AND GET IT
	DCA SHREG	/AND STORE IT IN THE SHIFT REGISTER
	TAD M14		/GET THE VALUE TO
	DCA COUN14	/RESET THE BITS PER WORD COUNTER

NOT14,	ISZ COUNT7	/INCREMENT THE BITS PER COLUMN COUNTER
	JMP NOT7	/NOT YET 7 BITS THIS COLUMN SO SKIP THE COLUMN TERMINATE STUFF
	TAD M7		/7 BITS HAVE BEEN USED IN THIS COLUMN SO GET A MINUS 7
	DCA COUNT7	/TO RESET THE COUNTER
	CLA CLL IAC RAL /SET AC=2
	TAD RUNX	/ADD TO RUNNING X COORDINTE
	DCA RUNX	/TO FORM NEW RUNNING X COORDINATE
	TAD BASEY	/GET BASE VALUE FOR Y COORDINATE
	JMP .+3		/SKIP THIS STUFF FROM ANOTHER BRANCH

NOT7,	CLA CLL IAC RAL	/NOT AT END OF COLUMN SO ADD 2
	TAD RUNY	/TO THE RUNNING Y COORDINATE
	DCA RUNY	/AND SET NEW RUNNING Y
	JMP DOTLOP	/AND GO THROUGH THE CHECK IF BIT SET AND INTENSIFY LOOP AGAIN

BASEY,	0		/THE Y COORDINATE OF THE LOWER LEFT CORNER OF THE CHARACTER
RUNX,	0		/THE X COORDINATE OF THE DOT IN THE 5 X 7 MATRIX THAT IS BEING CONSIDERED NOW
RUNY,	0		/THE Y COORDINATE OF THE DOT IN THE 5 X 7 MATRIX THAT IS BEING CONSIDERED NOW
D14,	16		/DECIMAL 14:  THE WIDTH OF THE CHARACTER CELL
M3,	-3		/TO RESET THE 3 WORDS PER CHARACTER COUNTER
M6,	-6		/TO DEPRESS THE CHARACTER CELL 6 UNITS IF THE CHARACTER IS PRINTED BELOW THE LINE
M7,	-7		/TO RESET THE 7 DOTS PER COLUMN COUNTER
M14,	-14		/MINUS (DECIMAL) 12 TO RESET THE 12 BITS PER WORD COUNTER
COUNT3,	0		/THE WORDS PER CHARACTER COUNTER
COUNT7,	0		/THE BITS PER COLUMN COUNTER
COUN14,	0		/THE BITS PER WORD WOUNTER
SHREG,	0		/TEMPORARY HOLDING FOR THE TABLE WORD AS THE BITS ARE BEING UNPACKED

	PAGE

SETDOT,	DCA LX		/BECAUSE THIS IS A NEW CHARACTER, CLEAR THE VALUE REMEMBERED FOR
	DCA LY		/THE LAST VALUES OF THE X AND Y DAC'S
	JMS ACRSOF	/TURN THE ALPHANUMERIC CURSOR OFF
	JMP DICHAR+2	/AND RETURN TO THE PART ON THE PREVIOUS PAGE
/TO DISPLAY-A-POINT
/	IF (NEW VALUE FOR Y) SET Y DAC
/	IF (NEW VALUE FOR X) SET X DAC
/	INTENSIFY
////////FIN

DISPPT,	0
	TAD RUNY	/GET PRESENT Y COORDINATE FOR POINT
	CIA		/AND SUBTRACT IT FROM
	TAD LY		/THE LAST VALUE SET IN THE Y DAC
	SNA CLA		/IS IT THE SAVME?
	JMP .+4		/YES; SKIP AHEAD
	TAD RUNY	/NO; GET THE PRESENT Y VALUE
	DILY		/LOAD IT IN THE Y DAC
	DCA LY		/AND REMEMBER IT

	TAD RUNX	/GET PRESENT X COORDINATE FOR POINT
	CIA		/AND SUBTRACT IT FROM
	TAD LX		/THE LAST VALUE SET IN THE X DAC
	SNA CLA		/IS IT THE SAME?
	JMP .+4		/YES; SKIP AHEAD
	TAD RUNX	/NO; GET THE PRESENT X VALUE
	DILX		/LOAD IT IN THE X DAC
	DCA LX		/AND REMEMBER IT

	DISD		/ARE THE DAC'S SETTLED?
	JMP .-1		/NO; TRY AGAIN
	DIXY		/YES; INTENSIFY THE POINT
	JMP I DISPPT	/AND LEAVE THE SUBROUTINE

LX,	0		/THE LAST VALUE SET IN THE X DAC
LY,	0		/THE LAST VALUE SET IN THE Y DAC
	IFNZRO PLOTER <
/TO PLOT-CHARACTER
/	GET COORDINATE WORD
/	REPEAT UNTIL (FIRST WORD OF NEXT CHARACTER)
/	/	SET UP X COORDINATE OF VECTOR
/	/	SET UP Y COORDINATE OF VECTOR
/	/	IF (DARK VECTOR) SET DARK VECTOR FLAG
/	/	DISPLAY-VECTOR
/	/	GET NEXT COORDINATE WORD
/	////////FIN
////////FIN


PLCHAR,	0
	TAD I PNTTAB	/GET WORD CONTAINING VECTOR COORDINATES FROM TABLE
NXTVEC,	BSW		/INTERCHANGE BYTES
	SPA		/IS BIT 6 OF ORIGINAL WORD SET?
	ISZ DKVECT	/YES; VECTOR IS DARK SO SET FLAG
	CLL RAR		/MOVE SIGN BIT TO LINK AND SET COORDINATE VALUES UP PROPERLY
	AND LS4BTS	/MASK THE COORDINATE INFORMATION
	SZL		/IS THE NEGATIVE BIT SET?
	CIA		/YES; NEGATE THE RELATIVE COORDINATE AND THEN
	TAD LASTX	/ADD THE LAST VALUE TO THE NEW (RELATIVE) COORDINATE
	DCA NEWX	/STORE THE VALUE AS THE NEW X COORDINATE
	TAD I PNTTAB	/GET THE COORDINATE WORD AGAIN
	CLL RAR		/MOVE THE SIGN BIT TO THE LINK AND SET UP THE COORDINATE INFO PROPERLY
	AND LS4BTS	/MASK THE COORDINATE INFORMATION
	SZL		/IS THE NEGATIVE BIT SET?
	CIA		/YES; NEGATE THE RELATIVE COORDINATE AND THEN
	TAD LASTY	/ADD THE LAST VALUE TO THE NEW (RELATIVE) COORDINATE
	DCA NEWY	/AND STORE THE VALUE AS THE NEW Y COORDINATE
	JMS DISVEC	/NOW GO DISPLAY THE VECTOR
	ISZ PNTTAB	/POINT TO THE NEXT WORD (COORDINATE PAIR)
	TAD I PNTTAB	/GET IT
	SMA		/IS IT THE FIRST WORD OF THE NEXT CHARACTER?
	JMP NXTVEC	/NO; IT IS THE NEXT VECTOR OF THIS CHARACTER SO TREAT IT AS SUCH
	CLA		/YES; CLEAR THE AC
	JMP I PLCHAR	/AND LEAVE THE SUBROUTINE

LS4BTS,	17		/MASK FOR THE LEAST SIGNIFICANT 4 BITS (THE COORDINATE INFO)




/TO NEXTLINE-
/	LINEFEED-
/	MARGIN-
////////FIN


NXTLIN,	0
	JMS LINFED	/LINEFEED
	JMS GOMARG	/GO TO MARGIN
	JMP I NXTLIN	/LEAVE THE SUBROUTINE
/TO LINEFEED-
/	WHEN (TTY) MOVE DOWN ONE LINE
/	ELSE
/	/	COUNT LINE
/	/	WHEN (LINE # < 35) MOVE DOWN ONE LINE
/	/	ELSE
/	/	/	CHANGE MARGIN
/	/	/	MOVE TO LINE 1
/	/	/	WHEN (MARGIN 1)
/	/	/	/	WHEN (CHARACTER COUNT > 37)
/	/	/	/	/	SET CHARACTER COUNT = 37
/	/	/	/	/	X COORDINATE = 0
/	/	/	/	////////FIN
/	/	/	/	ELSE
/	/	/	/	/	SET CHARACTER COUNT = CHARACTER COUNT + 37
/	/	/	/	/	SET X COORDINATE = LAST X COORDINATE + 1000
/	/	/	/	////////FIN
/	/	/	////////FIN
/	/	/	ELSE
/	/	/	/	SET CHARACTER COUNT = CHARACTER COUNT - 37
/	/	/	/	SET X COORDINATE = LAST X COORDINATE - 1000
/	/	/	////////FIN
/	/	////////FIN
/	////////FIN
////////FIN


LINFED,	0
	TAD ALTAN	/GET ALT ALPHANUMERIC DEVICE (TTY) BIT
	AND STATUS	/FROM THE STATUS WORD
	SNA CLA		/IS IT SET?
	JMP NTTY	/NO; DEVICE IS NOT TTY
	TAD LF		/DEVICE IS TTY SO GET LF CHARACTER
	JMS TYPE	/AND TYPE IT
	JMP LINFEX	/AND GO TO EXIT POINT

NTTY,	ISZ LINECT	/DEVICE IS NOT TTY SO INCREMENT THE LINECOUNT
	TAD LINECT	/GET THE LINECOUNT
	TAD MD35	/AND SUBTRACT (DECIMAL) 35
	SMA CLA		/DOES THIS MAKE THE NEW LINE NUMBER > 35?
	JMP MARG1	/YES;  GO CHECK SOME MORE STUFF
	TAD LASTX	/NO; GET THE LAST X COORDINATE
	DCA NEWX	/AND STORE IT AS THE NEW VALUE
	TAD LASTY	/GET THE LAST Y  COORDINATE
	TAD MD22	/AND SUBTRACT (DECIMAL) 22
	JMP GOLIN	/AND GO DO THE LINEFEED

MARG1,	TAD MARGIN	/GET THE ALTERNATE MARGIN BIT
	AND STATUS	/FROM THE STATUS WORD
	SNA CLA		/IS IT SET?
	TAD MARGIN	/NO; GET MARGIN BIT
	MQL		/AND STORE IT (OR ZERO) IN THE MQ REGISTER
	TAD MARGIN	/GET THE MARGIN BIT AGAIN
	CMA		/COMPLEMENT IT; I.E., COMPLEMENT THE MASK
	AND STATUS	/AND MASK ALL BUT THE MARGIN BIT FROM THE STATUS WORD
	MQA		/BRING IN WHAT WAS STORED IN MQ; THIS SEQUENCE ALWAYS REVERSES
			/THE MARGIN BIT IN THE STATUS WORD
	DCA STATUS	/AND RESTORE THE STATUS WORD
	DCA LINECT	/RESET THE LINECOUNTER SINCE A NEW MARGIN HAS BEEN SET
	TAD MARGIN	/GET THE MARGIN BIT AGAIN
	AND STATUS	/FROM THE STATUS WORD
	SNA CLA		/IS IT SET?
	JMP MR0		/NO; SO THE MARGIN IS  THE NORMAL ONE; GO TO THE RIGHT SEQUENCE
	TAD CHARCT	/YES; MARGIN IS ALTERNATE ONE; GET CHARACTER COUNT
	TAD MD37	/AND SUBTRACT 37
	SPA CLA		/IS COUNT > 37?
	JMP .+4		/NO; JUMP AHEAD
	TAD D37		/YES; CHARACTER WILL BE OFF RIGHT OF SCREEN SO 
	DCA CHARCT	/SET CHARACTER COUNT = 37 (= ALTERNATE MARGIN VALUE)
	JMP GOLIN-2	/AND GO WRAP THE SUBROUTINE UP

	TAD D37		/CHARACTER COUNT IS < 37 SO X VALUE IS OK; ADD 37
	TAD CHARCT	/TO THE CHARACTER COUNT
	DCA CHARCT	/AND STORE THE  NEW VALUE
	TAD P1000	/ADD 1000 (OCTAL)
	JMP GOLIN-3	/TO THE LAST X VALUE AND WRAP UP THE ROUTINE

MR0,	TAD MD37	/NORMAL MARGIN IS SPECIFIED SO SUBTRACT 37
	TAD CHARCT	/FROM THE CHARACTER COUNT
	DCA CHARCT	/AND STORE THE NEW VALUE
	TAD M1000	/SUBTRACT 1000 (OCTAL) FROM THE
	TAD LASTX	/LAST X VALUE
	DCA NEWX	/AND STORE IT
	TAD HOMEY	/GET THE HOME VALUE FOR THE Y COORDINATE (TOP OF SCREEN)
GOLIN,	DCA NEWY	/AND STORE IT AS THE NEX Y COORDINATE
	ISZ DKVECT	/SET THE DARK VECTOR FLAG
	JMS DISVEC	/AND GO DISPLAY THE DARK VECTOR I.E., MOVE TO THE NEW MARGIN
LINFEX,	JMP I LINFED	/LEAVE THE SUBROUTINE

MD35,	-43		/MINUS (DECIMAL) 35
MD22,	-26		/MINUS (DECIMAL) 22
MD37,	-45		/MINUS (DECIMAL) 37
P1000,	1000		/OFFSET VALUE FOR HALF OF SCREEN IN X DIRECTION
LF,	212		/ASCII FOR LF



	PAGE
/TO SPACE-
/	GET ASCII FOR SPACE
/	PRINT IT
////////FIN


SPACE,	0
	TAD SPAC	/GET ASCII FOR SPACE
	DCA HOCHAR	/PRETEND IT CAME FROM HOST
	JMS PRCHAR	/AND USE PRINT ROUTINE
	JMP I SPACE	/LEAVE SUBROUTINE

SPAC,	40		/ASCII FOR SPACE





/TO BACKSPACE-
/	DECREMENT CHARACTER COUNT
/	IF (TTY) PRINT BACKSPACE CHARACTER
/	ELSE MOVE BEAM BACK ONE CHARACTER CELL
////////FIN


BACKSP,	0
	CMA		/SET AC = -1
	TAD CHARCT	/AND ADD THE CHARACTER COUNT
	DCA CHARCT	/AND STORE THE DECREMENTED VALUE
	TAD ALTAN	/GET THE ALTERNATE ALPHANUMERIC DEVICE (TTY) BIT
	AND STATUS	/FROM THE STATUS WORD
	SZA CLA		/IS ALT DEVICE BIT SET?
	JMP PRBACK	/YES; GO TO THE PROPER PLACE
	TAD MD14	/NO; ADD MINUS (DECIMAL) 14 TO
	TAD LASTX	/THE PRESENN CHARACTER ORIGIN POSITION
	DCA LASTX	/AND STORE AS THE NEW CHARACTER X ORIGIN
	JMP BACKEX	/AND GO TO THE EXIT POINT

PRBACK,	TAD BAKSP	/GET ASCII FOR BACKSPACE
	JMS TYPE	/AND TYPE IT
BACKEX,	JMP I BACKSP	/AND LEAVE THE SUBROUTINE

BAKSP,	210		/ASCII FOR BACKSPACE
MD14,	-16		/MINUS (DECIMML) 14 (THE WIDTH OF A CHARACTER CELL)

/TO GO-TO-MARGIN
/	WHEN (TTY)
/	/	CARRAIGE RETURN
/	/	SET CHARACTER COUNT = 0
/	////////FIN
/	ELSE
/	/	WHEN (MARGIN 0)
/	/	/	MOVE TO MARGIN 0
/	/	/	SET CHARACTER COUTN = 0
/	/	////////FIN
/	/	ELSE
/	/	/	MOVE TO MARGIN 1
/	/	/	SET CHARACTER COUNT = 37
/	/	////////FIN
/	////////FIN
////////FIN


GOMARG,	0
	TAD ALTAN	/GET THE ALTERNATE ALPHANUMERIC DEVICE (TTY) BIT
	AND STATUS	/FROM THE STATUS WORD
	SNA CLA		/IS TTY BIT SET?
	JMP .+5		/NO; JUMP AHEAD
	TAD CR		/YES; GET ASCII FOR CR
	JMS TYPE	/AND TYPE IT
	DCA CHARCT	/SET CHARACTER COUNT = 0
	JMP MARGEX	/AND GO TO EXIT POINT

	TAD MARGIN	/GET MARGIN BIT
	AND STATUS	/FROM STATUS WORD
	SZA CLA		/WHICH MARGIN?
	JMP MAR1	/MARGIN 1 (ALTERNATE MARGIN)
	DCA CHARCT	/MARGIN 0; RESET CHARACTER COUNTER = 0
	TAD MAR0X	/GET X COORDINATE OF MARGIN 0
	JMP GOMAEX	/AND GO TO THAT VALUE
MAR1,	TAD D37		/MARGIN 1; GET (DECIMAL) 37
	DCA CHARCT	/AND SET CHARACTER COUNTER
GOMAEX,	DCA NEWX	/SET NEW X COORDINATE =0 FOR MARGIN 1 OR = -1000 FOR MARGIN 0
	ISZ DKVECT	/SET DARK VECTOR FLAG
	JMS DISVEC	/AND GO DISPLAY VECTOR (MOVE TO MARGIN )
MARGEX,	JMP I GOMARG	/AND EXIT THE SUBROUTINE

D37,	45		/DECIMAL 37 = CHARACTER COUNT OF HALF SCREEN (MARGIN 1)
MAR0X,	-1000		/X COORDINATE OF LEFT MMRGIN (MARGIN 0)

/TO TURN-ALPHANUMERIC-CURSOR-ON
/	IF (AN MODE)
/	/	SET CURSOR BIT IN VC8E REGISTER
/	/	ADD ONE HALF CELL WIDTH TO X COORDINATE AND SET DAC
/	/	ADD ONE HALF CELL HEIGHT TO Y COORDINATE AND SET DAC
/	////////FIN
////////FIN

ACRSON,	0
	TAD MODMSK	/GET MASK FOR MODE BITS
	IFNZRO PLOTER <
	TAD HCMODE	/AND MASK FOR HC MODE BIT IF THERE IS A PLOTTER
	>
	AND STATUS	/MASK THE MODE BITS FROM THE STATUS WORD
	SZA CLA		/IS ANY OF THE BITS SET
	JMP I ACRSON	/YES; MODE IS NOT AN SO LEAVE THE SUBROUTINE
	TAD CRSBT	/NO; GET THE CURSOR BIT
	MQL		/PUT IT IN THE MQ REGISTER
	DIRE		/READ THE VC8E REGISTER
	MQA		/AND SET THE CURSOR BIT
	DILE		/AND SET THE VC8E REGISTER
	TAD P5		/GET PLUS 5
	TAD LASTX	/AND ADD THE LAST X COORDINATE
	DILX		/SET THE CENTER OF CHARACTER CELL VALUE IN THE X DAC
	CLA		/DILX DOESN'T CLEAR AC SO DO IT
	TAD P6		/GET PLUS SIX
	TAD LASTY	/AND ADD THE LAST Y COORDINATE
	DILY		/SET THE CENTER OF CHARACTER CELL VALUE IN THE Y DAC
	CLA		/DILY DOESN'T CLEAR THE AC SO DO IT
	JMP I ACRSON	/LEAVE THE SUBROUTINE

P5,	5		/HALF THE CHARACTER CELL WIDTH TO PUT THE CURSOR OVER THE CENTER OF CELL
P6,	6		/HALF THE CHARACTER CELL HEIGHT TO PUT THE CURSOR OFER THE CENTER OF CELL


/TO TURN-ALPHANUMERIC-CURSOR-OFF
/	CLEAR CURSOR BIT IN VC8E REGISTER
/	WAIT FOR REGISTER SETTLE
////////FIN


ACRSOF,	0
	DIRE		/GET VC8E REGISTER
	AND MCRSBT	/MASK ALL BUT CURSOR BIT
	DILE		/RELOAD THE REGISTER WITH CURSOR BIT CLEAR
	JMS WAITCR	/GO TO A WAIT LOOP
	JMP I ACRSOF	/AND EXIT THE SUBROUTINE
/TO WAIT-FOR-CURSOR-TO-TURN-ON-OR-OFF

WAITCR,	0
	TAD CURWAT	/GET TIMING CONSTANT
	DCA WAIT2	/SET COUNTER
	ISZ WAIT2	/INCREMENT COUNTER
	JMP .-1		/INCREMENT AGAIN UNTIL ZERO THEN
	JMP I WAITCR	/EXIT THE WAIT SUBROUTINE

CURWAT,	-3000		/TIMING CONSTANT FOR CURSOR WAIT
WAIT2,	0		/COUNTER FOR TIMING LOOP




	IFNZRO PLOTER <
/TO WAIT-FOR-PEN-TO-SLEW-OFF-PAGE

WAITSL,	0
	CLA		/CLEAR AC BECAUSE IT IS NOT ALWAYS DONE ELSEWHERE
	TAD MIN40	/GET TIMEING CONSTANT
	DCA WAIT1	/AND SET OUTER LOOP COUNTER
	ISZ WAIT2	/INCREMENT INNER LOOP COUNTER
	JMP .-1		I/GO BACK TO DO IT AGAIN UNLESS COUNT = 0 THEN
	ISZ WAIT1	/LEAVE INNER LOOP AND INCREMENT OUTER LOOP COUNTER
	JMP .-3		/GO BACK TO THE INNER LOOP UNLESS OUTER LOOP COUNT = 0 THEN
	JMP I WAITSL	/LEAVE THE SUBROUTINE

MIN40,	-40		/LOOP COUNTER FOR WAIT
WAIT1,	0		/COUNTER FOR OUTER LOOP
	>

	PAGE
/TO DISPLAY-A-VECTOR
/	GET X1, X2, Y1, Y2
/	CALCULATE DX = ABS (X2-X1)
/	CALCULATE DY = ABS (Y2-Y1)
/	CALCULATE SLOPE = DY/DX AND SIGN OF SLOPE
/	IF (SLOPE > 1) REVERSE DY AND DX
/	IF (DX=0) EXIT
/	SET STEP DIRECTION
/	IF (PLOTTER) SET X2 OVERSHOOT TO ALLOW FOR PEN DRAG, BUT DO NOT WRAP AROUND END OF PAGE
/	REPEAT UNTIL (RUNNING X = X2)
/	/	STEP X
/	/	LOAD X DAC
/	/	MULTIPLY-SLOPE-TIMES-RUNNING-X
/	/	ADD INTERCEPT TO GET RUNNING Y
/	/	LOAD Y DAC
/	/	WHEN (PLOTTER) ENTER WAIT LOOP
/	/	ELSE INTENSIFY
/	////////FIN
////////FIN


VECT,	0		/ENTRY
	TAD LASTX	/=X1
	DCA VECX1	/STORE LOCALLY
	TAD LASTY	/=Y1
	DCA VECY1	/STORE LOCALLY
	TAD NEWX	/=X2
	DCA VECX2	/STORE LOCALLU
	TAD NEWY	/=Y2
	DCA VECY2	/STORE LOCALLY

	DCA SIGNSL	/CLEAR SIGN
	TAD VECX1	/GET X1
	CIA		/AND SUBTRACT FROM
	TAD VECX2	/X2
	SMA		/IF POSITIVE
	JMP .+3		/JUMP AHEAD
	CIA		/ELSE NEGATE TO MAKE IT POSITIVE
	ISZ SIGNSL	/AND COMPLEMENT THE SIGN FLAG TO REMEMBER ONE OF THE
			/QUANTITIES USED TO COMPUTE THE SLOPE IS NEGATIVE
	DCA DX		/AND STORE ABS (X2-X1)

	TAD VECY1	/GET Y1
	CIA		/AND SUBTRACT IT FROM
	TAD VECY2	/Y2
	SMA		/IF POSITIVE
	JMP .+3		/JUMP AHEAD
	CIA		/ELSE NEGATE IT TO MAKE IT POSITIVE
	ISZ SIGNSL	/COMPLEMENT THE SIGN FLAG BECAUSE ONE OF THE
			/QUANTITIES USED TO CALCULATE THE SLOPE IS NEGATIVE
	DCA DY		/AND STORE ABS (Y2-Y1)
	TAD SIGNSL	/GET  SIGN OF SLOPE AND
	RAR		/MOVE PARITY BIT TO LINK
	CLA		/THROW AWAY THE REST
	TAD LNOP	/=7000
	SZL		/IS SIGN OF SLOPE NEGATIVE?
	TAD L41		/YES; CHANGE NOP TO CIA
	DCA SIGNSL	/NOP (7000) IF SLOPE POS; CIA (7041) IF NEG

	TAD DX		/GET DX
	CIA		/AND SUBTRACT FROM
	TAD DY		/DY
	SMA SZA CLA	/IF DY > DX, SLOPE.GT.1 SO
	JMP REVERS	/REVERSE X AND Y IN CALCULATION AND FOR LOADING DACS
SLOPOK,	TAD LDILX	/OTHERWISE, SET DISPLAY COMMANDS NORMAL; GET THE DILX COMMAND
	DCA LDX		/AND PUT IT IN THE NORMAL PLACE TO LOAD X DAC
	TAD LDILY	/GET THE DILY COMMAND
	DCA LDY		/AND PUT IT IN THE NORMAL PLACE TO LOAD Y DAC

SETSTP,	TAD VECX1	/GET X1
	CIA		/AND COMPARE TO
	TAD VECX2	/X2
	SNA		/IF X1=X2, VECTOR LENGTH IS ZERO SO
	JMP I VECT	/EXIT THE SUBROUTINE
	CLL RAL		/OTHERWISE, ROTATE THE SIGN OF X2-X1 INTO LINK
	CLA CML RAL	/AC=1 FOR POSITIVE DIRECTION; =0 FOR NEG
	SNA		/IF NEGATIVE DIRECTION,
	CLL STA		/SET AC =-1
	DCA STEP	/STORE SIGNED STEPSIZE
	IFNZRO PLOTER <
	TAD HCMODE	/GET PLOT (HC MODE) BIT
	AND STATUS	/FROM STATUS WORD
	SNA CLA		/IS IT SET?
	JMP .+6		/NO; JUMP AHEAD
	TAD STEP	/YES; INCREMENT X2 BY
	TAD STEP	/THREE STEPSIZES; THIS OVERSHOOT COMPENSATES FOR
	TAD STEP	/THE PEN DRAG AND DEAD BAND IN THE HP 7015 PLOTTER
	TAD VECX2	/USERS OF OTHER PLOTTERS MAY ADJUST THIS PART FOR BEST RESULTS
	DCA VECX2	/STORE THE X2 PLUS OVERSHOOT
	TAD VECX2	/GET X2 (WITH OVERSHOOT IF HC MODE)
	CLL RTL		/MOVE 10-BIT VALUE TO MS 10 BITS SO SIGN IS IN MS BIT
	SMA		/IS X DAC VALUE NEGATIVE?
	JMP POSAC	/NO; GO TO THE POSITIVE BRANCH
	SZL CLA		/YES; WAS X COORDINATE (12-BIT VALUE) NEGATIVE?
	JMP X2OK	/YES; X COORDINATE AND DAC LOAD AGREE WITH NO ROLLOVER
	TAD (777	/NO; ROLLOVER HAS OCCURRED, GET MAXIMUM X SCREEN VALUE
	JMP .+4		/AND TAKE IT AHEAD

POSAC,	SNL CLA		/X DAC VALUE WAS POSITIVE; WAS 12-BIT COORDINATE POSITIVE?
	JMP X2OK	/YES; EVERYTHING OK
	TAD (-1000	/NO; ROLLOVER HAS OCCURRED; GET MINIMUM X SCREEN VALUE

	DCA VECX2	/DEPOSIT PROPER (NON-ROLLOVER) VALUE IN X2
	>
X2OK,	TAD VECX1	/GET X1
	JMP VECTGO	/AND JUMP INTO THE LOOP AT THE PROPER PLACE

VECLOP,	TAD VECX	/GET THE OLD RUNNING VALUE OF X
	CIA		/AND COMPARE IT TO
	TAD VECX2	/THE FINAL VALUE OF X (PERHAPS WITH OVERSHOOT)
	SNA CLA		/DO THEY AGREE?
	JMP I VECT	/YES; VECTOR IS FINISHED; LEAVE THE SUBROUTINE
	TAD VECX	/NO; GET THE RUNNING VALUE BACK
	TAD STEP	/INCREMENT IT BY A STEP OF THE PROPER SIGN
VECTGO,	DCA VECX	/AND STORE THE NEW RUNNING VALUE OF X
	TAD VECX	/GET THE NEW VALUE AGAIN
LDX,	0		/DILX (OR, IF REVERSED, DILY) WILL HAVE BEEN PUT HERE
	CIA		/COMPARE THE VALUE JUST LOADED TO
	TAD VECX1	/X1
	SZA		/ARE THEY THE SAME?
	JMS VECMUL	/NO; GO MULTIPLY (X1-RUN X) BY THE SLOPE AND RETURN WITH VALUE IN AC
	CIA		/CHANGE SIGN BECAUSE DX = (RUN X - X1),NOT (X1-RUN X)
	TAD VECY1	/ADD Y1 AND RESULT IS RUNNING VALUE OF Y
LDY,	0		/DILY (OR, IF REVERSED, DILX) WILL HAVE BEEN PUT HERE
	CLA CLL		/CLEAR ALL UNNECESSARY JUNK BECAUSE DILX AND DILY DON'T DO IT
	IFNZRO PLOTER <
	TAD STATUS	/GET THE STATUS WORD
	AND HCMODE	/AND MASK THE HC (PLOT) MODE BIT
	SZA CLA		/IS HC MODE SET?
	JMP .+6		/YES; GO TO THE PLOT PART
	>
	TAD DKVECT	/NO; GET DARK VECTOR FLAG
	SZA CLA		/IS FLAG SET?
	JMP VECLOP	/YES; NOTHING TO DISPLAY SO LOOP TO NEXT POINT IN VECTOR
	DIXY		/NO; POINT MUST BE DISPLAYED; INTENSIFY THE POINT
	JMP VECLOP	/NOW LOOP FOR THE NEXT POINT

	IFNZRO PLOTER <
	JMS WAITVC	/THE PLOTTER SERVOS ARE DRIVEN DIRECTLY FROM THE DACS AND
			/THE SERVOS NEED TIME TO MOVE, SO GO TO A WAIT LOOP
	JMP VECLOP	/AND NOW GO CALCULATE AND PLOT THE NEXT POINT IN THE VECTOR
	>
VECX1,	0		/LOCAL STORAGE OF X COORDINATE OF BEGINNING POINT OF VECTOR
VECY1,	0		/LOCAL STORAGE OF Y COORDINATE OF BEGINNING POINT OF VECTOR
VECX2,	0		/LOCAL STORAGE OF X COORDINATE OF ENDING POINT OF VECTOR
VECY2,	0		/LOCAL STORAGE OF Y COORDINATE OF ENDING POINT OF VECTOR
VECX,	0		/RUNNING VALUE OF X
STEP,	0		/THE SIGNED VALUE OF THE STEP IN X TO BE USED TO CALCULATE THE NEW RUNNING X

LDILX,	DILX		/A COMMAND TO BE READ AND INSERTED  AT PROPER PLACE
LDILY,	DILY		/DITTO
LNOP,	NOP		/DITTO
L41,	41		/THE VALUE TO CHANGE A NOT (7000) TO A CIA (7041)
	


/TO WAIT FOR PLOTTER SERVOS TO RESPOND TO VALUES LOADED INTO DAC'S

	IFNZRO PLOTER <
WAITVC,	0
	TAD VECTIM	/GET TIME CONSTANT SET BY USER ON PAGE ZERO
	DCA VCTIMC	/AND STORE AS LOCAL COUNTER
	ISZ VCTIMC	/INCREMENT THE COUNTER
	JMP .-1		/REPEAT IF COUNTER NOT RUN OUT
	JMP I WAITVC	/WHEN COUNTER RUNS OUT, LEAVE THE WAIT SUBROUTINE

VCTIMC,	0		/LOCAL STORAGE OF THE COUNTER
	>


	PAGE
/TO  MULTYPLY-AC-BY-SLOPE-AND-RETURN-RESULT-IN-AC
/	IF (AC NEGATIVE) 
/	/	CHANGE TO POSITIVE
/	/	REMEMBER SIGN CHANGE
/	////////FIN
/	WHEN (DY=0) EXIT WITH AC CLEAR
/	ELSE
/	/	MULTIPLY-BY-DY
/	/	DIVIDE-BY-DX
/	/	NEGATE RESULL IF AC WAS NEGATIVE UPON ENTRY
/	////////FIN
////////FIN


VECMUL,	0
	SMA		/IS AC NEGATIVE?
	JMP .+3		/NO; SKIP NEXT PART
	CIA		/YES; MAKE IT POSITIVE
	ISZ VECMUL	/AND CHANGE THE RETURN POINT SO A CIA IS SKIPPED
	MQL		/PUT THE VALUE IN THE MQ TO SET UP FOR THE TWO REGISTER MULTIPLY-DIVIDE
	TAD DY		/GET DY IN THE AC
	SNA CLA		/IS IT ZERO?
	JMP I VECMUL	/IF SO, RETURN 0
	MUY		/IF NOT, GO MULTIPLY AC (NOW IN MQ) BY DY
DY,	0		/ARGUMENT FOR MULTIPLICATION (DY) IS  STORED HERE
	DVI		/NOW DIVIDE BY DX
DX,	0		/WHICH IS STORED HERE
	CLA MQA		/BRING THE RESULT OF THE MULTIPLY AND DIVIDE 
			/(WHICH IS SINGLE PRECISION) BACK INTO THE AC
SIGNSL,	0		/NOP OR CIA
	JMP I VECMUL	/AND RETURN WITH THE RESULT


REVERS,	TAD VECY2	/REPLACE X2 WITH Y2
	DCA VECX2

	TAD LASTY	/REVERSE THE INITIAL VALUES OF X AND Y
	DCA VECX1
	TAD LASTX
	DCA VECY1

	TAD DX		/INTERCHANGE DX AND DY
	DCA VCTEM
	TAD DY
	DCA DX
	TAD VCTEM
	DCA DY

	TAD LDILX	/SET DISPLAY COMMANDS REVERSE
	DCA LDY
	TAD LDILY
	DCA LDX
	JMP SETSTP	/AND GO BACK TO REGULAR SEQUENCE

VCTEM,	0		/TEMPORARY STORAGE FOR REVERSAL OV VALUES
/TO MULTIPLY (MULTIPLIER IN MQ, MULTIPLICAND IN ARGUMENT POSITION)
/	IF (MULTIPLICAND NEGATIVE)
/	/	TAKE ABSOLUTE VALUE OF MULTIPLICAND
/	/	REMEMBER SIGN CHANGE
/	////////FIN
/	IF (MULTIPLIER NEGATIVE)
/	/	TAKE ABSOLUTE VALUE OF MULTIPLIER
/	/	REMEMBER SIGN CHANGE
/	////////FIN
/	DO (12 TIMES)
/	/	IF (LS BIT IN MULTIPLIER = 1) ADD MULTIPLICAND TO AC
/	/	SHIFT AC AND MQ, DROPPING LS BIT OF MQ
/	////////FIN
/	FIX SIGN OF PRODUCT
////////FIN


	IFZERO EAE <
MULTPY,	0		/ENTRY TO MULTIPLY ROUTINE
	CLA CLL		/CLEAR AC AND LINK (MULTIPLIER IS IN MQ)
	TAD MDCONS	/GET DECIMAL -12 TO
	DCA MDCOUN	/SET UP COUNTER
	TAD I MULTPY	/GET THE MULTIPLICAND FROM THE ARGUMENT POSITION
	ISZ MULTPY	/BUMP POINTER TO THE RETRUN ADDRESS
	SPA CLL		/IS MULTIPLICAND POSITIVE?
	CIA STL		/NO, MAKE IT POSITIVE AND SET LINK AS REMINDER
	DCA MPCND	/STORE THE ABS VALUE OF MULTIPLICAND
	CLA MQA		/BRING MULTIPLIER INTO AC
	SPA		/IS MULTIPLIER NEGATIVE?
	CIA CML		/YES; MAKE IT POSITIVE AND COMPLEMENT LINK AS REMINDER
	RAR		/BEGINNING OF MULTIPLY LOOP; MOVE LS BIT OF MULTIPLIER INTO LINK
			/(FIRST TIME THROUGH THIS LOOP, SIGN OF PRODUCT GOES INTO SIGN POSITION;
			/THEREAFTER IT IS SHIFTED RIGHT)
	SWP		/PUT PARTIAL MULTIPLIER (AND SIGN OF PRODUCT) BACK INTO MQ
	SZL		/WAS LS BIT SHIFTED OUT OF MULTIPLIER 1?
	TAD MPCND	/YES; ADD MULTIPLICAND INTO PARTIAL PRODUCT AT THIS POSITION
	CLL RAR		/NOW THROW AWAY THE MULTIPLIER BIT AND SHIFT PARTIAL PRODUCT
			/(LS BIT GOES INTO LINK)
	SWP		/PARTIAL PRODUCT TO MQ, PARTIAL MULTIPLIER INTO AC
	ISZ MDCOUN	/INCREMENT THE 12 BIT COUNTER
	JMP .-7		/GO AROUND THE LOOP AGAIN IF NOT DONE 12 TIMES

	RAR		/MOVE THE SIGN OF THE PRODUCT INTO LINK
	SZL		/IF BIT IS SET,
	CIA		/COMPLEMENT AND INCREMENT THE LS HALF OF THE PRODUCT
	SWP		/REVERSE THE PARTS OF THE PRODUCT (MS HALF NOW IN AC)
	SZL		/IF SIGN BIT IS SET, 
	CMA		/AIMPLY COMPLEMENT THE MS HALF
	CLL		/NOW THROW AWAY THE SIGN
	JMP I MULTPY	/AND LEAVE THE SUBROUTINE WITH MS PART IN AC, LS PART IN MQ
/TO DIVIDE (MS PART OF DIVIDEND IN AC, LS PART IN MQ; SIGN PROPERLY SET)
/	IF (DIVIDEND NEGATIVE) 
/	/	TAKE ABSOLUTE VALUE
/	/	REMEMBER SIGN CHANGE
/	////////FIN
/	IF (DIVISOR NEGATIVE)
/	/	TAKE ABSOLUTE VALUE
/	/	REMEMBER SIGN CHANGE
/	////////FIN
/	DO (12 TIMES)
/	/	SUBTRACT DIVISOR
/	/	WHEN (DIVIDEND GOES NEGATIVE) ADD DIVISOR BACK TO DIVIDEND
/	/	ELSE SET LS BIT OF QUOTIENT
/	/	SHIFT PARTIAL QUOTIENT AND DIVIDEND
/	////////FIN
/	FIX SIGN OF QUOTIENT
////////FIN


DIVIDE,	0		/ENTRY TO DIVIDE ROUTINE
	CLL		/CLEAR LINK AS PLACE TO REMEMBER NUMBER OF SIGN CHANGES
	SPA		/IS DIVIDEND NEGATIVE?
	CMA STL		/YES; COMPLEMENT THE MS PART AND SET LINK TO REMEMBER
	SWP		/GET THE LS PART INTO AC
	SZL		/ARE WE NEGATING DIVIDEND?
	CIA		/YES; COMPLEMENT AND INCREMENT THE LS PART
	DCA MDTEMP	/STORE THE LS PART SOMEPLACE SO WE HAVE AC FREE TEMPORARILY
	TAD I DIVIDE	/GET THE DIVISOR FROM THE ARGUMENT POSITION
	SPA		/IS IT NEGATIVE?
	CML		/YES; COMPLEMENT THE LINK TO REMEMBER THIS
	SMA		/IS DIVISOR NEGATIVE (SORRY, WE MUST ASK AGAIN)
	CIA		/NO; MAKE IT NEGATIVE
	DCA DIVSOR	/AND STORE NEGATIVE OF ABS VALUE OF DIVISOR TO USE IN SUBTRACTIONS
	TAD MDCONS	/GET MINUS DECIMAL 12
	DCA MDCOUN	/AND SET 12 BIT COUNTER
	TAD MDTEMP	/GET BACK LS PART OF DIVIDEND
	RAL		/SHIFT SIGN OF QUOTIENT INTO LS END OF QUOTIENT, SHIFT DIVIDEND
	SWP		/ONE PLACE TO THE LEFT AND EXCHANGE SO MS PART OF DIVIDEND IS IN AC AND
	RAL		/SHIFT SIGN OF DIVIDEND (NECESSARILY ZERO) INTO LINK

/HERE IS AN ERROR CHECKING PART THAT WILL TRAP EITHER ZERO DIVISOR OR QUOTIENT OVERFLOW.
/LINK WILL BE SET UPON RETURN TO INDICATE ERROR CGNDITION AND WILL BE CLEAR TO INDICATE NO ERROR.
/BECAUSE OF PREVIOUS CHECK FOR DX = 0, A ZERO DIVISOR CAN NEVER OCCUR IN THIS GRAPHICS PROGRAM
/AND BECAUSE THIS DIVIDE ROUTINE IS CALLED ONLY IN THE CONTEXT OF SOME X COORDINATE * DY / DX
/AND IT HAS BEEN CAREFULLY ARRANGED THAT DY IS LESS THAN OR EQUAL TO DX, THE QUOTIENT OVERFLOW
/CONDITION CAN NEVER ARISE IN THIS GRAPHICS PROGRAM.  THE ERROR EXIT, THEREFORE, CAN NEVER
/BE TAKEN AND THE SET LINK IS NOT CHECKED FOR UPON RETURN.  THE CODE IS LEFT IN ONLY FOR GENERALITY.

	TAD DIVSOR	/SUBTRACT THE DIVISOR (STARTING AT THE MS END)
	SPA		/IS THE RESULT NEGATIVE?
	JMP .+10	/YES; NO QUOTIENT OVERFLOW CONDITION OR ZERO DIVISOR SO GO ON WITH DIVISION
	STL		/NO; QUOTIENT OVERFLOW OR ZERO DIVISOR; SET LINK AS ERROR FLAG
	JMP I DIVIDE	/AND RETURN
/END OF ERROR CHECKING PART
	SWP		/JUMP BACK POINT IN LOOP; PUT MS PART OF DIVIDEND IN AC
	RAL		/AND SHIFT LEFT; MS BIT FROM LS PART COMES INTO LS BIT OF AC
	TAD DIVSOR	/SUBTRACT DIVISOR
	SMA		/IS RESULT NEGATIVE:
	JMP .+4		/NO;  JUMP AHEAD TO PROPER BRANCH
	TAD I DIVIDE	/YES; ADD DIVISOR BACK
	CLL		/SET ZERO BIT TO BE PUT INTO QUOTIENT
	SKP		/AND JOIN THE POSITIVE BRANCH ONE STEP AHEAD

	STL		/RESULT OF SUBTRACTION WAS POSITIVE WHICH IS OK SO SET BIT IN QUOTIENT
	SWP		/LS PART OF DIVIDEND TO AC
	RAL		/QUOTIENT BIT FROM LINK INTO LS BIT; SHIFT LS PART LEFT AND MS BIT INTO LINK
	ISZ MDCOUN	/BUMP 12 BIT COUNTER
	JMP .-14	/AND GO AROUND THE LOOP AGAIN IF NOT DONE 12 TIMES
	SZL CLL		/OR LEAVE THE LOOP; CLEAR THE LINK TO INDICATE NO ERROR; WAS LINK SET?
	CIA		/YES; QUOTIENT MUST BE NEGATIVE SO NEGATE IT
	SWP		/AND PUT IT INTO THE MQ
	ISZ DIVIDE	/POINT TO RETURN ADDRESS
	JMP I DIVIDE	/AND RETURN FROM SUBROUTINE

MDCONS,	-14		/MINUS DECIMAL 12 FOR BIT COUNTER FOR MULTIPLY/DIVIDE LOOPS
MDCOUN,	0		/12 BIT COUNTER FOR MULTIPLY/DIVIDE LOOPS
MDTEMP,	0		/TEMPORARY STORAGE FOR PART OF DIVIDEND WHILE DIVIDE IS BEING SET UP
MPCND,	0		/MULTIPLICAND
DIVSOR,	0		/NEGATIVE OF DIVISOR
	>

	PAGE
/HERE BEGINNETH THE TABLE OF DOT MATRIX INFORMATION FOR THE STANDARD CHARACTER SET.
/THE MATRIX IS A 5 X 7 MATRIX WITH 35 BITS OF INFORMATION STORED IN THREE 12-BIT WORDS
/LET THE WORDS BE DESIGNATED "A", "B", AND "C", IN ORDER. THE MATRIX IS STORED:
/
/	A07  B02  B09  C04  C11
/	A06  B01  B08  C03  C10
/	A05  B00  B07  C02  C09
/	A04  A11  B06  C01  C08
/	A03  A10  B05  C00  C07
/	A02  A09  B04  B11  C06
/	A01  A08  B03  B10  C05
/
/IF BIT A00 IS SET, THE ENTIRE 5 X 7 MATRIX IS TO BE SHIFTED DOWN 3 MATRIX POSITIONS
/BEFORE PRINTING. THIS ALLOWS CHARACTERS WITH TAILS BELOW THE LINE.
/THE CHARACTERS ARE IN ORDER OF THEIR ASCII CODES BEGINNING WITH 040 AND
/ENDING WITH 177.

DOTTAB,	0	/SPACE
	0
	0000
	0000	/!
	0576
	0000
	0000	/"
	7000
	1600
	0517	/#
	7123
	7624
	1105	/$
	2655
	2422
	3062	/%
	3043
	1143
	1551	/&
	1531
	0120
	0000	/'
	7034
	0000
	0003	/(
	4212
	0200
	0010	/)
	1210
	7000
	1243	/*
	4370
	7052
	0201	/+
	0370
	2010
	0013	/,
	0340
	0000
	0201	/-
	0040
	2010
	0014	/.
	0600
	0000
	3002	//
	0040
	1003
	1752	/0
	1446
	1276
	0010	/1
	2776
	0000
	3451	/2
	1446
	2306
	1050	/3
	1446
	2266
	0602	/4
	4113
	7620
	1170	/5
	5426
	1271
	1711	/6
	2446
	2260
	3022	/7
	1044
	1203
	1551	/8
	1446
	2266
	0151	/9
	1445
	2236
	0006	/:
	6330
	0000
	0013	/;
	3354
	0000
	0001	/<
	0121
	0501
	0502	/=
	4120
	5024
	2024	/>
	2120
	2000
	0040	/?
	1544
	1400
	1451	/AT
	1746
	0276
	3702	/A
	2104
	4574
	2037	/B
	7446
	2266
	1750	/C
	1406
	0242
	2037	/D
	7406
	0276
	3771	/E
	1446
	0301
	3761	/F
	1044
	0201
	1750	/G
	1406
	2371
	3761	/H
	0040
	2177
	0010	/I
	1776
	0200
	1010	/J
	0402
	0077
	3761	/K
	0121
	0501
	3770	/L
	0402
	0100
	3760	/M
	2020
	0577
	3760	/N
	2020
	2177
	1750	/O
	1406
	0276
	3761	/P
	1044
	2206
	1750	/Q
	1505
	0336
	3761	/R
	1145
	2306
	1050	/S
	5446
	4242
	0020	/T
	1774
	0201
	1770	/U
	0402
	0077
	0764	/V
	0401
	0037
	3764	/W
	0101
	0177
	3062	/X
	4040
	5143
	0020	/Y
	2760
	0401
	3032	/Z
	1446
	1303
	0017	/[
	7406
	0200
	0060	/\
	4040
	4140
	0010	/]
	1407
	7600
	0100	/^
	2374
	0404
	0203	/_
	4250
	2010
	0000	/`
	1010
	1000
	1012	/a
	4522
	5070
	3771	/b
	0442
	2060
	1411	/c
	0442
	2020
	1411	/d
	0442
	2177
	1612	/e
	4522
	5010
	0217	/f
	6044
	0202
	5151	/g
	1446
	2276
	3761	/h
	0040
	2160
	0012	/i
	0752
	0000
	5010	/j
	0401
	7600
	3762	/k
	0242
	1000
	0010	/l
	1776
	0000
	3601	/m
	0700
	2160
	3601	/n
	0040
	2160
	1411	/o
	0442
	2060
	7761	/p
	1044
	2206
	4141	/q
	1047
	7700
	2117	/r
	0440
	2020
	0212	/s
	4522
	5040
	0107	/t
	6422
	0040
	1610	/u
	0402
	0170
	0604	/v
	0401
	0030
	1610	/w
	0202
	0070
	0011	/x
	0301
	4110
	5171	/y
	0442
	2077
	0011	/z
	0642
	6110
	0206	/{
	6406
	0200
	0000	/|
	0734
	0000
	0010	/}
	1405
	5410
	0200	/~
	4040
	4010
	3777	/RUBOUT
	7777
	7777
/HERE BEGINNETH THE DOT MATRIX TABLE FOR THE ALTERNATE (APL) CHARACTER SET.
/USER MAY SUBSTITUTE ANOTHER ALTERNATE SET OBSERVING TWO RULES:
/	1. THREE WORDS PER CHARACTER WITH BITS AS ABOVE
/	2. ASCII 40 THROUGH 177 IN ORDER

/THIS TABLE IS FOR THE APL CHARACTER SET

ALTDOT,	0000	/SPACE
	0000
	0000
	0060	/UMLAUT
	3000
	0603
	0010	/)
	1210
	7000
	0001	/<
	0121
	0501
	0011	/=<
	0523
	0501
	0502	/=
	4120
	5024
	2024	/>
	2120
	2000
	0010	/]
	1407
	7600
	0061	/OR
	4300
	3003
	3003	/AND
	0030
	6140
	1502	/=/
	4160
	5026
	0201	/DIVIDE
	0250
	2010
	4005	/,
	4160
	0000
	0201	/+
	0370
	2010
	0014	/.
	0600
	0000
	3002	//
	0040
	1003
	1752	/0
	1446
	1276
	0010	/1
	2776
	0000
	3451	/2
	1446
	2306
	1050	/3
	1446
	2266
	0602	/4
	4113
	7620
	1170	/5
	5426
	1271
	1711	/6
	2446
	2260
	3022	/7
	1044
	1203
	1551	/8
	1446
	2266
	0151	/9
	1445
	2236
	0003	/(
	4212
	0200
	0017	/[
	7406
	0200
	0013	/;
	3354
	0000
	1042	/TIMES
	4040
	5042
	0006	/:
	6330
	0000
	0060	/\
	4040
	4140
	0020	/NEGATIVE
	1004
	0201
	0704	/ALPHA
	2120
	2024
	1004	/DECODE
	0371
	0040
	1700	/DOWN
	2010
	0474
	0017	/MINIMUM
	7402
	0000
	0705	/EPSILON
	2251
	0400
	2010	/UNDERLINE
	0402
	0100
	0141	/DEL
	2110
	2406
	1405	/DELTA
	0221
	2060
	0000	/IOTA
	4361
	0000
	0302	/DEGREE
	2110
	3000
	0000	/'
	0070
	0000
	3750	/QUAD
	2412
	0576
	0000	/ABSOLUTE
	0774
	0000
	0040	/ENCODE
	2370
	0402
	0704	/CIRCLE
	2211
	0434
	1243	/*
	4370
	7052
	0040	/?
	1544
	1400
	2017	/RHO
	4110
	4414
	0017	/MAXIMUM
	7004
	0200
	0200	/TILDE
	4040
	4010
	0404	/DOWN ARROW
	0775
	0020
	0744	/UP
	0201
	0036
	0604	/OMEGA
	0101
	0030
	1044	/LEFT
	2211
	0434
	0100	/UP ARROW
	2374
	0404
	0704	/RIGHT
	2211
	0442
	0203	/LEFT ARROW
	4250
	2010
	1741	/LEFT BAR
	0040
	2010
	0201	/RIGHT ARROW
	0250
	7010
	2034	/>=
	2522
	2000
	0201	/-
	0040
	2010
	0202	/DIAMOND
	4210
	5010
	3702	/A
	2104
	4574
	2037	/B
	7446
	2266
	1750	/C
	1406
	0242
	2037	/D
	7406
	0276
	3771	/E
	1446
	0301
	3761	/F
	1044
	0201
	1750	/G
	1406
	2371
	3761	/H
	0040
	2177
	0010	/I
	1776
	0200
	1010	/J
	0402
	0077
	3761	/K
	0121
	0501
	3770	/L
	0402
	0100
	3760	/M
	2020
	0577
	3760	/N
	2020
	2177
	1750	/O
	1406
	0276
	3761	/P
	1044
	2206
	1750	/Q
	1505
	0336
	3761	/R
	1145
	2306
	1050	/S
	5446
	4242
	0020	/T
	1774
	0201
	1770	/U
	0402
	0077
	0764	/V
	0401
	0037
	3764	/W
	0101
	0177
	3062	/X
	4040
	5143
	0020	/Y
	2760
	0401
	3032	/Z
	1446
	1303
	0206	/{
	6406
	0200
	0201	/RIGHT BAR
	0040
	2076
	0010	/}
	1405
	5410
	1105	/$
	2655
	2422
	3777	/RUBOUT
	7777
	7777
	IFNZRO PLOTER <

/TABLE OF POINTERS TO VECTOR TABLE FOR STANDARD CHARACTER SET
/VECTOR CHARACTERS MUST BE SET UP WITH A DOUBLE POINTER SINCE THE NUMBER OF VECTORS
/PER CHARACTER IS NOT CONSTANT. HENCE, THE POINTERS OCCUR HERE FROM ASCII 040 TO 177
/IN ORDER AND ONE POINTER PER WORD.  THE POINTER IS TO THE FIRST VECTOR FOR EACH CHARACTER.

VECTAB,	SP
	EX
	QUO
	NU
	DO
	PC
	AM
	AP
	LP
	RP
	AS
	PL
	COM
	DA
	PE
	SL
	N0
	N1
	N2
	N3
	N4
	N5
	N6
	N7
	N8
	N9
	COL
	SC
	LAN
	EQ
	RAN
	QUS
	AT
	A
	B
	C
	D
	E
	F
	G
	H
	UCI
	J	
	K
	L
	M
	N
	O
	P
	Q
	R
	S
	T
	U
	V
	W
	X
	Y
	UCZ
	LBK
	RSL
	RBK
	UA
	LA
	AG
	LCA
	LCB
	LCC
	LCD
	LCE
	LCF
	LCG
	LCH
	LCI
	LCJ
	LCK
	LCL
	LCM
	LCN
	LCO
	LCP
	LCQ
	LCR
	LCS
	LCT
	LCU
	LCV
	LCW
	LCX
	LCY
	LCZ
	LBC
	VER
	RBC
	TIL
	RO
/TABLE OF POINTERS TO VECTOR TABLE FOR ALTERNATE CHARACTER SET
/NOTE THAT SOME CCARACTERS IN THIS SET ARE THE SAME AS IN THE STANDARD
/SO THAT SOME POINTERS IN THIS SET POINT TO THE SAME PLACE AS SOME POINTERS
/OF THE STANDARD SET

APLVTB,	SP
	APLUML
	RP
	APLLT
	APLLE
	EQ
	APLGT
	RBK
	APLOR
	APLAND
	APLNE
	APLDIV
	COM
	PL
	PE
	SL
	N0
	N1
	N2
	N3
	N4
	N5
	N6
	N7
	N8
	N9
	LP
	LBK
	SC
	APLMPY
	COL
	RSL
	APLNEG
	APLALP
	APLDEC
	APLDOW
	APLMIN
	APLEPS
	APLUND
	APLDEL
	APLDLT
	APLIOT
	APLDEG
	APLAPO
	APLQUA
	APLABS
	APLENC
	APLCIR
	APLSTR
	QUS
	APLRHO
	APLMAX
	TIL
	APLDA
	APLUP
	APLOME
	APLLFT
	UA
	APLRT
	LA
	APLLBR
	APLRA
	APLGE
	DA
	APLDIA
	A
	B
	C
	D
	E
	F
	G
	H
	UCI
	J
	K
	L
	M
	N
	O
	P
	Q
	R
	S
	T
	U
	V
	W
	X
	Y
	UCZ
	LBC
	APLRBR
	RBC
	DO
	RO
/TABLE OF VECTORS FOR STANDARD CHARACTER SET.
/EACH 12-BIT WORD CONTAINS ALL THE INFORMATION FOR THE NEXT VECTOR.
/THE CHARACTER CELL IS A 10 X 14 MATRIX WITH 4 ADDITIONAL BLANK SPACES TO THE RIGHT
/OF THE CELL AND 8 ADDITIONAL BLANK SPAAES ABOVE THE CELL (I.E., THE SPACE BETWEEN CELLS
/IN THE SAME LINE IS 4 RASTER UNITS AND THE SPACE BETWEEN LINES IS 8 RASTER UNITS).
/THE BEAM (OR PEN) IS ASSUMED AT THE LOWER LEFT CORNER OF THE CHARACTER CELL INITIALLY,
/AND THE BEAM (OR PEN) MUST BE PUT AT THE LOWER LEFT CORNER OF THE NEXT
/CHARACTER CELL AT THE COMPLETION OF THE PRESENT CHARACTER.  EACH 12-BIT WORD IS
/CONSTRUCTED AS FOLLOWS:
/
/	BIT 00		SET IF THIS IS THE FIRST VECTOR OF A CHARACTER
/	BITS 01-04	X COORDINATE OF TIP COMPARED TO TAIL, I.E., RELATIVE X COMPONENT
/	BIT 05		SET IF X COMPONENT OF VECTOR IS NEGATIVE
/	BIT 06		SET IF VECTOR IS NOT TO BE DISPLAYED OR DRAWN, I.E., DARK VECTOR
/	BITS 07-10	Y COORDINATE OF TIP COMPARED TO TAIL, I.E., RELATIVE Y COMPONENT
/	BIT 11		SET IF Y COMPONENT OF VECTOR IS NEGATIVE
/

SP,	7440	/SPACE
EX,	5040	/!
	0400
	0004
	0500
	0005
	0252
	0222
	0500
	0223
	2253
QUO,	4472	/"
	0500
	0004
	0400
	0005
	0507
	1646
	0500
	0004
	0400
	0005
	0507
	1665
NU,	4642	/#
	0030
	0011
	0500
	2000
	0500
	0010
	0031
	0010
	0400
	2100
	3253
DO,	4246	/$
	0405
	1000
	0404
	0004
	0504
	1100
	0504
	0004
	0404
	1000
	0405
	1150
	0037
	0003
	2242
PC,	6434	/%
	1543
	0007
	0700
	0006
	0600
	0463
	0007
	0600
	0006
	0700
	2051
AM,	6440	/&
	2524
	0004
	0404
	0400
	0405
	0005
	1515
	0005
	0405
	1400
	0404
	0004
	1051
AP,	5064	/'
	0406
	0004
	0500
	0005
	0400
	2073
LP,	5474	/(
	0507
	0021
	0407
	2040
RP,	5074	/)
	0407
	0021
	0507
	2240
AS,	4646	/*
	1020
	0511
	0510
	1021
	0510
	1100
	2000
	1257
PL,	5246	/+
	0020
	0011
	1100
	2000
	1257
COM,	5047	/,
	0406
	0004
	0500
	0005
	0400
	2040
DA,	4256	/-
	2000
	1257
PE,	5040	/.
	0400
	0004
	0500
	0005
	2440
SL,	6434	//
	1075
N0,	6434	/0
	0303
	0302
	1500
	0507
	0021
	0407
	1400
	0406
	0020
	0506
	1475
N1,	4464	/1
	0610
	0035
	1100
	2000
	1240
N2,	4070	/2
	0404
	1400
	0405
	0007
	0505
	1500
	0505
	0013
	2400
	1040
N3,	4070	/3
	0404
	1400
	0405
	0007
	0505
	1100
	1000
	0405
	0007
	0505
	1500
	0504
	3445
N4,	6040	/4
	0034
	1723
	2000
	1253
N5,	4044	/5
	0405
	1400
	0404
	0010
	0504
	2100
	0014
	2400
	1075
N6,	4056	/6
	2000
	0405
	0007
	0505
	1500
	0504
	0024
	0404
	1400
	0405
	1071
N7,	6434	/7
	2500
	3475
N8,	4456	/8
	1400
	0404
	0006
	0504
	1500
	0505
	0007	
	0405
	0505
	0007
	0405
	1400
	0404
	0006
	0504
	1457
N9,	4044	/9
	0405
	1400
	0404
	0024
	0504
	1500
	0505
	0007
	0405
	2000
	1057
COL,	5044	/:
	0400
	0004
	0500
	0005
	0060
	0400
	0004
	0500
	0005
	2465
SC,	5064	/;
	0400
	0004
	0500
	0005
	0461
	0500
	0004
	0400
	0005
	0507
	2442
LAN,	6274	/<
	2117
	2017
	1240
EQ,	4262	/=
	2000
	0051
	2100
	3253
RAN,	4240	/>
	2016
	2116
	3275
QUS,	4470	/?
	0404
	0400
	0405
	0007
	0707
	0005	
	0245
	0500
	0005
	0400
	0004
	2045
AT,	5654	/@
	0010
	0500
	0305
	0205
	1000
	0010
	0504
	1100
	0505
	0015
	0405
	1000
	0404
	1251
A,	5234	/A
	1235
	0512
	1500
	3053
B,	4034	/B
	2000
	0405
	0007
	0505
	2100
	2000
	0405
	0007
	0505
	2100
	3440
C,	6470	/C
	0504
	1500
	0505
	0025
	0405
	1400
	0404
	1045
D,	4034	/D
	2000
	0405
	0025
	0505
	2100
	3440
E,	6474	/E
	2500
	0017
	1400
	1500
	0017
	2400
	1040
F,	6474	/F
	2500
	0017
	1400
	1500
	0017
	3440
G,	6470	/G
	0504
	1500
	0505
	0025
	0405
	1400
	0404
	0012
	1100
	2057
H,	4034	/H
	0017
	2400
	0016
	0035
	1040
UCI,	4274	/I
	2000
	1100
	0035
	1100
	2000
	1240
J,	4050	/J
	0005
	0405
	1400
	0404
	0030
	1075
K,	4034	/K
	0021
	2020
	1313
	1423
	1040
L,	4074	/L
	0035
	2400
	1040
M,	4034	/M
	1217
	1216
	0035
	1040
N,	4034	/N
	2435
	0034
	1075
O,	4440	/O
	0504
	0024
	0404
	1400
	0405
	0025
	0505
	1500
	3040
P,	4034	/P
	2000
	0405
	0007
	0505
	2100
	3457
Q,	4440	/Q
	0504
	0024
	0404
	1400
	0405
	0023
	0707
	1300
	1246
	0607
	1040
R,	4034	/R
	2000
	0405
	0007
	0505
	2100
	1200
	1217
	1040
S,	4044	/S
	0405
	1400
	0404
	0006
	0504
	1500
	0504
	0006
	0404
	1400
	0405
	1071
T,	4074	/T
	2400
	1300
	0035
	2240
U,	4074	/U
	0031
	0405
	1400
	0404
	0030
	1075
V,	4074	/V
	1235
	1234
	1075
W,	4074	/W
	0435
	0634
	0635
	0434
	1075
X,	6434	/X
	1317
	1316
	2435
	1040
Y,	4074	/Y
	1217
	1216
	1317
	0017
	2240
UCZ,	4074	/Z
	2400
	2535
	2400
	1040
LBK,	6074	/[
	1500
	0035
	1400
	1440
RSL,	4074	/\
	2435
	1040
RBK,	4474	/]
	1400
	0035
	1500
	3040
UA,	4260	/^
	1014
	1015
	1114
	0035
	2240
LA,	5246	/_(LEFT ARROW)
	1310
	1210
	1311
	2400
	1057
AG,	4674	/`
	1011
	1665
LCA,	6052	/a
	1100
	0505
	0003
	0405
	1000
	0012
	0504
	0700
	2657
LCB,	4474	/b
	0035
	1000
	0404
	0006
	0504
	1100
	3057
LCC,	6052	/c
	0504
	0500
	0505
	0007
	0405
	0400
	0404
	1445
LCD,	6074	/d
	0035
	1100
	0504
	0006
	0404
	1000
	1457
LCE,	4446	/e
	1400
	0004
	0504
	0500
	0505
	0007
	0405
	0600
	1640
LCF,	5040	/f
	0030
	0404
	0400
	0557
	1100
	3057
LCG,	4445	/g
	0405
	0400
	0404
	0022
	1100
	0505
	0007
	0405
	1000
	1440
LCH,	4440	/h
	0034
	0017
	1000
	0405
	0013
	1440
LCI,	5240	/i
	0016
	0046
	0002
	0300
	0003
	0200
	2265
LCJ,	4447	/j
	0400
	0404
	0020
	0046
	0002
	0300
	0003
	0200
	2265
LCK,	4440	/k
	0034
	0023
	1212
	0707
	1017
	1440
LCL,	4674	/l
	0400
	0035
	0500
	1000
	1640
LCM,	4240	/m
	0016
	0005
	0404
	0405
	0013
	0012
	0404
	0405
	0013
	1240
LCN,	4440	/n
	0016
	0005
	0404
	0400
	0405
	0013
	1440
LCO,	5040	/o
	0504
	0006
	0404
	0400
	0405
	0007
	0505
	0500
	2440
LCP,	4451	/p
	0026
	1000
	0405
	0007
	0505
	1100
	3040
LCQ,	6051	/q
	0026
	1100
	0505
	0007
	0405
	1000
	1440
LCR,	4440	/r
	0016
	0007
	0606
	0400
	1657
LCS,	4440	/s
	1000
	0404
	1506
	0404
	1000
	1457
LCT,	4260	/t
	1400
	0750
	0025
	0405
	0400
	1440
LCU,	4456	/u
	0013
	0405
	0400
	0404
	0012
	0017
	1440
LCV,	4456	/v
	0617
	0616
	1457
LCW,	4256	/w
	0417
	0416
	0417
	0416
	1257
LCX,	4440	/x
	1416
	1540
	1417
	1440
LCY,	4456	/y
	0013
	0405
	1000
	0016
	0023
	0505
	1100
	3050
LCZ,	4456	/z
	1400
	1517
	1400
	1440
LBC,	5674	/{
	0505
	0007
	0505
	0405
	0007
	0405
	1640
VER,	5274	/|
	0013
	0051
	0013
	2240
RBC,	4674	/}
	0405
	0007
	0405
	0505
	0007
	0505
	2440
TIL,	4254	/~
	0404
	1005
	0404
	1261
RO,	6404	/RUBOUT
	2504
	2404
	2504
	2404
	2504
	2404
	1075
/TABLE OF VECTORS FOR ALTERNATE (APL) CHARACTER SET

APLUML,	4270	/UMLAUT
	0004
	0400
	0005
	0500
	1440
	0400
	0004
	0500
	0005
	1671
APLLE,	4240	/=<
	2000
	2340
APLLT,	2270	/<
	2113
	2013
	1245
APLGE,	4240	/>=
	2000
	2340
APLGT,	0244	/>
	2012
	2112
	3271
APLOR,	4070	/OR
	1225
	1224
	1071
APLAND,	4044	/AND
	1224
	1225
	1045
APLNE,	4450	/=/
	2024
	0047
	2100
	0053
	2000
	1253
APLDIV,	4256	/DIVIDE
	2000
	0744
	0500
	0004
	0400
	0005
	0051
	0005
	0500
	0004
	0400
	2053
APLMPY,	4246	/MULTIPLY
	2020
	1111
	1110
	2021
	1247
APLNEG,	4274	/NEGATE
	2000
	1275
APLALP,	6264	/ALPHA
	1115
	0500
	0504
	0004
	0404
	0400
	1015
	1251
APLDEC,	4244	/DECODE
	2000
	1100
	0024
	2271
APLDOW,	4244	/DOWN
	0020
	0404
	1000
	0405
	0021
	1245
APLMIN,	4470	/MINIMUM
	0025
	1400
	1445
APLEPS,	6066	/EPSILON
	1300
	0505
	0005
	1200
	1300
	0005
	0405
	1200
	1447
APLUND,	4240	/UNDERLINN
	2000
	1240
APLDEL,	5250	/DEL
	1120
	2000
	1121
	2251
APLDLT,	4244	/DELTA
	1220
	1221
	2100
	3245
APLIOT,	4664	/IOTA
	0400
	0021
	0400
	1645
APLDEG,	5052	/DEGREE
	0400
	0404
	0004
	0504
	0500
	0505
	0005
	0405
	2453
APLAPO,	5060	/APOSTROPHE
	0010
	2271
APLQUA,	4244	/QUAD
	0024
	2000
	0025
	2100
	3245
APLABS,	5274	/ABSOLUTE
	0035
	2240
APLENC,	4270	/ENCODE
	2000
	1100
	0025
	2245
APLCIR,	4644	/CIRCLE
	1000
	0606
	0010
	0706
	1100
	0707
	0011
	0607
	2645
APLSTR,	4446	/STAR
	0610
	1102
	1003
	0012
	0013
	1002
	1103
	0611
	1447
APLRHO,	4440	/RHO
	0022
	0404
	0400
	0405
	0005
	0505
	1100
	3053
APLMAX,	4444	/MAXIMUM
	0024
	1400
	1471
APLDA,	4274	/DOWN ARROW
	0035
	1114
	1015
	1014
	1255
APLUP,	4270	/UP
	0021
	0405
	1000
	0404
	0020
	1271
APLOME,	4264	/OMEGA
	0015
	0405
	0400
	0010
	0011
	0400
	0404
	0014
	1265
APLLFT,	4244	/LEFT
	1400
	0404
	0014
	0504
	1500
	3271
APLRT,	6270	/RIGHT
	1500
	0505
	0015
	0405
	1400
	1245
APLLBR,	4244	/LEFT BAR
	0024
	0013
	2000
	1257
APLRA,	4056	/RIGNT ARROW
	2400
	1312
	1213
	1313
	2247
APLDIA,	5244	/DIAMOND
	1012
	1112
	1113
	1013
	2245
APLRBR,	4256	/RIGHT BAR
	2000
	0012
	0025
	1245
STOPCH,	4000	/A STOP CHARACTER MUST END THIS TABLE
	>

	PAGE
/THIS IS A SHORTENED VERSION OF THE PROGRAM UTIL10 WHICH IS USED
/TO LOGIN AND LOGOUT THE DEC-10.  ONE ARGUMENT IS USED. IF THE
/ARGUMENT IS 1, THE ACTION IS LOGIN; IF 0 THE ACTION IS LOGOUT.
/WORD 7777 OF FIELD 1 (SYS AREA) IS PRESUMED AS A STATUS WORD.
/BIT 11 IF SET INDICATES LOGGED IN; IF CLEAR,LOGGED OUT. 
/OTHER BITS ARE USED FOR OTHER PUTPOSES BY OTHER PROGRAMS, BUT 
/ARE NOT RELEVANT HERE.

UTIL10,	0		/STARTING ADDRESS FOR SUBROUTINE
	TENTFL		/SET THE DEC-10 OUTPUT FLAG (IT IS KEPT CLEAR IN MAIN PROGRAM)
	CDF 10		/POINT TO DF 1 FOR C.D. TABLES AND STATUS WORD
	TAD I STATPT	/GET STATUS WORD
	DCA OLDST	/AND STORE IT
	CDF 0		/NO; ENTRY IS BY SUBROUTINE CALL; CHANGE TO DF 0
	TAD I UTIL10	/GET ARGUMENT
	ISZ UTIL10	/POINT TO RETURN ADDRESS
	DCA NEWST	/STORE ARG AS STATUS TO BE ACHIEVED BY SUBROUTINE
/
BEGLPS,	TAD NEWST	/COME HERE AFTER NEW STATUS WORD IS SET
	CMA		/COMPUTE BITS TO BE CLEARED AS
	AND OLDST	/  OLD.AND.NOT.NEW
	DCA CLRREG	/STORE BITS TO BE CLEARED
	TAD OLDST	/COMPUTE BITS TO BE SET AS
	CMA		/  NEW.AND.NOT.OLD
	AND NEWST
	DCA SETREG	/STORE BITS TO BE SET
	TAD (SETCLR+27	/BEGIN CLEAR ROUTINE BY
	DCA SCPT	/SETTING POINTER TO BOTTOM OF TABLE
NXTCLR,	TAD CLRREG	/GET CLEAR WORD
	SNA		/ZERO?
	JMP CLRDON	/YES; NO MORE CLEARING NECESSARY
	CLL RAR		/NO; SHIFT RIGHT-MOST BIT INTO LINK
	DCA CLRREG	/STORE SHIFTED WORD
	SZL		/TAKE CLEAR ACTION FOR THIS BIT?
	JMS TRAREC	/YES
	STA CLL RAL	/NO; TAD (-2
	TAD SCPT	/DECREMENT POINTER BY 2
	DCA SCPT	/AND STORE IT
	JMP NXTCLR	/GO BACK AND CLEAR MORE
CLRDON,	TAD (SETCLR	/BEGIN SET ROUTINE BY
	DCA SCPT	/SETTING POINTER TO TOP OF TABLE
NXTSET,	TAD SETREG	/GET SET WORD
	SNA		/ZERO?
	JMP FIXSTA	/YES; NO MORE SETTING NECESSARY
	CLL RAL		/NO; SHIFT LEFT-MOST BIT TO LINK
	DCA SETREG	/STORE SHIFTED WORD
	SZL		/TAKE SET ACTION FOR THIS BIT?
	JMS TRAREC	/YES
	ISZ SCPT	/NO; INCREMENT POINTER
	ISZ SCPT	/BY 2
	JMP NXTSET	/GO BACK AND SET MORE 

STATPT,	7777		/POINTER TO STATUS WORD IN FIELD 1
OLDST,	0		/LOCALLY STORED VALUE OF 17777 (OLD STATUS WORD)
NEWST,	0		/STATUS WORD AS IT SHOULD APPEAR AFTER EXECUTION OF THIS SUBROUTINE
FIXSTA,	CDF 10		/CHANGE TO DF 1
	TAD NEWST	/GET NEW STATUS WORD
	DCA I STATPT	/AND PUT IT IN 17777
	CDF 0		/RESET DATA FIELD 0
RETURN,	JMP I UTIL10	/ULTIMATELY COME HERE TO LEAVE ROUTINE
/
CLRREG,	0		/BITS TO BE CLEARED
SETREG,	0		/BITS TO BE SET
/
TRAREC,	0		/SUBROUTINE TO TAKE ACTION ASSOCIATED WITH SET OR CLEAR BIT
	TAD (BUFFER	/GET ADDRESS OF DEC-10 TEXT RETURN BUFFER
	DCA IBP		/AND SET FILL POINTER
	TAD (BUFFER	/LIKEWISE
	DCA OBP		/SET EMPTY POINTER
	TAD I SCPT	/GET APPROPRIATE WORD FROM SET/CLEAR TABLE
	DCA TRPT	/AND STORE AS A POINTER
MORE,	JMS TRANS	/TRANSMIT THE APPROPRIATE COMMAND
	ISZ TRPT	/POINT TO THE EXPECTED RETURN STRING
	TAD I TRPT	/GET THE FIRST CHARACTER FROM THE RETURN STRING
	SNA		/IS IT ZERO?
	JMP GOTALL+1	/YES; NOTHING TO COME BACK SO SKIP
RECAGN,	JMS RECV	/NO; SOMETHING IS EXPECTED;
			/LOOK; BUT COME BACK IMMEDIATELY IF NOTHING IN FROM DEC-10
	TAD NXTMSG	/GET FLAG
	SZA CLA		/HAS EVERYTHING BEEN RECEIVED?
	JMP GOTALL	/YES
	JMS LISTKB	/NO; CHECK KB SO WE HAVE A WAY TO ESCAPE THIS
			/WAIT LOOP IF NECESSARY
	JMP RECAGN-3	/NOW CHECK FOR NEXT STUFF BACK FROM DEC-10
GOTALL,	DCA NXTMSG	/END OF EXPECTED RESPOINSE
	ISZ TRPT	/POINT TO NEXT COMMAND
	TAD I TRPT	/GET IT
	SZA CLA		/ZERO?
	JMP MORE	/NO; GO BACK AND SEND NEXT COMMAND
	JMP I TRAREC	/YES; END OF COMMAND/RESPONSE SEQUENCE; RETURN
/
SCPT,	0		/POINTER TO SET/CLEAR TABLE
TRPT,	0		/POINTER FOR COMMAND/RESPONSE TABLE
/
TRANS,	0		/SUBROUTINE TO TRANSMIT A COMMAND TO DEC-10
	TAD I TRPT	/GET COMMAND POINTER
	DCA TRANSP	/AND STORE AS CHARACTER POINTER
NXTCHR,	TAD I TRANSP	/GET CHAR
	SNA SPA		/NULL? (CLOSE WITH LF) OR -1? (CLOSE WITH CR)
	JMP CLOSE	/YES; END OF COMMAND
	JMS TCHAR	/NO; TRANSMIT IT
	ISZ TRANSP	/POINT TO NEXT CHAR
	JMP NXTCHR	/GET IT AND GO AROUND AGAIN
/
CLOSE,	SZA CLA		/SKIP IF LAST CHAR IN STRING = 0;
	CLA IAC STL RAL	/=TAD (3; TO SET CR AS BREAK CHAR WHEN LF ADDED IN NEXT STEP
	TAD (212	/GET BREAK CHAR (LF) TO CLOSE COMMAND; =(CR) IF STRING CLOSED WITH -1
	JMS TCHAR	/AND TRANSMIT IT
	JMP I TRANS	/RETURN
TRANSP,	0
/
TCHAR,	0		/SUBROUTINE TO TRANSMIT A CHARACTER TO DEC-10
	AND (177	/MASK TO 7 BITS
TRYSND,	TENTSF		/DEC-10 READY?
	JMP TRYGET	/NO; SEE IF ANYTHING COMING BACK;
			/DON'T HANG UP HERE AND MISS WHAT THE DEC-10 IS SENDING
	TENTLS		/YES; TRANSMIT
	CLA CLL		/CLEAR AC AND L
	JMP I TCHAR	/  AND RETURN
TRYGET,	TENKSF		/ANYTHING COMING BACK?
	JMP TRYSND	/NO; TRY SENDING AGAIN
	DCA HOLCHR	/YES; STORE THE CHARACTER WAITING TO BE SENT
	JMS RECV	/GET THE CHARACTER COMING IN
	TAD HOLCHR	/NOW GET BACK THE CHARACTER TO BE SENT
	JMP TRYSND	/AND TRY AGAIN
HOLCHR,	0		/TEMP STORAGE FOR CHARACTER TO BE TRANSMITTED
/
LISTKB,	0		/SUBROUTINE TO CHECK KEYBOARD FOR ^C
	KSF		/CHECK KB FLAG
	JMP I LISTKB	/NO INPUT; RETURN
	KRB		/READ KB INPUT
	TAD (-203	/CHECK FOR
	SNA CLA		/  ^C
	JMP MON		/YES; RETURN TO KB MONITOR
	JMP I LISTKB	/RETURN FROM SUBROUTINE

	PAGE
RECV,	0		/SUBROUTINE TO RECEIVE MESSAGES FROM DEC-10
	DCA TPT		/STORE POINTER ON THIS PAGE
LIST10,	TENKSF		/ANYTHING IN?
	JMP I RECV	/NO; GO BACK IMMEDIATELY
	TENKRB		/CHAR IN BUFFER; READ IT
	DCA TEMP	/PUT IT AWAY NEARBY
	TAD TEMP	/AND GET IT BACK
	TAD (-377	/RUBOUT?
	SNA CLA
	JMP LIST10	/YES; IGNORE IT
	TAD TEMP	/NO; GET IT AGAIN
	CDF 10		/POINT TO BUFFER FIELD
	DCA I IBP	/PUT IT IN BUFFER
	CDF 0		/AND POINT TO PRESENT FIELD ONCE AGAIN
	ISZ IBP		/AND INCREMENT POINTER
	TAD TRPFLG	/GET TRAP FLAG
	SZA CLA		/AND TEST IT
	JMP TRFLST	/FLAG SET; JUMP AHEAD
BACK,	TAD TPT		/FLAG CLEAR; GET POINTER TO CURRENT TRAP PHRASE
	DCA TRAPP	/STORE IT AS A CHAR POINTER
	TAD IBP		/GET CURRENT INPUT BUFFER POINTER
	DCA TRPBEG	/AND STORE IT AS POSSIBLE BEGINNING OF TRAP
TRFLST,	TAD TEMP	/GET CHAR
	CIA		/AND COMPARE IT WITH
	TAD I TRAPP	/NEXT TRAP CHAR
	SNA CLA		/SAME?
	JMP AHEAD	/YES; GO AHEAD
	TAD TRPFLG	/NO; GET TRAP FLAG
	SNA CLA		/WAS TRAP SET?
	JMP LIST10	/NO; GET NEXT CHAR
	DCA TRPFLG	/YES; CLEAR FLAG
	JMP BACK	/GO BACK AND CHECK CHAR AGAINST FIRST IN TRAP STRING
AHEAD,	IAC		/SET
	DCA TRPFLG	/  TRAP FLAG
	ISZ TRAPP	/BUMP POINTER IN TRAP TEXT
	TAD I TRAPP	/GET NEXT CHAR IN TRAP TEXT
	SZA CLA		/NULL?
	JMP LIST10	/NO; GO BACK FOR MORE
	TAD (BUFFER	/YES; RESET
	DCA IBP		/BUFFER INPUT POINTER
	DCA TRPFLG	/CLEAR TRAP FLAG
/
NXTTYP,	TAD OBP		/GET BUFFER OUTPUT POINTER
	CMA		/AND COMPARE WITH
	TAD TRPBEG	/TRAP BEGINNING POINTER
	SNA CLA		/SAME?
	JMP ENDOUT	/YES; END OF OUTPUT	
	CDF 10		/CHANGE TO BUFFER FIELD
	TAD I OBP	/NO; GET CHAR AND
	CDF 0		/AND RETURN TO PRESENT FIELD
	ISZ OBP		/INCREMENT POINTER
	JMS TYPE	/TYPE IT
	JMP NXTTYP	/GET ANOTHER CHAR TO TYPE
ENDOUT,	TAD (BUFFER	/GET RESET VALUE OF BUFFER POINTER
	DCA OBP		/AND RESET OUTPUT POINTER
	ISZ NXTMSG	/SET FLAG TO INDICATE RESPONSE AND TYPEOUT COMPLETED
	JMP I RECV	/RETURN
/
IBP,	0		/FILL POINTER FOR BUFFER
OBP,	0		/EMPTY POINTER FOR BUFFER
TEMP,	0		/TEMP STORAGE
TRPFLG,	0		/TRAP FLAG
TPT,	0		/POINTER TO TRAP PHRASE ON THIS PAGE TOO
TRAPP,	0		/CHAR POINTER FOR TRAP TEXT
TRPBEG,	0		/POINTER (IN BUFFER) TO POSSIBLE BEGINNING OF TRAP SEQUENCE
NXTMSG,	0		/FLAG; SET = RESPOINSE AND TYPEOUT COMPLETE

MON,	TAD I (7600	/BRANCH HERE BECAUSE OF ^C ON KEYBOARD; RETURN TO MONITOR
/
/TABLE OF POINTERS FOR SET AND CLEAR SEQUENCES FOR EACH BIT
/
/BITS ARE FIRST CLEARED IN ORDER 11-0
/AND THEN BITS ARE SET IN ORDER 0-11
/
SETCLR,	LOG;	KILL	/BIT0
	KILL;	URESET	/BIT1
	KILL;	STOP	/BIT2
	KILL;	STOP	/BIT3
	ZBLOCK 20	/ADJUST THIS NUMBER AS ADDITIONS ARE MADE TO TABLE
/
/TABLE OF COMMAND AND RESPONSE PAIRS
/END EACH SEQUENCE WITH A ZERO
/
	NICHTS=0	/JUST A CONVENIENT DEFINITION
/
LOG,	CTRLC; CRLFPD
	LOGIN; PWDCLN
	PASSWD; CRLFPD
	0
/
STOP,	DCTRLC;	CRLFPD
	0
/
URESET,	CTRLC;	CRLFPD
	CTRLS;	UPS
	NTAPE;	PERIOD
	SFILL1;	CRLFPD
	SFORM;	CRLFPD
	SCRLF;	CRLFPD
	NTAB;	CRLFPD
	ECHO;	CRLFPD
	0
/
KILL,	DCTRLC;	CRLFPD
	KF; CRLFPD
	0
/
	PAGE
/
/COMMANDS--THE ACTUAL CHARACTERS TO BE TRANSMITTED
/EACH STRING ENDS WITH A 0 TO CLOSE WITH A LF OR WITH -1
/TO CLOSE WITH A CR
/
CTRLC,	203;0
DCTRLC,	203;203;0
LOGIN,	"L;"O;"G;" ;"2;"7;"0;"1;"7;",;"2;"7;"0;"0;-1
PASSWD,	"P;"D;"P;"8;"E;0
SFILL1,	"T;"T;"Y;" ;"F;"I;"L;"L;" ;"1;0
SCRLF,	"T;"T;"Y;" ;"C;"R;"L;"F;0
NTAB,	"T;"T;"Y;" ;"N;"O;" ;"T;"A;"B;0
ECHO,	"T;"T;"Y;" ;"E;"C;"H;"O;0
NTAPE,	"T;"T;"Y;" ;"N;"O;" ;"T;"A;"P;"E;0
SFORM,	"T;"T;"Y;" ;"F;"O;"R;"M;0
CTRLS,	223;0
KF,	"K;"/;"F;215;0
/
/TRAPS--THE SEQUENCE OF CHARACTERS TO BE RECEIVED--BUT NOT PRINTED!!
/
CRLFPD,	12;56;0
PWDCLN,	120;341;363;363;167;157;162;344;72;240;0
UPS,	136;123;56;0
PERIOD,	56; 0
/
/BUFFER FOR TEXT COMING FROM DEC-10 COULD BEGIN HERE IF THERE WERE
/ENOUGH ROOM. SINCE THERE ISN'T, PUT IN IN NEXT FIELD.
/IT OCCUPIES THE SAME SPACE AS THE BUFFER FOR THE MAIN PROGRAM,
/BUT SO WHAT?
/
	FIELD 1
	*0
BUFFER,	0		/BEGINNING OF TEXT BUFFER
