*COMDECK PITMRSRVS
_$J+? 
                                                          _80 12 18?
_***********************************************************************
*                                                                      *
*                             PITMRSRVS                                *
*                                                                      *
*                       INITIALIZE TIMER TABLES                        *
*                                                                      *
***********************************************************************?
_$R-,G-,I-  NON-RECURSIVE, INTERRUPTABLE ?
_***********************************************************************
*                                                                      *
** OVERVIEW -  THE INITIALIZATION ROUTINE CREATES A TIME INTERVAL      *
*              MARKER PACKET FOR EACH PARTITION TABLE ENTRY, CHAINS    *
*              THEM TOGETHER AND PUTS THEIR ADDRESS IN THE CORRES-     *
*              PONDING PARTITION TABLE SLOTS.  THE LIST HEAD, TAIL,    *
*              PARTITION TABLE TOP, BOTTOM, BEGINNING AND END ARE      *
*              ALSO INITIALIZED AND THE CLOCK IS STARTED.              *
*                                                                      *
** CALLING PROGRAMS -                                                  *
*              NONE                                                    *
*                                                                      *
** OUTPUT -    THE PARTITION TABLE, CONTROL TABLE AND LINKED LIST      *
*              OF TIMER PACKETS ARE CREATED.                           *
*                                                                      *
** EXTERNAL SUBROUTINES -                                              *
*              NONE                                                    *
*                                                                      *
** NOTES -     THE INDICES TO THE PARTITION TABLE TOP AND BOTTOM       *
*              (B7TOPINDX AND B7BOTINDX) POINT TO THE PARTITION        *
*              TABLE ENTRIES WHICH IN TURN POINT TO THE TOP AND        *
*              BOTTOM OF THE LINKED LIST.  THE INDICES TO THE          *
*              PARTITION TABLE BEGINNING AND END (B7BGNINDX AND        *
*              B7ENDINDX) POINT TO THE BEGINNING AND END OF THE        *
*              PARTITION TABLE.  THEY ARE USED TO DETERMINE WHEN       *
*              THE TABLE WRAPS AROUND ITSELF.  I.E., AT INITIALIZA-    *
*              TION THE TOP AND THE BEGINNING ARE THE SAME AS ARE THE  *
*              BOTTOM AND THE END.  AFTER THE FIRST PARTITION PACKET   *
*              HAS EXPIRED THE TABLE WILL BE UPDATED SO THAT THE       *
*              SECOND PARTITION ENTRY POINTS TO THE LIST TOP AND       *
*              THE FIRST PARTITION ENTRY, B7BGNINDX, POINTS TO THE     *
*              BOTTOM.                                                 *
*                                                                      *
***********************************************************************?
PROCEDURE PITMRSRVS;
  
VAR 
      T7I      : INTEGER;                   _INDEX                     ?
  
BEGIN 
ADDR (BKTMPKT,B7LSTPTR);                    _GET ADDR FIRST MARKER     ?
_***********************************************************************
*                                                                      *
*  BUILD EACH TIME INTERVAL MARKER PACKET AND PUT POINTER IN PARTI-    *
*  TION  TABLE.                                                        *
*                                                                      *
***********************************************************************?
FOR T7I := 0 TO B7ENDINDX DO                _BUILD B7NPTNS PARTITIONS  ?
  BEGIN                                     _GET NEXT TIME INTERVAL    ?
  WITH B7LSTPTR' DO                         _ MARKER                   ?
    BEGIN 
    BKEXTIME      := (T7I+1) * B7TMINTVL;   _SET UP EXPIRATION TIME    ?
    BKTIMRK       := TRUE;                  _IDENTIFY AS TIMER INTERVAL?
    BKACTIVE      := TRUE;                  _DECLARE PACKET IN LIST    ?
    BKBAKLNK      := BKTMPTR [T7I-1];       _INSERT BACKWARD POINTER   ?
    BKTMPTR [T7I] := B7LSTPTR;              _PUT POINTER TO TIM IN     ?
                                            _ PARTITION TABLE          ?
    B7LSTPTR      := B7LSTPTR + 4;          _MOVE ON TO NEXT PACKET    ?
    BKFORLNK      := B7LSTPTR;              _INSERT FORWARD POINTER    ?
    END; _WITH B7LSTPTR' DO?
  END; _FOR T7I := 0 TO B7ENDINDX DO? 
  BKTMPTR [0]'.BKBAKLNK         := NIL;     _CLEAR BACKLNK IN HEAD ENTR?
  BKTMPTR [B7ENDINDX]'.BKFORLNK := NIL;     _CLEAR FORLNK IN TAIL ENTRY?
_***********************************************************************
*                                                                      *
*  INITIALIZE THE CONTROL TABLE POINTERS AND INDICES                   *
*                                                                      *
***********************************************************************?
B7LSTHEAD := BKTMPTR [0];                   _HEAD POINTS TO 1ST PACKET ?
B7LSTTAIL := BKTMPTR [B7ENDINDX];           _TAIL POINTS TO LAST PACKET?
B7TOPINDX := 0;                             _TOP POINTS TO 1ST         ?
_***********************************************************************
*                                                                      *
*  INITIALIZE THE REAL TIME CLOCK                                      *
*                                                                      *
***********************************************************************?
CICLKADT.CICOUNT := 0;                      _INITIALIZE THE ADT CLOCK  ?
CICLKADT.CILIMIT := B7TMINTVL;
_***********************************************************************
*                                                                      *
*  INITIALIZE 100 MSEC TIMER                                           *
*                                                                      *
***********************************************************************?
WITH BK100PKT DO                            _SET UP VALUES IN 100 MSEC ?
  BEGIN                                     _ TIMER PACKET             ?
  BKTIME     := 30;                         _SET TIME TO 100 MS        ?
  BKPERIODIC := TRUE;                       _PERIODIC TIMER            ?
  BKWLINDX   := B0TIWL;                     _INSERT WORKLIST INDEX     ?
  BKTYPE     := BKSET;                      _TELL PBTMRSRVS TO SET     ?
  BKWKCODE   := A0TIMEOUT;                  _DEFINE WORK CODE          ?
  END; _WITH BK100PKT DO? 
ADDR (BK100PKT,B7LSTPTR);                   _ADDRESS OF 100 MS PACKET  ?
PBTMRSRVS (B7LSTPTR);                       _CALL TIMER SERVICES       ?
END; _PROCEDURE PITMRSRVS?
