!**********************
!* NSIWS/NSIWY       *
!* DATE: 25.SEP.79   *
!*********************
CONSTSTRING  (7) VSN = "VSNK01B"
!! STACK = 400, STREAMS = 3

!! NOTE: FOR VERSIONS THAT ARE RUN OUT OF A 2900 FEP SYSTEM,
!!       MESSAGES FROM THE NETWORK SHOULD BE ENABLED - SEE
!!        THE COMMENT AT 'MESSAGES ENABLED'

CONTROL  K'100001'
!STACK=400, STREAMS=3


RECORDFORMAT  XF(BYTEINTEGER  UNIT,FSYS,BYTEINTEGERARRAY  FNAME(0:5))
EXTERNALPREDICATESPEC  READ FNAME(RECORD (XF)NAME  FILE)
SYSTEMROUTINESPEC  ALARM(INTEGER  TICKS)
BEGIN 

 RECORDFORMAT  ITPF(BYTEINTEGER  CNSL,HB1,HB2,LEN,  C 
   BYTEINTEGERARRAY  DATA(0:127))
RECORDFORMAT  MESSAGEF(BYTEINTEGERARRAY  DATA(0:241))
RECORDFORMAT  RJEF(BYTEINTEGER  UFLAG, BYTEINTEGERARRAY  DATA(0:239))
RECORDFORMAT  NSI1F(INTEGER  ST,PORT,RC,TC,    C 
   RECORD (ITPF) ITP)
RECORDFORMAT  NSI2F(INTEGER  ST,PORT,RC,TC,  C 
   RECORD (RJEF) RJE)
RECORDFORMAT  NSI3F(INTEGER  ST,PRT,SSC,REPLY PORT,FAC,   C 
     RECORD  (MESSAGEF) MESSAGE )
RECORDFORMAT  MEF(RECORD (MEF)NAME  LINK,BYTEINTEGER  LEN,TYPE,  C 
   RECORD (NSI1F) NSL)
RECORDFORMAT  ME3F(RECORD  (ME3F) NAME  LINK, BYTEINTEGER  LEN,TYPE,   C 
     RECORD  (NSI3F) NSL)
RECORDFORMAT  ME2F(RECORD (ME2F)NAME  LINK,BYTEINTEGER  LEN,TYPE,  C 
   RECORD (NSI2F) NSL)
RECORDFORMAT  PF(BYTEINTEGER  SERVICE,REPLY,FN,PORT,  C 
RECORD (MEF)NAME  MES,BYTEINTEGER  LEN,S1)
RECORDFORMAT  P2F(BYTEINTEGER  SERVICE,REPLY,FN,PORT,RECORD (ME2F)NAME  MES,  C 
   BYTEINTEGER  LEN,S1)
RECORDFORMAT  P3F(BYTEINTEGER  SERVICE,REPLY,FN,PORT,X,Y,TERM,FACILITY)
RECORD (PF) P;   RECORD (P2F)NAME  P2;   RECORD (P3F)NAME  P3
RECORD (RJEF)NAME  BLOCK
RECORD (ITPF)NAME  FRAME
RECORD  (MESSAGEF) NAME  MESSAGE
CONSTRECORD (MEF)NAME  NULL=0
CONSTINTEGER  TT=0,LO=1,CR=2,LP=3,PP=6,BT=7

OWNINTEGER  NODE, TERM, STRM

RECORDFORMAT  HOSTF(INTEGER  NUMBER,  C 
      INTEGERARRAY  PORT(CR:LP),STATUS(LO:LP), C 
      INTEGER  CR COUNT,CR K,LP COUNT,LP K, NODE)
RECORDFORMAT  STRDF(INTEGER  A,B,C,D,RECORD (XF) FILE,INTEGER  E,F,G,H)
RECORDFORMAT  STRPF(RECORD (STRDF)NAME  STRD)
RECORD (STRDF)NAME  STRD
RECORDFORMAT  D1F(INTEGER  X);   RECORD (D1F) D1
RECORDFORMAT  D2F(RECORD (STRPF)NAME  X);   RECORD (D2F)NAME  D2
RECORD (XF)NAME  FILE
RECORD (XF) LP BASE FILE, CR FILE
OWNINTEGER  MAX HOST=2
RECORD (HOSTF) HOST
CONSTBYTEINTEGERARRAY  SPOOL BASE(0:5)='V','L','P','0','0','0'
CONSTBYTEINTEGERARRAY  KILL(0:4)=4,'K','I','L','L'
CONSTBYTEINTEGERARRAY  STATUS(0:6)=6,'S','T','A','T','U','S'
CONSTBYTEINTEGERARRAY  INT(0:3)=3,'I','N','T'
CONSTBYTEINTEGERARRAY  FILEN(0:4)=4,'F','I','L','E'
CONSTBYTEINTEGERARRAY  PRINTER(0:2)=2,'L','P'
CONSTBYTEINTEGERARRAY  JOB(0:3)=3,'J','O','B'
CONSTBYTEINTEGERARRAY  EMAS NAME(0:5)=4,'E','M','A','S',0
CONSTBYTEINTEGERARRAY  DO ENABLE(0:6) = 6, 'E', 'N', 'A','B','L','E'
CONSTBYTEINTEGERARRAY  E2970 NAME(0:5)=4,'2','9','7','0',0
CONSTBYTEINTEGERARRAY  INFO NAME(0:5) = 4, 'I','N','F','O',0
CONSTBYTEINTEGERARRAY  E2980 NAME(0:5) = 4,'2','9','8','0',0
CONSTINTEGER  EMAS NUMBER=34, E2970 NUMBER=49, INFO NUMBER=156
CONSTINTEGER  E2980T = 80, E2980NODE=80
BYTEINTEGERARRAYNAME  BUFF
CONSTBYTEINTEGERNAME  ID=K'160030', GATE INT=K'100060'

