Google
 

Trailing-Edge - PDP-10 Archives - BB-Y393Q-SM - monitor-sources/ttfedv.mac
There are 21 other files named ttfedv.mac in the archive. Click here to see a list.
; UPD ID= 258, FARK:<4-1-WORKING-SOURCES.MONITOR>TTFEDV.MAC.3,   9-Dec-82 16:11:10 by MOSER
;EDIT 2875 - USE .DFBKW TO DO XON/XOFF
; UPD ID= 48, FARK:<4-1-WORKING-SOURCES.MONITOR>TTFEDV.MAC.2,   3-Apr-82 19:13:17 by ZIMA
;Edit 2607 - add ENDAV.s to ACVARs to use v5 MACSYM.
;<4-1-FIELD-IMAGE.MONITOR>TTFEDV.MAC.2, 25-Feb-82 20:50:59, EDIT BY DONAHUE
;UPDATE COPYRIGHT DATE
;<4.MONITOR>TTFEDV.MAC.52,  3-Jan-80 08:10:39, EDIT BY R.ACE
;UPDATE COPYRIGHT DATE
;<4.MONITOR>TTFEDV.MAC.51,  1-Nov-79 17:15:09, EDIT BY MILLER
;<4.MONITOR>TTFEDV.MAC.50,  1-Nov-79 15:54:35, EDIT BY MILLER
;<4.MONITOR>TTFEDV.MAC.49,  1-Nov-79 10:01:55, EDIT BY MILLER
;<4.MONITOR>TTFEDV.MAC.48, 31-Oct-79 16:37:25, EDIT BY MILLER
;<4.MONITOR>TTFEDV.MAC.47, 31-Oct-79 16:13:10, EDIT BY MILLER
;FLUSH ALL DTE Q REQUESTS WHEN DYNAMIC DATA IS DEASSIGNED
;<4.MONITOR>TTFEDV.MAC.46, 31-Oct-79 13:08:36, EDIT BY ENGEL
;ADD MORE DISPATCH VECTOR NAMES TO TTFEVT
;<4.MONITOR>TTFEDV.MAC.45, 31-Oct-79 12:46:44, EDIT BY MILLER
;FIX HANDLING OF TTFPK. MAKE STRIO CONDITIONAL ON VALUE OF TTFPK.
;<4.MONITOR>TTFEDV.MAC.44, 31-Oct-79 10:20:25, EDIT BY ENGEL
;ADD DISPATCH VECTOR NAMES TO TTFEVT
;<4.MONITOR>TTFEDV.MAC.43, 30-Oct-79 17:26:31, EDIT BY MILLER
;CHECK AT TTYINT FOR TTOCT GOING NEGATIVE. IF SO, ASSUME CFOBF
; HAS JUST BEEN DONE AND DON'T UPDATE THE COUNT
;<4.MONITOR>TTFEDV.MAC.42, 24-Oct-79 16:14:15, EDIT BY MURPHY
;FASTER WAKEUP ON OUTPUT EVENTS
;<4.MONITOR>TTFEDV.MAC.41, 10-Oct-79 13:48:26, EDIT BY MURPHY
;FIX PROBLEMS WITH XOFF/XON
;<4.MONITOR>TTFEDV.MAC.38, 19-Sep-79 14:51:29, EDIT BY MURPHY
;CHANGE VECTOR OFFSET NAMES
;<OSMAN.MON>TTFEDV.MAC.1, 10-Sep-79 16:13:38, EDIT BY OSMAN
;TCO 4.2412 - Move definition of BUGHLTs, BUGCHKs, and BUGINFs to BUGS.MAC
;<4.MONITOR>TTFEDV.MAC.36,  3-Jul-79 13:19:52, Edit by MCLEAN
;MAKE CALL IN BIGST1 DO CALL TTQAD1 INSTEAD OF TTQAD
;<4.MONITOR>TTFEDV.MAC.35, 12-Jun-79 14:25:27, Edit by MCLEAN
;<4.MONITOR>TTFEDV.MAC.34, 12-Jun-79 11:26:33, Edit by MCLEAN
;DO XON/XOFF STATE BEFORE SETTING SPEED
;<4.MONITOR>TTFEDV.MAC.33, 15-May-79 12:47:25, Edit by MCLEAN
;MORE FIXES FOR LINE XOFF WHEN NOT ACTIVE
;<4.MONITOR>TTFEDV.MAC.32, 15-May-79 10:13:37, Edit by MCLEAN
;<4.MONITOR>TTFEDV.MAC.31, 15-May-79 09:39:06, Edit by MCLEAN
;REMOVE SPEED CODE FROM SNDXN2
;<4.MONITOR>TTFEDV.MAC.30, 13-May-79 21:51:14, Edit by MCLEAN
;GET CORRECT HALF WORD FOR TTSPWD FOR XOFF
;<4.MONITOR>TTFEDV.MAC.29, 30-Apr-79 22:57:07, Edit by MCLEAN
;STOP LINES THAT GET 2 CHARACTERS IN INPUT BUFFER BEFORE LINE IS ACTIVE
;<4.MONITOR>TTFEDV.MAC.28, 11-Mar-79 13:14:10, EDIT BY KONEN
;UPDATE COPYRIGHT FOR RELEASE 4
;<4.MONITOR>TTFEDV.MAC.27, 16-Feb-79 12:56:59, Edit by MCLEAN
;FIX COMMENTS AND REMOVE BLANK PAGE
;<4.MONITOR>TTFEDV.MAC.26, 16-Feb-79 12:51:46, Edit by MCLEAN
;FIX STORING OF LINE
;<4.MONITOR>TTFEDV.MAC.25, 13-Feb-79 13:32:02, Edit by MCLEAN
;REMOVE COMMENT CALL IN TTEXF TO DTEQ
;<4.MONITOR>TTFEDV.MAC.24, 12-Feb-79 17:20:02, Edit by MCLEAN
;TTEXF NEEDED A DYNST
;<4.MONITOR>TTFEDV.MAC.23, 10-Feb-79 17:16:09, Edit by MCLEAN
;NEW CHANGES FOR FRONT-END DOING XOFF
;<4.MONITOR>TTFEDV.MAC.22,  5-Feb-79 21:09:32, Edit by MCLEAN
;<4.MONITOR>TTFEDV.MAC.21,  3-Feb-79 00:34:14, Edit by MCLEAN
;<4.MONITOR>TTFEDV.MAC.20,  2-Feb-79 23:39:54, Edit by MCLEAN
;ADD NEW VECTOR VSFEXO FOR XOFF RECOGNITION IN FRONT END	;ENABLE/DISABLE FRONT-END XOFF RECOGNITION

;<4.MONITOR>TTFEDV.MAC.19, 25-Jan-79 18:26:32, Edit by MCLEAN
;FIX SNDXO1+5 SO IT GOES TO SNDXO3 NOT R
;<4.MONITOR>TTFEDV.MAC.18, 24-Jan-79 00:11:42, Edit by MCLEAN
;FIX STI OF XON COULD CRASH SYSTEM WITH KEEPALIVE
;<4.MONITOR>TTFEDV.MAC.17, 21-Jan-79 18:01:01, Edit by MCLEAN
;FIX SO XON HAS COUNT IS FROM EMPTY NOT FULL
;<4.MONITOR>TTFEDV.MAC.16, 14-Jan-79 15:07:57, Edit by MCLEAN
;REMOVE CODE REQUIRED FOR NON-RESIDENT TTSPWD
;<4.MONITOR>TTFEDV.MAC.14, 14-Jan-79 02:11:26, Edit by MCLEAN
;FIX IT SO TTXCN DOESN'T OVERFLOW
;<4.MONITOR>TTFEDV.MAC.13,  8-Jan-79 14:40:47, Edit by MCLEAN
;MAKE STPLNF FASTER AND SMALLER IT SHOULD ONLY SHUT OFF LINE FOR SHORT TIME
;<4.MONITOR>TTFEDV.MAC.12,  7-Jan-79 19:51:10, Edit by MCLEAN
;FIX CUTOFF FOR XON/XOFF
;<4.MONITOR>TTFEDV.MAC.10, 28-Dec-78 22:43:55, Edit by MCLEAN
;ADD VSTPLN STOP LINE (ABORT LINE AS IN NO INPUT!)	;STOP LINE

