*COMDECK PBLCBTMSC
_$J+? 
_*****************************
*                            *
*         PBLCBTMSCN         *
*    ACTIVE LCB TIMER SCAN   *
*                            *
*****************************?
_$R-,G-,I-   NON-RECURSIVE
             INTERRUPTABLE
             OPS-LEVEL       ?
_***********************************************************************
*                                                                      *
**OVERVIEW- PBLCBTMSCN IS ENTERED EVERY 1/2 SECOND TO SCAN THE         *
*           ACTIVE LCBS.  THE LCB TIMER FIELD (BZLTIMER) IS            *
*           DECREMENTED, IF ACTIVE, AND CONTROL IS PASSED TO           *
*           ANY EXISTING TIMAL APPENDAGES FOR TIMERS THAT EXPIRE.      *
*           ACTIVE LCBS ARE CHAINED (BZTMRCHN) WITH THE GLOBAL         *
*           STRUCTURE CELCBACT CONTAINING POINTERS TO THE FIRST        *
*           AND LAST ACTIVE LCB IN THE CHAIN                           *
*                                                                      *
**INPUT- NONE                                                          *
**OUTPUT - TIMAL APPENDAGES EXECUTED FOR ANY EXPIRED TIMERS.           *
*          LCB ALARM COUNTERS PRESET PERIODICALLY                      *
*                                                                      *
**EXTERNAL SUBROUTINES-                                                *
*                    1) PBCALL    CALL PGM BY ADDRESS                  *
*                    2) PBPUTLIST MAKE A WORKLIST ENTRY                *
*                    3) PBPUTYP   MAKE A WORKLIST ENTRY BY LINE NO.    *
*                                                                      *
***********************************************************************?
PROCEDURE PBLCBTMSCN; 
CONST 
      PASSPRE = $100;                       _TIMEOUT VALUE FOR ALARMS  ?
VAR 
      ACTLCB : BZLCBP;                      _ LCB POINTER              ?
      I      : INTEGER;                     _ GENERAL USE              ?
      ACTOUT : NKINCOM;                     _ TERMINATE OUTPUT CMD PKT ?
      ACTINP : NKINCOM;                     _ TERMINATE INPUT  CMD PKT ?
      PASSCNT : INTEGER;                    _TIME TO PRESET ALARM COUNT?
      PRESETF : BOOLEAN;                    _FLAG TO PRESET ALARM COUNT?
VALUE 
      ACTOUT = ($0B00,7*0);                 _ TERM OUTPUT, NO W/L RTN  ?
      ACTINP = ($0AC0,0,$0010,5*0);         _ TERM INPUT, W/L = A0TIMEO?
BEGIN 
_ 
*              ---- SCAN LINE CONTROL BLOCKS ---- 
? 
  ACTLCB := CELCBACT.CEFRST;                _ PRIME ACTIVE LCB PTR     ?
  IF PASSCNT = 0                            _IF TIME TO PRESET ALARM CT?
  THEN
  BEGIN 
    PASSCNT := PASSPRE;                     _PRESET TIMEOUT FOR ALARMS ?
    PRESETF := TRUE;                        _SET PRESET ALARM CNT FLAG ?
  END;
  WHILE  NIL " ACTLCB DO                    _ LOOP THRU ACTIVE LCBS    ?
  WITH ACTLCB' DO                           _ CURRENT LCB              ?
  BEGIN 
    IF PRESETF                              _IF PRESET ALARM COUNT FLAG?
    THEN
      BZALCNT := PSETALM; 
    IF BZLINO.BDPORT = 0                    _ CHECK FOR SUB LCB        ?
    THEN
    WITH BLSTIMTBL[BZLINO.BDSUBPORT] DO     _ SUB LCB POINTER          ?
    BEGIN 
      IINT;                                 _ DISABLE INTERRUPTS       ?
      IF BLTIME " 0                         _ IS TIMER ACTIVE          ?
      THEN
      BEGIN 
        BLTIME := BLTIME - 1;               _ DECREMENT COUNTER        ?
        IF BLTIME = 0                       _ DID TIMER EXPIRE         ?
        THEN GOTO 10;                       _ MAKE WORKLIST ENTRY TO TP?
      END;
      EINT;                                 _ ENABLE INTERRUPTS        ?
    END 
    ELSE
    WITH BLTIMTBL'[BZLINO.BDPORT] DO        _ LINE TIMER ENTRY         ?
    BEGIN 
      IINT;                                 _ INHIBIT INTERRUPTS       ?
      IF BLTIME = 0                         _ IS TIMER ACTIVE          ?
      THEN                                  _ NO                       ?
        EINT                                _ ENABLE INTERRUPTS        ?
      ELSE                                  _ YES                      ?
      BEGIN 
