Google
 

Trailing-Edge - PDP-10 Archives - BB-J713A-BM - 4-sources/netser.mac
There are 13 other files named netser.mac in the archive. Click here to see a list.
;<4.ARPA-UTILITIES>NETSER.MAC.8,  4-Jan-80 09:47:17, EDIT BY R.ACE
;UPDATE COPYRIGHT DATES
;<4.ARPA-UTILITIES>NETSER.MAC.7, 11-Oct-79 11:39:13, Edit by LCAMPBELL
; Update version and edit numbers for release 4
;<4.ARPA-UTILITIES>NETSER.MAC.6,  9-Jan-79 13:56:37, Edit by LCAMPBELL
; Update copyright notice
;<LCAMPBELL>NETSER.MAC.3,  6-Oct-78 09:07:11, Edit by LCAMPBELL
;<LCAMPBELL>NETSER.MAC.2,  5-Oct-78 21:39:21, Edit by LCAMPBELL
; Use GTNCP instead of GDSTS to get foreign host and socket
;<3-CLEMENTS>NETSER.MAC.5, 20-Aug-78 23:09:06, EDIT BY CLEMENTS
;<3-CLEMENTS>NETSER.MAC.4, 18-Aug-78 14:20:19, EDIT BY CLEMENTS
;<3-CLEMENTS>NETSER.MAC.1, 13-Aug-78 22:47:38, EDIT BY CLEMENTS
; CHANGE FOR LONG HOST NUMBERS
;<3.ARPA-UTILITIES>NETSER.MAC.5, 14-Nov-77 10:22:17, EDIT BY CROSSLAND
;CORRECT COPYRIGHT NOTICE
;<3.ARPA-UTILITIES>NETSER.MAC.4, 26-Oct-77 02:40:19, EDIT BY CROSSLAND
;UPDATE COPYRIGHT FOR RELEASE 3
;<3.ARPA-UTILITIES>NETSER.MAC.3,  5-Oct-77 00:11:08, EDIT BY CROSSLAND
;REMOVE CONDITIONAL AROUND NTELNET SOCKET
;<A-SOURCES>NETSER.MAC.3, 20-Dec-76 13:30:54, EDIT BY CLEMENTS
;<A-SOURCES>NETSER.MAC.2, 17-Dec-76 12:06:55, EDIT BY CLEMENTS
;<2MURPHY>NETSER.MAC.41, 20-Sep-76 15:53:25, EDIT BY MURPHY
;<SOURCES>NETSER.FAI;56    20-May-76 14:33:10    EDIT BY CLEMENTS
; Increase scale factor on timeouts in CRPROC by a factor of 2
;<SOURCES>NETSER.FAI;55    12-May-76 11:15:31    EDIT BY ROSENBERG
; Invent and use "NOKILL" to prevent interference while cleaning up
;<TOMLINSON>NETSER.FAI;1    10-APR-74 23:14:22	EDIT BY TOMLINSON
; ADDED LOGGER FOR SOCKET 23
;<SOURCES>NETSER.FAI;51    16-JAN-73 12:35:03	EDIT BY TOMLINSON
;<TOMLINSON>NETSER.FAI;1     8-JAN-73 15:46:43	EDIT BY TOMLINSON
; CHANGED SOCKET NUMBERS
;<TOMLINSON>NETSER.FAI;7    12-JUL-72 16:09:16	EDIT BY TOMLINSON


;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 Digital Equipment Corporation, Maynard, Mass.


	TITLE NETSER
	SEARCH MONSYM,MACSYM
	SALL
	.DIRECT FLBLST
	.REQUIRE SYS:MACREL

VWHO==0			;LAST EDITED BY DEC
VMAJOR==4		;MAJOR VERSION #
VMINOR==0		;REVISION #
VEDIT==6		;EDIT NUMBER

	LOC	<.JBVER==137>
VERSIO:	<VWHO>B2+<VMAJOR>B11+<VMINOR>B17+VEDIT ;VERSIONS FOR TYPEOUT
	RELOC
;ROUTINE MECHANICS

	COMMENT \
STACK FRAME PICTURE

		..
		ARG N-1
		ARG N
		NARGS+1,,NARGS+1
		RETURN PC
	FREG -)	SAVED FREG
		SAVED AC'S
		LOCAL STORAGE
	P -)	LAST WORD OF LOCAL STORAGE
\

DEFINE ROUTINE (NAME,ACARG,STKARG,LOCALS,REGS,%EXIT)<
NAME:
	PUSH P,FREG		;;PRESERVE FREG
	MOVE FREG,P		;;SETUP FREG FOR THIS ROUTINE
	.NAC==0			;;COUNT PRESERVED ACS
	IRP REGS,<
	  PUSH P,P1+.NAC	;;PRESERVE AN AC
	  REGS==P1+.NAC		;;DEFINE LOCAL SYMBOL
	  .NAC=.NAC+1>
	IFG .NAC-NPAC,<PRINTX NAME - TOO MANY AC LOCALS>
	.NSTK==.NAC		;;ACCOUNT SPACE USED SO FAR
	.NLOC==0		;;COUNT LOCAL STORAGE
	IRP LOCALS,<
	.DOLOC (LOCALS)>
	.DOEX (\.NLOC,\.NAC,<ACARG>,<STKARG>,<LOCALS>,<REGS>,%EXIT) ;;DEFINE ENDR
	IFG .NLOC,<ADD P,[.NLOC,,.NLOC]> ;;ALLOCATE SPACE FOR LOCALS
	DEFINE EXIT <%EXIT>	;;DEFINE EXIT TAG
	CNTARG (<ACARG>,.NACA)	;;COUNT ACARGS
	CNTARG (<STKARG>,.NSTKA) ;;COUNT STKARGS
	IFG .NACA-NACA,<PRINTX NAME - TOO MANY AC ARGS>
	.LOC==3+.NACA+.NSTKA	;;LOC OF FIRST ARG
	..A==J1			;;FIRST AC FOR AC ARGS
	IRP ACARG,<
	  .LOC=.LOC-1
	  ACARG==..A		;;DEFINE LOCAL SYMBOL FOR AC
	  MOVE ACARG,-.LOC(FREG) ;;PUT VALUE IN AC
	  ..A=..A+1>
	IRP STKARG,<
	  .LOC=.LOC-1
	  .DEFSA (STKARG,\.LOC)> ;;DEFINE SYMBOL
   >

DEFINE CNTARG (ARGS,SYM)<
	SYM==0
	IRP ARGS,<
	  SYM=SYM+1>>

DEFINE .DEFSA (NAM,LOC)<
  DEFINE NAM <-^O'LOC(FREG)>>

  DEFINE .DOLOC (ARG)<
	.DOLC2 (ARG)>		;;PEEL OFF ANGLEBRACKETS IF ANY

DEFINE .DOLC2 (NAM,SIZ)<
    IFB <SIZ>,<.DOLC1 NAM,1>
    IFNB <SIZ>,<.DOLC1 NAM,SIZ>>

  DEFINE .DOLC1 (NAM,SIZ)<
	.NS0==.NSTK+1		;;FIRST WORD OF THIS LOCAL
	.NSTK=.NSTK+SIZ
	.NLOC=.NLOC+SIZ
	.DEFNM (NAM,\.NS0)>

  DEFINE .DEFNM (NAM,LOC)<
	DEFINE NAM <^O'LOC(FREG)>>

  DEFINE .DOEX (NLOC,NAC,ACSYM,STKSYM,LOCSYM,REGSYM,TAG)<
    DEFINE ENDR <
