*COMDECK PIWLINIT 
_$J+   PAGE EJECT ? 
_$R-,G-,I-? 
_ 
************************************************************************
*                                                                      *
*              * *   P I W L I N I T   * *                             *
*                                                                      *
*              WORKLIST INITIALIZATION                                 *
*                                                                      *
************************************************************************
*                                                                      *
** OVERVIEW -  THIS PROCEDURE INITIALIZES THE WORKLIST CONTROL BLOCKS  *
*              WHICH ARE SERVICED BY THE OPS LEVEL MONITOR.            *
*              THE ACTIVE WLCB CHAIN IS SET UP , INACTIVE ENTRIES      *
*              WILL USE A DEFAULT WORKLIST SIZE OF 3 AND ARE NOT       *
*              SERVICED BY THE OPS LEVEL MONITOR (PBMON).              *
*              VALUES TO BE USED BY THE PERFORMANCE MONITORING         *
*              ROUTINES ARE CALCULATED.                                *
*              THE WORKLIST CONTROL BLOCKS FOR THE COUPLER(S) ARE      *
*              ALSO INITIALIZED.                                       *
*                                                                      *
** INPUTS -    WORKLIST CONTROL BLOCK ARRAY (BYWLCB)                   *
*              COUPLER SUB LCB(S)                                      *
*                                                                      *
** OUTPUTS -   WORKLIST CONTROL BLOCKS INITIALIZED                     *
*              PERFORMANCE VALUES CALCULATED                           *
*                                                                      *
************************************************************************
* 
? 
PROCEDURE PIWLINIT; 
  
CONST 
      R0COUPLER = 0;                        _ COUPLER LINK             ?
VAR   R0WL : B0WKLSTS;                      _ INDEX FOR WORKLIST       ?
      R0CP : BYCBPTR;                       _ POINTER TO WLCB          ?
      R0PA : BYCBPTR;                       _ PREVIOUS ACTIVE WLCB PTR ?
      R0IL : INTEGER;                       _ PBILL ASSIGNED WL (INACT)?
      I    : INTEGER;                       _ INDEX                    ?
      J    : INTEGER;                       _ INDEX                    ?
  
BEGIN 
  FOR R0WL := B0FSWL TO B0DUMMY DO          _ INIT ALL WORKLISTS       ?
  WITH BYWLCB[R0WL] DO                      _ CURRENT WORKLIST         ?
  BEGIN 
    IF BYINC = 0                            _ CK FOR INACTIVE LIST     ?
    THEN
    BEGIN 
      BYINC   := 3;                         _ SET DEFAULT INCREMENT    ?
      BYFEINC := 0;                         _ SET DEFAULT FIRST        ?
    END 
    ELSE
    BEGIN 
      IF R0WL \ B0CHWL
      THEN                                  _MONITOR SCANNED WLCB      ?
      BEGIN 
        IF BYPRADDR " 0                     _AND ENTRY ADDRESS GIVEN   ?
        THEN
        BEGIN 
          ADDR (PBILL, R0IL);               _SET ADDRESS OF PBILL      ?
          IF R0IL " BYPRADDR                _IF ASSIGNED TO PBILL,     ?
          THEN                              _CONSIDER WLCB INACTIVE    ?
            BEGIN 
            ADDR (BYCNT, R0CP);             _GET ADDRESS OF WLCB       ?
            IF BYCURWLP = NIL 
            THEN
              BYCURWLP := R0CP;             _SET GLOBAL PTR TO 1ST ACTV?
            IF R0PA " NIL 
            THEN                            _SET PTR TO CURRENT ENTRY  ?
              R0PA'.BYACTCHN := R0CP;       _IN PREVIOUS ACTIVE ONE    ?
            R0PA := R0CP; 
            R0CP'.BYACTCHN := BYCURWLP;     _MAKE LAST POINT TO FIRST  ?
_ 
* * * *  CALCULATE MONITOR LOOP TIME IN 20 NANO-SECOND UNITS
*        (PFMONLT MUST BE LESS THAN 32,768 FOR CORRECT RESULTS) 
? 
            PFMONLT := PFMONLT +            _ADD TIME FOR ACTIVE WLCB  ?
                       PFTMAWLCB / 2;       _SCAN                      ?
          END;
        END;
      END;
    END;
  END;
_ 
* * * *  CALCULATE NR CYCLES THROUGH MONITOR DURING 1/2 SAMPLE PERIOD 
*        (PFMONCY MUST BE LESS THAN 32,768 FOR CORRECT MEASUREMENTS)
? 
  PFMONLT := PFMONLT + PFTMBAS / 2;         _ADD MONITOR BASE TIME     ?
*IF DEF,TUP,1 
  PFMONLT := PFMONLT + PFTMTUP / 2;         _ADD TUP DEBUG BASE TIME   ?
  
  INST ($C000,PFINTVAL,  _LDA  =PFINTVAL?   _GET SAMPLE PERIOD         ?
        $2000,1000,      _MUI  =N1000   ?   _MULTIPLY BY 25,000,000    ?
        $2000,25000,     _MUI  =N25000  ?   _(DOUBLE PRECISION)        ?
        $3400,PFMONLT,   _DVI  PFMONLT  ?   _DIVIDE BY MON LOOP TIME   ?
        $6400,PFMONCY);  _STA  PFMONCY  ?   _MAX NR CYCLES DURING SAMPL?
  
_ 
* * * *  INITIALIZE WLCB IN COUPLER CONTROL BLOCK(S)  * * * * 
? 
  J := C4SUBLCB - C0NCPLR ;                 _ INITIALIZE SUBLCB INDEX  ?
  FOR I := 1 TO NHNOLNKS DO                 _ FOR EACH LINK DEFINED    ?
    IF NHCBTYP'[I] = R0COUPLER              _ IF LINK IS FOR COUPLER   ?
    THEN
      BEGIN 
      J := J + 1;                           _ INCREMENT SUBLCB INDEX   ?
      WITH CSUBLCBP'[J].BZTCBPTR'.BHCCB     _ WITH WLCB IN COUPLER CB  ?
                       .BHWLCB DO 
        BEGIN 
          BYBACKUP := TRUE;                 _ BACK UP WHEN COUNT = 0   ?
          BYINC    := 1;                    _ WORK LIST SIZE           ?
          BYFEINC  := 0;                    _ FIRST ENTRY INCREMENT    ?
        END;  _ WITH BHCCB.BHWLCB ? 
      END;  _ IF NHCBTYP ?
END;  _ PIWLINIT ?
