⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flosincos.asm

📁 PIC单片机的汇编源码合集,应用比较广泛,设计程序时可做子程序来用
💻 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 + -