;<4.MONITOR>TTFEDV.MAC.8, 13-Nov-78 21:50:42, Edit by MCLEAN
;FIX TTXON SO IT DOES CHANNEL OFF BEFORE CALLING BIGSTO
;<4.MONITOR>TTFEDV.MAC.7, 13-Nov-78 21:48:15, Edit by MCLEAN
;REMOVE ADDM F,TTOCT(B) AT RSCHED+1 IT REALLY WAS WRONG THING TO DO
;<2MCLEAN>TTFEDV.MAC.6, 23-Oct-78 22:09:24, Edit by MCLEAN
;<2MCLEAN>TTFEDV.MAC.5,  8-Oct-78 21:32:28, Edit by MCLEAN
;<2MCLEAN>TTFEDV.MAC.4,  7-Oct-78 22:30:11, Edit by MCLEAN
;REMOVE OBFFR FOR SPEED
;<4.MONITOR>TTFEDV.MAC.5, 13-Oct-78 15:14:51, Edit by MCLEAN
;REMOVE FIX FOR XOFF FAILURE WE REALLY DON'T WANT TO CLEAR BIT HERE
;BECAUSE XOFF WILL BE DONE AGAIN.
;<4.MONITOR>TTFEDV.MAC.4,  8-Oct-78 21:30:14, Edit by MCLEAN
;TTMSAL AND A JUMPGE B,2 I PRESUME IT SHOULD HAVE BEEN JUMPGE 2,R
;<4.MONITOR>TTFEDV.MAC.3, 27-Sep-78 22:30:28, Edit by MCLEAN
;FIX XOFF SO FAILURE ON DTEQ WORKS CORRECTLY
;<4.MONITOR>TTFEDV.MAC.2, 27-Sep-78 09:39:27, EDIT BY MILLER
;ALWAYS SEND XOFF WHEN SNDXO2 IS CALLED
;<4.MONITOR>TTFEDV.MAC.1, 18-Jul-78 15:57:57, EDIT BY MILLER
;CHANGE DTESTO TO USE TTIDON.


;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
;  OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (C) 1976,1977,1978,1979,1980,1981,1982 BY DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

	SUBTTL FRONT-END DEPENDENT CODE
;FRONT-END DEPENDENT CODE FOR TTYSRV
;THIS MODULE IS NECESSARY TO SUPPORT THE KL10 -DTE20 INTERFACE
;FOR TTYSRV.  IT DOES ALL THE DEVICE SPECIFIC FUNCTIONS AND
;PROCESSES DATA TO AND FROM THE FRONT END.


;DEFINITIONS FOR TTDEV FOR FE TYPE LINES


;DEFINITIONS FOR TT.FE LINE TYPE
TT%FOW==1B1			;LINE ALLOCATION EXCEEDED
MSKSTR TTFOW,TTDEV,TT%FOW
DEFSTR TTFCT,TTDEV,27,8		;NUMBER BYTES IN FRONT END
DEFSTR TTFMC,TTDEV,35,8		;MAX BYTES IN FRONT END
SPCLIN==4			;HIGHEST SPECIAL LINE NUMBER
;
; FRONT-END VECTOR TABLE ENTRYS
;
	RESCD
TTFEVT=.
	TTDDLN			;DDLEN - LENGTH OF DYNAMIC DATA FOR THIS TYPE
	-1			;TT1LIN - FIRST LINE OF THIS TYPE/-1 NO LINES
	IFIW!R			;VITBLS - INITALIZATION
	IFIW!R			;VACTLN - RESTART
	IFIW!TTCOB4		;VCLOBF - CLEAR OUTPUT BUFFER
	IFIW!TTSSP2		;VSETSP - SET LINE SPEED
	IFIW!TTRSP1		;VGETSP - RETURN LINE SPEED
	IFIW!TTSNT1		;VSETTS - SUPRESS SYS MESSAGES
	IFIW!TTRNT1		;VGETTS - RETURN NON-TERMINAL DEV STATUS
	IFIW!TTSTO3		;VSTO - STOP ACTIVE LINE
	IFIW!R			;VSTPAR - SET TERMINAL CHARACT
	IFIW!RSKP		;VCKPHY - PHYSICAL TERMINAL
	IFIW!TTXON1		;VXON -XON	;PROCESS XON FROM TERMINAL

	IFIW!TTYDE0		;VDETDB - DEASIGN DYNAMIC DATA
	TRO 1,200		;VOPAR - APPLY PARITY
	IFIW!STRTO7		;VSTOUT - START OUTPUT LINE
	IFIW!SNDXO2		;VSXOFF - SEND XOFF
	IFIW!SNDXN2		;VSXON - SEND XON
	IFIW!TTCQ1		;VTTCS - EMPTY BUFFER
	IFIW!TTCON1		;VCON - CARRIER ON
	IFIW!NTYCOF		;VCOFF - CARRIER OFF
	IFIW!TTHU2		;VHNGUP - HANGUP
	IFIW!TTCHI3		;VXOFF - STOP LINE	;PROCESS XOFF FROM TERMINAL

	IFIW!TTC7S1		;RNEWCC - LOCAL/REMOTE CHECK FOR LOGIN
	IFIW!BIGST2		;VSTOBB - LINE STORAGE
	IFIW!TTSND1		;VSNDCH - SEND CHARACTER
	IFIW!TTDAL6		;VDET - DEALLOCATE LINE
	IFIW!DLSSX2		;VBBOV - HANDLE OVERFLOW OF TTBUFF
	IFIW!R			;VGCHBB - EMPTY BUFFER
	IFIW!RSKP		;VTTMSG - OK TO DO SENDALL FOR A LINE	;DO TTMSG FOR ONE LINE?

	IFIW!FEDABL		;TSETDS - DISABLE ENABLE
	IFIW!R			;VCKLIN - TTCH7 AFTER EMPTYING BUFFER
	IFIW!R			;VCLIBF - CLEAR INPUT BUFFER
	IFIW!TTDBEF		;VDOBE - DOBE
	IFIW!R			;VHNGRY - INPUT GA
	IFIW!TTSETF		;VSINIV  - SET INIT. VALUES FOR A LINE
	IFIW!TTSBEF		;VSOBE - SOBE
	IFIW!TTOBEF		;VDOBET - WAKEUP IF OUTPUT BUFFER EMPTY
	IFIW!TTMSSN		;VSNDA1 - DO ACTUAL SENDALL FOR A LINE	;SENDALL FOR ONE LINE

	IFIW!TTMSAL		;VSNDAL - DO SENDALL FOR ALL LINES	;SENDALL FOR ALL LINES

	JFCL			;VAJWCL - ADJUST WAKEUP CLASS	;ADJUST WAKEUP CLASS

	IFIW!STPLNF		;VSTPLN - STOP LINE	;STOP LINE

	IFIW!TTEXF		;VSFEXO - ENABLE/DISABLE XOFF RECOGNITION IN FRONT-END	;ENABLE/DISABLE FRONT-END XOFF RECOGNITION


   IFN <.-TTVTMX>-TTFEVT,<PRINTX %%INVALID DEVICE DEPENDENT TABLE SIZE>
;DEASSIGN DYNAMIC DATA
;	2/STATIC LINE NUMBER

   REPEAT 0,<			;A GOOD IDEA THAT DIDN'T HELP
