*DECK NS$NSS
USETEXT NAT$NS
USETEXT ERR$NS
  
PROC NS$NSS((STATE),(STIMULUS),ERRCODE); # NPU STATE TABLE PROCESSOR   #
  
# TITLE NS$NSS - NPU STATE TABLE PROCESSOR.                            #
  
      BEGIN    # NS$NSS # 
# 
**    NS$NSS - NPU STATE TABLE PROCESSOR. 
* 
*     J.C. LEE    1981
* 
*     THIS ROUTINE IS THE NPU STATE TABLE PROCESSOR.
* 
*     PROC NS$NSS((STATE),(STIMULUS),ERRCODE) 
* 
*     ENTRY:  
*       STATE-ORDINAL.
*       STIMULUS-CODE.
*       NPU-TABLE-ORDINAL.
* 
*     EXIT: 
*       ERRCODE.
* 
*     METHOD: 
*       USE STATUS SWITCHES TO ROUTINE CONTROL TO APPROPRIATE 
*       ROUTINE FOR THE SPECIFIED STATE-ORDINAL/STIMULUS-CODE 
*       COMBINATION.
* 
# 
  
      ITEM STATE      S:NPUSTATE;      # NPU CURRENT STATE             #
      ITEM STIMULUS   S:NWSTIM;        # STATE TABLE STIMULUS          #
      ITEM ERRCODE    U;               # ERROR CODE                    #
  
      $BEGIN
      XREF
        BEGIN 
        PROC NS$DBG;         # TRACE PROCEDURE CALL                    #
        END 
      $END
  
      XREF
        BEGIN 
        PROC NDLOVLD;        # OVERLAY LOADER                          #
        FUNC NS$FEC U;       # FORMAT ERROR CODE                       #
        PROC NS$N05;
        PROC NS$N06;
        PROC NS$N08;
        PROC NS$N09;
        PROC NS$N13;
        END 
  
      ARRAY DAR$OVLY [0:0] S(1);
        BEGIN                # NPU/DT ABNORMAL RESPONSE PROCESSOR      #
        ITEM DAR$NAM    C(00,00,07) = ["DAROVLY"];
        ITEM DAR$LV1    U(00,42,09) = [4];
        ITEM DAR$LV2    U(00,51,09) = [0];
        END 
  
      ARRAY N00$OVLY [0:0] S(1);
        BEGIN                # LOAD REQUEST PROCESSOR                  #
        ITEM N00$NAM    C(00,00,07) = ["N00OVLY"];
        ITEM N00$LV1    U(00,42,09) = [6];
        ITEM N00$LV2    U(00,51,09) = [0];
        END 
  
      ARRAY N04$OVLY [0:0] S(1);
        BEGIN                # NDCB RESPONSE PROCESSOR                 #
        ITEM N04$NAM    C(00,00,07) = ["N04OVLY"];
        ITEM N04$LV1    U(00,42,09) = [7];
        ITEM N04$LV2    U(00,51,09) = [0];
        END 
  
      SWITCH STIMCASE:NWSTIM           # CASES FOR STATE TABLE STIMULI #
        STIM0:RQ$SAMLOAD, 
        STIM1:RQ$NPULOAD, 
        STIM5:NR$NPUDTD,
        STIM6:AR$NPUDTD,
        STIM7:NR$NPUDTL,
        STIM8:AR$NPUDTL,
        STIM9:NR$NPUDTS,
        STIM10:AR$NPUDTS; 
  
      SWITCH STIM0CASE:NPUSTATE        # NPU/IN/C (SAM) CASES          #
        NSS00:IDLE, 
        NSS15:DUMPNDCB, 
        NSS15:LOADSUD,
        NSS15:STARTSUD, 
        NSS15:DUMPSUD,
        NSS15:LOADNPU,
        NSS15:STARTNPU, 
        NSS15:LOADNDCB, 
        NSS15:DUMPNPU,
        NSS15:LOADDBS,
        NSS15:STARTDBS, 
        NSS15:LOADSAM,
        NSS15:STARTSAM; 
  
      SWITCH STIM1CASE:NPUSTATE        # NPU/IN/R (NPU) CASES          #
        NSS00:IDLE, 
        NSS15:DUMPNDCB, 
        NSS15:LOADSUD,
        NSS15:STARTSUD, 
        NSS15:DUMPSUD,
        NSS15:LOADNPU,
        NSS15:STARTNPU, 
        NSS15:LOADNDCB, 
        NSS15:DUMPNPU,
        NSS15:LOADDBS,
        NSS15:STARTDBS, 
        NSS16:LOADSAM,
        NSS16:STARTSAM; 
  
      SWITCH STIM5CASE:NPUSTATE        # NPU/DT/N (DUMP) CASES         #
        NSS16:IDLE, 
        NSS04:DUMPNDCB, 
        NSS16:LOADSUD,
        NSS16:STARTSUD, 
        NSS05:DUMPSUD,
        NSS16:LOADNPU,
        NSS16:STARTNPU, 
        NSS16:LOADNDCB, 
        NSS06:DUMPNPU,
        NSS16:LOADDBS,
        NSS16:STARTDBS, 
        NSS16:LOADSAM,
        NSS16:STARTSAM; 
  
      SWITCH STIM6CASE:NPUSTATE        # NPU/DT/A (DUMP) CASES         #
        NSS16:IDLE, 
        NSS07:DUMPNDCB, 
        NSS16:LOADSUD,
        NSS16:STARTSUD, 
        NSS07:DUMPSUD,
        NSS16:LOADNPU,
        NSS16:STARTNPU, 
        NSS16:LOADNDCB, 
        NSS07:DUMPNPU,
        NSS16:LOADDBS,
        NSS16:STARTDBS, 
        NSS16:LOADSAM,
        NSS16:STARTSAM; 
  
      SWITCH STIM7CASE:NPUSTATE        # NPU/DT/N (LOAD) CASES         #
        NSS16:IDLE, 
        NSS16:DUMPNDCB, 
        NSS08:LOADSUD,
        NSS16:STARTSUD, 
        NSS16:DUMPSUD,
        NSS08:LOADNPU,
        NSS16:STARTNPU, 
        NSS09:LOADNDCB, 
        NSS16:DUMPNPU,
        NSS08:LOADDBS,
        NSS16:STARTDBS, 
        NSS08:LOADSAM,
        NSS16:STARTSAM; 
  
      SWITCH STIM8CASE:NPUSTATE        # NPU/DT/A (LOAD) CASES         #
        NSS16:IDLE, 
        NSS16:DUMPNDCB, 
        NSS10:LOADSUD,
        NSS16:STARTSUD, 
        NSS16:DUMPSUD,
        NSS11:LOADNPU,
        NSS16:STARTNPU, 
        NSS12:LOADNDCB, 
        NSS16:DUMPNPU,
        NSS11:LOADDBS,
        NSS16:STARTDBS, 
        NSS11:LOADSAM,
        NSS16:STARTSAM; 
  
      SWITCH STIM9CASE:NPUSTATE        # NPU/DT/N (START) CASES        #
        NSS16:IDLE, 
        NSS16:DUMPNDCB, 
        NSS16:LOADSUD,
        NSS13:STARTSUD, 
        NSS16:DUMPSUD,
        NSS16:LOADNPU,
        NSS13:STARTNPU, 
        NSS16:LOADNDCB, 
        NSS16:DUMPNPU,
        NSS16:LOADDBS,
        NSS13:STARTDBS, 
        NSS16:LOADSAM,
        NSS13:STARTSAM; 
  
      SWITCH STIM10CASE:NPUSTATE       # NPU/DT/A (START) CASES        #
        NSS16:IDLE, 
        NSS16:DUMPNDCB, 
        NSS16:LOADSUD,
        NSS10:STARTSUD, 
        NSS16:DUMPSUD,
        NSS16:LOADNPU,
        NSS14:STARTNPU, 
        NSS16:LOADNDCB, 
        NSS16:DUMPNPU,
        NSS16:LOADDBS,
        NSS14:STARTDBS, 
        NSS16:LOADSAM,
        NSS14:STARTSAM; 
