Google
 

Trailing-Edge - PDP-10 Archives - BB-M080K-SM - monitor-sources/nrtsrv.mac
There are 20 other files named nrtsrv.mac in the archive. Click here to see a list.
;------------------------- Autopatch Tape # 12 -------------------------
; UPD ID= 2138, SNARK:<6.1.MONITOR>NRTSRV.MAC.12,   5-Jun-85 10:08:35 by MCCOLLUM
;TCO 6.1.1406  - Update copyright notice.
; UPD ID= 1590, SNARK:<6.1.MONITOR>NRTSRV.MAC.11,   5-Mar-85 18:03:01 by GLINDELL
;TCO 6.1.1233 - do the right things when logins not allowed
; UPD ID= 1577, SNARK:<6.1.MONITOR>NRTSRV.MAC.10,   1-Mar-85 13:23:32 by GLINDELL
;Remove NVTPSI - it can legally happen
; UPD ID= 1407, SNARK:<6.1.MONITOR>NRTSRV.MAC.9,  27-Jan-85 16:57:53 by NICHOLS
;Add data to NVTPSI BUGCHK, clean up some OPSTR <SKIPx> to be TMNx
; UPD ID= 1145, SNARK:<6.1.MONITOR>NRTSRV.MAC.8,   3-Dec-84 17:32:15 by GLINDELL
;D36COM is now in XCDSEC
; UPD ID= 1020, SNARK:<6.1.MONITOR>NRTSRV.MAC.7,   9-Nov-84 15:56:56 by PRATT
;More TCO 6.1.1022 - More of edit 983
;  Fix bad byte pointer when no host number
;  Set no known node name when SCTA2N fails or no host number
; UPD ID= 1007, SNARK:<6.1.MONITOR>NRTSRV.MAC.6,   7-Nov-84 21:35:09 by PRATT
;More TCO 6.1.1022 - EBD - Fix foolish typo in last edit
; UPD ID= 983, SNARK:<6.1.MONITOR>NRTSRV.MAC.5,   7-Nov-84 08:18:12 by PRATT
;More TCO 6.1.1022 - Fix problem with bad byte pointer if SCTA2N fails
; UPD ID= 956, SNARK:<6.1.MONITOR>NRTSRV.MAC.4,   5-Nov-84 19:16:26 by PRATT
;TCO 6.1.1032 - Make TTYSRV compile independently:
;  Move TTNU1 here and call it TTMCNU
;  Rename TTPHDV.MAC to NRTSRV.MAC
;  Duplicate the TTPHDV edit history here and in RSXSRV.MAC
;  Change reference of TTYASN to TTYASG
;  Change INTRAN to DINTRN since it conflicts with global in STG
;  Make many symbols global for TTYSRV
;  Don't use TDCALL to CTHNRT, TDCALx's are now only defined in TTYSRV
; UPD ID= 930, SNARK:<6.1.MONITOR>TTPHDV.MAC.20,  28-Oct-84 11:12:08 by PRATT
;TCO 6.1.1022 - Add support code for NTINF jsys: 
;  Add field NRRID for remote host ID
;  Do a read connect info to get the remote host ID just before accepting
; UPD ID= 713, SNARK:<6.1.MONITOR>TTPHDV.MAC.18,  26-Jul-84 08:31:11 by MCINTEE
;Add CTERM - NRT support
; UPD ID= 578, SNARK:<6.1.MONITOR>TTPHDV.MAC.17,  29-May-84 14:57:05 by MCINTEE
;Fix another of previous
; UPD ID= 575, SNARK:<6.1.MONITOR>TTPHDV.MAC.16,  29-May-84 13:19:03 by MCINTEE
;Fix detach/attach bug in NRT (TNUKIL)
; UPD ID= 545, SNARK:<6.1.MONITOR>TTPHDV.MAC.15,  23-May-84 07:49:45 by MCINTEE
;Merge from M60:
; UPD ID= 4178, SNARK:<6.MONITOR>TTPHDV.MAC.89,   7-May-84 13:32:27 by LOMARTIRE
;More TCO 6.2047 - Fix all possible cases of PI 6 NOSKED/OKSKED from TTYDED
; UPD ID= 381, SNARK:<6.1.MONITOR>TTPHDV.MAC.14,  12-Mar-84 14:58:09 by MCINTEE
;Fix logout bug in NRT.
; UPD ID= 332, SNARK:<6.1.MONITOR>TTPHDV.MAC.13,  13-Feb-84 14:35:32 by MCINTEE
;Make NRTSOF get more buffers
; UPD ID= 293, SNARK:<6.1.MONITOR>TTPHDV.MAC.12,  16-Jan-84 08:33:37 by MCINTEE
;Merge from M60:
; UPD ID= 3397, SNARK:<6.MONITOR>TTPHDV.MAC.88,   3-Jan-84 10:38:46 by PRATT
;TCO 6.1796 - Create TTNTM1, sets/clears TTNTS in fe only.
; UPD ID= 286, SNARK:<6.1.MONITOR>TTPHDV.MAC.11,   5-Jan-84 17:33:38 by NICHOLS
;Fix previous edit, it should give up (RET), not go to MCSRV2 or MCSRV5
; UPD ID= 282, SNARK:<6.1.MONITOR>TTPHDV.MAC.10,  27-Dec-83 23:23:52 by GROSSMAN
;Fix bug in MCSRV when NRTUNB fails, go to MCSRV2, not MCSRV5.
; UPD ID= 218, SNARK:<6.1.MONITOR>TTPHDV.MAC.9,  17-Oct-83 15:48:54 by MCINTEE
;Change IBFRCC to IBRFC1
; UPD ID= 197, SNARK:<6.1.MONITOR>TTPHDV.MAC.8,  25-Aug-83 07:55:07 by MCINTEE
;TCO 6.1784 - In TTSETH, fix logic that sets TTNPM 
; UPD ID= 191, SNARK:<6.1.MONITOR>TTPHDV.MAC.7,   5-Aug-83 12:29:25 by MCINTEE
;Yet another NRT bug fix. Add a SETZRO TTOTP in NETUSER release code.
; UPD ID= 189, SNARK:<6.1.MONITOR>TTPHDV.MAC.6,   4-Aug-83 09:46:46 by MCINTEE
;TCO 6.1718 - Fix code so LOCAL AUTOBAUD lines don't get the REMOTE bit set
;	when the speed is recieved from the FE
; UPD ID= 187, SNARK:<6.1.MONITOR>TTPHDV.MAC.5,   2-Aug-83 15:52:22 by MCINTEE
;More TCO 6.1426 - remove an extra SETZRO TTPRM
;TCO 6.1600 - Allow LOCAL lines to be set as autobaud
; UPD ID= 104, SNARK:<6.1.MONITOR>TTPHDV.MAC.8,  18-Apr-83 13:12:19 by PAETZOLD
;TCO 6.1557 - TCP Merge
; UPD ID= 94, SNARK:<6.1.MONITOR>TTPHDV.MAC.7,  28-Mar-83 14:03:38 by MCINTEE
;Do the previous edit in a cleaner manner
; UPD ID= 93, SNARK:<6.1.MONITOR>TTPHDV.MAC.6,  28-Mar-83 12:35:46 by MCINTEE
;Fix bug in NRT that causes an occasional NSKDIS bughlt.
; UPD ID= 2039, SNARK:<6.MONITOR>TTPHDV.MAC.83,  20-Mar-83 12:46:39 by HALL
;TCO 6.1502 - Allow resident free space in extended section
;	Use one-word global byte pointers to point to sendall buffer and
;		I/O buffers, which must be in section 0 for the DTE.
;	Convert one-word global to one-word local before handing to DTESRV
;	Change handling of end of I/O buffers, and definition of WRPMSK,
;		to reflect use of one-word globals
;	In FNDEND, use ADJBP to decrement byte pointer instead of previous hack
; UPD ID= 1985, SNARK:<6.MONITOR>TTPHDV.MAC.82,  14-Mar-83 08:48:34 by HALL
;TCO 6.1502 - Allow resident free space in extended section
;	Add EA.ENT to TTDTRM
; UPD ID= 1970, SNARK:<6.MONITOR>TTPHDV.MAC.81,  10-Mar-83 19:11:06 by HALL
;TCO 6.1502 - Allow resident free space in extended section
;	Add EA.ENT to TTYINT,TTSPST,TTYDON,TTYDLU,TTYHGU,TTYSLA,IDCTY,
;		DTESTO,DFNDL1
; UPD ID= 1945, SNARK:<6.MONITOR>TTPHDV.MAC.80,   9-Mar-83 10:16:58 by HALL
;TCO 6.1502 - Allow resident free space in extended section
;	Change call to ASGRSB to set RS%SE0
; UPD ID= 4, SNARK:<6.1.MONITOR>TTPHDV.MAC.2,   2-Feb-83 07:38:59 by MCINTEE
;TCO 6.1485 - Fix TCO 6.1480, put TT%XFF in dynamic storage block.
; UPD ID= 1714, SNARK:<6.MONITOR>TTPHDV.MAC.78,  28-Jan-83 10:56:17 by MURPHY
;More 6.1390 - Add dummy symbol if no FE code.
; UPD ID= 1711, SNARK:<6.MONITOR>TTPHDV.MAC.77,  27-Jan-83 22:58:02 by WEAVER
;TCO 6.1480 - Only send XOFF/XON status to front-end if TTXFF (XOFF FORCE)
;is set.
; UPD ID= 1572, SNARK:<6.MONITOR>TTPHDV.MAC.76,  27-Dec-82 08:30:12 by GRANT
;TCO 6.1426 - When closing an NVT connection, don't undo TTPRM if the line
; is an MCB TTY or the CTY
; UPD ID= 1533, SNARK:<6.MONITOR>TTPHDV.MAC.75,  14-Dec-82 09:55:48 by MURPHY
;TCO 5.1.1114 - Index needed at SNDXN2+8L to fix XOFF/XON for incoming chars.
; UPD ID= 1489, SNARK:<6.MONITOR>TTPHDV.MAC.74,  30-Nov-82 11:45:34 by WEAVER
;TCO 6.1393 - Use Break Through Write to send XONs and XOFFs to a line
; UPD ID= 1485, SNARK:<6.MONITOR>TTPHDV.MAC.73,  29-Nov-82 13:36:14 by MURPHY
;TCO 6.1390 - Shut off 20F line if more than 2 noise characters in 1 second.
; UPD ID= 1332, SNARK:<6.MONITOR>TTPHDV.MAC.72,  13-Oct-82 07:04:19 by GRANT
;More of previous edit - fix bug in TNTCLS's debugging code
; UPD ID= 1312, SNARK:<6.MONITOR>TTPHDV.MAC.71,   9-Oct-82 10:28:22 by GRANT
;TCO 5.1.1089 - Rewrite TNTCLS, save link IDs rather than LL block addresses
; UPD ID= 1086, SNARK:<6.MONITOR>TTPHDV.MAC.70,  16-Aug-82 14:31:44 by MURPHY
;TCO 6.1202 - Pass proper arg to TTCBF9 at TINET3.
; UPD ID= 994, SNARK:<6.MONITOR>TTPHDV.MAC.69,  18-Jul-82 13:52:18 by MURPHY
;TCO 5.1.1048 - Add TTCLSH to clear "set host" state when closing LL.
; UPD ID= 991, SNARK:<6.MONITOR>TTPHDV.MAC.68,  18-Jul-82 13:30:31 by MURPHY
;TCO 5.1.1047 - Put NOSKED before call to TNTCLS to interlock ULLCZQ.
; UPD ID= 990, SNARK:<6.MONITOR>TTPHDV.MAC.67,  18-Jul-82 13:28:02 by MURPHY
;TCO 5.1.1046 - Check TTNUS before call to TNUREC.
; UPD ID= 970, SNARK:<6.MONITOR>TTPHDV.MAC.66,  30-Jun-82 08:55:45 by GRANT
;TCO 5.1.1038 - Remove CALL SQIACK in DECnet NVT processor
; UPD ID= 328, SNARK:<6.MONITOR>TTPHDV.MAC.58,  19-Jan-82 15:23:21 by MURPHY
;TCO 5.1688 - report TTYSTP only once per line
; UPD ID= 851, SNARK:<6.MONITOR>TTPHDV.MAC.65,   6-Jun-82 13:29:44 by MURPHY
;TCO 6.1147 - Move bugdefs from BUGS.MAC to here and put them in-line.
; UPD ID= 819, SNARK:<6.MONITOR>TTPHDV.MAC.64,   3-Jun-82 07:42:18 by GRANT
;TCO 6.1154 - Fix failure return from CALL SNDCHK in MCSTRO.
;Change comment in CHKLLT.
; UPD ID= 800, SNARK:<6.MONITOR>TTPHDV.MAC.63,   1-Jun-82 08:31:46 by GRANT
;TCO 6.1148 - Remove code which breaks DECnet connection when a character is
;received on a line on which there is no job
; UPD ID= 771, SNARK:<6.MONITOR>TTPHDV.MAC.62,  19-May-82 17:20:19 by MILLER
;TCO 6.1066 AGAIN. Make RSP output work in secondary protocol
; UPD ID= 505, SNARK:<6.MONITOR>TTPHDV.MAC.61,  16-Mar-82 07:01:10 by MILLER
; UPD ID= 476, SNARK:<6.MONITOR>TTPHDV.MAC.60,  13-Mar-82 14:49:59 by MILLER
;TCO 6.1066 AGAIN. Add some of the RSP support code
; UPD ID= 458, SNARK:<6.MONITOR>TTPHDV.MAC.59,  11-Mar-82 11:47:06 by MILLER
;TCO 6.1066. Make MCSRV internal
; UPD ID= 328, SNARK:<6.MONITOR>TTPHDV.MAC.58,  19-Jan-82 15:23:21 by MURPHY
;TCO 5.1688 - report TTYSTP only once per line
; UPD ID= 150, SNARK:<6.MONITOR>TTPHDV.MAC.57,  21-Oct-81 12:14:07 by GRANT
;TCO 5.1594 - Move code from MCTYI2 and MCTYI3 into NSPSRV
; UPD ID= 193, SNARK:<5.MONITOR>TTPHDV.MAC.56,  17-Sep-81 13:19:49 by GRANT
;Reinstate the UPD ID=153 edit.  Also, it should say TCO 5.1490 no 5.1409
; UPD ID= 172, SNARK:<5.MONITOR>TTPHDV.MAC.55,  14-Sep-81 13:44:20 by GRANT
;Temporarily undo previous edit
; UPD ID= 153, SNARK:<5.MONITOR>TTPHDV.MAC.54,   8-Sep-81 17:31:11 by GRANT
;Needed for TCO 5.1490 - Remove segment number handling in MCTYI3
; UPD ID= 172, SNARK:<5.MONITOR>TTPHDV.MAC.55,  14-Sep-81 13:44:20 by GRANT
;Temporarily undo previous edit
; UPD ID= 153, SNARK:<5.MONITOR>TTPHDV.MAC.54,   8-Sep-81 17:31:11 by GRANT
;Needed for TCO 5.1409 - Remove segment number handling in MCTYI3
;Minor changes needed for handling LLOMSG queue in MCTYI3 and MCTYI2
; UPD ID= 138, SNARK:<5.MONITOR>TTPHDV.MAC.53,   2-Sep-81 16:38:01 by GRANT
;Eliminate cause of OKSKBG BUGHLT - in TNHCLS, NOSKED before calling TTCOB5
; UPD ID= 2307, SNARK:<5.MONITOR>TTPHDV.MAC.52,   8-Jul-81 11:20:59 by MURPHY
;CALL REQNS INSTEAD OF TNUSND FROM TTCHI
; UPD ID= 2295, SNARK:<5.MONITOR>TTPHDV.MAC.51,   6-Jul-81 13:50:54 by MURPHY
;DEBUG CODE TO RECORD DEAD LINKS
;PROCESS ALL INPUT IN TINET BEFORE QUITTING
; UPD ID= 2269, SNARK:<5.MONITOR>TTPHDV.MAC.50,  29-Jun-81 17:48:31 by MURPHY
;ANTX01
; UPD ID= 2190, SNARK:<5.MONITOR>TTPHDV.MAC.49,  11-Jun-81 15:59:54 by MURPHY
;CHANGE TQNx TO TMNx REFLECTING CHANGE IN MACSYM
;DITTO
; UPD ID= 1867, SNARK:<5.MONITOR>TTPHDV.MAC.45,  21-Apr-81 23:41:55 by MURPHY
;DITTO
; UPD ID= 1865, SNARK:<5.MONITOR>TTPHDV.MAC.44,  21-Apr-81 18:29:43 by MURPHY
;DITTO
; UPD ID= 1830, SNARK:<5.MONITOR>TTPHDV.MAC.43,  17-Apr-81 14:19:33 by MURPHY
;MAKE LINE SHUTOFF FOR 5 SECONDS INSTEAD OF 3
;REVISE SENDALL LOGIC
;REVISE STARTUP LOGIC
; UPD ID= 1752, SNARK:<5.MONITOR>TTPHDV.MAC.42,  20-Mar-81 13:32:21 by MURPHY
;Ditto
; UPD ID= 1745, SNARK:<5.MONITOR>TTPHDV.MAC.41,  19-Mar-81 23:11:04 by MURPHY
;Fix problems with line shut-off and XOFF/XON logic.
; UPD ID= 1663, SNARK:<5.MONITOR>TTPHDV.MAC.40,  11-Mar-81 16:30:30 by MURPHY
;Fix up some failures of DTEQ which were not handled
; UPD ID= 1554, SNARK:<5.MONITOR>TTPHDV.MAC.39,  11-Feb-81 17:33:25 by MURPHY
;MAKE SURE LINE GETS RESTARTED AFTER STOP BECAUSE INBFR OR TTBBUF FULL
; UPD ID= 1550, SNARK:<5.MONITOR>TTPHDV.MAC.38,  10-Feb-81 17:57:41 by MURPHY
;FIX XOFF DURING SYSTEM STARTUP PROBLEM
;CHANGE NAMES TO BLSUB., BLCAL.
;DITTO
; UPD ID= 1477, SNARK:<5.MONITOR>TTPHDV.MAC.35,  22-Jan-81 12:24:13 by MURPHY
;FIX TTQAD PROBLEMS
; UPD ID= 1377, SNARK:<5.MONITOR>TTPHDV.MAC.34,  22-Dec-80 18:25:37 by MURPHY
;<5.MONITOR>TTPHDV.MAC.33, 17-Dec-80 18:10:33, EDIT BY MURPHY
;TNUREC
; UPD ID= 1361, SNARK:<5.MONITOR>TTPHDV.MAC.32,  17-Dec-80 15:46:27 by MURPHY
;CHKLLT
;<5.MONITOR>TTPHDV.MAC.31, 12-Dec-80 11:11:34, EDIT BY MURPHY
;<5.MONITOR>TTPHDV.MAC.30, 12-Dec-80 10:34:51, EDIT BY MURPHY
;<5.MONITOR>TTPHDV.MAC.29, 12-Dec-80 10:23:26, EDIT BY MURPHY
;FLOW CONTROL
;<5.MONITOR>TTPHDV.MAC.28,  9-Dec-80 15:16:03, EDIT BY MURPHY
;CKMCOU
;<5.MONITOR>TTPHDV.MAC.27,  5-Dec-80 16:49:34, EDIT BY MURPHY
;VARIOUS MCB FIXES AND ENHANCEMENTS
;<5.MONITOR>TTPHDV.MAC.25, 24-Nov-80 16:46:49, EDIT BY MURPHY
;Requeue line if SQILS or SQIACK fails
;<5.MONITOR>TTPHDV.MAC.24, 21-Nov-80 18:29:16, EDIT BY MURPHY
;FLUSH LINK IF INPUT AND NO JOB
; UPD ID= 1301, SNARK:<5.MONITOR>TTPHDV.MAC.23,  19-Nov-80 17:05:35 by MURPHY
;LOCAL XON,XOFF OPTION FOR NVTS
; UPD ID= 1290, SNARK:<5.MONITOR>TTPHDV.MAC.22,  18-Nov-80 16:45:45 by MURPHY
;<5.MONITOR>TTPHDV.MAC.21, 31-Oct-80 17:37:34, EDIT BY MURPHY
;<5.MONITOR>TTPHDV.MAC.20, 30-Oct-80 22:59:18, EDIT BY MURPHY
;<5.MONITOR>TTPHDV.MAC.19, 21-Oct-80 12:10:07, EDIT BY MURPHY
;<5.MONITOR>TTPHDV.MAC.18, 20-Oct-80 17:12:52, EDIT BY MURPHY
;<5.MONITOR>TTPHDV.MAC.17, 20-Oct-80 14:40:25, EDIT BY MURPHY
;<5.MONITOR>TTPHDV.MAC.16,  7-Oct-80 15:27:36, EDIT BY MURPHY
;<5.MONITOR>TTPHDV.MAC.15,  6-Oct-80 11:32:21, EDIT BY MURPHY
; UPD ID= 1126, SNARK:<5.MONITOR>TTPHDV.MAC.14,   5-Oct-80 15:02:40 by MURPHY
;DITTO
;<5.MONITOR>TTPHDV.MAC.13,  3-Oct-80 14:04:57, EDIT BY MURPHY
; UPD ID= 1120, SNARK:<5.MONITOR>TTPHDV.MAC.12,   3-Oct-80 12:21:22 by MURPHY
;DITTO
; UPD ID= 1113, SNARK:<5.MONITOR>TTPHDV.MAC.11,   3-Oct-80 01:00:51 by MURPHY
;NVT IMPROVEMENTS
; UPD ID= 1077, SNARK:<5.MONITOR>TTPHDV.MAC.10,   1-Oct-80 10:37:44 by MURPHY
;RELEVANT END STATEMENTS FOR STKVAR, ETC.
; UPD ID= 1063, SNARK:<5.MONITOR>TTPHDV.MAC.9,  30-Sep-80 10:16:58 by MURPHY
;DITTO
; UPD ID= 1057, SNARK:<5.MONITOR>TTPHDV.MAC.8,  26-Sep-80 12:13:03 by MURPHY
;MCB FIXES
; UPD ID= 944, SNARK:<5.MONITOR>TTPHDV.MAC.7,  20-Aug-80 20:09:15 by MURPHY
;MCB FIXES
; UPD ID= 925, SNARK:<5.MONITOR>TTPHDV.MAC.6,  20-Aug-80 10:21:12 by MURPHY
;INCLUDE MCB DEVICE
; UPD ID= 699, SNARK:<5.MONITOR>TTPHDV.MAC.5,  25-Jun-80 17:23:34 by MURPHY
;REMOVE TTDBEF REDUNDANT SUBROUTINE
;MERGE TTFEDV AND TTDZDV FILES INTO TTPHDV
;CHANGE DEVICE VECTORING
; UPD ID= 645, SNARK:<5.MONITOR>TTFEDV.MAC.4,  16-Jun-80 12:09:09 by MURPHY
;CLEAN UP VECTOR COMMENTS
; UPD ID= 443, SNARK:<5.MONITOR>TTFEDV.MAC.3,  15-Apr-80 09:41:02 by KONEN
;TCO 4.1.1143 -- Check for XOFF before storing character in big buff.
; UPD ID= 405, SNARK:<5.MONITOR>TTFEDV.MAC.2,   3-Apr-80 16:06:55 by HALL
;CHANGES TO WRITE-PROTECT THE RESIDENT MONITOR:
;	CHANGE ALL REFERENCES TO TT1LIN TO EXPECT A TABLE
;<4.1.MONITOR>TTFEDV.MAC.52, 16-Nov-79 11:29:17, EDIT BY MILLER
;ASGALL NOW SKIPS
;<4.MONITOR>TTFEDV.MAC.51,  1-Nov-79 17:15:09, EDIT BY MILLER
;Previous edit lines deleted

