*DECK     CSCPHT
USETEXT TEXTCS
USETEXT TEXTSS
USETEXT TXTAPSS 
PROC CSCPHT;
# TITLE CSCPHT - PREPARE HOP TEXT.   #
  
      BEGIN  # CSCPHT # 
# 
**    CSCPHT - PREPARE HOP TEXT.
* 
*     D. G. DEPEW.           82/02/25.
* 
*     THIS PROCEDURE PROCESSES TEXT LINES (TERMINAL TEXT) FROM THE
*     I-LAYER DESTINED FOR THE HOP.  ITS FUNCTION IS TO FORMAT THE TEXT 
*     INTO A HOP/DIS SM AND EITHER ISSUE IT, QUEUE IT OR DISCARD IT 
*     AS APPROPRIATE. 
* 
*     PROC CSCPHT 
* 
*     ENTRY    WCBUF[0] = WORD COUNT WORD FROM ORIGINAL CONNECTION
*                         TRAFFIC QUEUE (*CNQ*) ENTRY (CONTAINS THE 
*                         INPUT ALLOWED AND HOP ALERT FLAGS). 
*             ABHBUF[0] = APPLICATION BLOCK (EVENT) HEADER FOR THE TEXT 
*                         (BASED ARRAY *ABH* IN *TXTAPSS* POINTS HERE). 
*             MSGBUF[0] = DISPLAY CODED TEXT LINE (BASED ARRAY *APSM* 
*                         IN *TXTAPSS* POINTS HERE).
* 
*     EXIT    ONE OR MORE OF THE FOLLOWING IN ACCORDANCE WITH THE STATE 
*             OF THE HOP PSEUDO ACN AND WHETHER PAGE WAIT IS IN EFFECT: 
*              - A HOP/DIS SM FOR THE TEXT HAS BEEN PLACED IN THE 
*                OUTGOING TRAFFIC QUEUE (*OTQ*).
*              - THE TEXT HAS BEEN PLACED IN THE WAITING BLOCK QUEUE
*                (*WBQ*) IN HOP/DIS FORMAT PENDING PAGE TURN. 
*              - THE TEXT HAS BEEN DISCARDED. 
*              - A CON/CB SM HAS BEEN FORMATTED AND PLACED IN THE 
*                PROTOCOL EVENT QUEUE (*PEQ*).
# 
  
# 
****  PROC CSCPHT - XREF LIST.
# 
      XREF
        BEGIN 
        PROC MOVE;           # MOVE STORAGE DIRECT ADDRESSING (MACREL) #
        PROC SSTAQE;         # ACCEPT QUEUE ENTRY                      #
        PROC SSTETS;         # ENLARGE TABLE SPACE ANYWHERE IN TABLE   #
        END 