TAG:	IFG NLOC,<SUB P,[NLOC,,NLOC]> ;;REMOVE LOCAL STORAGE
	JRST .POP'NAC		;;POP PRESERVED ACS AND RETURN
	.PURG <ACSYM>		;;PURGE SYMBOLS
	.PURG <STKSYM>
	.PURG <LOCSYM>
	.PURG <REGSYM>
   >>				;;END 2 DEFINES

DEFINE .PURG (SYMS)<
   IRP SYMS,<
	.PURG1 SYMS>>

  DEFINE .PURG1 (SYM)<
	.PURG2 SYM>		;;REMOVE ANGLEBRACKETS IF PAIR

  DEFINE .PURG2 (SYM,JUNK)<
	PURGE SYM,SYM>

DEFINE SKIPRT <
	AOS -1(FREG)>

DEFINE RETURN <-1(FREG)>

DEFINE SCALL (NAME,ARGS)<
	.NARG==0
	IRP ARGS,<
	PUSH P,ARGS
	.NARG==.NARG+1>
	PUSH P,[.NARG+1,,.NARG+1] ;;RECORD SPACE USED
	PUSHJ P,NAME
   >
;STRUCTURE

;TASKZ

DEFSTR TZPTRS,0,35,36
DEFSTR PRMBIT,1,0,1
DEFSTR USRTSK,1,1,1
DEFSTR TTYBIT,1,2,1
DEFSTR BSYBIT,1,3,1
DEFSTR LSKT,1,35,32
DEFSTR TSKNAM,2,35,36
DEFSTR TJFN,3,5,6
DEFSTR LIFTIM,3,11,6
DEFSTR PROCNT,3,17,6
DEFSTR FORKSA,3,35,18

;PROCZ

DEFSTR PZPTRS,0,35,36
DEFSTR FORK,1,17,18
DEFSTR TASKP,1,35,18
DEFSTR KILTIM,2,35,36
DEFSTR FAILRE,3,17,18
DEFSTR BSYJFN,3,18,1
DEFSTR NOKILL,3,19,1

; ACCUMULATORS

VREG=1
J1=1			;JSYS AND ROUTINE ARGUMENTS
J2=2
J3=3
J4=4
 NACA==4			;;MAX AC ARGS
T1=5
T2=6
T3=7
T4=10

P1==11
 NPAC==4			;;MAX PRESERVED ACS
FREG=15
CX=16
P=17

; PARAMETERS

LSNG==3
PNDG==2
RFCR==4
OPND==7
PDL=200000
LPDL==2000
NFREE==1000
NBLKS==^D100
ITMSIZ==4

; GLOBAL VARIABLES

DEFINE INTEGER (XX)<
	IRP XX,<
XX:	BLOCK 1>>

INTEGER <FRELST,TASKS,PRLST,TTYJFN,SKTCNT,DTACHF,RETPC1,RETPC2>
INTEGER <SUMFLG,WATLCK,FREBLK>
INTEGER <PRIVF>		;0 FOR SYSTEM, NON-0 FOR PRIVATE TESTING
FRESTO:	BLOCK ITMSIZ*NFREE
BLKSTO:	BLOCK NBLKS*^D30

;COMMON EXIT SEQUENCE

.POP5:	POP P,P1+4
.POP4:	POP P,P1+3
.POP3:	POP P,P1+2
.POP2:	POP P,P1+1
.POP1:	POP P,P1
.POP0:
.EXIT:	POP P,FREG
	POP P,CX		;POP RETURN
	SUB P,0(P)		;RESTORE STACK FOR CALLER
	JRST 0(CX)
SETINT:	ROUTINE(SETINT)
	MOVEI 1,400000
	MOVE 2,[XWD LEVTB0,CHNTB0]
	SIR
	EIR
	MOVE 2,[1B19+1B1]
	AIC
	MOVE 1,[XWD 23,1]
	ATI
	SETOM WATLCK
	ENDR

WATINT:	ROUTINE(WATINT)
	MOVEI 1,^D10000
	AOSN WATLCK
	DISMS
WATCON:	SETOM WATLCK
	ENDR

INTINT:	MOVMS WATLCK
	SKIPE WATLCK
	DEBRK
	MOVE 1,[XWD 10000,WATCON]
	MOVEM 1,RETPC2
	DEBRK

SUMINT:	SETOM SUMFLG
	PUSH P,1
	PUSH P,2
	MOVEI 1,400000
	MOVEI 2,1B19
	IIC
	POP P,2
	POP P,1
	DEBRK

LEVTB0:	RETPC1
	RETPC2
	0

CHNTB0:	0
	XWD 1,SUMINT
	REPEAT ^D17,<0>
	XWD 2,INTINT
	REPEAT ^D36-^D19-1,<0>

SCNTSK:	ROUTINE(SCNTSK,,,<<STRING,20>,BEGSTR>,TASK)
	SKIPN SUMFLG
	 JRST NOSUM
	MOVEI 1,STRING
	HRLI 1,(<POINT 7,0>)
	MOVEM 1,BEGSTR
	HRROI 2,[ASCIZ /SUMMARY
/]
	SETZ 3,
	SOUT
	HRRZ TASK,TASKS
SLOOP:	CAIN TASK,TASKS
	 JRST ESUM
	HRROI 2,[ASCIZ /               /]
	SETZ 3,
	SOUT
	LOAD 3,TSKNAM,(TASK)
	MOVEI T2,7
LP11:	SETZ 2,
	ROTC 2,6
	ADDI 2,40
	IDPB 2,1
	SOJG T2,LP11
	LOAD 2,PROCNT,(TASK)
	MOVE 3,[1B2+3B17+^D10]
	NOUT
	 JFCL
	HRROI 2,[ASCIZ / ACTIVE PROCESSES
/]
	SETZ 3,
	SOUT
	HRRZ TASK,0(TASK)
	JRST SLOOP

ESUM:	SCALL LOGMESSAGE,BEGSTR
	SETZM SUMFLG
NOSUM:	HRRZ TASK,TASKS
LOOP1:	CAIN TASK,TASKS
	 JRST EXIT
	SCALL EXTASK,TASK
	HRRZ TASK,0(TASK)
	JRST LOOP1
	ENDR
SCNPRC:	ROUTINE(SCNPRC,,,<<STRING,20>>,<PROCES,NOW>)
	TIME
	MOVEM 1,NOW
	HRRZ PROCES,PRLST
LOOP2:	CAIN PROCES,PRLST
	 JRST EXIT
	LOAD 1,FORK,(PROCES)
	RFSTS
	HRRZ T2,1
	LDB T1,[POINT 6,1,17]
	CAIE T1,3
	 JRST NODEAD
	SETZRO KILTIM,(PROCES)
	MOVEI 1,STRING
	HRLI 1,(<POINT 7,0>)
	STOR 1,FAILRE,(PROCES)
	HRROI 2,[ASCIZ /FORK DIED CHAN /]
	SETZ 3,
	SOUT
	MOVE 2,T2
	MOVEI 3,12
	NOUT
	 JFCL
NODEAD:	CAMGE NOW,2(PROCES)
	 JRST ELOOP2
	MOVE 1,PROCES
	HRRZ PROCES,0(PROCES)
	SCALL KLPROC,<J1>
	JRST LOOP2

ELOOP2:	HRRZ PROCES,0(PROCES)
	JRST LOOP2
	ENDR

MAPFRK:	ROUTINE(MAPFRK,FKH)
	HRLZ 2,1
	HRLZI 1,400000
	HRLZI 3,160000
	MOVEI T1,777
MAPLP:	CAIN T1,677
	 MOVE T1,TOPPAG
	HRR 1,T1
	HRR 2,T1
	PMAP
	SOJGE T1,MAPLP
	ENDR