TTYDEF:	NOSKD1			;OWN MACHINE
	SKIPG TTACTL(B)		;FULLY ACTIVE LINE?
	JRST TTYDF0		;NO. GIVE UP THEN
	PUSH P,B		;SAVE LINE NUMBER
	MOVE A,MSTRDT		;GET DTE #
	MOVSI C,0(B)		;GET LINE #
	MOVEI B,.FEDLS		;GET DEVICE
	CALL FIXARG		;FIX UP ARGS
	CHNOFF DLSCHN		;AND THE CHANNEL AS WELL
	CALL DTEFLA		;FLUSH ALL PACKETS FOR THE LINE
	CHNON DLSCHN		;UNDO OWNERSHIP
	POP P,B			;RESTORE REG
TTYDF0:	OKSKD1			;AND THIS TOO
	JRST TTYDE0		;AND DONE
   >				;END OF REPEAT 0
;START I/O

;	2/ DYNAMIC DATA ADDRESS

STRTO7:	DYNST T3		;GET STATIC BLOCK
	JN TTFPK,(T3),STRT11	;IF ON, DON'T START OUTPUT
	JRST STRTO1		;NOT. GO TO IT
; CLEAR OUTPUT BUFFER ROUTINE

TTCOB4:	STKVAR <TTCBSV>
	MOVEM B,TTCBSV		;SAVE ADDRESS OF DYNAMIC DATA
	DYNST			;GET LINE NUMBER
	MOVE D,B		;GET COPY OF LINE NUMBER
	MOVS C,B		;LINE NUMBER
	MOVEI B,.FEDLS		;GET DEVICE CODE
	MOVE A,MSTRDT		;MASTER DTE, NO POST
	CALL FIXARG		;GET PROPER ARGS
	EXCH D,TTCBSV		;GET BACK DYNAMIC DATA
	OPSTR <SKIPE>,TTOTP,(D)	;OUTPUT IN PROGRESS?
	JRST [	EXCH D,TTCBSV	;YES. GET BACK ORIGINAL ARGUMENT
		PUSHJ P,DTEFLO	;YES, FLUSH DTE REQUESTS
		JRST TTCBF5]
	EXCH D,TTCBSV		;GET BACK ORIGINAL ARGUMENT
TTCBF5:	MOVS D,C		;LINE NUMBER AS ARG
	SETZ C,
	HRLI B,.DFFDO		;FLUSH FUNCTION
	CALL DTEQ		;QUEUE IT UP
	 JFCL			;DOESN'T MATTER
	MOVE B,TTCBSV		;GET BACK DYNAMIC DATA
	JRST TTCOB5
	SWAPCD

; SET TERMINAL SPEED

TTSSP2:	SKIPN FEFLG		;IN PRIMARY PROTOCOL?
	RET			;NO. IGNORE IT THEN
	ACVAR <W1>		;GET A WORK REG
	UMOVE W1,2		;GET FLAGS
	TXNE W1,MO%AUT		;DECLARING AUTO SPEED?
	JRST [	TXNE W1,MO%RMT	;YES. ALSO WANT REMOTE?
		JRST .+1	;YES. PROCEED THEN
		RET]		;NO. ILLEGAL REQUEST
	NOINT			;PREVENT INTS
	CALL ASGALL		;ASSIGN THE BUFFER
	MOVE C,[POINT ^D16,SNDALL]
	UMOVE D,C		;GET USER'S ARGS
	HLRZ A,D		;GET INPUT SPEED
	JN TTAUT,(B),TTSSP4	;IF NOW AUTO, SET THE SPEED
	OPSTR <SKIPN>,TTFEM,(B)	;ALREADY REMOTE?
TTSSP4:	TXNE W1,MO%AUT		;NO. DECLARING AUTO?
	SKIPA			;DON'T SET SPEED
	MOVEM D,TTSPWD(B)	;SET THE NEW SPEED
	CALL TTEXFA		;SET XON/XOFF STATE
TTSSP1:	IDPB A,C		;STORE INPUT
	IDPB D,C		;STORE OUTPUT SPEED
	MOVEI D,0(D)
	MOVEI A,1		;ASSUME ONE STOP BIT
	CAIG D,^D110		;LESS THAN OR EQUAL TO 110 BAUD?
	MOVEI A,2		;YES. USE 2 STOP BITS THEN
	TXNE W1,MO%RMT		;WANT REMOTE?
	JRST [	MOVX D,SC%OPR!SC%WHL ;YES. SEE IF PRIVILEGED
		TDNN D,CAPENB	;IS IT?
		JRST TTSSP3	;NO. ERROR
		TRO A,(1B2)	;SET HIGH ORDER BIT
		LOAD D,TTFEM,(B)
		SETONE TTFEM,(B) ;SAY IS REMOTE
		TXNE W1,MO%AUT	;WANT "AUTO" SPEED?
		JRST [	SETONE TTAUT,(B) ;SET INDICATOR
			TRO A,(1B3) ;SET BIT IN MESSAGE TO FE
			JRST TTSSP5] ;AND PROCEED
		JUMPE D,.+1	;IF NOT NOW REMOTE, DECLARE SPEED
		UMOVE D,C	;YES. GET DEFAULT DECLARATION
		MOVEM D,TTSPWD(B) ;TO THE TABLE
		JRST .+1]	;GO SET SPEED ANYWAY
TTSSP5:	IDPB A,C		;STORE THIS
	MOVSI C,0(B)		;LINE TO LH OF C
	MOVE A,B		;SAVE LINE
	MOVE B,[.DFSPD,,.FEDLS]	;ARGS
	CALL FIXARG		;GO FIX THINGS UP
	MOVE D,[POINT ^D8,SNDALL]
	MOVSI A,INTALL		;ARRANGE TO FREE BUFFER
	HRR A,MSTRDT		;MASTER DTE
	HRRI C,6		;SIX BYTES OF ARG
	CALL DTEQ		;GO DO THE REQUEST
	 JFCL			;WILL GO
TTSSP6:	OKINT			;ALLOW INTS AGAIN
	RET			;AND DONE

;NONPRIVILEGED USER TRIED TO SET REMOTE

TTSSP3:	CALL INTALL		;FREE SEND ALL BUFFER
	JRST TTSSP6		;AND WRAP UP
;**;[2607] Add one line at TTSSP3: +2L	JGZ	3-APR-82
	ENDAV.			;[2607] END ACVAR
; SET/RETURN DEVICE NON-TERMINAL STATUS

TTSNT1:	SKIPN FEFLG		;IN PRIMARY PROTOCOL?
	RET			;NO. IGNORE IT THEN
	STOR C,TTNTS,(B)	;SAVE NEW VALUE
	MOVE D,C		;GET VALUE TO BE SET
	MOVSI C,0(B)		;GET TTY # TO CHANGE
	MOVE B,[.DFMSG,,.FEDLS] ;ARGS (FCN,,DEVICE)
	CALL FIXARG		;FIX UP ARGS
	MOVE A,MSTRDT		;MASTER DTE
	CALL DTEQ		;DO THE REQUEST
	 JFCL			;WILL GO
	RET			;AND DONE


;ENABLE/DISABLE XOFF RECOGNITION IN THE FRONT-END

	RESCD


TTEXFA:	SAVET			;SAVE REGISTERS
	CALL STADYN
	RET			;NOT IMPORTANT
	JRST TTEXZ
	
TTEXF:	SKIPN FEFLG		;CHECK FOR PRIMARY PROTOCOL 
	RET			;NO. IGNORE IT THEN
	SAVET			;SAVE TEMPS
TTEXZ:	SETZ T4,0		;ASSUME CLEAR
	OPSTR <SKIPE>,TT%PGM,TTFLGS(T2)
	SETO T4,0		;SET
	DYNST			;GET STATIC TTY NUMBER
	MOVSI T3,0(T2)		;GET TTY # TO SET/CLEAR
	MOVE T2,[.DFXEN,,.FEDLS] ;ARGS (FCN,,DEVICE)
	CALL FIXARG		;FIX UP ARGS
	MOVE T1,MSTRDT		;MASTER DTE
	CALL DTEQ		;DO THE REQUEST
	 JFCL			;FORGET IT
	RET
	SWAPCD
