*COMDECK PBTOQUE
_$J+? 
_$R-,G-,I+?    _ NON INTERRUPTABLE ?
_ 
************************************************************************
*                                                                      *
*              * *  P B T O Q U E  * *                                 *
*                                                                      *
************************************************************************
*                                                                      *
** OVERVIEW -  THIS ROUTINE ADDS A TIMEOUT ENTRY TO THE 100 MS TIMEOUT *
*              QUEUE.  THE NEW ENTRY IS ADDED AT THE END OF THE LIST.  *
*              IF ACTIVITY IS INCLEASED ON THIS LIST, THEN THE LIST    *
*              SHOULD BE ORDERED BY TIMEOUT TIME.                      *
*                                                                      *
** INPUT -     TIMEOUT BUFFER - SEE SYSTEM GLOBALS FOR FORMAT          *
*                                                                      *
** OUTPUT -    NEW ENTRY CHAINED TO END OF LIST                        *
*                                                                      *
************************************************************************
* 
* 
? 
PROCEDURE PBTOQUE (PBTOBUF : B0BUFPTR); 
BEGIN 
  IF CATONRP = NIL                          _ CHECK FOR FIRST ENTRY    ?
  THEN CATONRP := PBTOBUF                   _ SET NEW BEGINNING        ?
  ELSE CATOLRP'.BFTCHAIN := PBTOBUF;        _ CHAIN NEW BUFFER TO LAST ?
  CATOLRP := PBTOBUF;                       _ SET NEW LAST BUFFER      ?
  PBTOBUF'.BFTCHAIN := NIL;                 _ CLEAR CHAIN WORD         ?
  PBTOBUF'.BFTOVAL := CTIMER.CT100MS +      _ SET UP TIMEOUT VALUE     ?
                      PBTOBUF'.BFTOVAL; 
  
END;  _ PBTOQUE ? 
_$R-,G-,I+     NON-INTERRUPTABLE ?
_ 
************************************************************************
*                                                                      *
*              * *  P B T O S R C H  * *                               *
*                                                                      *
************************************************************************
*                                                                      *
** OVERVIEW -  THIS PROCEDURE SCANS THE 100 MS TIMEOUT LIST FOR EXPIRED*
*              ENTERIES.  WHEN AND ENTRY HAS EXPIRED, A WORKLIST ENTRY *
*              IS MADE AS SPECIFIED IN THE TIMEOUT BUFFER.             *
               THIS ROUTINE RECEIVES CONTROL EVERY 100MS FROM PB100MS 
** INPUT -     100 MS TIMEOUT LIST                                     *
*                                                                      *
*                                                                      *
** OUTPUT -    A WORKLIST ENTRY AS SPECIFIED BY THE TIMEOUT BUFFER     *
*                                                                      *
** EXTERNAL SUBROUTINES USED                                           *
*              1) PBDLPUT - MAKE A WL ENTRY                            *
*              2) PBREL1BF - RELEASE A BUFFER - 8 WORD                 *
* 
************************************************************************
* 
? 
PROCEDURE PBTOSRCH; 
VAR 
    PBCANRP : B0BUFPTR;                     _ NEXT READ POSITION       ?
    PBCALRP : B0BUFPTR;                     _ LAST READ POSITION       ?
    PBCAREL : B0BUFPTR;                     _ BUFFER TO BE RELEASED    ?
    WLENTRY : BWWORKLIST; 
BEGIN 
  PBCANRP := CATONRP;                       _ SET UP NEXT READ         ?
  WHILE PBCANRP " NIL DO                    _ LOOP ON LIST ENTERIES    ?
  WITH  PBCANRP' DO                         _ CURRENT ENTRY            ?
  BEGIN 
    IF BFTOVAL = CTIMER.CT100MS             _ HAS TIME ELASPED         ?
    THEN                                    _ YES                      ?
    WITH WLENTRY.B0EWLQ DO
    BEGIN 
      IF PBCANRP = CATONRP                  _ CHECK FOR FIRST ENTRY    ?
      THEN CATONRP := BFTCHAIN              _ SET NEW GLOBAL NRP       ?
      ELSE                                  _ NOT FIRST ENTRY IN QUEUE ?
      BEGIN 
        PBCALRP'.BFTCHAIN := BFTCHAIN;      _ RECHAIN PREVIOUS TO NEXT ?
        IF BFTCHAIN = NIL                   _ IF LAST ENTRY REMOVED    ?
        THEN CATOLRP := PBCALRP;            _ UPDATE BOTTOM POINTER    ?
      END;
      MMWD0.BAINT := BIINT[1];              _ MOVE USER FIELD TO W. L. ?
      MMWD1.BAINT := BIINT[2];              _ MOVE USER FIELD TO W. L. ?
      MMWD2.BAINT := BIINT[3];              _ MOVE USER FIELD TO W. L. ?
      MMWD3.BAINT := BIINT[4];              _ MOVE USER FIELD TO W. L. ?
      MMWD4.BAINT := BIINT[5];              _ MOVE USER FIELD TO W. L. ?
      PBLSPUT (WLENTRY,BYWLCB[BFTWLIND]);   _ MAKE WORKLIST ENTRY      ?
      IF BFTWLIND = MMEWLQ                  _ IS IT A MUX LEVEL ENTRY  ?
      THEN
      INST ($E400,N2P3INTAD,                _ LDQ   FIRMWARE ADDRESS   ?
            $0BA2);                         _ EMSQ  ESCAPE TO MICRO    ?
      PBCAREL := PBCANRP;                   _ SAVE BUFFER ADDRESS IN   ?
                                            _ CASE IT IS TO BE RELEASED?
      PBCANRP := BFTCHAIN;                  _ CHAIN TO NEXT BUFFER     ?
      IF PBCAREL'.BFTREL                    _ CHECK FOR RELEASE SPEC   ?
      THEN PBREL1BF (PBCAREL,B0S8);         _ RELEASE TIMEOUT BUFFER   ?
      GOTO 5;                               _ BY-PASS NORMAL PTR UPDATE?
    END;                                    _ TIMEOUT                  ?
  
    PBCALRP := PBCANRP;                     _ UPDATE LAST BUFFER       ?
    PBCANRP := BFTCHAIN;                    _ CHAIN TO NEXT BUFFER     ?
