%CONTROL K'100001' ! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! SIMPLE INTERACTIVE VIDEO CLUSTER ! ! DATE OF FIRST CODING 10TH JAN 1980 ! ! LAST UPDATED 12TH MAR 1980 FILE SIVCS9 ! ! STACK=3000, STREAMS=1 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! %BEGIN ! %SYSTEMROUTINESPEC LINKIN(%INTEGER SERVICE) %SYSTEMROUTINESPEC ALARM(%INTEGER TICKS) !%SYSTEMROUTINESPEC SVC(%INTEGER A,B,C) ! !*** MAIN DATA STRUCTURES RECORD FORMATS ! %RECORDFORMAT TF (%BYTEINTEGER GROUP,ADDRESS,STATE,LENG,LINE,SPEED,ENDFLAG, %C SCRIPT SER,SCRIPT REF,%BYTEINTEGERARRAY HEADER(0:2),TEXT(0:63)) %RECORDFORMAT GF (%BYTEINTEGER LINE,ADDRESS,STATE,TOGGLE, %C %INTEGER POINTER,%RECORD(TF)%NAME TERMINAL) %CONSTINTEGER MAXGROUPS=3; !MAX GROUPS HANDLED %CONSTINTEGER MAXTERMS=16; !MAX TERMS HANDLED %CONSTINTEGER MAXLINES=1; !PHYSICAL LINES-1 1 PROT SER FOR EACH ! %OWNRECORD (GF) %ARRAY GROUPS(1:MAXGROUPS) %OWNRECORD (GF) %NAME GROUP; !CURRENT GROUP %OWNRECORD (TF) %ARRAY TERMS(1:MAXTERMS) %OWNRECORD (TF) %NAME TERM; !CURRENT TERMINAL %CONSTRECORD(TF)%NAME NULL=0 ! %OWNINTEGER GRPS; !ACTUAL NO OF GROUPS %OWNINTEGER TRMS; !ACTUAL NO OF TERMS %OWNBYTEINTEGERARRAY LINSER(0:MAXLINES);!RELATES LINES TO PROTOCOL HANDLERS %OWNINTEGER MONIT=0; !FOR MONITORING CONTROL ! !*** MESSAGE PASSING FORMATS ! %RECORDFORMAT PF (%BYTEINTEGER SERVICE,REPLY,%INTEGER A1,A2,A3) %RECORDFORMAT PBF(%BYTEINTEGER SERVICE,REPLY,B1,B2,B3,B4,B5,B6) %RECORDFORMAT PSF (%BYTEINTEGER SERVICE,REPLY,%INTEGER A1,A2, %C %BYTEINTEGERARRAYNAME A3) %RECORDFORMAT PZF (%BYTEINTEGER SERVICE,REPLY,%INTEGER A1, %C %BYTEINTEGERARRAYNAME A2,%INTEGER A3) ! %OWNRECORD (PF) P %OWNRECORD (PSF) %NAME PS %OWNRECORD (PBF) %NAME PB %OWNRECORD (PZF) %NAME PZ ! ! %CONSTBYTEINTEGERNAME INT=K'160060'; !INT BYTE %CONSTINTEGER SIVC SER=10; !MY SERVICE NO. %CONSTINTEGER START SER=11; !FOR PROTS ONLY %CONSTINTEGER TIME SER=28 %OWNINTEGER LOGLIM=90; !OUTPUTLIMIT LIMIT %OWNINTEGER I ! !*** GROUP STATES ! %CONSTINTEGER IDLE=0; !SEE TAS PAGE 31 %CONSTINTEGER DATA=1; !AFTER GROUP POLL ! !*** TERMINAL STATES ! %CONSTINTEGER QUIESCENT=0; !SEE TAS PAGE 27 %CONSTINTEGER BUF FILLING=1; !SCRIPT TASK IS FILLING BUFFER %CONSTINTEGER TEXT AVAILABLE=2; !WAITING FOR POLL %CONSTINTEGER TEXT SENT=3; !STILL AVAILABLE %CONSTINTEGER RECEIVE=4; !FORCED INTO THIS--SEE TAS ! !*** SIVC TO PROT INTERFACE ! %CONSTINTEGER RESET=1; !LINE RESET %CONSTINTEGER POLL=2 %CONSTINTEGER SELECT=3; !TEXT BACK %CONSTINTEGER HELLO=4 %CONSTINTEGER PACK=5; !POSITIVE ACK %CONSTINTEGER NACK=6; !NAGATIVE ACK %CONSTINTEGER TXT=7; !TEXT OUT %CONSTINTEGER FREE BUF=8; !RETURN PROT BUFFER ! !*** SPECIAL CHARCATERS ! %CONSTINTEGER SYNC=22; !SEE TAS PAGE 43 %CONSTINTEGER SOH=1 %CONSTINTEGER STX=2 %CONSTINTEGER SET REC='1'; !PRECEEDED BY ESC %CONSTINTEGER SET SEND='4' %CONSTINTEGER ETX=3 %CONSTINTEGER ESC=27 ! !*** LOGGING INDICATORS ! %CONSTINTEGER OUT=1 %CONSTINTEGER IN=2 %CONSTINTEGER PRO=3 %CONSTBYTEINTEGERNAME CHANGE OUT ZERO=K'160310'; !FOR OUTPUT %CONSTINTEGER T3SER=21 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !***** ROUTINES START HERE ***** ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !***** ROUTINES FOR MONITOR DUMPING ONLY ! %ROUTINE DUMP GROUP; !DUMPS CURRENT GROUP RECORD PRINTSTRING('GRP: ') WRITE(GROUP_LINE,1); WRITE(GROUP_ADDRESS,3) WRITE(GROUP_STATE,2); WRITE(GROUP_TOGGLE,3) %IFNOT GROUP_TERMINAL==NULL %START WRITE(GROUP_TERMINAL_ADDRESS,3) %FINISH NEWLINE %END ! %ROUTINE DUMP TERM; !DUMPS CURRENT TERMINAL RECORD PRINTSTRING('TRM: ') WRITE(TERM_GROUP,3); WRITE(TERM_ADDRESS,3) WRITE(TERM_STATE,1); WRITE(TERM_LENG,3) WRITE(TERM_SPEED,4); WRITE(TERM_ENDFLAG,1) WRITE(TERM_LINE,1); WRITE(TERM_SCRIPT SER,2) WRITE(TERM_SCRIPT REF,2); NEWLINE %END ! !***** CALCULATE STATUS FOR ACK (TERMINAL) ! %ROUTINE STATUS ACK(%INTEGER POS) !COMPUTES STATUS FOR CURRENT TERMINAL AND SENDS !PACK OR NACK AS INDICATED BY POS PARAMETER !SEE TAS 6.7.4 FOR DETAILS %INTEGER STATUS STATUS=X'4C'; !ALWAYS SET %IF TERM_STATE=RECEIVE %THEN STATUS=STATUS!1 %IF TERM_STATE=TEXT AVAILABLE %C %OR TERM_STATE=TEXT SENT %THEN STATUS=STATUS!2 %IF TERM_STATE=QUIESCENT %THEN STATUS=STATUS!32 P_A1=POS P_A2=STATUS P_SERVICE=LINSER(TERM_LINE); P_REPLY=SIVC SER PON(P) %IF MONIT&1#0 %START; !%%%%% MONITOR PRINTSTRING('STATUS:') WRITE(POS,1); WRITE(STATUS,3); NEWLINE %FINISH %END ! !***** LOG TO XOT FILE ! %ROUTINE LOG(%INTEGER DIR,%RECORD(TF)%NAME TERM) !THIS ROUTINE GETS A TIME STAMP, ADDS ON AN IN/OUT INDICATOR, !THE TERMINAL ADDRESS (LINE,TERMINAL),TEXT LENGTH, AND IN THE CASE !OF OUTGOING MESSAGES IT COPIES THE TEXT TO THE LOG FILE. ! TO MAINTAIN THE ORIGINAL ERTE FORMAT THE IN/OUT INDICATOR IS !1 FOR OUT,2 FOR IN AND THE TERMINAL NUMBER IS LINE*1000+ADDRESS. %INTEGER TIME,I P_SERVICE=TIME SER P_REPLY=SIVC SER; P_A1=-1 PON(P); !GET TIME STAMP P_SERVICE=SIVC SER P_REPLY=TIME SER; !POSSIBLE PONOFF BUG POFF(P) ! P_A1=SECS, P_A2=1/10TH SECS %IF P_A1>3276 %THEN P_A1=P_A1-3276 TIME=P_A1*10+P_A2 SELECT OUTPUT(1) WRITE(TIME,6) WRITE(DIR,1) WRITE(TERM_LINE*1000+TERM_ADDRESS,5) %IF DIR=OUT %START; !RECORD LINE WRITE(TERM_LENG,3); PRINTSTRING(' ') %CYCLE I=0,1,TERM_LENG-1 PRINTSYMBOL(TERM_TEXT(I)) %REPEAT %FINISH NEWLINE SELECT OUTPUT(1) %END ! !***** HANDLE END OF VIRTUAL PRINTING ! %ROUTINE PRINTEND !KICK SCRIPT TASK ONLY IF STATE IS QUIESCENT-MAY BE RECEIVE %IF TERM_STATE=QUIESCENT %START P_SERVICE=TERM_SCRIPT SER P_REPLY=SIVC SER P_A1=0; P_A2=0; !GET NEXT SCRIPT LINE P_A3=TERM_SCRIPT REF PON(P) %IF MONIT&1#0 %START; !%%%%% MONITOR PRINTSTRING('TO SC') DUMP TERM %FINISH %FINISH %END ! !***** HANDLE MESSAGES FROM SCRIPT TASKS. ! %ROUTINE FROM SCRIPT !THERE ARE 4 TYPES OF MESSAGE FROM A SCRIPT TASK:- ! 1) INITIALISATION PB_B1=0 ! PB_B2=LINE NO. PB_B3=LINE SPEED ! PB_B4=GROUP ADDR PB_B5=SCRIPT REF ! PB_B6=TERMINAL ADRESSS ! 2) BUFFER REQUEST P_A1=-1 ! 3) OUTPUT REQUEST PB_B1=CHARS (<256) ! 4) SCRIPT TASK ENDED P_A2=-1 %INTEGER I %IF PB_B1=0 %START; !INITIALISATION %CYCLE I=1,1,MAXTERMS; !GET FREE SLOT %IF TERMS(I)_SCRIPT SER=0 %START %IF I>TRMS %THEN TRMS=I TERM==TERMS(I) %EXIT %FINISH %REPEAT TERM_GROUP=PB_B4; !GROUP ADDRESS IN POSITION TERM_ADDRESS=PB_B6; !TERMINAL ADDRESS ALSO IN POSITION TERM_SPEED=PB_B3*10; !COMES AS CHARS PER 1/10TH SEC TERM_SCRIPT SER=P_REPLY TERM_SCRIPT REF=PB_B5 TERM_LINE=PB_B2; !FOR MULTIPLE LINES TERM_STATE=QUIESCENT %CYCLE I=1,1,MAXGROUPS; !FIND GROUP-CREATE ONE IF NOT THERE %IF GROUPS(I)_STATE=K'377' %START; !NEW GROUP WANTED GROUPS(I)_STATE=IDLE GROUPS(I)_ADDRESS=TERM_GROUP GROUPS(I)_TOGGLE=TERM_GROUP GROUPS(I)_LINE=TERM_LINE GRPS=GRPS+1 %EXIT %ELSESTART %IF GROUPS(I)_ADDRESS=TERM_GROUP %AND %C GROUPS(I)_LINE=TERM_LINE %THEN %EXIT %FINISH %REPEAT %ELSE %IF P_A2=-1 %START; !SCIPT ENDED %CYCLE I=1,1,TRMS; !THROW ALL TERMS OFF TERM==TERMS(I) %IF TERM_SCRIPT SER=P_REPLY %THEN TERM_SCRIPT SER=0 %REPEAT %ELSESTART; !NOT INIT MESSAGE %CYCLE I=1,1,TRMS; !FIND THIS TERMINAL %IF TERMS(I)_SCRIPT SER=P_REPLY %AND %C TERMS(I)_SCRIPT REF=P_A3 %THEN TERM==TERMS(I) %AND %EXIT %IF I=TRMS %START; !SHOULD NOT HAPPEN SELECT OUTPUT(0) PRINTSTRING('ILLEGAL TERM FROM SCRIPT!') WRITE(P_REPLY,2); WRITE(P_A3,3); NEWLINE %CYCLE; %REPEAT %FINISH %REPEAT %IF P_A1=-1 %START; !REQUEST FOR BUFFER TO FILL %IF TERM_STATE#QUIESCENT %START SELECT OUTPUT(0) PRINTSTRING('BUFFER REQUEST VIOLATION') DUMP TERM %ELSESTART PZ_A1=0; PZ_A2==TERM_TEXT PZ_A3=TERM_SCRIPT REF TERM_STATE=BUF FILLING PS_SERVICE=TERM_SCRIPT SER PS_REPLY=SIVC SER PON(PS) %FINISH %ELSESTART; !MUST BE DATA OUT TERM_LENG=PB_B1; !TEXT LENGTH TERM_STATE=TEXT AVAILABLE LOG(OUT,TERM) %FINISH %FINISH %END ! !***** SEND TEXT TO PROTOCOL HANDLER ! %ROUTINE SEND TEXT PS_A1=TXT PS_A2=TERM_LENG+2; !CHARACTER COUNT PS_A3==TERM_HEADER TERM_HEADER(1)=TERM_ADDRESS; !TAD FIELD PS_SERVICE=LINSER(TERM_LINE) PS_REPLY=SIVC SER PON(PS) TERM_STATE=TEXT SENT %IF TERM_LENG=4 %START; !CHECK FOR LGT %IF TERM_TEXT(0)='L' %AND TERM_TEXT(1)='G' %C %AND TERM_TEXT(2)='T' %THEN TERM_ENDFLAG=1 %FINISH %IF MONIT&1#0 %START; !%%%%% MONITOR PRINTSTRING('TXT OUT ') WRITE(P_SERVICE,2); WRITE(P_A2,3) DUMP TERM %FINISH %END ! !***** HANDLE GROUP POLL ! %ROUTINE HANDLE GROUP POLL !ON ENTRY THE GROUP IS SET UP. !STATUS POLL SEARCHES FOR DATA AND REPORTS !DATA POLL SEARCHES FOR DATA AND SEND IT %INTEGER K ! %INTEGERFN SEARCH; !LOOKS FOR DATA %INTEGER I,K I=GROUP_POINTER; K=I+1 %CYCLE; !LOOK FOR TERMINAL WITH TEXT %IF K>TRMS %THEN K=1 TERM==TERMS(K) %IF TERM_LINE=GROUP_LINE %AND TERM_GROUP=GROUP_ADDRESS %C %AND TERM_STATE=TEXT AVAILABLE %START GROUP_POINTER=K %RESULT=K %FINISH %EXIT %IF K=I K=K+1 %REPEAT %RESULT=0 %END ! %IF PB_B4&1#0 %START; !STATUS POLL %IF SEARCH=0 %THEN P_A2=X'40' %ELSE P_A2=X'42' GROUP_STATE=IDLE ->TX STATUS %ELSESTART; !DATA POLL %IF GROUP_ADDRESS+4=PB_B4&X'7E' %START; !TELELOAD P_A2=X'43' ->TX STATUS %FINISH %IF GROUP_STATE=DATA %AND GROUP_TOGGLE=PB_B4&X'7E' %START TERM==GROUP_TERMINAL; !TOGGLE THE SAME SEND DATA AGAIN K=1; !FLAG TO SEND TEXT %ELSESTART; !TOGGLE CHANGED-NEW DATA K=SEARCH GROUP_TOGGLE=PB_B4&X'7E'; !SAVE TOGGLE TERM==TERMS(K) %IF K#0; !NEW DATA FOUND %FINISH %IF K=0 %THEN P_A2=X'40' %AND ->TX STATUS SEND TEXT; !SEND DATA GROUP_STATE=DATA GROUP_TERMINAL==TERM; !REMEMBER WHICH TERMINAL %RETURN %FINISH ! TX STATUS: P_A1=PACK; !SEND STATUS REPLY P_SERVICE=P_REPLY P_REPLY=SIVC SER PON(P) GROUP_STATE=IDLE %IF MONIT&1#0 %START PRINTSTRING('GP STAT') WRITE(P_A2,3); DUMP GROUP %FINISH ! %END ! !***** HANDLE MESSAGES FROM PROTOCOL HANDLER ! %ROUTINE FROM PROT !THERE ARE FOUR KINDS OF MESSAGE FROM PROT:- ! 1) RESET WHICH SETS GROUP CONTROLS TO IDLE ! 2) SELECT WHICH IS DATA IN ! 3) POLLS TO REQUEST DATA OUT ! 4) HELLO MESSAGE TO IDENTIFY LINE ! ! THE PARAMATERS ARE AS FOLLOWS:- ! FOR RESET PB_B3=LINE NO;! FOR POLL PB_B3=LINE NO AND PB_B4=CAD ! FOR SELECT P_A3=DATA BUFFER,PB_B3=LINE NO AND PB_4 IS SET TO ! 0 FOR GOOD BLOCK, 255 FOR BAD. FOR HELLO P_A2=LINE NUMBER. ! %INTEGER I,CHARS,TNO,FLAG,RBUF,CRCFLAG,PROFLAG %BYTEINTEGERARRAYNAME IBUF; !POINTS TO DATA IN %RECORDFORMAT ADRF(%INTEGER X) %RECORDFORMAT ARRF(%BYTEINTEGERARRAYNAME Y) %OWNRECORD(ARRF)%NAME YF %OWNRECORD(ADRF) XF %CONSTINTEGER MSEG=4; !FOR MAPPING ! %ROUTINE GET TERM(%INTEGER LINE,ADDRESS) !THIS ROUTINE SEARCHES THE ARRAY TERMS TO GET THE !TERMINAL ON THE CORERECT LINE AND ADDRESS %INTEGER I,J,K %CYCLE I=1,1,TRMS TERM==TERMS(I) %EXITIF TERM_LINE=LINE %AND TERM_ADDRESS=ADDRESS&X'7E' %IF I=TRMS %START; !NOT FOUND! P_SERVICE=P_REPLY; P_REPLY=SIVC SER P_A1=PACK; P_A2=X'40'; PON(P); !MUST BE POLL TO NOTHING TNO=0; %RETURN %FINISH %REPEAT TNO=I %END ! CRCFLAG=PB_B4 %IF P_A1=RESET %START; !** RESET %CYCLE I=1,1,GRPS; !FIND ALL GROUPS ON THAT LINE GROUP==GROUPS(I) %IF GROUP_LINE=PB_B3 %START GROUP_STATE=IDLE GROUP_TOGGLE=GROUP_ADDRESS %FINISH %REPEAT SELECT OUTPUT(0) PRINTSTRING(' GEN RESET ! ') WRITE(PB_B3,4); NEWLINE SELECT OUTPUT(1) %ELSEIF P_A1=POLL %START; !** POLL %CYCLE I=1,1,GRPS; !IS IT A GROUP POLL? GROUP==GROUPS(I) %IF GROUP_LINE=PB_B3 %START %IF GROUP_ADDRESS=PB_B4&X'7C' %C %OR GROUP_ADDRESS+4=PB_B4&X'7E' %START HANDLE GROUP POLL %RETURN %FINISH %FINISH %REPEAT ! %IF TRMS=0 %START; !SCRIPTS NOT STARTED YET P_A1=PACK; P_A2=X'40' P_SERVICE=P_REPLY; P_REPLY=SIVC SER PON(P) %RETURN %FINISH GET TERM(PB_B3,PB_B4); !SPECIFIC POLL, FIND TERMINAL %RETURNIF TNO=0 %IF PB_B4&1#0 %START; !STATUS POLL STATUS ACK(PACK) %ELSESTART; !DATA POLL %IF TERM_STATE#TEXT AVAILABLE %THEN STATUS ACK(PACK) %C %ELSE SEND TEXT %FINISH %ELSEIF P_A1=SELECT %START; !** SELECT RBUF=P_A3; !REMEMBER BUFFER TO FREE IT YF==XF I=P_A3>>13; !PROTS SEGMENT MAPVIRT(P_REPLY,I,MSEG); !ONTO MY SEG 4 XF_X=MSEG<<13+(P_A3&K'17777'); !GET BUFFER ADDRESS IBUF==YF_Y; !AND POINT IBUF AT IT GET TERM(PB_B3,IBUF(2)) %RETURNIF TNO=0 TERM_STATE=RECEIVE I=4; FLAG=0; CHARS=0; !CHARS IS COUNT, I POINTS TO DATA %WHILE IBUF(I)#ETX %CYCLE; !SCAN DATA %IF IBUF(I)=ESC %START %IF IBUF(I+1)=SET REC %THEN FLAG=1 %IF IBUF(I+1)=SET SEND %THEN FLAG=2 I=I+2; %CONTINUE %FINISH CHARS=CHARS+1 I=I+1 %REPEAT ! %IF CRCFLAG=255 %THEN STATUS ACK(NACK) %AND ->RETB; !BAD BLOCK %IF FLAG=2 %START; !CONTROL CHAR TO SET SEND TERM_STATE=TEXT AVAILABLE %ELSEIF FLAG=0 %START TERM_STATE=QUIESCENT %FINISH STATUS ACK(PACK); !TURN LINE AROUND PROFLAG=0 ! ! NOW DO VIRTUAL PRINTING ! %IF TERM_ENDFLAG#0 %AND CHARS>0 %THEN TERM_STATE=QUIESCENT %IF TERM_STATE=QUIESCENT %START PROFLAG=1 PRINTEND; !NO VIRTUAL PRINTING %FINISH ! ! NOW LOG DATA ! %IF CHARS>0 %START SELECT OUTPUT(1) LOG(IN,TERM) WRITE(CHARS,3); !LENGTH PRINTSYMBOL(' ') I=4; CHARS=0 %WHILE IBUF(I)#ETX %AND CHARS0 %THEN TERM_ENDFLAG=0 %FINISH SELECT OUTPUT(1) ! ! NOW GIVE BUFFER BACK ! RETB: P_SERVICE=LINSER(TERM_LINE) P_REPLY=SIVC SER; P_A1=FREE BUF P_A3=RBUF PON(P) %IF MONIT&1#0 %START; !%%%%% MONITOR PRINTSTRING('FR BF'); NEWLINE %FINISH %ELSEIF P_A1=HELLO %START; !** HELLO##### %IF P_A2<0 %OR P_A2>1 %START; !###### PRINTSTRING('INVALID LINE NO') WRITE(P_A2,5); WRITE(P_REPLY,5);!##### NEWLINE; %CYCLE; %REPEAT %FINISH LINSER(P_A2)=P_REPLY; !##### %ELSEIF P_A1=5 %START SELECT OUTPUT(0) %IF GRPS>0 %START; !DUMP ALL %CYCLE I=1,1,GRPS GROUP==GROUPS(I); DUMP GROUP %REPEAT %FINISH %IF TRMS>0 %START %CYCLE I=1,1,TRMS TERM==TERMS(I); DUMP TERM %REPEAT %FINISH PRINTSTRING('SIVC STOPPING'); NEWLINE %STOP %ELSESTART SELECT OUTPUT(0) PRINTSTRING('ILLEGAL FN FROM PROT ') WRITE(P_REPLY,5); WRITE(P_A1,5); WRITE(P_A2,5) WRITE(P_A3,5); NEWLINE %FINISH %END ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! MAIN PROGRAM STARTS HERE ************* ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !*** INITIALISATION ! LINKIN(SIVC SER) LINKIN(START SER) !SVC(18,3,2);! !PRIORITY??? CHANGE OUT ZERO=T3SER %CYCLE I=1,1,MAXGROUPS GROUPS(I)_STATE=-1 GROUPS(I)_POINTER=1 %REPEAT %CYCLE I=1,1,MAXTERMS TERM==TERMS(I) TERM_STATE=-1 TERM_SCRIPT SER=0 TERM_HEADER(0)=SOH TERM_HEADER(2)=STX %REPEAT TRMS=0; GRPS=0 PS==P; PB==P; PZ==P SELECT OUTPUT(1) PRINTSTRING(' * ERTE LOG FILE *') NEWLINES(2) SELECT OUTPUT(1) ALARM(500) ! !***** MAIN LOOP WAIT FOR EVENT ! %CYCLE P_SERVICE=0 POFF(P) %IF MONIT#0 %AND P_REPLY#0 %START; !%'%'% MONITOR WRITE(P_SERVICE,2); WRITE(P_REPLY,2) WRITE(PB_B1,3); WRITE(PB_B2,3); WRITE(PB_B3,3) WRITE(PB_B4,3); WRITE(PB_B5,3); WRITE(PB_B6,3) NEWLINE %FINISH ! %IF INT#0 %START SELECT OUTPUT(0) %IF INT='M' %THEN MONIT=MONIT!1; %IF INT='F' %THEN MONIT=0 %IF INT='G' %START; !DUMP GROUPS %CYCLE I=1,1,GRPS GROUP==GROUPS(I) DUMP GROUP %REPEAT %FINISH %IF INT='T' %START %CYCLE I=1,1,TRMS; !DUMP TERMS TERM==TERMS(I) DUMP TERM %REPEAT %FINISH %IF INT='0' %THEN LOGLIM=90; !RESET DEFAULT %IF '0'