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