ASMB,R,Q,C
*     NAME:   LIMSG 
*     SOURCE: 92070-18322 
*     RELOC:  92070-1X322 
*     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 LIMSG,6  92070-1X322  REV.2040  800721
      ENT LIMSG 
* 
* LIMSG IS A SPECIAL ROUTINE PROVIDED FOR BASIC ON RTE-L. 
* IT AUTOMATICALLY LOCKS THE MEMORY BEHIND THE CALLING PROGRAM, 
* AND RETURNS THE TOP ADDRESS AVAILABLE, AS WELL AS THE 
* TOP ADDRESSES OF THE HIGHEST AND SECOND HIGHEST SEGMENT.
* THIS ROUTINE, PROVIDED FOR UNMAPPED RTE-L, ASSUMES THE
* PROGRAM WAS LOADED TO RUN IN BACKGROUND.
* IT DOES NOT ASSUME THE  PROGRAM IS SEGMENTED. 
* 
* 
      EXT $HIGH,$LOW,$CSEG,$SISZ
      EXT $LIBR,.ENTP,$LOBP,$LIBX,$ROM
* 
* 
A     EQU 0 
B     EQU 1 
* 
* 
NUMSG NOP           FOR SAVING THE NUMBER OF SEGMENTS 
* 
* THIS IS THE BLOCK OF THE PASSED PARAMETER ADDRESES
* 
LSEG  NOP           LARGEST SEGMENT TOP ADDRESS 
SLSEG NOP           SECOND LARGEST SEGMENT TOP ADDRESS
LWAM  NOP           LAST WORD OF AVAILABLE MEMORY 
* 
LIMSG NOP           TRUE ENTRY POINT
      JSB $LIBR     TURN OFF MEMORY PROTECT 
      NOP 
      JSB .ENTP     PICK UP PARAMETER ADDRESSES 
      DEF LSEG
      LDA $CSEG,I   GET ID WORD WITH ALL MEM BIT
      IOR =B100000  SET ALL MEM BIT 
      STA $CSEG,I   SET ALL MEM BIT IN ID 
* 
      LDA $ROM      RETURN LAST WORD AVAILABLE MEMORY 
      ADA =D-1      ACCOUNT FOR STARTING BOUNDARY OF ROM
      STA LWAM,I
      LDA $HIGH,I   GET HIGH MAIN TO INITIALIZE RETURNS 
      STA LSEG,I    SET UP RETURNS TO A KNOWN INITIAL VALUE 
      STA SLSEG,I   FOR ALGORITHM BELOW AND NO SEG RETURN 
* 
      LDA $LOBP,I   GET NUMBER OF SEGS
      CLB 
      RRL 6         PUT THE NUMBER OF SEGMENTS IN B 
      CMB,INB,SZB,RSS   TAKE TWO'S COMPLIMENT 
      JMP NOSGS     THERE ARE NO SEGMENTS 
* 
      STB NUMSG     SAVE THE NUMBER OF SEGMENTS 
      LDB $LOW,I    GET LOW MAIN TO FIND SHORT IDS
      ADB =D4       POINT TO WORD 5 OF FIRST SHORT ID 
* 
LP    LDA B,I       GET HIGH MAIN ADDR OF SEGMENT 
      CMA,CLE,INA   COMPLIMENT, AND USE E TO TEST CONDITION 
      ADA LSEG,I    COMPARE WITH LAST LARGEST SEG 
      SEZ,RSS       E ZERO MEANS NEW LARGEST FOUND
      JMP NEWLG     NEW LARGEST WAS FOUND 
* 
      LDA B,I       GET HIGH SEGMENT ADDRESS AGAIN
      CMA,CLE,INA   COMPLIMENT IT, CLEAR E FOR TEST 
      ADA SLSEG,I   COMPARE WITH SECOND LARGEST SEGMENT 
      LDA B,I       RESTORE A FOR CONDITIONAL STORE 
      SEZ,RSS       E ZERO MEANS NEW SECOND LARGEST FOUND 
      STA SLSEG,I   THIS SEGMENT IS NEW SECOND LARGEST
      JMP BUMP      GO CHECK THE NEXT SEGMENT 
* 
NEWLG LDA LSEG,I    MAKE THE OLD LARGEST THE NEW SECOND LARGEST 
      STA SLSEG,I 
      LDA B,I       GET HIGH MAIN ADDRESS OF SEGMENT
      STA LSEG,I    SAVE FOR ALGORITHM AND POSSIBLE RETURN
BUMP  ADB $SISZ     BUMP TO NEXT SEGMENT
      ISZ NUMSG 
      JMP LP
* 
NOSGS JSB $LIBX     RETURN TO CALLER
      DEF LIMSG 
      END 
                                                                                                                                                                                        