*DECK NBSTTP
USETEXT NIPDEF
USETEXT ACNB
USETEXT DRHDR 
USETEXT DUMPFLG 
USETEXT LLCB
USETEXT MSGIDX
USETEXT KDIS
USETEXT NHEADER 
USETEXT NCNT
USETEXT NCNB
USETEXT PARAMP
USETEXT PARAMS
USETEXT PCNB
USETEXT PT
USETEXT OVERLAY 
USETEXT STPRESP 
USETEXT SUPMSG
PROC NBSTTP((NCNBAD),(TRIGGER),(BLKPTR)); 
STARTIMS; 
 #
*1DC  NBSTTP
* 
*     1. PROC NAME           AUTHOR              DATE 
*        NBSTTP              C. BITTNER          81/05/15 
* 
*     2. FUNCTIONAL DESCRIPTION 
*        NETWORK BLOCK PROTOCOL (IVT) STATE TABLE PROCESSOR 
* 
*     3. METHOD USED
*        VALIDATE TRIGGER. SET CURRENT STATE (IF THERE IS NO NCNB 
*        THEN SET THE CURRENT STATE TO STATX). CALL XSTTP (STATE
*        TABLE PROCESSOR) PASSING THE STATE TABLE ORDINAL,
*        CURRENT IVT STATE AND TRIGGER.  IF A LEGAL TRIGGER 
*        IS RETURNED, THEN DO THE FOLLOWING (IF VALUE NOT 
*        SET TO NOCHG): 
*        A) ACTION - EXECUTE NETWORK BLOCK PROTOCOL (IVT) STATE 
*           TABLE ACTION (ISSUE SM, ETC)
*        B) NEWSTATE - UPDATE NEW IVT STATE 
*        C) TRIGC - TRIGGER NETWORK CONNECTION STATE TABLE
*        D) TRIGB - TRIGGER HOST BLOCK PROTOCOL (IVT) STATE TABLE 
* 
*        IF AN ILLEGAL TRIGGER IS RETURNED THEN DO THE FOLLOWING: 
*        IF THE TRIGGER IS INTERNAL TO NIP THEN ABORT NIP.
*        IF ILLEGAL EXTERNAL TRIGGER AND IN DEBUG MODE, ABORT 
*        CCP (SEND NPI/IN TO CCP).
*        IF ILLEGAL EXTERNAL TRIGGER AND NOT IN DEBUG MODE, 
*        THEN IGNORE TRIGGER (NO-OP). 
* 
* 
* 
*     4. ENTRY PARAMETERS 
*        NCNBAD - NCNB ADDRESS
*        TRIGGER - NETWORK IVT STATE TABLE TRIGGER
*        BLKPTR - ADDRESS OF INPUT BUFFER 
*                 WORD 0 = PIP BLOCK HEADER OR DATA RING HEADER 
* 
*     5. EXIT PARAMETERS
*        NONE 
* 
*     6. SYMPL TEXTS USED 
*        NIPDEF              DUMPFLG
*        NCNB 
*        STPRESP
*        MSGIDX     PARAMP     PARAMS 
*        OVERLAY     SUPMSG     LLCB
* 
*     7. ROUTINES AND OVERLAYS CALLED 
*        HBSTTP - HOST BLOCK PROTOCOL STATE TABLE PROCESSOR 
*        NCSTTP - NETWORK CONNECTION STATE TABLE PROCESSOR
*        LOCLLCB - LOCATE LLCB
*        ABORT - ABORT NIP
*        NFOB - LINK MESSAGE ON PIP OUTBOUND CHAIN
*        NXBLOCK - SEND SPECIAL NETWORK BLOCK TO CCP
*        OVLCALL - LOAD AND EXECUTE OVERLAY 
*        NPBACK - PROCESS BACK FROM CCP 
*        RELNCNB         OVL RELEASE NCNB 
*        COMPCON         OVL SWITCH TO PROPER OVERLAY 
*        NPBRK           OVL DISCARD ALL MESSAGES ON NCNB 
*        HPRUON          OVL PROCESS PRU/ON 
*        STPNERR         OVL OUTPUT STATE TABLE ERROR MESSAGE 
*        NGIGO           OVL DISCARD MESSAGE
*        NNPIIN          OVL SEND NPI/IN TO CCP 
*        XERRMSG         OVL OUTPUT ERROR MESSAGE 
*        XSTTP - STATE TABLE PROCESSOR
*        XTRACE - RECORD PROCEDURE CALL 
* 
*     8. DAYFILE MESSAGES AND OTHER IMPORTANT INFORMATION 
*        "INVALID TRIGGER NUMBER - NBSTTP"
* 
 #