5 : 
  END;  _ WHILE PBCANRP " NIL ? 
  
END;    _ PBTOSRCH            ? 
_$J+?                                                                    CC4
_                                                                        CC4
************************************************************************ CC4
*                                                                      * CC4
*              * *   P B T O D E L   * *                               * CC4
*                                                                      * CC4
************************************************************************ CC4
*                                                                      * CC4
** OVERVIEW -  THIS PROCEDURE DELETES ALL ENTRIES FOR A GIVEN LINE     * CC4
*              AS SPECIFIED IN THE CALL.  ALL BUFFERS ARE RELEASED.    * CC4
*                                                                      * CC4
** INPUT -     100 MS TIMEOUT LIST.                                    * CC4
*              PARAMETER TO SEARCH ON (NORMALLY THE LINE NUMBER)       * CC4
*                                                                      * CC4
** OUTPUT -    RELEASED BUFFERS                                        * CC4
*                                                                      * CC4
** EXTERNAL SUBROUTINES USED -                                         * CC4
*              PBREL1BF - RELEASE A BUFFER                             * CC4
*                                                                      * CC4
************************************************************************ CC4
*                                                                        CC4
*                                                                        CC4
?                                                                        CC4
PROCEDURE PBTODEL (PBTOLINO : INTEGER );                                 CC4
VAR                                                                      CC4
      CURRENT  : B0BUFPTR;                  _ CURRENT BUFFER          ?  CC4
      PREVIOUS : B0BUFPTR;                  _ PREVIOUS BUFFER         ?  CC4
      RELEASE  : B0BUFPTR;                  _ BUFFER TO BE RELEASED   ?  CC4
                                                                         CC4
BEGIN                                                                    CC4
  CURRENT := CATONRP;                       _ SET SCAN TO FIRST       ?  CC4
  WHILE CURRENT " NIL DO                    _ LOOP ON ENTERIES IF ANY ?  CC4
  WITH  CURRENT' DO                         _ CURRENT BUFFER           ? CC4
  BEGIN                                                                  CC4
    IF BFTLINO.BDLINO = PBTOLINO            _ CK SECOND WORD           ? CC4
    THEN                                                                 CC4
    BEGIN                                   _ MATCH FOUND             ?  CC4
      IF CURRENT = CATONRP                  _ WAS IT THE FIRST        ?  CC4
      THEN CATONRP := BFTCHAIN              _ YES - UPDATE NEW FIRST  ?  CC4
      ELSE                                                               CC4
      BEGIN                                 _ NOT FIRST               ?  CC4
        PREVIOUS'.BFTCHAIN := BFTCHAIN;     _ CHAIN AROUND THIS ONE    ? CC4
        IF BFTCHAIN = NIL                   _ WAS IT THE LAST         ?  CC4
        THEN CATOLRP := PREVIOUS            _ YES - SET UP NEW LAST   ?  CC4
      END;                                                               CC4
_                                                                        CC4
*              ---- RELEASE THE BUFFER ----                              CC4
?                                                                        CC4
      RELEASE  := CURRENT;                  _ SET UP ADDR FOR RELEASE  ? CC4
      CURRENT  := BFTCHAIN;                 _ CHAIN TO NEXT            ? CC4
      PBREL1BF (RELEASE,B0S8);              _ RELEASE THE BUFFER       ? CC4
    END                                                                  CC4
    ELSE                                    _ MATCH NOT FOUND          ? CC4
    BEGIN                                                                CC4
      PREVIOUS := CURRENT;                  _ SET UP NEW PREVIOUS      ? CC4
      CURRENT  := BFTCHAIN;                 _ CHAIN TO NEXT BUFFER     ? CC4
    END;                                                                 CC4
                                                                         CC4
  END;                                                                   CC4
                                                                         CC4
END;                                                                     CC4
