*DECK GETSUPM 
USETEXT COMCBEG 
USETEXT COMMCOM 
USETEXT COMMGET 
USETEXT COMRNAM 
USETEXT COMRNET 
USETEXT COMRRTN 
    PROC GETSUPM; 
# TITLE GETSUPM - GET SUPERVISORY MESSAGE FROM RHF #
  
      BEGIN  # GETSUPM #
  
# 
**    GETSUPM - GET SUPERVISORY MESSAGE FROM RHF. 
* 
*     GETSUPM RECEIVES AND PROCESSES SUPERVISORY MESSAGES SENT
*     BY RHF TO MHF.
* 
*     PROC GETSUPM. 
* 
*     ENTRY      NSUP$SBIT = TRUE (SUPERVISORY MESSAGE AVAILABLE).
*                STAT      = 0 (MHF NETTED ON). 
*                ERROR     = FALSE. 
* 
*     EXIT       NSUP$SBIT = FALSE. 
*                STAT      = 0 (MHF NETTED ON). 
*                DLCHKNDT  = TRUE, IF NDT ENTRY UPDATED.
* 
*                IF SHUT/INS MESSAGE RECEIVED,
*                STAT      = 1 (NETOFF COMPLETED).
* 
*                IF MESSAGE TEXT LENGTH ERROR,
*                ERROR     = TRUE.
* 
*     PROCESS    WHILE SUPERVISORY MESSAGE AVAILABLE
*                    AND NO ERROR AND MHF NETTED ON:  
*                  CALL RHFGET TO GET MESSAGE FROM RHF
*                  IF MESSAGE TOO LONG: 
*                    SET ERROR = TRUE.
*                  ELSE 
*                    IF SHUT-DOWN MESSAGE (RHF TERMINATING):  
*                      CALL RHFOFF (NETOFF).
*                      SET STAT = 1.
*                    ELSE 
*                      IF NAD-STATE-CHANGE MESSAGE: 
*                        IF NOT NAD-STATE-CHANGE: 
*                          UPDATE NDT WORD
*                        ELSE:  
*                          CALL SETNDT TO UPDATE NDT ENTRY. 
*                        IF NAD-STATE-CHANGE REQUEST: 
*                          CALL RHFPUT TO SEND RESPONSE.
# 
# 
****  PROC GETSUPM - XREF LIST BEGIN
# 
      XREF
        BEGIN 
        PROC CALLSYS;              # CALL SYSTEM VIA RA+1 # 
        PROC DBGNAME;              # DEBUG CODE # 
        PROC RHFGET;               # GET MESSAGE FROM RHF # 
        PROC RHFOFF;               # END CONNECTION WITH RHF #
        PROC RHFPUT;               # SEND MESSAGE TO RHF #
        PROC SETNDT;               # UPDATE NDT # 
        END 
# 
****  PROC GETSUPM - XREF LIST ENDS 
# 
  
*CALL HDRAREA 
  
      ARRAY SUPNDT [0:0] S(SUPTXTLGTH); 
        BEGIN 
        ITEM SUPNDT$TY  U(00,00,16);  # MESSAGE TYPE #
        ITEM SUPNDT$EB  B(00,08,01);  # ERROR FLAG #
        ITEM SUPNDT$RB  B(00,09,01);  # RESPONSE FLAG # 
        ITEM SUPNDT$OFF I(00,24,18);  # OFFSET WITHIN ENTRY # 
        ITEM SUPNDT$ORD I(00,42,18);  # ENTRY ORDINAL # 
        ITEM SUPNDT$WD  U(01,00,60);  # NEW NDT WORD #
        END 
  
      ITEM REJ       B;            # FLAG # 
  
CONTROL EJECT;
  
      $BEGIN
      DBGNAME ("GETSUPM");         # DEBUG CODE # 
      $END
  
  
      ASLONGAS NSUP$SBIT           # WHILE SUP MESSAGE AVAIL #
        AND STAT EQ 0              # AND CONNECTED #
        AND NOT ERROR              # AND NO ERROR # 
      DO
        BEGIN 
        RHFGET (SUPCONNUMB,HDRAREA,SUPNDT,SUPTXTLGTH);
  
        IF HDR$IBUBIT              # IF MESSAGE TOO LONG #
        THEN
          BEGIN 
          ERROR = TRUE;            # SET ERROR FLAG # 
          MSG$BUFADR = LOC(GETSUPMSG[0]); 
          MSG$STATUS = 0; 
          CALLSYS (MSGCALL);           # DAYFILE MESSAGE #
          END 
  
        ELSE
          BEGIN 
          IF SUPNDT$TY[0] EQ $SHUINS  # IF SHUT-DOWN #
          THEN
            BEGIN 
            RHFOFF;                # DROP RHF CONNECTION #
            STAT = 1; 
            END 
  
          ELSE
            BEGIN 
  
            IF  (SUPNDT$TY[0] EQ $STATNDTR  # IF NDT STATUS MESSAGE # 
              OR SUPNDT$TY[0] EQ $STATNDTN)   # (REQUEST OR RESPONSE)#
              AND HDR$TLCU GE 2         # AND TEXT PRESENT #
            THEN
              BEGIN 
              P<BUF1> = SUPNDT$ORD + NDTBUF + 1;  # ENTRY ADDR #
              IF SUPNDT$OFF[0] EQ 0 
              THEN
                BEGIN 
                IF P<BUF1> LT (NDTBUF + NDT$LENGTH) 
                THEN
                  BEGIN 
                  REJ = FALSE;
                  BUF1WORD[0] = SUPNDT$WD[0];  # RESET NDT WORD # 
                  END 
  
                ELSE
                  BEGIN 
                  REJ = TRUE; 
                  END 
                END 
  
              ELSE
                BEGIN 
                SETNDT (SUPNDT$WD[0],REJ);  # RESET NAD STATE # 
                END 
  
              IF SUPNDT$TY[0] EQ $STATNDTR  # IF NDT STATUS REQUEST # 
              THEN
                BEGIN 
                HDR$WORD  = 0;
                HDR$ABT   = $SUPERABT;
                HDR$ACT   = SUPCHRTYPE; 
                HDR$TLCU  = SUPTXTLGTH; 
  
                IF REJ
                THEN
                  BEGIN 
                  SUPNDT$TY[0] = $STATNDTA;  # REJECT # 
                  END 
  
                ELSE
                  BEGIN 
                  SUPNDT$TY[0] = $STATNDTN;  # RESPONSE # 
                  END 
  
                RHFPUT (HDRAREA,SUPNDT);    # SEND RESPONSE # 
                END 
              END 
            END 
          END 
        END 
  
      END  # GETSUPM #
    TERM
