!********************** !* 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=1; LP BASE FILE_FSYS=K'16' 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