.TITLE P$EXP - EXP .IDENT /791112/ ; USAGE: ; Y := EXP(X) ; REAL PARAMETER X ON TOP OF STACK ; REAL RESULT RETURNED ON TOP OF STACK ; REGISTER USAGE: ; R0,R1 - SCRATCH ; R4 - EXPONENT SCALE (SAVED/RESTORED) ; ; CALLS: ; $$$098 TRUNC ; $$$201 FLOAT .GLOBL $$$098,$$$201 ; .PSECT $$$103::;EXP(X) MOV R4,-(SP) ;SAVE R4 MOV 4(SP),R0 ;HIGH ORDER ARG BGT POS ;JUMP IF + CMP R0,#141660 ;ARG IS - ; BHI ZERO ;ARG < -88.7 ; BR SMTST BLOS SMTST JMP ZERO POS: CMP R0,#041660 BHI OVER ;ARG > 87 SMTST: ASL R0 ;DUMP SIGN CMP R0,#063000 BLO ONE ;JUMP IF ARG MAGNITUDE <2**-28 CLR -(SP) ;PUSH A 1. MOV #40200,-(SP) ;; MOV 12(SP),-(SP) ;GET ARGUMENT MOV 12(SP),-(SP) ;HIGH PART MOV 2(SP),-(SP) ;COPY IT MOV 2(SP),-(SP) ;; MOV #125073,-(SP) ;GET LOG2(E) MOV #40270,-(SP) ;HIGH PART FMUL SP ;X * LOG2(E) TST -(SP) ;MAKE SPACE FOR INTEGER MOV 4(SP),-(SP) ;COPY TOS MOV 4(SP),-(SP) ;; JSR PC,$$$098 ;TRUNC THE RESULT MOV (SP),R4 ;SAVE IT IN R4 JSR PC,$$$201 ;FLOAT IT MOV #125073,-(SP) ;GET LOG2(E) MOV #40270,-(SP) ;; FDIV SP FSUB SP ;GET THE FRACTIONAL PART ROL (SP) ;SHIFT MODIFIED ARG ROL R0 ;SAVE SIGN SUB #400,(SP) ;DIVIDE BY 2 BHI 3$ ;OKAY CMP (SP)+,(SP)+ ;UNDERFLOW, MAKE ARG 0 BR 4$ 3$: ROR R0 ;GET SIGN BACK ROR (SP) MOV (SP),R0 ;GET MODIFIED ARGUMENT MOV 2(SP),R1 ;IN REGISTERS MOV #36602,-(SP) ;PUSH -12.01501675 MOV #141100,-(SP) ;; MOV R1,-(SP) ;COPY ARGUMENT MOV R0,-(SP) ;; MOV #71571,-(SP) ;PUSH 601.8042667 MOV #42426,-(SP) ;; MOV #56133,-(SP) ;PUSH 60.0901907 MOV #41560,-(SP) ;; MOV R1,-(SP) ;COPY ARGUMENT MOV R0,-(SP) ;; MOV R1,-(SP) ;COPY ARGUMENT MOV R0,-(SP) ;; FMUL SP ;Y*Y FADD SP ;B1+Y*Y FDIV SP ;A1/(B1+Y*Y) FADD SP ;Y+A1/(B1+Y*Y) FADD SP ;A0+Y+A1/(B1+Y*Y) FDIV SP ;Y/(A0+Y+A1/(B1+Y*Y)) ADD #100200,(SP) ;-2*Y/(A0+Y+A1/(B1+Y*Y)) FADD SP ;1-2*Y/(A0+Y+A1/(B1+Y*Y)) MOV 2(SP),-(SP) ;DUPLICATE IT MOV 2(SP),-(SP) ;; FMUL SP ;(1-2*Y/(A0+Y+A1/(B1+Y*Y)))**2 4$: MOV (SP)+,R0 ;GET APPROXIMATION RESULT MOV (SP)+,R1 ;; SWAB R4 ;MAKE INT(X*LOG2(E)) INTO ;EXPONENT MODIFIER CLRB R4 ;; ASR R4 ;; ADD R4,R0 ;ADD IN EXPONENT MODIFIER BMI OVER ;TEST OVERFLOW MOV R0,4(SP) ;RESULT IS RETURNED MOV R1,6(SP) ;; BR ENDEXP ;EXIT ONE: MOV #040200,4(SP) ;RESULT IS 1.0 CLR 6(SP) ;LOW PART TO 0 BR ENDEXP OVER: WARN BR ERROR ZERO: WARN ERROR: CLR 4(SP) ;SET HIGH PART TO 0 CLR 6(SP) ;CLEAR LOW PART ; ENDEXP: MOV (SP)+,R4 ;POP R4 RTS PC .EVEN .END