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

📄 q15_atan.asm

📁 Texas-Instrument C2000 Series DSP example programs
💻 ASM
字号:
;=====================================================================
; Name:          Q15_ATAN.ASM
; Project:       Q15.LIB 
; Originator:    Martin Staebler
;=====================================================================
;	 Function:	int q15_atan(int) 
;	  		unsigned q15p_atan(unsigned) 
;        Status:  
;
;        Target:         TMS320C240
;
;        History:        (Date, Revision, Who, What)
;        ------------------------------------------------------------
;        02/11/97        1.0     STAE    Preliminary
;======================================================================


;----------------------------------------------------------------------------
; Include files
;----------------------------------------------------------------------------
               .include        "q15_atan.inc"   ;lookup table


;--------------------------------------------------------------------
; int q15_atan(int);
;--------------------------------------------------------------------
; Function:      arcus tanges, for fractional q15 format
; 									
; Arguments:     fractional q15
;                min: -1.0   <--> 8000h
;                max: 0.9999 <--> 7FFFh
; 									
; Return value:  scaled angle (-PI/4 .. PI/4)
;                scaling: PI  (e.g. atan(1.0) = 0.25 or 2000h)
;
; Error:         < 2 LSB  (128 point lookup table)
;--------------------------------------------------------------------
                .def    _q15_atan       ;define global
                .text
_q15_atan:                
        ;context save        
        ;------------
                popd    *+              ;push return address
                sar     AR0, *+         ;push old frame pointer
                sar     AR1, *          
                lar     AR0,*           ;init new frame pointer  
                adrk    #3              ;alocate space for two local variables
                
                mar     *,AR2
                lar     AR2,#-3      
                mar     *0+             ;AR2 = &parameter      
                
         ;check if negative or -1        
         ;-----------------------
                lacc    *
                adrk    #3
                sacl    *               ;local #1 = abs(parameter)
                bcnd    OK,GEQ    
                sub     #8000h
                bcnd    MINUS_1,EQ
                lacc    *
                neg
                sacl    *               ;local #1 = abs(parameter)
                
        ;calculte atan for POSITIV fractional numbers        
        ;--------------------------------------------
OK:             lacc    *+,tablen_lg2+1 ;lookup table length = 2^tablen_lg2
                sach    *               ;local #2 = first table address
                lacc    #table
                add     *
                tblr    *+              ;local #2 = first value           
                add     #1                
                tblr    *               ;local #3 = second value           
                lacc    *- 
                sub     *+              ;ACC = difference = local #3 - #2
                sacl    *               ;local #3 = difference 
                lt      *               ;T = difference
                sbrk    #2              ;AR2 points to local #1
                lacc    *,tablen_lg2    ;ACC = local #1 << tablen_lg2
                and     #7FFFh          ;make distance positiv value
                sacl    *               ;local #1 = distance 
                mpy     *+              ;differnce * distance
                spm     1
                lacc    *-,16           ;ACCH = local #2 = first value
                apac                    ;ACC += distance * difference
                sach    *               ;local #1 = 'positiv' result         
                
        ;correct sign, if necessary         
        ;--------------------------
                lar     AR2,#-3      
                mar     *0+             ;AR2 = &parameter      
                lacc    *               
                adrk    #3
                bcnd    POSITIV,GEQ    
                lacc    *
                neg                     ;2's complement
                b       EPIO

MINUS_1:        lacc    #-4000h
                b       EPIO                   

POSITIV:        lacc    *               ;ACCL = fractional result       
                ;b       EPIO           ;does already


        ;context restore                
        ;---------------
EPIO:           spm     0               ;default 'C' setting                
                mar     *,AR1
                sbrk    #(3+1)          ;pop local var's+1 from stack
                lar     ar0, *-         ;restore old frame pointer
                pshd    *               ;restore return address
                ret
        
        
       


;--------------------------------------------------------------------
; unsigned q15p_atan(unsigned);
;--------------------------------------------------------------------
; Function:      arcus tanges, for positiv fractional q15 format
; 									
; Arguments:     fractional q15
;                min: 9.0    <--> 0000h
;                max: 0.9999 <--> 7FFFh
; 									
; Return value:  scaled angle (0 .. PI/4)
;                scaling: PI  (e.g. atan(1.0) = 0.25 or 2000h)
;
; Error:         < 2 LSB  (128 point lookup table)
;--------------------------------------------------------------------
                .def    _q15p_atan       ;define global
                .text
_q15p_atan:                
        ;context save        
        ;------------
                popd    *+              ;push return address
                sar     AR0, *+         ;push old frame pointer
                sar     AR1, *          
                lar     AR0,*           ;init new frame pointer  
                adrk    #3              ;alocate space for three local variables
                
                mar     *,AR2
                lar     AR2,#-3      
                mar     *0+             ;AR2 = &parameter      
                
         ;local #1 = parameter
         ;--------------------
                lacc    *
                adrk    #3
                sacl    *               ;local #1 = parameter
                
        ;calculte atan for POSITIV fractional numbers        
        ;--------------------------------------------
                lacc    *+,tablen_lg2+1 ;lookup table length = 2^tablen_lg2
                sach    *               ;local #2 = first table address
                lacc    #table
                add     *
                tblr    *+              ;local #2 = first value           
                add     #1                
                tblr    *               ;local #3 = second value           
                lacc    *- 
                sub     *+              ;ACC = difference = local #3 - #2
                sacl    *               ;local #3 = difference 
                lt      *               ;T = difference
                sbrk    #2              ;AR2 points to local #1
                lacc    *,tablen_lg2    ;ACC = local #1 << tablen_lg2
                and     #7FFFh          ;make distance positiv value
                sacl    *               ;local #1 = distance 
                mpy     *+              ;differnce * distance
                spm     1
                lacc    *-,16           ;ACCH = local #2 = first value
                apac                    ;ACC += distance * difference
                sach    *               ;local #1 = 'positiv' result         
                lacc    *		;put into lowwer ACC

        ;context restore                
        ;---------------
                spm     0               ;default 'C' setting                
                mar     *,AR1
                sbrk    #(3+1)          ;pop local var's+1 from stack
                lar     ar0, *-         ;restore old frame pointer
                pshd    *               ;restore return address
                ret
        
        
       

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -