ASMB,Q,C
      NAM RETBF,7 92060-16102 REV. 1913 780630
* 
* 
******************************************************************
* (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1978. ALL RIGHTS RESERVED 
* NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, REPRODUCED, OR
* TRANSLATED TO ANOTHER PROGRAM LANGUAGE WIOTH OUT THE PRIOR
* WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. 
******************************************************************* 
* 
* 
*     SOURCE:    92067-18085
*     RELOC:     92067-16085
* 
* 
*****************************************************************:
      EXT .ENTR,ENDM,AVLM,UNMEM,UNM2
      ENT RETBF 
      SKP 
* 
* TITLE: RETBF
*        RETURN BUFFER
* 
* ABSTRACT: 
* 
* RETBF RETURNS A USER'S BUFFER TO THE BUFFER POOL, AND 
* COALESCES UNUSED BUFFERS AROUND THE UNUSED MEMORY 
* BUFFER WHEN THE BUFFER BEING RELEASED IS ADJACENT TO
* THE UNUSED MEMORY BUFFER. 
* 
* CALLING SEQUENCE: 
* 
*      JSB RETBF
*       DEF *+2 
*       DEF (USER'S PRIMARY POINTER)
* 
*       UNMEM, UNM2, AVLM, AND ENDM MUST BE INITIALIZED 
* 
* 
* ON EXIT:
* 
* A-REG CONTAINS ERROR INDICATOR
*  0 IMPLIES NO ERROR 
* -1 IMPLIES BAD POINTER
* 
* 
PPTR  BSS 1         ADDRESS TO USER'S PRIMARY POINTER 
RETBF NOP 
      JSB .ENTR 
      DEF PPTR
* 
      LDA PPTR,I    SET UP POINTER TO BUFFER
      ADA MOVRZ 
      STA T1
      INA 
      STA T2
      INA 
* 
      LDB T2,I      IS THE PRIMARY POINTER GOOD?
      CPA B,I 
      RSS 
      JMP ERROR 
* 
      CLA           YES 
      STA T2,I      CLEAR BUFFER'S PRIMARY POINTER
      STA PPTR,I    CLEAR USER'S PRIMARY POINTER
* 
* 
* 
* COALESCE UNUSED BUFFERS 
* 
*    NOTE: IT IS GAURANTEED THAT THERE EXISTS 1 UNUSED BUFFER,
*    I.E., THE UNUSED MEMORY BUFFER POINTED TO BY UNMEM.
* 
* 
* 
      LDB T1        IS IT NECESSARY TO COALESCE BUFFERS?
      ADB T1,I
      ADB OVRSZ 
      CLA 
      CPB UNMEM 
      RSS 
      JMP RETX        NO, GO EXIT 
* 
      LDA AVLM        YES,START AT TOP OF MEMORY
      STA UNMEM 
      INA 
      STA UNM2
* 
      CLA           INITIALIZE POINTER TO START OF
      STA T1          UNUSED MEMORY TO ZERO 
      STA SIZE      INITIALIZE SIZE TO 0
* 
RET10 LDA UNMEM     ARE THERE ANY MORE BUFFERS? 
      STA B 
      INB 
      CMB,INB         IS UNMEM .LT. ENDM
      ADB ENDM
      SSB 
      JMP RET30 
* 
      LDA UNM2,I    DOES THIS BUFFER HAVE A 
      SZA             A PRIMARY POINTER 
      JMP RET20     YES,GO FIND ANOTHER GROUP OF BLOCKS 
* 
      LDA T1        IF THIS IS THE FIRST UNUSED 
      SZA             BUFFER IN THIS BLOCK
      JMP RET15       THEN SAVE IT'S ADDRESS
* 
      LDA UNMEM 
      STA T1
* 
RET15 LDA UNMEM,I   INCREASE SIZE OF UNUSED MEMORY
      ADA SIZE
      ADA OVRSZ 
      STA SIZE
      JMP RET25 
* 
RET20 CLA           INITIALIZE ADDRESS OF UNUSED
      STA T1          MEMORY TO ZERO
      STA SIZE      INITIALIZE SIZE OF UNUNSED BLOCK TO ZERO
* 
RET25 LDA UNMEM 
      ADA UNMEM,I 
      ADA OVRSZ 
      STA UNMEM 
      INA 
      STA UNM2
      JMP RET10 
* 
* 
RET30 LDA T1        INITIALIZE UNUSED MEMORY OVERHEAD 
      SZA,RSS       IN CASE OF DEBUG ERROR
      JMP ERROR       RETURN NEGETIVE ONE 
* 
      STA UNMEM       NOTE: IT IS GAURANTEED THAT T1 HAS
      INA               A VALUE OTHER THAN ZERO BECAUSE 
      STA UNM2          GETBF ALWAYS PROVIDES FOR AT LEAST
      LDA SIZE          ONE UNUSED BUFFER AT THE END OF MEMORY
      ADA MOVRZ 
      STA UNMEM,I 
* 
      CLA           INITIALIZE BUFFER'S PRIMARY 
      STA UNM2,I      POINTER TO ZERO 
RETX  JMP RETBF,I   RETURN ERROR INDICATOR IN A-REG 
* 
* 
* 
* ERROR PROCESSOR 
* 
* 
ERROR CCA           RETURN -1 IN A-REG
      JMP RETX
      SKP 
* 
* 
* 
*  DATA 
* 
* 
* 
OVRSZ DEC 2         SIZE OF BUFFER OVERHEAD 
MOVRZ DEC -2        MINUS SIZE OF BUFFER OVERHEAD 
* 
* 
T1    BSS 1         TEMPORARY MEMORY POINTER
T2    BSS 1         TEMPORARY POINTER TO OVERHEAD WORD 2
* 
SIZE  BSS 1         SIZE OF UNUSED MEMORY WHENEVER BUFFERS
*                                     AROUND THE UNUSED-MEMORY BUFFER 
*                                     ARE COALESCED 
* 
A     EQU 0         REFERS TO A-REGISTER
B     EQU 1         REFERS TO B-REGISTER
      END 
                                                                                                                                                                                                                                            