/19 SUPER TTY HANDLER FOR OS/8
/
/
/
/
/
/
/
/
/
/COPYRIGHT  (C)  1974,1975,1977,1978 BY DIGITAL EQUIPMENT CORPORATION
/
/
/
/
/
/
/
/
/
/
/THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE
/AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
/CORPORATION.  DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY
/FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT.
/
/THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER
/UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED
/(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH
/SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL.
/
/DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE
/OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY
/DIGITAL.
/
/
/
/
/
/
/
/
/
/

/S.W.,S.R.,H.J.,R.L.,S.R.

	*0

	-1
	IFNDEF SLU <SLU=0>
	IFZERO SLU <DEVICE KL8E;DEVICE TTY;0;TTY&177+4000;ZBLOCK 2>
	IFZERO SLU-2 <DEVICE SLU2;DEVICE SLU2;0;TTY&177+4000;ZBLOCK 2>
	IFZERO SLU-3 <DEVICE SLU3;DEVICE SLU3;0;TTY&177+4000;ZBLOCK 2>

/TWO-PAGE TELETYPE HANDLER FOR OS/8 V3.
/ON INPUT, RECOGNIZES ^Z, ^C, ^U, RUBOUT
/^Z	MEANS END OF INPUT, INSERT ^Z IN BUFFER,
/	PAD WITH ZEROES, AND ECHO "^Z"
/^C	MEANS ABORT JOB, RETURN TO OS/8 VIA LOC 7600 TO SAVE CORE AND PRINT "^C"
/^U	MEANS DELETE THE LAST LINE, ALLOW OPERATOR TO RETYPE
/	(LINE STARTS AT BEGIN OF BUFFER AND IS TERMINATED BY A CR)
/	A CR GETS ENTERED INTO BUFFER, CAUSES A LF TO ALSO ECHO
/	AND GET ENTERED INTO BUFFER, BUFFER IS THEN PADDED WITH NULLS.
/	CONVERTS LC TO UC

/ON OUTPUT RECOGNIZES ^C, ^O, ^S, ^Q FROM KEYBOARD
/^C	CAUSES JOB TO ABORT, RETURN TO OS/8 VIA LOCATION 7600
/	TO SAVE CORE AND PRINT "^C"
/^O	CAUSES ECHOING BY THE HANDLER TO CEASE
/	TYPING ANY OTHER CHARACTER RESUMES ECHOING.
/^S	CAUSES THE HANDLER TO STOP SENDING TO TERMINAL
/^Q	RESUMES HANDLER SENDING
/	^S AND ^Q ARE IGNORED  IN OTHER CASES

/WHENEVER PRINTING CHARACTERS (EITHER ON OUTPUT OR WHEN ECHOING),
/	IGNORES NULLS
/	FLAGS LC WITH AN APOSTROPHE
/	HANDLES TABS CORRECTLY (SEVERAL WAYS)
/	PRINTS ESCAPE AS $
/	DELAYS 16 MS AFTER LINEFEEDS
/	PRINTS CONTROL CHARACTERS AS "^K"

/DOES AUTOMATIC CR/LF AT END OF LINE WIDTH.

/MAINTENANCE RELEASE CHANGES:

/1.	ADDED KCC FOR NON-CONSOLE TELETYPES

/V3D CHANGES: (VERSION E)

/1.	ADDED DELAY OPTION FOR VT78
/2.	ADDED SCOPE RUBOUTS
/3.	CHANGED VT78 DEFAULTS
/4.	REARRANGED CODE FOR SET TTY ESC AND ARROW

/CHANGES FOR OS/78 V2

/1.	CHANGED KSF TO KKSF, ETC.
/	(DID NOT BUMP VERSION LETTER)
/2.	MADE CONDITIONALS FOR SLU2
	IFNDEF INDVC <INDVC=03>
	IFNDEF OUTDVC <OUTDVC=INDVC+1>

	KKSF=10^INDVC+6001
	KKCC=10^INDVC+6002
	KKRS=10^INDVC+6004
	KKRB=KKCC KKRS
	TTSF=10^OUTDVC+6001
	TTCF=10^OUTDVC+6002
	TTPC=10^OUTDVC+6004
	TTLS=TTCF TTPC

	TTYVERSION="E&77
/BUILD YOUR OWN TELETYPE HANDLER:

/THIS SOURCE HAS MUMBLE LOCATIONS LEFT.

/THE FOLLOWING CONDITIONALS ALLOW YOU TO INCLUDE OPTIONAL FEATURES.
/YOU MAY INCLUDE AS MANY OR AS FEW AS YOU DESIRE PROVIDED THERE
/IS ROOM LEFT.

/CONDITIONAL	LOCATIONS	LOCATIONS	INCLUDED
/VARIABLE	PAGE 1		PAGE 2		FEATURES

/ DELAY		 0		 7		DELAY AFTER GIVEN CHAR
/ CTRL	 	 0 		 3		PRINT CONTROL CHARS AS ^K
/ RUB		 0		 0		PRINT CHAR RUBBED OUT ON RUBOUTS
/ SIMTAB	 0		10		SIMULATE TABS AS SPACES
/ SLOTAB	 0		 6		PUT OUT 2 RUBOUTS AFTER A TAB
/ ESC		 0		10		PRINT ESCAPE AS $
/ FLAGLC	 0		12		FLAG LOWER CASE CHARS ON OUTPUT
/ CNVLC		 0		 7		CONVERT LOWER CASE ON INPUT TO UPPER CASE
/ ALTMOD	 0		11		CONVERT ALTMODES (175,176) TO ESCAPE (33)
/ PAUS		 0		20		PAUSE BETWEEN PAGES
/ FREE LOCS:	 2		33

	VT78=1		/SET TO 0 TO ALLOW OTHER PARAMETERS
			/SET TO 1 TO FORCE OTHER PARAMETERS TO VT78 COMPATIBLE

	DELAY=0		/SET NON-ZERO TO ALLOW DELAY AFTER ANY CHAR (12=CR)
			/TYPICALLY AFTER LF FOR HIGH SPEED VT05
			/SET VALUE OF DELAY = 7-BIT CHAR TO DELAY AFTER

	CTRL=1		/SET TO 1 TO ECHO CONTROL CHARS AS ^K
			/SET TO 0 TO ACCEPT CONTROL CHARACTERS AND PUT
			/IN BUFFER, BUT NOT ECHO THEM (EXCEPT THE USUAL)
	RUB=1		/SET TO 0 TO ECHO EACH RUBOUT BY TYPING A BACK SLASH
			/SET TO 1 TO ECHO CHARS RUBBED OUT UPON RUB-OUT
			/SET TO 4000 TO PERFORM SCOPE TYPE RUBOUTS
	SIMTAB=1	/SET TO 1 TO SIMULATE TABS AS THE CORRECT NUMBER OF SPACES
			/SET TO 0 TO TYPE TABS AS TABS
	SLOTAB=0	/SET TO 1 TO TYPE 2 RUBOUTS AFTER A TAB
			/ONLY IS APPLICABLE IF SIMTAB=0
	ALTMOD=0	/SET TO 1 TO CONVERT 175,176 TO 33
			/(UPPER CASE TERMINALS ONLY)
	ESC=1		/SET TO 1 TO ECHO ESCAPE AS $
			/SET TO 0 TO ECHO ESCAPE AS A CONTROL CHAR (^[)
	FLAGLC=1	/SET TO 1 TO FLAG LOWER CASE CHARS ON OUTPUT
			/THIS IS FOR PEOPLE NOT PRIVELIDGED ENOUGH TO
			/OWN A LOWER CASE TERMINAL
			/SET TO 0 TO PRINT LOWER CASE CHARS AS IS
	CNVLC=0		/SET TO 1 TO CONVERT LOWER CASE CHARS ON INPUT TO UPPER CASE
			/SET TO 0 TO ACCEPT INPUTTED LOWER CASE CHARS AS IS
			/THIS IS FOR PEOPLE WHO ARE HANDICAPPED BY A LOWER CASE
			/TERMINAL AND ONLY WANT UPPER CASE
	PAUS=200	/NON-0 PAUSES BETWEEN SCOPE PAGES
	HEIGHT=30	/NUMBER OF LINES PER SCREEN

/SOME OF THE ABOVE OPTIONS SHOULD ACTUALLY BE IMPLEMENTED
/IN SUCH A MANNER THAT THE USER CAN CHANGE THEM VIA AN ALTER
/RATHER THAN HAVE TO REASSEMBLE.

	IFNZRO VT78 <
	DELAY=0
	CTRL=1
	RUB=4000
	SIMTAB=0
	SLOTAB=0
	ALTMOD=0
	ESC=1
	FLAGLC=0
	CNVLC=0
	IFNZRO INDVC-3 <CTRL=0>
	>
/CROSS PAGE LINKAGE:

/THIS CODE MUST BE ABLE TO LOAD INTO ANY TWO PAGES OF CORE
/THE ENTRY POINT IS AT THE NEXT LOCATION TO THE END OF THE FIRST PAGE
/AT THE END OF THE FIRST PAGE WE JMS TO PLINK,
/THIS LEAVES THE ADDRESS OF THE FIRST LOCATION OF THE NEXT PAGE
/IN LOCATION 'PLINK' .  THIS JUST HAPPENS TO BE THE ADDRESS
/OF BOTH TTYPCH AND TTYGCH.

/TTYPCH AND TTYGCH SHARE THE SAME ENTRY POINT.
/IF IT IS CALLED WITH A 0 AC, IT IS A CALL TO TTYGCH,
/IF IT IS CALLED WITH A NON-ZERO AC, IT IS A CALL TO TTYPCH.

/RETURN 1 MEANS GOT RUBOUT
/TTYGCH TAKES RETURN 2 IF IT GOT A ^Z.
/OTHERWISE IT TAKES RETURN 3 WITH CHARACTER GOTTEN IN AC.

/TTYPCH TAKES RETURN 1 IF IT WANTS THE HANDLER TO GO AWAY,
/I.E IF IT SAW A ^Z.
/AC IS NORMALLY NON-ZERO UPON RETURN
/AC IS POSITIVE MEANS DO A CRLF

/WHEN ECHOING WE WANT TO CALL TTYPRT
/BUT OTHERWISE WE WANT TO CALL TTYPCH (WHICH DOES ADDITIONAL
/STUFF LIKE CHECK ^O, ^Q, ETC.
/WE TELL BY WHETHER OR NOT TTYGCH HAD BEEN PREVIOUSLY CALLED.
	*200

PLINK,	0		/GETS ADDRESS OF TTYPCH AND TTYGCH (START OF NEXT PAGE)
	STL CLA RAR	/4000
	TAD I TTY	/RETRIEVE FUNCTION WORD, BUT PUT R/W BIT IN LINK
	AND L3700	/EXTRACT NUMBER OF DOUBLE-WORDS TO TRANSFER
	CMA		/GET COUNT+1
	DCA BUFSIZ	/STORE AWAY
	RDF		/FIND OUT THE USER'S DATA FIELD
	TAD CIFCDF	/FORM OUR EXIT CIF CDF
	DCA TTYXIT	/STORE AWAY FOR EXIT ROUTINE
	TAD TTY70	/GET FUNCTION WORD
L776,	AND I TTY	/ISOLATE FIELD OF BUFFER
	TAD TTYCDF	/FORM CDF TO FIELD OF BUFFER
	DCA TTCDBF	/STORE WHERE IT WILL BE USEFUL
			/AT SAME TIME, INITIALIZE TTYEOF
	ISZ TTY		/POINT TO BUFFER ADDRESS
	TAD I TTY	/AND GET IT
	DCA BUFSTRT	/AND SAVE IT
	ISZ TTY		/POINT TO BLOCK #
TTY376,	ISZ TTY		/POINT TO ERROR RETURN
SHIFT,			/OUTPUT SHIFT REGISTER
TTYEOF,			/0 IF SAW CR OR ^Z AND WISH TO PAD BUFFER WITH 0'S
TTCDBF,	HLT		/CDF BUFFER FIELD
	JMP TTYKLG
TTYLP,	SNL CLA		/LINK=1 MEANS OUTPUT
	JMP TTYGET	/INPUT IS FROM TTY:
/LINK MUST BE SET FIRST TIME THROUGH HERE.
/IT ACTS AS A GUARD BIT IN THE SHIFT REGISTER
ROTL,	RTL
	RTL
	SPA		/DO WE HAVE 8 BITS SHIFTED IN?
	JMP TELP
	DCA SHIFT	/SAVE SHIFT REGISTER
	TAD I BUFSTRT
	SZA
	JMS PUNCH	/PRINT A CHARACTER
	TAD I BUFSTRT
	ISZ BUFSTRT	/BUMP INPUT POINTER
TT7400,	7400		/PROTECT ISZ
	AND TT7400
	CLL RAL
	TAD SHIFT	/SHIFT HIGH ORDER 4 BITS INTO
	JMP ROTL	/SHIFT REGISTER
TELP,	JMS PUNCH	/PRINT 3RD CHARACTER OF DOUBLE-WORD
	STL		/***KLUDGE
TTYKLG,	ISZ BUFSIZ	/DONE?
	JMP TTYLP	/NOT YET
TTYX,	TAD TTYEOF	/IF INPUT AND WE WERE PADDING WITH 0'S
	SZA CLA		/TAKE SOFT ERROR EXIT
TTYRTN,	ISZ TTY		/POINT TO NORMAL RETURN
			/CAN'T GET ERROR OR END-OF-FILE ON OUTPUT
TTYXIT,	HLT		/RETURN TO USER'S FIELD
	JMP I TTY	/RETURN TO USER
TTYCA,	0
TTYWC,	0
BUFSIZ,	0
BUFSTRT,0
TTY70,	70

PUNCH,	0		/NEVER CALL TTYPCH WITH ZERO AC
	JMS I PLINK	/CALL TTYPCH
	JMP TTYRTN	/GO AWAY, WE SAW A ^Z
L7700,	SMA CLA		/DID WE REACH END OF TTY LINE?
	JMS CRLF	/YES, PERFORM CR/LF
	JMP I PUNCH	/RETURN

TMP,
CRLF,	0
	TAD L215
	JMS I PLINK	/CALL TTYPCH TO PRINT CR
L215,	215		/CAN'T RETURN HERE
	CLA		/****
	TAD L212
	JMS I PLINK	/CALL TTYPCH TO PRINT LF
L212,	212		/CAN'T RETURN HERE
	CLA		/****
	JMP I CRLF	/RETURN
CTRLU,	JMS CRLF	/PERFORM A CR/LF
TTYGET,	TAD BUFSTRT
	DCA TTYCA	/POINT TO START OF BUFFER
	TAD BUFSIZ
	CLL RAL		/CONVERT DOUBLE-WORDS TO WORDS
DCAWC,	DCA TTYWC	/SET SIZE OF BUFFER
TSTEND,	TAD TTYEOF
	SNA CLA
	JMP ZERO
	JMS I PLINK	/CALL TTYGCH TO GET A CHARACTER
	JMP RUBOUT	/RETURN 1 MEANS SAW RUBOUT
ZERO,	DCA I TTYCA	/RETURN 2 MEANS GOT CHARACTER
			/STORE AWAY TEMPORARILY
			/USING USER'S BUFFER AS A TEMP LOCATION
	TAD I TTYCA	/GET BACK CHARACTER
	IFNZRO .-320 <_ERROR>
	SZA
	JMS PUNCH	/ECHO IT
	TAD I TTYCA	/GET IT AGAIN
	TAD M32		/-^Z
	SNA
	JMP CTRLZ
	TAD L5		/^Z-^U
	SNA 		/IS IT ^U?
	JMP CTRLU	/YES
	TAD L7
GRUDGE,	DCA TMP
	ISZ TTYCA	/NO
L7,	7
	ISZ TTYWC	/IS BUFFER FULL?
TT10,	SKP
	JMP TTYX
	ISZ TMP		/WAS LAST CHAR A CR?
	JMP TSTEND	/NO
	DCA TTYEOF	/YES, SET "PAD WITH 0'S" FLAG
	ISZ TTY		/POINT TO NORMAL RETURN
			/CR IS NOT AN ERROR OR END-OF-FILE
	TAD L212	/IF LAST CHAR INPUT WAS CR, NOW PRETEND LF WAS INPUT
	JMP ZERO	/REJOIN PROCESSING

CTRLZ,	DCA TTYEOF
	JMS CRLF
	JMP GRUDGE

M32,	-32
L5,	5
L3700,	3700
CIFCDF,	CIF CDF 0
TTYCDF,	CDF 0

/TTYEOF IS ZERO MEANS PAD BUFFER WITH ZEROES
/DON'T DO YET:
/RUBOUT,	AND TTYWC	/177 IN AC
/	SNA CLA
/	JMP CTRLU

RUBOUT,	KKCC		/TTYGCH DOESN'T CLEAR RO FROM BUFFER
	TAD TTYCA
	CIA
	TAD BUFSTRT
	SNA CLA		/ARE WE AT BEGIN OF BUFFER?
	JMP CTRLU	/YES
	STA
	TAD TTYCA
	DCA TTYCA
	IFZERO RUB <
LSLASH,	"\
	TAD LSLASH		/PRINT A BACK SLASH FOR EACH RUBBED OUT CHAR
	>
	IFNZRO RUB&4000+RUB <TAD I TTYCA>	/PRINT CHAR JUST DELETED
	IFNZRO RUB&4000 <TAD TT10>	/BACKSPACE-SPACE-BACKSPACE
	JMS PUNCH
	STA
	TAD TTYWC
	JMP DCAWC	/BUMP BACK WC AND GET ANOTHER CHAR

	ZBLOCK 376-.
TTY,	TTYVERSION	/ENTRY POINT TO HANDLER
	JMS PLINK	/SET UP CROSS PAGE LINKAGE
	IFNZRO TTY-376 <ENTERR,QQQQ>
	PAGE
/INTERLUDE:

/USA STANDARD CODE FOR INFORMATION INTERCHANGE:

/	000	001	010	011	100	101	110	111
/
/ 0000	NUL	DLE	SP	0	@	P	'	'P
/
/ 0001	SOH	DC1	!	1	A	Q	'A	'Q
/
/ 0010	STX	DC2	"	2	B	R	'B	'R
/
/ 0011	ETX	DC3	#	3	C	S	'C	'S
/
/ 0100	EOT	DC4	$	4	D	T	'D	'T
/
/ 0101	ENQ	NAK	%	5	E	U	'E	'U
/
/ 0110	ACK	SYN	&	6	F	V	'F	'V
/
/ 0111	BEL	ETB	'	7	G	W	'G	'W
/
/ 1000	BS	CAN	(	8	H	X	'H	'X
/
/ 1001	HT	EM	)	9	I	Y	'I	'Y
/
/ 1010	LF	SUB	*	:	J	Z	'J	'Z
/
/ 1011	VT	ESC	+	;	K	[	'K	'[
/
/ 1100	FF	FS	,	<	L	\	'L	'\
/
/ 1101	CR	GS	-	=	M	]	'M	']
/
/ 1110	SO	RS	.	>	N	^	'N	'^
/
/ 1111	SI	US	/	?	O	_	'O	'_
/
/TTYGCH:	GETS A CHAR FROM KBD
/	IF GOT ^Z, IT SETS TTYEOF FLAG
/	LEAVES IT IN AC IN 7-BIT

/TTYPRT:	PRINTS CHAR IN AC ON TTY
/	IGNORES NULLS
/	PRINTS ^X ON CONTROL CHARS (EXCEPT CR, LF, FF, VT, TAB)
/	PRINTS 'X ON LOWER CASE

/HANDLES TABS CORRECTLY
/	AND AUTOMATICALLY PRINTS CR/LF AT EOL
/	PRINTS ESCAPE AS $

/TTYTLS:	USED TO ACTUALLY PRINT CHAR
/		IT HANDLES TABS AUTOMATICALLY
/		AND CR/LF'S AT END OF LINE

/TTYPCH:	IT USES TTYPRT TO PRINT CHAR BUT ALSO RESPONDS TO
/		^C, ^O, ^S, ^Q.
/		IF ^Z IS BEING PRINTED, IT THEN STOPS FURTHER PRINTING
/MUST BE AT TOP OF PAGE
TTYPCH,			/ENTRY POINT TO TTY PUNCH ROUTINE
			/OR TTY PRINT ROUTINE
TTYGCH,	0		/ENTRY POINT TO TTY GET CHAR ROUTINE
	SNA
	JMS TGCH	/ZERO AC-MEANT CALL TO TTYGCH
PCH,	AND (177	/FORCE TO 7-BIT
	DCA TCHAR
	TAD TGCH
M140,	SZA CLA		/ARE WE ECHOING?
	JMP ECHO	/YES, IGNORE ^S AND STUFF
K5,	5		/MUST BE AT REL 10
	TAD TCHAR
	TAD (-32
	IFZERO PAUS <
	SNA CLA
	JMP I TTYPCH
	>
	IFNZRO PAUS <
	SNA
	JMP I TTYPCH
	TAD L15		/32-15
	SNA CLA		/LOOK FOR CR
	ISZ LINCNT	/AT END OF PAGE?
	JMP NOPAUS	/NOT AT CR, OR AT CR BUT NOT AT END OF PAGE
L15,	15		/MUST BE HERE FOR SET
	TAD PAUSN
	DCA TTYTLS	/SET COUNT FOR OUTER LOOP
	ISZ LINCNT
	JMP .-1
	ISZ TTYTLS
	JMP .-3
	TAD LINSYZ
	DCA LINCNT
	>
NOPAUS,	JMS TTYTST
	TAD (203-217	/NO
	SNA		/^O?
	DCA TCHAR	/YES, SET TO NULL SO IT WILL BE IGNORED
	TAD (217-223	/NO
	SZA CLA		/^S?
	JMP ECHO	/NO, IGNORE CHAR
TTCTLQ,	JMS TTYTST
	TAD (203-221	/NO, NOTHING ELSE MATTERS UNTIL ^Q
	SZA CLA		/^Q?
	JMP TTCTLQ	/NO, SUSPEND OUTPUTTING
TTY32,	KKCC		/YES, REMOVE ^Q FROM BUFFER
/HAD NO ROOM FOR:
/	TAD LINSYZ
/	DCA LINCNT
ECHO,	DCA TGCH
	ISZ TTYPCH
	IFNZRO ESC <
	TAD TCHAR
	TAD (-33
	SZA CLA
	JMP .+3
	TAD L44
	DCA TCHAR
L44,	44
	>
	TAD TCHAR
	SNA
	JMP TTYCTO	/IGNORE NULLS
	IFNZRO RUB&4000 <
	TAD (-10
	SNA
	JMP RUBO
	TAD (10-16
	>
	IFZERO RUB&4000 <
	TAD (-16
	>
TTY100,	CLL
TTY10,	TAD K5
TTY240,	SZA		/TAB?
	JMP NOTAB
	IFNZRO SIMTAB <
TTYTAB,	TAD TTY240
	JMS TTYTLS
TTY7,	7		/HERE FOR NO SPECIAL REASON
	TAD TABCTR
	AND TTY7
	SZA CLA
	JMP TTYTAB
	JMP TTYCTO
	>
	IFNZRO SLOTAB <
	TAD TCHAR
	JMS TTYTLS
	TAD (177
	JMS TTYTLS
	TAD (177
	JMP PRIN+1
	>
	IFZERO SIMTAB+SLOTAB <JMP PRIN>

/BUG: IF HARDWARE TABS, DON'T COUNT COLUMNS CORRECTLY

	IFNZRO RUB&4000 <
RUBO,	TAD TTY10	/OUTPUT BACKSPACE-RUBOUT-BACKSPACE
	JMS TTYTLS
	TAD TTY240
	JMS TTYTLS
	TAD (-4
	TAD TABCTR
	JMP PREPRN
	>
NOTAB,	SZL CLA
	JMP SPCHR	/DON'T UPARROW CHARS LF,CR,TAB,VT,FF
	IFNZRO FLAGLC <
	TAD TCHAR
	AND TTY140
	TAD M140
	SZA CLA		/IS IT LC?
	JMP NOLC	/NO
TTYQUO,	"'
	TAD TTYQUO	/YES
	JMS TTYTLS	/PRINT QUOTE
	TAD M40
	JMP PRIN	/PRINT UPPER CASE OF CHAR
	>
NOLC,	TAD TCHAR	/NO, GET BACK CHAR
	AND TTY140	/HIGH ORDER BITS IRRELEVANT
	IFNZRO CTRL <
M40,	SMA SZA CLA	/CAN'T BE NEGATIVE
	JMP PRIN	/NOT A CONTROL CHARACTER
	TAD TTYUPA	/ECHO 201-237 AS ^X (EXCEPT 211-215)
	JMS TTYTLS
	TAD TTY100	/ADD X100 TO ^K TO GET K
	>
	IFZERO CTRL <
	SNA CLA		/IS CHAR A CONTROL CHAR?
	JMP TTYCTO	/YES, DON'T ECHO CONTROL CHARACTERS EXCEPT FOR 211-215
	>
PRIN,	TAD TCHAR
	JMS TTYTLS
TTYCTO,	TAD TABCTR	/RETURN TABCNT IN AC
	JMP I TTYPCH

	IFZERO CTRL <
M40,	-40
	>

TTY140,
SPCHR,	STA CLL
	TAD LINSIZ
PREPRN,	DCA TABCTR	/THESE CHARS RESET COLUMN COUNTER
	JMP PRIN
TGCH,	0		/NON-ZERO MEANS TTYGCH WAS CALLED
	KKSF
	JMP .-1		/WAIT FOR CHAR TO BE TYPED
	JMS TTYTST
/WILD: (DON'T PUT IN)	SZA CLA /FALL THRU AND RETURN R.O.
/	ISZ TTYGCH
	TAD (203-377
	SNA CLA		/TAKE RETURN 1 ON RUB OUT
	JMP I TTYGCH	/"CLUMSY" - R.L. (9/18/73)
	ISZ TTYGCH
	KKRB		/GET CHARACTER
TTYAND,	AND (177	/MUST RETURN CHAR IN 7-BIT
	IFNZRO CNVLC <
	DCA TCHAR
	TAD TCHAR
	AND TTY140
	TAD M140
	SNA CLA		/IS IT LC?
	TAD M40		/YES
	TAD TCHAR	/NO
	>
	IFNZRO ALTMOD <
	TAD (-175	/IS IT 175 OR 176?
	SMA
	JMP CONV	/YES, CONVERT ALTMODE TO ESCAPE
	TAD (175	/NO, RESTORE CHAR
	>
	JMP I TTYGCH	/TAKE RETURN 3

/SHOULDN'T TABCTR BE INITIALIZED TO C(LINSIZ) UPON ENTRY?

TABCTR,	-110

TTYTLS,	0
	TTLS
	IFNZRO DELAY <
	TAD (-DELAY
	SZA CLA
	STA
	>
TTYTSF,	TTSF
	JMP .-1
	IFNZRO DELAY <
	IAC
	SZA		/19.66 MS IS G.T. 1/60 SEC
	JMP TTYTSF
	>
	ISZ TABCTR
TTYUPA,	"^
TT7600,	7600
	JMP I TTYTLS
LINSIZ,	-110

	IFNZRO PAUS <
LINSYZ,	-HEIGHT
LINCNT,	-HEIGHT
PAUSN,	-PAUS
	>

	IFNZRO ALTMOD <
		IFNZRO KKCC-6032 <
CONV,		CLA
		TAD (33
		JMP I TTYGCH
		>
	IFZERO KKCC-6032 <
CONV,		CLA IAC
		TAD TTY32	/DEVICE DEPENDENT
		JMP TTYAND
		>
	>
TCHAR,	0

/TTYTST:	READS KEYBOARD STATICALLY AND RESPONDS TO ^C
/		OTHERWISE RETURNS CHAR (8-BIT) MINUS 203 IN AC.
/		IF FLAG IS NOT UP, IT RETURNS A 1.

TTYTST,	0
	TAD TT7600	/OR CHAR IN
	KKRS
	TAD (-7603	/-7603=175
	KKSF
	CLA IAC		/STUFF IN BUFFER IS UNRELIABLE IF FLAG ISN'T UP
	SZA
	JMP I TTYTST
	IFNZRO INDVC-3 <KKCC>
	CIF CDF 0	/BRANCH TO OS/8 MONITOR AT 07600
	JMP I TT7600	/IT WILL PRINT "^C" FOR CHAR IN BUFFER
	PAGE
/	DYNAMICALLY MODIFYING THE KL8E HANDLER

/	*** I M P O R T A N T ***

/	THIS HANDLER CAN BE DYNAMICALLY CHANGED VIA SET COMMANDS.
/	CONSEQUENTLY, IT IS EXTREMELY IMPORTANT THAT PEOPLE
/	WHO MODIFY THIS SOURCE DO NOT AFFECT THE ALGORITHMS
/	NECESSARY TO PERFORM SUCH MODIFICATIONS.

/	THIS ALGORITHM IS EXPLAINED BELOW.

/	SET TTY WIDTH=N

/	SEARCH LOCATIONS 200-377 FOR A 7600.  CALL ITS ADDRESS X.
/	LET Y BE THE INSTRUCTION AT LOCATION X+1.
/	FORM THE (RELATIVE) ADDRESS T=Y&177+200-1.
/	THEN LOCATIONS T AND X+2 CONTAIN MINUS THE TTY WIDTH.
/	THE WIDTH MUST BE A MULTIPLE OF 10 AND MUST NOT BE 200.
/	(BECAUSE -200 IS THE MAGIC 7600)

/	SET TTY CODE XX

/	SEARCH ENTIRE HANDLER FOR INSTRUCTIONS OF THE FORM 6XXY
/	WHERE XX IS NOT 20 OR 21,
/	AND FURTHERMORE DON'T INCLUDE A 6031 IF 2 LOCATIONS
/	FOLLOWING IS A 7650
/	AND DON'T INCLUDE A 6034 IF 4 LOCATIONS FOLLOWING IS A 7650.


/	SET TTY [NO] ECHO

/	THE WORD INVOLVED IS AT (RELATIVE) LOCATION 120.
/	SET TO 7440 TO ECHO.
/	SET TO 7610 TO SUPPRESS ECHOING.


/	SET TTY LC

/	SEARCH LOCATIONS 200-377 FOR A 377.  CALL ITS ADDRESS X.
/	LOOK AT LOCATION X+5.
/	IF THIS LOCATION IS NOT A 7650, THEN LC TO UC CONVERSION
/	WAS NOT ENABLED AT ASSEMBLY TIME.
/	IF THE FEATURE IS ENABLED, CHANGE LOCATION X+5 TO A 7610
/	TO PREVENT THE CONVERSION.  TO ALLOW CONVERSION, SET
/	LOCATION X+5 BACK TO 7650.

/	SET TTY PAGE

/	SEARCH LOCATIONS 215-300 FOR A 7450. CALL ITS ADDRESS X.
/	SET X+3 TO 7640 TO ENABLE ^S, ^Q.
/	SET X+3 TO 7200 TO DISABLE ^S, ^Q.
/	SET TTY TAB

/	SEARCH LOCATIONS 200-300 FOR A 7.
/	IF NOT FOUND, SIMULATED TABS WAS NOT ENABLED AT ASSEMBLY TIME.
/	IF FOUND, CALL ITS ADDRESS X.
/	TO PATCH OUT SIMULATED TABS:
/		MOVE C(X-12) TO LOCATION X-2
/		CHANGE LOCATION X+3 TO A 7610
/	TO RESTORE SIMULATED TABS:
/		SET LOCATION X-2 TO X-4&77+1200
/		CHANGE LOCATION X+3 TO A 7640

/	SET TTY FILL

/	THE LITERAL 177 MUST REMAIN AT THE END OF PAGE 2
/	SEARCH LOCATIONS 200-300 FOR A 1377.
/	IF NOT FOUND, THEN FILL CHARACTERS WERE NOT ENABLED AT ASSEMBLY
/	TIME.  IF FOUND, CALL ITS ADDRESS X.
/	TO PATCH OUT FILL CHARACTERS, MOVE C(X+3) TO LOCATION X-1.
/	TO RESTORE FILL CHARACTERS, MOVE C(X+1) TO LOCATION X-1.

/	SET TTY FLAGLC

/	SEARCH LOCATIONS 200-377 FOR A 247.
/	IF NOT FOUND, LOWER CASE FLAGGING WAS NOT ENABLED AT ASSEMBLY TIME.
/	IF FOUND, CALL ITS ADDRESS X.
/	TO DISABLE FLAGGING, SET LOCATION X-2 TO A 7200.
/	TO RE-ENABLE FLAGGING, SET LOCATION X-2 TO A 7640.

/	SET TTY PAUSE [N]

/	SEARCH LOCATIONS 200-300 FOR A 15.
/	IF NOT FOUND, PAUSING WAS NOT ENABLED AT ASSEMBLY TIME.
/	IF FOUND, CALL ITS ADDRESS X.
/	TO DISABLE PAUSING AFTER A FULL SCREEN,
/	SET LOCATION X-3 TO A 7610.
/	TO RE-ENABLE PAUSING, SET LOCATION X-3 TO A 7650.
/	TO SET PAUSE DURATION, SEARCH LOCATIONS 300-377 FOR A 7600,
/	CALLING ITS ADDRESS X.  THEN (MINUS THE) PAUSE DURATION IS AT
/	LOCATION X+5.

/	SET TTY HEIGHT

/	THIS IS ONLY APPLICABLE IF SET TTY PAUSE HAS BEEN ASSEMBLED IN
/	(A 15 CAN BE FOUND ON SECOND PAGE).
/	NEGATIVE OF HEIGHT MUST BE SET IN BOTH LOCATIONS X+3 AND X+4
/	WHERE X IS THE ADDRESS OF A 7600 AS IN ABOVE.
/	SET TTY ESCAPE

/	SEARCH LOCATIONS 200-377 FOR A 44.
/	IF NOT FOUND, THEN $ WAS NOT ASSEMBLED INTO TTY HANDLER.
/	IF FOUND, CALL ITS ADDRESS X.
/	TO DISABLE PRINTING ESCAPE AS $, SET LOCATION X-4 TO A 'CLA'.
/	TO CAUSE ESCAPE TO PRINT AS AN ESCAPE, SET LOCATION X-4 TO SZA CLA.

/	SET TTY ARROW

/	SEARCH LOCATIONS 200-377 FOR 7740.

/	IF NOT FOUND, USING OLD HANDLER.
/	CALL ITS ADDRESS X.
/	IF LOCATION X+1 IS MORE THAN 7000,
/	THEN UPARROW MODE WAS NOT ASSEMBLED INTO KL8E.
/	OTHERWISE, TO ALLOW ARROWS, SET LOCATION X+3 TO THE
/	CONTENTS OF LOCATION X+6.
/	TO CAUSE CONTROL CHARACTERS TO ECHO AS IS, SET
/	LOCATION X+3 TO 'SKP CLA'.
/	NOTE THAT THIS IS A DIFFERENT OPTION THAN ASSEMBLING CTRL=0.
	IFDEF TEST <
	*600

/TEST ROUTINE FOR KL8E HANDLER

GO,	JMS I (TTY	/CALL HANDLER
	0600		/READ SIX PAGES
	1000		/BUFFER AT 01000
	0001		/BLOCK 1
	HLT		/ERROR RETURN
	JMS I (TTY	/CALL HANDLER AGAIN
	4600		/OUTPUT SIX PAGES
	1000
	0001
	HLT
	CLA
	JMP GO
	>
	$

