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-18070
*   RELOC: PART OF 24998-12001
*   PGMR: BG & JTS
* 
      HED ".TTOI" - TRIPLE TO AN INTEGER POWER. 
      NAM .TTOI,7 24998-1X070 REV.2013 791019 
* 
      ENT .TTOI 
      EXT .TDIV,.TPWR,.CFER,.4ZRO 
* 
A     EQU 0 
B     EQU 1 
* 
*     .TTOI RAISES A TRIPLE-PRECISION BASE TO AN INTEGER POWER
*     PRODUCING A TRIPLE-PRECISION RESULT.
* 
*     CALLING SEQUENCE: 
* 
*                   JSB .TTOI 
*                   DEF <RESULT>
*                   DEF <BASE>
*                   DEF <POWER> 
*                   <ERROR RETURN>    (A,B) = ASCII "12UN"
*                   <NORMAL RETURN> 
* 
*     THE ERROR RETURN IS TAKEN IF THE BASE IS ZERO AND THE POWER IS
*     NEGATIVE OR ZERO.  OVERFLOW PRODUCES THE MAXIMUM POSITIVE NUMBER
*     WITH THE OVERFLOW BIT SET, WHILE UNDERFLOW PRODUCES ZERO WITH THE 
*     OVERFLOW BIT SET. 
* 
*     FOR NEGATIVE POWERS, X**(-I) IS COMPUTED AS 1/X**I, SO IF THE 
*     ABSOLUTE VALUE OF THE RESULT IS IN [2**-129,2**-127], UNDERFLOW 
*     WILL OCCUR EVEN THOUGH THE RESULT IS IN RANGE.
      SPC 4 
*                   COPY ADDRESSES, GET POWER.
* 
.TTOI NOP 
      STA SAVEA 
      STB SAVEB     SAVE A,B BECAUSE ARG ADDRESSES MIGHT BE THERE 
      JSB ENTR1 
      STA RESLT 
      JSB ENTR1 
      STA BASE
      JSB ENTR1 
      STA POWER 
      LDA SAVEA     ARG MIGHT BE IN A OR B
      LDB SAVEB 
      LDA POWER,I 
      STA POWER 
      LDB BASE
      CLO           JUST IN CASE. 
      LDB B,I       BASE = 0 ?
      SZB,RSS 
      JMP Z$$I      YES.
      SZA,RSS       POWER = 0 ? 
      JMP ONE       YES, RESULT = 1.0 
      SKP 
*                   SET RESULT = X ** IABS(I).
* 
      SSA           TAKE ABS VALUE. 
      CMA,INA 
      CPA =D1       X**1 ?
      JMP X$$1      YES, DONE.
      JSB .TPWR     USE .TPWR TO DO THE WORK. 
RESLT DEF *-* 
BASE  DEF *-* 
* 
*                   INVERT IF POWER < 0.
* 
FLIP  LDA POWER     POWER < 0 ? 
      SSA,RSS 
      JMP EXIT      NO, DONE. 
      LDA RESLT,I   A = FIRST WD RESULT.
      SOC H         YES, DON'T INVERT IF OVERFLOW 
      SZA,RSS       (UNDERFLOW SETS OFL BIT)
      JMP *+2 
      JMP ZERO      JUST RETURN ZERO & OFL=1
      JSB .TDIV     INVERT FOR NEGATIVE POWERS
      DEF RESLT,I 
TONEP DEF TONE
      DEF RESLT,I 
EXIT  ISZ .TTOI     GOOD RETURN 
      JMP .TTOI,I   EXIT
* 
*                   SPECIAL CASES & ERROR PROCESSING. 
* 
Z$$I  SZA           POWER <= 0 ?
      SSA 
      JMP ERROR     YES, ERROR. 
ZERO  LDA ZEROP 
      JMP *+2 
ONE   LDA TONEP 
      STA BASE      SET UP CFER 
      CLB,INB       SET POWER = 1 TO FORCE SIMPLE COPY. 
      STB POWER 
X$$1  JSB .CFER     JUST COPY ARG, 0.0 OR 1.0 
      DEF RESLT,I 
      DEF BASE,I
      JMP FLIP      IF ARG, MIGHT YET INVERT IT.
ERROR LDA =A12      RETURN (A,B) = ASCII "12UN" 
      LDB =AUN
      JMP .TTOI,I 
* 
ENTR1 NOP           ROUTINE TO GET NEXT ADDR IN PARAM LIST
      LDA .TTOI     ADDR ADDR PARAM 
      ISZ .TTOI 
      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 
T2    BSS 1 
* 
*                   LOCALS & CONSTANTS
* 
POWER BSS 1         REMAINING BITS OF IABS(POWER) 
      SUP 
ZEROP DEF .4ZRO+0 
TONE  DEY 1.0 
      UNS 
      END 
                                                                          