;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY  BE  USED
;OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT  (C)  DIGITAL  EQUIPMENT  CORPORATION  1976, 1985.
;ALL RIGHTS RESERVED.


 	SEARCH TTYDEF,PROLOG
	TTITLE	(NRTSRV,NRTSRV,< - DECnet Network Remote Terminal Support>)

	RESCD
	SEARCH D36PAR,SCPAR

;THIS MODULE IS NECESSARY TO SUPPORT THE NETWORK REMOTE TERMINALS (NRT)
;OVER DECnet.

;SPECIAL DEFINITIONS

DEFSTR TTHLL,TTDEV,35,36	;LOGICAL LINK FOR THIS LINE (HOST SIDE)
                                ;TTULL (USER SIDE) IS DEFINED IN TTYSRV

;NOTE - TTMLN IS NOW DEFINED IN TTYDEF


;NRTACV defines the ACVAR to be used at all entries to NRTSRV, so that
;subroutines can use the ACs with assurance that they are correctly
;assigned.

DEFINE NRTACV,<	ACVAR <W1,W2,W3,TDB,NRB,SAB> >

COMMENT @

                         Theory of NRT Operation

Except for NRTINI, NRTSRV runs only at schedular level, so it needs
little more interlocking.

MCSRV gets called every tick.  MCSRV counts down an interval timer.  The
timer is reinitialized to some small number, say 3, every time it expires.

