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-18132
*   RELOC: PART OF 24998-12001
*   PGMR: BG & JTS
* 
      HED ".TTOT" - TRIPLE TO A TRIPLE POWER. 
      NAM .TTOT,7 24998-1X132 REV.2013 791019 
* 
      ENT .TTOT 
      EXT .LOG,.EXP,.CFER,.TMPY,.4ZRO 
* 
B     EQU 1 
* 
*     .TTOT RAISES A TRIPLE-PRECISION NUMBER TO A 
*     TRIPLE-PRECISION POWER: X**Y = .EXP(Y*.LOG(X))
* 
*     CALLING SEQUENCE: 
* 
*                   JSB .TTOT 
*                   DEF <RESULT>
*                   DEF <BASE>
*                   DEF <POWER> 
*                   <ERROR RETURN>  (A,B) = ASCII "13UN" (ERROR)
*                   <NORMAL RETURN>            OR "07OF" (OVERFLOW) 
* 
*     THE ERROR RETURN IS TAKEN IF (X<0) OR (X=0 AND Y<=0) OR 
*     (RESULT >= 2**127).  UNDERFLOW PRODUCES ZERO. 
* 
*     ACCURACY NOTE:  ABOUT LOG2(Y*.LOG(X)) BITS ARE LOST BY ERROR
*     PROPOGATION FROM THE ERROR IN Y*.LOG(X) .  FOR EXAMPLE, WHEN
*     THE RESULT IS 8.9E6, ABOUT 4 BITS ARE LOST.  TO CORRECT THIS
*     ERROR, THE LOG AND MULTIPLY WOULD HAVE TO BE ACCURATE TO AN 
*     ADDITIONAL 6-7 BITS AND THE EXP WOULD HAVE TO BE CORRECTED
*     BY THE FIRST TAYLOR SERIES TERM, I.E. IF Z=Y*.LOG(X) TO EXTRA 
*     PRECISION, ZU=(Z ROUNDED TO 4 WORDS) AND ZL=Z-ZU, THEN THE
*     CORRECTED RESULT WOULD BE:  .EXP(ZU)*(1.0+ZL) 
      SPC 4 
*              TAKE .LOG(X), IMPLICITLY CHECKING FOR X <= 0 . 
* 
.TTOT NOP 
      STA SAVEA 
      STB SAVEB     SAVE A,B IN CASE WE INDIRECT THRU THEM
      JSB ENTR1 
      STA RESLT 
      JSB ENTR1     GET ADDRESS OF BASE 
      STA BASE
      JSB ENTR1     GET ADDRESS OF POWER
      STA POWER 
      JSB .LOG      TAKE .LOG(X)
      DEF *+3 
      DEF LOGX
BASE  DEF *-* 
      JMP XLEZ      IF X <= 0 
      SKP 
*                   TAKE .EXP(Y*.LOG(X))
* 
      JSB .TMPY     Y*.LOG(X) 
      DEF YLOGX 
      DEF LOGX
POWER DEF *-* 
      SOS           MULTIPLY OVERFLOWED ? 
      JMP TTOT1     NO. 
      LDA LOGX      YES. DETERMINE SIGN OF Y*.LOG(X)
      XOR POWER,I 
      SSA           <0 ?
      JMP UFL       YES, UNDERFLOW. GO RETURN ZERO. 
TTOT1 JSB .EXP      .EXP(Y*.LOG(X))  (OFL IF MPY OFL) 
      DEF *+3 
RESLT DEF *-* 
      DEF YLOGX 
      JMP .TTOT,I   OFL IN .EXP 
TTOT2 ISZ .TTOT     GOOD RETURN 
      JMP .TTOT,I   EXIT
* 
*                   X<=0 : IF X=0 AND Y>0 THEN RESULT=0, ELSE ERROR 
* 
XLEZ  LDA BASE,I    X, FIRST WORD.
      LDB POWER,I   Y, FIRST WORD.
      IOR B         - IFF X<0 OR Y<0. 
      SSA,RSS       X<0 OR Y<0
      SZB,RSS           OR Y=0 ?
      JMP ERROR     YES, ERROR
UFL   JSB .CFER     NO, RESULT = 0
      DEF RESLT,I 
      DEF .4ZRO+0 
      CLO           RETURN OVERFLOW CLEAR.
      JMP TTOT2     EXIT
* 
*                   ERROR PROCESSING
* 
ERROR LDA =A13      (A,B) = ASCII "13UN"
      LDB =AUN
      JMP .TTOT,I   TAKE ERROR EXIT 
* 
*                   LOCALS, CONSTANTS 
* 
ENTR1 NOP           ROUTINE TO GET NEXT ADDR IN PARAM LIST
      LDA .TTOT     ADDR ADDR PARAM 
      ISZ .TTOT 
      LDB SAVEB     RESTORE ORIGINAL B
ENTR2 STA T2        SAVE ADDR TO INDIRECT THRU
      LDA SAVEA     RESTORE ORIGINAL A
      LDA T2,I      DO THE INDIRECT 
      RAL,CLE,SLA,ERA 
      JMP ENTR2     INDIRECT BIT WAS SET, TRY AGAIN 
      JMP ENTR1,I   EXIT
* 
SAVEA BSS 1 
SAVEB BSS 1 
* 
LOGX  BSS 4         .LOG(X) 
T2    BSS 1 
YLOGX BSS 4         Y*.LOG(X) 
      END 
                                                                                                                                                                  