*DECK CSSACO USETEXT TEXTCS; USETEXT TEXTSS; USETEXT TXTSMCS; USETEXT TXCMDCS; USETEXT TXTAPSS; USETEXT TXTSUSS; PROC CSSACO; # TITLE CSSACO - ACTION CONTROL COMMAND # BEGIN # CSSACO # # ** PROC CSSACO * * C. BRION 82/04/30. * D. K. ENDO 83/02/09 ADD MULTIPLE NOPS. * * THIS PROC PROCESSES THE CONTROL COMMAND FOR CS. * * PROC CSSACO * * ENTRY * 1. HDRCMD[0] = HEADER WORD FOR FORMATTED COMMAND BLOCK. * 2. PARMS[0] = COMMAND BLOCK CONTAINING THE ORIGINAL TYPEIN * AND STRUCTURED FORMATTED PARAMETERS. * * EXIT * 1. CSCNOP = ACN VALUE OF CONTROLLING NOP UPDATED. * 2. TERMINAL TEXT TO THE CONNECTION TRAFFIC QUEUE FOR THE * REQUESTING NOP. * 3. CONTROL OFF/ON ENTRY TO THE EVENT QUEUE. * # # **** PROC CSSACO XREF LIST # XREF BEGIN PROC SSBCBW; # SS-CLEAR BIT IN WORD # PROC SSBSBW; # SS-SET BIT IN WORD # PROC SSTAQE; # SS-ACCEPT QUEUE ENTRY # END # **** # # * PROC CSSACO DEFS # DEF MODEIDX # HDR$TXWCNT[0]+3 #;# MODE INDEX INTO PARM LIST # DEF NORIDX # HDR$TXWCNT[0]+4 #;# NPU ORDINAL INDEX # DEF NPIDX # HDR$TXWCNT[0]+2 #;# NPU INDEX INTO PARM LIST # # * PROC CSSACO ITEMS # ITEM I; ITEM CTRLCNT; # NUMBER OF NPUS CONTROLLED # ITEM NPUORD; # NPUCB ORDINAL # ITEM ONFLAG B; # OFF KEYWORD INDICATOR # ITEM TNAME C(10); # TERMINAL NAME # # * FLG$WORD - BASED ARRAY USED TO POINT TO THE REPORT BIT MAP * IN THE NPUCB-S. # BASED ARRAY FLG$WORD [00:00] S(NPCBSZ$); BEGIN ITEM FW$WORD I(00,00,60); END # * RESCMD - MESSAGE ARRAY FOR RESTRICTED CMD MESSAGE. # ARRAY RESCMD [00:00] S(5); BEGIN ITEM RES$TXT0 C(00,00,20) = ["COMMAND RESTRICTED T"]; ITEM RES$TXT1 C(02,00,20) = ["O NETWORK OPERATORS "]; ITEM RES$TXT2 U(04,00,60) = [0]; END # * ALLCTRL - ALL NPU-S ARE CONTROLLED MESSAGE ARRAY. # ARRAY ALLCTRL [00:00] S(5); BEGIN ITEM ACT$TXT1 C(00,00,20) = ["ALL NPUS ARE BEING C"]; ITEM ACT$TXT2 C(02,00,23) = ["ONTROLLED BY OTHER NOPS"]; ITEM ACT$ZBYT U(04,12,48) = [0]; END # * AUCTRL - AUTO CONTROL STATUS MESSAGE ARRAY. # ARRAY AUCTRL [00:00] S(4); BEGIN ITEM AUC$TXT1 C(00,00,20) = ["YOU NOW HAVE AUTO CO"]; ITEM AUC$TXT2 C(02,00,12) = ["NTROL STATUS"]; ITEM AUC$ZBYT U(03,12,48) = [0]; END # * CTRLNOP - CONTROLLING NOP MESAGE ARRAY. # ARRAY CTRLNOP [00:00] S(3); BEGIN ITEM CTR$TNAM C(00,00,07); # TERMINAL NAME # ITEM CTR$TXT1 C(00,42,03) = [" IS"]; ITEM CTR$TXT2 C(01,00,16) = [" CONTROLLING NOP"]; ITEM CTR$ZERO U(02,36,24) = [0]; END # * NOCTRL - NO CONTROLLING NOP MESSAGE. # ARRAY NOCTRL [00:00] S(4); BEGIN ITEM NCT$MSG1 C(00,00,16) = ["YOU ARE NOT THE "]; ITEM NCT$MSG2 C(01,36,15) = ["CONTROLLING NOP"]; ITEM NCT$ZBYT U(03,06,54) = [ 0 ]; END # * NOACTRL - NO AUTO CONTROL PERMITTED MESSAGE ARRAY. # ARRAY NOACTRL [00:00] S(3); BEGIN ITEM NAC$TNAM C(00,00,07); ITEM NAC$TXT1 C(00,42,17) = [" HAS AUTO CONTROL"]; ITEM NAC$ZBYT U(02,24,36) = [0]; END CONTROL EJECT; PROC FORMSTAT(ORDINAL); # TITLE FORMSTAT - FORMAT NPU STATUS LINE. # BEGIN # FORMSTAT # # * FORMSTAT - FORMAT NPU STATUS LINE. * * D.K. ENDO 83/02/09 * * THIS IMBEDDED ROUTINE OF CSSACO FORMATS AN NPU STATUS LINE AND * SENDS IT TO THE OPERATOR VIA THE C-LAYER. * * PROC FORMSTAT(ORDINAL) * * ENTRY 1. ORDINAL = NPUCB ORDINAL. * 2. ABHADR[0] = OPERATOR OCB ORDINAL (ACN). * * EXIT 1. ENTRY IN THE C-LAYER QUEUE. # ITEM ORDINAL; # NPUCB ORDINAL # # * NPLINE - MSG ARRAY FOR NPU INFO LINE. # ARRAY NPLINE [00:00] S(3); BEGIN ITEM NPL$TXT0 C(00,00,04) = ["NPU:"]; ITEM NPL$NPNAME C(00,24,07); # NPU NAME # ITEM NPL$TXT1 C(01,06,01) = [","]; ITEM NPL$NID C(01,12,03); # NPU NODE ID # ITEM NPL$TXT2 C(01,30,01) = [","]; ITEM NPL$STATE C(01,36,02); # NPU STATE # ITEM NPL$TXT3 C(01,48,02) = [", "]; ITEM NPL$NGO C(02,00,06); # NEED GO INDICATOR # ITEM NPL$ZBYT U(02,36,24) = [0]; END # * FORMSTAT CODE BEGINS HERE # NPL$NPNAME[0] = NPU$NAME[ORDINAL]; NPL$NID[0] = NPU$DNID[ORDINAL]; IF NPU$GFLAG[ORDINAL] THEN BEGIN NPL$TXT3[0] = ", "; NPL$NGO[0] = "NEEDGO"; END ELSE BEGIN NPL$TXT3[0] = " "; NPL$NGO[0] = " "; END IF NPU$STAT[ORDINAL] EQ SUPSTAT"SUP" THEN NPL$STATE[0] = "AC"; ELSE NPL$STATE[0] = "MI"; SSTAQE(P,WCBUF[1],ABH[1],NPLINE[0]); END # FORMSTAT # # * PROC CSSACO EXECUTION STARTS HERE # # * IF A HOP ATTEMPTED CONTROL COMMAND, SUPERFLUOUS. INFORM THE HOP * WITH A MESSAGE. # IF HDR$OPORD[0] EQ HOPORD$ THEN BEGIN WCB$WORD[1] = 7; WCB$SMID[1] = SMID"TTEXT"; ABHADR[1] = HDR$OPORD[0]; SSTAQE(P,WCBUF[1],ABH[1],RESCMD[0]); GOTO ENDEXIT; END # * COMMAND ATTEMPTED FROM NOP. CHECK FOR ON OR OFF KEYWORD IN THE * COMMAND PARMS ARRAY. IF NO KEYWORD PRESENT, DEFAULT TO ON. # IF PAR$PCODE[MODEIDX] EQ "ON0" THEN BEGIN ONFLAG = TRUE; END ELSE BEGIN ONFLAG = FALSE; END # * IF A SPECIFIC NPU WAS SPECIFIED, THEN GET THE NPUCB ORDINAL * FROM THE PARAMETER LIST. # IF PAR$PCODE[NPIDX] EQ "NP0" THEN BEGIN NPUORD = PAR$ORD[NORIDX]; # * IF CONTROL IS REQUESTED, THEN CHECK IF THIS NPU IS ALREADY * CONTROLLED. IF NOT, THEN STORE THE OPERATOR ACN IN THE NPUCB * AND SEND THE EVENT TO THE EVENT QUEUE, OTHERWISE SEND AN ERROR * MESSAGE INDICATING THE NPU IS ALREADY UNDER CONTROL. # IF ONFLAG THEN BEGIN IF NPU$CNOP[NPUORD] EQ 0 THEN BEGIN NPU$CNOP[NPUORD] = HDR$OPORD[0]; WCB$WORD[1] = 3; WCB$SMID[1] = SMID"CTRLON"; ABHSN[1] = NPUORD; TNAME = OC$TNAM[NPU$CNOP[NPUORD]]; SSTAQE(P,WCBUF[1],ABH[1],TNAME); WCB$WORD[1] = 5; WCB$SMID[1] = SMID"TTEXT"; ABHADR[1] = HDR$OPORD[0]; FORMSTAT(NPUORD); P = LOC(NPU$RFLGS[NPUORD]); SSBSBW( FLG$WORD , HDR$OPORD[0] ); END ELSE BEGIN CTR$TNAM[0] = OC$TNAM[NPU$CNOP[NPUORD]]; WCB$WORD[1] = 5; WCB$SMID[1] = SMID"TTEXT"; ABHADR[1] = HDR$OPORD[0]; SSTAQE(P,WCBUF[1],ABH[1],CTRLNOP); END END # * IF REQUEST IS TO RELEASE CONTROL, THEN CHECK IF THIS NOP * CONTROLS THE NPU. IF SO, THEN CLEAR THE CONTROLLING NOP IN * THEN NPUCB AND SEND THE EVENT TO THE EVENT QUEUE, OTHERWISE * SEND AN ERROR MESSAGE. IF THIS OPERATOR HAS AUTO CONTROL * STATUS, THEN RELEASE THAT STATUS. # ELSE BEGIN IF HDR$OPORD[0] EQ NPU$CNOP[NPUORD] THEN BEGIN NPU$CNOP[NPUORD] = 0; WCB$WORD[1] = 3; WCB$SMID[1] = SMID"CTRLOFF"; ABHSN[1] = NPUORD; TNAME = OC$TNAM[HDR$OPORD[0]]; SSTAQE(P,WCBUF[1],ABH[1],TNAME); IF HDR$OPORD[0] EQ CSACNOP THEN BEGIN CSACNOP = 0; END P = LOC(NPU$RFLGS[NPUORD]); SSBCBW( FLG$WORD , HDR$OPORD[0] ); IF CSACNOP NQ 0 THEN BEGIN NPU$CNOP[NPUORD] = CSACNOP; SSBSBW(FLG$WORD,CSACNOP); WCB$SMID[1] = SMID"CTRLON"; TNAME = OC$TNAM[CSACNOP]; SSTAQE(P, WCBUF[1], ABH[1], TNAME); END END ELSE BEGIN WCB$WORD[1] = 6; WCB$SMID[1] = SMID"TTEXT"; ABHADR[1] = HDR$OPORD[0]; SSTAQE(P,WCBUF[1],ABH[1],NOCTRL); END END END # * -NPUS- OR -AUTO- WAS SPECIFIED. IF CONTROL IS REQUESTED, THEN * FOR EACH NPU THAT IS SUPERVISED AND NOT CONTROL, ASSIGN THIS * OPERATOR TO BE THE CONTROLLING NOP AND SEND EVENT INDICATING * CONTROL IS ASSIGNED. # ELSE BEGIN IF ONFLAG THEN BEGIN CTRLCNT = 0; WCB$WORD[1] = 3; WCB$SMID[1] = SMID"CTRLON"; FOR I=0 STEP 1 WHILE I LS CSNPCNT DO BEGIN IF NPU$STAT[I] EQ SUPSTAT"SUP" AND NPU$CNOP[I] EQ 0 THEN BEGIN CTRLCNT = CTRLCNT + 1; NPU$CNOP[I] = HDR$OPORD[0]; ABHSN[1] = I; TNAME = OC$TNAM[HDR$OPORD[0]]; SSTAQE(P,WCBUF[1],ABH[1],TNAME); P = LOC(NPU$RFLGS[I]); SSBSBW( FLG$WORD[0] , HDR$OPORD[0] ); END END # * IF ALL NPU-S ARE BEING CONTROLLED, THEN SEND MESSAGE INDICATING * SO, OTHERWISE LIST THE NPU-S UNDER THE OPERATOR-S CONTROL. # IF CTRLCNT EQ 0 THEN BEGIN WCB$WORD[1] = 6; WCB$SMID[1] = SMID"TTEXT"; ABHADR[1] = HDR$OPORD[0]; SSTAQE(P,WCBUF[1],ABH[1],ALLCTRL); END ELSE BEGIN WCB$WORD[1] = 5; WCB$SMID[1] = SMID"TTEXT"; ABHADR[1] = HDR$OPORD[0]; FOR I = 0 STEP 1 WHILE I LS CSNPCNT DO BEGIN IF NPU$STAT[I] NQ SUPSTAT"SUPLOST" AND NPU$CNOP[I] EQ HDR$OPORD[0] THEN BEGIN FORMSTAT(I); END END END # * IF -AUTO- WAS SPECIFIED, THEN CHECK IF AN OPERATOR ALREADY HAS * AUTO CONTROL STATUS. IF SO, THEN SEND A MESSAGE INDICATING THAT * SOMEONE ELSE ALREADY HAS AUTO CONTROL, OTHERWISE SEND A MESSAGE * INDICATING THAT THE OPERATOR NOW HAS AUTO CONTROL STATUS. # IF PAR$PCODE[NPIDX] EQ "AU0" THEN BEGIN WCB$WORD[1] = 0; WCB$SMID[1] = SMID"TTEXT"; ABHADR[1] = HDR$OPORD[0]; IF CSACNOP EQ 0 THEN BEGIN CSACNOP = HDR$OPORD[0]; WCB$WC[1] = 6; SSTAQE(P,WCBUF[1],ABH[1],AUCTRL); END ELSE BEGIN WCB$WC[1] = 5; NAC$TNAM[0] = OC$TNAM[CSACNOP]; SSTAQE(P,WCBUF[1],ABH[1],NOACTRL); END END END # * -NPUS- OR -AUTO- WAS SPECIFIED AND CONTROL IS TO BE RELEASED. * IF -NPUS- WAS SPECIFIED, THEN CLEAR ALL THE CONTROLLING NOP * FIELDS IN THE NPUCB-S THAT MATCH THIS OPERATOR-S ORDINAL. # ELSE BEGIN IF PAR$PCODE[NPIDX] EQ "NPS" THEN BEGIN WCB$WORD[1] = 3; FOR I=0 STEP 1 WHILE I LS CSNPCNT DO BEGIN IF NPU$STAT[I] NQ SUPSTAT"SUPLOST" AND NPU$CNOP[I] EQ HDR$OPORD[0] THEN BEGIN NPU$CNOP[I] = 0; WCB$SMID[1] = SMID"CTRLOFF"; ABHSN[1] = I; TNAME = OC$TNAM[HDR$OPORD[0]]; SSTAQE(P,WCBUF[1],ABH[1],TNAME); P = LOC(NPU$RFLGS[I]); SSBCBW( FLG$WORD, HDR$OPORD[0] ); IF CSACNOP NQ 0 THEN BEGIN NPU$CNOP[I] = CSACNOP; SSBSBW(FLG$WORD,CSACNOP); WCB$SMID[1] = SMID"CTRLON"; TNAME = OC$TNAM[CSACNOP]; SSTAQE(P, WCBUF[1], ABH[1], TNAME); END END END END # * FOR -NPUS- OR -AUTO-, IF THIS OPERATOR IS A CONTROLLING NOP, THEN * CLEAR THE AUTO CONTROL STATUS FOR THIS OPERATOR. # IF CSACNOP EQ HDR$OPORD[0] THEN BEGIN CSACNOP = 0; END END END ENDEXIT: # * SEND EMPTY TEXT WITH INPUT ALLOWED FLAG SET TO TERMINATE THE * COMMAND. # WCB$WORD[1] = 2; WCB$SMID[1] = SMID"TTEXT"; WCB$IAF[1] = TRUE; ABHWORD[1] = 0; ABHADR[1] = HDR$OPORD[0]; SSTAQE(P,WCBUF[1],ABH[1],MSGBUF); END #CSSACO# TERM