# 
****
# 
  
  
      DEF ODWC$     #4#;     # *OUTPUT DISCARDED* FAKE Q NTRY WD COUNT #
      DEF RWC$      #3#;     # *READY..* FAKE QUEUE ENTRY WORD COUNT   #
      DEF MTLW$     #2#;     # *MORE DATA..* TEXT LENGTH IN WORDS      #
  
  
      ARRAY READY [00:00] S(1); 
        BEGIN 
        ITEM R$WD0      U(00,00,60);
        ITEM R$TEXT     C(00,00,07) = ["READY.."];
        ITEM R$ZERO     U(00,42,18) = [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 BY 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 #
  
  
  
      ARRAY MORDATA [00:00] S(2); 
        BEGIN 
        ITEM M$WD0      U(00,00,60);
        ITEM M$WD1      U(01,00,60);
        ITEM M$TEXT     C(00,00,11) = ["MORE DATA.."];
        ITEM M$ZERO     U(01,06,54) = [0];
        END 
  
      ARRAY DISCARD [00:00] S(2); 
        BEGIN 
        ITEM D$WD0      U(00,00,60);
        ITEM D$WD1      U(01,00,60);
        ITEM D$TEXT     C(00,00,16) = ["OUTPUT DISCARDED"]; 
        ITEM D$ZERO     U(01,36,24) = [0];
        END 
  
  
  
  
CONTROL EJECT;
  
PROC SENDLINE;
  
      BEGIN  # SENDLINE # 
# 
*     SENDLINE - SEND SINGLE LINE OF TEXT TO THE HOP. 
* 
*     THIS EMBEDDED PROC EITHER OUTPUTS OR ENQUEUES A SINGLE LINE OF
*     HOP TEXT DEPENDING UPON WHETHER PAGE WAIT IS IN EFFECT. 
* 
*     PROC SENDLINE 
* 
*     ENTRY   1. THE TEXT IS DEFINED BY *WCBUF[0]*, *ABHBUF[0]* AND 
*                *MSGBUF[0]* AS DESCRIBED ABOVE.
*             2. THE STATE OF THE HOP PSEUDO ACN IS SUCH THAT IT IS OK
*                TO ISSUE HOP/DIS SM'S. 
*             3. THE TEXT LENGTH IS ALWAYS A MULTIPLE OF 10 CHARACTERS. 
* 
*     EXIT    1. IF PAGE WAIT IS NOT IN EFFECT (PAGING TURNED OFF OR
*                LESS THAN 31 LINES ARE CURRENTLY BEING DISPLAYED), A 
*                HOP/DIS SM HAS BEEN PLACED IN THE *OTQ*. 
*             2. IF PAGE WAIT IS IN EFFECT (PAGING TURNED ON AND EITHER 
*                31 OR 32 LINES ARE CURRENTLY BEING DISPLAYED), THE 
*                TEXT HAS BEEN PLACED IN THE *WBQ* AS FOLLOWS:  
*                - IF, UPON ENTRY, THERE WAS AN EXISTING *WBQ* ENTRY
*                  FOR THE HOP AND THAT ENTRY CONTAINED FEWER THAN 31 
*                  LINES, THE TEXT WAS ADDED TO THE END OF THAT ENTRY.
*                - IF, UPON ENTRY, THERE WAS NO *WBQ* ENTRY FOR THE HOP 
*                  OR THAT ENTRY CONTAINED 31 OR 32 LINES, A NEW ENTRY
*                  WAS CREATED. 
* 
*     NOTES   1. HOP ENTRIES IN THE *WBQ* ARE IN HOP/DIS FORMAT AND MAY 
*                BE MOVED TO THE *OTQ* WITHOUT MODIFICATION, EXCEPT FOR 
*                THE ADDITION OF THE EXTRA WORD REQUIRED BY NIP.
*             2. WHEN PAGING IS TURNED ON, THE 32ND LINE OF THE DISPLAY 
*                IS RESERVED FOR THE *MORE DATA..* MESSAGE. 
# 
  
      ITEM I;                # LOOP INDUCTION VARIABLE                 #
      ITEM TLW;              # TEXT LENGTH IN WORDS                    #
      ITEM WBC;              # WAITING BLOCK COUNT                     #
      ITEM TORD;             # ORDINAL WHERE TEXT IS ADDED IN *WBQ*    #
      ITEM WORD;             # WAITING BLOCK QUEUE ENTRY ORDINAL       #
  
      BASED ARRAY TEXTLOC [00:00] S(1); 
        ITEM TL$WORD    U(00,00,60);
  
  
  
# 
*     WE BEGIN BY INITIALIZING SOME ITEMS AND POINTERS PURSUANT TO
*     FORMATTING THE HOP/DIS SM.
# 
      PFCSFC[1] = HOPDIS; 
      P<TEXTLOC> = LOC (SPMSG1[1]);    # WHERE TEXT WILL BE MOVED TO   #
      TLW = WCB$WC[0] - 2;
  
  
# 
*     IF PAGE WAIT IS NOT IN EFFECT, SIMPLY FORMAT THE HOP/DIS SM, SHIP 
*     IT, INCREMENT THE COUNT OF LINES BEING DISPLAYED, AND GET OUT.
*     PROVIDE FOR THE EXTRA WORD IN THE HOP/DIS SM REQUIRED BY NIP. 
# 
      IF NOT ACN$PWAIT[HOPORD$] 
        OR ACN$BLCNT[HOPORD$] LS ACN$PL[HOPORD$]
      THEN                             # WE ARE NOT AT A PAGE BOUNDARY #
        BEGIN 
        ABHTLC[1] = TLW + 2;           # HOP/DIS TLC IN ABH            #
        WCB$WORD[1] = TLW + 4;         # HOP/DIS ENTRY SIZE IN *OTQ*   #
        HOPI[1] = WCB$IAF[0];                    # INPUT ALLOWED FLAG  #
        MOVE (TLW, MSGBUF[0], TEXTLOC[0]);            # TEXT           #
        TL$WORD[TLW] = 0;                             # EXTRA WORD     #
        SSTAQE (P<OTQ>, WCBUF[1], ABH[1], APSM[1]); 
        ACN$BLCNT[HOPORD$] = ACN$BLCNT[HOPORD$] + 1;  # LINE COUNT     #
        RETURN; 
        END 
  
  
# 
*     PAGE WAIT IS IN EFFECT.  IF THERE ARE CURRENTLY 31 LINES BEING
*     DISPLAYED, *MORE DATA..* IS SENT AS THE LAST LINE OF THE PAGE.
# 
      IF ACN$BLCNT[HOPORD$] EQ ACN$PL[HOPORD$]
      THEN                             # MUST SEND *MORE DATA..*       #
        BEGIN 
        ABHTLC[1] = 4;                 # *MORE DATA..* TLC IN ABH      #
        WCB$WORD[1] = 6;               # *MORE DATA..* ESIZE IN *OTQ*  #
        HOPI[1] = FALSE;               # INPUT NOT NECESSARILY ALLOWED #
        SPMSG1[1] = M$WD0[0];                         # TEXT           #
        SPMSG2[1] = M$WD1[0]; 
        SPMSG3[1] = 0;                                # EXTRA WORD     #
        SSTAQE (P<OTQ>, WCBUF[1], ABH[1], APSM[1]); 
        ACN$BLCNT[HOPORD$] = HOPTPL$;                 # LINE COUNT     #
        END 
  
  
# 
*     THE TEXT MUST BE ENQUEUED IN THE *WBQ*.  THE FIRST TASK IS TO 
*     LOCATE THE LAST HOP ENTRY IN THE *WBQ* (IF THERE IS ONE). 
*     IF A HOP *WBQ* ENTRY IS EXTANT, ITS ORDINAL MUST, OF COURSE, BE 
*     LESS THAN THE TOTAL LENGTH OF THE *WBQ*.  THE SEARCH TECHNIQUE IS 
*     SET UP SUCH THAT IF THERE IS NO HOP *WBQ* ENTRY, THE ORDINAL
*     RETURNED EQUALS THE *WBQ* LENGTH. 
# 
      WBC = ACN$WBCNT[HOPORD$];        # NUMBER HOP ENTRIES IN *WBQ*   #
      WORD = WBQL;
      FOR I=0  STEP WBQ$ESIZE[I]
        WHILE WBC NQ 0
      DO                               # FIND LAST ENTRY               #
        IF WBQ$ABHACN[I] EQ 0 
          AND WBQ$SMACN[I] EQ 0 
        THEN                           # MUST BE HOP/DIS ASYNCH SM     #
          BEGIN 
          WBC = WBC - 1;
          WORD = I;                    # SAVE ORDINAL                  #
          END 
  
  
# 
*     IF THERE IS AN EXISTING *WBQ* ENTRY AND IT CONTAINS EXACTLY 31
*     LINES OF TEXT, THE *MORE DATA..* MESSAGE MUST BE ADDED TO THE END 
*     OF THAT ENTRY.  THIS WILL RESULT IN A NEW HOP *WBQ* ENTRY BEING 
*     CREATED FOR THE NEW LINE OF TEXT FURTHER BELOW. 
# 
      IF WORD LS WBQL 
        AND WBQ$LICNT[WORD] EQ ACN$PL[HOPORD$]
      THEN                             # 31 LINE ENTRY EXISTS          #
        BEGIN 
        TORD = WORD + WBQ$ESIZE[WORD];      # WHERE MSG WILL BE ADDED  #
        SSTETS (P<WBQ>, TORD, MTLW$);                 # MAKE ROOM      #
        WBQ$WORD[TORD] = M$WD0[0];                    # TEXT           #
        WBQ$WORD[TORD+1] = M$WD1[0];
        WBQ$TLC[WORD] = WBQ$TLC[WORD] + MTLW$;        # TLC IN ABH     #
        WBQ$ESIZE[WORD] = WBQ$ESIZE[WORD] + MTLW$;    # ENTRY SIZE     #
        WBQ$LICNT[WORD] = HOPTPL$;                    # LINE COUNT     #
        END 
  
  
# 
*     FINALLY, THE NEW LINE OF TEXT CAN BE ENQUEUED.  IF A HOP *WBQ*
*     ENTRY IS EXTANT AND IT CONTAINS FEWER THAN 31 LINES OF TEXT, THE
*     NEW LINE CAN (MUST) BE ADDED TO THE EXISTING ENTRY.  OTHERWISE, 
*     CREATE A NEW ENTRY. 
# 
      IF WORD LS WBQL 
        AND WBQ$LICNT[WORD] LS ACN$PL[HOPORD$]
      THEN                             # CAN ADD TEXT TO EXISTING NTRY #
        BEGIN 
        TORD = WORD + WBQ$ESIZE[WORD];      # WHERE TEXT WILL BE ADDED #
        SSTETS (P<WBQ>, TORD, TLW);                   # MAKE ROOM      #
        MOVE (TLW, MSGBUF[0], WBQ[TORD]);             # TEXT           #
        WBQ$TLC[WORD] = WBQ$TLC[WORD] + TLW;          # TLC IN ABH     #
        WBQ$ESIZE[WORD] = WBQ$ESIZE[WORD] + TLW;      # ENTRY SIZE     #
        WBQ$LICNT[WORD] = WBQ$LICNT[WORD] + 1;        # LINE COUNT     #
        IF WCB$IAF[0] 
        THEN                 # INPUT IS ALLOWED WITH THIS LINE OF TEXT #
          WBQ$HIAF[WORD] = TRUE;  # ENSURE SAME FOR ENTIRE Q'D HOP/DIS #
        END 
  
      ELSE                   # CREATE NEW *WBQ* ENTRY                  #
        BEGIN 
        ABHTLC[1] = TLW + 1;           # HOP/DIS TLC IN ABH            #
        WCB$WORD[1] = TLW + 3;         # HOP/DIS ENTRY SIZE IN *WBQ*   #
        WCB$FLAGS[1] = 1;              # INITIAL LINE COUNT            #
        HOPI[1] = WCB$IAF[0];          # INPUT ALLOWED FLAG            #
        MOVE (TLW, MSGBUF[0], TEXTLOC[0]);            # TEXT           #
        SSTAQE (P<WBQ>, WCBUF[1], ABH[1], APSM[1]); 
        ACN$WBCNT[HOPORD$] = ACN$WBCNT[HOPORD$] + 1;  # WAITING BLOCKS #
        END 
  
      END  # SENDLINE # 
  
  
  
  
  
CONTROL EJECT;
# 
*     MAIN ROUTINE BEGINS HERE. 
* 
*     WE BEGIN BY INITIALIZING SOME FIELDS IN THE OUTGOING ABH AND SM 
*     BODY AREAS.  THEN WE TAKE A MAIN BRANCH DEPENDING ON WHETHER
*     INPUT IS ALLOWED AFTER THIS TEXT IS OUTPUT TO THE HOP.
# 
  
      ABHWORD[1] = 0; 
      ABHABT[1] = APPCMD; 
      ABHACT[1] = CT60TRANS;
      SPMSG0[1] = 0;
  
  
  
      IF WCB$IAF[0] 
      THEN                   # COMMAND COMPLETE, INPUT ALLOWED         #
        BEGIN 
  
  
# 
*       IF THE HOP HAS A COMMAND IN PROGRESS, THE TEXT IS PROCESSED 
*       NORMALLY.  IF HE HAD ENTERED A BREAK, THE TEXT IS DISCARDED 
*       AND THE MESSAGE *OUTPUT DISCARDED* IS SENT.  THE STATE OF THE 
*       HOP PSEUDO ACN IS RESET TO ALLOW SUBSEQUENT COMMANDS. 
# 
        IF ACN$HOPST[HOPORD$] EQ S"COMMAND" 
          OR ACN$HOPST[HOPORD$] EQ S"BREAK" 
        THEN                           # COMMAND OR BREAK IN PROGRESS  #
          BEGIN 
          IF ACN$HOPST[HOPORD$] EQ S"BREAK" 
          THEN                         # BREAK IN PROGRESS             #
            BEGIN                      # SET TEXT = *OUTPUT DISCARDED* #
            SPMSG0[0] = D$WD0[0]; 
            SPMSG1[0] = D$WD1[0]; 
            WCB$WC[0] = ODWC$;
            END 
          ACN$HOPST[HOPORD$] = S"ACTIVE"; 
  
  
# 
*         WE NOW DO THE ACTUAL PROCESSING OF THE TEXT.  THE I-LAYER 
*         NEVER GENERATES *READY..*.  THIS IS GENERATED BY THE C-LAYER
*         (HEREIN) AS A RESULT OF THE INPUT ALLOWED FLAG BEING SET. 
*         THE TEXT MUST BE OUTPUT FIRST WITH INPUT NOT ALLOWED FOLLOWED 
*         BY *READY..* WITH INPUT ALLOWED.  THE RESPONSE TO MANY
*         COMMANDS CONSISTS SOLELY OF *READY..* (NULL TEXT).
# 
          IF WCB$WC[0] GR 2 
          THEN                         # THERE IS TEXT                 #
            BEGIN 
            WCB$IAF[0] = FALSE; 
            SENDLINE;                  # SO SHIP IT                    #
            WCB$IAF[0] = TRUE;
            END 
          SPMSG0[0] = R$WD0[0];        # SET TEXT = *READY..*          #
          WCB$WC[0] = RWC$; 
          SENDLINE;                    # AND SHIP IT                   #
        WCB$SMID[1] = SMID"HOPDIS" ;     # SEND HOP/DIS FOR RIGHT K-DIS#
        WCB$WC[1] = RKPAGESZ + 1 ;
        ABHWORD[1] = 0 ;
        ABHABT[1] = 3 ; 
        ABHACT[1] = 1 ; 
        ABHTLC[1] = RKPAGESZ ;
  
        SSTAQE(P<OTQ>,WCBUF[1],ABH[1],RKPAGE[PAGE1]) ;
        OC$PAGEC[HOPORD$] = PAGE1;       # CURRENT PAGE IS 1           #
  
          END 
  
        ELSE                 # NEITHER BREAK NOR COMMAND IN PROGRESS   #
          BEGIN 
  
  
# 
*         FOR ALL OTHER STATES OF THE HOP PSUEDO ACN WE DISCARD THE 
*         TEXT AND SEND A CON/CB PROTOCOL EVENT TO THE INNER LAYER. 
# 
          WCB$WORD[1] = 2;             # MIN QUEUE ENTRY SIZE          #
          WCB$SMID[1] = SMID"CONCB";
          ABHADR[1] = HOPORD$;
          SSTAQE (P<PEQ>, WCBUF[1], ABH[1], APSM[1]); 
          END 
  
        END                  # INPUT ALLOWED = YES                     #
  
  
  
      ELSE                   # INPUT NOT ALLOWED AS RESULT THIS TEXT   #
        BEGIN 
  
  
# 
*       IF THE HOP IS IDLE OR HAS A COMMAND IN PROGRESS, PROCESS THE
*       TEXT NORMALLY (TEXT COULD BE THE RESULT OF AN UNSOLICITED EVENT 
*       REPORT OR A COMMAND).  IF THE K-DISPLAY IS NOT CURRENTLY
*       ASSIGNED TO CS, AND THE HOP HAS NOT ENTERED AN *IG=CS* COMMAND, 
*       AND THIS MESSAGE WARRANTS AN ALERT, SEND A HOP/ALT SM TO NAM. 
*       FOR ALL OTHER CONDITIONS, SIMPLY DISCARD THE TEXT.
# 
        IF ACN$HOPST[HOPORD$] EQ S"ACTIVE"
          OR ACN$HOPST[HOPORD$] EQ S"COMMAND" 
        THEN                           # ALL IS WELL, FORWARD THE TEXT #
          SENDLINE; 
  
        ELSE IF ACN$HOPST[HOPORD$] EQ S"INACT"
          OR ACN$HOPST[HOPORD$] EQ S"ENDED" 
          OR ACN$HOPST[HOPORD$] EQ S"STARTEND"
        THEN                           # K-DIS NOT NOW ASSIGNED TO CS  #
          IF WCB$HAF[0] 
            AND NOT ACN$IGNOR[HOPORD$]
          THEN                         # MUST SEND HOP/ALT SM TO NIP   #
            BEGIN 
            WCB$WORD[1] = 3;
            ABHTLC[1] = LHOPALT;
            PFCSFC[1] = HOPALT; 
            SSTAQE (P<OTQ>, WCBUF[1], ABH[1],APSM[1]);
            END 
  
        END                  # INPUT ALLOWED = NO                      #
  
      END  # CSCPHT # 
  
      TERM