OWNINTEGER  SETBFLAG, BINFLAG
CONSTINTEGER  SET PR = 13;             ! PAPER TAPE READER STREAM

      CONSTINTEGER  MAX COM = 10
      SWITCH  SW(0:MAX COM)

      CONSTSTRING  (3) ARRAY  COMS(0:MAX COM) =
         '  ', 'TT', 'OP', 'LO', 'CR',
         'SP', 'LP', 'TL', 'SM', 'LI', 'ST'

      OWNSTRING  (3) NEW = '  '



OWNBYTEINTEGERARRAY  LINE(0:119)
OWNINTEGER  TT PORT=-1
OWNINTEGER  LPTR,GOOD TEXT,GAH CT,TT HOST,TT STATE,LINE LENGTH,I,J
OWNINTEGER  NO OF FILES,GARBAGE,CR TIMER,OP STRM

CONSTINTEGER  TT SER=1, GATE SER=16, BUFFER MANAGER=17
CONSTINTEGER  RD=0, ECHO OFF=10
CONSTINTEGER  REQUEST BUFFER=0, RELEASE BUFFER=1
CONSTINTEGER  ENABLE FACILITY=1, DISABLE FACILITY=2, CALL REPLY=3
CONSTINTEGER  ENABLE INPUT=4, PUT OUTPUT=5, CLOSE CALL=6
CONSTINTEGER  ABORT CALL=7, OPEN CALL=8, OPEN MESSAGE=9
CONSTINTEGER  OPEN CALL REPLY=1, INCOMING CALL=2, INPUT RECD=3
CONSTINTEGER  OUTPUT TRANSMITTED=4, CALL CLOSED=5, CALL ABORTED=6
CONSTINTEGER  OPEN REPLY A=7, OPEN REPLY B=8, MESSAGE IN=9, MESSAGE REPLY=10
CONSTINTEGER  ITP HELLO=1, ITP GAH=2, ITP MESS=3, ITP INT=4, RJE LOGON=5
CONSTINTEGER  RJE LOGOFF=6, CR DATA=7, SOCIAL CALL=8
CONSTINTEGER  ACCEPT=X'22', REJECT=0
CONSTINTEGER  IDLE=0, STARTING=1, RUNNING=2, OPENED=3, STOPPING=4, STOPPING2=5
CONSTINTEGER  CLOSED=6
CONSTSTRING (9)ARRAY  STAT(0:6)='IDLE','STARTING', 'RUNNING',
   'ENABLED', 'STOPPING'(2), 'RUNNING'

CONSTINTEGER  BUFFER SIZE=230
OWNBYTEINTEGERARRAY  BUFFER(0:230)
OWNINTEGER  CR HEAD
OWNINTEGER  CR STRM
OWNINTEGER  CR GET
OWNINTEGER  CR PUT
OWNINTEGER  CR END
OWNINTEGER  CR LEN POSN
OWNINTEGER  CR EOF=0

OWNINTEGER  PEND GAH = 0
OWNINTEGER  TARGET NODE = 1;        ! CHANGED IF NOT ON NODE 1 (EMAS ACCESS)


PREDICATESPEC  MATCH(BYTEINTEGERARRAYNAME  MASTER)
INTEGERFNSPEC  EXIST(INTEGER  STREAM, RECORD  (XF) NAME  FILE)

ROUTINE  TO TT(INTEGER  FN)
RECORDFORMAT  PF(BYTEINTEGER  SERVICE,REPLY,INTEGER  A1,BYTEINTEGERARRAYNAME  C 
  A2,INTEGER  A3)
RECORD (PF) P
P_SERVICE=TT SER;   P_REPLY=ID
P_A1=FN;   P_A2==LINE;   P_A3=120
PON(P)
END 

ROUTINE  MESS(INTEGER  DEV,STRING (23) MES)
INTEGER  I
CONSTSTRING (2)ARRAY  DEVS(TT:BT)='TT','LO','CR','LP','LP','??','PP','BT'
PRINT STRING(DEVS(DEV));   PRINT SYMBOL(':')
PRINT STRING(MES)
END 

INTEGERFN  READ ADDRESS
   !! USES GLOBALS  NODE, TERM AND STRM
      INTEGER  K

      INTEGERFN  SIG
         LPTR = LPTR+1 WHILE  LINE(LPTR)=' '
         RESULT  = LINE(LPTR)
      END 

      INTEGERFN  R NUM
         INTEGER  J, N
         N=0
         CYCLE 
            J=LINE(LPTR)
            UNLESS  '0' <= J <= '9' THEN  RESULT  = N
            LPTR = LPTR+1
            N = N*10+J-'0'
         REPEAT 
      END 

      NODE = TARGET NODE;    ! USUALLY ZERO
      IF  MATCH(EMAS NAME) THEN  TERM=EMAS NUMBER AND  ->ADD NODE
      IF  MATCH(E2970NAME) THEN  TERM=E2970NUMBER AND  ->ADD NODE
      IF  MATCH(INFO NAME) THEN  TERM=INFO NUMBER AND  ->ADD NODE
      IF  MATCH(E2980 NAME) START 
         TERM = E2980T
