*DECK CSCUHS
USETEXT TEXTCS
USETEXT TEXTSS
USETEXT TXTAPSS
PROC CSCUHS;
# TITLE CSCUHS - UPDATE HOP STATUS. #
BEGIN # CSCUHS #
#
** CSCUHS - UPDATE HOP STATUS.
*
* D. G. DEPEW. 82/03/04.
*
* THIS PROCEDURE PERFORMS ALL THE CONNECTION(C) LAYER PROCESSING
* REQUIRED FOR THE INBOUND, SPECIAL HOP SUPERVISORY MESSAGES.
*
* PROC CSCUHS
*
* ENTRY WCBUF[0] = WORD COUNT WORD FROM ORIGINAL CONNECTION
* TRAFFIC QUEUE (*CNQ*) ENTRY.
* ABHBUF[0] = APPLICATION BLOCK HEADER FOR THE SM (BASED
* ARRAY *ABH* IN *TXTAPSS* POINTS HERE).
* MSGBUF[0] = BODY OF THE SM (BASED ARRAY *APSM* IN
* *TXTAPSS* POINTS HERE). THE POSSIBLE PFC/SFC
* VALUES ARE: HOP/START, HOP/CMD, HOP/BRK,
* HOP/PAGE, HOP/END, HOP/IG.
*
* EXIT ANY OF THE FOLLOWING IN VARIOUS COMBINATIONS ACCORDING TO
* THE SM RECEIVED AND THE STATE OF THE HOP PSEUDO ACN:
* - THE HOP PSEUDO ACN STATE HAS BEEN UPDATED.
* - AN ENTRY HAS BEEN PLACED IN THE PROTOCOL EVENT QUEUE
* (*PEQ*).
* - ONE OR MORE HOP ENTRIES IN THE WAITING BLOCK QUEUE
* (*WBQ*) HAVE BEEN TRANSFERRED TO THE OUTGOING TRAFFIC
* QUEUE (*OTQ*).
* - ALL OUTPUT ENQUEUED FOR THE HOP (IN THE *WBQ*) HAS BEEN
* DISCARDED.
* - AN ENTRY HAS BEEN PLACED IN THE OPERATOR TYPEIN QUEUE
* (*OPTQ*).
* - HOP PAGING STATUS HAS BEEN UPDATED.
* - HOP IGNORE STATUS HAS BEEN UPDATED.
*
* NOTE THE PROCESSING IS DEFINED BY THE CS/HOP C-LAYER STATE
* DIAGRAM.
#
#
**** PROC CSCUHS - XREF LIST.
#
XREF
BEGIN
PROC MOVE; # MOVE STORAGE DIRECT ADDRESSING (MACREL) #
PROC SSSAWR; # ACCEPT WORKLIST REQUEST #
PROC SSTAQE; # ACCEPT QUEUE ENTRY #
PROC SSTATS; # ALLOCATE TABLE SPACE AT END OF TABLE #
PROC SSTRTS; # REMOVE TABLE SPACE ANYWHERE IN TABLE #
END
#
****
#
ITEM STATE S:HCNST; # TEMP CELL FOR STATE OF HOP PSEUDO ACN #
#
* FOLLOWING ITEMS ARE USED ONLY BY EMBEDDED PROCS (SOME ARE
* SHARED).
#
ITEM I; # LOOP INDUCTION VARIABLE #
ITEM COUNT; # NUMBER OF HOP *WBQ* ENTRIES TO BE MOVED #
ITEM LICNT; # COUNT OF DISPLAY LINES IN *WBQ* ENTRY #
ITEM OORD; # OUTGOING TRAFFIC QUEUE ORDINAL #
ITEM SIZ; # *OTQ* ENTRY SIZE #
ITEM WBC; # *WBQ* ENTRY COUNT OR ENTRY SIZE #
ITEM WORD; # WAITING BLOCK QUEUE ORDINAL #
BASED ARRAY TEXTLOC [00:00] S(1); ;
ARRAY OUTDISC [00:00] S(5);
BEGIN
ITEM OD$PSFC U(00,00,16) = [HOPDIS];
ITEM OD$ZERO1 U(00,16,43) = [0];
ITEM OD$IAF B(00,59,01) = [TRUE]; # INPUT OK #
ITEM OD$TEXT1 C(01,00,16) = ["OUTPUT DISCARDED"];
ITEM OD$ZERO2 U(02,36,24) = [0];
ITEM OD$TEXT2 C(03,00,07) = ["READY.."];
ITEM OD$ZERO3 U(03,42,18) = [0];
ITEM OD$ZERO4 U(04,00,60) = [0];
END
ARRAY PAGEMSG [00:00] S(4);
BEGIN
ITEM PG$PSFC U(00,00,16) = [HOPDIS];
ITEM PG$ZERO1 U(00,16,44) = [0]; # NO INPUT #
ITEM PG$TEXT C(01,00,15) = ["PAGE ACCEPTED.."];
ITEM PG$ZERO2 U(02,30,30) = [0];
ITEM PG$ZERO3 U(03,00,60) = [0];
END
ARRAY RKPAGE [PAGE1:NPG] S(116); # HOP/DIS FOR HELP DISPLAY #
BEGIN
ITEM RK$PAGEPS U(000,00,16) = [NPG(X"D009")]; # PFC/SFC VALUE #
ITEM RK$PAGEZ1 U(000,16,42) = [NPG(0)];
ITEM RK$PAGERS B(000,58,01) = [NPG(TRUE)]; # RIGHT SCREEN #
ITEM RK$PAGEIA B(000,59,01) = [NPG(FALSE)]; # INPUT ALLOWED #
# HEADER DISPLAY #
ITEM RK$PAGEL01 C(01,00,20) = [NPG(" *** ")] ;
ITEM RK$PAGEM01 C(03,00,20) = [NPG("CS COMMAND LIST *** ")];
ITEM RK$PAGEN01 C(05,00,18) = [NPG(" ")] ; # DIS HEADER LINE#
ITEM RK$PAGEE01 U(06,48,12) = [NPG(0)]; # LINE TERMINATOR#
ITEM RK$PAGEM02 C(07,00,40) = [NPG(" ")]; # BLANK LINE #
ITEM RK$PAGEN02 C(11,00,18) = [NPG(" (PAGE OF 3) ")];
ITEM RK$PAGEO02 C(11,48,01) = ["1","2","3"];
ITEM RK$PAGEE02 U(12,48,12) = [NPG(0)]; # LINE TERMINATOR#
ITEM RK$PAGEL03 C(13,00,30)= ["CO,NP=NPUNAME(,ON/OFF) ",
# PAGE2 # "EN,TR/LL/LI/TE=NAME. ",
# PAGE3 # "IN. "];
ITEM RK$PAGEM03 C(16,00,28)= ["GAIN (ON) OR GIVE UP CONTROL",
# PAGE2 # "ENABLE NAMED NETWORK ELEMENT",
# PAGE3 # "DISPLAY CURRENT INFORMATION "];
ITEM RK$PAGEE03 U(18,48,12)= [NPG(0)] ;
ITEM RK$PAGEL04 C(19,00,30)= [" ",
# PAGE2 # "EN,LIS/TRS/LLS,NP=NPUNAME. ",
# PAGE3 # " "];
ITEM RK$PAGEM04 C(22,00,28)= [" OF NAMED NPU. ",
# PAGE2 # "ENABLE ALL LINES/TERMINALS/ ",
# PAGE3 # " ABOUT NOPS CONNECTED TO "];
ITEM RK$PAGEE04 U(24,48,12)= [NPG(0)] ;
ITEM RK$PAGEL05 C(25,00,30)= ["CO,NPS(,ON/OFF) ",
# PAGE2 # " ",
# PAGE3 # " "];
ITEM RK$PAGEM05 C(28,00,28)= ["GAIN OR GIVE UP CONTROL OF ",
# PAGE2 # " OR LLINKS ON NAMED NPU. ",
# PAGE3 # " AND NPUS SUPERVISED BY "];
ITEM RK$PAGEE05 U(30,48,12)= [NPG(0)] ;
ITEM RK$PAGEL06 C(31,00,30)= [" ",
# PAGE2 # "EN,LIS/TRS/LLS,NPS. ",
# PAGE3 # " "];
ITEM RK$PAGEM06 C(34,00,28)= [" ALL NPUS CURRENTLY SUPER- ",
# PAGE2 # "ENABLE ALL LINES, TERMINALS ",
# PAGE3 # " THIS CS. "];
ITEM RK$PAGEE06 U(36,48,12)= [NPG(0)] ;
ITEM RK$PAGEL07 C(37,00,30)= [" ",
# PAGE2 # " ",
# PAGE3 # "LO,NP=NPUNAME(,DU/ND). "];
ITEM RK$PAGEM07 C(40,00,28)= [" VISED BYE THIS CS. ",
# PAGE2 # " OR LLINKS ON ALL NPUS YOU ",
# PAGE3 # "STOP AND RELOAD NAMED NPU. "];
ITEM RK$PAGEE07 U(42,48,12)= [NPG(0)] ;
ITEM RK$PAGEL08 C(43,00,30)= ["CO,AU(,ON) ",
# PAGE2 # " ",
# PAGE3 # " "];
ITEM RK$PAGEM08 C(46,00,28)= ["AUTOMATICALLY GAIN CONTROL ",
# PAGE2 # " CONTROL AS A NOP. ",
# PAGE3 # " USE THE DUMP (DU) OR NO- "];
ITEM RK$PAGEE08 U(48,48,12)= [NPG(0)] ;
ITEM RK$PAGEL09 C(49,00,30)= [" ",
# PAGE2 # "EN,TES,(NPU=NNAME/LINE=LNAME. ",
# PAGE3 # " "];
ITEM RK$PAGEM09 C(52,00,28)= [" OF ANY NPU THAT COMES ",
# PAGE2 # "ENABLE ALL TERMINALS ON ",
# PAGE3 # " DUMP (ND) OPTION TO OVER- "];
ITEM RK$PAGEE09 U(54,48,12)= [NPG(0)] ;
ITEM RK$PAGEL10 C(55,00,30)= [" ",
# PAGE2 # " ",
# PAGE3 # " "];
ITEM RK$PAGEM10 C(58,00,28)= [" UNDER SUPERVISION OF THIS ",
# PAGE2 # " NAMED NPU OR LINE. ",
# PAGE3 # " WRITE THE LONGTERM DMP FLG"];
ITEM RK$PAGEE10 U(60,48,12)= [NPG(0)] ;
ITEM RK$PAGEL11 C(61,00,30)= [" ",
# PAGE2 # "EN,TES,NPS. ",
# PAGE3 # "LO,NPS(,DU,ND). "];
ITEM RK$PAGEM11 C(64,00,28)= [" CS OR IF ITS CONTROL IS ",
# PAGE2 # "ENABLE ALL TERMINALS ON ALL ",
# PAGE3 # "STOP AND RELOAD ALL NPUS "];
ITEM RK$PAGEE11 U(66,48,12)= [NPG(0)] ;
ITEM RK$PAGEL12 C(67,00,30)= [" ",
# PAGE2 # " ",
# PAGE3 # " "];
ITEM RK$PAGEM12 C(70,00,28)= [" GIVEN UP BY ANOTHER NOP. ",
# PAGE2 # " NPUS YOU CONTROL AS A NOP.",
# PAGE3 # " UNDER YOUR CONTROL. "];
ITEM RK$PAGEE12 U(72,48,12)= [NPG(0)] ;
ITEM RK$PAGEL13 C(73,00,30)= ["CO,AU,OFF. ",
# PAGE2 # "GO,NP=NPUNAME. ",
# PAGE3 # "RE/REPORT,(NPU/NP=NNN/NPUS/ "];
ITEM RK$PAGEM13 C(76,00,28)= ["CANCEL EFFECT OF CO,AU,ON. ",
# PAGE2 # "START THE NAMED NPU. ",
# PAGE3 # "REQUEST TO/TO NOT RECEIVE "];
ITEM RK$PAGEE13 U(78,48,12)= [NPG(0)] ;
ITEM RK$PAGEL14 C(79,00,30)= ["DI,TR/LL/LI/TE=NAME. ",
# PAGE2 # "GO,NPS. ",
# PAGE3 # "NPS),ON/OFF. "];
ITEM RK$PAGEM14 C(82,00,30)= ["DISABLE TRUNK, LLINK,LINE OR",
# PAGE2 # "START ALL THE NPUS YOU ",
# PAGE3 # " UNSOLICITED STATUS REPORT. "];
ITEM RK$PAGEE14 U(84,48,12)= [NPG(0)] ;
ITEM RK$PAGEL15 C(85,00,30)= [" ",
# PAGE2 # " ",
# PAGE3 # "ST/STATUS(,NPU/NP=/NPUS/NPS). "];
ITEM RK$PAGEM15 C(88,00,28)= [" NAMED TERMINAL. ",
# PAGE2 # " CONTROL AS A NOP. ",
# PAGE3 # "STATUS OF NAMED NPU. "];
ITEM RK$PAGEE15 U(90,48,12)= [NPG(0)];
ITEM RK$PAGEL16 C(91,00,30)= ["DU,NP=NPUNAME(,ON/OFF) ",
# PAGE2 # "HI. ",
# PAGE3 # "TS(,NPU/NP=NNN)(,RE/MS=MESAGE "];
ITEM RK$PAGEM16 C(94,00,28)= ["SET LONG TERM DUMP FLAG ON ",
# PAGE2 # "DISPLAY LAST PAGE OF RECENT ",
# PAGE3 # "DIAGNOSTIC TEST COMMAND. "];
ITEM RK$PAGEE16 U(96,48,12)= [0] ;
ITEM RK$PAGEL17 C(97,00,30)= [" ",
# PAGE2 # " ",
# PAGE3 # "/SEND/SE/DROP/DR). "];
ITEM RK$PAGEM17 C(100,00,28)=[" OR OFF FOR NAMED NPU. ",
# PAGE2 # " ACTIVITY HISTORY BUFFER. ",
# PAGE3 # " "];
ITEM RK$PAGEE17 U(102,48,12)=[0] ;
ITEM RK$PAGEL18 C(103,00,30)=["DU,NPS(,ON/OFF) ",
# PAGE2 # "HI,ALL. ",
# PAGE3 # "SE(,TE/LI/LL/NP=ELEMENT,MSG/MS"];
ITEM RK$PAGEM18 C(106,00,28)=["SET DUMP FLAG ON ALL NPUS ",
# PAGE2 # "DISP ALL PAGES OF HISTORY. ",
# PAGE3 # "SEND TO NAMED ELEMENT THE "];
ITEM RK$PAGEE18 U(108,48,12)=[NPG(0)];
ITEM RK$PAGEL19 C(109,00,20)=[" ",
# PAGE2 # " ",
# PAGE3 # "=MESSAGE STRING). "];
ITEM RK$PAGEM19 C(111,00,20)=["TYPE ( TO FORWARD. ",
# PAGE2 # "TYPE ( TO FORWARD. ",
# PAGE3 # "MESSAGE. "];
ITEM RK$PAGEN19 C(113,00,18)=["TYPE ) TO BACKWARD",
# PAGE2 # "TYPE ) TO BACKWARD",
# PAGE3 # "* FOR BACK TO NAM "];
ITEM RK$PAGEE19 U(114,48,12)=[NPG(0)] ;
ITEM RK$PAGEZW U(115,00,60)=[NPG(0)] ; # END BY ZEROED WORD #
END # NINETEEN LINES PER PAGE FOR RIGHT K-DIS #
DEF ODTLW$ #5#; # *OUTPUT DISCARDED* TEXT LENGTH IN WORDS #
DEF ODQES$ #7#; # *OUTPUT DISCARDED* QUEUE ENTRY SIZE #
DEF PGTLW$ #4#; # *PAGE ACCEPTED..* TEXT LENGTH IN WORDS #
DEF PGQES$ #6#; # *PAGE ACCEPTED..* QUEUE ENTRY SIZE #
CONTROL EJECT;
PROC XMITHQ;
BEGIN # XMITHQ #
#
* XMITHQ - TRANSMIT HOP QUEUE.
*
* THIS EMBEDDED PROC MOVES HOP ENTRIES IN THE WAITING BLOCK QUEUE
* (*WBQ*) TO THE OUTGOING TRAFFIC QUEUE (*OTQ*). THE NUMBER OF
* ENTRIES MOVED DEPENDS UPON PAGING STATUS AND WHETHER THERE
* ACTUALLY IS DATA QUEUED (IN THE *WBQ*) FOR THE HOP.
*
* PROC XMITHQ
*
* ENTRY 1. THE *WBQ* CONTAINS ZERO OR MORE HOP ENTRIES.
* 2. THE ACN LIST ENTRY FOR THE HOP CONTAINS ALL REQUIRED
* INFORMATION - NAMELY, THE COUNT OF HOP ENTRIES IN THE
* *WBQ* AND THE PAGING STATUS FLAG.
*
* EXIT 1. ZERO OR MORE HOP ENTRIES HAVE BEEN REMOVED FROM THE
* *WBQ* AND PLACED IN THE *OTQ*.
* 2. THE COUNT OF LINES CURRENTLY BEING DISPLAYED HAS BEEN
* SET TO THE LINE COUNT OF THE LAST *WBQ* ENTRY MOVED
* (ZERO IF NO ENTRIES MOVED).
* 3. THE HOP WAITING BLOCK COUNT HAS BEEN UPDATED
* APPROPRIATELY.
*
* NOTE HOP ENTRIES IN THE *WBQ* ARE ALREADY IN CORRECT HOP/DIS
* FORMAT EXCEPT FOR THE EXTRA WORD AT THE END, WHICH IS
* REQUIRED BY NIP AND MUST BE ADDED.
#
#
* THE FIRST TASK IS TO DETERMINE HOW MANY BLOCKS (HOP *WBQ* ENTRIES)
* TO MOVE. IF PAGING IS ON, MOVE ONE BLOCK (AT MOST A SCREENFULL).
* IF PAGING IS OFF, MOVE ALL ENQUEUED BLOCKS. OF COURSE, IF THERE
* ARE CURRENTLY NO HOP ENTRIES IN THE *WBQ*, NOTHING HAPPENS.
#
WBC = ACN$WBCNT[HOPORD$];
IF ACN$PWAIT[HOPORD$]
AND WBC NQ 0
THEN
COUNT = 1;
ELSE
COUNT = WBC; # CAN BE ZERO #
ACN$WBCNT[HOPORD$] = WBC - COUNT; # UPDATED #
#
* NOW MOVE THE BLOCKS. SET THE COUNT OF TEXT LINES CURRENTLY BEING
* DISPLAYED TO THE LINE COUNT OF THE LAST BLOCK MOVED (IF ONE).
* PROVIDE FOR THE EXTRA WORD REQUIRED IN THE HOP/DIS SM. IN ORDER
* TO MOVE A BLOCK, WE MUST FIRST FIND IT.
#
LICNT = 0; # INITIALIZE #
WORD = 0;
FOR I=1 STEP 1 UNTIL COUNT
DO # MOVE *COUNT* BLOCKS, ZERO OK #
BEGIN
FOR WORD = WORD STEP WBQ$ESIZE[WORD]
WHILE WBQ$ABHACN[WORD] NQ 0
OR WBQ$SMACN[WORD] NQ 0
DO # FIND HOP ENTRY (HOP/DIS SM) #
BEGIN END
OORD = OTQL; # WHERE *OTQ* ENTRY WILL BE #
WBC = WBQ$ESIZE[WORD]; # SIZE OF ENTRY TO BE MOVED #
SIZ = WBC + 1; # SIZE OF HOP/DIS NTRY IN *OTQ* #
LICNT = WBQ$LICNT[WORD]; # TEXT LINES IN *WBQ* ENTRY #
WBQ$ESIZE[WORD] = SIZ; # UPDATE PRIOR TO MOVE #
WBQ$TLC[WORD] = WBQ$TLC[WORD] + 1;
SSTATS (P<OTQ>, SIZ); # MAKE ROOM #
MOVE (WBC, WBQ[WORD], OTQ[OORD]);
SSTRTS (P<WBQ>, WORD, WBC); # DELETE WAITING BLOCK #
OTQ$WORD[OTQL-1] = 0; # EXTRA WORD #
IF OORD EQ 0
THEN # FIRST ENTRY IN *OTQ* #
SSSAWR (CSWDF"SACNI");
END
ACN$BLCNT[HOPORD$] = LICNT; # NUMBER LINES ON SCREEN #
END # XMITHQ #
PROC PURGEHQ;
BEGIN # PURGEHQ #
#
* PURGEHQ - PURGE HOP QUEUE.
*
* THIS EMBEDDED PROC REMOVES ALL HOP ENTRIES FROM THE WAITING BLOCK
* QUEUE (*WBQ*).
*
* PROC PURGEHQ
*
* ENTRY 1. THE *WBQ* CONTAINS ZERO OR MORE HOP ENTRIES.
* 2. THE ACN LIST ENTRY FOR THE HOP CONTAINS ALL REQUIRED
* INFORMATION - NAMELY, THE COUNT OF HOP *WBQ* ENTRIES.
*
* EXIT 1. ALL HOP ENTRIES IN THE *WBQ* HAVE BEEN DELETED.
* 2. THE COUNTS OF *WBQ* ENTRIES AND LINES CURRENTLY BEING
* DISPLAYED (BOTH IN THE ACN LIST ENTRY FOR THE HOP)
* HAVE BEEN CLEARED.
#
#
* INITIALIZE AND UPDATE THE ACN LIST ENTRY FOR THE HOP.
#
COUNT = ACN$WBCNT[HOPORD$]; # NUMBER OF BLOCKS TO DELETE #
ACN$WBCNT[HOPORD$] = 0;
ACN$BLCNT[HOPORD$] = 0; # START NEW PAGE #
#
* NOW DELETE THE ENTRIES. IN ORDER TO DELETE AN ENTRY, WE MUST
* FIRST FIND IT.
#
WORD = 0;
FOR I=1 STEP 1 UNTIL COUNT
DO # DEL *COUNT* ENTRIES, ZERO OK #
BEGIN
FOR WORD = WORD STEP WBQ$ESIZE[WORD]
WHILE WBQ$ABHACN[WORD] NQ 0
OR WBQ$SMACN[WORD] NQ 0
DO # FIND HOP ENTRY (HOP/DIS SM) #
BEGIN END
WBC = WBQ$ESIZE[WORD]; # SIZE OF ENTRY TO BE DELETED #
SSTRTS (P<WBQ>, WORD, WBC); # DELETE WAITING BLOCK #
END
END # PURGEHQ #
CONTROL EJECT;
#
* MAIN ROUTINE BEGINS HERE.
*
* WE EXECUTE WHAT AMOUNTS TO A CASE CONSTRUCT TO PROCESS THE SIX
* TYPES OF INCOMING HOP SM-S.
#
IF WCB$SMID[0] EQ SMID"HOPSTRT"
THEN # K-DISPLAY ASSIGNED TO CS #
BEGIN
#
* INITIALIZE THE HOP ACN LIST ENTRY. SEND THE HOP/START TO THE
* I-LAYER (AS PROTOCOL EVENT), IF APPROPRIATE. UPDATE THE STATE.
#
STATE = ACN$HOPST[HOPORD$];
ACN$WORD0[HOPORD$] = 0;
ACN$WORD1[HOPORD$] = 0;
IF STATE EQ S"INACT"
THEN # SEND HOP/START TO I-LAYER #
BEGIN
WCB$WC[0] = 2; # MIN QUEUE ENTRY LENGTH #
ABHADR[0] = HOPORD$;
ABHTLC[0] = 0;
SSTAQE (P<PEQ>, WCBUF[0], ABH[0], APSM[0]); # TO I-LAYER #
END
IF STATE EQ S"ENDED"
THEN
ACN$HOPST[HOPORD$] = S"RESTART";
ELSE
BEGIN
ACN$HOPST[HOPORD$] = S"CREATE";
ACN$PL[HOPORD$] = HOPLPL[0] - 1;
END
END
ELSE IF WCB$SMID[0] EQ SMID"HOPCMD"
THEN # HOP ENTERED A COMMAND #
BEGIN
#
* FORWARD THE COMMAND TO THE I-LAYER (AS OPERATOR TYPEIN) FOR
* SYNTAX CRACKING AND COMMAND PROCESSING. ECHO THE COMMAND BACK
* TO THE K-DISPLAY VIA HOP/DIS SM. UPDATE THE STATE AND SEND HIM
* THE NEXT PAGE OF QUEUED OUTPUT (IF ANY). NOTE THAT *OPTQ*
* ENTRIES DO NOT CONTAIN A PFC/SFC WORD (SAME FORMAT FOR HOP AS
* FOR NOPS).
#
WCB$WORD[1] = WCB$WC[0] - 1; # DEDUCT FOR PFC/SFC WORD #
ABHWORD[1] = 0;
ABHADR[1] = HOPORD$;
ABHTLC[1] = HOPDTL[0]; # ACTUAL CHAR COUNT #
P<TEXTLOC> = LOC(SPMSG1[0]); # LOCATION OF COMMAND TEXT #
SSTAQE (P<OPTQ>, WCBUF[1], ABH[1], TEXTLOC[0]); # TO I-LAYER #
WCB$WORD[0] = WCB$WC[0] + 1; # EXTRA WORD FOR HOP/DIS SM #
ABHTLC[0] = ABHTLC[0] + 1;
SPMSG0[0] = 0; # NO INPUT ALLOWED #
PFCSFC[0] = HOPDIS;
SSTAQE (P<OTQ>, WCBUF[0], ABH[0], APSM[0]); # ECHO COMMAND #
OTQ$WORD[OTQL-1] = 0; # EXTRA WORD #
ACN$HOPST[HOPORD$] = S"COMMAND";
XMITHQ; # XMIT QUEUED HOP DATA (IF ANY) #
END
ELSE IF WCB$SMID[0] EQ SMID"HOPBRK"
THEN # HOP ENTERED A BREAK #
BEGIN
#
* RELEASE ALL QUEUED (IN THE *WBQ*) OUTPUT. IF THE HOP PSEUDO
* ACN IS IN THE *ACTIVE* STATE, SEND THE *OUTPUT DISCARDED*
* MESSAGE FOLLOWED BY *READY..*. IF A COMMAND IS IN PROGRESS,
* FORWARD THE BREAK TO THE I-LAYER AS AN OPERATOR TYPEIN (*OPTQ*).
* UPDATE THE STATE.
#
PURGEHQ; # PURGE QUEUED HOP DATA(IF ANY) #
IF ACN$HOPST[HOPORD$] EQ S"CREATE"
THEN # BREAK HISTORY BUFFER OUTPUT #
ACN$HOPST[HOPORD$] = S"STARTBRK";
ELSE IF ACN$HOPST[HOPORD$] EQ S"ACTIVE"
THEN # BREAK UNSOLICITED STATUS RPTS #
BEGIN
WCB$WORD[0] = ODQES$;
ABHTLC[0] = ODTLW$;
SSTAQE (P<OTQ>, WCBUF[0], ABH[0], OUTDISC);
ACN$BLCNT[HOPORD$] = 2; # START NEW PAGE W/ 2 LINES #
END
ELSE IF ACN$HOPST[HOPORD$] EQ S"COMMAND"
THEN # BREAK COMMAND IN PROGRESS #
BEGIN
WCB$WORD[1] = 2; # MIN QUEUE ENTRY LENGTH #
ABHWORD[1] = 0; # TLC = 0 #
ABHADR[1] = HOPORD$;
ABHBRK[1] = 1;
SSTAQE (P<OPTQ>, WCBUF[1], ABH[1], TEXTLOC[0]); #TO I-LAYER #
ACN$HOPST[HOPORD$] = S"BREAK";
END
ELSE # MUST BE BRK HIST AFT RESTART #
ACN$HOPST[HOPORD$] = S"RESBREAK";
END
ELSE IF WCB$SMID[0] EQ SMID"HOPIG"
THEN # HOP WANTS TO IGNORE CS REPTS #
#
* ALL THAT IS REQUIRED IS TO SET THE APPROPRIATE FLAG IN THE HOP
* ENTRY OF THE ACN LIST.
#
ACN$IGNOR[HOPORD$] = TRUE;
ELSE IF WCB$SMID[0] EQ SMID"HOPENDD"
THEN # K-DIS NO LONGER ASS'D TO CS #
BEGIN
#
* RELEASE ALL QUEUED (IN THE *WBQ*) OUTPUT. IF THE HOP PSEUDO
* ACN IS IN THE *ACTIVE* STATE, SEND A CON/CB PROTOCOL EVENT TO
* THE I-LAYER. IF THERE IS A COMMAND IN PROGRESS, SEND A CON/CB-
* WARNING PROTOCOL EVENT TO THE I-LAYER (CON/CB WILL BE SENT WHEN
* COMMAND IS CLEANED UP). UPDATE THE HOP PSEUDO ACN STATE.
#
PURGEHQ; # PURGE QUEUED HOP DATA(IF ANY) #
IF ACN$HOPST[HOPORD$] EQ S"ACTIVE"
OR ACN$HOPST[HOPORD$] EQ S"COMMAND"
THEN # MUST SEND P.E. TO I-LAYER #
BEGIN
WCB$WORD[0] = 2; # MIN QUEUE ENTRY SIZE #
ABHADR[0] = HOPORD$;
ABHTLC[0] = 0;
IF ACN$HOPST[HOPORD$] EQ S"ACTIVE"
THEN
WCB$SMID[0] = SMID"CONCB";
ELSE
WCB$SMID[0] = SMID"CONCBW";
SSTAQE(P<PEQ>, WCBUF[0], ABH[0], APSM[0]); # TO I-LAYER #
END
IF ACN$HOPST[HOPORD$] EQ S"CREATE"
OR ACN$HOPST[HOPORD$] EQ S"STARTBRK"
THEN
ACN$HOPST[HOPORD$] = S"STARTEND";
ELSE
ACN$HOPST[HOPORD$] = S"ENDED";
END
ELSE # MUST BE A PAGING COMMAND SM #
BEGIN
#
* IF THE COMMAND INDICATES A CHANGE IN PAGING STATUS IS DESIRED,
* SEND THE *PAGE ACCEPTED..* MESSAGE AND REMEMBER THE NEW PAGING
* STATUS. THEN SEND THE HOP AS MUCH QUEUED (IN THE *WBQ*) DATA
* (IF ANY) AS IS CONSISTENT WITH THE UPDATED PAGING STATUS.
#
IF HOPPC[0] EQ "("
THEN
BEGIN # SEND NEXT PAGE FOR RIGHT DISPLAY#
WCB$SMID[1] = SMID"HOPDIS" ;
WCB$WC[1] = RKPAGESZ + 1;
ABHWORD[1] = 0 ;
ABHABT[1] = 3 ;
ABHACT[1] = 1 ;
ABHTLC[1] = RKPAGESZ ;
IF OC$PAGEC[HOPORD$] EQ PAGE3
THEN
OC$PAGEC[HOPORD$] = PAGE1 ;
ELSE
OC$PAGEC[HOPORD$] = OC$PAGEC[HOPORD$] + 1 ;
SSTAQE(P<OTQ>,WCBUF[1],ABH[1],RKPAGE[OC$PAGEC[HOPORD$]]);
END
ELSE
BEGIN
IF HOPPC[0] EQ ")"
THEN
BEGIN
WCB$SMID[1] = SMID"HOPDIS" ;
WCB$WC[1] = RKPAGESZ + 1 ;
ABHWORD[1] = 0 ;
ABHABT[1] = 3 ;
ABHACT[1] = 1 ;
ABHTLC[1] = RKPAGESZ ;
IF OC$PAGEC[HOPORD$] EQ PAGE1
THEN
OC$PAGEC[HOPORD$] = PAGE3 ; # BACK TO PAGE 3 #
ELSE
OC$PAGEC[HOPORD$] = OC$PAGEC[HOPORD$] - 1 ;
SSTAQE(P<OTQ>,WCBUF[1],ABH[1],RKPAGE[OC$PAGEC[HOPORD$]
]) ;
END
ELSE
IF HOPPC[0] NQ ACN$PCHAR[HOPORD$]
THEN # PAGING STATUS CHANGE #
BEGIN
WCB$WORD[0] = PGQES$;
ABHTLC[0] = PGTLW$;
SSTAQE (P<OTQ>, WCBUF[0], ABH[0], PAGEMSG);
ACN$PCHAR[HOPORD$] = HOPPC[0];
END
END
XMITHQ; # XMIT QUEUED HOP DATA (IF ANY) #
END
END # CSCUHS #
TERM