FILEMESSAGE:
	ROUTINE(FILEMESSAGE,JFN,MSG)
	DOBE
	SETO 2,
	MOVSI 3,45240
	ODTIM
	MOVEI 2," "
	BOUT
	BOUT
	MOVE 2,MSG
	SETZ 3,
	SOUT
	HRROI 2,[ASCIZ /
/]
	SETZ 3,
	SOUT
	ENDR
LOGMESSAGE:
	ROUTINE(LOGMESSAGE,,MSG,JFN)
	SCALL FILEMESSAGE,<TTYJFN,MSG>
	MOVE 1,[400001,,1]
	HRROI 2,[ASCIZ /SYSTEM:NETSER.LOG/]
	GTJFN
	 JRST [	TMSG <
?NETSER: CAN'T WRITE SYSTEM:NETSER.LOG BECAUSE >
		JSERR
		JRST EXIT]
	MOVEM 1,JFN
	MOVE 2,[XWD 70000,20000]
	OPENF
	 JRST RLJF
	SCALL FILEMESSAGE,<1,MSG>
	CLOSF
	 JFCL
	JRST EXIT

RLJF:	MOVE 1,JFN
	RLJFN
	 JFCL
	TMSG <
?NETSER: CAN'T WRITE SYSTEM:NETSER.LOG BECAUSE >
	ENDR

SGNON:	ROUTINE(SGNON,,<NAME,FHOST,FSKT,LFORK>,<<STRING,24>,BEGSTR>)
	MOVEI 1,STRING
	HRLI 1,(<POINT 7,0>)
	MOVEM 1,BEGSTR
	MOVE T1,[POINT 6,NAME]
	MOVEI T2,6
LOOP3:	ILDB T3,T1
	ADDI T3,40
	IDPB T3,1
	SOJG T2,LOOP3
	MOVEI T1," "
	IDPB T1,1
	IDPB T1,1
	MOVE 2,FHOST
	MOVEI 3,10
	MOVE T1,1		; SAVE DESTINATION
	CVHST			; CONVERT HOST NUMBER TO STRING
	 JRST [	MOVE 1,T1
		NOUT		; OR TO NUMBER
		 MOVE 1,T1	; RESTORE DESTINATION
		JRST .+1]
	MOVEI T1,"-"
	IDPB T1,1
	MOVE 2,FSKT
	NOUT
	 JFCL
	HRROI 2,[ASCIZ / FORK /]
	SETZ 3,
	SOUT
	MOVE 2,LFORK
	ANDI 2,177777
	MOVEI 3,^D10
	NOUT
	 JFCL
	SCALL LOGMESSAGE,BEGSTR
	ENDR
SGNOFF:	ROUTINE(SGNOFF,,<NAME,LFORK,FAILF,CPUTIM>,<<STRING,24>,BEGSTR>)
	MOVEI 1,STRING
	HRLI 1,(<POINT 7,0>)
	MOVEM 1,BEGSTR
	MOVE T1,[POINT 6,NAME]
	MOVEI T2,6
LOOP4:	ILDB T3,T1
	ADDI T3,40
	IDPB T3,1
	SOJG T2,LOOP4
	HRROI 2,[ASCIZ / FORK /]
	SETZ 3,
	SOUT
	MOVE 2,LFORK
	ANDI 2,177777
	MOVEI 3,^D10
	NOUT
	 JFCL
	HRROI 2,[ASCIZ / USED /]
	SETZ 3,
	SOUT
	MOVE 2,CPUTIM
	MOVE 3,[024100040200]
	FLOUT
	 JFCL
	MOVEI T1," "
	IDPB T1,1
	SKIPN 2,FAILF
	 MOVEI 2,[ASCIZ /SUCCESSFUL COMPLETION./]
	HRLI 2,(<POINT 7,0>)
	SETZ 3,
	SOUT
	SCALL LOGMESSAGE,BEGSTR
	ENDR

LINK:	ROUTINE(LINK,<ITEM,BASE>)
	HLRZ T1,0(BASE)
	HRLM T1,0(ITEM)
	HRRM BASE,0(ITEM)
	HRRM ITEM,0(T1)
	HRLM ITEM,0(BASE)
	ENDR

UNLINK:	ROUTINE(UNLINK,ITEM)
	HRRZ T1,0(ITEM)
	HLRZ T2,0(ITEM)
	HRLM T2,0(T1)
	HRRM T1,0(T2)
	HRRM ITEM,0(ITEM)
	HRLM ITEM,0(ITEM)
	ENDR
GETITM:	ROUTINE(GETITM)
	HRRZ VREG,FRELST
	CAIN VREG,FRELST
	 JRST EXIT
	SCALL UNLINK,VREG
	SKIPRT
	ENDR

RELEAS:	ROUTINE(RELEAS,ITEM)
	SCALL LINK,<ITEM,[FRELST]>
	ENDR

GETBLK:	ROUTINE(GETBLK)
	MOVEI VREG,^D25
	ADD VREG,FREBLK
	CAIL VREG,BLKSTO+NBLKS*^D25
	 JRST EXIT
	EXCH VREG,FREBLK
	SKIPRT
	ENDR

CRTASK:	ROUTINE(CRTASK,,<NAM,SKT,FRK,TIM,PRM,UTSK,TTYF>)
	SCALL GETITM
	 JRST EXIT
	MOVE T1,SKT
	STOR T1,LSKT,(VREG)
	MOVE T1,NAM
	STOR T1,TSKNAM,(VREG)
	MOVE T1,FRK
	STOR T1,FORKSA,(VREG)
	MOVE T1,TIM
	IDIVI T1,^D10
	STOR T1,LIFTIM,(VREG)
	MOVE T1,PRM
	STOR T1,PRMBIT,(VREG)
	MOVE T1,UTSK
	STOR T1,USRTSK,(VREG)
	MOVE T1,TTYF
	STOR T1,TTYBIT,(VREG)
	SETZ T1,
	STOR T1,TJFN,(VREG)
	STOR T1,BSYBIT,(VREG)
	STOR T1,PROCNT,(VREG)
	SCALL LINK,<VREG,[TASKS]>
	SKIPRT
	ENDR
CRPROC:	ROUTINE(CRPROC,,TSK,<<ACS,20>>,PROCES)
	SCALL GETITM
	 JRST EXIT
	MOVEM VREG,PROCES
	MOVSI 1,200000
	CFORK
	 JRST [	SCALL RELEASE,PROCES
		JRST EXIT]
	STOR 1,FORK,(PROCES)
	SETZI T1,
	STOR T1,NOKILL,(PROCES)
	SCALL MAPFRK,1
	MOVE T1,TSK
	STOR T1,TASKP,(PROCES)
	LOAD T2,LIFTIM,(T1)
	IMULI T2,^D20000
	TIME
	ADD T2,1
	STOR T2,KILTIM,(PROCES)
	MOVEI T2,[ASCIZ /TIMED-OUT/]
	STOR T2,FAILRE,(PROCES)
	MOVEI T2,1
	STOR T2,BSYBIT,(T1)
	STOR T2,BSYJFN,(PROCES)
	LOAD T2,PROCNT,(T1)
	AOS T2
	STOR T2,PROCNT,(T1)
	MOVEM PROCES,1+ACS
	MOVE T2,[XWD -LPDL,PDL-1]
	MOVEM T2,P+ACS
	LOAD 1,FORK,(PROCES)
	MOVEI 2,ACS
	SFACS
	LOAD 2,FORKSA,(T1)
	LOAD T2,USRTSK,(T1)
	SKIPE T2
	MOVEI 2,DOUSRT
	SFORK
	SCALL LINK,<PROCES,[PRLST]>
	SKIPRT
	ENDR