;TTMSG...

;CODE TO DO A SEND ALL FOR KL DTE20 CONFIGURATIONS

;TTMSSN FOR SINGLE LINE, TTMSAL FOR ALL LINES

TTMSSN:	SKIPA
TTMSAL:	SETOM B
	SAVET
	STKVAR <TTMSSV>
	MOVEM B,TTMSSV
	SKIPN FEFLG		;USING PRIMARY PROTOCOL?
	JRST [	JUMPGE B,R
		RETSKP]
	HRLI B,.DFSTA		;ASSUME SEND ALL
	SKIPL TTMSSV
	HRLI B,.DFHSD		;NO. STRING DATA THEN
	MOVSI A,DECSAL		;INTERRUPT LOCATION
	HRR A,MSTRDT
	HRL C,B			;THE LINE IF RELEVANT
	HRRI B,.FEDLS		;THE LINE SCANNER
	CALL FIXARG		;GO CHECK FOR CTY,ETC.
	HRR C,TTMSCT		;THE COUNT
	MOVE D,[POINT 8,SNDALL]	;THE POINTER
	TXO C,DTBYTM		;FORCE BYTE MODE SEND
	AOS SALCNT		;INCREMENT SENDALL COUNT
	CALL DTEQ		;GO SCHEDULE THE REQUEST
	 JFCL
	SKIPL B,TTMSSV
	RET
	RETSKP

	RESCD
DECSAL:	SOS SALCNT
	RET
	RESCD
; XON CODE
TTXON1:	SKIPN FEFLG		;IN PRIMARY PROTOCOL?

	JRST TTXON2		;NO .SKIP THE MESSAGE THEN
	MOVEI A,.DFXON		;FE XON FUNCTION
	PUSH P,B		;SAVE ADDRESS OF DYNAMIC DATA
	DYNST			;GET LINE NUMBER
	CALL SNDFNC		;TELL FE TO RESTART
	JFCL			;FORGET IT IT WILL COME AGAIN
	POP P,B			;RESTORE ADDRESS OF DYNAMIC DATA
	JRST TTXON2		;ENTER COMMON CODE

;ROUTINE TO SEND XOFF OR XON TO THE FRONT END
;ACCEPTS: A/ FUNCTION TO SEND
;	  B/ LINE NUMBER
;RETURNS:	+1 /COULD NOT SEND REQUEST
;		+2/ REQUEST SENT

SNDFNC:
	PUSH P,B		;SAVE LINE NUMBER
	MOVSI C,0(B)		;PUT LINE NUMBER IN CORRECT PLACE
	MOVSI B,0(A)		;FUNCTION CODE
	HRRI B,.FEDLS		;ASSUME DLS
	CALL FIXARG		;GO FIX UP THE ARGS
	HLRZ D,C		;LINE NUMBER AS DATUM
	SETZM C			;DIRECT
	MOVE A,MSTRDT		;TO THE MASTER -11
	CALL DTEQ		;QUEUE IT UP
	JRST PB2		;RESTORE AND RETURN BAD
	POP P,B			;RESTORE LINE
	RETSKP			;GIVE GOOD RETURN
;LINE IS ON RSX20F FRONT END

SNDXO2:	CONSZ PI,1B<^D20+DLSCHN> ;AT DTE PI LEVEL?
	JRST SNDXO1		;YES. GO TO IT
	NOSKD1			;PREVENT SCHEDULER INTERRUPTS
	CHNOFF DLSCHN		;AND DTE INTERRUPTS
SNDXO1:	SETONE TTFXO,(B)	;SAY X-ON  NEEDED
	LOAD D,TTXCN,(B)	;GET COUNT OF XOFFS
	AOS D			;UPDATE COUNT
	STOR D,TTXCN,(B)
	SOJN D,SNDXO3		;RETURN IF NOT ZERO
	MOVEI D,XOFFC		;THE CHARACTER
	SKIPGE CHITAB(D)	;PARITY NEEDED?
	TXO D,200		;YES. APPLY IT
	MOVE A,MSTRDT		;SEND TO THE MASTER
	MOVSI C,0(B)		;LINE NUMBER
;**;[2875]CHANGE 1 LINE AT SNDXO1:+10L	TAM	9-DEC-82
	MOVE B,[.DFBKW,,.FEDLS]	;[2875]
	CALL FIXARG		;FIX UP THE ARGS
	CALL DTEQ		;GO SEND IT
	JFCL			;IGNORE FAILURE
SNDXO3:	CONSZ PI,1B<^D20+DLSCHN> ;AT DTE PI LEVEL?
	RET			;YES. ALL DONE THEN
	CHNON DLSCHN		;RESTORE THE CHANNEL
	OKSKD1			;AND THE SCHEDULER
	RET			;AND DONE
;LINE IS ON RSX20F FRONT END. SEND XON ONLY IF LINE IS MARKED AS NEEDING
;ONE, AND IT HAS NOT STORED TOO MANY CHARACTERS IN EITHER ITS
;INPUT BUFFER OR TTBBUF

SNDXN2:	JE TTFXO,(B),R		;IF NOT WAITING, RETURN
	STKVAR <SNDXSV>
	MOVEM B,SNDXSV		;SAVE THE LINE NUMBER
	NOSKD1			;PREVENT SCHEDULER INTERRUPTION
	CHNOFF DLSCHN		;AND DTE INTERRUPTS
	MOVE D,B		;SAVE LINE NUMBER
	CALL STADYN		;GET ADDRESS OF DYNAMIC DATA
	 JRST SNDXN3		;NOT ACTIVE. INPUT BUFFER CAN'T OVERFLOW
	MOVEI A,MINXON		;LEVEL AT WHICH TO START AGAIN
	CAMGE A,TTICT(B)	;IS INPUT BUFFER THIS FULL?
	JRST SNDXN1		;YES. DON'T SEND XON
	MOVE B,SNDXSV		;GET LINE NUMBER
	LOAD A,TTFBB,(B)	;GET NUMBER OF WORDS USED IN TTBBUF
	CAIL A,MXBBC1		;MORE THAN ALLOWED FOR ONE TERMINAL?
	JRST SNDXN1		;YES. DON'T SEND XON

;XON IS TO BE SENT. TELL DTE SERVICE

SNDXN3:	MOVE B,SNDXSV		;TURN IT ON IF NOT ACTIVE.
	SETZRO TTXCN,(B)	;ZERO XOFF COUNT
	MOVE A,MSTRDT		;TO THE MASTER
	MOVEI D,XONC		;THE CHARACTER
	SKIPGE CHITAB(D)	;PARITY NEEDED?
	TXO D,200		;YES. APPLY IT
	MOVSI C,0(B)
;**;[2875]CHANGE 1 LINE AT SNDXN3:+7L	TAM	9-DEC-82
	MOVE B,[.DFBKW,,.FEDLS]	;[2875]
	CALL FIXARG
	CALL DTEQ		;GO SEND THE BYTE
	 JRST SNDXN1		;AND GIVE UP
	MOVE B,SNDXSV		;GET LINE NUMBER
	SETZRO TTFXO,(B)	;NO X-ON NEEDED NOW
SNDXN1:	MOVE B,SNDXSV		;RESTORE LINE NUMBER
	CHNON DLSCHN		;RESTORE DTE
	OKSKD1			;AND THE SHCEDULER
	RET			;AND DONE
;THIS IS A FRONT END LINE

TTHU2:	SAVET			;SAVE TEMPS
	MOVE A,MSTRDT		;MASTER -11, NO INT
	MOVS C,B
	PUSH P,B		;SAVE LINE NUMBER
	MOVE B,[.DFLHU,,.FEDLS]	;HANG UP THIS LINE
	CALL FIXARG
	HLRZ D,C
	SETZ C,
	CALL DTEQ		;REQUEST THE HANGUP
	 JRST [	POP P,B		;LINE NUMBER
		MOVEI A,0(B)	;TO A AS WELL
		HRLI A,DLSCXF	;HANGUP
		SETONE TTCON,(B) ;SET CARRIER ON TO FORCE HANGUP
		CALLRET BIGSTO]	;GO SCHEDULE THIS AGAIN
	POP P,B			;RESTORE LINE NUMBER
	RET			;AND DONE
