*DECK WRITNEL 
USETEXT COMCBEG 
USETEXT COMMCOM 
USETEXT COMRNET 
    PROC WRITNEL; 
# TITLE  WRITNEL - WRITE NAD ERROR LOG ENTRIES ON BML OR CERFILE #
  
      BEGIN  # WRITNEL #
  
# 
**    WRITNEL - WRITE NAD ERROR LOG ENTRIES ON BML OR CERFILE 
* 
*     WRITNEL SENDS NAD ERROR LOG ENTRIES TO EITHER THE NOS BML 
*     OR THE NOS/BE CERFILE.
* 
*     PROC WRITNEL. 
* 
*     ENTRY   - CURRTIM    = CURRENT TIME (HHMMSS). 
*              <ELB>       = FWA OF NLD BUFFER. 
*               ELRMTNAD   = TRUE/FALSE (REMOTE/LOCAL NAD). 
*              <NAD$ENTRY> = FWA LOCAL NAD ENTRY. 
*              <NST$ENTRY> = FWA LOCAL OR REMOTE NAD STATUS ENTRY.
*               PB$IN      = LWA+1 OF NLD BUFFER. 
*               PB$OUT     = FWA OF NLD BUFFER. 
*              <RMT$ENTRY> = FWA REMOTE NAD ENTRY.
* 
*     EXIT    - DETAILED STATUS TABLE AND NAD ERROR LOG ENTRIES (OR 
*                 SHORT MESSAGE) SENT TO NOS BML OR NOS/BE CERFILE. 
*               NST$TIMCHK = CURRTIM. 
*               NST$TIMBML = CURRTIM, IF BML/CERFILE WRITTEN. 
*               NST$TIMCHG = CURRTIM, IF NST$ELENT  CHANGED.
* 
*     PROCESS - SET CURRENT TIME IN NAD STATUS ENTRY. 
*               CALL EDITNEL TO EDIT NAD ERROR LOG ENTRIES. 
*               IF LESS THAN ELWRITEDLY SECS SINCE
*                   BML/CERFILE LAST WRITTEN
*                AND NO NEW ERROR LOG ENTRIES 
*                AND  IF DETAILED STATUS TABLE NOT AVAILABLE
*                       AND WAS PREVIOUSLY NOT AVAILABLE: 
*                  OR IF DETAILED STATUS TABLE AVAILABLE
*                       AND WAS PREVIOUSLY AVAILABLE
*                     RETURN (NO MESSAGE).
*               IF NLD ERROR: 
*                 CALL ERRNLD.
*               IF NOS/BE (CERFILE):  
*                 IF DETAILED STATUS TABLE NOT IN BUFFER: 
*                   SET UP HEADER (RT=35,EC=0,SC=0).
*                   SEND SHORT MESSAGE TO CERFILE.
*                 ELSE: 
*                   SET UP HEADER (RT=35,EC=0,SC=0).
*                   SEND DST TO CERFILE (1ST PART). 
*                   SET UP HEADER (RT=35,EC=0,SC=1).
*                   SEND DST TO CERFILE (2D PART).
*                   SET UP HEADER (RT=35,EC=0,SC=2).
*                   WHILE NAD ERROR LOG ENTRIES IN BUFFER:  
*                     SEND NEXT ENTRY TO CERFILE. 
*               ELSE (NOS BML): 
*                 SET UP HEADER (MSGID=300/301, SYMPTOM=100)
*                 IF DETAILED STATUS TABLE NOT IN BUFFER: 
*                   SEND SHORT MESSAGE TO BML.
*                 ELSE: 
*                   SEND MESSAGE TO BML (DST + ERROR LOG ENTRIES) 
# 
  
# 
****  PROC WRITNEL - XREF LIST BEGIN
# 
  
      XREF
        BEGIN 
        PROC CALLSYS;              # CALL SYSTEM VIA RA+1 # 
        PROC DBGNAME;              # DEBUG #
        PROC EDITNEL;              # EDIT NAD ERROR LOGS #
        PROC ERRNLD;               # PROCESS NLD ERROR #
        PROC GETNELE;              # GET NAD ERROR LOG ENTRY #
        FUNC TIMDIF     I;         # TIME DIFFERENCE #
        END 
  
# 
****  PROC WRITNEL - XREF LIST END
# 
  
  
      ITEM I          I;
      ITEM NADWC      I;           # NAD WORD COUNT # 
      ITEM SAVELENT   U;           # OLD NST$ELENT #
      ITEM WRITEBML   B;           # ISSUE BML/CERFILE MESSAGE #
