*COMDECK PIBUF2 
_$J+? 
_$R-,G-,I-? 
_ 
************************************************************************
*                                                                      *
*              * *   P I B U F 2   * *                                 *
*                                                                      *
*              BUFFER INITIALIZATION COMPLETION                        *
*                                                                      *
************************************************************************
*                                                                      *
** OVERVIEW -  THIS ROUTINE RELEASES THE LAST DATA BUFFERS.  THIS      *
*              ROUTINE IS ITSELF INSIDE OF THE LAST DATA BUFFER        *
*                                                                      *
** INPUTS -                                                            *
*              CLBFSPACE - ADDRESS OF PLACE TO CONTINUE RELEASING BUFFS*
*              B3SBUF    - END OF BUFFER AREA                          *
*                                                                      *
** OUTPUTS -   RELEASED BUFFERS                                        *
*                                                                      *
** EXTERNAL SUBROUTINES USED -                                         *
*              PBREL1BF - RELEASE A BUFFER                             *
*              UNLOCK   - ENABLE INTERRUPTS                            *
*              PBMON    - START SYSTEM                                 *
*                                                                      *
** NOTE -      THE LAST BUFFER RELEASED MUST CONTAIN THE CALL TO       *
*              RELEASE IT.                                             *
*                                                                      *
************************************************************************
* 
? 
PROCEDURE PIBUF2; 
  
VAR 
      R3SBUF : B0OVERLAY;                   _START OF RELEASE AREA     ?
      R3EBUF : B0OVERLAY;                   _END OF RELEASE AREA       ?
      R3CPTR : B0OVERLAY;                   _POINTER TO CLEAR MEMORY   ?
      R3RBUF : B0BUFPTR;                    _BUFFER RELEASE POINTER    ?
  
BEGIN 
_ 
* * * *  CALCULATE START AND END OF RELEASE AREA
? 
R3SBUF.BAINT := CLBFSPACE;                  _PICK UP FROM PHASE 1      ?
R3EBUF.BAINT := B3EBUF.BAINT - DBUFLENGTH;  _CALCULATE END ADDRESS     ?
R3EBUF.BASET := R3EBUF.BASET -              _MASK TO EVEN BOUNDARY     ?
                BEDBSIZE'.BEMSK.BASET;
_ 
* * * *  CLEAR BUFFERS TO BE RELEASED 
? 
R3CPTR.BAINT := R3SBUF.BAINT - 1;           _INITIALIZE CLEAR POINTER  ?
REPEAT
  R3CPTR.BAINT     := R3CPTR.BAINT + 1;     _BUMP CLEAR POINTER        ?
  R3CPTR.BAINTPTR' := 0;                    _CLEAR MEMORY WORD         ?
UNTIL R3CPTR.BAINT = R3EBUF.BAINT;          _UNTIL ALL WORDS CLEARED   ?
_ 
* * * *  RELEASE REMAINING BUFFERS
? 
REPEAT
  R3RBUF := R3SBUF.BABUFPTR;                _BUFFER ADDRESS TO RELEASE ?
  PBREL1BF (R3RBUF, BEDBSIZE);              _RELEASE THE BUFFER        ?
  R3SBUF.BAINT := R3SBUF.BAINT + DBUFLENGTH;_CALCULATE NEW BUFFER ADDR ?
UNTIL R3SBUF.BAINT = R3EBUF.BAINT;
  
    B1BUFF := R3SBUF.BABUFPTR;              _ SAVE LAST BUFPTR GLOBAL  ?
_ 
*              ---- FOLLOWING CODE MUST BE LOADED AFTER $FFC0 ----
? 
    PBCLR    (B1BUFF, DBUFLEN);             _ CLEAR AND                ?
    PBREL1BF (B1BUFF, BEDBSIZE);            _ RELEASE THE LAST BUFFER  ?
    INST ($E000,$8008,                      _ LOAD Q DEFINE MICRO INT 8?
          $C000,CICLKADT,                   _ LOAD A WITH CLOCK ADT    ?
          $0B06,                            _ DMI                      ?
          $E000,$00F3,                      _ ENABLE REAL TIME CLOCK   ?
          $0B00,                            _ NOP                      ?
          $03FE);                           _ OUT  -1                  ?
    INST ($1C1,$B00);                       _ CLEAR PROTECT FAULT      ?
    UNLOCK;                                 _ UNLOCK INTERRUPTS        ?
    NPINTAB.NPISFL.B0B15 := TRUE;           _ TRACE INIT STATUS        ?
    INST($E400,                             _LOAD Q REGISTER           ?
         B1DMTA,                            _  WITH ADDRESS OF DEADMAN ?
                                            _   TIMER RESET CODE       ?
         $0BA2);                            _ AND EXECUTE THAT         ?
                                            _  MICROSEQUENCE           ?
    PBMON;                                  _ ENTER MONITOR            ?
  
END;   _ PIBUF2 ? 
