*COMDECK BUFMAINT 
         NAM   BUFMAINT 
****************************************
*                                      *
* B U F F E R   M A I N T E N A N C E  *
*                                      *
****************************************
* 
* 
* 
*    THE FOLLOWING PROCEDURES PROVIDE THE SOFTWARE INTERFACE TO 
*    FIRMWARE BUFFER MAINTENANCE ROUTINES.
* 
* 
         ENT   PBGET1BF 
         ENT   PBREL1BF 
          ENT    PBRELCHN 
          ENT    PBRELZRO 
         EXT   PFBUGET
         EXT   PFBURLS
         EXT   PFBUEXT
         EXT   QTOPSK 
         EXT   PBHALT 
         EXT   J0NOBUFRS
         EXT   BECHAIN
         EXT   BEMSK
         EXF   BEBAC
         EJT
************************************************************************
*                                                                      *
*              * *   P B G E T 1 B F   * *                             *
*                                                                      *
*              ALLOCATE ONE BUFFER                                     *
*                                                                      *
************************************************************************
* 
*              NON-RECURSIVE, NON INTERRUPTABLE                        *
*                                                                      *
** OVERVIEW -  PBGET1BF ALLOCATES ONE BUFFER FROM THE SPECIFIED BUFFER *
*              POOL.  THE FIRMWARE DOES ALL THE WORK, THIS ROUTINE IS  *
*              ONLY THE ENTRY CODE.  THE FIRMWARE RETURNS FROM THE EMSQ*
*              +0 IF THE INTERRUPTS ARE TO BE ENABLED, +1 IF THEY ARE  *
*              NOT TO BE ENABLED.  IN EACH CASE Q CONTAINS THE CALLERS *
*              RETURN ADDRESS.                                         *
*              IF THERE ARE NO BUFFERS LEFT, THEN THE FIRMWARE RETURNS *
*              +2.  SPECIAL OUT OF BUFFERS PROCESSING WILL BE DONE.    *
*              THE A REGISTER CONTAINS THE ALLOCATED BUFFER ADDRESS.   *
** INPUT -                                                             *
*              BECTPTR  - POINTER TO THE BUFFER CONTROL BLOCK          *
*                                                                      *
** OUTPUT -    ONE BUFFER ADDRESS                                      *
*                                                                      *
** NOTE        THIS ROUTINE IS SET UP AS A PASCAL FUNCTION.            *
*              THIS ROUTINE REQUIRES THAT THE SIZE OF BUFFER CONTROL   *
*              BLOCKS REMAINS 8 WORDS.  IF THE SIZE CHANGES, THE INA 8 *
*              INSTRUCTION USED FOR MOVING TO THE NEXT BUFFER CONTROL  *
*              BLOCK SHOULD BE CHANGED ACCORDINGLY.                    *
*                                                                      *
************************************************************************
* 
* 
PBGET1BF NOP   0
         IIN   0         INHIBIT INTERRUPTS 
PBGT1    LDQ   PFBUGET        ADDRESS OF FIRMWARE BUFFER GET
         EMS   Q         ESCAPE TO MICRO-SEQUENCE 
* 
*              FIRMWARE RETURNS HERE IF INTERRUPTS ARE TO BE ENABLED
* 
         EIN   0         ENABLE INTERRUPTS WHEN ZERO
         JMP   0,Q       RETURN TO CALLER 
* 
         EJT
************************************************************************
*                                                                      *
*              * *   P B R E L 1 B F   * *                             *
*                                                                      *
*              RELEASE ONE BUFFER                                      *
*                                                                      *
************************************************************************
*                                                                      *
*              NON-RECURSIVE, NON INTERRUPTABLE                        *
*                                                                      *
** OVERVIEW -  PBREL1BF RETURNS A SINGLE BUFFER TO THE SPECIFIED BUFFER*
*              POOL.  THE BUFFER ADDRESS PASSED MAY POINT TO ANY WORD  *
*              WITHIN THE BUFFER.  THE FIRMWARE DOES ALL THE WORK, THIS*
*              ROUTINE IS ONLY THE ENTRY CODE.                         *
*              THE FIRMWARE WILL RETURN +0 IF INTERRUPTS ARE TO BE     *
*              ENABLED, +1 IF NOT.  Q WILL CONTAIN THE CALLERS RETURN  *
*              ADDRESS                                                 *
*                                                                      *
** INPUT                                                               *
*              BABUFPTR - POINTER TO THE FIRST BUFFER                  *
*              BECTPTR  - POINTER TO THE BUFFER CONTROL BLOCK          *
*                                                                      *
** OUTPUT -    BUFFER RELEASED TO THE APPROPIATE BUFFER POOL           *
*                                                                      *
************************************************************************
* 
* 
PBREL1BF NOP   0
         IIN   0         INHIBIT INTERRUPTS 
          ENA    0            SINGLE BUFFER RELEASE INDICATOR 
          LDQ    PFBURLS      FIRMWARE BUFFER PUT ROUTINE 
          EMS    Q            ESCAPE TO THE FIRMWARE