KLPROC:	ROUTINE(KLPROC,PROC,,CPUTIM,<TASK,PROCES>)
	MOVE PROCES,PROC
	LOAD TASK,TASKP,(PROCES)
	LOAD 1,FORK,(PROCES)
	FFORK
	LOAD 2,NOKILL,(PROCES)
	JUMPN 2,[	RFORK
			JRST EXIT]
	RUNTM
	FSC 1,233
	FSC 2,233
	FDVR 1,2
	MOVEM 1,CPUTIM
	LOAD 1,FORK,(PROCES)
	KFORK
	LOAD T1,FAILRE,(PROCES)
	SCALL SGNOFF,<2(TASK),1,T1,CPUTIM>
	LOAD T1,PROCNT,(TASK)
	SOS T1
	STOR T1,PROCNT,(TASK)
	LOAD T1,BSYJFN,(PROCES)
	JUMPE T1,KLPR1
	SETZ T1,
	STOR T1,BSYBIT,(TASK)
	LOAD J1,TJFN,TASK
	SCALL CLRJFN,<J1>
	SETZ T1,
	STOR T1,TJFN,(TASK)
KLPR1:	SCALL UNLINK,PROCES
	SCALL RELEASE,VREG
	ENDR
PNDGP:	ROUTINE(PNDGP,,SKT,)
	SKIPN PRIVF		;PRIVATE?
	JRST PNDGP1		;NO
	MOVEI 3,400
	IORM 3,SKT
PNDGP1:	MOVEI T1,0		;SCAN NET TABLE INDEXES, START AT 0
LOOP5:	MOVEI 1,.GTNIX		;GET INFO BASED ON INDEX
	MOVE 2,T1		;THIS IS THE INDEX
	MOVEI 3,T2		;RETURN ANSWER HERE
	HRROI 4,.NCFSM		;ONE WORD, CONNECTION FSM
	GTNCP			;SEE WHAT STATE IT'S IN
	 JRST EXIT		;MUST HAVE TRIED THEM ALL
	CAIE T2,PNDG		;IS IT PENDING?
	 JRST ELOOP5		;NO.
	MOVEI 3,T2		;YES. GET THE LOCAL SOCKET NUMBER
	HRROI 4,.NCLSK		; ..
	GTNCP
	 JRST EXIT		;SHOULDN'T FAIL HERE
	CAME T2,SKT
	 JRST ELOOP5
	AOSA RETURN
ELOOP5:	AOJA T1,LOOP5		;TRY ANOTHER CONNECTION
	ENDR
MKICPF:	ROUTINE(MKICPF,,SOCKET,<<STRING,24>>)
	MOVEI 1,STRING
	HRLI 1,(<POINT 7,0>)
	HRROI 2,[ASCIZ /NET:/]
	SETZ 3,
	SOUT
	MOVE 2,SOCKET
	SKIPE PRIVF		;PRIVATE?
	 TRO 2,400
	MOVEI 3,10
	NOUT
	 JRST EXIT
	HRROI 2,[BYTE (7) <"V">&37,"#",".",0]
	SETZ 3,
	SOUT
	MOVSI 1,400001
	HRROI 2,STRING
	GTJFN
	 JRST MKIX1
	MOVEM 1,SOCKET
	MOVE 2,[XWD 400000,100000]
	OPENF
	 JRST [	MOVE 1,SOCKET
		RLJFN
		 JFCL
		JRST MKIX1]
	MOVSI 3,777700+^D19
	MOVEI 2,24
	MTOPR
	SKIPRT
	JRST EXIT

MKIX1:	ENDR
EXTASK:	ROUTINE(EXTASK,TSK,,<FHST,FSKT>,<TASK,PROCESS>)
	MOVE TASK,TSK
	LOAD T1,BSYBIT,(TASK)
	JUMPN T1,EXIT
	LOAD 1,TJFN,(TASK)
	JUMPN 1,CHECK
	LOAD T2,PRMBIT,(TASK)
	JUMPN T2,GJFN
	LOAD T1,LSKT,(TASK)
	SCALL PNDGP,T1
	 JRST EXIT		; NO PENDING RFC, EXIT
GJFN:	LOAD T1,LSKT,(TASK)
	SCALL MKICPF,<T1>
	 JRST EXIT
	STOR VREG,TJFN,(TASK)
CHECK:	PUSH P,1		;save JFN
	MOVE 2,1		;put in right AC
	MOVEI 1,.GTNJF		;we are handing you a JFN
	MOVEI 3,T1		;where to put results
	MOVE 4,[-4,,.NCFHS]	;-count,,first index to get
	GTNCP			;get foreign host in T1, foreign socket in T3
	 JRST [	POP P,1		;adjust stack
		JRST DIED]	;connection went away ??
	JUMPE T1,DIED
	MOVEM T1,FHST
	MOVEM T3,FSKT
	POP P,1			;restore JFN
	MOVE T1,T4
	CAIE T1,RFCR
	 JRST NOTRFC
	SCALL CRPROC,TASK
	 JRST EXIT
	MOVEM VREG,PROCES
	LOAD T1,FORK,(PROCES)
	SCALL SGNON,<2(TASK),FHST,FSKT,T1>
	JRST EXIT

NOTRFC:	LOAD T2,PRMBIT,(TASK)
	CAIN T1,LSNG
	 JUMPN T2,EXIT
DIED:	LOAD J1,TJFN,(TASK)
	SCALL CLRJFN,<J1>
	SETZ T1,
	STOR T1,TJFN,(TASK)
	ENDR

CLRJFN:	ROUTINE(CLRJFN,JFN)
	JUMPLE JFN,EXIT
	MOVEM JFN,T1
	CLOSF
	 MOVE JFN,T1
	RLJFN
	 JFCL
	ENDR

GETSKT:	ROUTINE(GETSKT)
	AOS VREG,SKTCNT
	ANDI VREG,177
	LSH VREG,1
	ENDR
INITTASKS:
	ROUTINE(INITTASKS,,THINGS,,RTHING)
	MOVE RTHING,THINGS
LOOP6:	MOVE T1,0(RTHING)
	SCALL CRTASK,<0(T1),1(T1),2(T1),3(T1),4(T1),[0],[0]>
	 JFCL
	AOBJN RTHING,LOOP6
	ENDR

IUSRT:	ROUTINE(IUSRT,,,<JFN,USRF,TTYF,LSNF,SKT,NAM,<STRING,^D10>>,<BLK>)
	HRROI 2,[ASCIZ /SYSTEM:NETSER.USER-TASKS/]
	MOVSI 1,100001
	GTJFN
	 JRST EXIT		; NO TASKS
	MOVEM 1,JFN
	MOVE 2,[XWD 70000,200000]
	OPENF
	 JRST [	MOVE 1,JFN
		RLJFN
		 JFCL
		JRST EXIT]
LP16:	SCALL GETBLK
	 JRST FULL
	MOVEM VREG,BLK
	SETZM 5(BLK)
	MOVEI 2,6(BLK)
	HRLI 2,(<POINT 7,0>)
	MOVE 1,JFN
	MOVEI 3,^D99
	MOVEI 4,","
	MOVEM 2,0(BLK)
	SIN
	JUMPE 3,ILLFMT
	SETZ T3,
	DPB T3,2
	MOVEM 2,1(BLK)
	SIN
	DPB T3,2
	JUMPE 3,ILLFMT
	MOVEM 2,2(BLK)
	MOVEI T2,NAM
	HRLI T2,440600
	MOVEI T1,6
	SETZM NAM