CONTROL EJECT;
  
      $BEGIN
      NS$DBG("NSS");         # TRACE CALL                              #
      $END
  
  
      ERRCODE = 0;
      GOTO STIMCASE[STIMULUS];         # CASE ON STATE TABLE STIMULUS  #
  
STIM0:                                 # NPU/IN/C (SAM)                #
      GOTO STIM0CASE[STATE];           # CASE ON NPU STATE             #
  
STIM1:                                 # NPU/IN/R (NPU)                #
      GOTO STIM1CASE[STATE];           # CASE ON NPU STATE             #
  
STIM5:                                 # NPU/DT/N (DUMP)               #
      GOTO STIM5CASE[STATE];           # CASE ON NPU STATE             #
  
STIM6:                                 # NPU/DT/A (DUMP)               #
      GOTO STIM6CASE[STATE];           # CASE ON NPU STATE             #
  
STIM7:                                 # NPU/DT/N (LOAD)               #
      GOTO STIM7CASE[STATE];           # CASE ON NPU STATE             #
  
STIM8:                                 # NPU/DT/A (LOAD)               #
      GOTO STIM8CASE[STATE];           # CASE ON NPU STATE             #
  
STIM9:                                 # NPU/DT/N (START)              #
      GOTO STIM9CASE[STATE];           # CASE ON NPU STATE             #
  
