*DECK CSSCSR USETEXT TEXTSS; USETEXT TEXTCS; USETEXT TXTSMCS; USETEXT TXTSUSS; USETEXT TXTAPSS; PROC CSSCSR; # TITLE CSSCSR - COMPLETE STATUS REQUEST # BEGIN # CSSCSR # # ** CSSCSR - COMPLETE STATUS REQUEST. * * C. BRION 82/05/06. * * PROC CSSCSR * * ENTRY: * * WCBUF = ONE WORD ENTRY DESCRIPTOR WORD OF QUEUE ENTRY THAT * CONTAINS THE STATUS RESPONSE SM. * * ABH = ONE WORD APPLICATION BLOCK HEADER OF THE SM. * * * EXIT: * * THE NPUCB AND OCB ARE UPDATED. * * IF STATUS IS COMPLETE, AN EVENT TO CONCLUDE THE STATUS REQUEST * IS SENT TO THE EVENT PROCESSOR. # # **** PROC CSSCSR XREF LIST. # XREF BEGIN PROC MOVEI; # MOVE CM WORD INDIRECT # PROC SSBCBW; # SS- CLEAR BIT IN WORD # PROC SSBTBW; # SS- TEST BIT IN WORD # PROC SSTAQE; # SS-ACCEPT QUEUE ENTRY # END # **** # # * PROC CSSCSR ITEM DEFINITIONS. # ITEM NPUORD U; # NPU ORDINAL # ITEM I U; # LOOP VAR # ITEM OCBORD U; # OCB ORDINAL # ITEM MATCH B; # MATCH INDICATOR# $BEGIN ITEM DBVAR U; $END # * FLG$WORD - THIS BASED ARRAY POINTS TO THE PENDING STATUS REQUEST * WORD IN THE NPUCB. # BASED ARRAY FLG$WORD [00:00] S(NPCBSZ$); BEGIN ITEM FW$WORD I(00,00,60); END # * MAIN PROCEDURE START. # # * LOCATE THE NPUCB THAT HAS THE NODE NUMBER EQUAL TO THE SOURCE * NODE OF THE ABH AND THE HOST NODE NUMBER EQUAL TO THE DESTINA- * TION NODE OF THE ABH. THIS MATCH WILL ALWAYS OCCUR. # MATCH = FALSE; FOR I = 0 STEP 1 WHILE NOT MATCH DO BEGIN IF (ABHSN[0] EQ NPU$NID[I] AND ABHDN[0] EQ NPU$HID[I]) THEN BEGIN NPUORD = I; MATCH = TRUE; END END # * CHECK TO VERIFY THAT A CURRENT STATUS OPERATOR STILL EXISTS FOR * THIS NPUCB. IF NOT, EXIT. # IF NPU$OPST[NPUORD] EQ 0 THEN GOTO ENDEXIT; # * A CURRENT STATUS OPERATOR STILL ACTIVE ON THIS NPUCB. * INSURE THAT THE OCB ORDINAL IS WITHIN RANGE. IF NOT, * PROBABLY MEANS THAT THE OPERATOR ENTERED A BREAK OR THE * CONNECTION WAS TERMINATED. # OCBORD = NPU$OPST[NPUORD]; IF OCBORD LQ MAXACN$ THEN BEGIN OC$CNPU[OCBORD] = 0; END NPU$OPST[NPUORD] = 0; IF (OCBORD GQ HOPORD$ AND OCBORD LQ MAXACN$) THEN BEGIN OC$NCNT[OCBORD] = OC$NCNT[OCBORD] - 1; P = LOC(NPU$STFLGS[NPUORD]); SSBCBW(FLG$WORD,OCBORD); # * IF ALL AFFECTED NPUS HAVE RESPONDED, ISSUE STATUS DONE EVENT TO * CAUSE THE READY.. MESSAGE TO THE OPERATOR VIA THE EVENT QUEUE TO * THE EVENT PROCESSOR. * ALSO, CLEAR THE CURRENT VERB FOR THE OCB. # IF OC$NCNT[OCBORD] EQ 0 THEN BEGIN WCB$WC[1] = 2; # SET EVENT ENTRY SIZE # WCB$SMID[1] = SMID"STUFIN"; # SET EVENT CODE # ABHADR[1] = OCBORD; # SET ACN ADDR IN ABH # SSTAQE(P,WCBUF[1],ABH[1],CSSM[1]); OC$VERB[OCBORD] = " "; END # * IF THERE ARE STILL OUTSTANDING STATUS REQUEST TO BE MADE, THEN * IF THERE IS ANOTHER STATUS REQUEST PENDING FOR AN NPU THAT IS NOT * BUSY, THEN SAVE THE OCB ORDINAL IN THE NPUCB, SET THE CURRENT * AFFECTED NPUCB ORDINAL IN THE OCB, AND SEND THE STATUS REQUEST * TO THE NPU. # ELSE BEGIN MATCH = FALSE; P = LOC(NPU$STFLGS[0]); FOR I=0 STEP 1 WHILE NOT MATCH AND I LS CSNPCNT DO BEGIN SSBTBW(FLG$WORD[I],OCBORD,MATCH); IF MATCH THEN BEGIN IF NPU$OPST[I] NQ 0 THEN BEGIN MATCH = FALSE; END END END IF MATCH THEN BEGIN I = I - 1; OC$CNPU[OCBORD] = I; NPU$OPST[I] = OCBORD; WCB$WORD[1] = OC$WC[OCBORD] + 2; ABHWORD[1] = OC$TLC[OCBORD]; ABHBT[1] = APPSUP; ABHABT[1] = APPSUP; ABHDN[1] = NPU$NID[I]; ABHSN[1] = NPU$HID[I]; ABHACT[1] = ACTCSNP$; MOVEI(OC$WC[OCBORD],LOC(OC$SM[OCBORD]),LOC(CSSM[1])); SSTAQE(P,WCBUF[1],ABH[1],CSSM[1]); END END END # * CHECK IF THERE IS ANOTHER PENDING STATUS REQUEST FOR THE NPU * THAT JUST COMPLETED. IF SO, THEN SET THE CURRENT AFFECTED * NPUCB ORDINAL IN THE OCB, SET THE CURRENT STATUS OCB ORDINAL * IN THE NPUCB, AND SEND THE STATUS REQUEST TO THE NPU. # IF NPU$STFLGS[NPUORD] NQ 0 THEN BEGIN MATCH = FALSE; P = LOC(NPU$STFLGS[NPUORD]); FOR I=HOPORD$ STEP 1 WHILE NOT MATCH AND I LQ MAXACN$ DO BEGIN SSBTBW(FLG$WORD,I,MATCH); IF MATCH THEN BEGIN IF OC$CNPU[I] NQ 0 THEN BEGIN MATCH = FALSE; END END END IF MATCH THEN BEGIN I = I - 1; OC$CNPU[I] = NPUORD; NPU$OPST[NPUORD] = I; WCB$WORD[1] = OC$WC[I] + 2; ABHWORD[1] = OC$TLC[I]; ABHBT[1] = APPSUP; ABHABT[1] = APPSUP; ABHDN[1] = NPU$NID[NPUORD]; ABHSN[1] = NPU$HID[NPUORD]; ABHACT[1] = ACTCSNP$; MOVEI(OC$WC[I],LOC(OC$SM[I]),LOC(CSSM[1])); SSTAQE(P,WCBUF[1],ABH[1],CSSM[1]); END END ENDEXIT: $BEGIN DBVAR = 1; $END END #CSSCSR# TERM