;FRONT END LINE. TELL FRONT END TO STOP SENDING TO TERMINAL

TTCHI3:	SAVET			;SAVE TEMPS
	DYNST			;GET STAT ADDRESS
	MOVEI A,.DFXOF		;TELL FE TO STOP
	SKIPE FEFLG		;IN PRIMARY PROTOCOL?
	CALL SNDFNC		;DO IT
	 JFCL			;IF FAILED, DON'T TELL HIM
	RET
;LINE IS ON THE RSX20F FRONT END. LIMIT ITS STORAGE IN TTBBUF

BIGST2:	LOAD C,TTFBB,(B)	;GET COUNT OF CHARACTERS IN TTBBUF
	AOS C			;INCREASE IT
	CAIL C,MAXABC		;BEYOND BAD GUY CUTOFF?
	JRST STPLNF		;STOP LINE
	CAIG C,2		;CHECK FOR 2 IN BUFFER
	JRST BIGST4		;NO NOT THIS TIME
	SKIPG TTACTL(T2)	;YES CHECK TO SEE IF ACTIVE
	JRST STPLNF		;NO SHUT LINE DOWN IT IS ANOYING ME
BIGST4:	STOR C,TTFBB,(B)	;UPDATE COUNT OF CHARACTERS IN TTBBUF
	CAIGE C,MAXBBC		;MANY CHARS FOR THIS LINE?
	JRST BIGST1		;NO, CONTINUE
	MOVE C,TTBIGC		;YES, BIGBUF GETTING FULL TOO?
	CAIL C,TTBSIZ/2
	CALL SNDXOF		;YES, SEND XOF
	JRST BIGST1

STPLNF:	CALL SNDXOF		;TURN LINE OFF
	JN TTIME,(B),R 		;IF LINE ALREADY QUEUED, GO ON
	PUSH P,B		;SAVE LINE NUMBER
	MOVSI C,0(B)		;THE LINE
	MOVE B,[.DFTOL,,.FEDLS]
	MOVE A,MSTRDT		;TO THE MASTER
	MOVEI D,.DFTLO		;TURN IT OFF
	CALL FIXARG
	CALL DTEQ		;OUTPUT IT
	 JRST PB2		;RESTORE AND RETURN
	POP P,B			;RESTORE LINE NUMBER
	MOVE C,[TTTOBL]		;C/THE ROUTINE TO CALL
	CALLRET TTQAD1		;GO Q IT UP AND LOSE DATUM
;LINE IS ON RSX20F  STORE THE CHARACTER IN TTBBUF
;THIS CODE IS USED TO START UP A LINE TRANSFER VIA THE DTE20.

TTSND1:	SKIPN FEFLG		;USING PRIMARY PROTOCOL?
	JRST [	MOVEI A,0(C)	;NO
		PUSH P,B	;SAVE ADDRESS OF DYNAMIC DATA
		DYNST		;GET LINE NUMBER
		CALL DTECHO	;OUTPUT VIA SECONDARY
		 JRST [	POP P,B
			RET]
		POP P,B
		SETONE TTOTP,(B) ;INDICATE LINE IS ACTIVE
		RET]		;AND DONE
	MOVEI D,0(C)		;THE CHARACTER
	SETONE TTOTP,(B)	;SAY LINE IS ACTIVE
	INCR TTFCT,(B)		;INCREASE COUNT OF BYTES IN -11
	PUSH P,B		;SAVE ADDRESS OF DYNAMIC DATA
	DYNST			;GET LINE NUMBER
	SETONE TTFPK,(B)	;SAY WAITING FOR TO -11 DONE
	MOVSI C,0(B)		;LINE NUMBER
	MOVE B,[.DFHLC,,.FEDLS]	;ARGS
	CALL FIXARG		;GET PROPER ARGS
	PUSH P,F
	SETZ F,			;JUST IN CASE
	CALL DTSNGL		;GO DO A SINGLE REQUEST
	 JRST [	POP P,F		;FAILED. RESTORE FLAGS
		POP P,B		;RESTORE ADDRESS OF DYNAMIC DATA
		DECR TTFCT,(B)	;DECREMENT BYTES IN -11
		MOVNI C,1	;BACK UP BUFFER
		ADJBP C,TTOOUT(B)
		MOVEM C,TTOOUT(B) ;RESTORE IT
		AOS TTOCT(B) 	;UP COUNT
		JRST INTRST]	;GO SCHEDULE RETRY
	POP P,F			;RESTORE FLAGS
	POP P,B			;ADDRESS OF DYNAMIC BLOCK
	RET			;AND DONE
;TTTOBL - ROUTINE CALLED FROM SCHEDULER TO TURN ON LINE AGAIN

;ACCEPTS:
;	T2/ INTERNAL LINE NUMBER

TTTOBL:	MOVE A,MSTRDT		;TO THE MASTER
	PUSH P,B		;SAVE LINE NUMBER
	MOVSI C,0(B)
	MOVE B,[.DFTOL,,.FEDLS]
	MOVEI D,.DFTOO		;TURN IT ON
	CALL FIXARG		;FIX UP ARGS
	CALL DTEQ		;QUEUE IT
	 JRST [	POP P,B
		MOVE C,[TTTOBL] ;MUST TRY AGAIN
		CALLRET TTQAD1]	;ARRANGE FOR IT
	POP P,B			;RESTORE LINE NUMBER
	CALLRET SNDXON		;ASSUME AN X-ON IS NEEDED

; ENABLE/DISABLE TTY'S

FEDABL:	SETZ C,0		;SET LINE # (ALL)
	MOVE A,MSTRDT		;GET ID OF MASTER
	MOVE B,[.DFEDR,,.FEDH1]	;ENABLE/DISABLE DATASETS
	CALL DTEQ
	JFCL
	RET

	SUBTTL FRONT-END TERMINAL HANDLING
	RESCD			;MUST BE RESIDENT

;THIS ROUTINE IS CALLED FROM THE DTE20 INTERRUPT ROUITNE TO COMPLETE
;A TTY OUTPUT REQUEST. INPUT IS:
;	A/ UNIQUE CODE (SEE BELOW)
;	B/UNIT NUMBER
;	C/DEVICE CODE

;UNIQUE CODE IS 
;	(0,,COUNT)
;WHERE	COUNT IS THE NUMBER OF CHARACTERS SENT TO THE 11 IN SOME CALL TO
;		DTEQ THAT SPECIFIED TTYINT AS ITS RETURN ADDRESS
;	IF COUNT IS 0, THIS WAS A SINGLE CHARACTER (DTSNGL WAS CALLED)
;		AND BUFFER COUNTS HAVE ALREADY BEEN UPDATED
;	IF COUNT IS NON-ZERO, THIS WAS MULTIPLE CHARACTERS, AND THE BUFFER
;		COUNT MUST BE UPDATED

;AT THIS POINT, THE CHARACTERS HAVE BEEN SENT TO THE 11 BUT NOT ACKNOWLEDGED

TTYINT::PUSH P,A		;SAVE UNIQUE CODE
	MOVE A,C		;MOVE DEVICE TO A
	CALL GETLIN		;GET PROPER CODE
	 JRST [	POP P,A		;RESTORE CODE
		RET]		;AND GIVE UP
	SETZRO TTFPK,(B)	;CLEAR WAITING FOR -11
	POP P,A			;GET BACK UNIQUE CODE
	CALL STADYN		;GET ADDRESS OF DYNAMIC DATA
	 JRST [	JUMPLE T2,R	;RETURN IF BECOMING ACTIVE OR INACTIVE
		JE TTMES,(T2),R ;RETURN IF NOT A TTEMES BLOCK
		JRST .+1]	;CONTINUE IF TTEMES BLOCK

