*DECK XCHKCET USETEXT NIPDEF USETEXT CET USETEXT DRHDR USETEXT FREETAB USETEXT MEM USETEXT MSGIDX USETEXT NBT USETEXT INPARUT USETEXT OVERLAY USETEXT PARAMS USETEXT PIT USETEXT PT USETEXT KDIS USETEXT KSTTAB USETEXT STATTAB USETEXT SYSTIME PRGM XCHKCET; # CALL PIP AND PROCESS CET CHANGES # STARTIMS; # *1DC XCHKCET * 1. PROC NAME AUTHOR DATE * XCHKCET L.T. NGUYEN 81/07/31 * * 2. FUNCTIONAL DESCRIPTION * - PROCESS EST CHANGES * - UPDATE STATUS PIT AND NBT. * * 3. METHOD * CHECK THE CHANGE FLAG ( CETC1 ) IN EST : * - IF ON * . INDEX THROUGH PIT TABLE TO FIND PIT ENTRY CORRESPONDING TO * PIP NUMBER. IF NEW ENTRY, SET UP PIT TABLE. * . LOOK FOR FREE NBTE ENTRY, SET UP THE NEW NBTE AND * POINTER IN PITE. IF NEW PIP, DO PIP CALL. IF NO NBTE * ENTRY FOUND, ERROR EXIT. SET CHANGE FLAG CETC1 IN * EST TO FALSE BEFORE LEAVING THE ROUTINE. * * - IF NOT ON * . XEXEC CALLS THE ROUTINE PERIODICALLY ( 10 SECS ). UPDATE * STATUS OF PIT TABLE BY SCANNING IT * . IF PIP DROPPED AND ALL NBTE ENTRIES ARE ZERO, RELEASE * PIP BUFFER AREAS. * . IF DROPPING PIP COMPLETED AND THERE IS A NON-ZERO NBTE, * CALL PIP AGAIN ( EST WAS TURNED ON BEFORE PIP DROPPED OUT * COMPLETELY. * . IF AN ACTIVE PIP HAS REQUESTED A DUMP BUFFER ALLOCATE IT. * REQUEST MORE BUFFER FOR DUMP. * * 4. ENTRY PARAMETERS * - NONE. * * 5. EXIT PARAMETERS * - * * 6. COMDECKS CALLED * - CET * - DRHDR * - MEM * - MSGIDX * - NBT * - OVERLAY * - PARAMS * - PIT * - PT * - KDIS * - NIPDEF * - STATTAB * - OPSIZE * - SYSTIME CURRENT RTIME VALUE * * 7. ROUTINES AND OVERLAYS CALLED * ABORT - ABORT NIP * MCLRIL - CLEAR NIP/PIP INTERLOCK * MGETS - ALLOCATE BUFFER * MSETIL - SET NIP/PIP INTERLOCK * OVLCALL - LOAD AND EXECUTE OVERLAY * XTRACE - TRACE PROCEDURE CALL * KADD - ADD ENTRY INTO K-DISPLAY * KPUT - UPDATE K-DISPLAY STATUS * OSREQ - CALL PIP * OMSG - ISSUE DAYFILE MESSAGE * * 8. DAYFILE MESSAGES AND OTHER IMPORTANT INFORMATION * * * BAD PIP NUMBER IN EST ENTRY * * * W A R N I N G - THIS PROGRAM CANNOT EXCEED THE PRIMARY *CALL OPSIZE * THIS ROUTINE IS CALLED WHEN INFORMATION IN EST CHANGED, * OR XEXEC WILL CALL PERIODICALLY ( 10 SECS ) TO UPDATE * PIT TABLE. * # STOPIMS; # EXTERNAL VARIABLES # XREF BEGIN PROC ABORT; # ABORT NIP # PROC MCLRIL; # CLEAR NIP/PIP INTERLOCK # PROC MGETS; PROC MRELS; PROC MSETIL; # SET NIP/PIP INTERLOCK # PROC OVLCALL; PROC XTRACE; PROC BLDKWL; # FORMAT KWL TO ADD EST TO ST # PROC OSREQ; # CALL PIP # PROC OMSG ; LABEL RJMAIN; END # INTERNAL VARIABLES # ARRAY ABTMSG S(4); # ABORT NIP DAYFILE MESSAGE # BEGIN ITEM ABTMSG1 C(0,00,35)=[" XCHKCET - BAD PIP NO IN EST ENTRY."]; ITEM ABTMSGE U(3,30,30)=[0]; END BASED ARRAY PITNBTW S(1); # TEMPLATE FOR NBT ENTRY WD IN PIT # BEGIN ITEM PITNBTWH B(00,00,01); # HALT NPU FLAG # ITEM PITNBTWE U(00,30,06); # NBT TABLE ENTRY INDEX # ITEM PITNBTWA I(00,42,18); # NBT ENTRY ADDRESS # END ARRAY ITPIP S(1); # PIP CALL WORD # BEGIN ITEM ITNAME C(0,0,3) = ["PIP"]; # PIP NAME # ITEM ITFILL1 U(0,18,1) = [0]; ITEM ITRCALL B(0,19,1) = [FALSE]; # NO RECALL # ITEM ITFILL2 U(0,20,4) = [0]; ITEM ITFUNC U(0,24,12); # PIP CALL TYPE # ITEM ITFILL3 U(0,36,6) = [0]; ITEM ITADDR U(0,42,AL); # PARAMETER WORD ADDRESS # END ITEM J U ; ITEM INDEX; ITEM PIPCALL B; ITEM FOUND B; ITEM NBTIX; ITEM PIPNR; ITEM TEMP; ITEM NBTENR; ITEM NBTEADDR; ITEM PNAME C(10) = "CCET"; # PROC NAME PASSED TO ERROR MSG # ARRAY ALRT S(3) ; BEGIN ITEM ALRT1 C(0,0,20)=["$REQUEST *K* DISPLAY"] ; ITEM ALRT2 U(2,0,60)=[0] ; END #**********************************************************************# BEGIN CONTROL IFEQ DEBUG,1; XTRACE("XCHCE") ; CONTROL FI; # CHECK IF WE HAVE ANY ALERT TO INFORM # IF NOT KDVW[0] # K DISPLAY NOT BEING VIEWED # AND (KDNAL[0] NQ 0 # ALERT(S) PENDING # OR KDALERT[0] # K DISPLAY ALERT OUTSTANDING # OR HRL EQ 0) # MAX FL REACHED , ALERT OPERATOR # THEN OMSG(ALRT,2) ; PIPCALL = FALSE ; # ASSUMMING NO PIP CALL# IF CETC1[1] THEN # PROCESS CET CHANGES # BEGIN FOR INDEX = CETHSIZE STEP 1 UNTIL CETBS[0]-1 DO IF CETC2[INDEX] THEN BEGIN CETOFF[INDEX] = FALSE; CETNON[0] = CETNON[0] + 1; CETNOFF[0] = CETNOFF[0] - 1; # CHECK PIP NUMBER FROM EST ENTRY # PIPNR = CETPIP[INDEX]; # PIP NUMBER FROM CET ENTRY # IF PIPNR LS 1 OR # PIP NUMBER IS TOO SMALL # PIPNR GR 4 # PIP NUMBER IS TOO LARGE # THEN # ABORT NIP FOR BAD EST ENTRY # BEGIN OMSG(ABTMSG,0); # ISSUE DAYFILE MESSAGE # ABORT(0,0); # ABORT NIP # END FOUND = FALSE; # RESET TO SEARCH EMPTY NBTE# FOR NBTIX = 0 WHILE NOT FOUND AND NBTIX LQ NBTMAXID DO BEGIN IF NOT NBTIUF[NBTIX] THEN # FREE NBTE FOUND # FOUND = TRUE; ELSE NBTIX = NBTIX + NBTFETNO; END IF FOUND THEN BEGIN # SET UP PIT ENTRY # IF NOT PITPUF[PIPNR] THEN # NEW PIT ENTRY USED # BEGIN PIPCALL = TRUE; # NEED TO CALL PIP INTO PP # PITC[PIPNR] = FALSE; PITACK[PIPNR] = FALSE; PITPF[PIPNR] = FALSE; PITESF[PIPNR] = FALSE; PITAF[PIPNR] = FALSE; FOUND = FALSE; FOR TEMP = 1 STEP 1 UNTIL MAXPIP DO # CHECK IF ANY OTHER PIPS # BEGIN IF PITPUF[TEMP] THEN # THERE IS ANOTHER PIP RUNNING # BEGIN FOUND = TRUE; END END IF NOT FOUND THEN # THIS PIP WILL DO EST SCAN # BEGIN PITESF[PIPNR] = TRUE; # SET EST SCAN FLAG # END PITPUF[PIPNR] = TRUE; # SET PIT ENTRY IN USE FLAG # END NBTENR = NBTIX/NBTFETNO; # NBTE NUMBER # NBTEADDR = LOC(NBTIUF[NBTIX]); # NBTE ADDRESS # FOR TEMP = NBTEADDR STEP 1 UNTIL NBTEADDR+NBTESIZE-1 DO MEMORY[TEMP] = 0; # CLEAR NBTE AREA # FOUND = FALSE; # RESET TO PLACE NBTE ADDR IN PITE # # LOOK FOR FREE NBT ENTRY IN PIT TABLE ENTRY # P = LOC(PITNBTE1[PIPNR]); # ADDR OF 1ST NBT ENT# TEMP = 0; FOR PIPNR=PIPNR WHILE NOT FOUND AND TEMP LQ MAXNPU-1 DO # CHECK EACH NBT ENTRY WORD IN PIT ENTRY # BEGIN IF PITNBTWA[TEMP] EQ 0 THEN # FOUND EMPTY NBT ENTRY IN PIT TABLE # BEGIN FOUND = TRUE; END ELSE # CHECK NEXT SLOT IN PIT TABLE ENTRY # BEGIN TEMP = TEMP + 1; END END IF FOUND THEN BEGIN NBTNAE[0] = NBTNAE[0] + 1; # INCREMENT ACTIVE NBTE CNT # NBTNFE[0] = NBTNFE[0] - 1; # DECREMENT FREE NBTE COUNT # NBTIUF[NBTIX] = TRUE; # SET NBTE USE FLAG # NBTINDX[NBTIX] = NBTENR; # SET NBTE NUMBER # NBTPIP[NBTIX] = PIPNR; # PLACE PIP NUMBER # NBTEST[NBTIX] = CETEST[INDEX]; NBTCH[NBTIX] = CETCH[INDEX]; NBTEQ[NBTIX] = CETEQ[INDEX]; NBTET[NBTIX] = CETET[INDEX] ; NBTHN[NBTIX] = CETHN[INDEX]; NBTSAM[NBTIX] = CETSAM[INDEX]; IF KDST[0] THEN # ADD EST ENTRY TO STATUS DISPLAY # BLDKWL(KST"EST",CETHN[INDEX],0,KADDIDVALUE); MGETS(NINBMIN,P,FALSE); # GET INBOUND BUFFER # NBTFIRST[NBTIX] = P;# SET FIRST POINTER # NBTIN[NBTIX] = P; # SET IN POINTER # NBTTA[NBTIX] = P + NINBMIN/2; NBTOUT[NBTIX] = P; # SET OUT POINTER # NBTLIMIT[NBTIX] = P + NINBMIN; # SET LIMIT PTR# NBTBAF[NBTIX] = TRUE; NBTOF[NBTIX+4] = FALSE; # CLEAR OFF FLAG # NBTTN[NBTIX+1] = CETTN[INDEX]; # CDCNET FE TERM NODE # NBTCII[NBTIX+1] = NBTIX; # INITIAL INPUT FET INDEX # NBTRJCNT[NBTIX+1] = 0; # INIT REJECT COUNT # NBTCOFF[NBTIX+1] = NINBMIN/2; # INIT THRESHOLD OFFSET # NBTCSIZE[NBTIX+1] = NINBMIN; # INIT SIZE OF BUFFER # NBTRTIME[NBTIX+1] = RTSECS[0] + NINBRJTO; #INIT TIMEOUT# BLKID[0] = PIBIDVALUE; CONTROL IFEQ STAT,1; ST$NIB = ST$NIB + 1; CONTROL FI; NBTAF[NBTIX+4] = TRUE; # SET NPU ACTIVE # NBTMF[NBTIX+4] = TRUE; # SET NPU INITIAL # PITNBTWE[TEMP] = NBTENR + 1; # NBT ENTRY INDEX # PITNBTWA[TEMP] = NBTEADDR; # NBT ENTRY ADDRESS # IF PITC[PIPNR] THEN # PIP FOR THIS PIT ENTRY HAS DROPPED OUT # BEGIN PIPCALL = TRUE; # CALL IT BACK INTO PP AGAIN # PITC[PIPNR] = FALSE; END END ELSE # PIT IS FULL (WINDOW WHEN THIS CAN HAPPEN- WHERE NAM HAS NOT CLEARED A FREE ENTRY YET ) # GOTO EXIT; END ELSE # NBTE IS FULL ( WINDOW WHEN THIS CAN HAPPEN- WHERE NAM HAS NOT CLEARED A FREE ENTRY YET) # GOTO EXIT; IF PIPCALL THEN BEGIN ITFUNC = FCDRIVE; # PIP CALL TYPE # ITADDR[0] = LOC(PITW0[PIPNR]); # ADDR OF PIT ENTRY # OSREQ(ITPIP); # CALL DEDICATED PIP # PIPCALL = FALSE; END CETC2[INDEX] = FALSE; END CETC1[1] = FALSE; END ELSE # CALL PIP FOR CET CHANGES # BEGIN FOUND = FALSE; # FLAG PIP FOR SCAN EST DROP# TEMP = 0; # ACTIVE PIP ENTRY INDEX # # CHECK FOR NEW PIP TO SCAN EST IF OLD PIP DROPPED OUT ALSO CLEAR IN USE FLAG FOR PIPS WHICH DROPPED OUT AND RELEASE ANY PRU BUFFERS THEY MAY STILL BE HOLDING. # FOR INDEX = 1 STEP 1 UNTIL MAXPIP DO BEGIN IF PITPUF[INDEX] THEN BEGIN IF PITC[INDEX] THEN # THIS PIP HAS DROPPED OUT # BEGIN PITPUF[INDEX] = FALSE; # CLEAR PIT ENTRY IN USE FLAG # PARAMS1 = 1; # 1 PRU BUFFER SIZE # PARAMS2 = INDEX; # PIT ENTRY INDEX # OVLNAME = NPRLBP; # NAME OF OVERLAY TO LOAD # OVLCALL; # LOAD AND EXECUTE OVERLAY # END ELSE # THIS PIT ENTRY IS STILL IN USE # BEGIN TEMP = INDEX; # REMEMBER THIS PIP NUMBER # IF PITESF[INDEX] THEN BEGIN FOUND = TRUE; # FOUND PIP WHICH IS SCANNING EST # END END END END IF NOT FOUND AND TEMP NQ 0 THEN # FOUND NEW PIP TO DO EST SCAN # BEGIN PITESF[TEMP] = TRUE; # SET SCAN EST FLAG # END IF CETC[1] THEN BEGIN CETC[1] = FALSE; IF TEMP EQ 0 # IF NO ACTIVE PIT ENTRY # THEN BEGIN ITFUNC[0] = FCSCAN; ITADDR[0] = P ; OSREQ(ITPIP); # CALL PIP FOR SCAN EST # END END END EXIT: GOTO RJMAIN; # RETURN # ERRXIT: PARAMS1 = DFMSG01; # NIP FATAL ERROR PROC = XXXX. # PARAMS6 = PNAME; # PROC = CCET # OVLNAME = XERRMSGP; OVLCALL; END TERM