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 * DEF * DEF * (A,B) = ASCII "13UN" (ERROR) * 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