STIM10:                                # NPU/DT/A (START)              #
      GOTO STIM10CASE[STATE];          # CASE ON NPU STATE             #
CONTROL EJECT;
  
NSS00:                       # PROCESS LOAD REQUEST                    #
      NDLOVLD(N00$OVLY,ERRCODE);
      GOTO NSSEXIT; 
  
NSS04:                       # PROCESS NPU/DT/N (DUMP NDCB)            #
      NDLOVLD(N04$OVLY,ERRCODE);
      GOTO NSSEXIT; 
  
NSS05:                       # PROCESS NPU/DT/N (DUMP SUD)             #
      NS$N05(ERRCODE);
      GOTO NSSEXIT; 
  
NSS06:                       # PROCESS NPU/DT/N (DUMP)                 #
      NS$N06(ERRCODE);
      GOTO NSSEXIT; 
  
NSS08:                       # PROCESS NPU/DT/N (LOAD)                 #
      NS$N08(ERRCODE);
      GOTO NSSEXIT; 
  
NSS09:                       # PROCESS NPU/DT/N (LOAD NDCB)            #
      NS$N09(ERRCODE);
      GOTO NSSEXIT; 
  
NSS13:                       # PROCESS NPU/DT/N (START)                #
      NS$N13(ERRCODE);
      GOTO NSSEXIT; 
  
NSS07:                       # PROCESS NPU/DT/A(DUMP)                  #
NSS10:                       # PROCESS NPU/DT/A(LOAD SUD)              #
NSS11:                       # PROCESS NPU/DT/A(LOAD)                  #
NSS12:                       # PROCESS NPU/DT/A(LOAD NDCB)             #
NSS14:                       # PROCESS NPU/DT/A(START)                 #
      NDLOVLD(DAR$OVLY,ERRCODE); # CALL ABNORMAL RESPONSE PROCESSOR    #
      GOTO NSSEXIT; 
  
NSS15:                       # PREEMPT CURRENT ACTIVITY                #
      ERRCODE = NS$FEC(EC"ERR$PREEM",0);
      GOTO NSSEXIT; 
  
NSS16:                       # SM PROTOCAL ERROR, DISCARD SM           #
      ERRCODE = NS$FEC(EC"ERR$NP",0); 
      GOTO NSSEXIT; 
  
NSSEXIT:  
      RETURN; 
      END   # NS$NSS #
      TERM