MCSRV only runs after its interval counter expires for two reasons:
it imposes less overhead if it runs less often, and it lets more input
& output build up and thus fills the DECnet messages better than it
would if it ran more frequently.  It is important that it run often
enough that the user not see any delay, the optimum setting seems to
be around 3 to 5 ticks.

When the interval timer expires, MCSRV checks for service requests.  It
checks for both input and output ready on any line for which service is
requested.

                A word about NETHOST and NETUSER

In this program the term NETHOST will be used for the computer which runs a
job or provides other computing resources.  The term NETUSER will be used
for the computer to which a terminal is attached.

@
;NRT Data Base Definitions

;The NRB is the NRT Data Block.  One is allocated for each active
;link to hold data associating the DECnet link with a TDB.

BEGSTR NR			;USUALLY INDEXED BY REGISTER NRB
	WORD  TDB		;DYNAMIC PTR TO ASSOCIATED TDB

	FIELD FLG,6		;FLAGS
	  BIT CFG		;SET IF CONFIG MSG HAS BEEN SENT
	  BIT REL		;THIS NRB IS BEING RELEASED
	  BIT USR		;0=NETHOST LINK, 1=USER NETLINK
	  BIT TRN		;THIS NRB IS IN TRANSITION
	  BIT DEA		;DEALLOCATE TDB.
	FIELD CHN,12		;DECnet CHANNEL NUMBER
	HWORD STS		;CURRENT STATUS OF DECnet LINK

	WORD  SJB		;POINTER TO THIS LINK'S SJB

	HWORD SIZ		;MAX CHARS IN A SEGMENT ON THIS LINK
        HWORD PSI               ;SCJSYS'S ORIGINAL PSI MASK FOR NETUSER LINK

	HWORD RID		;Remotes node ID

;	HWORD INA		;INACTIVITY TIMER FOR NETHOST LINK
ENDSTR
;RESIDENT STORAGE

	NRTOBJ==^D23		;NRT OBJECT TYPE
	NRTINT==3		;TICKS BETWEEN NRT SERVICE CHECKS
	INACTIVITY==^D120	;SECS 'TIL INACTIVE LINK IS DISCONNECTED


;The length of the record and the max record we will send are separately
;defined so that the compiled-in record buffer can be larger than the actual
;record we send so that we can poke the max to a larger value for performance
;tests to systems we know can handle the size.

	NRTRML==^D500		;BYTES IN A NRT MESSAGE
	NRTMXC==^D500		;MAX LENGTH OF MESSAGE WE WILL SEND

IFG NRTMXC-NRTRML,NRTMXC==NRTRML ;ASSURE WE DON'T GET CARRIED AWAY

RSI NRTDFT,<<FLD(^D9,PDGOL) ! FLD(^D6,PDDQT) ! FLD(^D50,PDIPR)>>
RSI NRTMAX,NRTMXC		;MAX SIZED RECORD WE'LL SEND (POKABLE)
RSI NRTINA,INACTIVITY		;NUMBER OF SECONDS INACTIVITY ALLOWED
RSI NRTINL,NRTINT		;NUMBER OF TICKS BETWEEN NRT SERVICES

RS  NRTPSQ,1			;FLAG TELLING MCSRV TO CALL SCTPSQ
RS  NRTINC,1			;NRT INTERVAL COUNTER, SEE MCSRV
RS  NRTCWN,1			;NRB FOR NRT LINK IN CW STATE
RS  NRTSJP,1			;PTR TO NRT HOST'S SJB
RS  NRTSAP,1			;PTR TO NRT'S SAB
RS  NRTBLW,1			;SAVED NRB PTR FOR BLOCKED LINK
RS  NRTBLP,2			;SAVED BYTE PTR "    "      "
RS  NRTBLC,1			;SAVED BYTE COUNT "  "      "
RS  NRTRCO,<<NRTRML+3>/4>	;PLACE TO BUILD OUTPUT RECORD
RS  NRTRCI,<<NRTRML+3>/4>	;PLACE TO BUILD INPUT RECORD
;CALLED FROM STRTOU, TELL MCSRV THAT TTYSRV HAS OUTPUT TO GO
; T2/ TTY DYNAMIC DATA BLOCK ADDRESS
; RETURN +2 TO PREVENT NORMAL OUTPUT START ACTION

;TTOTP is set here for MCB (NETHOST) lines and it is cleared in TTSND
;in TTYSRV when it has been called to send the last char, thus TTOTP
;is set while this line has a REQNS request pending.  The only reason
;to set TTOTP for MC lines is to prevent the overhead of REQNS calls
;for every character output.

MCSTRO::CALL REQNS		;REQUEST MCSRV SERVICE AT SCHED LEVEL
	SETONE TTOTP,(T2)	;OUTPUT IN PROGRESS, DON'T START AGAIN
	RETSKP			;'ALL DONE' RETURN

;SET UP TTY CHARACTERISTICS, GIVE US PLENTY OF OUTPUT BUFFERS, SINCE
;NETWORK SHOULD BE A FAST LINE.
;RETURNS +2 ALWAYS WITH
;	T3/ SPEED TO THINK OF THIS LINE HAS HAVING WHEN IT COMES TO ALLOCATION
;	T4/ NUMBER OF BUFFERS TO ALLOCATE
NRTSOF::MOVEI T3,^D9600		;USE BUFFERS LIKE A FAST LINE
	MOVE T4,IBFRC1		
	RETSKP

;CLEAR OUTPUT BUFFER - SEND ROTO-ROOTER DOWN LINE
; T2/ DYNAMIC PTR

MCCOBF::RET

;SEND XON - SEND ALLOCATION TO ALLOW USER TO SEND MORE INPUT IF NECESSARY
; T2/ STATIC PTR (LINE NUMBER)

MCSXON::RET

;SKIP IF OUTPUT BUFFER NOT EMPTY - CHECK FOR ALL ACKS, ETC.
; T2/ DYNAMIC PTR

MCSBEF::RET

;SEE IF SENDALL SHOULD HAPPEN ON SPECIFIED LINE
; T2/ STATIC PTR (LINE NUMBER)
; RETURN +1: SKIP THIS LINE
; RETURN +2: T2/ LINE NUMBER = DO THIS LINE
;	T2/ -1 = SKIP ALL LINES OF THIS TYPE

MCCKSA::SKIPG TTACTL(T2)	;LINE ACTIVE?
	RET			;NO, SKIP IT
	RETSKP

;HANGUP - BREAK CONNECTION, ETC.
; T2/ STATIC PTR (LINE NUMBER)

MCHNGU::SAVEAC <T2>
	CALL STADYN
	 RET			;ALREADY GONE
	LOAD T1,TTHLL,(T2)
	JUMPE T1,RTN		;IN CASE ALREADY GONE
	SETONE NRREL,(T1)       ;MARK LINE AS READY TO BE RELEASED
	CALLRET REQNS           ;REQUEST NRT SERVICE AT SCHED LEVEL

;CHECK FOR OUTPUT POSSIBLE ON LINE
;OUTPUT NOT POSSIBLE IF LOGICAL LINK HAS BEEN CLOSED
; T2/ DYNAMIC PTR
; RETURN +1: OUTPUT NOT POSSIBLE
; 	+2: OUTPUT OK

CKMCOU::TMNN TTHLL,(T2)		;LL STILL THERE?
	RET			;NO
	RETSKP			;YES
;ENABLE/DISABLE XOFF HANDLING IN USER SIDE
; T2/ DYNAMIC PTR
; TTFLGS(T2)/ TT%PGM BIT - ON IF LINE IN PAGE MODE

MCEXF::	RET

;TURN LINE OFF ON RECEIPT OF XOFF
; T2/ DYNAMIC PTR

MCLNOF:	RET

;TURN LINE ON AGAIN AFTER XOFF

MCLNON::RET

