*COMDECK PBMLIA 
_$J+? 
_*****************************
*                            *
*        PBMLIAOPS           *
*      MLIA HANDLER          *
*                            *
*****************************?
_$R-,G-,I-     NON-RECURSIVE
               INTERRUPTABLE ?
_***********************************************************************
*                                                                      *
**OVERVIEW- PBMLIAOPS IS CALLED WHEN EITHER A MLIA ERROR OR TIME-      *
*           OUT INTERRUPT IS GENERATED.  A CE ERROR SM IS ISSUED       *
*           WHENEVER AN ERROR COUNT EXCEEDS A PRE-DEFINED THRESHOLD.   *
*           TIMEOUT ENTRIES ARE MADE BY PBMLIAOPS TO ITSELF SO         *
*           THAT ERRORS CAN BE AGED AND MONITORED.                     *
*                                                                      *
**INPUT- MLIA ERROR OR TIMEOUT WL ENTRY.                               *
*                                                                      *
**OUTPUT- CE ERROR SM.                                                 *
*                                                                      *
**EXTERNAL SUBROUTINES-                                                *
*              1) PNCEFILE         SEND CE ERROR SM                    *
*              2) PBHALT           HALT SYSTEM                         *
*                                                                      *
*                                                                      *
***********************************************************************?
PROCEDURE PBMLIAOPS;
CONST MLIARDY  = BIT0;                      _MLIA READY        (COND A)?
      ILOOPERR = BIT9;                      _INPUT LOOP ERROR  (COND B)?
      LOSTDATA = BIT6;                      _LOST DATA         (COND C)?
      FULL     = BIT5;                      _INPUT OR ODD FIFO (COND D)?
_?
      MLIAREC  = 0;                         _MLIA RECOVERED            ?
      MLIACNT  = 1;                         _MLIA STATISTICS           ?
      MLIAFAIL = 2;                         _MLIA FAILED               ?
_?
      TIMER = 4;                            _TWO SECOND TIMER          ?
_?
      ALMTH  = 10;                          _ALARM THRESHOLD           ?
      LDTH   = 10;                          _LOST DATA THRESHOLD       ?
      IERRTH = 10;                          _INPUT LOOP ERROR THRESHOLD?
      TETH   = 25;                          _TOTAL ERROR THRESHOLD     ?
_?
VAR MLIASTAT : B0OVERLAY;                   _MLIA STATUS               ?
    TOTERRS : INTEGER;                      _TOTAL ERROR COUNT         ?
BEGIN 
  WITH BWWLENTRY[OPS].B0EWLQ,               _WL ENTRY                  ?
       CSUBLCBP'[1],                        _MLIA SUB LCB              ?
       BZTCBPTR'.BSTCB,                     _MLIA TCB                  ?
       CNCEOVLY[OPS] DO                     _CE ERROR OVERLAY          ?
  BEGIN 
    TOTERRS := BSCONB+BSCONC+BSCOND;        _GET TOTAL MLIA ERRORS     ?
    CNCECODE  := CEMLIAERR;                 _MLIA CE ERROR CODE        ?
    IF A0TIMEOUT = MMWKCOD THEN             _TIMEOUT WL ENTRY          ?
    BEGIN 
      CASE BSWRKCD OF                       _TCB WORK CODE             ?
_?
      SBTIMEOUT:                            _TIMEOUT                   ?
      BEGIN 
        BSCONB := BSCONB/2;                 _AGE STATISTICS            ?
        BSCONC := BSCONC/2; 
        BSCOND := BSCOND/2; 
        IF 0 = TOTERRS THEN                 _CHECK IF MLIA RECOVERED   ?
        BEGIN 
          IF BSCEMI THEN                    _TEST CE ERROR SM ISSUED   ?
          BEGIN 
            SASUBCDE := MLIAREC;            _MLIA RECOVERED            ?
            PNCEFILE(3);                    _SEND CE ERROR SM          ?
            BSCEMI := FALSE;                _CLEAR CE ERROR SM ISSUED  ?
          END;
        END 
        ELSE
        BLSTIMTBL[MMLOPOR].BLTIME := TIMER; _ SET TIMER                ?
      END;