NMLP:	BIN
	JUMPE 2,ILLFMT
	CAIN 2,","
	 JRST ENMLP
	SOJL T1,ILLFMT
	SUBI 2,40
	CAIL 2,100
	SUBI 2,40
	IDPB 2,T2
	JRST NMLP

ENMLP:	MOVE 2,2(BLK)
	SIN
	DPB T3,2
	JUMPE 3,ILLFMT
	SETOM USRF
	SETZM TTYF
	SETZM LSNF
FLGLP:	BIN
	JUMPE 2,ILLFMT
	CAIN 2,","
	 JRST EFLGLP
	CAIN 2,"T"
	 SETOM TTYF
	CAIN 2,"L"
	 SETOM LSNF
	CAIN 2,"S"
	 SETZM USRF
	CAIN 2,"W"
	 JRST [	MOVEI T1,400000
		JRST SETMOD]
	CAIN 2,"O"
	 JRST [	MOVEI T1,200000
		JRST SETMOD]
	CAIE 2,"C"
	 JRST FLGLP
	MOVEI T1,100000
SETMOD:	IORM T1,5(BLK)
	JRST FLGLP

EFLGLP:	MOVEI 3,10
	NIN
	 JRST ILLFMT
	MOVEM 2,SKT
	MOVEI 3,^D10
	NIN
	 JRST ILLFMT
	MOVEM 2,3(BLK)
	NIN
	 JRST ILLFMT
	MOVEM 2,4(BLK)
	MOVE 1,1(BLK)
	MOVEI 3,^D10
	NIN
	 JRST SACT
	TLNE 2,-1
	 JRST SACT
	TLO 2,500000
	MOVEM 2,1(BLK)
SACT:	SKIPN USRF
	 JRST SYSTSK
	MOVEI 1,STRING
	HRLI 1,(<POINT 7,0>)
	HRROI 2,[ASCIZ /NET:/]
	SETZ 3,
	SOUT
	MOVE 2,0(BLK)
	MOVEI 3,^D41
	MOVEI 4,">"
	SOUT
	MOVE 2,SKT
	MOVEI 3,10
	NOUT
	 JFCL
	MOVEI 2,"."
	IDPB 2,1
	SETZ 2,
	IDPB 2,1
	HRROI 2,STRING
	MOVSI 1,1
	GTJFN
	 JRST ILLFMT
	CVSKT
	 JRST ILLFMT
	IORI 2,1
	MOVEM 2,SKT
	RLJFN
	 JFCL
SYSTSK:	SCALL CRTASK,<NAM,SKT,BLK,[^D10],LSNF,[1],TTYF>
	 JRST FULL
	MOVE 1,JFN
	BKJFN
	 JFCL
EOLLP:	BIN
	JUMPE 2,EOF6
	CAIN 2,12
	 JRST [	BIN
		JUMPE 2,EOF6
		BKJFN
		 JFCL
		JRST LP16]
	JRST EOLLP

ILLFMT:	HRROI VREG,[ASCIZ /ILLEGAL USER TASK FILE FORMAT/]
	JRST EOF1

FULL:	HRROI VREG,[ASCIZ /NO ROOM FOR ALL TASKS/]
	JRST EOF1

EOF6:	SETZ VREG,
EOF1:	EXCH VREG,JFN
	CLOSF
	 JFCL
	MOVE VREG,JFN
	ENDR
FNDSKT:	ROUTINE(FNDSKT,,<LCL,FHST,FSKT>,<<VALUS,.NCFSM-.NCFHS+1>>)
	MOVEI T1,0		;INDEX FOR SCANNING MONITOR TABLES
LOOP7:	MOVEI 1,.GTNIX		; JSYS ARG IS AN INDEX
	MOVEI 2,(T1)		; THIS IS THE INDEX
	MOVEI 3,VALUS		; ANSWER HERE, PLEASE
	MOVSI 4,-.NCFSM-.NCFHS+1 ; NUMBER OF VALUES WE WANT
	HRRI 4,.NCFHS		; STARTING HERE
	GTNCP			; GET THE INFO
	 JRST EXIT		; NO SUCH INDEX
	MOVEI 1,VALUS
	MOVE 1,.NCFSM-.NCFHS(1)
	CAIE 1,RFCR		; IS IT A RFCR STATE SOCKET?
	 JRST ELOOP7		; IGNORE ALL NOT RFCR
	MOVEI 1,VALUS
	MOVE 1,.NCLSK-.NCFHS(1)
	CAME 1,LCL		; RIGHT LOCAL SOCKET?
	 JRST ELOOP7
	MOVEI 1,VALUS
	MOVE 1,.NCFHS-.NCFHS(1)
	CAME 1,FHST		; RIGHT FOREIGN HOST?
	 JRST ELOOP7
	MOVEI 1,VALUS
	MOVE 1,.NCFSK-.NCFHS(1)
	CAME 1,FSKT		; RIGHT FOREIGN SOCKET?
	 JRST ELOOP7
	HRRZ VREG,T1		;ALL MATCHES. RETURN THE INDEX.
	SKIPRT			; SUCCESS
	JRST EXIT

ELOOP7:	AOJA T1,LOOP7		; TRY ANOTHER INDEX
	ENDR
