*DECK NS$PAG
USETEXT COM$NS
USETEXT ERR$NS
USETEXT KDS$NS
USETEXT SMB$NS
      PROC NS$PAG(ERRCODE);  # PROCESS HOP/PAGE                        #
# TITLE NS$PAG - PROCESS HOP/PAGE COMMAND.                             #
  
      BEGIN    # NS$PAG # 
# 
**    NS$PAG - PROCESS HOP/PAGE COMMAND.
* 
*     J.C. LEE    1981
* 
*     THIS ROUTINE PROCESS HOP/PAGE COMMAND.
* 
*     PROC NS$PAG(ERRCODE)
* 
*     ENTRY:  
*       NONE. 
* 
*     EXIT: 
*       ERRCODE.
* 
*     METHOD: 
*       IF K-DISPLAY ASSIGNED:  
*         IF HOP CHARACTER = "-": 
*           SET PAGE-WAIT TO FALSE. 
*         IF HOP CHARACTER = "+": 
*           SET PAGE-WAIT TO TRUE.
*         ELSE, FLAG ERROR. 
*         IF ERRCODE = 0: 
*           ACCESS PAGE-WAIT BUFFER.
*           IF PAGE-WAIT BUFFER LINE COUNT NQ 0:  
*             SEND LINES TO K-DISPLAY BUFFER. 
*             UPDATE PAGE-WAIT BUFFER WORD-COUNT. 
*             CALL TSB MANAGER TO REDUCE PAGE-WAIT BUFFER 
*             SIZE BY NUMBER OF WORDS SENT TO K-DISPLAY.
*       ELSE, FLAG ERROR. 
* 
# 
  
      ITEM ERRCODE    U;     # ERROR CODE        #
  
      $BEGIN
      XREF
        BEGIN 
        PROC NS$DBG;         # TRACE PROC CALL                         #
        END 
      $END
  
      XREF
        BEGIN 
        PROC EXREDUC;        # REDUCE TSB SIZE                         #
        PROC MOVEOK;         # ALLOW MOVE        #
        FUNC NS$FEC U;       # FORMAT ERROR CODE #
        PROC NS$TKD;         # MANAGE K-DISPLAY  #
        PROC TSBINFO;        # TSB INFORMATION   #
        END 
  
      DEF CHAR$MINUS # "-" #;# MINUS IN DISPLAY CODE                   #
      DEF CHAR$PLUS  # "+" #;# PLUS IN DISPLAY CODE                    #
  
      ITEM PWBLC      U;     # PAGE WAIT BUFFER LINE COUNT             #
      ITEM PWBTSBN    U;     # PAGE WAIT BUFFER TSB NUMBER             #
      ITEM PWBWC      U;     # PAGE WAIT BUFFER WORD COUNT             #
      ITEM TSBFWA     U;     # TSB FWA                                 #
      ITEM TSBSIZE    U;     # TSB SIZE                                #
  
      BASED ARRAY PWB[0:0]P(1); 
        BEGIN                # PAGE WAIT BUFFER                        #
        ITEM PWBLINES   U(00,00,60);
        END 
  
      CONTROL EJECT;
  
      $BEGIN
      NS$DBG("PAG");         # TRACE CALL                              #
      $END
  
      IF DCW$F$ASS[0] 
      THEN                   # K-DISPLAY IS ASSIGNED                   #
        BEGIN 
        IF HOPPC[0] EQ CHAR$MINUS 
        THEN                 # HOP PAGE CHARACTER IS "-"               #
          DCW$F$PWM[0] = FALSE; # TURN PAGE WAIT TO OFF                #
  
        ELSE
          BEGIN 
          IF HOPPC[0] EQ CHAR$PLUS
          THEN               # HOP PAGE CHARACTER IS "+"               #
            DCW$F$PWM[0] = TRUE; # TURN PAGE WAIT TO ON                #
  
          ELSE               # NAM ERROR, ILLEGAL PAGE CHARACTER       #
            ERRCODE = NS$FEC(EC"ERR$SM", SMEC"HSM$HOPSM");
          END 
  
        IF ERRCODE EQ 0 
        THEN
          BEGIN # TURN PAGE VIA PAGE WAIT BUFFER                       #
          DCW$F$PAGE[0] = FALSE; # CLEAR PAGE FULL FLAG                #
          DCW$LC[0] = 0; # SET NAM K DISPLAY LINE COUNT TO ZERO        #
          PWBTSBN = DCW$PWBTSB[0]; # PAGE WAIT BUFFER TSB NUMBER       #
          TSBINFO(TSBSIZE,TSBFWA,PWBTSBN); # LOACATE PAGE WAIT BUFFER  #
          P<PWB$BUFFER> = 0;
          PWBLC = PWB$LC[TSBFWA]; # PAGE WAIT BUFFER LINE COUNT        #
          PWBWC = PWB$WC[TSBFWA] - PWB$HDRL; # PWB WORD COUNT          #
  
          IF PWBLC NQ 0 
          THEN # LINES EXIST IN PAGE WAIT BUFFER                       #
            BEGIN # MOVE LINES TO K DISPLAY BUFFER KDB                 #
            P<PWB> = TSBFWA + PWB$HDRL; # FWA OF FIRST LINE IN PWB     #
            NS$TKD(PWB,PWBWC,PWBLC);
            EXREDUC(PWBWC,PWBTSBN,FALSE,TSBFWA);
            PWB$LC[TSBFWA] = 0; # PWB NOW HAS A HEADER ONLY            #
            PWB$WC[TSBFWA] = PWB$HDRL;
            END 
  
          MOVEOK(PWBTSBN); # ALLOW PAGE WAIT BUFFER TO MOVE            #
          END 
  
        END 
  
      ELSE
        BEGIN                # K-DISPLAY NOT ASSIGNED - SET ERROR CODE #
        ERRCODE = NS$FEC(EC"ERR$SM", SMEC"HSM$HOPSM");
        END 
  
      RETURN; 
      END   # HS$PAG PROC # 
  
      TERM
