ASMB,L,R,C
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  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.        * 
*  **************************************************************** 
* 
*   NAME: PART OF MATH LIBRARY
*   SOURCE:  24998-18XXX  SEE NAM FOR LAST THREE DIGITS 
*   RELOC: PART OF 24998-12001
*   PGMR: BG & JTS
* 
      HED ".MXMN" - TRIPLE PRECISION MAX & MIN. 
      NAM .MXMN,7 24998-1X059 REV.2001 781021 
* 
      ENT .MAX1,.MIN1 
      EXT .CFER,.TSUB,.4ZRO 
* 
B     EQU 1 
* 
*     .MXMN TAKE THE MAX OR MIN OF A LIST OF TRIPLE PRECISION NUMBERS.
* 
*     CALLING SEQUENCE: 
* 
*                   JSB <ROUTINE>    .MAX1 OR .MIN1 
*                   DEF *+N+2 
*                   DEF <RESULT>
*                   DEF <ARG 1> 
*                    .     .
*                    .     .
*                   DEF <ARG N> 
*                   <RETURN>
* 
*     IF N=0, ZERO IS RETURNED.  IF N=1, THE ARGUMENT IS RETURNED.
      SPC 2 
*                   INITIALIZE... SET MIN VS. MAX, CHECK # PARAMS 
* 
.MAX1 NOP 
      LDA .MAX1     COPY ENTRY PT 
      STA .MIN1 
      LDB SSBRS     SET TEST TO "SSB,RSS" 
      JMP MXMN1 
.MIN1 NOP 
      LDA .MIN1     SET TEST TO "SSB" 
      LDB SSB 
MXMN1 STB TEST
      CMA           -*-1 IN "DEF *+N+2" 
      ADA .MIN1,I   (-*-1)+(*+N+2) = N+1
      LDB .MIN1,I   SET RETURN ADDR 
      STB .MAX1 
      ISZ .MIN1 
      LDB .MIN1,I   SET RESULT ADDR 
      STB RESLT 
      ISZ .MIN1 
      CMA,INA       -N-1
      CCE,INA,SZA,RSS  N=0 ?     (E=1)
      JMP ZERO      YES 
      STA N 
      LDA .MIN1,I   SET CURRENT MIN/MAX = ARG 1 
      STA CMM 
      LDA .MIN1     SET UP INDEX TO PARAM LIST
      RAL,ERA       (SET SIGN TO INDIRECT)
      STA NEXT
      JMP MXMN5 
      SKP 
*                   LOOK THRU LIST FOR NEW MIN/MAX
* 
MXMN2 ISZ NEXT      ADDR NEXT ARG 
      LDA CMM,I     IF SIGNS DIFFER, DON'T SUBTRACT 
      LDB NEXT,I
      XOR B 
      SSA 
      JMP MXMN4     DIFFER, USE (NEXT) AS COMPARE VALUE 
      JSB .TSUB     SAME, TAKE (THIS ARG) = (CURRENT MIN/MAX) 
      DEF DIFF
NEXT  DEF *-*       INDIRECT THRU PARAM LIST
CMM   DEF *-*       ADDR CURRENT MIN/MAX
      SOS           UNDERFLOW ? (OFL CAN'T HAPPEN)
      JMP MXMN3     NO. 
      JSB .CFER     YES. SCALE NUMBERS & DO AGAIN.
      DEF DIFF
      DEF NEXT,I
      JSB .CFER 
      DEF TEMP
      DEF CMM,I 
      LDA DIFF+3
      ADA =D112     BUMP EXP BY 56. 
      STA DIFF+3
      LDA TEMP+3
      ADA =D112 
      STA TEMP+3
      JSB .TSUB 
      DEF DIFF
      DEF DIFF
      DEF TEMP
MXMN3 LDB DIFF      TEST DIFFERENCE 
MXMN4 LDA NEXT      ADDR POSSIBLE NEW MIN/MAX 
TEST  ABS *-*       MIN: SSB     MAX: SSB,RSS 
      STA CMM       IF NEW MIN/MAX
MXMN5 ISZ N         MORE ?
      JMP MXMN2     YES.
      LDA CMM       RESULT ADDR 
* 
*                   COPY RESULT 
* 
MXMN6 STA SRC 
      JSB .CFER     COPY RESULT 
RESLT DEF *-*       TO RESULT 
SRC   DEF *-* 
      JMP .MAX1,I   EXIT
ZERO  LDA ZEROP     ZERO RESULT, COPY IT
      JMP MXMN6 
      SKP 
*                   LOCALS & CONSTANTS
* 
N     BSS 1         -(# PARAMS LEFT) - 1
DIFF  BSS 4         DIFFERENCE OF COMPARED NUMBERS
TEMP  BSS 4         FOR USE ON UNDERFLOW. 
SSB   SSB           FOR PLUGGING MIN
SSBRS SSB,RSS       FOR PLUGGING MAX
ZEROP DEF .4ZRO+0 
      END 
                                                                                                                                                                        