;MULTIPLE CHARACTERS WERE SENT. UPDATE COUNT OF CHARACTERS IN OUTPUT 
;BUFFER

	JUMPE A,TTYIN1		;HAVE A CODE?
	MOVEI C,0(A)		;NUMBER OF CHARACTERS SENT
	SUB C,TTOCT(B)		;COMPUTE NEW COUNT OF CHARACTERS IN BUFFER
	SKIPG C			;IF COUNT WENT NEGATIVE, DON'T STORE IT
	MOVNM C,TTOCT(B)	;STORE NEW COUNT
	CALL CHKWRN		;SEE IF FORK WAKEUP NEEDED

TTYIN1:	MOVEI C,0(A)		;GET COUNT AGAIN
	LOAD D,TTFCT,(B)	;FRONT END CHARACTER COUNT
	ADDI D,0(C)		;ADD CHARACTERS JUST SENT
	STOR D,TTFCT,(B)	;NEW COUNT
	LOAD C,TTFMC,(B)	;GET LINE'S ALLOCATION
	CAIL D,0(C)		;ROOM FOR MORE?
	JRST [	SETONE TTFOW,(B) ;SAY LINE IS WAITING FOR UNBLOCK
		RET]		;AND GO DISMISS THIS INTERRUPT

;T2/ ADDRESS OF DYNAMIC DATA

TTYIN2:	JN TTSFG,(T2),[SETZRO TTOTP,(T2) ;IF CTRL/S WAS TYPED, CLEAR 
			RET]	; OUTPUT ACTIVE
	SETONE TTOTP,(B)	;MAKE SURE THIS IS ON
	SKIPE C,TTOCT(B)	;ANY OUTPUT CHARACTERS?
	JRST TTYIN3		;YES. DO THEM
	SETZRO TTOTP,(T2)	;NO. CLEAR OUTPUT ACTIVE
	CALLRET CLENUP		;CLEAN UP AND RETURN
;TTYINT..

;CHARACTERS ARE IN OUTPUT BUFFER. CALL TTSND IF THERE IS ONLY ONE.
;OTHERWISE CALL DTEQ TO SEND THEM ALL

TTYIN3:	STKVAR <TTYVR1,TTYVR2>	;GET SOME SAVE CELLS
	MOVE C,TTOOUT(B)	;GET POINTER
	HRRZ A,C
	TDNN C,WRPMSK		;NEED TO ADVANCE?
	HRR C,1-TTSIZ(A)	;YES. DO IT
	MOVE A,TTOCT(B)		;GET OUTPUT COUNT
	CALL CNTSET		;GO ADJUST COUNT
	MOVEM C,TTYVR1		;SAVE STARTING BYTE POINTER
	CALL FNDEND		;GO GET CHARACTERS
	MOVE D,TTYVR1		;GET BACK ORIGINAL BYTE POINTER
	TRNN A,777776		;AT LEAST TWO?
	CALLRET TTSND		;NO. GO DO SINGLE CHARACTER
	MOVEM C,TTOOUT(B)	;NEW OUTPUT POINTER
	SETZ F,			;OUTPUT BUFFER
	HRR F,A			;GET COUNT OF BYTES FOUND
	MOVSI A,TTYINT		;IT'S TTY
	HRR A,MSTRDT		;TO THE MASTER
	MOVEM B,TTYVR2		;SAVE ADDRESS OF DYNAMIC DATA
	DYNST			;GET LINE NUMBER
	SETONE TTFPK,(B)	;WAITING FRO TO -11 DONE
	MOVS C,B		;LINE NUMBER
	HRR C,F			;COUNT
	MOVE B,[.DFHSD,,.FEDLS]	;STRING DATA
	CALL FIXARG		;FIX UP THE ARGS
	CALL DTEQ		;QUEUE THE REQUEST
	 JRST RSCHED		;GO DO RESCHEDULE
	RET			;GO DISMISS THE INTERRUPT

;DTEQ FAILED. RESTORE COUNTS AND ARRANGE FOR SCHEDULER TO RESTART OUTPUT

RSCHED:	MOVE B,TTYVR2		;ADDRSS OF DYNAMIC DATA
	MOVE D,TTYVR1		;GET ORIGINAL BYTE POINTER
	MOVEM D,TTOOUT(B)	;RESTORE OUTPUT BYTE POINTER
INTRST:	DYNST			;B/ LINE NUMBER
	SETZRO TTFPK,(B)	;NOT WAITING FOR PACKET
	SETZ A,			;A/ TIME UNTIL EVENT
	MOVE C,[TTSN10]		;START UP AS SINGLE CHARACTER
	CALLRET TTQAD		;GO DO IT
;CNTSET - ROUTINE TO FIGURE OUT MAX COUNT ALLOWED IN STRING DATA FUNCTION
;INPUT:	A/ TTY BUFFER COUNT
;	B/ ADDRESS OF DYNAMIC DATA
;RETURNS +1 ALWAYS WITH: A/-MAX COUNT,,0

CNTSET:	SAVEQ			;GET SOME WORK REGISTERS
	LOAD Q1,TTFMC,(B)	;MAX ALLOCATION
	LOAD Q2,TTFCT,(B)	;CURRENT FRONT END COUNT
	SUBI Q1,0(Q2)		;COUNT ALLOWED TO SEND
	CAILE A,0(Q1)		;CAN DO ALL?
	MOVEI A,0(Q1)		;NO. SET ALLOCATION AS BYTE COUNT
	MOVNI A,0(A)		;FOR AOBJN
	MOVSI A,0(A)		;TO THE LEFT HALF
	RET			;AND DONE

;FNDEND - FIND END OF MESSAGE TO SEND TO TERMINAL

;ACCEPTS:
;	T1/ AOBJN POINTER TO STEP THROUGH OUTPUT BUFFER
;	T3/ POINTER FOR REMOVING CHARACTERS FROM OUTPUT BUFFER

;	CALL FNDEND

;RETURNS +1: ALWAYS,
;		T3/ UPDATED POINTER TO OUTPUT BUFFER

FNDEND:	TDNN C,WRPMSK		;TO THE NEXT?
	RET			;YES. DONE FOR NOW
	ILDB D,C		;GET NEXT BYTE
	TRNE D,TTOESC		;ESCAPE CHARACTER?
	JRST [	ADD C,[^D9B5]	;DECREMENT BYTE POINTER
		TLNE C,(40B5)	;WENT INTO PREVIOUS WORD?
		SUB C,[44B5+1]	;YES. CORRECT IT
		RET]		;AND RETURN
	AOBJN A,FNDEND		;NO. GET MORE
	RET			;ALL EXHAUSTED

;ROUTINE TO SET SPEED OF LINE FROM VALUES SENT BY -11
;ACCEPTS:
;	A/ DEVICE CODE
;	B/ UNIT NUMBER
;	C/ REMOTE INDICATOR
;	D/ INPUT,,OUTPUT

TTSPST::CALL GETLIN		;GET INTERNAL LINE NUMBER
	 RET			;INVALID
	JUMPE C,TTSPS1		;IF NOT REMOTE, JUMP OFF
	SETONE TTFEM,(B)	;IS REMOTE
	TRNN C,(1B3)		;IS IT AUTO ALSO?
	JRST TTSPS1		;NO.
	SETONE TTAUT,(B)	;YES. SET INDICATOR
TTSPS1:	MOVEM D,TTSPWD(B)	;STORE IT
	RET			;AND DONE
;ROUTINE TO HANDLE SIGNAL FROM A FE THAT ITS LINE BUFFER FOR
;A GIVEN LINE IS EMPTY. ACCEPTS:
;	A/ DEVICE CODE
;	B/LINE NUMBER

