?? q15_atan.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 = ¶meter
;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 = ¶meter
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 = ¶meter
;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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -