File: TTY.PA of Tape: Sources/RTS/dec-s8-ortsa-b-uc
(Source file text) 

/3 TTY DRIVER TASK FOR RTS8 V2			4-AUG-75
/
/
/
/
/
/
/
/
/
/COPYRIGHT  (C)  1975 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.
/
/
/
/
/
/
/
/
/
/
/	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

/TASK DATA BLOCK:

CUR=	0
INIWT=	0
	IFNDEF	KBDEV	<
KBDEV=	03
TTDEV=	04
	>
	IFNDEF	CONSOL	<CONSOL=1>	/DEFAULT IS CONSOLE
	IFNZRO	CONSOL	<TASK=	TTY>
	IFNDEF	TASK	<TASK=	10>	/A GOOD NUMBER FOR TESTING
	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

KSFX=	KBDEV^10+6001
KCCX=	KBDEV^10+6002
KRSX=	KBDEV^10+6004
KRBX=	KBDEV^10+6006

TSFX=	TTDEV^10+6001
TCFX=	TTDEV^10+6002
TSKX=	TTDEV^10+6005	/PDP 8/E ONLY
TLSX=	TTDEV^10+6006
/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
	IFZERO OLDTTY <

	FIELD CUR%10
	*3400
MEVFLG,
START,	CAL
FLAGS,	SKPINS
HALF,	TTINT
	IFZERO	PDP8E	<	/ONLY NEED 1 SKIP CHAIN ENTRY ON 8/E
	CAL
	SKPINS
	KBINT
	>
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
REPLYY,	0		/ADDRESS OF REPLY BUFFER (IF ANY)
SAVM,	0
/LOW-LEVEL TTY OUTPUT CODE

TTOUT,	0
	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)
	TAD	CDFMSG	/GET CHAR
	TLSX		/OUT WITH IT!
	CLA		/CL(E)A(N) UP
	JMP I	TTOUT

TTINT,	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
	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
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
	PAGE
/KEYBOARD INPUT INTERRUPT ROUTINE AND STORAGE

KBINT,	IFZERO	PDP8E	<
	ZBLOCK	2	/FOR LINKING INTO SKIP CHAIN
	KSFX
	JMP I	KBINT
	CDF CIF CUR
	>
	KRBX		/READ CHARACTER AND CLEAR FLAG
	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,	CLA IAC
	DCA	XOFF	/INHIBIT PRINTING
	CIF 0
	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,	TAD	COLCNT
	CLL
	TAD	WITH
	SZL		/AT LAST COLUMN? (DON'T CLEAR AC)
	JMS	NEWL	/YES, DO EXTRA CR/LF
	CLA
	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	(7	/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
	>

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

>
	IFNZRO OLDTTY <

	FIELD CUR%10
	*3000
MEVFLG,
START,	CAL
FLAGS,	SKPINS
HALF,	TTINT
	IFZERO	PDP8E	<	/ONLY NEED 1 SKIP CHAIN ENTRY ON 8/E
	CAL
	SKPINS
	KBINT
	>
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
	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
	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,	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
	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	PDP8E	<
	ZBLOCK	2	/FOR LINKING INTO SKIP CHAIN
	KSFX
	JMP I	KBINT
	CDF CIF CUR
	>
	KRBX		/READ CHARACTER AND CLEAR FLAG
	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

>

	$$$