File: TTY.PA of Tape: Sources/RTS/dec-s8-ortsa-c-uc1-rts8
(Source file text) 

/8 TTY DRIVER TASK FOR RTS8 V2B			25-SEP-76
	VERS=	1
	XLIST	1	/COPYRIGHT HAS APPEARED IN PARAM.PA
/
/
/
/
/
/
/
/
/
/COPYRIGHT  (C)  1975,1976 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.
/
/
/
/
/
/
/
/
/
/
	XLIST	0	/WANT TO LIST TASK
/EDIT HISTORY:
/	FEATURES ADDED BY S.R. ON 16-JUL-75:

/1.	CTRL/S, CTRL/Q
/2.	AUTOMATIC CR/LF AFTER TTY WIDTH REACHED (USU 80 COLS)
/3.	RE-ECHOING OF PROMPT LINES ON CTRL/U
/4.	BACKSPACE FACILITY FOR RUBOUT ON SCOPE TERMINALS
/5.	CTRL/U PRINTS "^U"
/6.	TAB OPTIONS
/7.	FILL OPTIONS

/	4-AUG-75: COMBINED IN OLD TTY HANDLER
/	25-NOV-75:	ADDED KL8A SUPPORT
/	29-DEC-75:	ADDED WIDTH-IGNORING CODE
/	23-JUN-76	REVISED KL8A SUPPORT
/	25-Sep-76	FIXED WIDTH IGNORING CODE
/			FIXED ^S BUG.
/			FIXED BUG CONCERNING LINES WITH MORE THAN 4096 CHARS
/	07-OCT-76	ADDED TTLOC AND TTFLD
/			ADJUSTED DEVICE CODE FOR MULTIPLE KL8A'S
/			ADDED GENERAL POWER FAIL CODE
/	14-DEC-76	FIXED L7 BUG

/TASK DATA BLOCK:

INIWT=	0

	IFNDEF	TTFLD		<TTFLD=00>
	IFNDEF	TTLOC		<TTLOC=3400>
	IFNDEF	TTDEV		<TTDEV=	04>
	IFNZRO	TTDEV-4&4000	<TTDEV=KL8ALINE TTDEV>
	IFNZRO	TTDEV&6000	<TTDEV=TTDEV&770%10>
	IFNDEF	KBDEV		<KBDEV=	TTDEV-1>
	IFNZRO	KBDEV&6000	<KBDEV=KBDEV&770%10>
	IFNDEF	CONSOL		<CONSOL=1>	/DEFAULT IS CONSOLE
	IFNDEF	TASK	<TASK=	TTY>	/TASK COULD BE DEFINED IN CONTROL FILE
	IFNDEF	VT50	<VT50=	1>	/SET TO 0 IF DON'T WANT ^S, ^Q FEATURE
	IFNDEF	SCOPE	<SCOPE=	0>	/SET TO 1 IF TTY CAN DO A BACKSPACE
	IFNDEF	FILL	<FILL=	0>	/NUMBER OF FILL CHARACTERS AFTER CR/LF
	IFNDEF	WIDTH	<WIDTH=	120>	/TTY LINE WIDTH
	IFNDEF	TAB	<TAB=	0>	/SET TO 1 IF TTY HAS HARDWARE TABS
	IFNDEF	OLDTTY	<OLDTTY=0>	/SET TO 1 TO GET OLD VERSION 1 TTY TASK
	IFNDEF	LSTBOT	<LSTBOT=0>	/SET TO 1 TO LIST BOTH VERSIONS
	CUR=TTFLD

	IFZERO	TTDEV&100	<

KSFX=	KBDEV^10+6001
KRBX=	KBDEV^10+6006

TSFX=	TTDEV^10+6001
TCFX=	TTDEV^10+6002
TSKX=	TTDEV^10+6005	/PDP 8/E ONLY
TLSX=	TTDEV^10+6006
	>

	IFNZRO TTDEV&100 <
	IFNDEF	KL8ADV	<KL8ADV= 40>	/DEFINE KL8A IO CODE
	KLNUM=TTDEV&77%4		/KL8A NUMBER
	IFNZRO KL8A-KLNUM&4000 <KL8LIN,ERROR_>	/MUST BE .LE. 'KL8A'
	KLNUM=KLNUM^2			/DEVICE CODES COME IN PAIRS
TLSX=	KL8ADV+KLNUM^10+6004
	>
