.MODULE Logarithms;{
        Logarithm Approximations
                y=log10(x)
                y=ln(x)        Calling Parameters
                MR1 = Integer Portion of x in 16.0 twos complement
                MR0 = Fractional Portion of x in 0.16 unsigned
                M3 = 1
                L3 = 0        Return Values
                SR1 = Y (4.12 format for log; 5.11 format for ln)        Altered Registers
                AX0,AY0,AR,MY1,MX1,MF,MR,SE,SR,I3        Computation Time
                33 cycles (maximum)
}.CONST  log_2=H#2688,ln_2=H#2C5D;.VAR/DM ln_coeffs[5];
.VAR/DM log_coeffs[5];.INIT   ln_coeffs : H#7FE3, H#C149, H#2491, H#EEF8, H#0404;
.INIT   log_coeffs : H#6F15, H#C987, H#1FC3, H#F135, H#037D;.ENTRY  log,ln;ln:     MY1=ln_2;                           {Natural log start here}
        I3=^ln_coeffs;
        JUMP compute;
log:    I3=^log_coeffs;                     {Common log start here}
        MY1=log_2;
compute:        SE=EXP MR1 (HI);            {Check for redundant bits}
        SE=EXP MR0 (LO);
        AY0=SE;
        AR=AY0-1;
        AX0=14;
        SE=AR, AR=AX0+AY0;
        SR=NORM MR1 (HI);                   {Remove redundant bits}
        SR=SR OR NORM MR0 (LO);
        MR=AR*MY1 (SS);                     {(SE+14) * log(2)}
        MY1=MR1;                            {Shift left 16 bits}
        MR1=MR0;
        MR2=MY1;
        MR0=0;
        AY0=H#8000;
        AR=SR1-AY0;
        MY1=AR;
        MF=AR*MY1 (RND), MX1=DM(I3,M3);     {MF = x**2}
        MR=MR+MX1*MY1 (SS), MX1=DM(I3,M3);  {MR = C1*x}
        CNTR=3;
        DO approx UNTIL CE;
                MR=MR+MX1*MF (SS);
approx:         MF=AR*MF (RND), MX1=DM(I3,M3);
        MR=MR+MX1*MF (RND);
        SR=ASHIFT MR2 BY 12 (HI);           {Shift to correct format}
        SR=SR OR LSHIFT MR1 BY 12 (LO);
        RTS;
.ENDMOD;