STOPIMS;
# 
 INPUT PARAMETERS 
# 
  
      ITEM NCNBAD;           # NCNB ADDRESS                            #
      ITEM TRIGGER;          # NETWORK IVT STATE TABLE TRIGGER         #
      ITEM BLKPTR;           # ADDRESS OF INPUT BUFFER                 #
  
# 
 EXTERNAL VARIABLES 
# 
  
 XREF 
   BEGIN
   PROC ABORT;               # ABORT NIP                               #
   PROC HBSTTP;              # HOST BLOCK PROTOCOL STATE TABLE PROC    #
   PROC LOCLLCB;             # LOCATE LLCB                             #
   PROC NFOB ;
   PROC NCSTTP;              # HOST CONNECTION STATE TABLE PROC        #
   PROC NXBLOCK;             # SEND NETWORK BLOCK TO NPU               #
   PROC OMSG;                # ISSUE DAYFILE MESSAGE                   #
   PROC OVLCALL;             # LOAD AND EXECUTE OVERLAY                #
   PROC XSTTP;               # STATE TABLE PROCESSOR                   #
   PROC XTRACE;              # RECORD PROCEDURE CALL                   #
   PROC MGETS ; 
   PROC NPBACK ;
   END
  
# 
 INTERNAL VARIABLES 
# 
  
      SWITCH NBACTION NB0,NB1,NB2,NB3,NB4,NB5,NB6,NB7,NB8,NB9,NB10, 
              NB11,NB12,NB13,NB14,NB15,NB16,NB17,NB18 ; 
  
  
  
  
      ITEM ACNBAD;           # ACNB ADDRESS                            #
      ITEM BTYPE;            # NETWORK BLOCK TYPE                      #
      ITEM CNN ;             # NETWORK CONNECTION NUMBER               #
      ITEM CURST;            # CURRENT STATE                           #
      ITEM HN;               # HOST NODE                               #
      ITEM LLCBAD;           # LLCB ADDRESS                            #
      ITEM NCNTEAD;          # NCNT ENTRY ADDRESS                      #
      ITEM RESP;             # RESPONSE WORD                           #
      ITEM TN;               # TERMINAL NODE                           #
      ITEM BLKADDR ;         # ADDRESS OF NWL                          #
      ITEM TEMPPTR U ;
      ITEM DATABLK U ;
      ITEM PRUMOD  B=FALSE ;
      ITEM TEMP U ; 
  
#**********************************************************************#
  
      BEGIN 
  
      CONTROL IFEQ DEBUG,1; 
        XTRACE("NBSTT") ; 
      CONTROL FI; 
  
# VALIDATE TRIGGER NUMBER    #
      BLKADDR = BLKPTR ;     # ADDRESS OF NWL                          #
      IF TRIGGER LQ NBMTR AND TRIGGER GQ 0
      THEN
        BEGIN                # VALID TRIGGER  NUMBER                   #
        P<NCNB> = NCNBAD; 
        IF P<NCNB> EQ 0 
        THEN                 # NO NCNT ENTRY/NCNB                      #
          BEGIN              # ERROR - NO NCNB                         #
          D27M2[0] = "NBSTTP1"; 
          ABORT(DFMSG27,0);  # NIP INTERNAL ERROR                      #
          END 
        ELSE
          BEGIN 
          HN = NCNBHN[0] ;
          TN = NCNBTN[0] ;
          CNN = NCNBCN[0] ; 
          ACNBAD = NCNBACNB[0] ;
          CURST = NCNBBST[0] ;
          END 
        XSTTP(NBORD,CURST,TRIGGER,RESP);
        P<STRESP> = LOC(RESP);
        IF LEGTRIG[0] 
        THEN                 # LEGAL TRIGGER                           #
          BEGIN 
          IF ACTION[0] NQ NOCHG 
          THEN
            GOTO NBACTION[ACTION[0]];  # EXECUTE PROPER ACTION         #
          ELSE
            GOTO NBA; 
  
