.TITLE P$LN - NATURAL LOG .IDENT /790817/ ; USAGE: ; Y := LN(X) ; REAL PARAMETER X ON TOP OF STACK ; REAL RESULT RETURNED ON TOP OF STACK ; REGISTER USAGE: ; R0,R1 - SCRATCH ; R2,R3 - SCRATCH (SAVED/RESTORED) ; ; CALLS: ; $$$201 - FLOAT .GLOBL $$$201 ; .PSECT $$$102::;LN(X) MOV 2(SP),R0 ;HIGH OF ARG MOV 4(SP),R1 ;LOW OF ARG MOV R2,-(SP) ;SAVE R2 MOV R3,-(SP) ;SAVE R3 MOV #71030,-(SP) ;PUSH -1/2*LN(2) MOV #137661,-(SP) ;; CMP -(SP),-(SP) ;GET WORK SPACE MOV R1,-(SP) ;PUSH ARG MOV R0,-(SP) ;; BLE ERROR ;NOT POSITIVE, ERROR ASL (SP) ;SHIFT OUT SIGN MOVB 1(SP),12.(SP) ;GET EXPONENT MOVB #200,1(SP) ;TRANSFORM ARG TO (1/2,1) ROR (SP) ;FIX SIGN OFFSET MOV #2363,-(SP) ;PUSH 1/2*ROOT2 MOV #40065,-(SP) ;; MOV 6(SP),-(SP) ;PUSH ARG MOV 6(SP),-(SP) ;; MOV #2363,-(SP) ;PUSH 1/2*ROOT2 MOV #40065,-(SP) ;; FSUB SP ;GET (X-ROOT2)/(X+ROOT2) MOV (SP)+,10.(SP) ;MOVE ITEM TO WORK SPACE MOV (SP)+,10.(SP) ;; FADD SP ;; FDIV SP ;; MOV 2(SP),-(SP) ;COPY TOS MOV 2(SP),-(SP) ;; MOV 2(SP),-(SP) ;COPY TOS MOV 2(SP),-(SP) ;; FMUL SP ;SQUARE IT MOV (SP)+,R0 ;POP Y MOV (SP)+,R1 ;; MOV #CONSTS+4,R2 ;POINT TO COEFFICIENTS MOV #3,R3 ;LOOP 3 1$: MOV -(R2),-(SP) ;PUSH COEFF MOV -(R2),-(SP) ;; MOV R1,-(SP) ;PUSH Y MOV R0,-(SP) ;; SOB R3,1$ ;LOOP MOV -(R2),-(SP) ;PUSH COEFF MOV -(R2),-(SP) ;; MOV #4,R2 ;FOUR OPERATIONS REQUIRED TO 2$: FMUL SP ;EXPAND POLYNOMIAL FADD SP SOB R2,2$ CMP -(SP),-(SP) ;MAKE ROOM FOR REAL CLR -(SP) ;SCALE BISB 12(SP),(SP) ;GET EXPONENT SUB #200,(SP) ;REMOVE EXCESS 128 JSR PC,$$$201 ;FLOAT MOV #71030,-(SP) ;PUSH LN(2) MOV #40061,-(SP) ;; FMUL SP ;GET LN(EXP) FADD SP ;COMBINE WITH FRACTION MOV (SP)+,10(SP) ;POP RESULT MOV (SP)+,10(SP) ;; RET: MOV (SP)+,R3 ;RESTORE R3 MOV (SP)+,R2 ;RESTORE R2 RTS PC ERROR: WARN ADD #12.,SP BR RET ; ; ORDER-DEPENDENT CONSTANTS FOR ROUTINE .WORD 037632,014525 ;.300974506 .WORD 037714,120036 ;.399659100 .WORD 040052,125332 ;.666669471 CONSTS: .WORD 040400,000000 ;1.999999999 .EVEN .END