ASMB,R,Q,C
*     NAME:   LIMEM 
*     SOURCE: 92071-18204 
*     RELOC:  92071-1X204 
*     PGMR:   HLC,DJN 
* 
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980.  ALL RIGHTS      * 
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,       * 
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT * 
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.        * 
*  **************************************************************** 
* 
* 
      NAM LIMEM,6  92071-1X204  REV.2041  800604
      ENT LIMEM 
* 
      EXT .XSA,.XLA,.XLB,.XLD,.XST
      EXT $LIBX,$HIGH,$STAT,$HIBP 
      EXT $SC#,$LIBR,.ENTR,$CSEG,$SEGS
* 
* 
A     EQU 0 
B     EQU 1 
* 
* 
LIMEM NOP           TRUE ENTRY POINT
      JSB $LIBR     DISPATCHING COULD CAUSE TROUBLE 
      NOP 
      LDA LIMEM 
      STA LIM.. 
      CLA 
      STA CSEG      SET UP OPTIONAL PARAMETER DEFAULTS
      STA CLNG
      JMP LIM..+1 
* 
AT$HB NOP           ADDRESS OF ID25 ($HIBP) 
TOPAD NOP           TOP LOGICAL ADDRESS IN PARTITION (PLUS 1) 
SCSIZ NOP           WORDS OF SYSTEM COMMON USED 
* 
WHCH  NOP 
LSEG  NOP 
LLNG  NOP 
CSEG  NOP 
CLNG  NOP 
LIM.. NOP           PSEUDO-ENTRY POINT
      JSB .ENTR     GET PARAMETER ADDRESSES 
      DEF WHCH
      JSB .XLD      GET ADDRESS OF ID25 
      DEF $HIBP 
      STA AT$HB     STORE IT LOCALLY FOR LATER
      JSB .XLD      GET WHAT IS AT $HIBP
      DEF A,I 
      RAL,CLE,ERA   CLEAR THE 'AM' BIT
      LDB WHCH,I
      CCE,SSB,RSS 
      JMP GET       ALLOCATE AVAILABLE MEMORY 
      JSB .XSA      DE-ALLOCATE 
      DEF AT$HB,I 
EXIT  JSB $LIBX 
      DEF LIM.. 
* 
* 
GET   RAL,ERA       SET ALL MEM BIT 
      JSB .XSA
      DEF AT$HB,I 
      JSB .XLD      GET CURRENT SEG HIGH ADDR 
      DEF $CSEG 
      JSB .XLD
      DEF A,I 
      STA CSEG,I
      STA LSEG,I    SAVE START OF FREE MEMORY 
* 
* CALCULATE TOP PHYSICAL ADDRESS AVAILIABLE 
* 
      JSB .XLD      GET STAT WORD 
      DEF $STAT 
      JSB .XLD
      DEF A,I 
      AND =B4000    MASK ALL BUT SC BIT 
      SZA,RSS       SC BIT SET? 
      JMP SUM       NO, DOES NOT USE SYSTEM COMMON
* 
* 
      JSB .XLD      GET SIZE OF SYSTEM COMMON 
      DEF $SC#
SUM   STA SCSIZ     SAVE IT LOCALLY FOR ADD 
      JSB .XLA      FIND OUT PROGRAM SIZE 
      DEF AT$HB,I   A WILL HAVE CONTENTS OF ID25
      AND =B76000   MASK OUT PARTITION NUMBER 
* 
* NOTE THAT THE POSITION OF THE SIZE FIELD RESULTS IN 
* THE SIZE IN WORDS WHEN THE LOWER 10 BITS ARE MASKED.
      ADA =B2000    ADD BASE PAGE SIZE
      ADA SCSIZ     ADD SIZE OF SYSTEM COMMON 
      STA TOPAD     SAVE RESULT FOR LATER 
      JSB .XLD      GET NUMBER OF SEGS
      DEF $SEGS 
      JSB .XLD
      DEF A,I       ID24 NOW IN A 
      CLB 
      RRL 8         PUT THE NUMBER OF SEGMENTS IN B 
      CMB,INB,SZB,RSS 
      JMP NOSGS     NONE
      STB LIMEM     USE ORIG ENTRY AS TEMP WORD 
      JSB .XLB      GET HIGH MAIN ADDRESS PLUS 1
      DEF $HIGH 
      JSB .XLB
      DEF B,I 
      ADB =D-4      POINT TO WORD 5 OF LAST SHORT ID
* 
LP    LDA B,I       HIGH MAIN ADDR OF SEGMENT 
      CMA,CLE,INA   COMPLIMENT, AND USE E TO TEST CONDITION 
      ADA LSEG,I    COMPARE WITH LAST LARGEST SEG 
      LDA B,I       RESTORE A FOR CONDITIONAL STORE 
      SEZ,RSS       E ZERO MEANS NEW LARGEST FOUND
      STA LSEG,I    NEW HIGH, SAVE IT 
      ADB =D-8      BUMP TO NEXT SEGMENT
      ISZ LIMEM 
      JMP LP
* 
NOSGS LDA LSEG,I
      CMA,INA 
      ADA TOPAD     SUBTRACT HIGH SEGMENT FROM END OF MEMORY
      STA LLNG,I    RETURN LENGTH TO CALLER 
* 
      LDA CSEG,I
      CMA,INA 
      ADA TOPAD     SUBTRACT CURRENT SEGMENT FROM END OF MEMORY 
      STA CLNG,I
      JMP EXIT      DONE
* 
      END 
                                                                                                                                                                                                                      