NB0:  
# 
      DLNCNB  (ACTION NO. 0)
      DELETE NCNB 
# 
      PARAMS1 = P<NCNB>;     # NCNB ADDRESS                            #
      OVLNAME = RELNCNBP;    # OVERLAY NAME                            #
      OVLCALL;               # LOAD AND EXECUTE OVERLAY                #
      GOTO NBA; 
  
NB1:  
# 
      NBSINTR  (ACTION NO. 1) 
      SEND INITR TO CCP 
# 
      PARAMS1 = P<NCNB>;
         PARAMS9 = COMPCX"RELBLK$" ;
      OVLNAME = COMPCONP;  # OVERLAY NAME                              #
      OVLCALL;               # LOAD AND EXECUTE OVERLAY                #
      BTYPE = NETINITR; 
      GOTO NXB; 
NB2:  
# 
      NBSTERM  (ACTION NO. 2) 
      SEND TERM TO CCP
# 
  
      BTYPE = NETTERM;
      GOTO NXB; 
NB3:  
# 
      SINITN  (ACTION NO. 3)
      SEND INITN TO CCP 
# 
  
      BTYPE = NETINITN; 
      GOTO NXB; 
NB4:  
# 
      NBSRST ( ACTION NO. 4 ) 
      SEND RST TO CCP 
# 
  
      BTYPE = NETRST; 
      GOTO NXB; 
NB5:  
# 
      NBICMDR  (ACTION NO. 5) 
      SEND ICMDR TO CCP 
# 
  
      BTYPE = NETICMDR; 
      GOTO NXB; 
NB6:  
# 
      NSBACK ( ACTION NO. 6 ) 
      SEND BACK TO CCP
# 
      BTYPE = NETBACK;
      GOTO NXB; 
NB7:  
# 
      NBSMSG  ( ACTION NO. 7 )
      SEND BLOCK MSG TO CCP 
# 
  
  
      NFOB(BLKADDR,P<NCNB>) ; 
  
      GOTO NBA ;
  
NB8:  
# 
      NBBACK  (ACTION NO. 8)
      FORM PSUEDO NETWORK FOR FC/ACK AND/OR FC/NAK FOR THE HOST SIDE, 
      AND SEND QUEUED MESSAGE TO CCP IF PERMITTED.
# 
      NPBACK(BLKADDR,P<NCNB>);         # PROCESS BACK FROM CCP         #
  
      # BLKADD IS THE ADDRESS OF PSUEDO FCACK OR FCNAK                 #
      # THIS WILL BE PASSED TO THE HOSTSIDE, AND PROPER                #
      # SM MESSAGE WILL BE SENT                                        #
      # IF BLKPTR IS ZERO THEN THIS BACK WAS IGNORED                   #
      IF BLKADDR EQ 0 
      THEN
        BEGIN                # IGNORE THIS BACK                        #
        TRIGB[0] = NOCHG ;
        END                  # INGORE THIS BACK                        #
      GOTO NBA ;
  
NB9:  
# 
      RELDR (ACTION NO. 9)
      RELEASE MSG AND BLK BLOCK TYPE IN NCNB
# 
  
        BEGIN 
        PARAMS1 = P<NCNB> ; 
        OVLNAME = NPBRKP ;
        OVLCALL ; 
        GOTO NBA ;
        END 
  
  
NB11: 
  
# 
      STERMRD  (ACTION NO.11) 
      SEND TERM TO CCP AND RELEASE DATA RING
# 
  
      P<SMNIP>  = BLKPTR + BLKHSIZE + ABHSIZE;
      RCBRK = TCNRC[0];      # REASON CODE FOR BRK                     #
      PARAMS1 = P<NCNB>;
      PARAMS9 = COMPCX"RELBLK$" ; 
      OVLNAME = COMPCONP;    # OVERLAY NAME                            #
      OVLCALL;               # LOAD AND EXECUTE OVERLAY                #
      BTYPE = NETTERM;
      GOTO NXB; 
NB12: 
# 
      RELDR2  (ACTION NO. 12) 
      RELEASE DATA RING 
# 
  
      PARAMS1 = P<NCNB>;
      PARAMS9 = COMPCX"RELBLK$" ; 
      OVLNAME = COMPCONP;    # OVERLAY NAME                            #
      OVLCALL;               # LOAD AND EXECUTE OVERLAY                #
      GOTO NBA; 
  
NB10: 
# 
  CONVERT ( ACTION NUMBER 10 )
   CONVERT THE NCNB TO A PCNB AND START PRU MOD 
# 
      OVLNAME = HPRUONP ; 
      OVLCALL;
      IF PARAMP1 NQ 0  # MEANS WE DID NOT SUCCEED TO CONVERT           #
      THEN
        RETURN ;       # AND DO NOT GO TO PRU STATE                    #
      ELSE
        BEGIN 
        P<NCNB> = PARAMP2 ; 
        NCNBAD = PARAMP2  ; 
        GOTO NBA          ; 
        END 
#                                                                      #
NB13: 
# 
      NBICMD ( ACTION NUMBER 13 ) 
      SEND ICMD TO CCP
# 
      P<SUPMSG> = BLKPTR + BLKHSIZE + ABHSIZE ; 
      TEMPBSN = INTRCHR[0];  # INTERRUPT CHARACTER                     #
      BTYPE = NETICMD;
      GOTO NXB; 
NB14: 
# 
      SEND BREAK PROTOCOL ELEMENT TO CCP. 
      DISCARD ANY PREVIOUS DOWNLINE DATA IF POSSIBLE
# 
      PARAMS1 = P<NCNB> ; 
      OVLNAME = NPBRKP ;
      OVLCALL          ;
  
      P<SUPMSG> = BLKPTR + BLKHSIZE + ABHSIZE ; 
      TEMPBSN   = FCRBR  ;
      BTYPE = NETBRK ;
      GOTO NXB       ;
NB15: 
      GOTO NBA ;
NB16: 
# 
      DISCARD ( ACTION NUMBER 16 )
      SIGNAL NPPWL THAT THIS IS DISCARD MOD 
# 
      PARAMP2 = 1 ; 
      GOTO NBA ;
NB17: 
# 
      ALL DATA OF PRU ALLOWED 
# 
      PARAMP2 = 0 ; 
      GOTO NBA ;
NB18: 
# 
      SAVE THE BSN FOR THE NEXT BLOCK FROM CCP
# 
  
      P<NHEADER> = BLKPTR + BLKHSIZE ;
      P<NCNT> = NCNBCTAD[0] ;            # NCNT ADDRESS                #
      TEMPPTR = NCNTHSIZE + ( NCNBCN[0] LAN X"F" ) ; # INDEX INTO NCNT #
  
      IF KNAMDB[0]
      THEN
        BEGIN                # K-DEBUG IS ON                           #
        TEMP = NCNTNIB[TEMPPTR] ; 
        IF TEMP NQ 0
           AND TEMP NQ NHBSN[0] 
        THEN
          ABORT(0,0) ;             # BSN FROM CCP NOT IN SEQUENCE      #
        END                  # K-DEBUG IS ON                           #
      IF NHBSN[0] LS 7
      THEN
        NCNTNIB[TEMPPTR] = NHBSN[0] + 1 ; 
      ELSE
        NCNTNIB[TEMPPTR] = 1 ;                        # NEXT BSN       #
      GOTO NBA ;