ADD NODE:  NODE = TERM;  RESULT  = 1
      FINISH 
      NODE = 0;                ! DEPENDS ON USER SPECIFING

      K = SIG;  LPTR = LPTR+1
      IF  K = 'N' START ;               ! SPECIFY NODE NUMBER
         NODE = RNUM
         K = LINE(LPTR); LPTR = LPTR+1
      FINISH 
      RESULT  = 0 UNLESS  K='T'
      TERM = RNUM; K=LINE(LPTR); LPTR=LPTR+1
      IF  K='S' START 
         STRM = RNUM; K=LINE(LPTR); LPTR=LPTR+1
      FINISH 
      RESULT  = 0 UNLESS  K = ' '
      LPTR = LPTR-1
      RESULT  = 1
END 

PREDICATE  MATCH(BYTEINTEGERARRAYNAME  MASTER)
INTEGER  I
LPTR=LPTR+1 WHILE  LINE(LPTR)=' '
CYCLE  I=1,1,MASTER(0)
   FALSE  IF  LINE(LPTR+I-1)#MASTER(I)
REPEAT 
LPTR=LPTR+I
TRUE 
END 

ROUTINE  SET STREAM(INTEGER  STREAM,RECORD (XF)NAME  FILE)
CONSTINTEGERARRAY  DISC(0:3)=3,3,8,14
         OWNRECORD  (STRDF) NAME  STRD5

         D1_X=K'160032'+STREAM<<1
         IF  D2_X_STRD == NULL THEN  D2_X_STRD == STRD5

         STRD == D2_X_STRD
         IF  FILE_UNIT=255 START ;      ! DUMMY
            STRD5 == STRD;              ! REMEBER ITS ADDRESS
            D2_X_STRD == NULL;          ! NULL STREAM
            RETURN 
         FINISH 

         STRD_A=0;   STRD_B=2;   STRD_C=0;   STRD_D=ID<<8!DISC(FILE_UNIT)
         STRD_FILE=FILE;   STRD_E=0;   STRD_F=0;   STRD_G=0;   STRD_H=K'172'
END 

ROUTINE  PRINT COUNT(INTEGER  K,UNITS)
PRINT SYMBOL(',')
WRITE(K,0) AND  PRINT STRING('K +') IF  K>0
WRITE(UNITS,0);   PRINT STRING(' CHARS')
END 

ROUTINE  PRINT FILE(INTEGER  STREAM)
         INTEGER  I,J
         RECORD (XF)NAME  FILE
         D1_X=K'160032'+STREAM<<1
          IF  D2_X_STRD == NULL THEN  PRINTSTRING(".NULL
")        AND  RETURN 
         FILE==D2_X_STRD_FILE
         PRINT SYMBOL(FILE_UNIT+'0');   PRINT SYMBOL('.')
         CYCLE  I=0,1,5
            J=FILE_FNAME(I);   EXIT  IF  J=' '
            PRINT SYMBOL(J)
         REPEAT 
         PRINT SYMBOL('(');   PRINT SYMBOL(FILE_FSYS>>3+'0')
         PRINT SYMBOL(FILE_FSYS&7+'0');   PRINT SYMBOL(')')
END 

CONSTBYTEINTEGERARRAY  JOB CTRL1(0:31)=X'80',27,'/','/',0(6),' ',
   'F','I','L','E',' ','(','P','A','S','S','=',0(4),')',NL,X'80',0,'/','/'
CONSTBYTEINTEGERARRAY  JOB CTRL2(0:7)=' ','D','D',' ','*',NL,X'80',0

INTEGERFN  READ WORD(INTEGER  POSN,LENGTH)
INTEGER  I,J
CYCLE  I=0,1,LENGTH-1
   READ SYMBOL(J);   RESULT =I IF  J=NL
   BUFFER(POSN+I)=J
REPEAT 
READ SYMBOL(J);   RESULT =LENGTH IF  J=NL
READ SYMBOL(J) UNTIL  J=NL
RESULT =0
END 

      ROUTINE  SET CR FILE
         CYCLE 
            PROMPT("CR FILE:")
             SKIPSYMBOL IF  NEXTSYMBOL=NL
            IF  NEXTSYMBOL='.' START 
               SKIPSYMBOL
               IF  NEXTSYMBOL='T' START 
                  SKIPSYMBOL; SKIPSYMBOL; SKIPSYMBOL
                  CR FILE_UNIT = 255
                   SET B FLAG = 0;      ! ALLWAYS IN ISO
                  RETURN 
               FINISH 
            FINISH 

            IF  EXIST(1, CR FILE) = 1 THEN  EXIT 
         REPEAT 
         SET STREAM(1, CR FILE)
      END 

ROUTINE  READ BUFFER
INTEGER  GET,PUT,LIMIT,NL POSN,CHAR,LEN POSN,I,F
ROUTINE  BUMP
   I=I+1
   PUT=PUT+1
   PUT=0 IF  PUT = BUFFER SIZE
END 

ROUTINE  INSERT LINE LENGTH

   BUFFER(LEN POSN)=I
   HOST_CR COUNT=HOST_CR COUNT+I
   IF  HOST_CR COUNT>=1024 START 
      HOST_CR COUNT=HOST_CR COUNT-1024
      HOST_CR K=HOST_CR K+1
   FINISH 
   BUFFER(PUT)=X'80';   BUMP
   LEN POSN=PUT;         BUMP
   I=0

END 


PUT=CR PUT;   GET=CR GET
NL POSN=-1;  F=0
LEN POSN=CR LEN POSN
I=BUFFER(LEN POSN)
SELECT INPUT(1) UNLESS  CR FILE_UNIT = 255
CYCLE 
   READSYMBOL(CHAR)
   IF  (SET B FLAG=0 AND  CHAR=4) OR  CHAR<0 START 
      NO OF FILES = NO OF FILES-1
      IF  NO OF FILES > 0 START ;       ! MORE TO GO
         MESS(CR, 'FILE DONE
')
         SELECT INPUT(0)
          SET BFLAG = BIN FLAG
         SET CR FILE
         SELECT INPUT(1) UNLESS  CR FILE_UNIT=255
         CONTINUE ;            ! GET NEXT SYMBOL
      FINISH 
      HOST_STATUS(CR)=STOPPING IF  F=0
      CR EOF=1
      EXIT 
   FINISH 
   F = 1;               ! CHARACTER PLANTED THIS TIME ROUND
   BUFFER(PUT)=CHAR
   NL POSN=PUT IF  CHAR=NL OR  CHAR=12 OR  CHAR=13
   BUMP
   IF  CHAR=10 OR  CHAR=12 OR  CHAR=13 START 
      INSERT LINE LENGTH
   FINISH 
   EXIT  IF  PUT<=GET AND  PUT+5>GET
   EXIT  IF  PUT>GET AND  PUT+5-BUFFER SIZE>GET
REPEAT 
IF  NL POSN = -1 START 
     IF  PUT = 0 THEN  NL POSN = BUFFER SIZE-1 ELSE  C 
         NL POSN = PUT-1
      INSERT LINE LENGTH
  FINISH 
CR END=NL POSN;   CR PUT=PUT
CR LEN POSN=LEN POSN;   BUFFER(LEN POSN)=I
SELECT INPUT(0)
END 

ROUTINE  FILL BUFFER
INTEGER  GET,END,LIMIT,I,J
GET=CR GET;   END=CR END
HOST_STATUS(CR)=STOPPING IF  CR EOF#0
CYCLE  I=0,1,BUFFER SIZE-1
   BLOCK_DATA(I)=BUFFER(GET)
   J=GET;   GET=GET+1
   GET=0 IF  GET = BUFFER SIZE
   EXIT  IF  J=END
REPEAT 
P_MES_LEN=I+2
CR GET=GET
END 

INTEGERFN  EXIST(INTEGER  STREAM,RECORD (XF)NAME  FILE)
RECORDFORMAT  PF(BYTEINTEGER  SERVICE,REPLY,INTEGER  A1,  C 
   RECORD (XF)NAME  A2,INTEGER  A3)
RECORD (PF) P
CONSTINTEGERARRAY  DIRT(0:3)=4,4,9,15
IF  READ FNAME(FILE) START 
   P_SERVICE=DIRT(FILE_UNIT);   P_REPLY=ID
   P_A1=0;   P_A2==FILE;   P_A3=0
   PONOFF(P)
   RESULT =1 IF  P_A1#0
FINISH 
MESS(CR,'NO FILE');   NEWLINE
RESULT =0
END 

ROUTINE  GET BUFFER(INTEGER  REASON)
P_SERVICE=BUFFER MANAGER;   P_REPLY=ID
P_FN=REQUEST BUFFER;   P_LEN=0;   P_S1=REASON
PON(P)
END 

ROUTINE  FREE BUFFER(RECORD (MEF)NAME  MES)
P_SERVICE=BUFFER MANAGER;   P_REPLY=ID
P_FN=RELEASE BUFFER;   P_MES==MES
PON(P)
END 

ROUTINE  CONNECT(INTEGER  HOST NO,FACILITY)
P3_SERVICE=GATE SER;   P3_REPLY=ID
P3_FN=OPEN CALL;   P3_PORT=1;   P3_FACILITY=FACILITY
P3_TERM=HOST NO
PON(P)
END 

ROUTINE  TO GATE(INTEGER  FN,RECORD (MEF)NAME  MES,INTEGER  FLAG)
P_SERVICE=GATE SER;   P_REPLY=ID
P_FN=FN;   P_MES==MES;   P_S1=FLAG
PON(P)
END 

ROUTINE  DO ITP
INTEGER  I
RETURN  IF  TT STATE=STOPPING
FRAME==P_MES_NSL_ITP
GAH CT=GAH CT+1 IF  FRAME_HB1&2#0
TT STATE=STOPPING AND  TO GATE(ABORT CALL,P_MES,0) IF  FRAME_HB1&4#0
IF  FRAME_HB1&1=1 START 
   IF  FRAME_HB2&2#0 AND  FRAME_LEN=1 AND  FRAME_DATA(0)=0 THEN   C 
      TO TT(ECHO OFF)
   IF  FRAME_HB2&4#0 THEN  GOOD TEXT=8
   IF  FRAME_HB2&8#0 THEN  GARBAGE=1
   RETURN 
FINISH 
GARBAGE=0 IF  GARBAGE=1 AND  FRAME_HB2&8#0
IF  GARBAGE=0 START 
   PRINT SYMBOL(FRAME_DATA(I)) FOR  I=0,1,FRAME_LEN-1
   IF  FRAME_HB2&4=0 THEN  GET BUFFER(ITP GAH)   C 
   ELSE  PROMPT('') AND  TT STATE=OPENED
ELSE  IF  FRAME_HB2&4=0 START 
   GET BUFFER(ITP GAH)
FINISH 
END 

ROUTINE  FROM GATE
INTEGER  I,J,K,L
RECORD  (ME3F) NAME  MES3
SWITCH  SW(OPEN CALL REPLY:MESSAGE REPLY)
->SW(P_FN)

SW(OPEN CALL REPLY):RETURN 

SW(INCOMING CALL):
   I=1
      IF  HOST_STATUS(LP)=OPENED START 
         HOST_PORT(LP)=P_PORT
         MESS(P3_FACILITY,'STARTING ')
         P_LEN=16 IF  P_LEN=0
         TO GATE(CALL REPLY,P_MES,P_LEN)
         HOST_STATUS(LP)=RUNNING
         LP BASE FILE_FNAME(3)=I+'0'
         SET STREAM(5,LP BASE FILE)
         J=LP BASE FILE_FNAME(5)+1
         IF  J>'9' START 
            K=LP BASE FILE_FNAME(4)+1
            IF  K>'4' START 
               LP BASE FILE_FSYS=LP BASE FILE_FSYS+1
               K='0'
            FINISH 
            LP BASE FILE_FNAME(4)=K
            J='0'
         FINISH 
         LP BASE FILE_FNAME(5)=J
         HOST_LP COUNT=0;   HOST_LP K=0
         PRINT FILE(I+4);   NEWLINE
         RETURN 
      FINISH 
   TO GATE(CALL REPLY,NULL,REJECT)
   RETURN 

SW(INPUT RECD):
   TO GATE(ENABLE INPUT,P_MES,0) 
   IF  P_PORT=TT PORT THEN  DO ITP ELSE  START 
      I=1
         IF  P_PORT=HOST_PORT(LP) START 
            SELECT OUTPUT(1)
            K=0;   BUFF==P2_MES_NSL_RJE_DATA
            L=P2_MES_NSL_RJE_UFLAG
            UNTIL  K+1>=P_MES_LEN CYCLE 
               IF  BUFF(K)>127 THEN  K=K+1
               J=BUFF(K)
              CYCLE  K=K+1,1,K+J
                  PRINT SYMBOL(BUFF(K))
               REPEAT 
               J=J+HOST_LP COUNT
               J=J-1024 AND  HOST_LP K=HOST_LP K+1 IF   C 
                  J>=1024
               HOST_LP COUNT=J
               K=K+1
            REPEAT 
            SELECT OUTPUT(0)
         FINISH 
   FINISH 
   FREE BUFFER(P_MES)
   RETURN 

SW(OUTPUT TRANSMITTED):
      IF  P_PORT=HOST_PORT(CR) START 
         IF  HOST_STATUS(CR)=STOPPING START 
            TO GATE(CLOSE CALL,NULL,0)
            HOST_STATUS(CR)=STOPPING2
         ELSE 
            P_PORT=1
            GET BUFFER(CR DATA)
         FINISH 
         RETURN 
      FINISH 
   IF  P_PORT = TT PORT AND  PEND GAH#0 START 
        !! SEND A GO AHEAD
        GET BUFFER(ITP GAH)
        PEND GAH = PEND GAH-1
   FINISH 
   RETURN 

SW(CALL CLOSED):
   IF  P_PORT=TT PORT START 
      TO GATE(CLOSE CALL,NULL,0) UNLESS  TT STATE=STOPPING
      MESS(TT,'CLOSED');   NEWLINE
      TT STATE=IDLE;   TT PORT=-1
      RETURN 
   FINISH 
      IF  P_PORT=HOST_PORT(LP) START 
         TO GATE(CLOSE CALL,NULL,0)
         MESS(LP,'FINISHED')
         PRINT COUNT(HOST_LP K,HOST_LP COUNT)
         NEWLINE
         IF  HOST_STATUS(LP)=CLOSED THEN  HOST_STATUS(LP)=IDLE C 
            ELSE  HOST_STATUS(LP)=OPENED;   HOST_PORT(LP)=-1
         SELECT OUTPUT(1);   CLOSE OUTPUT
         SET STREAM(1+4,LP BASE FILE); ! FRIG TO GET ROUND PERM FAULT
         RETURN 
      FINISH 
      IF  P_PORT=HOST_PORT(CR) AND  HOST_STATUS(CR)=STOPPING2 START 
         MESS(CR,'FINISHED')
         PRINT COUNT(HOST_CR K,HOST_CR COUNT)
         NEWLINE
         HOST_STATUS(CR)=IDLE;   HOST_PORT(CR)=-1
         RETURN 
      FINISH 
   RETURN 

SW(CALL ABORTED):
   IF  P_PORT=TT PORT START 
      TO GATE(ABORT CALL,NULL,0) UNLESS  TT STATE=STOPPING
      MESS(TT,'ABORTED');   NEWLINE
      TT STATE=IDLE;   TT PORT=-1
      RETURN 
   FINISH 
      CYCLE  J=CR,1,LP
         IF  P_PORT=HOST_PORT(J) START 
            TO GATE(ABORT CALL,NULL,0)
            MESS(J,'ABORTED');   NEWLINE
            HOST_STATUS(J)=IDLE;   HOST_PORT(J)=-1
            SELECT OUTPUT(1) AND  CLOSE OUTPUT IF  J=LP
            RETURN 
         FINISH 
      REPEAT 
   RETURN 

SW(OPEN REPLY A):
   IF  P3_FACILITY=18 THEN  TT PORT=P3_X ELSE  HOST_PORT(CR)=P3_X
   RETURN 

SW(OPEN REPLY B):
   IF  P_PORT=TT PORT START 
      IF  P_S1#0 START 
         MESS(TT,'CONNECT FAILS');   WRITE(P_S1,0);   NEWLINE
         TT STATE=IDLE;   TT PORT=-1
         TO TT(RD)
      ELSE 
         MESS(TT,'CONNECTED');   NEWLINE
         TT STATE=RUNNING
         GET BUFFER(ITP HELLO)
         PEND GAH = 3
      FINISH 
      RETURN 
   FINISH 
      IF  P_PORT=HOST_PORT(CR) START 
         IF  P_S1#0 START 
            ALARM(100) AND  RETURN  IF  CR TIMER=1
            MESS(CR,'CONNECT FAILS');   WRITE(P_S1,0);   NEWLINE
            IF  CR TIMER=0 AND  CR STRM#SET PR START 
               MESS(CR,'WILL KEEP TRYING');   NEWLINE
               ALARM(100);   CR TIMER=1
            ELSE 
               HOST_STATUS(CR)=IDLE;   HOST_PORT(CR)=-1
            FINISH 
         ELSE 
            MESS(CR,'CONNECTED');   NEWLINE
            HOST_CR COUNT=0;   HOST_CR K=0
            P_PORT=1
            SET B FLAG = BIN FLAG
            SET CR FILE
            J=0
            CR GET=0
            IF  CR STRM=12 AND  CR HEAD=1 START 
!               BUFFER(K)=JOB CTRL1(K) %FOR K=0,1,31
!               PROMPT('USER:') %UNTIL READ WORD(4,6)=6
!               %UNTIL READ WORD(22,4)=4 %CYCLE
!                  TO TT(ECHO OFF)
!                  PRINT STRING('BACKGROUND PASS:')!   PROMPT('')
!               %REPEAT
!               %UNTIL K>0 %CYCLE
!                  PROMPT('HOST FILENAME:')
!                  K=READ WORD(32,8)
!               %REPEAT
!               BUFFER(29)=K+8
!               J=K+32
!               BUFFER(J+K)=JOB CTRL2(K) %FOR K=0,1,7
!               CR LEN POSN=J+7!   CR PUT=J+8
            ELSE 
               BUFFER(0)=X'80'; BUFFER(1) = 0
               CR LEN POSN=1;   CR PUT=2
            FINISH 
            GET BUFFER(CR DATA)
            READ BUFFER
            HOST_STATUS(CR)=RUNNING
            CR TIMER=0
         FINISH 
         TO TT(RD)
         RETURN 
      FINISH 
   RETURN 

SW(MESSAGE IN):
   MES3==P_MES
   MESSAGE==MES3_NSL_MESSAGE
I=P3_TERM;       !ADDRESS
   WRITE(I,1)
   PRINT SYMBOL(':')
   I=0
   UNTIL  I>=P_MES_LEN CYCLE 
      SPACES(3) UNLESS  I=0
      IF  MESSAGE_DATA(I)>127 THEN  I=I+1;   J=MESSAGE_DATA(I)
      CYCLE  I=I+1,1,I+J
         L=MESSAGE_DATA(I)
         PRINT SYMBOL(L)
      REPEAT 
      NEWLINE UNLESS  L=NL;   I=I+1
   REPEAT 
   TO GATE(CALL REPLY,P_MES,128)
      RETURN 

SW(MESSAGE REPLY):               ! GATE VSN 3 ONWARDS
       PRINTSTRING("SM:");  WRITE(P2_S1, 3); NEWLINE
        FREE BUFFER(P2_MES)
END 

      ROUTINE  FROM BUFFER MANAGER
         INTEGER  I,J
         RECORD  (ME2F) NAME  MES
        RECORD (ME3F) NAME  MES3
         SWITCH  SW(ITP HELLO:SOCIAL CALL)

         MES == P_MES
         FRAME==P_MES_NSL_ITP;   FRAME_CNSL=0
         BLOCK==MES_NSL_RJE
          MES3==P_MES
           MESSAGE==MES3_NSL_MESSAGE
         ->SW(P_S1)

SW(ITP HELLO):
            FRAME_HB1=8;   FRAME_HB2=0;   FRAME_LEN=LINE LENGTH-3
            FRAME_DATA(I)=LINE(I+3) FOR  I=0,1,FRAME_LEN-1
            P_MES_LEN=4+FRAME_LEN
            TO TT(RD)
            ->END

SW(ITP GAH):
            FREE BUFFER(P_MES) AND  RETURN  IF  TT STATE=IDLE ORC 
               TT STATE=STOPPING
            FRAME_HB1=3;   FRAME_HB2=0;   FRAME_LEN=0;   P_MES_LEN=4
            ->END

SW(ITP MESS):
            IF  GAH CT>0 THEN  GAH CT=GAH CT-1 ELSE  START 
               MESS(TT,'NO GAH');   NEWLINE
               FREE BUFFER(P_MES)
               TO TT(RD)
               RETURN 
            FINISH 
            FRAME_HB1=0;   FRAME_HB2=2+GOOD TEXT;   FRAME_LEN=LINE LENGTH+1
            GOOD TEXT=0
            FRAME_DATA(I)=LINE(I) FOR  I=0,1,LINE LENGTH-2
            FRAME_DATA(I+1)=13;   FRAME_DATA(I+2)=10
            P_MES_LEN=4+FRAME_LEN
            TT STATE=RUNNING
            P_PORT=TT PORT
            TO TT(RD)
            ->END

SW(ITP INT):
            FRAME_HB1=1;   FRAME_HB2=1
            LPTR=LPTR+1 WHILE  LINE(LPTR)=' '
            FRAME_LEN=LINE LENGTH-LPTR-1
            FRAME_DATA(I)=LINE(LPTR+I) FOR  I=0,1,FRAME_LEN-1
            P_MES_LEN=FRAME_LEN+4
            P_PORT=TT PORT
            TO TT(RD)
            ->END

SW(SOCIAL CALL):
            MESSAGE_DATA(I)=LINE(LPTR+I) FOR  I=1,1,LINE LENGTH-LPTR-1
            MESSAGE_DATA(0)=LINE LENGTH-LPTR-1
            P3_TERM=P_PORT;   P_PORT=0;   
            MES_LEN=LINE LENGTH-LPTR
            TO GATE(OPEN MESSAGE,P_MES,STRM)
            TO TT(RD)
            RETURN 


SW(RJE LOGON):
SW(RJE LOGOFF):
               MESSAGE_DATA(1) = P_S1-RJE LOGON;   ! LOGOFF = LOGON+1 !!!!
               MESSAGE_DATA(0)=2; MESSAGE_DATA(2)=X'E5'
            P_MES_LEN=3
            P_PORT = 0
            P3_TERM=TERM
            TO GATE(OPEN MESSAGE,P_MES,TERM)
            RETURN 

SW(CR DATA):
            FILL BUFFER
            IF  SETBFLAG=0 THEN  P2_MES_NSL_RJE_UFLAG=5 ELSE  C 
             P2_MES_NSL_RJE_UFLAG = 1
            P_PORT=HOST_PORT(CR)
            TO GATE(PUT OUTPUT,P_MES,0)
            IF  HOST_STATUS(CR)#STOPPING THEN  READ BUFFER
            RETURN 

         END:
            TO GATE(PUT OUTPUT,P_MES,0)
      END 

INTEGERFN  DO SP
  CONSTBYTEINTEGERARRAY  NODEX(0:5) = 4, 'N', 'O', 'D', 'E', 0
   IF  MATCH(NODEX) START ; ! CHANGE DEFAULT NODE SETTING
      TARGET NODE = LINE(LPTR+1)-'0'
      RESULT  = 1
   FINISH 
RESULT  = 0
END 

INTEGERFN  DO TT
INTEGER  I
IF  MATCH(STATUS) START 
   MESS(TT,STAT(TT STATE));   NEWLINE
   RESULT =1
FINISH 
IF  TT STATE=IDLE START 
   I=1
      IF  READ ADDRESS#0 START 
         TT HOST = TERM
         CONNECT(TT HOST,18)
         TT STATE=STARTING
         RESULT =2
      FINISH 
ELSE  IF  TT STATE#STARTING START 
   IF  MATCH(INT) START 
      GET BUFFER(ITP INT)
      RESULT =2
   FINISH 
   IF  MATCH(KILL) START 
      P_PORT=TT PORT
      TO GATE(ABORT CALL,NULL,0) UNLESS  TT STATE=STOPPING
      TT STATE=STOPPING
      RESULT =1
   FINISH 
FINISH 
RESULT =0
END 

INTEGERFN  DO OP(INTEGER  STREAM)
INTEGER  I
   STRM = STREAM
   IF  MATCH(DO ENABLE) START ;       ! ENABLE MESSAGES FROM GATE
      TO GATE(ENABLE FACILITY, NULL, 1)
      TO GATE(ENABLE FACILITY, NULL, 2)
      TO GATE(ENABLE FACILITY, NULL, 4)
      RESULT  = 1
   FINISH 
   IF  READ ADDRESS # 0 START 
      P_PORT=TERM
      GET BUFFER(SOCIAL CALL)
      RESULT =2
   FINISH 
RESULT =0
END 

INTEGERFN  DO LO(INTEGER  TYPE)
   IF  READ ADDRESS#0 START 
      P_PORT=TERM
      GET BUFFER(TYPE)
      RESULT =1
      FINISH 
      RESULT  = 0
END 

INTEGERFN  DO CR
INTEGER  I
CONSTBYTEINTEGERARRAY  FILESX(0:6) = 5, 'F','I','L','E','S',0
CONSTBYTEINTEGERARRAY  BINX(0:7) = 6, 'B','I','N','A','R','Y',0

IF  MATCH(STATUS) START 
      MESS(CR,STAT(HOST_STATUS(CR)))
      IF  HOST_STATUS(CR)=RUNNING START 
         PRINT COUNT(HOST_CR K,HOST_CR COUNT)
         PRINT STRING(', FROM ');   PRINT FILE(1)
      FINISH 
      NEWLINE
   RESULT =1
FINISH 
   IF  HOST_STATUS(CR)=IDLE START 
      RESULT  = 0 IF  READ ADDRESS=0
      HOST_NUMBER = TERM; HOST_NODE = NODE
      BIN FLAG = 0
      IF  MATCH(BINX) THEN  BIN FLAG = 1
      IF  MATCH(PRINTER) THEN  CR STRM=4 ELSE  START 
         CR STRM=SET PR
         IF  MATCH(JOB) THEN  CR HEAD=0 ELSE  CR HEAD=1
      FINISH 
      IF  MATCH(FILESX) START 
            NO OF FILES = LINE(LPTR+1)-'0'
      ELSE  NO OF FILES = 1
      CR EOF=0

      CONNECT(TERM,CR STRM)
      HOST_STATUS(CR)=STARTING
      RESULT =2
   FINISH 
RESULT =0
END 

INTEGERFN  DO LP
INTEGER  I,J
CONSTBYTEINTEGERARRAY  NULLA(0:5) = 4, 'N','U','L','L',0

IF  MATCH(STATUS) START 
   I=1
      MESS(LP,STAT(HOST_STATUS(LP)))
      UNLESS  CLOSED#HOST_STATUS(LP)#RUNNING START 
         PRINT COUNT(HOST_LP K,HOST_LP COUNT)
         PRINT STRING(', TO ');   PRINT FILE(I+4)
      FINISH 
      NEWLINE
   RESULT =1
FINISH 
IF  MATCH(NULLA) START 
      LP BASE FILE_UNIT = 255
      RESULT  = 1
FINISH 
IF  MATCH(FILEN) START 
   PROMPT('LP BASE FILE:') UNTIL  READ FNAME(LP BASE FILE)
   LP BASE FILE_FNAME(4)='0';   LP BASE FILE_FNAME(5)='0'
   RESULT =1
FINISH 
   I=1
     IF  MATCH(DO ENABLE) START 
      J=HOST_STATUS(LP)
      IF  J=IDLE OR  J=CLOSED START 
         MESS(LP,'ENABLED')
         IF  J=IDLE THEN  J=OPENED ELSE  J=RUNNING
      ELSE 
         MESS(LP,'DISABLED')
         IF  J=RUNNING THEN  J=CLOSED ELSE  J=IDLE
      FINISH 
      HOST_STATUS(LP)=J
      NEWLINE
      RESULT =1
   FINISH 
RESULT =0
END 




P2==P;   P3==P
D2==D1

LP BASE FILE_UNIT=0;   LP BASE FILE_FSYS=K'21'
LP BASE FILE_FNAME(I)=SPOOL BASE(I) FOR  I=0,1,5
   CYCLE  J=CR,1,LP
      HOST_PORT(J)=-1;   HOST_STATUS(J)=IDLE
   REPEAT 

MAP VIRT(BUFFER MANAGER,5,4)
MAP VIRT(BUFFER MANAGER,6,5)

TO GATE(ENABLE FACILITY,NULL,9)
TO GATE(ENABLE FACILITY, NULL, 6);      ! PP
TO GATE(ENABLE FACILITY, NULL, 7);     ! BT
TO TT(11)
TO TT(RD)

PRINTSTRING("
LP:ENABLED
SM:DISABLED
")
HOST_STATUS(LP) = OPENED

CYCLE 
   P_SERVICE=0;   POFF(P)
   IF  P_REPLY=GATE SER START 
      FROM GATE
   ELSE  IF  P_REPLY =BUFFER MANAGER START 
      FROM BUFFER MANAGER
   ELSE  IF  P_REPLY=TT SER START 
      LINE LENGTH=0
      LINE LENGTH=LINE LENGTH+1 WHILE  LINE(LINE LENGTH)#NL
      LINE LENGTH=LINE LENGTH+1
      LPTR=3
      IF  LINE(2)='/' START 
         I=0
         CHARNO(NEW, 1) = LINE(0); CHARNO(NEW, 2) = LINE(1)
         CYCLE  J = 1, 1, MAX COM
            ->SW(J) IF  COMS(J) = NEW
         REPEAT 
         ->BOT

SW(1):                                  ! TT
         I=DO TT
         ->BOT

SW(2):                                  ! OP
         I = DO OP(11)
         ->BOT

SW(3):                                  ! LO
         I = DO LO(RJE LOGOFF); -> BOT
SW(9):                                  ! LI
         I = DO LO(RJE LOGON); ->BOT
SW(4):                                  ! CR
         I = DO CR;  -> BOT
SW(5):                                  ! SP (SPECIAL)
         I = DO SP;  ->BOT
SW(6):                                  ! LP
         I = DO LP;  -> BOT
SW(7):                                  ! TL (TELL)
SW(8):                                  ! SM (SEND MESSAGE)
         I = DO OP(2); ->BOT
SW(10):                        !STOP
           TO GATE(DISABLE FACILITY,NULL,9)
           TO GATE(DISABLE FACILITY,NULL,6)
           TO GATE(DISABLE FACILITY,NULL,7)
           EXIT 

BOT:
         TO TT(RD) IF  I=1
         CONTINUE  IF  I>0
      FINISH 
      IF  TT STATE=OPENED THEN  GET BUFFER(ITP MESS) ELSE  START 
         MESS(TT,'INVALID');   NEWLINE
         TO TT(RD)
      FINISH 
   ELSE 
      CONNECT(HOST_NUMBER,CR STRM)
   FINISH 
REPEAT 

!MAP VIRT(GATE SER,7,4)
!GATE INT='D'
!TO TT(12)

ENDOFPROGRAM