* 
*              FIRMWARE RETURNS HERE IF INTERRUPTS ARE TO BE ENABLED
* 
         EIN   0         ENABLE WHEN QTOPSK=0 
          JMP    0,Q          RETURN TO CALLER
          EJT 
************************************************************************
*                                                                      *
*              * *   P B R E L C H A I N   * *                         *
*                                                                      *
*              MULTIPLE BUFFER RELEASE ROUTINE                         *
*                                                                      *
************************************************************************
*                                                                      *
*              NON-RECURSIVE, NON-INTERRUPTABLE                        *
*                                                                      *
** OVERVIEW -  PBRELCHAIN RELEASE A CHAIN OF BUFFERS OF THE SAME       *
*              SIZE TO THE FREE BUFFER POOL.  THE BUFFER POINTER       *
*              PASSED MAY POINT TO ANY WORD WITHIN THE FIRST BUFFER.   *
*              THIS CODE EXISTS BECAUSE PASCAL CANNOT CALL THE FIRM-   *
*              WARE DIRECTLY.  THE FIRMWARE DOES ALL THE WORK, THIS    *
*              ROUTINE IS ONLY ENTRY CODE.                             *
*                                                                      *
** INPUT -                                                             *
*              BABUFPTR - POINTER TO THE FIRST BUFFER                  *
*              BECTPTR  - POINTER TO THE BUFFER CONTROL BLOCK          *
*                                                                      *
** OUTPUT -    BUFFERS RELEASED TO THE APPROPIATE BUFFER POOL          *
*                                                                      *
************************************************************************
* 
* 
PBRELCHN  NOP    0            CALLERS RETURN ADDRESS
          IIN    0            INHIBIT INTERRUPTS
PBRCH1    ENA    1            INDICATE MULTIPLE RELEASE TO FIRMWARE 
          LDQ    PFBURLS      FIRMWARE BUFFER RELEASE ADDRESS 
          EMS    Q            ESCAPE TO MICRO SEQUENCE
* 
*              ---- FIRMWARE RETURNS HERE IF INTERRUPTS ARE TO
*                   BE ENABLED, OTHERWISE + 1.  Q CONTAINS CALLERS
*                   RETURN ADDRESS
* 
          EIN    0            ENABLE INTERRUPTS 
          JMP    0,Q          RETURN TO CALLER
          EJT 
************************************************************************
*                                                                      *
*              * *   P B R E L Z R O   * *                             *
*                                                                      *
*              MULTIPLE BUFFER RELEASE WITH ZERO CHECK                 *
*                                                                      *
************************************************************************
*                                                                      *
*              NON-INTERRUPTABLE                                       *
*                                                                      *
** OVERVIEW    THIS ROUTINE RELEASES A CHAIN OF BUFFERS OF THE SAME    *
*              SIZE TO THE FREE BUFFER POOL.  IF THE BUFFER ADDRESS    *
*              PASSED IS ZERO NO ACTION IS TAKEN.  THIS ROUTINE IS THE *
*              ENTRY CODE FOR THE FIRMWARE.  ALL RELEASING IS DONE BY  *
*              THE FIRMWARE.                                           *
*                                                                      *
** INPUT -                                                             *
*              BABUFPTR - POINTER TO THE FIRST BUFFER                  *
*              BECTPTR  - POINTER TO THE BUFFER CONTROL BLOCK          *
*                                                                      *
** OUTPUT -    BUFFERS RELEASE TO THE APPROPIATE BUFFER POOL           *
* 
************************************************************************
* 
* 
PBRELZRO  NOP    0            ENTRY ADDRESS 
          IIN    0            INHIBIT INTERRUPTS
          LDQ*   PBRELZRO     ADDRESS OF RETURN 
          STQ    PBRELCHN     SET UP PBRELCHN ROUTINE 
          LDQ    0,Q          GET BUFFER POINTER ADDRESS
          LDA    0,Q          BUFFER ADDRESS
          SAZ    EXIT         EXIT IF NO BUFFER SPECIFIED 
          JMP    PBRCH1       GO RELEASE CHAIN OF BUFFERS 
EXIT      RAO*   PBRELZRO     ADJUST RETURN 
          RAO*   PBRELZRO     ADJUST RETURN 
          LDQ    QTOPSK       NESTING QUEUE 
          SQN    1            SKIP IF NESTED
          EIN    0            ENABLE INTERRUPTS 
          JMP*   (PBRELZRO)   RETURN TO CALLER
         END
