[an error occurred while processing this directive]
|
.MODULE/RAM Logarithm_Approximations;
.PAGELENGTH 58;
.PAGEWIDTH 132;
{
Logarithm Approximations
Y = Ln (X)
Y = Log10 (X)
Calling Parameters
M_MODE = 0
MR1 = integer part of X in twos-complement 16.0 signed format
MR0 = fractional part of X in 0.16 unsigned format
L5 = 0
M5 = 1
Return Values
SR1 = Y (5.11 signed format for Ln; 4.12 signed format for Log10)
Altered Registers
AX0, AY0, AR, MX0, MY0, MR, MF, SE, SR, I5
Computation Time
32 cycles (maximum)
}
.CONST LNX_2 = 0x2C5D, LOG10X_2 = 0x2688;
.VAR/PM/RAM LNX_COEFFS [5];
.VAR/PM/RAM LOG10X_COEFFS [5];
.INIT LNX_COEFFS : 0x7FE300, 0xC14900, 0x249100, 0xEEF800, 0x040400;
.INIT LOG10X_COEFFS : 0x6F1500, 0xC98700, 0x1FC300, 0xF13500, 0x037D00;
.ENTRY LNX, LOG10X;
LNX:
I5 = ^LNX_COEFFS; { Natural Log start here }
MY0 = LNX_2;
JUMP COMPUTE;
LOG10X: I5 = ^LOG10X_COEFFS; { Common Log start here }
MY0 = LOG10X_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; { AR = SE + 14, 16.0 signed format }
SR = NORM MR1 (HI); { Remove redundant bits }
SR = SR OR NORM MR0 (LO);
MR = AR*MY0 (SS); { (SE + 14)*Log10 (2) in 25.15 format }
MY0 = MR1; { Shift left 16 bits to become 9.31 format }
MR1 = MR0;
MR2 = MY0;
MR0 = 0;
AR = SR1 - 0x8000; { Y = X - 1.0 in unsigned 1.15 format }
MY0 = AR;
MF = AR*MY0 (RND), MX0 = PM (I5, M5); { MF = X**2 }
MR = MR + MX0*MY0 (SS), MX0 = PM (I5, M5); { MR = MR + C1*X }
CNTR = 3;
DO APPROX UNTIL CE;
MR = MR + MX0*MF (SS);
APPROX: MF = AR*MF (RND), MX0 = PM (I5, M5);
MR = MR + MX0*MF (RND);
SR = ASHIFT MR2 BY 12 (HI); { Shift to correct format }
SR = SR OR LSHIFT MR1 BY 12 (LO);
RTS;
.ENDMOD;
E-mail: info@telesys.ru