*COMDECK PNCEFILE 
_$J+? 
_*****************************
*                            *
*        PNCEFILE            *
*   SEND CE ERROR SM         *
*                            *
*****************************?
_$R-,G-,I+     NON-RECURSIVE
               NON-INTERRUPTABLE ?
_***********************************************************************
*                                                                      *
**OVERVIEW- PNCEFILE GENERATES CE ERROR SM AND/OR ALARM SM             *
*                                                                      *
**INPUT- USER SUPPLIED TEXT PORTION OF SM AND NO. OF BYTES IN TEXT.    *
*                                                                      *
**OUTPUT- C0SMDISP WL ENTRY MADE TO SERVICE MODULE FOR CE ERROR SM AND/*
*         OR ALARM SM                                                  *
*                                                                      *
**EXTERNAL SUBROUTINES-                                                *
*            1) PBGET1BF           GET A BUFFER                        *
*            2) PBLSPUT            MAKE A WORKLIST ENTRY               *
***********************************************************************?
PROCEDURE PNCEFILE(LENGTH : INTEGER); 
  
CONST 
  MAXLENGTH = 9;                            _ MAX BYTE LENGTH          ?
  CPLRALM   = 3;                            _ COUPLER ALARM NUMBER     ?
  
VAR 
  I : INTEGER;                              _ LOOP CONTROL             ?
  J : INTEGER;                              _ LOOP CONTROL             ?
  LPTR : B0BUFPTR;                          _ BUFFER POINTER           ?
  LOCWLE : BWWORKLIST;                      _ LOCAL WORKLIST ARRAY     ?
  
BEGIN 
IF NPUREG = 3                               _ ONLY PROCESS IF NO       ?
THEN                                        _ REGULATION IN EFFECT     ?
  BEGIN 
  IF CNCECNT < CNCELIMIT                    _ AND LIMIT NOT EXCEEDED   ?
  THEN
    BEGIN 
    IF CS " 0                               _ AND CS AVAILABLE         ?
    THEN
      BEGIN 
      CNCECNT := CNCECNT + 1;               _ BUMP CE COUNTER          ?
      J := LENGTH;                          _ GET MESSAGE LENGTH       ?
      LPTR := PBGET1BF (BEDBSIZE);          _ GET BUFFER FOR CE ERROR  ?
      WITH LPTR' DO                         _ USING BUFFER POINTER     ?
        BEGIN 
        BFDATAC[DN] := CHR(CS);             _ SEND TO CS               ?
        BFDATAC[SN] := CHR(CKLOCNODE);      _ FROM NPU                 ?
        BIINT[BTPT/2+1] := HTCMD+$80; 
        BIINT[SFC/2+1] := D8LOG*256 + D9ER; 
        FOR I := 1 TO MAXLENGTH DO          _ NOW MOVE TEXT OF         ?
          BEGIN                             _ MESSAGE TO BUFFER        ?
          BFDATAC[SFC+I] := CHR(0);         _ CLEAR BUFFER FIRST       ?
          IF I @ J
          THEN
            BFDATAC[SFC+I] := 
              CNCEOVLY[LEVELNO].CNCHAR[I];
          END; _ FOR I ... ?
        BIINT[1] := (SFC+MAXLENGTH)*$100    _ SET-UP LCD AND FCD       ?
                     + DN;
        PBSWLE (LPTR);                      _ PASS BUFFER TO BIP       ?
        I := CNCEOVLY[LEVELNO].CNCALM;      _ GET ALARM INDICATOR      ?
        IF I " 0                            _ IF ALARM REQUIRED        ?
        THEN
          BEGIN 
          IF CNCEALARM < CNCELIMIT          _ AND LIMIT NOT EXCEEDED   ?
          THEN
            BEGIN 
            WITH LOCWLE.CMSMLEY DO          _ USING LOCAL WORKLIST     ?
              BEGIN                         _ STRUCTURE                ?
              CMDATA := D5ALMMSG;           _ ALARM 1 2 OR 3           ?
              CMWKCODE := I;                _ ALARM TYPE               ?
              CMPRM2 := ORD(BFDATAC[SFC+2]);_ GET PORT NUMBER          ?
              IF I = CPLRALM                _ IF COUPLER ALARM         ?
              THEN
                CMPRM2 := CNCEOVLY[LEVELNO] 
                          .ADST2.BALBYT;    _ GET COUPLER NODE NBR     ?
              CMPRM3 := ORD(BFDATAC[SFC+1]);_ CE ERROR NUMBER          ?
              IF CNCEOVLY[LEVELNO].CNCCNT   _ IF ALARM COUNTER USED    ?
              THEN
                BEGIN 
                WITH CGLCBP'[CMPRM2] DO     _ USING LCB STRUCTURE      ?
                  BEGIN 
                  BZALCNT := BZALCNT - 1;   _ DECREMENT ALARM CNTR     ?
                  IF BZALCNT " 0            _ IF NOT EXPIRED           ?
                  THEN
                    GOTO 999;               _ EXIT IMMEDIATELY         ?
                  BZALCNT := PSETALM;       _ RESET COUNTER            ?
                  END; _ WITH CGLCBP'... ?
                END; _ IF CNCCNT ?
              CNCEALARM := CNCEALARM + 1;   _ ALARM GENERATED          ?
              PBLSPUT (LOCWLE,              _ SEND WORKLIST TO         ?
                       DYLISTCB[D6INITERR]);_ ERROR PROCESSOR          ?
              IF DYLISTCB[D6INIT].BYCNT = 1 _ IF ONLY ONE ENTRY        ?
              THEN                          _ THEN WAKEUP PROCESSOR    ?
                BEGIN 
                CMWKCODE := D0IACTIVATE;    _ ACTIVATE WORKCODE        ?
                PBLSPUT (LOCWLE,
                         BYWLCB[B0SMWL]); 
                END; _ BYCNT = 1 ?
              END; _ WITH LOCWLE... ? 
            END; _ CNCEALARM < CNCELIMIT ?
          END; _ ALARM REQUIRED ? 
        END; _ WITH LPTR' ? 
      END; _ CS " 0 ? 
    END; _ CNCECNT < CNCELIMIT ?
  END; _ NPUREG = 0 ? 
999:  
END; _ PROCEDURE PNCEFILE ? 
