📄 flosincos.asm
字号:
IFNDEF FLOSINCOS
#DEFINE FLOSINCOS
INCLUDE "RND3224.ASM"
INCLUDE "FXM2416U.ASM"
INCLUDE "FXM2424U.ASM"
INCLUDE "INT3224.ASM"
INCLUDE "FLO2432.ASM"
INCLUDE "MUAD32.ASM"
;********************FLOCOS********************
;本程序求标准浮点数指数函数COS(x)。
;入口参数:X在ARGBH1:ARGBL1:EXP1中。
;出口参数:COS(X)在ARGBH1:ARGBL1:EXP1中。
;占用资源:W,STATUS,020H~02CH,3重堆栈。
;说明: 1.用户需指定AARGB4,AARGB5,BARGB3,EEXP,EARGB0,EARGB1,EARGB2,EARGB3,DEXP,DARGB1,
; DARGB2,DARGB3,CEXP,CARGB0,CARGB1,CARGB2,CARGB3
; 2.源操作数为纯小数或整数时结果最精确。
; 3.源操作数应为弧度
FLOCOS MOVF FPFLAGS,W ;保护圆整允许位
MOVWF DARGB3
BCF FPFLAGS,RND ;禁止圆整
CLRF CARGB3 ;初始化符号位
BCF AARGB0,MSB ;|x|
CALL RRSINCOS24
RRCOS24OK
RRF EARGB3,W
XORWF EARGB3,W
MOVWF TEMP
BTFSC TEMP,LSB
GOTO COSZSIN24
CALL ZCOS24
GOTO COSSIGN24
COSZSIN24 CALL ZSIN24
COSSIGN24
MOVLW 0x80
BTFSC EARGB3,LSB+1
XORWF CARGB3,F
BTFSC CARGB3,MSB
XORWF AARGB0,F
BTFSS DARGB3,RND
RETLW 0x00
BSF FPFLAGS,RND ;恢复圆整允许位
CALL RND3224
RETLW 0x00
;********************FLOSIN********************
;本程序求标准浮点数指数函数SIN(x)。
;入口参数:X在ARGBH1:ARGBL1:EXP1中。
;出口参数:SIN(X)在ARGBH1:ARGBL1:EXP1中。
;占用资源:W,STATUS,020H~02CH,3重堆栈。
;说明: 1.用户需指定AARGB4,AARGB5,BARGB3,EEXP,EARGB0,EARGB1,EARGB2,EARGB3,DEXP,DARGB1,
; DARGB2,DARGB3,CEXP,CARGB0,CARGB1,CARGB2,CARGB3
; 2.源操作数为纯小数或整数时结果最精确。
; 3.源操作数应为弧度。
FLOSIN
MOVF FPFLAGS,W ; 保护圆整允许位
MOVWF DARGB3
BCF FPFLAGS,RND ; 禁止圆整
CLRF CARGB3 ; 初使化符号位
BTFSC AARGB0,MSB ; 如果 x < 0 则触发符号位
BSF CARGB3,MSB
BCF AARGB0,MSB ; |x|
CALL RRSINCOS24
RRSIN24OK
RRF EARGB3,W
XORWF EARGB3,W
MOVWF TEMP
BTFSC TEMP,LSB
GOTO SINZCOS24
CALL ZSIN24
GOTO SINSIGN24
SINZCOS24 CALL ZCOS24
SINSIGN24
MOVLW 0x80
BTFSC CARGB3,MSB
XORWF AARGB0,F
BTFSS DARGB3,RND
RETLW 0x00
BSF FPFLAGS,RND ; 恢复圆整标志
CALL RND3224
RETLW 0x00
;**********************************************************************************************
; Range reduction routine for trigonometric functions
RRSINCOS24
MOVF AEXP,W ;阈检查
SUBLW LOSSTHR24EXP
BTFSS STATUS,C
GOTO DOMERR24
BTFSS STATUS,Z
GOTO RRSINCOS24ARGOK
MOVF AARGB0,W
SUBLW LOSSTHR24B0
BTFSS STATUS,C
GOTO DOMERR24
BTFSS STATUS,Z
GOTO RRSINCOS24ARGOK
MOVF AARGB1,W
SUBLW LOSSTHR24B1
BTFSS STATUS,C
GOTO DOMERR24
RRSINCOS24ARGOK
MOVF AEXP,W
MOVWF CEXP ;|x|保存在CARG
MOVF AARGB0,W
MOVWF CARGB0
MOVF AARGB1,W
MOVWF CARGB1
CLRF CARGB2
;定点数乘法AARG*(4/pi)
BSF AARGB0,MSB
MOVF AARGB0,W
MOVWF BARGB0
MOVF AARGB1,W
MOVWF BARGB1
MOVLW 0xA2 ; 4/pi = 1.27323954474
MOVWF AARGB0
MOVLW 0xF9
MOVWF AARGB1
MOVLW 0x83
MOVWF AARGB2
CALL FXM2416U
INCF AEXP,F
BTFSC AARGB0,MSB
GOTO RRSINCOS24YOK
RLF AARGB3,F
RLF AARGB2,F
RLF AARGB1,F
RLF AARGB0,F
DECF AEXP,F
RRSINCOS24YOK
BCF AARGB0,MSB
CALL INT3224 ; y = [ |x| * (4/pi) ]
BTFSS AARGB2,LSB
GOTO SAVEY24
INCF AARGB2,F
BTFSC STATUS,Z
INCF AARGB1,F
BTFSC STATUS,Z
INCF AARGB0,F
SAVEY24 MOVF AARGB0,W
MOVWF EARGB0 ;y保存在EARG
MOVF AARGB1,W
MOVWF EARGB1
MOVF AARGB2,W
MOVWF EARGB2
MOVLW 0x07 ; j = y mod 8
ANDWF AARGB2,F
MOVLW 0x03
SUBWF AARGB2,W
MOVLW 0x80
BTFSS STATUS,C
GOTO JOK24
XORWF CARGB3,F
MOVLW 0x04
SUBWF AARGB2,F
JOK24
MOVF AARGB2,W
MOVWF EARGB3 ;j保存在EARGB3
MOVF EARGB0,W
MOVWF AARGB0 ;将y恢复到AARG
MOVF EARGB1,W
MOVWF AARGB1
MOVF EARGB2,W
MOVWF AARGB2
CALL FLO2432
MOVF AEXP,W
MOVWF EEXP ;y保存在EARG
BTFSC STATUS,Z
GOTO RRSINCOS24ZEQX
MOVF AARGB0,W
MOVWF EARGB0
MOVF AARGB1,W
MOVWF EARGB1
MOVF AARGB2,W
MOVWF EARGB2
; 用定点乘法进行扩展精度计算|x| - y * pi/4
; 因为 y >= 1,所以任何情况下都不可能发生下溢
BSF AARGB0,MSB
MOVLW 0xC9 ; - p1 = -.78515625
MOVWF BARGB0
CLRF BARGB1
CALL FXM2416U
BTFSC AARGB0,MSB
GOTO RRSINCOS24Z1OK
RLF AARGB3,F
RLF AARGB2,F
RLF AARGB1,F
RLF AARGB0,F
DECF AEXP,F
RRSINCOS24Z1OK
MOVF CEXP,W ;x装入到BARG
MOVWF BEXP
MOVF CARGB0,W
MOVWF BARGB0
MOVF CARGB1,W
MOVWF BARGB1
CLRF BARGB2
CALL FPA32 ; z1 = |x| - y * (p1)
MOVF AEXP,W
MOVWF CEXP ; z1保存在CARG
MOVF AARGB0,W
MOVWF CARGB0
MOVF AARGB1,W
MOVWF CARGB1
MOVF AARGB2,W
MOVWF CARGB2
MOVF EEXP,W
MOVWF AEXP
MOVF EARGB0,W
MOVWF AARGB0 ;y装入到AARG
MOVF EARGB1,W
MOVWF AARGB1
MOVF EARGB2,W
MOVWF AARGB2
BSF AARGB0,MSB
MOVLW 0xFD ; - p2 = -.00024187564849853515624
MOVWF BARGB0
MOVLW 0xA0
MOVWF BARGB1
CALL FXM2416U
MOVLW 0x0D - 1
BTFSC AARGB0,MSB
GOTO RRSINCOS24Z2OK
RLF AARGB3,F
RLF AARGB2,F
RLF AARGB1,F
RLF AARGB0,F
DECF AEXP,F
RRSINCOS24Z2OK
SUBWF AEXP,F
MOVF CEXP,W ;z1装载到BARG
MOVWF BEXP
MOVF CARGB0,W
MOVWF BARGB0
MOVF CARGB1,W
MOVWF BARGB1
MOVF CARGB2,W
MOVWF BARGB2
CALL FPA32 ; z2 = z1 - y * (p2)
MOVF AEXP,W
MOVWF CEXP ;z2保存在CARG
MOVF AARGB0,W
MOVWF CARGB0
MOVF AARGB1,W
MOVWF CARGB1
MOVF AARGB2,W
MOVWF CARGB2
MOVF EEXP,W
MOVWF AEXP
MOVF EARGB0,W
MOVWF AARGB0 ; y 装载到 AARG
MOVF EARGB1,W
MOVWF AARGB1
MOVF EARGB2,W
MOVWF AARGB2
BSF AARGB0,MSB
MOVLW 0xA2 ; - p3 = -3.77489497744597636E-8
MOVWF BARGB0
MOVLW 0x21
MOVWF BARGB1
MOVLW 0x69
MOVWF BARGB2
CALL FXM2424U
MOVLW 0x19 - 1
BTFSC AARGB0,MSB
GOTO RRSINCOS24Z3OK
RLF AARGB3,F
RLF AARGB2,F
RLF AARGB1,F
RLF AARGB0,F
DECF AEXP,F
RRSINCOS24Z3OK
SUBWF AEXP,F
MOVF CEXP,W ;z2 装载到 BARG
MOVWF BEXP
MOVF CARGB0,W
MOVWF BARGB0
MOVF CARGB1,W
MOVWF BARGB1
MOVF CARGB2,W
MOVWF BARGB2
CALL FPA32 ; z = z2 - y * (p3)
MOVF AEXP,W
MOVWF CEXP ; z 保存在 CARG
MOVF AARGB0,W
MOVWF CARGB0
MOVF AARGB1,W
MOVWF CARGB1
MOVF AARGB2,W
MOVWF CARGB2
MOVF AEXP,W
MOVWF BEXP
MOVF AARGB0,W
MOVWF BARGB0
MOVF AARGB1,W
MOVWF BARGB1
MOVF AARGB2,W
MOVWF BARGB2
CALL FPM32 ; z * z
MOVF AEXP,W
MOVWF DEXP ; z * z 保存在 DARG
MOVF AARGB0,W
MOVWF DARGB0
MOVF AARGB1,W
MOVWF DARGB1
MOVF AARGB2,W
MOVWF DARGB2
RETLW 0x00
RRSINCOS24ZEQX
MOVF CEXP,W
MOVWF AEXP
MOVF CARGB0,W
MOVWF AARGB0
MOVF CARGB1,W
MOVWF AARGB1
MOVF CARGB2,W
MOVWF AARGB2
MOVF AEXP,W
MOVWF BEXP
MOVF AARGB0,W
MOVWF BARGB0
MOVF AARGB1,W
MOVWF BARGB1
MOVF AARGB2,W
MOVWF BARGB2
CALL FPM32 ; z * z
MOVF AEXP,W
MOVWF DEXP ; z * z 保存在 DARG
MOVF AARGB0,W
MOVWF DARGB0
MOVF AARGB1,W
MOVWF DARGB1
MOVF AARGB2,W
MOVWF DARGB2
RETLW 0x00
;**********************************************************************************************
; 在 [0,pi/4] 上进行多项式计算 p(x**2)
ZCOS24 POL COS24,3,0
RETLW 0x00
;**********************************************************************************************
; 在 [0,pi/4] 上进行多项式计算 x*p(x**2)
ZSIN24 POL SIN24,2,0
MOVF CEXP,W
MOVWF BEXP
MOVF CARGB0,W
MOVWF BARGB0
MOVF CARGB1,W
MOVWF BARGB1
MOVF CARGB2,W
MOVWF BARGB2
CALL FPM32
RETLW 0x00
;----------------------------------------------------------------------------------------------
; minimax polynomial coefficients for sin(z)/z = p(z**2) on [0,pi/4]
SIN240 EQU 0x7E ; LP0 = .73551298732E+1*******
SIN2400 EQU 0x7F
SIN2401 EQU 0xFF
SIN2402 EQU 0xAC
SIN241 EQU 0x7C ; LP1 = .40900513905E+1
SIN2410 EQU 0xAA
SIN2411 EQU 0x99
SIN2412 EQU 0x9D
SIN242 EQU 0x78 ; LQ0 = .50982159260E+1
SIN2420 EQU 0x05
SIN2421 EQU 0x10
SIN2422 EQU 0x48
LOSSTHR24EXP equ 0x8B ; 4096 = sqrt(2**24)
LOSSTHR24B0 equ 0x00
LOSSTHR24B1 equ 0x00
;----------------------------------------------------------------------------------------------
; minimax polynomial coefficients for cos(z) = q(z**2) on [0,pi/4]
; with COS240 constrained to be 1.
COS240 EQU 0x7F ; LP0 = .73551298732E+1*******
COS2400 EQU 0x00
COS2401 EQU 0x00
COS2402 EQU 0x00
COS241 EQU 0x7D ; LP1 = .40900513905E+1
COS2410 EQU 0xFF
COS2411 EQU 0xFF
COS2412 EQU 0xD0
COS242 EQU 0x7A ; LQ0 = .50982159260E+1
COS2420 EQU 0x2A
COS2421 EQU 0x9E
COS2422 EQU 0x76
COS243 EQU 0x75 ; LQ1 = .53849258895E+1
COS2430 EQU 0xB2
COS2431 EQU 0x12
COS2432 EQU 0xBF
ENDIF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -