ASMB,Q,C
      NAM TRIM,7 92060-16102 REV. 1913 780628 
* 
* 
******************************************************************
* (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-18086
*     RELOC:     92067-16086
* 
* 
*****************************************************************:
      EXT .ENTR,RETBF,UNMEM,UNM2,ENDM,AVLM
      ENT TRIM
      SKP 
* 
* 
* 
* TITLE: TRIM 
*        TRIM BUFFER
* 
* ABSTRACT: 
* 
* TRIM RETURNS PART OF A BUFFER TO THE BUFFER POOL
* IF THE THE USER POINTER IS INVALID A NEGETIVE 
* ONE IS RETURNED IN THE A-REG
* 
* TRIM ALLOWS A USER TO RETURN THE BOTTOME PORTION OF A BUFFER
* WHILE RETAINING OWNERSHIP OF THE UPPER PART.  THIS ROUTINE
* IS USEFUL IN CASES WHERE THE AMOUNT OF MEMOR REQUIRED IS DETERMINED 
* WHEN THE MEMORY REQUEST IS MADE,(IE. WHEN RECEIBING VARIABLE
* LENGTH PARAMETERS).  THE USER MAY REQUEST THE MAXIMUM BUFFE, RETURNING
* THE UNUSED PORTION WHEN THE MEMORY REQUIRTEMENTS ARE FULLY DETERMINED.
* 
* TRIM IS PASSED THE ADDRESS OF THE USER BUFFER AND THE SIZE OF THE 
* BUFFER IT WISHES TO KEEP.  WHEN THE SIZE OF THE KEEP BUFFER IS
* ZERO THE WHOLE BUFFER IS RETURNED.  WHEN THE SIZE OF THE KEEP-BUFFER
* IS LESS THAN ZERO AN ERROR IS RETURNED IN THE A-REGISTER. 
* 
* 
* 
* CALLING SEQUENCE: 
* 
*     JSB TRIM
*      DEF *+3
*      DEF (USER'S PRIMARY POINTER) 
*      DEF ( SIZE OF BUFFER TO KEEP)
* 
* 
* EXIT: 
*      A-REGISTER CONTAINS A ERROR INDICATOR
*         -1 INDICATES AN ERROR 
*          0 INDICATES NO ERROR 
* 
* 
* 
PRM   BSS 1         ADDRESS TO USER'S PRIMARY POINTER 
KEEP  BSS 1         SIZE OF BUFFER TO KEEP
TRIM  NOP 
      JSB .ENTR 
      DEF PRM 
* 
      LDA KEEP,I    IS KEEP LESS THAN ZERO? 
      SSA 
      JMP TRIMR       YES, THEN ERROR-EXIT
      SZA           IS KEEP EQUAL TO ZERO?
      JMP TRM10 
* 
      JSB RETBF     YES, SET UP TO RETURN ALL THE BUFFER
      DEF *+2 
      DEF PRM,I 
      JMP TRIMX 
* 
*                                   NO, IS THIS A VALID BUFFER? 
* 
TRM10 LDA PRM,I     GET POINTER TO BUFFER'S OVERHEAD
      ADA MOVRZ 
* 
      STA T1
      INA 
      STA T2
      INA 
      LDB T2,I
      CPA B,I      IS THIS A VALID POINTER
      RSS 
      JMP TRIMR       NO, GO PROCESS ERROR
* 
      CLA 
      LDB KEEP,I    IS KEEP SIZE .GT.  SIZE OF BUFFER?
      CMB,INB 
      ADB T1,I
      SSB 
      JMP TRIMR       YES, ERROR-EXIT 
* 
      SZB,RSS       IS KEEP SIZE = BUFFER SIZE? 
      JMP TRIMX       YES, RETURN (NO ERROR)
* 
      ADB MOVRZ     IS THERE ENOUGH ROOM FOR NEW BUFFER?
      SSB 
      JMP TRIMX       NO, GO EXIT (NO ERROR)
* 
      LDA T1        SET UP NEW BUFFER 
      ADA KEEP,I
      ADA OVRSZ 
      STA TT1       GET NEW BUFFER POINTER
      INA 
      STA TT2       NOTE: B-REG CONTAINS SIZE OF NEW BUFFER 
* 
      STB TT1,I     SAVE NEW BUFFER SIZE
* 
      LDA KEEP,I    UPDATE SIZE OF KEEP BUFFER
      STA T1,I
* 
      LDA TT1H      KLUDGE UP TT1 TO ACT AS PRIMARY POINTER 
* 
      STA TT2,I     PUT ADDRESS TO POINTER IN OVERHEAD
      LDA TT1       UPDATE POINTER TO OVERHEAD
      ADA OVRSZ       TO POINT TO USER'S BUFFER 
      STA TT1 
* 
TRM40 JSB RETBF 
      DEF *+2 
      DEF TT1 
* 
*                                   RETURN NO ERROR INDICATOR IN A-REG
* 
TRIMX JMP TRIM,I
* 
* 
* 
* ERROR PROCESSOR 
* 
* 
TRIMR CCA           RETURN -1 IN A-REG INDICATING ERROR 
      JMP TRIMX 
* 
* 
* 
* 
* DATA
* 
* 
* 
TT1H  DEF *+1 
* 
TT1   BSS 1 
TT2   BSS 1 
* 
T1    BSS 1 
T2    BSS 1 
* 
OVRSZ DEC 2 
MOVRZ DEC -2
* 
A     EQU 0 
B     EQU 1 
      END 
                                                                                                                      