NXB:                         # SEND BLOCK PROTOCOL ELEMENT TO NPU      #
      NXBLOCK(P<NCNB>,BTYPE); 
NBA:  
  
          IF NEWSTATE[0] NQ STATX 
          THEN
            BEGIN 
            NCNBLBS[0] = CURST ; # UPDATE LAST STATE (STATISTICS ) #
            NCNBLBT[0] = TRIGGER;# AND THE LAST TRIGGER            #
            END 
          IF NEWSTATE[0] NQ NOCHG 
          THEN
            NCNBBST[0] = NEWSTATE[0] ;
  
          IF TRIGC[0] NQ NOCHG
          THEN               # TRIGGER HOST CONNECTION TABLE           #
            BEGIN 
            NCSTTP(NCNBAD,CNN,TRIGC[0],0);
            END 
  
          IF TRIGB[0] NQ NOCHG
          THEN
            BEGIN 
  
            CONTROL IFEQ DEBUG,1; 
            IF ACNBAD EQ 0
            THEN
              BEGIN 
              D27M2[0] = "NBSTTP2"; 
              ABORT(DFMSG27,0);  # "NIP INTERNAL ERROR"                #
              END 
            CONTROL FI; 
            HBSTTP(ACNBAD,TRIGB[0],BLKADDR) ; 
            END 
  
  
ENDACTION:END 
  
        IF NOT LEGTRIG[0] 
        THEN
  
          BEGIN                # ILLEGAL TRIGGER                       #
          PARAMS1 = HN;      # HOST NODE                               #
          PARAMS2 = TN;      # TERMINAL NODE                           #
          PARAMS3 = CNN ;    # NETWORK CONNECTION NUMBER               #
          PARAMS4 = TRIGGER; # ILLEGAL TRIGGER                         #
          PARAMS6 = "NBSTTP";# NAME OF STATE TABLE PROCESSOR           #
          PARAMS7 = CURST;   # CURRENT BLOCK PROTOCOL STATE            #
          OVLNAME = STPNERRP; # STATE TABLE ERROR PROCESSOR            #
          OVLCALL;           # LOAD AND EXECUTE OVERLAY                #
          IF TRIGGER LS NBMINXT OR TRIGGER GR NBMAXXT 
          THEN
            BEGIN              # TRIGGER INTERNAL TO NIP               #
            ABORT(0,0);    # ABORT NIP                                 #
            END 
  
          ELSE
  
            BEGIN              # ILLEGAL EXTERNAL TRIGGER FROM CCP     #
            OVLNAME = NGIGOP;  # SEND GARBAGE MSG TO DAYFILE           #
            PARAMP1 = BLKPTR; 
            PARAMP4 = DMCBNBPSTT; # INDX FOR BAD NET BLK STATE TBLE MSG#
            OVLCALL;
            CONTROL IFEQ DEBUG,1; 
            LOCLLCB(HN,TN,P<LLCB>); 
            PARAMS1 = P<LLCB>;
            PARAMS2 = TRIGGER;         # BAD TRIGGER FROM NETWORK      #
            PARAMS3 = CURST;           # CURRENT STATE OF CONNECTION   #
            PARAMS4 = CNN;             # NETWORK CONNECTION NUMBER     #
            PARAMS7 = X"42";           # STATE TABLE PROCESSOR         #
            OVLNAME = NNPIINP;  # SEND NPI/IN TO CCP                   #
            OVLCALL;  # LOAD AND EXECUTE OVERLAY                       #
            CONTROL FI; 
            END 
  
          END 
  
        END 
  
      ELSE
  
        BEGIN                # TRIGGER NUMBER OUT OF RANGE             #
             PARAMS1 = DFMSG26; 
             PARAMS6 = "NB";
             OVLNAME = XERRMSGP;
             OVLCALL; 
        END 
  
      RETURN; 
  
      END 
TERM