;CLOSE NET HOST CONNECTION
; T2/ TDB
;NRTWAK - Called when SCLINK thinks we might want to wake the user
;
; Call:	T1/ Old Status,,PSI Mask (with TTY static line # in it)
;	T2/ New Status,,Channel Number
;	T3/ Pointer to Session Control Job Block
;	T4/ Link identifier to pass to SCTWKQ
;
; Return:
;	RET			;Only return
;
; Uses: T1,T2,T3,T4
;
;SCLINK calls this routine (via SAWKA) when either the link state has changed
;or one of the status bits has changed from a zero to a one.
;
;If we have a terminal line associated with this logical link, its static line
;number will be in the PSI mask field in T1.  In this case, we don't have to
;ask DECnet to remember the wake for us, since it is simpler to call REQNS to
;request a call to MCSRV at schedular level.  That way both input and output
;wakes will go to the same place.
;
;If we do not yet have a teminal line, then this wake must be telling us of a
;connect message which matched a link in connect wait state.  In this case, we
;must call SCTWKQ to get DECnet to remember the wake for us.
				;SCJSYS CALLS NRTWAK FOR NETUSER LINKS
				;NRTNSF PASSES THIS ADDR TO SCLINK
NRTWAK::			; FOR NRTSRV'S NETHOST LINES
	HRRZ T2,T1		;GET LINE NUMBER THAT WE STORED IN PSI MASK
	JUMPN T2,NRTWK1		;JUMP IF WE HAVE A LINE NUMBER

;Here if we have a wake from a link in Connect Received state, for which
;we cannot yet have a terminal line number.

	MOVE T1,T4		;PASS LINK ID TO SCTWKQ
	CALL SCTWKQ		;ASK DECNET TO REMEMBER THIS LINK FOR US
	SETOM NRTPSQ		;CALL SCTPSQ NEXT MCSRV CALL
	RET			;RETURN TO DECNET

;Here if we have a wake from a link for which we already have a terminal
;line number.

NRTWK1:	ANDI T2,77777		;REDUCE TO LINE NUMBER ONLY
	CALL STADYN		;CHANGE T2 TO DYNAMIC POINTER
	  RET			;NOPE, MUST BE DETACHING OR CLOSING
	CALLRET REQNS1		;(T2) REQUEST MCSRV SERVICE FOR LINE
				;RETURN TO DECNET


;LOCAL ROUTINE TO REQUEST SUBSEQUENT SERVICE
; T2/ DYNAMIC PTR
; PRESERVES ALL ACS

REQNS::	SAVEAC <T3,T4>          ;PRESERVES ALL ACs
REQNS1:	LOAD T3,TINTL,(T2)	;GET LINE NUMBER
	IDIVI T3,^D36           ;FIND Nth BIT
	MOVE T4,BITS(T4)        ; IN TABLE
	IORM T4,TNETRQ(T3)      ;SET REQUEST FLAG FOR MCSRV
	RET                     ;ONLY RETURN
;NRTHBR - Subroutine to do the HIBERs.

;NRTHBR - Called by SCLINK to dismiss
;
; Call:
;	T1/ Pointer to SJB
;
; Return:
;	RET			;ONLY RETURN
;
; Uses: T1

NRTHBR:	BUG.(CHK,NVTNHB,TTPHDV,SOFT,<NRTHBR should never be called>,,<

Cause:	DECnet has called NRT's host service at its "hiber" address.
	This should never happen, since NRT always uses asynchronous
	calls to DECnet.

Action:	Find a DECnet call which has the .NSWAIt flag on and turn it
	off, being sure that the surrounding code can handle asynch
	I/O.  If none is found, DECnet must be in error.
>)
;TTSETH - Called from SCJSYS to connect a DECnet link to a TTY line
;
; T1/ Flags,,Escape Character
; T2/ TTY Line Number
; T3/ SJB Pointer for DECnet Link
; T4/ PSI MASK to restore on escape,,DECnet Channel Number
; RETURN +1: Failed, Invalid TTY Line or no memory for NRB
;	 +2: OK

;This function is called by the MTOPR .MOSNH to connect a TTY line to
;a DECnet link, both of which are already running.  The MTOPR is used
;by programs which SET HOST using the LCB NRT protocol.  TTYSRV
;detects the escape character and breaks the connection.

TTSETH::NRTACV                  ;ACVAR <W1,W2,W3,TDB,NRB,SAB>
	MOVE W1,T1		;SAVE FLAGS,,ESCAPE CHAR
	MOVE W2,T3		;SAVE SJB PTR
	MOVE W3,T4		;SAVE PSI MASK,,DECNET CHANNEL NUMBER
	CALL STADYN		;(T2)CHECK LINE, GET TDB
	 RETBAD(ATSX27)		;TERMINAL IS NOT OPEN
	MOVE TDB,T2		;SAVE DYNAMIC PTR TO TERMINAL DATA BLOCK
	MOVX T1,SA.LEN		;GET AN
	XCALL (XCDSEC,DNGWDZ)	; SAB
	 RETBAD (NSPX01)	;RESOURCE ALLOCATION FAILURE
	MOVE SAB,T1		;SAVE SAB POINTER

;	W1/	Flags,,Escape Character
;	W2/	SJB Pointer for DECnet link to be spliced
;	W3/	PSI Mask,,DECnet Channel Number
;	TDB/	Dynamic TDB Pointer for TTY to be spliced
;	SAB/	Pointer to private SAB

	MOVEI T1,NR.LEN		;LENGTH (WORDS) OF A NRT BLOCK
	XCALL (XCDSEC,DNGWDZ)	;GET SPACE
	 RETBAD(NSPX01)		;RESOURCE ALLOCATION FAILURE
	MOVE NRB,T1		;POINTER TO NEW NRB
	STOR W3,NRCHN,(NRB)	;STORE DECnet CHANNEL NUMBER
        HLRZS W3		;GET SCJSYS'S PSI MASK INTO RIGHT HALF
        STOR W3,NRPSI,(NRB)	;SAVE FOR TNUESC
	SETONE <NRUSR,NRCFG>,(NRB) ;THIS IS A USER LINK (FROM SET HOST PROGGIE)
				   ; WHICH DOESN'T SEND CONFIG MESSAGES
	STOR W2,NRSJB,(NRB)	;STORE USER'S SJB POINTER FOR NRTNSF
	STOR TDB,NRTDB,(NRB)	;STORE ASSOCIATED TDB POINTER IN NRB

	LOAD T1,TINTL,(TDB)	;GET STATIC LINE NUMBER AGAIN
	TXO T1,1B18		;FIX THIS NAME!  ASSURE NON-ZERO HALF-WORD
	STOR T1,SAAA1,(SAB)	;STORE NEW "PSI MASK" = 1B18 ! LINE #
	MOVEI T1,.NSFPI		;SET PSI MASK FUNCTION
	MOVEI T2,3		;FUNCTION + CHAN + 1 ARG
	CALL NRTNSF		;CALL DECnet
	 JRST TTSET1    	;?CONNECTION ABORTED BY THIRD PARTY?

;Read link status to find out segment size

	CALL NRTRSS		;READ SEGMENT SIZE INTO NRB
	 JRST TTSET1    	;?CONNECTION ABORTED BY THIRD PARTY?

;Now that the errors are out of the way, its OK to diddle the TDB

	SETONE TTPRM,(TDB)	;KEEP THIS TDB UNTIL LL RELEASED
	STOR W1,TTUEC,(TDB)	;SAVE ESCAPE CHAR
	TXNE W1,SH%LPM		;"LOCAL" PAGE MODE?
	IFSKP.
	  SETZRO TTNPM,(TDB)  	;NO 
	ELSE.
	  SETONE TTNPM,(TDB)  	;YES
	ENDIF.
	STOR NRB,TTULL,(TDB)	;SAVE PTR TO 'USER' NRB
	SETONE TTNUS,(TDB)	;TELL TTYSRV LINE IS IN NETUSER STATE
	MOVE T1,SAB		;RELEASE SAB
	XCALL (XCDSEC,DNFWDS)
	MOVE T2,TDB		;IF CTERM,
	LOAD CX,TLTYP,(T2)	;GET LINE TYPE
	CAIN CX,TT.CTH		;CTERM LINE ?
	CALL CTHNRT		;YES - POST READ
	RETSKP			;SUCCESS RETURN

;Here on error - deallocate SAB and return
TTSET1:	MOVE T1,SAB		;RELEASE SAB
	XCALL (XCDSEC,DNFWDS)
	RETBAD (NSPX08)
	ENDAV.			;END ACVAR FOR NRTACV AT NTSNH
;MCSRV - Called every Tick
;Called from configuration-dependent code in STG
;
;Call:	No special arguments
;	RET			;ALWAYS
;
;Changes T1 through T4

MCSRV::	SOSG NRTINC		;HAS INTERVAL COUNTER EXPIRED YET?
	SKIPN NRTSJP		;YES, HAS NRTINI BEEN CALLED?
	RET			;NO
	SKIPL SCTLOK		;YES, SESSION CONTROL LOCK AVAILABLE?
	RET			;NO, TRY EVERY TICK UNTIL WE GET IN NOW
	MOVE T1,NRTINL		;YES, GET INTERVAL LENGTH
	MOVEM T1,NRTINC		;REINITIALIZE THE INTERVAL COUNTER

	NRTACV                  ;RANGE OF THIS ACVAR <W1,W2,W3,TDB,NRB,SAB>
				; IS LONG
	MOVE SAB,NRTSAP		;DECnet-DEALING ROUTINES NEED THIS
	SKIPN NRTBLW		;IS THERE A BLOCKED LINK?
	 IFSKP.
	   CALL NRTUNB		;YES, UNBLOCK IT
	     RET		;STILL BLK'D, TRY AGAIN NEXT INTERVAL
	 ENDIF.			;ALL CLEAR NOW, TRY FOR MORE OUTPUT
	SKIPN NRTCWN		;IS THERE A LINK IN CW STATE?
	CALL NRTNEP		;NO, MAKE ONE IF WE CAN

;We know that we can safely deal with at least one link, since there
;is now no other blocked link, so the worst that can happen is that
;this link will become blocked and we'll have to try it again.

;Call SCTPSQ if there is a connect wait link which just got a connect
;message

	SETZ T1,		;LOAD A ZERO TO STORE IN NRTPSQ
	EXCH T1,NRTPSQ		;ANY LINKS ON SCTL'S QUEUE?
	JUMPE T1,MCSRV2		;NO
MCSRV1:	MOVE T1,NRTSJP		;YES, LOAD PTR TO NRT'S SJB
	CALL SCTPSQ		;DEQUEUE NEXT LINK REQUESTING SERVICE
	  JRST MCSRV2		;NO MORE
	SKIPN NRB,NRTCWN	;GET PTR TO CONNECT-WAITING LINK'S NRB
	BUG.(CHK,NVTWWN,TTPHDV,SOFT,<No NRTCWN Connect Wait Wake>,,<

Cause:	NRT's host service has been waked for a circuit which has no TTY
	line number associated with it, yet there is no NRB for a
	logical link in connect wait state.

Action:	Either the NRB pointer in NRTCWN has been stepped on or an active
	logical link has lost its TTY line number which should be in the
	DECnet PSI mask.

>)
	LOAD T1,NRCHN,(NRB)	;GET ITS DECnet CHANNEL NUMBER
	HRRZS T2		;ISOLATE CHN OF LINK WE'RE EXAMINING
	CAME T1,T2		;ARE WE DEALING WITH RIGHT LINK?
	BUG.(CHK,NVTWWC,TTPHDV,SOFT,<Wrong Channel on Connect Wait Wake>,,<

Cause:	NRT's host service has been waked for a circuit which is not
	the logical link in connect wait state and which has no TTY
	line number associated with it.

Action:	Either the connect wait link is out of phase and should be corrected
	or an active link has lost its TTY line number which should be
	in the DECnet PSI mask.

>)
	SETZ TDB,		;RIGHT CHANNEL, NO TTY YET
	CALL NRTLKS		;SERVICE THE LINK
	JRST MCSRV1		;CHECK FOR MORE ANSWERS FROM SCTPSQ
	;...
	;...
;Here to check for active TTY lines

MCSRV2:	MOVSI W1,-NTSQWD	;SCAN BIT TABLE FOR NET-USER LINES
MCSRV3:	SKIPE T1,TNETRQ(W1)
MCSRV4:	JFFO T1,MCSRV5		;JUMP IF ACTIVE LINE
	AOBJN W1,MCSRV3
	RET			;ALL LINES QUIET, RETURN TO SCHEDULAR

MCSRV5:	MOVE W2,BITS(T2)	;SAVE BIT FOUND
	ANDCAM W2,TNETRQ(W1)	;CLEAR REQUEST
	HRRZ T3,W1		;COMPUTE LINE NUMBER
	IMULI T3,^D36		;36 BITS IN A WORD
	ADD T2,T3		;LINE NUMBER IN T2
	CALL STADY		;(T2)IS IT ACTIVE?
	 JRST MCSRV6		;NO, TRY NEXT
	MOVE TDB,T2		;YES, T2 HAS DYNAMIC PTR FOR LINE
	LOAD T1,TLTYP,(TDB)	;GET TYPE OF THIS LINE
	CAIE T1,TT.MCB		;IS IT A NRT HOST LINE?
	 IFSKP.
	   OPSTR <SKIPE NRB,>,TTHLL,(TDB) ;YES, GET PTR TO ITS HOST NRB
	   CALL NRTLKS			  ;GO SERVICE THE LINK
	 ENDIF.
	LOAD NRB,TTULL,(TDB)	;LOAD UP NRB FOR 'USER' LINK
	JUMPE NRB,MCSRV6	;SKIP IT IF NO LINK
	TMNE TTNUS,(TDB)	;STILL A NETUSER LINE?
	CALL NRTLKS		;YES, GO SERVICE THE LINK

MCSRV6:	MOVN T1,W2		;LOOK AT REST OF BIT WORD ONLY
	ANDCA T1,TNETRQ(W1)	;IGNORE EARLIER BITS THAT HAVE COME ON
	JRST MCSRV4		; DURING THIS SCAN
;Routine to service a link according to its DECnet state
;Call
;	NRB/ Pointer to NRB
;	TDB/ Pointer to TDB
;
;Return:
;	RET			;ONLY RETURN

NRTLKS: TMNE NRREL,(NRB)        ;IS THIS NRB BEING RELEASED?
	CALLRET NRTREL		;YES, COMPLETE THE PROCESS

;	SETZRO NRINA,(NRB)	;ZERO THE INACTIVITY TIME

	MOVX T1,.NSFRS		;READ STATUS FUNCTION CODE
	MOVEI T2,3		;FUNCTION + CHAN + 1 ARG
	CALL NRTNSF		;READ LINK STATUS, STORE IT IN NRB
	  CALLRET NRTREL	;ERROR, CLEAN UP
	LOAD T1,NRSTS,(NRB)	;GET LINK'S STATUS WORD
	LOAD T1,NSSTA,+T1	;GET THE STATE FIELD FROM STATUS
	CAILE T1,NJFTLN		;A STATE WE UNDERSTAND?
	JRST NJFTBL+0		;NO, CALL ILLEGAL STATE BUG.
	CALLRET @NJFTBL(T1)	;CALL ROUTINE APPROPRIATE TO LINK STATE


DEFINE LNKSTA(code),<
	IFN <.-NJFTBL-.NSS'code>,<PRINTX ?NJFTBL is in wrong order for "code">
	IFIW NJFR'code		;;ADDRESS OF NJF ROUTINE
>;END DEFINE LNKSTA

NJFTBL:	IFIW NJFRIL		;ILLEGAL STATE
	LNKSTA CW		;CONNECT WAIT
	LNKSTA CR		;CONNECT RECEIVED
	LNKSTA CS		;CONNECT SENT
	LNKSTA RJ		;REMOTE REJECTED CONNECT INIT
	LNKSTA RN		;LINK IS UP AND RUNNING
	LNKSTA DR		;DISCONNECT RECEIVED
	LNKSTA DS		;DISCONNECT SENT
	LNKSTA DC		;DISCONNECT CONFIRMED
	LNKSTA CF		;NO CONFIDENCE
	LNKSTA LK		;NO LINK
	LNKSTA CM		;NO COMMUNICATION
	LNKSTA NR		;NO RESOURCES
NJFTLN==.-1-NJFTBL		;LENGTH OF TABLE

	PURGE LNKSTA
;Here for the states in which we just wait for something to happen

NJFRCS:				;CONNECT SENT, WAITING FOR CONFIRM/REJECT
NJFRDS:				;DISCONNECT SENT, WAITING FOR DC
NJFRCW:	RET			;CONNECT WAIT, WAITING FOR A CONNECT


;Here if the state is illegal

NJFRIL:	BUG.(CHK,NVTILS,TTPHDV,SOFT,<NRT link in unexpected state>,,<

Cause:	NRT's host service has been called by DECnet for a link in
	an unexpected state.

Action:	Determine whether the link indeed is in an unexpected state, or
	whether it is in a state which NRT must deal.  If the former,
	the problem is probably in DECnet, if the latter, code must
	be added to NRT.

>)
	CALLRET NRTREL
;NJFRDR - Service Routine for a link in DISCONNECT RECEIVED state
;
;Call:
;	NRB/ Pointer to Link's NRB
;	RET			;ALWAYS
;
;The link is in one of the "gone sour" states.  Call NRTREL to release
;or unsplice the link.

NJFRRJ:				;REJECTED
NJFRDR:				;DISCONNECT RECEIVED
NJFRDC:				;DISCONNECT CONFIRMED
NJFRCF:				;NO CONFIDENCE
NJFRLK:				;NO LINK
NJFRCM:				;NO COMMUNICATION
NJFRNR:				;NO RESOURCES
	CALLRET NRTREL		;RELEASE THE LINK ALTOGETHER
;NJFRCR - Service Routine for a link in CONNECT RECEIVED state
;
;Call:
;	NRB/ Pointer to Link's NRB
;	RET			;ALWAYS
;
;Now we have someone interested in this link, try to get a TDB for
;it.  If that succeeds, accept the link.

NJFRCR:				;CONNECT RECEIVED STATE PROCESSOR
	SAVEAC <P1>
	SETZM NRTCWN		;NO LINKS IN CW STATE NOW
	MOVX T1,RSNACR		;REMOTE NODE ACCESS NOT PERMITTED REASON CODE
	MOVE T2,FACTSW		;SEE IF DECNET
	TXNN T2,SF%MCB		; LOGINS ALLOWED
	JRST NJRCRF		;NO, GO ANNOUNCE THE FAILURE

;Get a TTY for this link

	CALL NGTTDB		;GET A NRT TDB
	 IFNSK.
	   MOVX T1,RSNRES	;NO RESOURCES REASON CODE IN T1
	   JRST NJRCRF		;FAILED, REJECT CONNECTION
	 ENDIF.
				;SUCCEEDED, LINE NUMBER IN T1, TDB IN TDB
	TXO T1,1B18		;TELL SCJSYS & SCNSPJ THAT THIS IS MINE
	STOR T1,SAAA1,(SAB)	;STORE AS "PSI MASK" FOR PRESENTATION AT
	MOVEI T1,.NSFPI		; NRTWAK WHEN SOMETHING INTERESTING HAPPENS
	MOVEI T2,3		;FUNCTION + CHAN + 1 ARG
	CALL NRTNSF		;SET THE PSI MASK
	  CALLRET NRTREL	;ERROR, CLEAN UP

;Get the connect info, which includes the remote host id (node address)

	SETZ P1,		;Clear node ID in case we cant get it
	MOVEI T1,.NSFRI		;Function is 'read connect info'
	MOVEI T2,2		;Function + channel
	CALL NRTNSF		;Get the info
	IFSKP.			;Success,
	  OPSTR <SKIPN T1,>,SACBP,(SAB) ; -get connect block pointer
	  ANSKP.		; -yes, there is a connect block
	    LOAD P1,CBNUM,(T1)	;  so get the node number
	    XCALL (XCDSEC,DNFWDS) ;  and deallocate the connect block
	ENDIF.
	STOR P1,NRRID,(NRB)	;Save node address for NTINF% jsys

;Accept the Connect

	SETZRO SAAA1,(SAB)	;NO USER DATA
	MOVEI T1,NRTRML		;GET MAX BYTES IN OUR RECORD
	STOR T1,SAAA2,(SAB)	;USE A MSG SEGMENT NO BIGGER THAN THAT
	MOVX T1,NSF.C0		;ELECT NO FLOW CONTROL FOR INPUT
	STOR T1,SAAA3,(SAB)	;ARG #3
	MOVX T1,.NSFAC		;ACCEPT FUNCTION CODE
	MOVEI T2,5		;FUNCTION + CHAN + 3 ARGS
	CALL NRTNSF		;ACCEPT THE CONNECT
	  CALLRET NRTREL	;ERROR, CLEAN UP

;Read link status to find out segment size

	CALL NRTRSS		;READ SEGMENT SIZE INTO NRSIZ
	  CALLRET NRTREL	;ERROR, CLEAN UP

	CALLRET NRTNEP		;HANG OUT A NEW CONNECT WAIT LINK

;We'll send a configuration message when we get a data request.
;Here on failure in Connect Received state processing

NJRCRF:	SETZRO SAAA1,(SAB)	;NO OPTIONAL DATA
	STOR T1,SAAA2,(SAB)	;STORE REASON CODE IN ARGUMENT BLOCK
	MOVX T1,.NSFRJ		;REJECT FUNCTION CODE
	MOVEI T2,4		;FUNCTION + CHAN + 2 ARGS
	CALL NRTNSF		;REJECT THE CONNECT
	  CALLRET NRTREL	;RELEASE THE LINK
	RET			;WE'LL RELEASE LINK WHEN DC COMES IN


;The configuration message sent out when we accept a connect

CFGLEN==10			;BYTES IN CONFIG MESSAGE
CFGMSG:	BYTE(8) 1,1,0,0,10,0,10,0
;	Config--' ^ ^ ^  ^ ^  ^ ^
;		  ? ? ?  | ?  | ?
;	System=TOPS20----'    |
;	Protocol=TOPS20-------'
;Subroutine to Read link status to find out segment size
;Call:
;	SAB/ Pointer to an SAB
;	NRB/ Pointer to an NRB
;Return:
;	+1 on DECnet error
;	+2 on success, with NRSIZ filled in

NRTRSS:	MOVX T1,.NSFRS		;READ STATUS FUNCTION CODE
	MOVEI T2,3		;FUNCTION + CHAN + 1 ARG
	CALL NRTNSF		;READ LINK STATUS
	  RET			;PROPOGATE ERROR RETURN
	LOAD T1,SAAA1,(SAB)	;GET LINK'S SEGMENT SIZE
	CAMLE T1,NRTMAX		;IS THAT TOO BIG FOR US?
	MOVE  T1,NRTMAX		;YES, LOAD UP OUR MAX
	CAILE T1,NRTRML		;HAS SOMEONE POKED THAT TOO BIG?
	MOVEI T1,NRTRML		;YES, LIMIT TO SIZE OF RECORD
	STOR T1,NRSIZ,(NRB)	;STORE FOR NRTOUT
	RETSKP			;SUCCESS RETURN
;NJFRRN - Service Routine for a link in RUN state
;
;Call:
;	NRB/ Pointer to Link's NRB
;	RET			;ALWAYS
;
;The link is running, see if any traffic needs to be transferred.

NJFRRN:				;LINK IS UP AND RUNNING
	LOAD TDB,NRTDB,(NRB)	;GET PTR TO TDB

;First, try some input, may free up some DECnet buffers for output

	LOAD T1,NRSTS,(NRB)	;GET DECnet STATUS LAST TIME WE HEARD
NJFRR1:	TXNN T1,NSNDA		;NORMAL DATA AVAILABLE?
	JRST NJFRR2		;NO, TRY OUTPUT
	CALL NRTIN		;YES, TRY TO READ SOME
	  JFCL			;IGNORE ERROR HERE

;See if there is any output requested and allowed now.  If we are not
;allowed to send to DECnet now, we exit without calling REQNS.  When
;DECnet again has resources and data requests for this link, it will
;call NRTWAK, which will call REQNS, so we don't need to poll every
;NRT cycle.

NJFRR2:	LOAD T1,NRSTS,(NRB)	;GET DECnet STATUS LAST TIME WE HEARD
	TXNN T1,NSNDR		;NORMAL DATA REQUESTED?
	RET			;NO, ALL DONE WITH THIS LINK

	TMNE NRCFG,(NRB)        ;NEED TO SEND A CONFIG MESSAGE?
	IFSKP.
	   CALL SNDCFG          ;YES, DO SO NOW AND SET NRCFG FLAG
	     RET                ;ERROR, DON'T LOOP FOREVER
	   JRST NJFRR2          ;SEE IF WE CAN STILL SEND MORE
	ENDIF.
	CALL NRTOUT		;NO, TRY TO SEND SOME DATA
	  TRNA			;BLOCKED, CAN'T DO ANY OUTPUT
	RET			;SUCCESS, RETURN

;Here if we are blocked and can't output the chars we have ready to go.

	MOVE T2,TDB		;SET UP FOR REQNS1
	CALLRET REQNS1		;REQUEST NRT SERVICE AGAIN NEXT CYCLE
;SNDCFG - Send a configuration message
;
;Call:
;	NRB/ Pointer to Link's NRB
;	TDB/ Pointer to TDB
;
;Return:
;	RET			;ERROR
;	RETSKP			;SUCCESS
;
;Send a configuration message

SNDCFG:	MOVEI T1,CFGLEN		;LENGTH OF MESSAGE TO SEND
	STOR T1,SAAA1,(SAB)	;STORE AS FIRST ARG
	MOVE T1,[POINT 8,CFGMSG] ;BYTE POINTER TO CONFIG MSG
	STOR T1,SAAA2,(SAB)	;STORE BYTE POINTER
	SETONE SAEOM,(SAB)	;SEND THIS MESSAGE NOW

	MOVX T1,.NSFDS		;DATA SEND FUNCTION
	MOVEI T2,5		;FUNCTION + CHAN + 3 ARGS
	CALL NRTNSF		;SEND CONFIG MESSAGE
	  RET			;ERROR, MAYBE TRY AGAIN LATER
	TMNN SAAA1,(SAB)	;IS REMAINING SEND COUNT ZERO?
	IFSKP.			;NO, COMPLAIN AND RETURN ERROR
	   BUG.(CHK,NVTPCL,TTPHDV,SOFT,<Partial Configuration Msg Loss>,,<

Cause:	NRT's host service failed to send the configuration message in
	a single DECnet message segment.

Action:	If the message segment size for the link is really less than
	ten bytes, it should probably be enlarged, else the code will
	have to deal with the possibility of segmented configuration
	messages.
>)
	   RET			;ERROR RETURN
	ENDIF.
	SETONE NRCFG,(NRB)	;YES, CONFIGURATION MSG HAS BEEN SENT
	RETSKP			;SUCCESS RETURN
;NRTOUT - Try to do some output from TTYSRV to DECnet
;
;Call, when DECnet is ready to receive from us:
;	NRB/ Pointer to Link's NRB
;	TDB/ Pointer to TDB
;	SAB/ Pointer to NRT's SAB
;Return:
;	RET			;BLOCKED, TRY AGAIN LATER
;	RETSKP			;SUCCESS

NRTOUT:	SAVEAC <W1,W2,W3>
NRTOT1:	LOAD W1,NRSIZ,(NRB)	;GET MAX BYTES IN A SEGMENT ON LINK
	JUMPE W1,RTN		;DON'T GET CONFUSED BY ZERO-LENGTH RECORD
	MOVE W2,[POINT 8,NRTRCO] ;BYTE POINTER TO RECORD WE'LL SEND
	XMOVEI W3,TTSND		;ASSUME WE'RE SENDING FROM OUTPUT STREAM
	TMNE NRUSR,(NRB)	;IS THIS A NETUSER LINK?
	XMOVEI W3,GTTCI		;YES, WE'RE SENDING FROM INPUT STREAM
NRTOT2:	MOVE T2,TDB             ;PASS DYNAMIC PTR TO TTSND
	CALL 0(W3)		;GET A CHAR FROM BIGBUF
	  JRST NRTOT3		;NO MORE, SEND WHAT WE'VE COLLECTED
	IDPB T1,W2		;STORE BYTE IN NRTRCO
	SOJG W1,NRTOT2		;GET MORE WHILE THERE'S ROOM

	LOAD W2,NRSIZ,(NRB)	;GET MAX AGAIN
	CALL NRTOTS		;SEND THAT MUCH
	  RET			;BLOCKED, TRY AGAIN LATER
	LOAD T1,NRSTS,(NRB)	;GET DECnet STATUS AFTER LAST SEND
	TXNN T1,NSNDR		;NORMAL DATA STILL REQUESTED?
	RETSKP			;NO, OUTPUT OK CALL TO NRTWAK WILL RESTART
	JRST NRTOT1		;YES, TRY FOR MORE

NRTOT3:	LOAD W2,NRSIZ,(NRB)	;GET MAX AGAIN
	SUB W2,W1		;CALC NUMBER WE COPIED
	JUMPLE W2,NRTOTX	;SUCCESS RETURN NOW IF NONE
				;FALL THROUGH TO NRTOTS TO SEND

;Subroutine to send data for NRTOUT

NRTOTS:	STOR W2,SAAA1,(SAB)	;STORE LENGTH OF DATA TO SEND
	MOVX T1,<<POINT 8,>!1B12> ;MAKE A 2-WORD BYTE POINTER
	STOR T1,SAAA2,(SAB)	;STORE AS FIRST WORD OF BYTE POINTER
	XMOVEI T1,NRTRCO	;GET EXTENDED ADDR OF RECORD
	STOR T1,SAAA3,(SAB)	;STORE AS 2ND WORD OF BYTE POINTER
	SETONE SAEOM,(SAB)	;SET THE END-OF-MESSAGE FLAG

	MOVX T1,.NSFDS		;DATA SEND FUNCTION
	MOVEI T2,5		;FUNCTION + CHAN + 3 ARGS
	CALL NRTNSF		;SEND THE DATA TO DECnet
	  JRST NRTOTE		;ERROR, GO DEAL WITH IT
	LOAD T1,SAAA1,(SAB)	;GET COUNT OF BYTES LEFT TO SEND
	JUMPE T1,NRTOTX		;SUCCESS RETURN NOW IF ALL SENT

;Here when the link is blocked (DECnet is out of buffers)

	MOVEM NRB,NRTBLW        ;SAVE PTR TO BLOCKED LINK
	MOVEM T1,NRTBLC		;SAVE COUNT OF BYTES STILL TO SEND
	LOAD T1,SAAA2,(SAB)	;GET BYTE POINTER
	LOAD T2,SAAA3,(SAB)	;GET SECOND WORD OF BYTE POINTER
	DMOVEM T1,NRTBLP	;SAVE BYTE PNTR FROM WHICH TO SEND
	RET			;FAIL RETURN: WE'RE BLOCKED

NRTOTE:	LOAD T1,SAAST,(SAB)	;GET NEW STATUS
	LOAD T1,NSSTA,+T1	;GET THE STATE FIELD FROM STATUS
	CAIE T1,.NSSRN		;IN RUN STATE?
	IFSKP.			;IF NOT, DON'T COMPLAIN
	   BUG.(CHK,NVTOUT,TTPHDV,SOFT,<NRT output to DECnet failed>,,<

Cause:	An output call to DECnet's SCTNSF entry point failed unexpectedly.

Action:	Examine the DECnet error code in register T1.

>)
	   CALLRET NRTREL
	ENDIF.
NRTOTX:	RETSKP			;DON'T COMPLAIN NOW, ITS CLOSING
;NRTUNB - Unblock a link which is blocked trying to output
;
;Call:	NRTBLW/ Pointer to NRB of blocked link
;	NRTBLC/ Count of bytes still to send
;	NRTBLP/ Two-word byte pointer from which to send
;
;Return:
;	RET		;If link still blocked, NRTBLx updated
;	RETSKP		;If link is now free, NRTBLW zeroed
;
;Uses T1-T4, SAB and the SAB

NRTUNB:	SAVEAC NRB
	SKIPN NRB,NRTBLW	;GET POINTER TO BLOCKED NRB
	RETSKP			;NONE?  LEAVE SUCCESSFULLY
	MOVE T1,NRTBLC		;GET COUNT OF BYTES TO SEND
	STOR T1,SAAA1,(SAB)	;STORE IN SAB
	DMOVE T1,NRTBLP		;GET DOUBLE-WORD BYTE PTR
	STOR T1,SAAA2,(SAB)	;PASS IN SAB
	STOR T2,SAAA3,(SAB)	;PASS SECOND WORD OF BYTE PTR
	SETONE SAEOM,(SAB)	;SET THE END-OF-MESSAGE FLAG

	MOVX T1,.NSFDS		;DATA SEND FUNCTION
	MOVEI T2,5		;FUNCTION + CHAN + 3 ARGS
	CALL NRTNSF		;SEND THE DATA TO DECnet
	  JRST NRTOTE		;ERROR, GO DEAL WITH IT
	LOAD T1,SAAA1,(SAB)	;GET COUNT OF BYTES LEFT TO SEND
	JUMPE T1,NRTUN1		;SUCCESS RETURN NOW IF ALL SENT

;Here when the link is still blocked (DECnet is out of buffers)

	MOVEM T1,NRTBLC		;SAVE NEW COUNT OF BYTES STILL TO SEND
	LOAD T1,SAAA2,(SAB)	;GET NEW BYTE POINTER
	LOAD T2,SAAA3,(SAB)	;GET NEW BYTE POINTER (2ND WORD)
	DMOVEM T1,NRTBLP	;SAVE BYTE PNTR FROM WHICH TO SEND
	RET			;FAIL RETURN

;Here when the link is unblocked

NRTUN1:	SETZM NRTBLW		;NO LINK IS NOW BLOCKED
	RETSKP			;SUCCESS RETURN
;NRTIN - Try to do some input from DECnet to TTYSRV
;
;Call, when DECnet has something for us to read:
;	NRB/ Pointer to Link's NRB
;	TDB/ Points to TDB
;	SAB/ Points to NRT's SAB
;Return:
;	RET			;IF FATAL ERROR
;	RETSKP			;SUCCESS

NRTIN:	SAVEAC <W1,W2,W3>
NRTIN1:	MOVEI W2,NRTRML		;GET MAX CHARS WE'LL ALLOW AT ONCE
	TMNN NRUSR,(NRB)	;IS THIS A NETUSER LINK?
	 IFSKP.
	   LOAD T2,TOMAX,(TDB)	;YES, GET OUTBUF SIZE
	   MOVEI T1,-2(T2)	;LEAVE 2 CHRS SLACK IN OUTBUF CAPACITY
	   SUB T1,TTOCT(TDB)	;COMPUTE REMAINING OUTBUF CAPACITY
	   ASH T2,-1		;AT LEAST HALF THE MAX CAPACITY
	   CAMGE T1,T2		; AVAILABLE NOW?
	   JRST NRTIN4		;NO, DON'T BOTHER DECNET FOR SMALL STUFF
	   CAMLE W2,T1		;YES, WILL NRTRML CHARS FIT IN OUTBUF?
	   MOVE W2,T1		;NO, USE SMALLER OF TWO
	ENDIF.
	STOR W2,SAAA1,(SAB)	;STORE LENGTH OF DATA TO REQUEST FROM NET
				;SAVE W2 FOR LENGTH CALC LATER
;At one time, it was thought that we should limit the host input stream
;to the difference between the max chars allowed for this line and the
;current chars in BIGBUF for this line.  That did work nicely for
;computer-computer communication, but it made the behavior seen by
;people at terminals odd:  the typist who typed too much just saw the
;line hang, even ^C would stick in the DECnet link.  So now we just pour
;it all into TTYSRV and let it 'ding' and throw excess chars away.

	MOVX T1,<<POINT 8,>!1B12> ;MAKE A 2-WORD BYTE POINTER
	STOR T1,SAAA2,(SAB)	;STORE AS FIRST WORD OF BYTE POINTER
	XMOVEI T1,NRTRCI	;GET EXTENDED ADDR OF INPUT RECORD
	STOR T1,SAAA3,(SAB)	;STORE AS 2ND WORD OF BYTE POINTER
	SETZRO SAEOM,(SAB)	;DON'T INSIST ON A WHOLE MESSAGE
				; (NRT USES STREAM MODE)
	MOVX T1,.NSFDR		;DATA RECEIVE FUNCTION
	MOVEI T2,5		;FUNCTION + CHAN + 3 ARGS
	CALL NRTNSF		;GET DATA FROM DECnet
	  JRST NRTINE		;ERROR, GO DEAL WITH IT

;Now we have some data, give it to TTYSRV

	MOVE W1,[POINT 8,NRTRCI] ;GET BYTE POINTER TO NRT'S RECORD
	OPSTR <SUB W2,>,SAAA1,(SAB) ;CALC # OF CHARS WE GOT
	JUMPE W2,NRTIN3		;NONE, SEE IF IT WAS A NULL RECORD IN STREAM
	XMOVEI W3,TTCHID	;ASSUME WANT TO PUT CHAR IN INPUT STREAM
	TMNE NRUSR,(NRB)	;IS IT A NETUSER LINK?
	XMOVEI W3,TCOU1		;YES, WANT TO PUT CHAR IN OUTPUT STREAM
NRTIN2:	ILDB T1,W1		;GET NEXT CHARACTER FROM NRTRCI
	MOVE T2,TDB		;GET LINE NUMBER WE'RE FEEDING
	CALL 0(W3)		;(T1,T2)PUT CHAR IN APPROPRIATE TTY STREAM
	 NOP			;IN CASE OF SKIP
	SOJG W2,NRTIN2		;LOOP UNTIL ALL PASSED TO TTYSRV

NRTIN3:	LOAD TDB,NRTDB,(NRB)	;RESTORE TDB POINTER TO TDB
	LOAD T1,NRSTS,(NRB)	;GET DECnet STATUS AFTER LAST SEND
	TXNE T1,NSNDA		;NORMAL DATA STILL AVAILABLE?
	JRST NRTIN1		;YES, GO GET IT
	RETSKP			;NO, SUCCESS RETURN NOW

;Here when we have more data from the net, but TTYSRV can't accept it yet.

NRTIN4:	MOVE T2,TDB		;SET UP FOR CALL TO REQNS
	CALL REQNS		;(T2)CALL FOR SERVICE NEXT TICK
	RETSKP			;CALL IT SUCCESS FOR NOW, NO ERRORS

;Here on DECnet error

NRTINE:	LOAD T1,SAAST,(SAB)	;GET NEW STATUS
	LOAD T1,NSSTA,+T1	;GET THE STATE FIELD FROM STATUS
	CAIE T1,.NSSRN		;IN RUN STATE?
	RET			;NO, DON'T COMPLAIN NOW, ITS CLOSING
	BUG.(CHK,NVTINP,TTPHDV,SOFT,<NRT Input to DECnet failed>,,<

Cause:	An input call to DECnet's SCTNSF entry point failed unexpectedly.

Action:	Examine the DECnet error code in register T1.

>)
	CALLRET NRTREL
;NRTNEP - Do an Enter Passive to hang out a new DECnet link
;
;Call:
;	SAB/	Pointer to NRT's SAB
;	NRTSJP/	Pointer to NRT host's SJB
;
;Return:
;	RET			;ALWAYS

NRTNEP:	SKIPE NRTCWN		;CONNECT WAIT LINK WAITING?
	RET			;YES, DON'T HANG OUT ANY MORE

	SAVEAC <NRB,W1>
	MOVEI T1,NR.LEN		;LENGTH OF A NRB BLOCK
	XCALL (XCDSEC,DNGWDZ)	;GET A NEW NRB
	  RET			;COULDN'T
	MOVE NRB,T1		;POINTER TO NRB
	SETZRO NRUSR,(NRB)	;THIS IS A NETHOST LINK
	MOVE T1,NRTSJP		;NETHOST ALWAYS USES THIS SJB
	STOR T1,NRSJB,(NRB)	;NETUSER USES USER'S SJB

;Get and set up a connect block

	MOVEI T1,CB.LEN		;GET PLACE TO PUT CONNECT BLK
	XCALL (XCDSEC,DNGWDZ)
	  JRST [MOVE T1,NRB	;CAN'T, DEALLOCATE NRB AS WELL
		XCALLRET (XCDSEC,DNFWDS)] ; FREE NRB
	MOVE W1,T1		;W1 POINTS TO CONNECT BLOCK
	MOVEI T1,PB.LEN		;LENGTH OF PDB
	STOR T1,PBSIZ,+CB.SRC(W1) ;STORE SIZE OF SOURCE PDB
	STOR T1,PBSIZ,+CB.DST(W1) ;STORE SIZE OF DEST PDB
	MOVEI T1,0		  ;GET FORMAT TYPE 0
	STOR T1,PBFOR,+CB.SRC(W1) ;STORE FORMAT OF SOURCE PDB
	STOR T1,PBFOR,+CB.DST(W1) ;STORE FORMAT OF DEST PDB
	MOVX T1,NRTOBJ		  ;GET NRTSRV'S OBJECT TYPE
	STOR T1,PBOBJ,+CB.SRC(W1) ;STORE OBJECT TYPE OF SOURCE PDB
	STOR T1,PBOBJ,+CB.DST(W1) ;STORE OBJECT TYPE OF DEST PDB

;Now set up the SAB for an Enter Passive

	STOR W1,SAAA1,(SAB)	;CONNECT BLK IS FIRST ARG
	STOR W1,SACBP,(SAB)	;STORE POINTER TO CONNECT BLOCK HERE TOO

	MOVX T1,.NSFEP		;ENTER PASSIVE FUNCTION CODE
	MOVEI T2,3		;FUNCTION + CHAN + 1 ARG
	CALL NRTNSF		;ENTER PASSIVE
	  JRST NRTNEE		;CAN'T, RETURN MEMORY & LEAVE

;Now collect returned info not already stored by NRTNSF

	LOAD T1,SAACH,(SAB)	;GET NEW CHANNEL NUMBER
	STOR T1,NRCHN,(NRB)	;STORE CHANNEL NUMBER IN NRB
	MOVEM NRB,NRTCWN	;WE NOW HAVE A LINK IN CONNECT WAIT STATE
NRTNEX:	MOVE T1,W1		;GET POINTER TO CONNECT BLOCK
	XCALLRET (XCDSEC,DNFWDS) ;FREE IT

;Here on error when we have to deallocate an NRB

NRTNEE:	MOVE T1,NRB		;DEALLOCATE NRB AS WELL
	XCALL (XCDSEC,DNFWDS)	;FREE NRB
	JRST NRTNEX		;FREE CONNECT BLOCK AS WELL
;NRTNSF - Call SCLINK's SCTNSF and handle the return
;
; Call:
;	T1/ Function code
;	T2/ Number of Args
;	NRB/ Pointer to NRB
;	SAB/ Pointer to SAB, usually same as NRTSAP, not always
;
; Return:
;	RET			;FAILED, CODE IN T1
;	RETSKP			;SUCCESS

NRTNSF:	STOR T1,SAAFN,(SAB)	;FUNCTION CODE
	STOR T2,SANAG,(SAB)	;STORE NUMBER OF ARGS
	SETZRO SAMFG,(SAB)	;FIELD THAT NEEDS TO BE ZEROED FOR SCLINK
	SETONE SAEVA,(SAB)	;BUFFERS WE PASS WILL BE IN
				; EXEC VIRTUAL ADDRESS SPACE
	LOAD T1,NRSJB,(NRB)	;GET SJB POINTER FOR THIS LINK
	STOR T1,SASJB,(SAB)	;NETHOST USES NRTSJP, NETUSER USES USER'S SJB
	LOAD T1,NRCHN,(NRB)	;GET CHANNEL NUMBER
	STOR T1,SAACH,(SAB)	;STORE IN SAB
	MOVE T1,SAB		;PASS SAB TO SCLINK
	CALL SCTNSF		;DO THE DECnet FUNCTION

	LOAD T1,SAERR,(SAB)	;GET THE ERROR CODE
	JUMPN T1,RTN		;ERROR RETURN IF NON-ZERO
	LOAD T1,SAAST,(SAB)	;GET NEW LINK STATUS
	STOR T1,NRSTS,(NRB)	;STORE IN NRB
	RETSKP			;SUCCESS RETURN
;Subroutines -- NGTTDB - Get a TDB for NRTSRV

;NGTTDB - Get a remote TDB and make it mine
;
; Call:	NRB/ Pointer to NRB
;
; Return:
;	RET			;FAILED
;	RETSKP			;SUCCESS, TDB/ POINTER TO TDB
;				;     AND T1/  LINE NUMBER
; Uses: P4

NGTTDB:	SAVEAC <W1,W2>
	MOVE W1,TT1LIN+TT.MCB	;GET FIRST MCB LINE
	NOSKD1			;FIND LINE RACE FREE
NGTTD1:	LOAD T1,TTSTY,(W1)	;GET LINE TYPE
	CAIN T1,TT.MCB		;STILL MCB?
	IFSKP.
	   OKSKED               ;NO, NO LINES LEFT
	   RET                  ;ERROR RETURN
	ENDIF.
	MOVE T2,W1              ;YES, STILL MCB, CHECK THIS LINE #
	CALL STADYN		;IS LINE AVAILABLE?
	 JUMPE T2,NGTTD2	;YES, NO DATA BLOCK NOW ASSIGNED
NGTTD3:	AOJA W1,NGTTD1		;NO, STEP TO NEXT LINE

NGTTD2:	MOVE T2,W1              ;RETRIEVE STATIC LINE # OF AVAIL LINE
	CALL TTYASG		;ASSIGN TDB (SCHED-LEVEL ENTRY POINT FOR NRT)
	 JRST NGTTD3		;COULDN'T, TRY ANOTHER LINE
	CALL STADYN		;SHOULD WORK NOW
	 JRST NGTTD3		;??
	MOVE TDB,T2             ;RETURN DYNAMIC POINTER IN TDB
	STOR TDB,NRTDB,(NRB)	;STORE NEW TDB DYNAMIC PTR IN NRB
	SETONE TCJOB,(TDB)	;INIT LINE
	SETONE TTPRM,(TDB)	;TDB PERMANENT UNTIL LINK RELEASED
	STOR NRB,TTHLL,(TDB)	;STORE POINTER TO THIS LINK'S NRB

	MOVEI T1,.CHCNC         ;LOAD UP A CONTROL-C
	CALL TTCHID		;SEND IT TO START JOB
	 JFCL                   ;IGNORE ERROR RETURN

	OKSKED
	MOVE T1,W1		;RETURN LINE NUMBER IN T1
	RETSKP                  ;DYNAMIC PTR IN REGISTER TDB
;NRTREL - Release a link and all that goes with it.
;
; Call:	NRB/ Pointer to the NRB to release
;
; Return:
;	RET			;ALWAYS, NRB IS DEALLOCATED
;
; Uses:

NRTREL:	TMNN NRUSR,(NRB)	;IS IT A NETUSER LINK?
	JRST NRTRL1		;NO, ITS A NETHOST LINK

;If its a NETUSER link, just dissociate TTY and link
;If NRDEA is set, deallocate the TDB.

;Setting the PSI MASK back to what SCJSYS requested is the way we tell
;SCJSYS that NRT is no longer interested in this link.  From now on, any
;data which comes in on this link will go through SCJSYS to the user
;program as for any normal DECnet link.

	JN NRDEA,(NRB),NRTRE1   ;Jump if deallocating TDB
       	LOAD T1,NRPSI,(NRB)	;GET SCJSYS'S PSI MASK FOR THIS LINK
        STOR T1,SAAA1,(SAB)	;STORE FOR SCTNSF
        MOVX T1,.NSFPI		;SET PSI MASK FUNCTION
	MOVEI T2,3		;FUNCTION + CHAN + 1 ARG
	CALL NRTNSF		;SET PSI MASK TO WHAT SCJSYS ASKED FOR
	  JFCL			;  Ignore error return - this may legally
				;  in some cases when someone else logs out the
				;  job.
NRTRE1:	MOVE T2,TDB
	CALL CTYMCB		;(T2) THIS THE CTY OR AN MCB LINE?
	IFSKP.
	   SETZRO TTPRM,(TDB)	;NO, BLOCK IS NO LONGER PERMANENT
	ENDIF.
	JUMPE TDB,NRTRLN	;RELEASE NRB NOW IF NO TDB YET
	LOAD T1,TTUEC,(TDB)	;GET ESCAPE CHARACTER
	SETZRO TTULL,(TDB)	;LOSE PTR TO NRB
	SETZRO TTUEC,(TDB)	;LOSE ESC CHAR SO WON'T SEND TO USER AGAIN
	SETZRO TTNUS,(TDB)	;TELL TTYSRV LINE NOT IN NETUSER STATE
	SETZRO TTOTP,(TDB)	;TELL TTYSRV LINE HAS NO OUTPUT COMING.
	MOVE T2,TDB		;POINT T2 TO TDB FOR TTCHID CALL
 	LOAD T3,TCJOB,(TDB)	;IF HAVE JOB
	CAIE T3,-1		; ON THIS LINE
	SKIPN T1		;  AND THERE IS AN ESCAPE CHAR
	TRNA			;NO.
	CALL TTCHID		;(T1,T2) GIVE IT AS INPUT TO WAKE NRT JOB
	  NOP
	TMNN NRDEA,(NRB)        ;Deallocating TDB ?
	IFSKP.
	  MOVE T2,TDB		;Yes,
	  CALL TTYDED		; do so.
	ENDIF.
	CALL NRTRLN		;RELEASE NRB.
;	LOAD T1,SAAST,(SAB)	;SEE IF WE NEED TO GIVE A WAKE.
;	TXNN T1,<NSIDA+NSNDA>	;ANY DATA AVAILABLE ?
;	IFSKP.
;	  SAVEAC <T5>		;YES
;	  MOVE T5,T1 		;STATUS
;	  ANDX T5,<NSIDA+NSNDA>	; CHANGES
;	  LOAD T2,SAACH,(SAB)	;PORT #
;	  HRL T2,T1		;NEW STATUS
;	  MOVX T3,<NSIDA+NSNDA>	;MAKE UP OLD STATUS - NEW STATUS EXCEPT
;	  TXZ T1,<NSIDA+NSNDA>	; FOR DATA AVAILABLES
;	  HRLZS T1		;  IN LEFT HALF
;	  HRRZ T1,$SAAA1,(SAB)	;PSI MASK IN RIGHT HALF
;	  LOAD T3,SASJB,(SAB)	;SJB
;	  LOAD T4,SASLB,(SAB)	;LINK IDENTIFIER.
;	  CALL SCWAKE		;(T1-T5) GIVE WAKE.
;	ENDIF.
	RET			;DONE

;If its a NETHOST link, detach the TTY

NRTRL1:	OPSTR <SKIPN TDB,>,NRTDB,(NRB) ;ANY TDB HERE?
	JRST NRTRLL		;NO, JUST RELEASE THE LOGICAL LINK
	SETZRO TTHLL,(TDB)	;REMOVE 'HOST' NRB POINTER, TELLING MCSRV
				; THIS IS NO LONGER A NRT LINE
	TMNE TTNUS,(TDB)	;IS THIS TDB ALSO NRTed OUT?
	CALL [SAVEAC NRB	;YES, SAVE HOST NRB WHILE WE DEAL WITH SERVER
	      LOAD NRB,TTULL,(TDB) ;GET POINTER TO USER NRB
	      JUMPE NRB,RTN	;LEAVE IF NOT REALLY A TWO-LINKED TDB
	      CALLRET NRTREL]	;RELEASE USER LINK, THEN RETURN
				; TO RELEASE HOST LINK
	NOSKD1			;NO SCHED FOR TTCOB5'S OKSKD1
	CHNOFF DLSCHN		;TURN OF DTE INTERRUPT CHANNEL
	MOVE T2,TDB             ;SET UP TDB PTR FOR TTCOB5
	CALL TTCOB5		;FLUSH OUTPUT (DOES CHNON AND OKSKD1)
	SETZRO TTOTP,(TDB)	;CLEAR OUTPUT ACTIVE
	LOAD T2,TINTL,(TDB)     ;GET LINE NUMBER
	CALL NTYCOF		;DO CARRIER OFF EVENT
	LOAD T3,TCJOB,(TDB) 	;GET CONTROLLING JOB
	SETZRO TTPRM,(TDB)      ;TDB NO LONGER PERMANENT
	CAIE T3,-1		;IS THERE A CONTROLLING JOB?
	JRST NRTRLL		;YES, DONE
	MOVE T2,TDB		;NO, GET DYNAMIC PTR
	CALL TTCBF9		;CLEAR OUTBUF
	LOAD T2,TINTL,(TDB)     ;GET LINE NUMBER
	CALL TTYDE0		; AND DEALLOCATE DATA BLOCK
	 NOP

;Here to free the NRB and its associated DECnet link, we will hear no more
;from it after the ReLease call.

NRTRLL:	MOVX T1,.NSFRL		;RELEASE FUNCTION CODE
	MOVEI T2,2		;FUNCTION + CHAN + NO ARGS
	CALL NRTNSF		;RELEASE THE LINK
	  JFCL			;IGNORE ERROR RETURN

NRTRLN:	MOVE T1,NRB		;ADDRESS OF NRB
	SETZ NRB,               ;DON'T LET CALLERS USE NRB
	XCALLRET (XCDSEC,DNFWDS) ;FREE THE NRB

	ENDAV.                  ;END OF NRTACV IN MCSRV, WAY BACK
;TNUKIL is called by TTYSRV when a NETUSER line is detached.
;It sets flags (NRTRN) which causes MCSRV to clean up
;The flag also causes TTYSRV to throw away all input which occur in the
;interim.

;T2/ TDB
;Returns +1 on failure with error in T1
;Returns +2 on success

TNUKIL::SAVEAC <T1>
        LOAD T1,TTULL,(T2)	;GET POINTER TO 'USER' NRB
        JUMPE T1,RSKP          	;LEAVE NOW IF NO ASSOCIATED LINK
	SETONE NRTRN,(T1) 	;SAY IN TRANSITION.
	SETONE NRREL,(T1)	;QUEUE UP REQUEST FOR RELEASE.
	SETONE NRDEA,(T1)	;SAY DEALLOCATE.
	CALL REQNS		;(T2)
	RETSKP
;HANDLE LINE IN NET USER STATE

TTMCNU::LOAD CX,TLTYP,(T2)	;GET LINE TYPE
	CAIN CX,TT.CTH		;CTERM LINE ?
	CALL CTHNRT		;YES - POST READ
	LOAD T4,TTULL,(T2)	;GET NRB POINTER
	CALL DINTRN		;(T4) IN TRANSITION ?
	 RETSKP			;YES. DROP THE CHARACTER.
 	CALL TTCHXX		;CHECK FOR XON, XOFF
	 IFNSK.
	   JN TTNPM,(T2),RSKP	;IT WAS, FLUSH THE CHAR IF OLD MODE
	 ENDIF.
	LOAD T4,TTUEC,(T2)	;GET NETUSER ESCAPE CHARACTER
	XOR T4,T1		;IS THIS IT IN T1?
	JXN T4,177,TTMCI1	;JUMP IF NOT
 	CALL TNUDIE		;IN TRANSITION. QUEUE UP REQUEST FOR MCSRV.
	RETSKP



;TNUDIE is called by TTYSRV when a NETUSER line escapes.
;It sets a flag (NRTRN) which causes MCSRV to clean up
;The flag also causes TTYSRV to throw away all input which occur in the
;interim.

;T2/ TDB
;ONLY RETURN IS +1

TNUDIE::SAVEAC <T1>
        LOAD T1,TTULL,(T2)	;GET POINTER TO 'USER' NRB
        JUMPE T1,RTN           	;LEAVE NOW IF NO ASSOCIATED LINK
	SETONE NRTRN,(T1) 	;SAY IN TRANSITION.
	SETONE NRREL,(T1)	;QUEUE UP REQUEST FOR RELEASE.
	CALLRET REQNS		;(T2)


;IS THIS NRB IN TRANSITION ?
;CALL DINTRN
;RETURN +2 IF NRB IS NOT IN TRANSITION
;RETURN +1 IF NRB IS IN TRANSITION
DINTRN::TMNE NRTRN,(T4)     	;THE BIT
	RET			;IN TRANSITION.
	RETSKP			;NOT IN TRANSITION.
;NRTINI - Initialize NRT Host

;Here to set up NRT host object for DECnet

;Call:	No arguments
;	RET			;ALWAYS

;Here to initialize the NRT data base.  This is about the only part of
;the NRT service that does not run at schedular level.

NRTINI::                        ;CALLED FROM D36COM (D36INI)
	NRTACV                  ;ACVAR <W1,W2,W3,TDB,NRB,SAB>
	EA.ENT			;NRTSRV RUNS IN SECTION 1

	MOVX T1,SA.LEN		;LENGTH OF AN SAB
	XCALL (XCDSEC,DNGWDZ)	;GET WORDS FOR OUR SA BLOCK
	 BUG.(HLT,NVTSAB,TTPHDV,SOFT,<No memory for NRT's SAB>,,<

Cause:	NRT's initialization code was unable to get resident free
	space to build its control blocks.

Action:	Find out why there is so little resident free space so early
	in the system's life.

>)
	MOVE SAB,T1		;USE REGISTER SAB TO POINT TO SAB
	MOVEM SAB,NRTSAP	;STORE POINTER TO SCLINK ARG BLK

;We will elect No Flow Control on incoming links.

	MOVE T1,NRTDFT		;GET DEFAULT GOAL,QUOTAS
	SETZM NRTSJP		;IN CASE WE FAIL, SIGNAL TO OTHERS
	CALL MAKSJB		;GO MAKE AN SJB
	 BUG.(HLT,NVTSJB,TTPHDV,SOFT,<No memory for NRT's SJB>,,<

Cause:	NRT's initialization code was unable to get resident free
	space to build its control blocks.

Action:	Find out why there is so little resident free space so early
	in the system's life.

>)
	STOR SAB,SJSAB,(T1)	;SAVE SAB POINTER IN SJB
	MOVEM T1,NRTSJP		;SAVE POINTER TO NRT'S SJB

	XMOVEI T1,NRTHBR	;POINT TO THE HIBER ROUTINE (BUG.)
	STOR T1,SAHBA,(SAB)	;STORE IN THE HIBER ADDRESS ARGUMENT
	XMOVEI T1,NRTWAK	;GET ADDRESS OF WAKE HANDLER
	STOR T1,SAWKA,(SAB)	; AND TELL SCLINK ABOUT IT
	RET			;RETURN, NRT INITIALIZATION IS DONE

	ENDAV.                  ;END OF NRTACV AT NRTINI

;MCRRH - NRT device dependent "return remote host" code
;
; Given the line #, returns the originating hostname, line and
; network type. Places this info in the users NTINF% .NWRRH 
; argument block.  NTINF has already checked the user arguments 
; for validity.
;
; Call with T1/ address of internal arg block
;
;   ARG+.NWABC/ # of bytes available for host name
;   ARG+.NWFNC/ not used
;   ARG+.NWNNP/ byte pointer to store hostname string
;   ARG+.NWLIN/ address of dynamic data for line
;   ARG+.NWTTF/ flags, and network and terminal types
;   ARG+.NWNNU/ node # word 1
;   ARG+.NWNU1/ node # word 2
;
; Returns + 1 on error with T1/ error code
;	  + 2 on success

	SWAPCD

MCRRH::	SASUBR <UAB>
	MOVEM T1,UAB		;SAVE OUTPUT POINTER
	MOVX T4,NW%DNA		;SET NETWORK TYPE
	DPB T4,[POINT 9,.NWTTF(T1),17] ;STORE NETWORK TYPE
	MOVE T2,.NWLIN(T1)	;GET DYNAMIC DATA ADR
	NOSKED
	LOAD T3,TTHLL,(T2)	;GET LINK INDEX
	JUMPE T3,MCRRH3		;IN CASE ALREADY GONE
	LOAD T4,NRRID,(T3)	;GET DECNET ADDRESS 
	OKSKED	
	MOVEM T4,.NWNNU(T1)	;SAVE IT AWAY
	JUMPE T4,MCRRH4		;IF ZERO - NO HOST NAME
	MOVE T1,T4		;PUT ADDRESS WHERE SCTA2N WANTS IT
	CALL SCTA2N		;CONVERT # TO SIXBIT NAME
	IFNSK.
MCRRH4:	 MOVE T3,UAB		;GET ARG BLOCK ADDRESS
	 MOVE T2,.NWNNP(T3)	;GET BYTE POINTER
	 SETZ T3,		;NO KNOWN NODE NAME FLAG
	 JRST MCRRH2		;COULDN'T
	ENDIF.
	MOVE T3,UAB		;GET ARG BLOCK ADDRESS
	MOVE T2,.NWNNP(T3)	;GET POINTER TO OUTPUT STRING
	CALL GETSIX		;CONVERT SIXBIT TO ASCII
MCRRH2:	SETZ T1,
	IDPB T1,T2		;DEPOSIT A NULL
	MOVE T1,UAB		;GET POINTER TO USER ARG BLOCK
	MOVX T2,NW%NNN		;GET "NO NODE NAME KNOWN" FLAG
	SKIPN T3 		;GOT A NODE NAME ?
	IORM T2,.NWTTF(T1)	;NO - SET THE "NO NODE NAME KNOWN" FLAG
	RETSKP

MCRRH3:	OKSKED
	MOVE T1,UAB		;GET POINTER TO ARG BLOCK
	MOVE T2,.NWNNP(T1)	;GET POINTER TO OUTPUT STRING
	SETZ T3,		;NO NODE NAME
	CALLRET MCRRH2		;UPDATE HOSTNAME STRING, AND RETURN



	TNXEND
	END