TTYDON::JUMPL B,DONALL		;IF NEG HE WANTS TO ACK THEM ALL
	CALL GETLIN
	 RET			;ILLEGAL LINE
	JN TTFPK,(B),R		;IF TO -11 DONE PENDING, GO AWAY
	CALL STADYN		;GET ADDRESS OF DYNAMIC DATA
	 JRST [	JUMPLE T2,R	;RETURN IF BECOMING ACTIVE OR INACTIVE
		JE TTMES,(T2),R ;RETURN IF NOT A TTEMES BLOCK
		JRST .+1]	;CONTINUE IF TTEMES BLOCK
	SETZRO TTFCT,(B)	;CLEAR COUNT OF BYTES IN -11
	JE TTFOW,(B),R		;IS THIS LINE WAITING FOR THIS INT?
	SETZRO TTFOW,(B)	;YES. CLEAR WAIT CONDITION
	CALLRET TTYIN2		;CONTINUE OUTPUT TO THE LINE

;HERE WHEN FRONT END IS ACKING ALL UNITS

DONALL:	STKVAR <SAVEE>
	MOVSI C,NTTFE		;NUMBER OF FRONT END LINES
	MOVNS C			;MAKE AOBJN POINTER
DONAL1:	MOVEM C,SAVEE		;SAVE AOBJN POINTER
	MOVEI B,0(C)		;B/LINE NUMBER
	MOVEI A,.FEDLS		;ALL LINES ARE DLS
	CALL TTYDON		;GO ACK THIS GUY
	MOVE C,SAVEE
	AOBJN C,DONAL1		;DO ALL LINES
	MOVE B,CTYLNO		;GET CTY LINE NUMBER
	LOAD C,TTSTY,(B)	;GET LINE TYPE
	CAIE C,TT.FE		;FRONT END LINE?
	RET			;NO. DON'T ACK IT
	SKIPGE B,CTYUNT		;B/UNIT NUMBER FOR CTY
	RET			;NOT SET UP YET
	MOVEI A,.FEDLS		;A/ DEVICE .FEDLS
	CALLRET TTYDON		;GO ACK THE LINE
;ROUTINE TO HANDLE A DIAL UP SIGNAL FROM THE FE
;	A/DEVICE CODE
;	B/LINE NUMBER

TTYDLU::CALL GETLIN		;GET PROPER LINE NUMBER
	 RET			;ILLEGAL LINE
	MOVSI A,0(B)		;LINE NUMBER TO LH
	HRRI A,DLSCXF+CARONB	;INDICATE CARRIER ON
	CALLRET BIGSTO		;PUT IT IN BUFFER

;ROUTINE TO HANDLE HANG UP SIGNAL FROM FE
;	A/DEVICE CODE
;	B/LINE NUMBER

TTYHGU::CALL GETLIN		;GET LINE NUMBER
	 RET			;ILLEAGAL LINE
	MOVSI A,0(B)		;TO LH
	HRRI A,DLSCXF		;CARRIER TRANSITION
	CALLRET BIGSTO		;STORE IT

;DEFINE THE PROTOCOL TRANSFER VECTOR

TTYDTV::0			;NO STRING DATA
	TTYDON			;ACK
	0			;NO STATUS
	TTYSLA			;SET LINE ALLOCATION
	R			;NO ERROR REPORTING
	TTDTRM			;DETACH REMOTES ON RELOAD
;THIS ROUTINE IS CALLED FROM THE DTE INTERRUPT ROUTINE TO SET
;THE LINE ALLOCATION FOR A TTY LINE. ACCEPTS:
;	1/ DEVICE CODE
;	2/ ALLOCATION
;	3/ LINE NUMBER

TTYSLA::EXCH B,C		;GET ARGS IN PROPER PLACES
	CALL GETLIN		;GET INTERNAL LINE NUMBER
	 RET			;ILLEGAL LINE
	STOR C,TSFMC,(B)	;STORE NEW ALLOCATION
	RET			;AND DONE

;IDCTY - IDENTIFY THE CTY

;ACCEPTS:
;	T2/ UNIT NUMBER FOR THE CTY AS KNOWN BY THE FRONT END

;	CALL IDCTY

;RETURNS +1: ALWAYS

;CALLED FROM DTE SERVICE WHEN THE FRONT END SENDS OVER THE UNIT NUMBER
;WITHIN THE .FEDLS DEVICE THAT IT KNOWS AS THE CTY.  STORES:
;CTYUNT/ THE UNIT NUMBER
;CTYINT/ THE INTERNAL EQUIVALENT OF THAT (INTERNAL LINE NUMBER)

;THE CTY SHOULD ALWAYS BE ADDRESSED INTERNALLY BY CTYLNO, WHICH IS 
;SET UP BY TTINIT. CTYINT WILL CONTAIN THE INTERNAL
;EQUIVALENT OF THE LINE ON WHICH THE CTY IS PHYSICALLY LOCATED FOR THIS
;MONITOR LOAD. ADDRESSING THE LINE BY THIS NUMBER IS AN ERROR.
;IF CTYINT=CTYLNO, CTYINT IS SET TO -1 SO THAT NO LINE NUMBER WILL
;EVER MATCH IT

IDCTY::	SAVET
	PUSH P,T2		;SAVE UNIT NUMBER
	SETOM CTYUNT		;INDICATE CTY NOT KNOWN FOR GETLIN 
	MOVEI T1,.FEDLS		;T1/DEVICE
	CALL GETLIN		;GET THE INTERNAL EQUIVALENT
	 RET			;NOT A FRONT END LINE
	CAME T2,CTYLNO		;IS THIS ITS VALID INTERNAL LINE NUMBER?
	MOVEM T2,CTYINT		;NO. SAVE THIS AS ITS ALIAS
	POP P,CTYUNT		;SET UNIT NUMBER FOR CTY
	RET
;GETLIN - ROUTINE TO CONVERT DEVICE/LINE TO INTERNAL LINE NUMBER
;ACCEPTS:
;	A/DEVICE CODE (ONLY .FECTY OR .FEDLS)
;	B/LINE NUMBER
;RETURNS +1: FAILURE
;	 +2: SUCCESS,
;		T2/INTERNAL LINE NUMBER
;DOES NOT CLOBBER ANY REGISTERS EXCEPT B

GETLIN:	ACVAR <W1>		;GET A WORK REGISTER
	CAIN A,.FECTY		;THE CTY?
	JRST [	MOVE B,CTYLNO	;YES. USE INTERNAL NUMBER OF CTY
		RETSKP]		;AND RETURN WITH GOOD LINE

;THE DEVICE MUST BE .FEDLS

	CAMN B,CTYUNT		;THE UNIT NUMBER FOR THE CTY?
	JRST [	MOVE B,CTYLNO	;YES. GET INTERNAL LINE NUMBER FOR CTY
		RETSKP]
	CAIL B,NTTFE		;IS THE UNIT NUMBER WITHIN THE NUMBER
				; OF FRONT END LINES THAT WE KNOW ABOUT?
	RET			;NO. CAN'T BE A FRONT END LINE
	JUMPE B,GETLN1		;IF THE DL11, SKIP BIAS
	SUBI B,SPCLIN		;BIAS THE LINE
	SKIPG B			;NOW A GOOD T/S LINE NUMBER?
	ADDI B,NTTFE-1		;NO. WAS A SPECIAL. TRANSLATE THE LINE #
GETLN1:	MOVE W1,TTLINV+TT.FE	;YES. GET INTERNAL LINE NUMBER FOR FIRST
	ADD B,TT1LIN(W1)	; FRONT END LINE. COMPUTE FOR THIS LINE
	RETSKP			;RETURN SUCCESS
;**;[2607] Add one line at GETLN1: +3L	JGZ	3-APR-82
	ENDAV.			;[2607] END ACVAR


;FIXARG - ROUTINE TO DETERMINE PROPER DEVICE/LINE NUMBER FOR LINE ON RSX20F
;FRONT END

;ACCEPTS: RH B/ DEVICE (ONLY .FEDLS)
;	  LH C/ INTERNAL LINE NUMBER
;	CALL FIXARG
;RETURNS +1: ALWAYS,
;		RH B/ DEVICE AS KNOWN BY THE FRONT END
;		LH C/ UNIT AS KNOWN BY FRONT END

