📄 flolog10.asm
字号:
;********************FLOLOG10********************
;本程序求标准浮点数以10为底的对数函数Log10(x)。
;入口参数:X在ARGBH1:ARGBL1:EXP1中。
;出口参数:Log10(X)在ARGBH1:ARGBL1:EXP1中。
;占用资源:W,STATUS,020H~02CH,3重堆栈。
;说明: 1.用户需指定AARGB4,AARGB5,BARGB3,EARGB3,DEXP,DARGB1,DARGB2,DARGB3,
; CEXP,CARGB0,CARGB1,CARGB2
IFNDEF FLOLOG101
#DEFINE FLOLOG101
INCLUDE "RND3224.ASM"
INCLUDE "FXM2424U.ASM"
INCLUDE "FPD32.ASM"
INCLUDE "DSTFLO.ASM"
INCLUDE "MUAD32.ASM"
FLOLOG10
CLRF AARGB2
BTFSC AARGB0,MSB ;自变量是否为负数
GOTO DOMERR1024
MOVF AEXP,W ;自变量是否为0
BTFSC STATUS,Z
GOTO DOMERR1024
MOVF FPFLAGS,W ;保存RND标志
MOVWF DARGB3
BCF FPFLAGS,RND ;屏蔽RND
MOVF AEXP,W
MOVWF EARGB3
MOVLW .127-1
SUBWF EARGB3,F
MOVWF AEXP
MOVLW 0xF3 ;0.70710678118655 = 7E3504F3
SUBWF AARGB2,W
MOVLW 0x04
MOVWF TEMP
BTFSS STATUS,C
INCFSZ TEMP,W
SUBWF AARGB1,W
MOVLW 0x35
MOVWF TEMP
BTFSS STATUS,C
INCFSZ TEMP,W
SUBWF AARGB0,W
BTFSS STATUS,C
GOTO LOG1024L
; minimax rational approximation on [0,.sqrt(2)-1]
LOG1024H
MOVLW 0x7F
MOVWF BEXP
CLRF BARGB0
CLRF BARGB1
CLRF BARGB2
CALL FPS32
MOVF AEXP,W
MOVWF DEXP
MOVF AARGB0,W
MOVWF DARGB0
MOVF AARGB1,W
MOVWF DARGB1
MOVF AARGB2,W
MOVWF DARGB2
POLL1 LOG1024HQ,2,0
MOVF AEXP,W
MOVWF CEXP
MOVF AARGB0,W
MOVWF CARGB0
MOVF AARGB1,W
MOVWF CARGB1
MOVF AARGB2,W
MOVWF CARGB2
MOVF DEXP,W
MOVWF AEXP
MOVF DARGB0,W
MOVWF AARGB0
MOVF DARGB1,W
MOVWF AARGB1
MOVF DARGB2,W
MOVWF AARGB2
POL LOG1024HP,1,0
MOVF CEXP,W
MOVWF BEXP
MOVF CARGB0,W
MOVWF BARGB0
MOVF CARGB1,W
MOVWF BARGB1
MOVF CARGB2,W
MOVWF BARGB2
CALL FPD32
GOTO LOG1024OK
; minimax rational approximation on [1/sqrt(2)-1,0]
LOG1024L
INCF AEXP,F
MOVLW 0x7F
MOVWF BEXP
CLRF BARGB0
CLRF BARGB1
CLRF BARGB2
CALL FPS32
DECF EARGB3,F
MOVF AEXP,W
MOVWF DEXP
MOVF AARGB0,W
MOVWF DARGB0
MOVF AARGB1,W
MOVWF DARGB1
MOVF AARGB2,W
MOVWF DARGB2
POLL1 LOG1024LQ,2,0
MOVF AEXP,W
MOVWF CEXP
MOVF AARGB0,W
MOVWF CARGB0
MOVF AARGB1,W
MOVWF CARGB1
MOVF AARGB2,W
MOVWF CARGB2
MOVF DEXP,W
MOVWF AEXP
MOVF DARGB0,W
MOVWF AARGB0
MOVF DARGB1,W
MOVWF AARGB1
MOVF DARGB2,W
MOVWF AARGB2
POL LOG1024LP,1,0
MOVF CEXP,W
MOVWF BEXP
MOVF CARGB0,W
MOVWF BARGB0
MOVF CARGB1,W
MOVWF BARGB1
MOVF CARGB2,W
MOVWF BARGB2
CALL FPD32
LOG1024OK MOVF DEXP,W
MOVWF BEXP
MOVF DARGB0,W
MOVWF BARGB0
MOVF DARGB1,W
MOVWF BARGB1
MOVF DARGB2,W
MOVWF BARGB2
CALL FPM32
MOVF AEXP,W
MOVWF DEXP
MOVF AARGB0,W
MOVWF DARGB0
MOVF AARGB1,W
MOVWF DARGB1
MOVF AARGB2,W
MOVWF DARGB2
CLRF AARGB0
MOVF EARGB3,W
MOVWF AARGB1
BTFSC AARGB1,MSB
COMF AARGB0,F
CALL DSTFLO
CLRF AARGB2
MOVF DEXP,W
MOVWF BEXP
MOVF DARGB0,W
MOVWF BARGB0
MOVF DARGB1,W
MOVWF BARGB1
MOVF DARGB2,W
MOVWF BARGB2
CALL FPA32
; fixed point multiplication by log(2)
MOVF AARGB0,W
MOVWF EARGB3
BSF AARGB0,MSB
MOVLW 0x9A
MOVWF BARGB0
MOVLW 0x20
MOVWF BARGB1
MOVLW 0x9B
MOVWF BARGB2
CALL FXM2424U
DECF AEXP,F
BTFSC AARGB0,MSB
GOTO LOG1024DONE
RLF AARGB3,F
RLF AARGB2,F
RLF AARGB1,F
RLF AARGB0,F
DECF AEXP,F
LOG1024DONE BTFSS EARGB3,MSB
BCF AARGB0,MSB
BTFSS DARGB3,RND
RETLW 0x00
BSF FPFLAGS,RND
GOTO RND3224
DOMERR1024 BSF FPFLAGS,DOM ; domain error
RETLW 0xFF
;----------------------------------------------------------------------------------------------
; minimax rational coefficients for log2(1+x)/x on [1/sqrt(2)-1,0]
LOG1024HP0 EQU 0x81 ; LOG1024HP0 = .73551298732E+1
LOG1024HP00 EQU 0x6B
LOG1024HP01 EQU 0x5D
LOG1024HP02 EQU 0x39
LOG1024HP1 EQU 0x81 ; LOG24HP1 = .40900513905E+1
LOG1024HP10 EQU 0x02
LOG1024HP11 EQU 0xE1
LOG1024HP12 EQU 0xB3
LOG1024HQ0 EQU 0x81 ; LOG24HQ0 = .50982159260E+1
LOG1024HQ00 EQU 0x23
LOG1024HQ01 EQU 0x24
LOG1024HQ02 EQU 0x96
LOG1024HQ1 EQU 0x81 ; LOG24HQ1 = .53849258895E+1
LOG1024HQ10 EQU 0x2C
LOG1024HQ11 EQU 0x51
LOG1024HQ12 EQU 0x50
LOG1024HQ2 EQU 0x7F ; LOG24HQ2 = 1.0
LOG1024HQ20 EQU 0x00
LOG1024HQ21 EQU 0x00
LOG1024HQ22 EQU 0x00
;----------------------------------------------------------------------------------------------
; minimax rational coefficients for log2(1+x)/x on [0,sqrt(2)-1]
LOG1024LP0 EQU 0x82 ; LOG24LP0 = .103115556038E+2
LOG1024LP00 EQU 0x24
LOG1024LP01 EQU 0xFC
LOG1024LP02 EQU 0x22
LOG1024LP1 EQU 0x81 ; LOG24LP1 = .457749066375E+1
LOG1024LP10 EQU 0x12
LOG1024LP11 EQU 0x7A
LOG1024LP12 EQU 0xCE
LOG1024LQ0 EQU 0x81 ; LOG24LQ0 = .714746549793E+1
LOG1024LQ00 EQU 0x64
LOG1024LQ01 EQU 0xB8
LOG1024LQ02 EQU 0x0A
LOG1024LQ1 EQU 0x81 ; LOG24LQ1 = .674551124538E+1
LOG1024LQ10 EQU 0x57
LOG1024LQ11 EQU 0xDB
LOG1024LQ12 EQU 0x3A
LOG1024LQ2 EQU 0x7F ; LOG24LQ2 = 1.0
LOG1024LQ20 EQU 0x00
LOG1024LQ21 EQU 0x00
LOG1024LQ22 EQU 0x00
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -