!**********************
!* 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