!********************** !* NLPS/NLPY * !* DATE: 11.MAR.80 * !********************* %CONSTSTRING (7) VSN = "VSN001C" !! STACK = 400, STREAMS = 3 %CONTROL K'100001' !STACK=400, STREAMS=1 %RECORDFORMAT XF(%BYTEINTEGER UNIT,FSYS,%BYTEINTEGERARRAY FNAME(0:5)) %SYSTEMROUTINESPEC ALARM(%INTEGER TICKS) %SYSTEMROUTINESPEC LINKIN(%INTEGER SER) %BEGIN %CONSTINTEGER CONTROL SER = 11 %RECORDFORMAT RJEF(%BYTEINTEGERARRAY DATA(0:239)) %RECORDFORMAT NSI1F(%BYTEINTEGER FN,SUFL,ST,SS,FLAG,UFLAG, %C %RECORD(RJEF) ITP) %RECORDFORMAT NSI2F(%BYTEINTEGER FN,SUFL,ST,SS,FLAG,UFLAG, %C %RECORD(RJEF) RJE) %RECORDFORMAT MEF(%RECORD(MEF)%NAME LINK,%BYTEINTEGER LEN,TYPE, %C %RECORD(NSI1F) 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,FACILITY,FLAG,NODE,TERM) %RECORDFORMAT P4F(%BYTEINTEGER SER, REPLY, A1, A2, B1, B2, C1, C2) %RECORD(PF) P; %RECORD(P2F)%NAME P2; %RECORD(P3F)%NAME P3 %RECORD (P4F) %NAME P4 %CONSTRECORD(MEF)%NAME NULL=0 %CONSTINTEGER TT=0,LO=1,CR=2,LP=3,BT=7 %OWNINTEGER LP PORT, LP COUNT, LP STATUS, LP K %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 %RECORDFORMAT D3F(%BYTEINTEGERNAME N); %RECORD (D3F) %NAME D3 %RECORDFORMAT D5F(%STRINGNAME S); %RECORD (D5F) %NAME D5 %RECORD(XF) LP BASE FILE %CONSTBYTEINTEGERARRAY SPOOL BASE(0:5)='V','L','P','0','0','0' %CONSTBYTEINTEGERARRAY STATUS(0:6)=6,'S','T','A','T','U','S' %CONSTBYTEINTEGERARRAY DO ENABLE(0:7) = 6, 'E', 'N', 'A', 'B', 'L', 'E',0 %BYTEINTEGERARRAYNAME BUFF %CONSTBYTEINTEGERNAME ID=K'160030' %OWNBYTEINTEGERARRAY LINE(0:119) %OWNINTEGER LPTR,LINE LENGTH,I %CONSTINTEGER GATE SER=16, BUFFER MANAGER=17 %CONSTINTEGER RD=0 %CONSTINTEGER REQUEST BUFFER=0, RELEASE BUFFER=1 %CONSTINTEGER ENABLE FACILITY=1, CALL REPLY=3 %CONSTINTEGER ENABLE INPUT=4, CLOSE CALL=6 %CONSTINTEGER ABORT CALL=7 %CONSTINTEGER OPEN CALL REPLY=1, INCOMING CALL=2, INPUT RECD=3 %CONSTINTEGER CALL CLOSED=5, CALL ABORTED=6 %CONSTINTEGER REJECT=0 %CONSTINTEGER IDLE=0, RUNNING=1, OPENED=2, CLOSED=3 %CONSTSTRING(9)%ARRAY STAT(0:3)= 'Idle', 'Running', 'Enabled', 'Running' %OWNSTRINGNAME LINEX %ROUTINE TO TT(%INTEGER FN) %RECORDFORMAT PF(%BYTEINTEGER SERVICE,REPLY,%INTEGER A1, %C %BYTEINTEGERARRAYNAME A2,%INTEGER A3) %RECORD(PF) P P_SERVICE=CONTROL SER; P_REPLY=ID P_A1=FN!1<<8; P_A2==LINE; P_A3=120 PON(P) %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(%RECORD(XF)%NAME FILE) %CONSTINTEGERARRAY DISC(0:3)=3,3,8,14 %OWNRECORD (STRDF) %NAME STRD5 D1_X=K'160032'+5<<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 I,J %RECORD(XF)%NAME FILE D1_X=K'160032'+5<<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 %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 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 FROM GATE %INTEGER I,J,K,L %SWITCH SW(OPEN CALL REPLY:CALL ABORTED) ->SW(P_FN) SW(INCOMING CALL): %IF LP STATUS=OPENED %START PRINTSTRING("LP: Starting ") P_LEN=16 %IF P_LEN=0 TO GATE(CALL REPLY,NULL,P_LEN) LP STATUS=RUNNING SET STREAM(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 LP COUNT=0; LP K=0 PRINT FILE; NEWLINE %RETURN %FINISH TO GATE(CALL REPLY,NULL,REJECT) %RETURN SW(INPUT RECD): TO GATE(ENABLE INPUT,P_MES,0) %UNLESS P_MES_NSL_FLAG&128#0 SELECT OUTPUT(1) K=0; BUFF==P2_MES_NSL_RJE_DATA L=P2_MES_NSL_UFLAG %UNTIL K+6>=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+LP COUNT J=J-1024 %AND LP K=LP K+1 %IF %C J>=1024 LP COUNT=J K=K+1 %REPEAT SELECT OUTPUT(0) FREE BUFFER(P_MES) %RETURN SW(CALL CLOSED): TO GATE(CLOSE CALL,NULL,0) PRINTSTRING("LP:Finished") PRINT COUNT(LP K,LP COUNT) NEWLINE %IF LP STATUS=CLOSED %THEN LP STATUS=IDLE %C %ELSE LP STATUS=OPENED SELECT OUTPUT(1); CLOSE OUTPUT SET STREAM(LP BASE FILE); ! FRIG TO GET ROUND PERM FAULT %RETURN SW(CALL ABORTED): TO GATE(ABORT CALL,NULL,0) PRINTSTRING("LP:Aborted ") LP STATUS=IDLE SELECT OUTPUT(1) ; CLOSE OUTPUT %RETURN %END %INTEGERFN DO LP %INTEGER I,J %CONSTBYTEINTEGERARRAY NULLA(0:5) = 4, 'N','U','L','L',0 %IF MATCH(STATUS) %START PRINTSTRING("LP:"); PRINTSTRING(STAT(LP STATUS)) %UNLESS CLOSED#LP STATUS#RUNNING %START PRINT COUNT(LP K,LP COUNT) PRINT STRING(", to "); PRINT FILE %FINISH NEWLINE %RESULT=1 %FINISH %IF MATCH(NULLA) %START LP BASE FILE_UNIT = 255 %RESULT = 1 %FINISH %IF MATCH(DO ENABLE) %START %IF LP STATUS=IDLE %OR LP STATUS=CLOSED %START PRINTSTRING("LP:Enabled") %IF LP STATUS=IDLE %THEN LP STATUS=OPENED %ELSE LP STATUS=RUNNING %ELSE PRINTSTRING("LP:Disabled") %IF LP STATUS=RUNNING %THEN LP STATUS=CLOSED %ELSE LP STATUS=IDLE %FINISH NEWLINE %RESULT=1 %FINISH %RESULT=0 %END P2==P; P3==P; P4==P D2==D1; D3 == D2; D5 == D3 LP BASE FILE_UNIT=0; LP BASE FILE_FSYS=K'16' LP BASE FILE_FNAME(I)=SPOOL BASE(I) %FOR I=0,1,5 MAP VIRT(BUFFER MANAGER,5,4) MAP VIRT(BUFFER MANAGER, 6, 5) TO GATE(ENABLE FACILITY, NULL, 4) TO GATE(ENABLE FACILITY, NULL, 6) D3_N == LINE(0) LINEX == D5_S TO TT(RD) LP STATUS = OPENED %CYCLE P_SERVICE=0; POFF(P) %IF P_REPLY=GATE SER %START FROM GATE %ELSE %IF P_REPLY=CONTROL SER %START LINE LENGTH = LINE(0) LPTR=3 I = DO LP TO TT(RD) %IF I<= 0 %THEN PRINTSTRING("TT: INVALID ") %FINISH %REPEAT %ENDOFPROGRAM MESSAGE(TT,'INVALID'); NEWLINE