;CALLED IN PREPARATION FOR CALLING DTE SERVICE. LINE IS ASSUMED TO
;BE ON THE FRONT END

;NOTE: IF CALLED WITH -1, RETURNS IMMEDIATELY. THIS IS BECAUSE OF A
;FRONT-END BUG THAT REQUIRES RECEIVING -1 ON A SENDALL

FIXARG:	ACVAR <W1,W2>		;GET SOME WORK REGISTERS
	JUMPL C,R		;IF UNIT .LE. 0, NO CHANGE
	HLRZ W1,C		;GET INTERNAL LINE NUMBER
	CAMN W1,CTYLNO		;THE CTY?
	JRST [	HRRI B,.FECTY	;YES. USE THE CTY
		HRLI C,0	;AND UNIT 0
		RET]
	MOVE W2,TTLINV+TT.FE	;GET LINE TYPE VECTOR TABLE
	SUB W1,TT1LIN(W2)	;GET LINE NUMBER WITHIN TYPE
	JUMPE W1,FIXAR1		;IF THE DL11, ALL DONE
	ADDI W1,SPCLIN		;NOT. BIAS THE LINE NUMBER
	CAILE W1,NTTFE-1	;A VALID T/S LINE?
	SUBI W1,NTTFE-1		;NO. ONE OF THE SPECIALS THEN
FIXAR1:	HRL C,W1		;RETURN IT IN LH OF C
	RET			;AND DONE
;**;[2607] Add one line at FIXAR1: +2L	JGZ	3-APR-82
	ENDAV.			;[2607] END ACVAR


;DTESTO - ROUTINE TO STORE A CHARACTER IN TTBBUF. CALLED AT INTERRUPT LEVEL
;FROM DTE SERVICE. DATA IS ALWAYS A CHARACTER AT THIS POINT.

;ACCEPTS:
;	T1/CHARACTER IN 8 BITS
;	T2/(0,, PHYSICAL LINE NUMBER)
;	T3/DEVICE TYPE

;RETURNS +1: ALWAYS

DTESTO::EXCH C,A		;TYPE TO A, CHAR TO C
	CALL GETLIN		;GET INTERNAL LINE NUMBER FOR THIS LINE
	 RET			;LINE NOT ON FRONT END
	MOVE A,C		;RESTORE CHARACTER
	CALLRET TTICNT		;GO STORE CHARACTER
;DEVICE DEPENDENT CODE FOR DOBE

TTDBEF:	JN TTFCT,(2),RSKP	;IF BYTE IN FRONT END, GO DISMISS
	RET


;DEVICE DEPENDENT CODE FOR SOBE

TTSBEF:	LOAD T1,TTFCT,(2)	;GET FE CHARACTER COUNT
	ADD 1,TTOCT(2)		;ADD IN BYTES STILL IN -10 MEMORY
	OPSTR <SKIPN>,TTOTP,(2)	;NOW INACTIVE?
	SKIPLE 1		;EMPTY?
	RET			;NO. NOT EMPTY THEN
	RETSKP			;EMPTY


;DEVICE DEPENDENT CODE FOR WAKE UP ON OUTPUT BUFFER EMPTY

TTOBEF:	OPSTR <SKIPN>,TTFCT,(T2) ;CHARACTERS IN FRONT END?
	JRST TTOBE1		; NO.  GO MAKE THE REST OF THE CHECKS
	JRST 0(4)		;YES DON'T WAKE UP


;DEVICE DEPENDENT CODE FOR INIALIZING DYNAMIC STORAGE

TTSETF:	LOAD T3,TSFMC,(T2)	;GET FRONT END CHARACTER LIMIT FROM DYNAMIC
	STOR T3,TTFMC,(T1)	; AND COPY TO DYNAMIC
	JRST TTSET1		;GO DO THE REST OF THE INITILIZATION
;ROUTINE CALLED FROM PROTOCOL HANDLER TO DETACH ALL REMOTE JOBS FOR
;A GIVEN DTE. ACCEPTS:
;	A/ DTE NUMBER (NOT USED)
;RETURNS	+1 ALWAYS

	SWAPCD			;IS SWAPPABLE
TTDTRM:	CAME A,MSTRDT		;IS THIS FOR THE MASTER DTE?
	RET			;NO. DON'T DO ANYTHING THEN
	SAVET			;SAVE ALL TEMP REGISTERS
	MOVSI B,NTTFE		;NUMBER OF FE LINES
	MOVNS B			;SET UP AOBJN POINTER
	MOVE A,TTLINV+TT.FE	;GET NUMBER OF FIRST LINE OF THE TYPE TT.FE
	HRR B,TT1LIN(A)		;START WITH FIRST LINE AND LOOP THROUGH ALL
TTDTR1:	OPSTR <SKIPE>,TTFEM,(B) ;IS THIS LINE REMOTE?
	CALL TTJBDT		;YES. DETACH IT THEN
	AOBJN B,TTDTR1		; DO ALL LINES
	MOVEI A,.SFRMT		;SEE IF REMOTE LOGINS NOW ALLOWED
	TMON			;GET VALUE
	XCT [	CALL DTRMDS	;NOW DISALLOWED
		CALL DTRMEN](B)	;NOW ALLOWED
	RET			;AND DONE
;ROUTINE TO DEFINE THE DL11W PSEUDO-CTY'S.
;PRIMARY PROTOCOL MUST BE RUNNING

DFNDL1::ACVAR <W1>		;GET A WORK REG
	STKVAR <<DFNDLS,2>,<DFNDS1,1>>	;A STRING
	MOVE T2,[ASCII /TTY/]	;GET BASE STRING
	MOVEM T2,DFNDLS		;SAVE IT
	MOVE T2,[ASCIZ /DL0/]	;GET DEFINITION STRING
	MOVEM T2,DFNDS1		;SAVE IT
	MOVE W1,[-<SPCLIN-1>,,SPCLIN-2] ;THE LINES TO DO
DFNDLL:	HRRZ T2,W1		;GET LINE NUMBER
	MOVEI T1,.FEDLS		;FOR THE DLS DEVICE
	CALL GETLIN		;GET ITS INTERNAL NUMBER
	 JRST DFNDLE		;?
	SETONE TTIGI,(T2)	;SET IGNORE
	MOVEI T1,DFNDLS		;GET ADDRESS OF BYTE ARRAY
	HRLI T1,(<POINT 7,0,20>) ;MAKE IT A STRING POINTER
	MOVEI T3,10		;GET AN OCTAL NUMBER
	NOUT			;PUT LINE NUMBER IN STRING
	 JFCL
	MOVEI T3,":"		;GET TERMINATOR
	IDPB T3,T1		;STORE COLON
	SETZM T3		;GET A NULL
	IDPB T3,T1		;TIE OFF STRING
	MOVX T1,<BYTE (7)0,0,1>
	ADDM T1,DFNDS1		;CHANGE LOGICAL NAME STRING
	MOVEI T1,.TTDES(T2)	;GET DEVICE DESIGNATOR IN T1
	MOVEI T2,.MOSNT		;SET NON-TERMINAL STATUS
	MOVEI T3,.MOSMN		;SUPPRESS SYSTEM MESSAGES
	MTOPR			;DO IT
	 ERJMP .+1		;PROCEED IF IT FAILS
	MOVX T1,.CLNSY		;CREATE SYSTEM LOGICAL NAME
	HRROI T2,DFNDS1		;THE LOGICAL NAME
	HRROI T3,DFNDLS		;THE DEFINITION
	CRLNM			;DO IT
DFNDLE:	 BUG (DLDEF)
	AOBJN W1,DFNDLL		;DO THEM ALL
	RET			;AND DOND
;**;[2607] Add one line at DFNDLE: +3L	JGZ	3-APR-82
	ENDAV.			;[2607] END ACVAR