/THE RTS-8 TELETYPE DRIVER PRINTS AND INPUTS LINES OR CHARACTER
/STRINGS ON A TELETYPE. THE INPUT AND OUTPUT DEVICE CODES OF
/THE TELETYPE ARE SPECIFIED (RESPECIVELY) BY THE PARAMETERS
/"KBDEV" AND "TTDEV".  IF THE PARAMETER "CONSOL" IS NOT DEFINED TO
/BE ZERO, THE TELETYPE IS ASSUMED TO BE THE CONSOLE TELETYPE
/AND WILL INVOKE THE MCR WHENEVER ^C IS TYPED ON IT.

/THE FORMAT OF TTY DRIVER MESSAGES ARE:

/WORD 1		USED AS EVENT FLAG FOR MESSAGE
/WORDS 2-3	USED BY RTS-8
/WORD 4		FLAGS WORD - FLAGS ARE:
/	BIT 0	0=PACKED OUTPUT MESSAGE, 1=UNPACKED
/	BIT 1	0=PUT CRLF AFTER MESSAGE, 1=DO NOT
/	BIT 2	0=OUTPUT MESSAGE BEGINS AT WORD 6, 1= OUTPUT MESSAGE
/		  POINTED TO BY WORD 6
/	BIT 3   0=INPUT IS LINE ORIENTED, WITH EDITING
/		1=INPUT IS COUNT ORIENTED W/O EDITING OR ECHOING
/	BIT 4	0=PERFORM I/O INDICATED BY OTHER BITS
/		1=ASSIGN TTY DRIVER TO TASK IN BITS 5-11
/    BITS 5-11	MAX # CHARS IN INPUT BUFFER (0 MEANS 4096)
/		OR TASK TO ASSIGN DRIVER TO (IF BIT 4=1)
/WORD 5		IF ZERO, NO INPUT - ELSE POINTS AT INPUT BUFFER
/WORD 6		OUTPUT MESSAGE OR POINTER TO MESSAGE

/IF TTDEV OR KBDEV HAS FORM 100+LINE, THEN THIS
/INDICATES THAT LINE OF KL8A IS TO BE USED.
	XLIST	1-LSTBOT
	IFZERO OLDTTY <
	XLIST	0

	FIELD CUR%10
	*TTLOC

START,	IFZERO TTDEV&100 <
MEVFLG,	CAL
FLAGS,	SKPINS
HALF,	TTINT
	IFZERO	PDP8E	<	/ONLY NEED 1 SKIP CHAIN ENTRY ON 8/E
	CAL
	SKPINS
	KBINT
	>
	>
	IFNZRO TTDEV&100 <