CONTROL EJECT;
  
      $BEGIN
      DBGNAME ("WRITNEL");         # DEBUG MESSAGE #
      $END
  
      NST$TIMCHK = CURRTIM;        # SET CURRENT TIME # 
      NADWC = (PB$IN-PB$OUT)*60/16;  # NAD WORD COUNT # 
      SAVELENT = NST$ELENT;        # SAVE # 
      EDITNEL (NADWC);             # EDIT NAD ERROR LOGS #
  
      IF SAVELENT EQ NST$ELENT     # IF NO STATUS CHANGE #
        AND (NST$TIMBML GT 0       # AND NOT TIME FOR BML/CER MSG # 
             AND (TIMDIF(CURRTIM, NST$TIMBML) LT ELWRITEDLY)) 
      THEN
        BEGIN 
        RETURN; 
        END 
  
      IF PB$RC NE 0 
      THEN
        BEGIN 
        ERRNLD;                    # PROCESS NLD ERROR #
        END 
  
      NST$TIMBML = CURRTIM;        # SET CURRENT TIME # 
      IF SAVELENT NE NST$ELENT
      THEN
        BEGIN 
        NST$TIMCHG = CURRTIM;      # SET CURRENT TIME # 
        END 
  
    CONTROL IFEQ OS$NOSBE;
      MSG$DSPLAY = MSG$CERF;
      MSG$BUFADR = LOC(CEF$WORD0);
      IF NOT NST$ELDST             # IF NO DETAILED STATUS TABLE #
      THEN
        BEGIN 
        SLOWFOR I = 1 STEP 1 UNTIL 7
        DO
          BEGIN 
          ELB$WORD[I] = 0;         # CLEAR WORDS 1-7 #
          END 
  
        ELB$NAD[1] = X"FF";        # NAD ADDR UNKNOWN # 
        IF ELRMTNAD                # IF REMOTE NAD #
        THEN
          BEGIN 
          ELB$NAD[1] = RMT$NAD;    # REMOTE NAD ADDR #
          END 
  
        CEF$HUI = O"7777";         # HUI UNKNOWN #
        END 
  
      ELSE                         # (DETAILED STATUS TABLE PRESENT) #
        BEGIN 
        CEF$HUI = ELB$HUI[4];      # SET HUI FROM DST # 
        END 
  
      CEF$N2 = PB$CH;              # SET CHANNEL NUMBER # 
      IF ELRMTNAD                  # IF REMOTE NAD #
      THEN
        BEGIN 
        CEF$N2 = O"77";            # CH=77 FOR REMOTE NAD # 
        END 
  
      CEF$SC = 0;                  # SUB-CODE 0 # 
      CEF$GDWD1 = ELB$WORD[1];
      CEF$GDWD2 = ELB$WORD[2];
      CEF$GDWD3 = ELB$WORD[3];
      MSG$STATUS = 0; 
      CALLSYS(MSGCALL);            # SEND DST (PART 1) #
      IF NST$ELDST                 # IF DST PRESENT # 
      THEN
        BEGIN 
        CEF$SC = 1;                # SUB-CODE 1 # 
        CEF$GDWD1 = ELB$WORD[4];
        CEF$GDWD2 = ELB$WORD[5];
        CEF$GDWD3 = ELB$WORD[6];
        CEF$GDWD4 = ELB$GDA[7]; 
        MSG$STATUS = 0; 
        CALLSYS(MSGCALL);          # SEND DST (PART 2) #
        CEF$SC = 2;                # SUB-CODE 2 # 
        CEF$LOGWD4 = 0; 
        NADWC = NADWC - DST$LENBYT;  # RESET NAD WORD COUNT # 
        IF NADWC GT (21*NEL$LENBYT) 
        THEN
          BEGIN 
          NADWC = 21*NEL$LENBYT;   # AT MOST 21 ENTRIES # 
          END 
  
        I = 0;
        ASLONGAS NADWC GE NEL$LENBYT
        DO
          BEGIN 
          GETNELE (P<ELB>,I,LOC(CEF$LOGWD1)); 
          IF CEF$LOGTSQ EQ 0       # IF NO ENTRY #
          THEN
            BEGIN 
            EXIT LOOP;
            END 
  
          MSG$STATUS = 0; 
          CALLSYS(MSGCALL);        # SEND ERROR LOG ENTRY # 
          I = I + 1;
          NADWC = NADWC - NEL$LENBYT;  # DECREMENT WORD COUNT # 
          END LOOP: 
  
        END 
    CONTROL ENDIF;
  
    CONTROL IFEQ OS$NOS;
      BML$WORD0 = 0;
      BML$WORD1 = 0;
      BML$WORD2 = 0;
      IF ELRMTNAD                  # IF REMOTE NAD #
      THEN
        BEGIN 
        BML$MSGID = O"301";        # MESSAGE IDENTIFIER (REMOTE) #
        END 
  
      ELSE
        BEGIN 
        BML$MSGID = O"300";        # MESSAGE IDENTIFIER (LOCAL) # 
        END 
  
      BML$SYMPT = O"100";          # SYMPTOM CODE # 
      BML$MFID = MFID;             # MAINFRAME IDENTIFIER # 
      IF NOT NST$ELDST             # IF NO DETAILED STATUS TABLE #
      THEN
        BEGIN 
        BML$LENGTH = BMLHDRLEN - 1 + 1;  # 1-WORD ERROR LOG # 
        BML$HUI = O"7777";         # HUI UNKNOWN #
        ELB$WORD[1] = 0;
        ELB$NAD[1] = X"FF";        # NAD ADDR UNKNOWN # 
        IF ELRMTNAD                # IF REMOTE NAD #
        THEN
          BEGIN 
          ELB$NAD[1] = RMT$NAD;    # SET REMOTE NAD ADDR #
          END 
  
        END 
  
      ELSE                         # (DETAILED STATUS TABLE PRESENT) #
        BEGIN 
        BML$LENGTH = BMLHDRLEN - 1 + (NADWC*16+59)/60;
        BML$HUI = ELB$HUI[4];      # SET HUI FROM DST # 
        END 
  
      MSG$DSPLAY = MSG$BML; 
      MSG$BUFADR = LOC(BML$WORD0);
      MSG$STATUS = 0; 
      CALLSYS(MSGCALL);            # SEND BML MESSAGE # 
    CONTROL ENDIF;
  
      MSG$DSPLAY = MSG$DAYF;       # RESET MESSAGE DESTINATION #
  
      END  # WRITNEL #
  
    TERM
