345 lines
8.4 KiB
NASM
345 lines
8.4 KiB
NASM
***********************************************************************
|
|
* File: IQNacos.asm
|
|
*
|
|
* Description: IQmath function for inverse cosine
|
|
*
|
|
* Devices: C28x family
|
|
*
|
|
* Function Prototype: long IQNacos(long)
|
|
*
|
|
* C Useage: y = IQNacos(x);
|
|
*
|
|
* Input Parameters: x = angle (radians)
|
|
*
|
|
* Return Value: y = result
|
|
*
|
|
* Author: DA, Texas Instruments Inc.
|
|
*
|
|
* History:
|
|
* 06/10/04 - original
|
|
*
|
|
* Notes:
|
|
* 1) IQ format is limited to I31Q1 to I3Q29 inclusive. Formats
|
|
* greater than Q29 are excluded since they would overflow return
|
|
* angles greater than 2 (e.g., y = pi).
|
|
*
|
|
* 2) This function uses the identity: acos(x) = pi/2 - asin(x).
|
|
* It simply calls IQasin(x), and then forms (pi/2 - IQasin(x))
|
|
*
|
|
***********************************************************************
|
|
;;#############################################################################
|
|
;;!
|
|
;;! Copyright: Copyright (C) 2023 Texas Instruments Incorporated -
|
|
;;! All rights reserved not granted herein.
|
|
;;! Limited License.
|
|
;;!
|
|
;;! Texas Instruments Incorporated grants a world-wide, royalty-free,
|
|
;;! non-exclusive license under copyrights and patents it now or hereafter
|
|
;;! owns or controls to make, have made, use, import, offer to sell and sell
|
|
;;! ("Utilize") this software subject to the terms herein. With respect to the
|
|
;;! foregoing patent license, such license is granted solely to the extent that
|
|
;;! any such patent is necessary to Utilize the software alone. The patent
|
|
;;! license shall not apply to any combinations which include this software,
|
|
;;! other than combinations with devices manufactured by or for TI
|
|
;;! ("TI Devices").
|
|
;;! No hardware patent is licensed hereunder.
|
|
;;!
|
|
;;! Redistributions must preserve existing copyright notices and reproduce this
|
|
;;! license (including the above copyright notice and the disclaimer and
|
|
;;! (if applicable) source code license limitations below) in the documentation
|
|
;;! and/or other materials provided with the distribution.
|
|
;;!
|
|
;;! Redistribution and use in binary form, without modification, are permitted
|
|
;;! provided that the following conditions are met:
|
|
;;!
|
|
;;! * No reverse engineering, decompilation, or disassembly of this software is
|
|
;;! permitted with respect to any software provided in binary form.
|
|
;;! * Any redistribution and use are licensed by TI for use only
|
|
;;! with TI Devices.
|
|
;;! * Nothing shall obligate TI to provide you with source code for the
|
|
;;! software licensed and provided to you in object code.
|
|
;;!
|
|
;;! If software source code is provided to you, modification and redistribution
|
|
;;! of the source code are permitted provided that the following conditions
|
|
;;! are met:
|
|
;;!
|
|
;;! * any redistribution and use of the source code, including any resulting
|
|
;;! derivative works, are licensed by TI for use only with TI Devices.
|
|
;;! * any redistribution and use of any object code compiled from the source
|
|
;;! code and any resulting derivative works, are licensed by TI for use
|
|
;;! only with TI Devices.
|
|
;;!
|
|
;;! Neither the name of Texas Instruments Incorporated nor the names of its
|
|
;;! suppliers may be used to endorse or promote products derived from this
|
|
;;! software without specific prior written permission.
|
|
;;#############################################################################
|
|
|
|
|
|
***********************************************************************
|
|
* Macro start
|
|
***********************************************************************
|
|
IQNacos: .macro q_value, __IQasin
|
|
|
|
;----------------------------------------------------------------------
|
|
; Call IQasin()
|
|
;----------------------------------------------------------------------
|
|
LCR #__IQasin ; call _IQasin()
|
|
|
|
;----------------------------------------------------------------------
|
|
; Convert y to I1Q29 format
|
|
;----------------------------------------------------------------------
|
|
.if q_value == 29
|
|
;do nothing
|
|
.elseif q_value >= 13
|
|
LSL ACC, (29 - q_value)
|
|
.else
|
|
LSL ACC, #16
|
|
LSL ACC, (13 - q_value)
|
|
.endif
|
|
|
|
PUSH ACC ; save y on stack
|
|
|
|
;----------------------------------------------------------------------
|
|
; Form (pi/2 - y) to apply acos(x) = pi/2 - asin(x)
|
|
;----------------------------------------------------------------------
|
|
MOV AH, #12867
|
|
MOV AL, #63144 ; ACC = _IQ29(pi/2)
|
|
SUBL ACC, *--SP ; ACC = (pi/2 - y)
|
|
|
|
;----------------------------------------------------------------------
|
|
; Convert back to original IQ format
|
|
;----------------------------------------------------------------------
|
|
.if q_value == 29
|
|
;do nothing
|
|
.elseif q_value >= 13
|
|
SFR ACC, (29 - q_value)
|
|
.else
|
|
SFR ACC, #16
|
|
SFR ACC, (13 - q_value)
|
|
.endif
|
|
|
|
;----------------------------------------------------------------------
|
|
; Return
|
|
;----------------------------------------------------------------------
|
|
LRETR ; return
|
|
|
|
.endm
|
|
;----------------------------------------------------------------------
|
|
; End of macro
|
|
;----------------------------------------------------------------------
|
|
|
|
|
|
|
|
***********************************************************************
|
|
* The value "GLOBAL_Q" needs to be supplied by the assembler using the
|
|
* "-dGLOBAL_Q=q_value" directive:
|
|
***********************************************************************
|
|
.sect "IQmath"
|
|
|
|
.if GLOBAL_Q == 29
|
|
.def __IQ29acos
|
|
.ref __IQ29asin
|
|
__IQ29acos:
|
|
IQNacos GLOBAL_Q, __IQ29asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 28
|
|
.def __IQ28acos
|
|
.ref __IQ28asin
|
|
__IQ28acos:
|
|
IQNacos GLOBAL_Q, __IQ28asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 27
|
|
.def __IQ27acos
|
|
.ref __IQ27asin
|
|
__IQ27acos:
|
|
IQNacos GLOBAL_Q, __IQ27asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 26
|
|
.def __IQ26acos
|
|
.ref __IQ26asin
|
|
__IQ26acos:
|
|
IQNacos GLOBAL_Q, __IQ26asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 25
|
|
.def __IQ25acos
|
|
.ref __IQ25asin
|
|
__IQ25acos:
|
|
IQNacos GLOBAL_Q, __IQ25asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 24
|
|
.def __IQ24acos
|
|
.ref __IQ24asin
|
|
__IQ24acos:
|
|
IQNacos GLOBAL_Q, __IQ24asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 23
|
|
.def __IQ23acos
|
|
.ref __IQ23asin
|
|
__IQ23acos:
|
|
IQNacos GLOBAL_Q, __IQ23asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 22
|
|
.def __IQ22acos
|
|
.ref __IQ22asin
|
|
__IQ22acos:
|
|
IQNacos GLOBAL_Q, __IQ22asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 21
|
|
.def __IQ21acos
|
|
.ref __IQ21asin
|
|
__IQ21acos:
|
|
IQNacos GLOBAL_Q, __IQ21asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 20
|
|
.def __IQ20acos
|
|
.ref __IQ20asin
|
|
__IQ20acos:
|
|
IQNacos GLOBAL_Q, __IQ20asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 19
|
|
.def __IQ19acos
|
|
.ref __IQ19asin
|
|
__IQ19acos:
|
|
IQNacos GLOBAL_Q, __IQ19asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 18
|
|
.def __IQ18acos
|
|
.ref __IQ18asin
|
|
__IQ18acos:
|
|
IQNacos GLOBAL_Q, __IQ18asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 17
|
|
.def __IQ17acos
|
|
.ref __IQ17asin
|
|
__IQ17acos:
|
|
IQNacos GLOBAL_Q, __IQ17asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 16
|
|
.def __IQ16acos
|
|
.ref __IQ16asin
|
|
__IQ16acos:
|
|
IQNacos GLOBAL_Q, __IQ16asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 15
|
|
.def __IQ15acos
|
|
.ref __IQ15asin
|
|
__IQ15acos:
|
|
IQNacos GLOBAL_Q, __IQ15asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 14
|
|
.def __IQ14acos
|
|
.ref __IQ14asin
|
|
__IQ14acos:
|
|
IQNacos GLOBAL_Q, __IQ14asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 13
|
|
.def __IQ13acos
|
|
.ref __IQ13asin
|
|
__IQ13acos:
|
|
IQNacos GLOBAL_Q, __IQ13asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 12
|
|
.def __IQ12acos
|
|
.ref __IQ12asin
|
|
__IQ12acos:
|
|
IQNacos GLOBAL_Q, __IQ12asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 11
|
|
.def __IQ11acos
|
|
.ref __IQ11asin
|
|
__IQ11acos:
|
|
IQNacos GLOBAL_Q, __IQ11asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 10
|
|
.def __IQ10acos
|
|
.ref __IQ10asin
|
|
__IQ10acos:
|
|
IQNacos GLOBAL_Q, __IQ10asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 9
|
|
.def __IQ9acos
|
|
.ref __IQ9asin
|
|
__IQ9acos:
|
|
IQNacos GLOBAL_Q, __IQ9asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 8
|
|
.def __IQ8acos
|
|
.ref __IQ8asin
|
|
__IQ8acos:
|
|
IQNacos GLOBAL_Q, __IQ8asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 7
|
|
.def __IQ7acos
|
|
.ref __IQ7asin
|
|
__IQ7acos:
|
|
IQNacos GLOBAL_Q, __IQ7asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 6
|
|
.def __IQ6acos
|
|
.ref __IQ6asin
|
|
__IQ6acos:
|
|
IQNacos GLOBAL_Q, __IQ6asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 5
|
|
.def __IQ5acos
|
|
.ref __IQ5asin
|
|
__IQ5acos:
|
|
IQNacos GLOBAL_Q, __IQ5asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 4
|
|
.def __IQ4acos
|
|
.ref __IQ4asin
|
|
__IQ4acos:
|
|
IQNacos GLOBAL_Q, __IQ4asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 3
|
|
.def __IQ3acos
|
|
.ref __IQ3asin
|
|
__IQ3acos:
|
|
IQNacos GLOBAL_Q, __IQ3asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 2
|
|
.def __IQ2acos
|
|
.ref __IQ2asin
|
|
__IQ2acos:
|
|
IQNacos GLOBAL_Q, __IQ2asin
|
|
.endif
|
|
|
|
.if GLOBAL_Q == 1
|
|
.def __IQ1acos
|
|
.ref __IQ1asin
|
|
__IQ1acos:
|
|
IQNacos GLOBAL_Q, __IQ1asin
|
|
.endif
|
|
|
|
;----------------------------------------------------------------------
|
|
; End of file
|
|
;----------------------------------------------------------------------
|