MEVFLG,	CIF 0		/CONNECT ROUTINE IN FIELD 0
FLAGS,	IOF
HALF,	TAD	(TTDEV&77^4	/GET KL8A LINE # INTO AC
	JMS I	(KL8ACT	/CONNECT TO KL8A LINE
	KBINT		/KEYBOARD INT ADR
	TTINT		/PRINTER INT ADR
	>
	IFDEF	PWRF	<
REPLYY,	CAL
SAVM,	SENDW
	PWRF		/SEND DERAIL ADDRESS TO POWER FAIL TASK
	PWMSG
	>
TTMSLP,	TAD	ASGNEE	/GET ASIGNEE (IF ANY)
	CAL
	RECEIV		/TAKE THE MESSAGE OFF THE Q
MADDR,	0		/GETS ADDRESS OF MESSAGE
	DCA	MSGCDF	/FIELD OF MSG IN AC
	AC7775
	TAD	MADDR
	DCA	MEVFLG	/SAVE MESSAGE EVENT FLAG ADDRESS
	JMS	CDFMSG
	TAD I	MADDR
	DCA	FLAGS	/FIRST WORD OF MESSAGE IS FLAGS
	ISZ	MADDR
	TAD I	MADDR
	DCA	REPLYY	/2D WORD OF MESSAGE IS ADDRESS FOR
	ISZ	MADDR	/REPLY FROM KBD (0 IF NONE WANTED)
	TAD	FLAGS
	AND	(200
	SZA CLA		/IS THIS AN ASSIGN CALL?
	JMP	ASSIGN	/YES - JUST ASSIGN TTY TO SENDER
	TAD	FLAGS
	RTL
	SMA CLA		/BIT 1000 OF FLAG WORD INDICATES
	JMP	.+3	/IF MESSAGE OR POINTER TO IT FOLLOWS
	TAD I	MADDR
	DCA	MADDR
CTRLU2,	TAD	MADDR
	DCA	SAVM
	STA
	DCA	HALF	/INITIALIZE LEFT/RIGHT SWITCH
/LOOP TO UNPACK AND OUTPUT MESSAGE

TTOLP,	JMS	CDFMSG
	TAD	FLAGS
	SPA CLA		/BIT 0 IF FLAG WD TELLS WHETHER
	JMP	ONEPWD	/MESSAGE IS PACKED OR UNPACKED ASCII
	ISZ	HALF	/PACKED - WHICH HALF?
	JMP	RGHTHF
	AC7776
	DCA	HALF
	TAD I	SAVM
	CLL RTR
	RTR
	RTR
	JMP	.+3
RGHTHF,	TAD I	SAVM
	ISZ	SAVM
	AND	(77
	SNA
	JMP	CKCRLF
	TAD	(240	/CONVERT SIXBIT TO ASCII
	AND	(77
	TAD	(240
OUTCH,	JMS I	(TTOUTR
	JMP	TTOLP

ONEPWD,	TAD I	SAVM
	ISZ	SAVM
	SZA
	JMP	OUTCH
CKCRLF,	TAD	FLAGS
	RAL		/BIT 1 OF FLAGS TELLS WHETHER
	SMA CLA		/TO FOLLOW MESSAGE BY A CR/LF
CTRLU,	JMS I	(CRLF
	TAD	REPLYY
	SZA		/IS THERE INPUT REQUIRED?
	JMP I	(EOMESS	/YES - GO GET IT
EORPLY,	CDF CUR		/HERE IF NO INPUT OR IF INPUT FINISHED
	TAD	MSGCDF
	DCA	MF
	TAD	MEVFLG
	CAL		/POST THE SENDER'S EVENT FLAG
	POST		/SO HE'LL KNOW HE GOT HIS INPUT
MF,	0
	JMP	TTMSLP	/NNNNNNNNNNNNNNNNNNNEXT!

ASSIGN,	TAD	FLAGS
	AND	(77	/GET TASK NUMBER
	DCA	ASGNEE	/SAVE AS ASSIGNED TASK
	JMP	EORPLY

ASGNEE,	0		/TASK ASSIGNMENT - 0 MEANS UNASSIGNED
	IFNDEF	PWRF	<
REPLYY,	0		/ADDRESS OF REPLY BUFFER (IF ANY)
SAVM,	0
	>
/LOW-LEVEL TTY OUTPUT CODE

TTOUT,	0
	AND	(177	/STRIP OFF PARITY AND CRAP FOR KL8A
	DCA	CDFMSG
	CDF CUR
	TAD I	(INCH	/GET THE LAST CHAR TYPED ON THE KEYBOARD
	AND	(177	/STRIP OFF PARITY
	TAD	(-17	/WAS IT ^O?
	SNA CLA
	JMP I	TTOUT	/YES - DON'T PRINT NOTHIN
	IFNZRO VT50<
	CAL
	WAITE		/WAIT FOR XON
	XOFF
	>
	CAL
	WAITE		/WAIT FOR LAST CHAR TO FINISH
PTTOEV,	TTOEV
	ISZ	TTOEV	/SET TTY BUSY  (IN ADVANCE)
	IFNZRO	TTDEV&100	<TAD	(TTDEV&77^400 >	/ADD LINE #
	TAD	CDFMSG	/GET CHAR
	TLSX		/OUT WITH IT!
	CLA		/CL(E)A(N) UP
	JMP I	TTOUT

TTINT,	IFZERO TTDEV&100 <
	ZBLOCK	2	/USED FOR LINKING INTO SKIP CHAIN
	IFZERO	PDP8E	<TSFX>
	IFNZRO	PDP8E	<TSKX>	/CHECK FOR KEYBOARD OR PRINTER
	JMP I	TTINT
	CDF CIF CUR
	IFNZRO	PDP8E	<
	TSFX		/WHICH ONE?
	JMP I	(KBINT	/KEYBOARD
	>
	>
	CIF 0
	IFZERO	TTDEV&100	<TCFX>
	TAD	PTTOEV
	POSTDS		/POST "TTY COMPLETE" EVENT FLAG

TTOEV,	0

CDFMSG,	0
MSGCDF,	HLT
	JMP I	CDFMSG
	PAGE
/INPUT REPLY FROM KEYBOARD

EOMESS,	DCA	REPLY	/SAVE REPLY BUFFER POINTER IN THIS PAGE
	CDF CUR
	TAD I	(FLAGS
	AND	(177	/GET LOW ORDER BITS OF FLAG WORD
	CIA
RPLYL1,	DCA	INPCNT	/SET INPUT CHAR COUNT
RPLYLP,	CAL
	WAITE
	TTIEV		/WAIT FOR KEYBOARD STRIKE
	ISZ I	(TTIEV	/IMMEDIATELY SET EVENT FLAG AGAIN
	TAD I	(FLAGS
	JMS I	(CDFMSG
	AND	(400	/ARE WE EDITING INPUT?
	SZA CLA
	JMP	NOEDIT	/NO - JUST TAKE IT AS IT COMES
	TAD	INCH
	AND	(177	/STRIP PARITY BIT
	TAD	(200	/NOW FORCE IT BACK IN
	DCA I	REPLY	/SAVE CHAR IN REPLY MESSAGE
	TAD I	REPLY
	AND	(177	/AND OUT GOES THE PARITY BIT (AGAIN)
	SZA
	TAD	(-17	/IGNORE NULL AND ^O
	SNA
	JMP	RPLYLP
	TAD	(17-176
	SMA SZA
	JMP	RUBOUT	/X - 176  GT 0 -  X MUST BE 177
	SZA
	IAC
	SZA
	TAD	(175-33	/CHECK FOR 3 FLAVORS OF ALTMODE
	SNA
	JMP	ALTMOD	/ALT MODE IS SPECIAL END-OF-LINE DELIMITER
	TAD	(33-15
	SNA		/IS THE CHAR A CARRIAGE RETURN?
	JMP	CARRET
	CDF CUR
	TAD	(15-25
	SNA CLA		/^U?
	JMP	CTU	/YES
	ISZ	INPCNT	/IS THERE ROOM IN THE BUFFER?
	JMP	.+3	/YES
	STA
	JMP	RPLYL1	/NO - KEEP IT FULL
	JMS I	(CDFMSG
	TAD I	REPLY	/GET THE CHAR
	JMS I	(TTOUTR	/ECHO IT
NEXTCH,	ISZ	REPLY	/BUMP POINTER
	JMP	RPLYLP	/CONTINUE

INPCNT,	0
/SPECIAL CHARACTER PROCESSING

RUBOUT,	CDF CUR
	TAD I	(REPLYY	/AC=1 ON ENTRY!
	CIA
	TAD	REPLY	/ARE WE AT THE BEGINNING
	SPA CLA		/OF THE REPLY LINE?
	JMP	RPLYLP	/YES
	IFZERO SCOPE <
	TAD	(334
	JMS I	(TTOUTR	/OUTPUT A BACKSLASH
	>
	IFNZRO SCOPE <
	JMS I	(BACK	/DO BACKUP
	>
	STA
	TAD	REPLY
	DCA	REPLY	/BUMP THE POINTER BACK ONE
	STA
	TAD	INPCNT	/REMEMBER TO INCREASE THE COUNT!
	JMP	RPLYL1

ALTMOD,	TAD	(44
	JMS I	(TTOUTR	/ECHO ALT MODE AS $
	STA		/PUT SPECIAL DELIMITER IN MESSAGE
	JMS I	(CDFMSG

CARRET,	DCA I	REPLY	/SET THE LAST CHAR IN THE MESSAGE
	JMS I	(CRLF
	JMP I	(EORPLY

NOEDIT,	TAD	INCH
	DCA I	REPLY	/NO PARITY, NO EDITING, NO ECHOING
	ISZ	INPCNT	/IF CONSOL=0, THIS MODE CAN
	JMP	NEXTCH	/BE USED TO READ BINARY PAPER TAPES
	JMP I	(EORPLY
	IFNDEF	PWRF	<
REPLY,	0
INCH,	0
	>

CTU,	TAD	("^
	JMS I	(TTOUTR	/TYPE "^U"
	TAD	("U
	JMS I	(TTOUTR
	TAD I	(FLAGS	/IF BIT 1 IS ON, WANT TO REPROMPT
	CLL RTL
	SNL CLA
	JMP I	(CTRLU
	JMS I	(CRLF
	JMP I	(CTRLU2

	IFDEF	PWRF	<
PWMSG,	0
REPLY,	0
INCH,	0		/INPUT CHARACTER
DRLADR,	.		/DERAIL ADDRESS
	DCA	PWMSG	/SAVE TASK AC
	DCA	INCH	/DESTROY INPUT CHARACTER
	IFNZRO	TTDEV&100	<TAD (TTDEV&77^400>
	TLSX
	CLA
	TAD	PWMSG	/RESTORE AC
	JMP I	DRLADR	/RETURNTO MAINLINE
	>
	PAGE
/KEYBOARD INPUT INTERRUPT ROUTINE AND STORAGE

KBINT,	IFZERO	TTDEV&100	<
	IFZERO	PDP8E	<
	ZBLOCK	2	/FOR LINKING INTO SKIP CHAIN
	KSFX
	JMP I	KBINT
	CDF CIF CUR
	>
	KRBX		/READ CHARACTER AND CLEAR FLAG
	>
	AND	(377	/KILL ERROR BITS AND KL8A LINE #
	DCA I	(INCH
	IFZERO VT50 <
	IFNZRO	CONSOL	<
	TAD I	(INCH
	AND	(177
	TAD	(-3
	SNA CLA		/CHECK FOR ^C TYPED
	JMP	GETMCR	/YES - SET "MCR REQUESTED" EVENT FLAG
	>
	>
	IFNZRO VT50 <
	TAD I	(INCH
	AND	(177
	IFNZRO CONSOL <
	TAD	(-3
	SNA		/CHECK FOR ^C
	JMP	GETMCR	/REQUEST MCR ON CTRL/C
	TAD	(3-23	/NOW CHECK FOR CTRL/S
	>
	IFZERO CONSOL <
	TAD	(-23
	>
	SNA
	JMP	CTRLS	/^S TYPED (XOFF)
	TAD	(23-21
	SNA CLA
	JMP	CTRLQ	/^Q TYPED (XON)
	>
	CIF 0
	TAD	(TTIEV
	POSTDS		/POST "KEY STRUCK" EVENT FLAG
	IFNZRO VT50 <
XOFF,	0		/0 MEANS CAN PRINT
			/1 MEANS PRINT INHIBITED DUE TO ^S

CTRLS,	CIF 0
	TAD	XOFF
	SNA		/SET XOFF TO 1 ONLY IF 0
	CLA IAC
	DCA	XOFF	/INHIBIT PRINTING
	POSTDS		/DISMISS, NO FLAGS POSTED

CTRLQ,	TAD	TTIEV
	SNA CLA
	ISZ	TTIEV
	CIF 0
	TAD	(XOFF
	POSTDS		/POST RESUME TYPING EVENT FLAG
	>
	IFNZRO	CONSOL	<
GETMCR,	TAD	TTIEV	/^C WILL DELETE ANYTHING WHICH
	SNA CLA		/IS CURRENTLY IN THE TTY BUFFER
	ISZ	TTIEV	/BY SETTING THE EVENT FLAG NON-ZERO
	CDF CIF 0	/THE MCR IS STARTED UP (IF QUIESCENT) BY
	TAD	(MCREF	/POSTING THE MCR EVENT FLAG IN PAGE 0
	POSTDS		/OF FIELD 0.
	>

TTIEV,	1		/KEYBOARD NOT STRUCK INITIALLY

	IFNZRO SCOPE <
BACK,	0
	TAD	(10	/BACKSPACE
	JMS I	(TTOUT
	TAD	(240	/PRINT SPACE
	JMS I	(TTOUT
	TAD	(10	/BACKSPACE AGAIN
	JMS I 	(TTOUT
	STA
	TAD	COLCNT
	SMA		/CAN'T RUBOUT PAST COLUMN 1
	DCA	COLCNT	/MOVE BACK ONE COLUMN
	CLA		/CLEAR AC
	JMP I	BACK	/RETURN
	>

CRLF,	0
	TAD	(215
	JMS I	(TTOUT
	TAD	(212
	JMS I	(TTOUT
	IFZERO FILL-1&4000 <JMS I (TTOUT>
	IFZERO FILL-2&4000 <JMS I (TTOUT>
	IFZERO FILL-3&4000 <JMS I (TTOUT>
	IFZERO FILL-4&4000 <JMS I (TTOUT>
	IFZERO FILL-5&4000 <JMS I (TTOUT>
	DCA	COLCNT
	JMP I	CRLF
TTOUTR,	0
	DCA	TEM	/SAVE CHAR
	TAD	TEM
	AND	(177	/7-BIT
	TAD	(-15	/IS IT CR?
	SNA
	JMP	ITSCR	/IT'S A CR
	TAD	(15-11
	SNA CLA		/IS IT A TAB?
	JMP	TABB	/YES
DOO,	ISZ	COLCNT	/AT END OF COLUMN?
SND,	IFNZRO	WIDTH	<
	TAD	COLCNT
	CLL
	TAD	WITH
	SZL		/AT LAST COLUMN? (DON'T CLEAR AC)
	JMS	NEWL	/YES, DO EXTRA CR/LF
	>
	CLA		/NOTE: THIS CLA COULD BE SKIPPED
			/AFTER 4096 INCREMENTS OF COLCNT

	TAD	TEM	/NO
	JMS I	(TTOUT	/ACTUALLY TYPE CHARACTER
	JMP I	TTOUTR	/RETURN
ITSCR,	DCA	COLCNT
	JMP	DOO

COLCNT,	0
WITH,	-WIDTH-1
TEM,	0

NEWL,	0
	DCA	XTRA
	JMS I	(CRLF
	TAD	XTRA
	SZA CLA
	TAD	L7	/IF LAST CHAR WAS TAB
	IAC		/SET INIT COL TO 10; OTHERWISE 1
	DCA	COLCNT
	JMP I	NEWL

XTRA,	0
	IFNZRO TAB <
TABB,	TAD	COLCNT
	AND	(7770
	TAD	(10
	DCA	COLCNT	/GO TO NEXT TAB STOP
	JMP	SND

L7,	7
	>

	IFZERO TAB <
TABB,	ISZ	COLCNT
L7,	7		/JUST IN CASE IT SKIPS
	IFNZRO WIDTH <
	TAD	COLCNT
	TAD	WITH
	SNA CLA
	JMP	EO
	>
	TAD	(" 
	JMS I	(TTOUT	/SIMULATE WITH SPACES
	TAD	COLCNT
	AND	L7
	SZA CLA		/UNTIL THE NEXT TAB STOP
	JMP	TABB
	JMP I	TTOUTR
EO,	JMS I	(CRLF
	JMP I	TTOUTR
	>
	PAGE

>
	XLIST	1-LSTBOT
	IFNZRO OLDTTY <
	XLIST	0

	FIELD CUR%10
	*TTLOC

START,	IFZERO	TTDEV&100	<
MEVFLG,	CAL
FLAGS,	SKPINS
HALF,	TTINT
	IFZERO	PDP8E	<	/ONLY NEED 1 SKIP CHAIN ENTRY ON 8/E
	CAL
	SKPINS
	KBINT
	>
	>
	IFNZRO	TTDEV&100	<
MEVFLG,	CIF 0		/CONNECT ROUTINE IN FIELD 0
FLAGS,	IOF
HALF,	TAD	(TTDEV&77^4	/GET KL8A LINE # IINTO AC
	JMS I	(KL8ACT	/CONNECT TO KL8A LINE
	KBINT		/KEYBOARD INT ADR
	TTINT		/PRINTER INT ADR
	>
TTMSLP,	TAD	ASGNEE	/GET ASIGNEE (IF ANY)
	CAL
	RECEIV		/TAKE THE MESSAGE OFF THE Q
MADDR,	0		/GETS ADDRESS OF MESSAGE
	DCA	MSGCDF	/FIELD OF MSG IN AC
	AC7775
	TAD	MADDR
	DCA	MEVFLG	/SAVE MESSAGE EVENT FLAG ADDRESS
	JMS	CDFMSG
	TAD I	MADDR
	DCA	FLAGS	/FIRST WORD OF MESSAGE IS FLAGS
	ISZ	MADDR
	TAD I	MADDR
	DCA	REPLYY	/2D WORD OF MESSAGE IS ADDRESS FOR
	ISZ	MADDR	/REPLY FROM KBD (0 IF NONE WANTED)
	TAD	FLAGS
	AND	(200
	SZA CLA		/IS THIS AN ASSIGN CALL?
	JMP	ASSIGN	/YES - JUST ASSIGN TTY TO SENDER
	TAD	FLAGS
	RTL
	SMA CLA		/BIT 1000 OF FLAG WORD INDICATES
	JMP	.+3	/IF MESSAGE OR POINTER TO IT FOLLOWS
	TAD I	MADDR
	DCA	MADDR
	STA
	DCA	HALF	/INITIALIZE LEFT/RIGHT SWITCH
/LOOP TO UNPACK AND OUTPUT MESSAGE

TTOLP,	JMS	CDFMSG
	TAD	FLAGS
	SPA CLA		/BIT 0 IF FLAG WD TELLS WHETHER
	JMP	ONEPWD	/MESSAGE IS PACKED OR UNPACKED ASCII
	ISZ	HALF	/PACKED - WHICH HALF?
	JMP	RGHTHF
	AC7776
	DCA	HALF
	TAD I	MADDR
	CLL RTR
	RTR
	RTR
	JMP	.+3
RGHTHF,	TAD I	MADDR
	ISZ	MADDR
	AND	(77
	SNA
	JMP	CKCRLF
	TAD	(240	/CONVERT SIXBIT TO ASCII
	AND	(77
	TAD	(240
OUTCH,	JMS	TTOUT
	JMP	TTOLP

ONEPWD,	TAD I	MADDR
	ISZ	MADDR
	SZA
	JMP	OUTCH
CKCRLF,	TAD	FLAGS
	RAL		/BIT 1 OF FLAGS TELLS WHETHER
	SMA CLA		/TO FOLLOW MESSAGE BY A CR/LF
CTRLU,	JMS	CRLF
	TAD	REPLYY
	SZA		/IS THERE INPUT REQUIRED?
	JMP I	(EOMESS	/YES - GO GET IT
EORPLY,	CDF CUR		/HERE IF NO INPUT OR IF INPUT FINISHED
	TAD	MSGCDF
	DCA	MF
	TAD	MEVFLG
	CAL		/POST THE SENDER'S EVENT FLAG
	POST		/SO HE'LL KNOW HE GOT HIS INPUT
MF,	0
	JMP	TTMSLP	/NNNNNNNNNNNNNNNNNNNEXT!

ASSIGN,	TAD	FLAGS
	AND	(77	/GET TASK NUMBER
	DCA	ASGNEE	/SAVE AS ASSIGNED TASK
	JMP	EORPLY

ASGNEE,	0		/TASK ASSIGNMENT - 0 MEANS UNASSIGNED
REPLYY,	0		/ADDRESS OF REPLY BUFFER (IF ANY)
/LOW-LEVEL TTY OUTPUT CODE

TTOUT,	0
	AND	(177	/STRIP OFF PARITY AND CRAP FOR KL8A
	DCA	CDFMSG
	CDF CUR
	TAD I	(INCH	/GET THE LAST CHAR TYPED ON THE KEYBOARD
	AND	(177	/STRIP OFF PARITY
	TAD	(-17	/WAS IT ^O?
	SNA CLA
	JMP I	TTOUT	/YES - DON'T PRINT NOTHIN
	CAL
	WAITE		/WAIT FOR LAST CHAR TO FINISH
PTTOEV,	TTOEV
	ISZ	TTOEV	/SET TTY BUSY  (IN ADVANCE)
	TAD	CDFMSG	/GET CHAR
	IFNZRO	TTDEV&100	<TAD	(TTDEV&77^400 >	/ADD IN LINE #
	TLSX		/OUT WITH IT!
	CLA		/CL(E)A(N) UP
	JMP I	TTOUT

CRLF,	0
	TAD	(215
	JMS	TTOUT
	TAD	(212
	JMS	TTOUT
	JMP I	CRLF

TTINT,	IFZERO	TTDEV&100	<
	ZBLOCK	2	/USED FOR LINKING INTO SKIP CHAIN
	IFZERO	PDP8E	<TSFX>
	IFNZRO	PDP8E	<TSKX>	/CHECK FOR KEYBOARD OR PRINTER
	JMP I	TTINT
	CDF CIF CUR
	IFNZRO	PDP8E	<
	TSFX		/WHICH ONE?
	JMP I	(KBINT	/KEYBOARD
	>
	>
	CIF 0
	IFZERO	TTDEV&100	<TCFX>
	TAD	PTTOEV
	POSTDS		/POST "TTY COMPLETE" EVENT FLAG

TTOEV,	0

CDFMSG,	0
MSGCDF,	HLT
	JMP I	CDFMSG
	PAGE
/INPUT REPLY FROM KEYBOARD

EOMESS,	DCA	REPLY	/SAVE REPLY BUFFER POINTER IN THIS PAGE
	CDF CUR
	TAD I	(FLAGS
	AND	(177	/GET LOW ORDER BITS OF FLAG WORD
	CIA
RPLYL1,	DCA	INPCNT	/SET INPUT CHAR COUNT
RPLYLP,	CAL
	WAITE
PTTIEV,	TTIEV		/WAIT FOR KEYBOARD STRIKE
	ISZ	TTIEV	/IMMEDIATELY SET EVENT FLAG AGAIN
	TAD I	(FLAGS
	JMS I	(CDFMSG
	AND	(400	/ARE WE EDITING INPUT?
	SZA CLA
	JMP	NOEDIT	/NO - JUST TAKE IT AS IT COMES
	TAD	INCH
	AND	(177	/STRIP PARITY BIT
	TAD	(200	/NOW FORCE IT BACK IN
	DCA I	REPLY	/SAVE CHAR IN REPLY MESSAGE
	TAD I	REPLY
	AND	(177	/AND OUT GOES THE PARITY BIT (AGAIN)
	SZA
	TAD	(-17	/IGNORE NULL AND ^O
	SNA
	JMP	RPLYLP
	TAD	(17-176
	SMA SZA
	JMP	RUBOUT	/X - 176  GT 0 -  X MUST BE 177
	SZA
	IAC
	SZA
	TAD	(175-33	/CHECK FOR 3 FLAVORS OF ALTMODE
	SNA
	JMP	ALTMOD	/ALT MODE IS SPECIAL END-OF-LINE DELIMITER
	TAD	(33-15
	SNA		/IS THE CHAR A CARRIAGE RETURN?
	JMP	CARRET
	CDF CUR
	TAD	(15-25
	SNA CLA		/^U?
	JMP I	(CTRLU	/YES
	ISZ	INPCNT	/IS THERE ROOM IN THE BUFFER?
	JMP	.+3	/YES
	STA
	JMP	RPLYL1	/NO - KEEP IT FULL
	JMS I	(CDFMSG
	TAD I	REPLY	/GET THE CHAR
	JMS I	(TTOUT	/ECHO IT
NEXTCH,	ISZ	REPLY	/BUMP POINTER
	JMP	RPLYLP	/CONTINUE

INPCNT,	0
/SPECIAL CHARACTER PROCESSING

RUBOUT,	CDF CUR
	TAD I	(REPLYY	/AC=1 ON ENTRY!
	CIA
	TAD	REPLY	/ARE WE AT THE BEGINNING
	SPA CLA		/OF THE REPLY LINE?
	JMP	RPLYLP	/YES
	TAD	(334
	JMS I	(TTOUT	/OUTPUT A BACKSLASH
	STA
	TAD	REPLY
	DCA	REPLY	/BUMP THE POINTER BACK ONE
	STA
	TAD	INPCNT	/REMEMBER TO INCREASE THE COUNT!
	JMP	RPLYL1

ALTMOD,	TAD	(44
	JMS I	(TTOUT	/ECHO ALT MODE AS $
	STA		/PUT SPECIAL DELIMITER IN MESSAGE
	JMS I	(CDFMSG

CARRET,	DCA I	REPLY	/SET THE LAST CHAR IN THE MESSAGE
	JMS I	(CRLF
	JMP I	(EORPLY

NOEDIT,	TAD	INCH
	DCA I	REPLY	/NO PARITY, NO EDITING, NO ECHOING
	ISZ	INPCNT	/IF CONSOL=0, THIS MODE CAN
	JMP	NEXTCH	/BE USED TO READ BINARY PAPER TAPES
	JMP I	(EORPLY
/KEYBOARD INPUT INTERRUPT ROUTINE AND STORAGE

KBINT,	IFZERO	TTDEV&100	<
	IFZERO	PDP8E	<
	ZBLOCK	2	/FOR LINKING INTO SKIP CHAIN
	KSFX
	JMP I	KBINT
	CDF CIF CUR
	>
	KRBX		/READ CHARACTER AND CLEAR FLAG
	>
	AND	(377	/CLEAR ERROR BITS AND KL8A LINE #
	DCA	INCH
	IFNZRO	CONSOL	<
	TAD	INCH
	AND	(177
	TAD	(-3
	SNA CLA		/CHECK FOR ^C TYPED
	JMP	GETMCR	/YES - SET "MCR REQUESTED" EVENT FLAG
	>
	CIF 0
	TAD	PTTIEV
	POSTDS		/POST "KEY STRUCK" EVENT FLAG

	IFNZRO	CONSOL	<
GETMCR,	TAD	TTIEV	/^C WILL DELETE ANYTHING WHICH
	SNA CLA		/IS CURRENTLY IN THE TTY BUFFER
	ISZ	TTIEV	/BY SETTING THE EVENT FLAG NON-ZERO
	CDF CIF 0	/THE MCR IS STARTED UP (IF QUIESCENT) BY
	TAD	(MCREF	/POSTING THE MCR EVENT FLAG IN PAGE 0
	POSTDS		/OF FIELD 0.
	>

REPLY,	0
INCH,	0
TTIEV,	1		/KEYBOARD NOT STRUCK INITIALLY
	PAGE

>

	XLIST	0
	$$$