_?
      SBRDSTATUS:                           _READ STATUS               ?
      BEGIN 
        INST($E000,$576,                    _LOAD COMMAND              ?
             $B04,                          _SIO                       ?
             $6400,MLIASTAT);               _STORE MLIA STATUS         ?
        BLSTIMTBL[MMLOPOR].BLTIME := TIMER; _ SET TIMER                ?
        IF MLIARDY IN MLIASTAT.BASET        _CHECK IF MLIA READY       ?
        THEN BSWRKCD := SBTIMEOUT           _SET WK CODE TO TIMEOUT    ?
        ELSE
        BEGIN 
          BSWRKCD := SBHALT;                _SET WK CODE TO HALT       ?
          SASUBCDE := MLIAFAIL;             _MLIA FAILURE              ?
          PNCEFILE(3);                      _SEND CE ERROR SM          ?
        END;
      END;
_?
      SBHALT: 
      PBHALT(J0MLIAERR);                    _HALT SYSTEM               ?
_?
      END; _CASE? 
    END _IF?
    ELSE
    WITH NMLIAST DO                         _MLIA STATUS IN WL ENTRY   ?
    BEGIN 
      IF NOT (MLIARDY IN BASET) THEN        _CHECK IF MLIA NOT READY   ?
      BEGIN 
        BSWRKCD := SBRDSTATUS;              _SET WK CODE TO READ STATUS?
        GOTO 10;
      END;
      IF ILOOPERR IN BASET
      THEN BSCONB := BSCONB+1;              _BUMP INPUT LOOP ERROR STAT?
      IF LOSTDATA IN BASET
      THEN BSCONC := BSCONC+1;              _BUMP LOST DATA ERROR STAT ?
      IF FULL IN BASET
      THEN BSCOND := BSCOND+1;              _BUMP INPUT OR ODD FULL ST ?
      BSWRKCOD := SBTIMEOUT;                _SET WK CODE TO TIMEOUT    ?
      IF (ALMTH < BSCONB) !                 _-CHECK IF ANY ERROR       ?
         (LDTH  < BSCONC) !                 _-THRESHOLD EXCEEDED       ?
         (IERRTH< BSCOND) ! 
         (TETH  < TOTERRS) THEN 
      BEGIN 
        IF NOT BSCEMI THEN                  _CHECK CE ERROR SM NOT SENT?
        BEGIN 
          BSCEMI := TRUE;                   _SET CE ERROR SM SENT      ?
          SASUBCDE := MLIACNT;              _MLIA STATISTICS           ?
          SAILOOPERR := BSCONB;             _MOVE IN STATISTICS        ?
          SALOSTDATA := BSCONC; 
          SAFULL     := BSCOND; 
          PNCEFILE(9);                      _ISSUE CE ERROR SM         ?
        END;
      END;
10 :  
      IF BLSTIMTBL[MMLOPOR].BLTIME = 0           _ CHECK IF TIMER ZERO ?
      THEN BLSTIMTBL[MMLOPOR].BLTIME := TIMER;   _ SET TIMER           ?
    END; _ELSE? 
  END; _WITH? 
END; _PBMLIAOPS?
_$J+? 
_*? 
PROCEDURE PMMLEH ;                 _THIS ROUTINE RECEIVES CONTROL AS A
                                    RESULT OF PRIORITY 3 INTERRUPT. IT
                                    WILL READ THE MLIA STATUS, CREATE 
                                    AN EVENT PACKET CONTAINING THE
                                    STATUS, AND QUEUE THE PACKET IN THE 
                                    PBMLIAOPS PROGRAMS WORK QUEUE.    ? 
CONST 
     SPMLIA    = 1 ;          _MLIA SUBPORT NUMBER? 
     E1RATE    = 20 ;         _MAXIMUM NO. OF UNPROCESSED W            ?
VAR 
     S1TEMP : B0OVERLAY  ;
     SCMLEP : BWWORKLIST; 
VALUE 
     SCMLEP = (0,SPMLIA,0,0,0) ;  _INITIALIZE EVENT PACKET ?
BEGIN 
_?
  IF BYWLCB[B0MLWL].BYCNT > E1RATE _CHECK IF COUNT IS TOO LARGE        ?
  THEN PBHALT(J0MLIAERR);     _ EXCESSIVE MLIA ERRORS                  ?
  INST (  $E000,              _ LDQ  $0576 ?
          $0576,
          $0B04,              _ SOI        ?
          $6400,              _ STA  S1TEMP?
          S1TEMP  ) ; 
  SCMLEP.B0EWLQ.NMLIAST.BAINT := S1TEMP.BAINT;
  PBPUTYP(SCMLEP);
END;
