.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;
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;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货