*DECK CSSCHB
USETEXT TEXTCS;
USETEXT TEXTSS;
USETEXT TXTSMCS;
USETEXT TXTAPSS;
USETEXT TXTSUSS;
PROC CSSCHB;
# TITLE CSSCHB - COMPLETE HOST BROADCAST #
BEGIN #CSSCHB#
#
** CSSCHB - COMPLETE HOST BROADCAST.
*
* C. BRION 82/04/20.
*
* THIS PROCEDURE PROCESSES THE NORMAL AND ABNORMAL RESPONSES TO
* THE HOST BROADCAST SET OF SMS.
*
* PROC CSSCHB
*
* ENTRY
* 1. WCBWORD[0] = WORD COUNT BUFFER.
* 2. ABHWORD[0] = APPLICATION BLOCK HEADER OF SM.
* 3. MSGBUF[0] = BODY OF MSG SM RESPONSE.
*
* EXIT
* 1. IF ABNORMAL RESPONSE -- SEND IT OFF TO THE EVENT QUEUE.
* 2. IF NORMAL RESPONSE -- SEND TERMINAL TEXT TO THE CONNECTION
* TRAFFIC QUEUE INDICATING MESSAGE WAS SENT.
*
#
#
**** PROC CSSCHB XREF LIST
#
XREF
BEGIN
PROC MOVEI; # MACREL-MOVE INDIRECT #
PROC SSBCBW; # SS-CLEAR BIT IN WORD #
PROC SSBFPB; # FIND PRIORITY BIT #
PROC SSTAQE; # SS-ACCEPT QUEUE ENTRY #
END
#
****
#
ITEM FOUND B; # NPUCB FOUND INDICATOR #
ITEM I U; # LOOP INDUCTION VAR #
ITEM NORD U; # NPUCB ORDINAL #
ITEM OORD U; # OCB ORDINAL #
#
* FLG$WORD - BASED ARRAY THAT POINTS TO THE PENDING SEND REQUEST
* BIT MAPS IN THE NPUCB-S.
#
BASED ARRAY FLG$WORD [00:00] S(NPCBSZ$);
BEGIN
ITEM FW$WORD I(00,00,60);
END
#
* HBSENT - MESSAGE FOR MESSAGE SENT.
#
ARRAY HBSENT [00:00] S(3);
BEGIN
ITEM HBS$TX0 C(00,00,05) =["NPU: "];
ITEM HBS$NP C(00,30,07);
ITEM HBS$TXT C(01,12,14) = [", MESSAGE SENT"];
ITEM HBS$ZER U(02,36,24) =[0];
END
WCB$WORD[1] = WCB$WORD[0]; # CLEAR ENTRY WORDS #
ABHWORD[1] = ABHWORD[0];
FOUND = FALSE; # INIT NPUCB FOUND FLAG #
#
* SEARCH THE NPUCB ARRAY FOR A NPUCB WITH MATCHING NODES TO THE
* INCOMING RESPONSE SM.
#
FOR I = 0 STEP 1 WHILE (NOT FOUND AND I LS CSNPCNT)
DO
BEGIN
IF (ABHDN[0] EQ NPU$HID[I] AND ABHSN[0] EQ NPU$NID[I])
THEN
BEGIN
FOUND = TRUE;
NORD = I;
END
END
#
* IF NPUCB FOUND, THEN CHECK TO SEE IF THE COMMAND IS STILL ACTIVE
* BY CHECKING THE SEND OPERATOR OF THE NPUCB. IF OUT OF RANGE, THEN
* THE COMMAND WAS PREMATURELY ENDED - JUST CLEAR OUT THE NPUCB.
#
IF FOUND
THEN
BEGIN
IF NPU$OPSD[NORD] GR MAXACN$
THEN
NPU$OPSD[NORD] = 0;
ELSE
#
* SEND COMMAND STILL ACTIVE FOR THIS NPU. CLEAR THE NPUCB
* AND CHECK THE NUMBER OF NPUS OUTSTANDING FOR THE SEND
* COMMAND. IF COMMAND MULTIPLE AND STILL HAS OUTSTANDING
* NPUS TO RESPOND, THEN DO NOT CLEAR OCB BUT DECREMENT
* NUMBER OF SEND NPUS IN THE OCB.
#
BEGIN
OORD = NPU$OPSD[NORD];
NPU$OPSD[NORD] = 0;
OC$CNPU[OORD] = 0;
OC$NCNT[OORD] = OC$NCNT[OORD] - 1;
P<FLG$WORD> = LOC(NPU$SDFLGS[NORD]);
SSBCBW(FLG$WORD,OORD);
#
* IF ABNORMAL RESPONSE, SEND SUPERVISION EVENT.
#
IF EB[0]
THEN
BEGIN
IF SFC[0] EQ LI
THEN
WCB$SMID[1] = SMID"MSGLIA";
ELSE IF SFC[0] EQ TE
THEN
WCB$SMID[1] = SMID"MSGTEA";
ELSE
WCB$SMID[1] = SMID"MSGLLA";
ABHCN[1] = OORD;
SSTAQE(P<EVQ>,WCBUF[1],ABH[1],CSSM[0]);
END
ELSE
#
* SEND COMPLETED MESSAGE TO OPERATOR.
#
BEGIN
HBS$NP[0] = NPU$NAME[NORD];
WCB$WORD[1] = 0;
ABHWORD[1] = 0;
WCB$SMID[1] = SMID"TTEXT";
WCB$IAF[1] = TRUE;
#
* IF MORE SEND NPUS NEED TO RESPOND, SET INPUT ALLOWED FALSE.
* OTHERWISE, CLEAR OCB AND SET IAF TRUE.
#
IF OC$NCNT[OORD] NQ 0
THEN
WCB$IAF[1] = FALSE;
ELSE
OC$UVERB[OORD] = 0;
WCB$WC[1] = 5;
ABHADR[1] = OORD;
SSTAQE(P<CNQ>,WCBUF[1],ABH[1],HBSENT[0]);
END
END
#
* IF THERE ARE MORE SENDS PENDING, GE AHEAD AND SEND IT OUT.
#
IF NPU$SDFLGS[NORD] NQ 0
THEN
BEGIN
P<FLG$WORD> = LOC(NPU$SDFLGS[NORD]);
SSBFPB(FLG$WORD,OORD);
NPU$OPSD[NORD] = OORD;
WCB$WORD[1] = OC$WC[OORD] + 2;
ABHWORD[1] = OC$TLC[OORD];
ABHABT[1] = APPSUP;
ABHBT[1] = APPSUP;
ABHDN[1] = NPU$NID[NORD];
ABHSN[1] = NPU$HID[NORD];
ABHACT[1] = ACTCSNP$;
MOVEI(OC$WC[OORD],LOC(OC$SM[OORD]),LOC(CSSM[1]));
SSTAQE(P<OTQ>,WCBUF[1],ABH[1],CSSM[1]);
END
END
END #CSSCHB#
TERM