_ 
*              ---- CALL FIRMWARE ROUTINE TO DECREMENT ---- 
? 
        ADDR(BLTIMTBL'[BZLINO.BDPORT], I);  _ SET UP TIME TABLE ADDR   ?
        INST($C400,I,                       _ LDA   TABLE ADDRESS      ?
             $E400,PFLINTO,                 _ LDQ   FIRMWARE ADDRESS   ?
             $0BA2);                        _ EMSQ  ESCAPE TO FIRMWARE ?
        IF 0 " BLTIME                       _ DID TIMER EXPIRE         ?
        THEN EINT                           _ NO - ENABLE INTERRUPTS   ?
        ELSE
        WITH BWWLENTRY[OPS].B0EWLQ DO       _ INTERMEDIATE ARRAY       ?
10 :  
        BEGIN 
          EINT;                             _ ENABLE INTERRUPTS        ?
          IF BZTOUTPUT                      _ CK FOR TERMINATE OUTPUT  ?
          THEN
          WITH ACTOUT DO                    _ COMMAND PACKET           ?
          BEGIN 
            NKLINO   := BZLINO.BDLINO;      _ LINE NUMBER              ?
            PBCOIN   (ACTOUT);              _ TERMINATE OUTPUT         ?
          END;
          WITH NAPORT' [BZLINO.BDPORT] DO   _INDEX TO PORT TABLE       ?
            IF NAOON
            THEN                            _OUTPUT ACTIVE AND         ?
              IF NALCBP'.NCBZL              _INPUT AFTER OUTPUT CMDS   ?
              THEN
                BEGIN                       _OUTPUT TIME OUT           ?
                MMWKCOD := MMHARDERR;       _TREAT AS HARD ERROR       ?
                MMINOP  := 4; 
                GOTO 20;
                END;
          IF BZTINPUT                       _ CHECK FOR TERMINATE INPUT?
          THEN
          WITH ACTINP DO                    _ COMMAND PACKET           ?
          BEGIN 
            NKLINO   := BZLINO.BDLINO;      _ LINE NUMBER              ?
            NKWLINDX := BJTIPTYPT[BZTIPTYP]._ WORKLIST INDEX FOR TIP   ?
                        BJLISTIX; 
            NKUSRBY  := BZWTCOUNT;          _ WAIT COUNT               ?
            PBCOIN   (ACTINP);              _ TERMINATE INPUT - LMD DRV?
                                            _ WILL MAKE TIMEOUT W/L TO ?
          END                               _ TIP AFTER INPUT TERM.    ?
          ELSE
          BEGIN 
            MMWTCOUNT := BZWTCOUNT;         _ WAIT COUNT               ?
            MMWKCOD   := A0TIMEOUT;         _ TIMEOUT WORKCODE         ?
20: 
            MMLINO    := BZLINO.BDLINO;     _ LINE NUMBER              ?
            PBPUTYP   (BWWLENTRY[OPS]);     _ MAKE WORKLIST TO TIP     ?
          END;
          IF BZTAPEXS                       _TIMER APENDAGE SPECIFIED  ?
          THEN
            WITH BJTIPTYPT [BZTIPTYP] DO
            PBXFER (BJETIMRTN, BJPTIMRTN);  _CALL THE THING            ?
        END;
      END;  _ ACTIVE ENTRY  ? 
  
      NAPORT' [BZLINO.BDPORT].NASPILL := 0; _RESET CLA STATUS OVF CNTR ?
  
    END;  _ SYSTEM LCB? 
  
    ACTLCB := BZTMRCHN;                     _ CHAIN TO NEXT ACTIVE LCB ?
  
  END;    _ WITH, WHILE ? 
  
  PASSCNT := PASSCNT - 1;                   _DECREMENT TIMER           ?
  PRESETF := FALSE;                         _CLR PRESET ALARM CNT FLAG ?
END;      _ PBLCBTMSC ? 
