*DECK CSTSNR USETEXT TEXTCS USETEXT TXTCTCS USETEXT TXTSMCS USETEXT TXTAPSS USETEXT TXTSUSS PROC CSTSNR (SWTESS); # TITLE CSTSNR - START NCF READ REQUESTS. # BEGIN # CSTSNR # # ** CSTSNR - START NCF READ REQUESTS. * * D. G. DEPEW. 81/08/06. * * THIS PROCEDURE INITIATES THE READING OF THE NCF LINE RECORD * REQUIRED TO PROCESS A CONFIGURE TERMINAL REQUEST (CNF/TE/R SM) * FROM AN NPU. * * PROC CSTSNR (SWTESS) * * ENTRY THE CONFIGURE TERMINAL REQUEST QUEUE CONTAINS ONE OR MORE * CNF/TE/R SMS EXCEPT FOR A SINGLE, FIRST TIME CALL MADE * DURING INITIALIZATION AT WHICH TIME THE QUEUE IS EMPTY. * THE NCF READ REQUESTS QUEUE IS EMPTY. * * EXIT A CIO READLS FUNCTION IS ISSUED FOR UP TO 10 LINE RECORDS. * THE CORRESPONDING ENTRIES HAVE BEEN MADE IN THE NCF READ * REQUESTS QUEUE. * A CNF/TE/A SM IS PLACED IN THE OUTGOING TRAFFIC QUEUE IF * THE LINE CANNOT BE LOCATED IN THE LINE RECORD INDEX * (THIS SHOULD NEVER HAPPEN). * FORMAL ARRAY SWTESS IS SET SO THAT PROC CSTRND IS CALLED * WHEN THE NCF FET COMPLETE BIT IS SET OR THE IN POINTER * CHANGES. * ALL CONFIGURE TERMINAL REQUEST QUEUE ENTRIES THAT GET * PROCESSED ARE DELETED FROM THAT QUEUE. * FOR THE INITIALIZATION CALL AND FOR THE HOPEFULLY * IMPOSSIBLE CIRCUMSTANCE WHEREIN NONE OF THE LINES FOR * WHICH CNF/TE/R SMS HAVE BEEN RECEIVED CAN BE LOCATED IN * THE LINE RECORD INDEX, FORMAL ARRAY SWTESS IS SET SUCH * THAT THIS ROUTINE WILL AGAIN BE CALLED WHEN AN ENTRY IS * MADE IN THE CONFIGURE TERMINAL REQUEST QUEUE. * * NOTES THIS ROUTINE COMBINES THE LOGIC OF CS GID PROCESSES 4.2 * AND 4.3. THIS WAS DONE BECAUSE THOSE PROCESSES ARE * SHORT, IT SAVES SOME DATA SHUFFLING, AND IT MAKE CS MORE * RESPONSIVE TO THE CONFIGURE TERMINAL REQUEST QUEUE. # *CALL SWTESS # **** PROC CSTSNR - XREF LIST BEGIN. # XREF BEGIN PROC CSTRND; #RECEIVE NCF DATA # PROC MOVE; #MOVE STORAGE DIRECT ADDRESSING (MACREL) # PROC READLS; #ISSUE CIO READLS FUNCTION (MACREL) # PROC SSTAQE; #ACCEPT QUEUE ENTRY # PROC SSTATS; #ALLOCATE STORAGE AT END OF TABLE # PROC SSTRTS; #REMOVE STORAGE ANYWHERE IN TABLE # PROC XSST; #SHELL SORT TBL IN ASCENDING ORDER(MACREL)# END # **** # ITEM I; #LOOP INDUCTION VARIABLE # ITEM LORD; #LINE RECORD INDEX ENTRY ORDINAL # ITEM QORD; #CALCULATED ORDINAL OF ANY DESIRED Q ENTRY# ITEM WC; #WORD COUNT OF CTQ/NRQ ENTRIES # ARRAY LRIKEY [00:00] S(1); #LINE RECORD INDEX SEARCH KEY # BEGIN ITEM LK$WORD U(00,00,60); #WHOLE WORD FOR ACTUAL SEARCH KEY# ITEM LK$NPUID U(00,44,08); #NPU NODE ID TO SEARCH LRI FOR # ITEM LK$PORT U(00,52,08); #PORT NUMBER TO SEARCH LRI FOR # END RLCOUNT = 0; # INITIALIZE COUNT OF RECORDS TO BE READ # FOR I=0 WHILE CTQL NQ 0 AND RLCOUNT LS RLMAX$ DO # LOOP UNTIL CTQ EMPTY OR 10 RECS TO READ # BEGIN WC = CTQ$ESIZE[0]; # SET SIZE OF CURRENT ENTRY # LK$WORD[0] = 0; LK$NPUID[0] = CTQ$NPUID[0]; # SET UP TO SEARCH LINE REC INDEX # LK$PORT[0] = CTQ$PORT[0]; FOR LORD=0 STEP 1 # SEARCH LRI FOR LARGER NPU/PORT COMBO # WHILE LK$WORD[0] GQ LIKEY[LORD] DO BEGIN END LORD = LORD - 1; # DESIRED NTRY ONE BEFORE LARGER NPU/PORT # IF CTQ$NPUID[0] EQ LINID[LORD] AND CTQ$PORT[0] LQ (LIPORT[LORD] + LIGC[LORD]) THEN # NPU NODE ID AND PORT NUMBER ARE VALID # BEGIN # PREPARE FOR ISSUANCE OF NCF READ REQUEST# RLI$RPA[RLCOUNT] = LIRPA[LORD]; # SET UP READ LIST INDEX # RLI$LRIORD[RLCOUNT] = LORD; RLCOUNT = RLCOUNT + 1; QORD = NRQL; # SAVE ORD OF NEXT NCF READ QUEUE ENTRY # SSTATS (P, WC); # ADD NEW ENTRY SPACE TO NCF READ Q # MOVE (WC, CTQ, NRQ[QORD]); # MAKE THE ENTRY # NRQ$LRIORD[QORD] = LORD; # COMPLETE NCF READ QUEUE ENTRY # END ELSE # BOGUS CNF/TE/R SM RECEIVED # BEGIN # ISSUE CNF/TE/A # # THE FOLLOWING CODE REFERENCES ITEMS IN TWO BASED ARRAYS, *CSSM* # # (IN TXTSMCS) AND *APSM* (IN TXTAPSS), THAT DEFINE DIFFERENT PARTS# # OF THE BODY OF ANY SM CS MAY SEND OR RECEIVE. THESE TWO BASED # # ARRAYS ARE POINTED TO THE SM BUFFER, *MSGBUF* (IN TEXTSS), AT # # INITIALIZATION TIME. ALSO, BASED ARRAY *ABH* (IN TXTAPSS) IS # # USED, WHICH AGAIN IS POINTED TO THE ABH BUFFER, *ABHBUF* (IN # # TEXTSS), AT INITIALIZATION TIME. SINCE THESE BASED ARRAYS ARE # # PREPOINTED, THIS PROC DOES NOT REQUIRE TEXTSS. # ABHWORD[1] = CTQ$WORD[1]; # SET UP OUTGOING ABH # ABHSN[1] = ABHDN[1]; # REVERSE DN AND SN FOR RESPONSE SM # ABHDN[1] = CTQ$NPUID[0]; # DESTINATION # ABHTLC[1] = NCNFA; # DEFINED IN TXTSMCS. ABH COMPLETE # SPMSG0[1] = 0; # SET UP CNF/TE/A SM BODY # PFCSFC[1] = CNFTEA; # DEFINED IN TXTSUSS # CNFP[1] = CTQ$PORT[0]; # SM BODY COMPLETE # SSTAQE (P, CTEAQL$, ABH[1], CSSM[1]); # QUEUE CNF/TE/A# END SSTRTS (P, 0, WC); # DELETE 1ST ENTRY IN CNF/TE/R QUEUE # END IF RLCOUNT NQ 0 THEN # THERE ARE TERMINALS TO CONFIGURE # BEGIN # PREPARE AND ISSUE READLS FUNCTION # XSST (RLI, RLCOUNT); # SORT THE READ LIST INDEX # FOR I=0 STEP 1 UNTIL RLCOUNT-1 DO # SET UP ACTUAL READ LIST FOR READLS FUNC # RL$RPA[I] = RLI$RPA[I]; RL$RPA[RLCOUNT] = 0; # INDICATE END OF READ LIST # RLIORD = 0; # INITIALIZE POINTER TO CURRENT RLI ENTRY # NF$LA[0] = LOC (READLIST); # STORE READ LIST ADDRESS IN FET # READLS (NCFFET); # ISSUE READLS FUNCTION # # SET UP FORMAL RETURN PARAMETER ARRAY SWTESS. # STE$ADDR1[0] = LOC (NCFFET); # WATCH COMP BIT IN 1ST WD OF FET# STE$ADDR2[0] = LOC (NF$IN[0]); # WATCH FET IN POINTER # STE$RTN[0] = LOC (CSTRND); # RECEIVER OF NCF LINE RECORDS # STE$INIT1[0] = NF$WORD[0]; # SET UP INIT VALUE OF FET 1ST WD # STE$CBIT1[0] = FALSE; # CALL *CSTRND* WHEN FET COMP BIT IS SET# STE$INIT2[0] = NF$OUT[0]; # CALL *CSTRND* WHEN *IN* NQ *OUT* # END ELSE # ALL CNF/TE/R SMS WERE INVALID (YUK) OR # BEGIN # THIS IS INITIALIZATION CALL # ICSTSNR = 0; # INSURE INTERRUPT CELL IS CLEAR # STE$ADDR1[0] = LOC (ICSTSNR); # WATCH INTERRUPT CELL # STE$ADDR2[0] = 0; # ONLY WATCHING ONE CELL # STE$RTN[0] = LOC (CSTSNR); # RECALL THIS ROUTINE # STE$INIT1[0] = 0; # CALL WHEN ENTRIES IN CNF/TE/R Q NONZERO # STE$INIT2[0] = 0; END END # CSTSNR # TERM