DOICP:	ROUTINE(DOICP,,<IJFN,LCLSKT,TSK,PROC>,<SJFN,RJFN,SYSSKT,FSKT,FHST,<STRING,24>,STSN,BALN>,<FAILF,PROCES>)
	MOVE PROCES,PROC
	SETZB FAILF,SJFN
	SETZM RJFN
	MOVE 1,IJFN
	CVSKT
	 JRST FAIL8
	IORI 2,1
	MOVEM 2,SYSSKT
	MOVE 2,1		;put JFN in right AC
	MOVEI 1,.GTNJF		;we're handing you a JFN
	MOVEI 3,T1		;where to put data
	MOVE 4,[-3,,.NCFHS]	;how many,,where to start
	GTNCP			;get foreign host, foreign socket
	 JRST FAIL8		;boo... hiss...
	MOVEM T1,FHST
	MOVEM T3,FSKT
	SCALL FNDSKT,<SYSSKT,FHST,FSKT>
	 JRST FAIL8		; ABANDONED
	MOVEM VREG,SYSSKT
	MOVEI 1,STRING
	HRLI 1,(<POINT 7,0>)
	HRROI 2,[ASCIZ /NET:/]
	SETZ 3,
	SOUT
	MOVE 2,LCLSKT
	MOVEI 3,8
	NOUT
	 JRST FAIL8
	MOVEI 2,"."
	IDPB 2,1
	MOVE 2,FHST
	NOUT
	 JRST FAIL8
	MOVEI T1,"-"
	IDPB T1,1
	MOVE 2,FSKT
	ADDI 2,2
	NOUT
	 JRST FAIL8
	HRROI 2,[ASCIZ /;T/]
	SETZ 3,
	SOUT
	MOVSI 1,1
	HRROI 2,STRING
	GTJFN
	 JRST FAIL8
	MOVEM 1,SJFN
	MOVSI 1,1
	HRROI 2,STRING
	GTJFN
	 JRST FAIL8
	MOVEM 1,RJFN
	CVSKT			; GET LOCAL SOCKET FOR CONNECTIONS
	 JRST FAIL8
	MOVEM 2,LCLSKT
	MOVE 1,IJFN
	MOVEI 2,20
	MTOPR			; ACCEPT CONNECTION
	MOVEI FAILF,[ASCIZ /BIT ALLOC NOT REC'VD/]
	STOR FAILF,FAILRE,(PROCES)
WATLP:	MOVEI 1,.GTNJF		;ARG IS A JFN
	MOVE 2,IJFN		;THIS ONE
	MOVEI 3,T2		;ANSWER HERE, PLEASE
	HRROI 4,.NCBAL		;BIT ALLOCATION, PLEASE
	GTNCP
	 JRST FAIL8
	CAIGE T2,^D32
	 JRST [	MOVEI 1,^D500
		DISMS
		JRST WATLP]
	MOVEI FAILF,[ASCIZ /MESSAGE ALLOC NOT REC'VD/]
	STOR FAILF,FAILRE,(PROCES)
WATLP2:	MOVEI 1,.GTNJF
	MOVE 2,IJFN
	MOVEI 3,T2
	HRROI 4,.NCMSG		; GET THE MESSAGE ALLOCATION
	GTNCP
	 JRST FAIL8
	SKIPA
;	CAIGE T2,1
	 JRST [	MOVEI 1,^D500
		DISMS
		JRST WATLP2]
	MOVEI FAILF,[ASCIZ /TIMED-OUT/]
	STOR FAILF,FAILRE,(PROCES)
	MOVE 1,IJFN
	MOVE 2,LCLSKT
	BOUT
	CLOSF
	 JFCL
	MOVEI T1,1
	STOR T1,NOKILL,(PROCES)
	SETZB T1,IJFN
	SETZRO BSYJFN,(PROCES)
	MOVE T2,TSK
	STOR T1,TJFN,(T2)
	STOR T1,BSYBIT,(T2)
	STOR T1,NOKILL,(PROCES)
	MOVE 1,SJFN
	MOVE 2,[XWD 103000,100000]
	MOVEI FAILF,[ASCIZ /CAN'T OPEN SEND/]
	STOR FAILF,FAILRE,(PROCES)
	OPENF
	 JRST FAIL18
	MOVE 1,RJFN
	MOVE 2,[XWD 100000,200000]
	MOVEI FAILF,[ASCIZ /CAN'T OPEN RECV/]
	STOR FAILF,FAILRE,(PROCES)
	OPENF
	 JRST FAIL18
	MOVE VREG+1,SJFN
	SKIPRT
	JRST EXIT

FAIL8:	SCALL CLRJFN,<IJFN>
	MOVE T2,TSK
	SETZ T1,
	STOR T1,BSYJFN,(PROCES)
	STOR T1,TJFN,(T2)
	STOR T1,BSYBIT,(T2)
FAIL18:	SCALL CLRJFN,<SJFN>
	SCALL CLRJFN,<RJFN>
	SKIPN VREG,FAILF
	MOVEI VREG,[ASCIZ /ICP FAILED/]
	ENDR

DOLGC:	ROUTINE(DOLGC,,<KPROCS,NEWNVF>,<SJFN,RJFN,PTY>,<PROCES,TASK>)
	MOVE PROCES,KPROCS
	LOAD TASK,TASKP,(PROCES)
	SCALL GETSKT
	LOAD T1,TJFN,(TASK)
	SCALL DOICP,<T1,VREG,TASK,PROCES>
	 JRST [	STOR 1,FAILRE,(PROCES)
		JRST ENDD9]
	MOVEM 1,RJFN
	MOVEM 2,SJFN
	MOVEI T1,[ASCIZ /TIMED-OUT AFTER ICP/]
	STOR T1,FAILRE,(PROCES)
	SKIPE NEWNVF		; NEW STYLE NVT?
	 HRLI 1,(1B2)		; YES, SET BIT2
	ATNVT
	 JRST SORRY
	MOVEM 1,PTY
	MOVSI 1,100001
	HRROI 2,[ASCIZ /SYSTEM:NETWORK-LOGINMESSAGE/]
	GTJFN
	 JRST NOMSG
	MOVEM 1,SJFN
	MOVE 2,[XWD 70000,200000]
	OPENF
	 JRST [	MOVE 1,SJFN
		RLJFN
		 JFCL
		JRST NOMSG]
MSGLP:	MOVE 1,SJFN
	BIN
	JUMPE 2,EMSGLP
	MOVE 1,PTY
	BOUT
	JRST MSGLP

EMSGLP:	CLOSF
	 JFCL
NOMSG:	MOVE 1,PTY
	MOVEI 2,3
	STI
	SETZRO FAILRE,(PROCES)
	JRST ENDD9

SORRY:	MOVE 1,SJFN
	HRROI 2,[ASCIZ /
SORRY, ALL NETWORK TERMINALS ARE IN USE.  PLEASE TRY AGAIN LATER.
/]
	SETZ 3,
	SOUT
	CLOSF
	 JFCL
	MOVE 1,RJFN
	CLOSF
	 JFCL
	MOVEI T1,[ASCIZ /ATNVT FAILURE/]
	STOR T1,FAILRE,(PROCES)
ENDD9:	SETZRO KILTIM,(PROCES)
	HALTF
	ENDR

DOLOG:	ROUTINE(DOLOG,,,,)
	SCALL DOLGC,<1,[0]>
	ENDR

DONLG:	ROUTINE(DONLG)
	SCALL DOLGC,<1,[-1]>
	ENDR
DODATE:	ROUTINE(DODATE,,,<SJFN,RJFN>,PROCES)
	MOVEM 1,PROCES
	SCALL GETSKT
	LOAD T1,TASKP,(PROCES)
	LOAD T2,TJFN,(T1)
	SCALL DOICP,<T2,VREG,T1,PROCES>
	 JRST FAIL10
	MOVEI T1,[ASCIZ /TIMED-OUT AFTER ICP/]
	STOR T1,FAILRE,(PROCES)
	MOVEM VREG,RJFN
	MOVEM VREG+1,SJFN
	MOVE 1,VREG+1
	SETO 2,
	MOVSI 3,322060
	ODTIM
	MOVEI 2,15
	BOUT
	MOVEI 2,12
	BOUT
	SCALL CLRJFN,<RJFN>
	SCALL CLRJFN,<SJFN>
	SETZ VREG,
FAIL10:	STOR VREG,FAILRE,(PROCES)
	SETZRO KILTIM,(PROCES)
	HALTF
	ENDR
DOECHO:	ROUTINE(DOECHO,,,<SJFN,RJFN>,<PROCES,TASK>)
	MOVEM 1,PROCES
	SCALL GETSKT
	LOAD TASK,TASKP,(PROCES)
	LOAD T2,TJFN,(TASK)
	SCALL DOICP,<T2,VREG,TASK,PROCES>
	 JRST FAIL11
	MOVEM VREG,RJFN
	MOVEM VREG+1,SJFN
	HRLOI T1,377777
	STOR T1,KILTIM,(PROCES)
LOOP11:	MOVE 1,RJFN
	BIN
	JUMPE 2,[GTSTS
		TLNE 2,1000
		 JRST EOF11
		SETZ 2,
		JRST .+1]
	MOVE 1,SJFN
	BOUT
	JRST LOOP11

EOF11:	SCALL CLRJFN,<RJFN>
	SCALL CLRJFN,<SJFN>
	SETZRO FAILRE,(PROCES)
	JRST ENDD11

FAIL11:	STOR VREG,FAILRE,(PROCES)
ENDD11:	SETZRO KILTIM,(PROCES)
	HALTF
	ENDR
CMPSTR:	ROUTINE(CMPSTR,,<ST1,ST2>)
LOOP13:	ILDB T1,ST1
	ILDB T2,ST2
	CAME T2,T1
	 JRST EXIT
	JUMPN T1,LOOP13
	SKIPRT
	ENDR

STRIN:	ROUTINE(STRIN,JFN,<PTR,MAX>)
	MOVE 2,PTR
	MOVE 3,MAX
	MOVEI 4,":"
	SIN
	SETZ T1,
	DPB T1,2
	ENDR
DOSUBSYS:	ROUTINE(DOSUBSYS,,<FILE,NAME,DRTEXT>,<IFILE,SJFN,RJFN,SUBFRK,DRFILE>,<PROCES,TASK,FAILF>)
	MOVEM 1,PROCES
	LOAD TASK,TASKP,(PROCES)
	SCALL GETSKT
	LOAD T1,TJFN,(TASK)
	SCALL DOICP,<T1,VREG,TASK,PROCES>
	 JRST FAIL15
	MOVEM VREG,RJFN
	MOVEM VREG+1,SJFN
	MOVEI T1,[ASCIZ /TIMED-OUT AFTER ICP/]
	STOR T1,FAILRE,(PROCES)
	TIME
	ADDI 1,^D60000
	STOR 1,KILTIM,(PROCES)
	SETOM DRFILE
	SKIPN DRTEXT
	 JRST RUNSUB
	LOAD 1,FORK,(PROCES)
	ANDI 1,177777
	MOVEI FAILF,[ASCIZ /NO DRIVER FILE/]
	HRLI 1,400001
	HRROI 2,[ASCIZ /SYSTEM:NETSER-DRIVERFILE/]
	GTJFN
	 JRST CANT
	MOVEM 1,DRFILE
	MOVE 2,[XWD 70000,100000]
	OPENF
	 JRST [	MOVE 1,DRFILE
		RLJFN
		 JFCL
		 JRST CANT]
	MOVE T1,DRTEXT
	HRLI T1,(<POINT 7,0>)
L1:	ILDB 2,T1
	JUMPE 2,L1E
	CAIN 2,"?"
	 JRST [	ILDB 2,T1
		CAIN 2,"?"
		 JRST .+1
		ANDI 2,37
		JRST .+1]
	BOUT
	JRST L1

L1E:	HRLI 1,400000
	CLOSF
	 HALT
	HRRZS 1
	MOVE 2,[XWD 70000,200000]
	OPENF
	 HALT
RUNSUB:	MOVEI FAILF,[ASCIZ /NO INTERMEDIATE FILE/]
	LOAD 1,FORK,(PROCES)
	ANDI 1,177777
	HRLI 1,400001
	HRROI 2,[ASCIZ /SYSTEM:NETSER-INTERMEDIATE/]
	GTJFN
	 JRST CANT1
	MOVEM 1,IFILE
	MOVE 2,[XWD 70000,100000]
	OPENF
	 JRST [	MOVE 1,IFILE
		RLJFN
		 JFCL
		JRST CANT1]
	MOVSI 1,(1B1)
	MOVEI FAILF,[ASCIZ /NO FORKS/]
	CFORK
	 JRST CANT2
	MOVEM 1,SUBFRK
	MOVEI FAILF,[ASCIZ /SUBSYS NOT FOUND/]
	MOVSI 1,100001
	HRRO 2,FILE
	GTJFN
	 JRST CANT2
	HRL 1,SUBFRK
	GET
	MOVE 1,SUBFRK
	MOVE 2,IFILE
	HRL 2,DRFILE
	SKIPGE 2
	HRLI 2,377777
	SPJFN
	SETZ 2,
	SFRKV
	WFORK
	KFORK
	SKIPG 1,DRFILE
	 JRST NODRF
	DELF
	 JFCL
	CLOSF
	 JFCL
NODRF:	MOVE 1,IFILE
	HRLI 1,400000
	CLOSF
	 HALT
	HRRZS 1
	MOVE 2,[XWD 70000,200000]
	OPENF
	 HALT
CPYL15:	MOVE 1,IFILE
	BIN
	JUMPE 2,[GTSTS
		TLNE 2,1000
		 JRST EOF15
		SETZ 2,
		JRST CPYL15]
	MOVE 1,SJFN
	BOUT
	JRST CPYL15

EOF15:	MOVE 1,IFILE
	DELF
	 JFCL
	CLOSF
	 JFCL
	SETZRO FAILRE,(PROCES)
	JRST ENDD15

CANT2:	MOVE 1,IFILE
	CLOSF
	 JFCL
CANT1:	SKIPL 1,DRFILE
	CLOSF
	 JFCL
CANT:	MOVE 1,SJFN
	HRROI 2,[ASCIZ /
SORRY, /]
	SETZ 3,
	SOUT
	HRRO 2,NAME
	SOUT
	HRROI 2,[ASCIZ / IS NOT AVAILABLE BECAUSE /]
	SOUT
	HRRO 2,FAILF
	SOUT
	STOR FAILF,FAILRE,(PROCES)
ENDD15:	MOVE 1,RJFN
	CLOSF
	 JFCL
	MOVE 1,SJFN
	CLOSF
	 JFCL
	JRST END215

FAIL15:	STOR VREG,FAILRE,(PROCES)
END215:	SETZRO KILTIM,(PROCES)
	HALTF
	ENDR
DOSYSTAT:
	ROUTINE(DOSYSTAT)
	SCALL DOSUBSYS,<[[ASCIZ /SYSTEM:EXEC.EXE/]],[[ASCIZ /SYSTAT/]],[[ASCIZ /SYSTAT?JPOP?J/]]>
	ENDR

XEFACT:	ROUTINE(XEFACT,,<CONNECT,CPU,ACCOUNT>,<<FACTBLK,40>>)
	ENDR

DOUSRT:	ROUTINE(DOUSRT,,,<SJFN,RJFN,FORKH,CUTOFF,TTYF,<FACS,20>,<FACT,20>,<CHNTAB,^D36>,<LEVTAB,3>,INTPC,ST1>,<BLK,PROCES>)
	MOVEM 1,PROCES
	MOVSI T1,1+CHNTAB
	HRRI T1,CHNTAB
	SETZM CHNTAB
	BLT T1,^D35+CHNTAB
	MOVEI T1,INTPC
	MOVEM T1,LEVTAB
	MOVSI T1,1
	HRRI T1,FKTRM
	MOVEM T1,^D19+CHNTAB
	MOVEI 1,400000
	MOVSI 2,LEVTAB
	HRRI 2,CHNTAB
	SIR
	EIR
	MOVEI 2,1B19
	AIC
	SCALL GETSKT
	LOAD T1,TASKP,(PROCES)
	LOAD T2,TJFN,(T1)
	SCALL DOICP,<T2,VREG,T1,PROCES>
	 JRST FAIL16
	MOVEI T1,[ASCIZ /COULD NOT GET FILE/]
	STOR T1,FAILRE,(PROCES)
	MOVEM VREG,RJFN
	MOVEM VREG+1,SJFN
	MOVE 2,1		;put JFN in right AC
	MOVEI 1,.GTNJF		;we're handing you a JFN
	MOVEI 3,T1		;where to put data
	MOVE 4,[3,,.NCFHS]	;-count,,where to start
	GTNCP			;get the data
	 JRST FAIL16
	MOVEM T1,1+FACS		;foreign host
	MOVEM T3,2+FACS		;foreign socket
	LOAD T1,TASKP,(PROCES)
	LOAD BLK,FORKSA,(T1)
	LOAD T2,TTYBIT,(T1)
	MOVEM T2,TTYF
	MOVE 2,0(BLK)
	MOVSI 1,100001
	GTJFN
	 JRST NAV
	MOVEM 1,FORKH
	SETZ 1,
	CFORK
	 JRST [	MOVE 1,FORKH
		RLJFN
		 JFCL
		JRST NAV1]
	EXCH 1,FORKH
	HRL 1,FORKH
	GET
	HRLOI T1,377777
	STOR T1,KILTIM,(PROCES)
	MOVE 1,FORKH
	MOVSI 3,200000
	HRR 3,5(BLK)
	MOVE 2,3
	EPCAP
	SKIPN TTYF		; NEEDS TO RUN WITH A TTY?
	 JRST NOTTY
	MOVE 1,RJFN
	MOVE 2,SJFN
	ATNVT
	 JRST NAV0
	MOVEM 1,TTYF
	ASND
	 JFCL
	MOVE 1,TTYF
	MOVE 2,[XWD 52531,515125]
	MOVE 3,[XWD 252525,653000]
	SFCOC
	MOVE 2,[XWD 401002,4010]
	MOVE 4,2
	MOVE 3,[XWD 20040,100200]
	STABS
	MOVE 2,[XWD 60510,175120]
	SFMOD
	MOVE 2,TTYF
	HRL 2,2
	JRST SETPJF

NOTTY:	HRLZ 2,RJFN
	HRR 2,SJFN
SETPJF:	MOVE 1,FORKH
	SPJFN
	SKIPN 1,TTYF
	MOVE 1,SJFN
	SETO 2,			;LOCAL HOST
	MOVEI 3,10
	CVHST
	 JRST [	MOVE 1,SJFN
		NOUT		; OR TO NUMBER
		 MOVE 1,SJFN	; RESTORE DESTINATION
		JRST .+1]
	MOVEI 2,40		;SEPARATE WITH SPACE
	BOUT
	MOVE 2,2(BLK)
	MOVEI 3,0
	SOUT
	HRROI 2,[BYTE (7)15,12,0]
	SOUT
	TIME
	ADD 1,4(BLK)
	MOVEM 1,CUTOFF
	MOVE 1,FORKH
	MOVEI 2,FACS
	SFACS
	MOVEI 2,0
	SFRKV
WLP:	MOVEI 1,^D10000
	DISMS
EWLP:	MOVE 1,FORKH
	RFSTS
	HLRZ T1,1
	CAIN T1,2
	 JRST [	SETZ VREG,
		JRST DONE]
	CAIN T1,3
	 JRST [	MOVEI VREG,[ASCIZ /TASK CRASHED./]
		JRST DONE]
	MOVE 1,FORKH
	RUNTM
	CAML 1,2(BLK)
	 JRST [	MOVEI VREG,[ASCIZ /CPU ALLOTMENT EXCEEDED/]
		JRST DONE]
	TIME
	CAML 1,CUTOFF
	 JRST [	MOVEI VREG,[ASCIZ /CONNECT TIME EXCEEDED/]
		JRST DONE]
	JRST WLP

FKTRM:	MOVEM T1,ST1
	HRRZ T1,INTPC
	CAIG T1,EWLP
	CAIGE T1,WLP
	 JRST FKTRMX
	MOVE 1,[XWD 10000,EWLP]
	MOVEM T1,INTPC
FKTRMX:	MOVE T1,ST1
	DEBRK

NAV0:	MOVE 1,FORKH
	KFORK
	HRROI 2,[ASCIZ /NETWORK TERMINAL/]
	JRST NAVC

NAV1:	HRROI 2,[ASCIZ /FORKS/]
	JRST NAVC

NAV:	MOVE 2,0(BLK)
NAVC:	MOVE 1,SJFN
	SETZ 3,
	SOUT
	HRROI 2,[ASCIZ / NOT AVAILABLE.
/]
	SOUT
	MOVEI VREG,[ASCIZ /TASK NOT AVAILABLE/]
	JRST FINISH

DONE:	STOR VREG,FAILRE,(PROCES)
	TIME
	SUB VREG,CUTOFF
	ADD VREG,4(BLK)
	MOVEM VREG,J4
	MOVE J1,FORKH
	RUNTM
	SCALL XEFACT,<J4,J1,1(BLK)>
	MOVE 1,FORKH
	KFORK
	JRST FINI1
FINISH:	STOR VREG,FAILRE,(PROCES)
FINI1:	SKIPE 1,TTYF
	 JRST [	DOBE
		RELD
		 JFCL
		JRST FAI116]
	SCALL CLRJFN,<RJFN>
	SCALL CLRJFN,<SJFN>
	JRST FAI116

FAIL16:	STOR VREG,FAILRE,(PROCES)
FAI116:	SETZRO KILTIM,(PROCES)
	HALTF
	ENDR
; MAIN PROGRAM

START:	TDZA 1,1
REENT:	MOVNI 1,1
	MOVEM 1,DTACHF
	MOVE P,[XWD -LPDL,PDL-1]
	MOVE FREG,P
MLOOP:	RESET
	MOVEI 1,400000
	RPCAP
	IORI 3,600000
	EPCAP
	MOVE 1,LOGDES
	MOVEM 1,TTYJFN
	MOVEI 1,400000
	MOVE 2,[XWD 400000,400000]
	SKIPE DTACHF
	 SPJFN
	SETZ J1,
	SKIPE PRIVF		;PRIVATE?
	MOVEI J1,20		;YES
	MOVEM J1,SKTCNT
	GTAD
	JUMPL 1,[MOVEI 1,^D10000
		DISMS
		JRST .-1]
	MOVE 1,[SIXBIT /NETRDY/]
	SYSGT
	JUMPGE 1,[MOVEI 1,^D10000
		DISMS
		JRST .-2]
	SCALL LOGMESSAGE,<<[POINT 7,[ASCIZ \NETSER IN OPERATION\]]>>
	MOVE T1,[XWD TASKS,TASKS]
	MOVEM T1,TASKS
	MOVE T1,[XWD PRLST,PRLST]
	MOVEM T1,PRLST
	MOVE T1,[XWD FRELST,FRELST]
	MOVEM T1,FRELST
	MOVEI P1,FRESTO
IFRELP:	SCALL RELEASE,P1
	ADDI P1,ITMSIZ
	CAIGE P1,FRESTO+NFREE*ITMSIZ
	 JRST IFRELP
	MOVEI T1,BLKSTO
	MOVEM T1,FREBLK
	SCALL INITTASKS,<<[XWD -NTASKS,TSKTAB]>>
	SCALL IUSRT		; INIT USER TASKS
	SCALL SETINT

MLP1:	MOVE 1,[SIXBIT /NETRDY/]
	SYSGT
	JUMPGE 1,IMPDED
	SCALL SCNTSK
	SCALL SCNPRC
	SCALL WATINT
	JRST MLP1

IMPDED:	SCALL LOGMESSAGE,<<[POINT 7,[ASCIZ /IMP DOWN -- NETSER RESTART/]]>>
	MOVEI 1,^D30000
	DISMS
	JRST MLOOP
;TASK INITIALIZATION TABLE
;BLOCK:
;	SIXBIT NAME
;	SOCKET
;	START ADDRESS
;	TIME
;	PRMBIT

TSKTAB:	Z [SIXBIT /LOGGER/
		1
		DOLOG
		^D10
		1]
	Z [SIXBIT /NLOGER/
		^D23
		DONLG
		^D10
		1]
	Z [SIXBIT /DATE/
		15
		DODATE
		^D10
		1]
	Z [SIXBIT /ECHO/
		7
		DOECHO
		^D10
		0]
	Z [SIXBIT /SYSTAT/
		13
		DOSYST
		^D10
		0]
NTASKS==.-TSKTAB

LOGDES:	377777

;LITERALS XLISTED
	XLIST
	LIT
	LIST

	VAR
TOPPAG:	./1000
	END START