Application Report 1998 Digital Signal Processing Solutions Printed in U.S.A., July 1998 SPRA179 1998 Application Report Digital Sine-Wave Generation Using the TMS320C2xx SPRA179 July 1998 Printed on Recycled Paper IMPORTANT NOTICE Texas Instruments and its subsidiaries (TI) reserve the right to make changes to their products or to discontinue any product or service without notice, and advise customers to obtain the latest version of relevant information to verify, before placing orders, that information being relied on is current and complete. All products are sold subject to the terms and conditions of sale supplied at the time of order acknowledgement, including those pertaining to warranty, patent infringement, and limitation of liability. TI warrants performance of its semiconductor products to the specifications applicable at the time of sale in accordance with TI’s standard warranty. Testing and other quality control techniques are utilized to the extent TI deems necessary to support this warranty. Specific testing of all parameters of each device is not necessarily performed, except those mandated by government requirements. CERTAIN APPLICATIONS USING SEMICONDUCTOR PRODUCTS MAY INVOLVE POTENTIAL RISKS OF DEATH, PERSONAL INJURY, OR SEVERE PROPERTY OR ENVIRONMENTAL DAMAGE (“CRITICAL APPLICATIONS”). TI SEMICONDUCTOR PRODUCTS ARE NOT DESIGNED, AUTHORIZED, OR WARRANTED TO BE SUITABLE FOR USE IN LIFE-SUPPORT DEVICES OR SYSTEMS OR OTHER CRITICAL APPLICATIONS. INCLUSION OF TI PRODUCTS IN SUCH APPLICATIONS IS UNDERSTOOD TO BE FULLY AT THE CUSTOMER’S RISK. In order to minimize risks associated with the customer’s applications, adequate design and operating safeguards must be provided by the customer to minimize inherent or procedural hazards. TI assumes no liability for applications assistance or customer product design. TI does not warrant or represent that any license, either express or implied, is granted under any patent right, copyright, mask work right, or other intellectual property right of TI covering or relating to any combination, machine, or process in which such semiconductor products or services might be or are used. TI’s publication of information regarding any third party’s products or services does not constitute TI’s approval, warranty or endorsement thereof. Copyright 1998, Texas Instruments Incorporated Contents 1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 2 Direct Look-Up and Linear Interpolation Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1 C- and Assembly-Compatible Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 C-Compatible Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.2 Assembly-Compatible Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Interpolation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.4 System Utilization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5 Sine-Generation Precision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5.1 One-Sine-Period Analysis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.5.2 Quarter-Sine-Period Analysis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Sine/Cosine With Mathematical Series . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1 C- and Assembly-Compatible Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.1 C-Compatible Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.1.2 Assembly-Compatible Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Sine/Cosine Mathematical Series . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4 System Utilization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5 Sine-Generation Precision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5.1 One-Sine-Period Analysis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5.2 Quarter-Sine-Period Analysis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 2 2 3 3 3 4 4 7 10 10 10 10 11 11 11 12 13 14 Appendix A Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A-1 A.1 Main C Program to Call Sine or Cosine Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A-1 A.2 Main Assembly Program to Call Sine or Cosine Functions . . . . . . . . . . . . . . . . . . . . . . . A-2 A.3 COS Function With Direct Look-Up and Linear Interpolation for Assembly Program . A-4 A.4 COS Function With Direct Look-Up and Linear Interpolation for C Program . . . . . . . . A-7 A.5 SIN Function With Direct Look-Up and Linear Interpolation for Assembly Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A-10 A.6 SIN Function With Direct Look-Up and Linear Interpolation for C Program . . . . . . . . A-13 A.7 Table for COS or SIN Function With Direct Look-Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . A-16 A.8 COS_SIN Function With Direct Look-Up and Linear Interpolation for Assembly Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A-19 A.9 Table for COS_SIN Function With Direct Look-Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A-23 A.10 SIN With Mathematical Series for Assembly Program . . . . . . . . . . . . . . . . . . . . . . . . . A-27 A.11 SIN With Mathematical Series for C Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A-30 A.12 COS With Mathematical Series for Assembly Program . . . . . . . . . . . . . . . . . . . . . . . . A-34 A.13 COS With Mathematical Series for C Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A-38 Digital Sine-Wave Generation Using the TMS320C2xx iii Figures List of Figures 1 The Formula and the Resulting Graph for Calculating the Table Interpolation Value COS of an Angle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2 Direct Look-Up With Interpolation of Sine Calculation From 0 to 2*π With a 0.015-Radian Step . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 3 Error Between the C Floating-Point Result and Direct Look-Up Calculation From 0 to 2*π With a 0.015-Radian Step . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 4 Results of Direct Look-Up SIN From 0 to π/2 With a 0.0039-Radian Step . . . . . . . . . . . . . . . 7 5 Error Between the C Floating-Point Result and Direct Look-Up SINE Calculation From 0 to π/4 With a 0.0039-Radian Step in Q15 Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 6 Error Between the C Floating-Point Result and the Direct Look-Up SINE Calculation From 0 to π/4 With a 0.0039-Radian Step in % . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 7 Formula for Calculating the Value SIN of an Angle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 8 Formula for Calculating the Value COS of an Angle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 9 Mathematical Series Sine Calculation From 0 to 2*π With a 0.015-Radian Step . . . . . . . . 13 10 Error Between the C Floating-Point Result and the Mathematical Series SINE Calculation From 0 to 2*π With a 0.015-Radian Step . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 11 Results of Mathematical Series Sine From 0 to π/2 With a 0.0039-Radian Step . . . . . . . . . 15 12 Error Between the C Floating-Point Result and a Mathematical Series SINE Calculation From 0 to π/4 With a 0.0039-Radian Step in Q15 Format . . . . . . . . . . . . . . . . . 16 13 Error Between the C Floating-Point Result and a Mathematical Series SINE Calculation From 0 to π/4 With a 0.0039-Radian Step in % . . . . . . . . . . . . . . . . . . . . . . . . . . 17 iv SPRA179 Tables List of Tables 1 2 3 4 Processor Utilization (Maximum) When Using Direct Look-up and Interpolation . . . . . . . . . 4 Memory Utilization When Using Direct Look-up and Interpolation . . . . . . . . . . . . . . . . . . . . . . 4 Processor Utilization (Maximum) When Using Mathematical Series . . . . . . . . . . . . . . . . . . . 11 Memory Utilization When Using Mathematical Series . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Digital Sine-Wave Generation Using the TMS320C2xx v vi SPRA179 Digital Sine-Wave Generation Using the TMS320C2xx ABSTRACT This application report describes two methods for implementing a digital sine-wave generator using the TMS320C2xx: the use of a direct look-up table with linear interpolation, and the use of mathematical series. Both methods are explained in terms of C-compatible and assembly-compatible functions. Formulas used for calculating and graphing the results are included for each method to demonstrate the differences. 1 Introduction Sine-wave generators are fundamental building blocks of signal processing systems for use in control applications. The following two methods described in this application report are for implementing a digital sine-wave generator using the TMS320C2xx: • Direct look-up with linear interpolation to provide sine waves with a minimum of harmonic distortion • Realization of the sine/cosine functions with a mathematical series The two methods respond to different constraints. The direct look-up method is fast with minimal errors and is significant in ROM programming requirements. The mathematical series method is fast and requires minimum (ROM) programming but results in less precision. Digital Sine-Wave Generation Using the TMS320C2xx 1 Direct Look-Up and Linear Interpolation Method 2 Direct Look-Up and Linear Interpolation Method This section describes the Direct Look-Up and Linear Interpolation method of implementing a digital sine-wave generator using the TMS320C2xx. 2.1 C- and Assembly-Compatible Functions The Direct Look-Up method, which uses 100 sine-period values in a table, reveals the sine/cosine functions. To provide minimum harmonic distortion, the method includes linear interpolation with a fixed-step table. An extended table is used for the cosine + sine function and is located in program memory. Two versions of each function are presented: • C-compatible functions • Assembly-compatible functions Examples of a C program and an assembly program (that call sine and cosine functions) are in the appendix. 2.1.1 C-Compatible Functions Fully C-compatible functions employ C conventions to use the stack for parameters passed to the functions. Parameters returned by the functions are passed by a pointer. Responsibilities of called functions are managed in a postfix expression called the function designator. Stack pointer AR1 is well-positioned, and the return address of the hardware stack is popped (retrieved) in case of C-interrupt runtime events using C-function features (stack). The frame pointer is not modified and registers AR6 and AR7 are not used. 2.1.2 Assembly-Compatible Functions Assembly-compatible functions do not use their own variables, but instead, rely on variables in a software stack where arguments are passed. The AR1 register points to the stack just after the last argument. After the return from the function, the results are placed in the stack. Registers AR0, AR6, and AR7 are not modified. 2 SPRA179 Direct Look-Up and Linear Interpolation Method 2.2 Interpolation Figure 1 shows the formula and the resulting graph for calculating the table interpolation value COS(X) of an angle X. y y Y=? X –x Y = y i + i x i+ 1 r = - i+1 ( y i+ 1 x y ) i y i i ratio x i X x x i+1 where: {xi} = {first coordinates of the table}, {yi} = {second coordinates of the table}, i chosen so that xi < X < xi+1. Figure 1. The Formula and the Resulting Graph for Calculating the Table Interpolation Value COS of an Angle Table interpolation is comprised of two steps: 1. Direct look-up: looking through the table to find the interval [xi, xi+1] at which the considered angle X is located, with xi < X < xi+1. 2. Interpolation: solving the above mentioned calculation to obtain Y. 2.3 Functions Functions SINE, COSINE, and SINE + COSINE are illustrated by example in the appendix. Conventions to interface with this function are: • • 2.4 Input: ANGLE parameters are in the stack pointed by AR1. The value of this angle is unsigned. 0° <-> 0000h 90° <-> 4000h 180° <-> 8000h 240° <-> C000h Output: COS(angle) or SIN(angle) are in ACCUMULATOR in Q15 format (–1 to 1–215). System Utilization Table 1 shows processor utilization when using the direct look-up and linear interpolation methods. Digital Sine-Wave Generation Using the TMS320C2xx 3 Direct Look-Up and Linear Interpolation Method Table 1. Processor Utilization (Maximum) When Using Direct Look-Up and Interpolation FUNCTION CYCLES EXECUTION TIME SIN assembly call 35 1.75 µs COS assembly call 38 1.90 µs SIN fully C-compatible 42 2.10 µs COS fully C-compatible 45 2.25 µs SIN + COS of an angle 58 2.90 µs Table 2 shows memory utilization when using the direct look-up and linear interpolation method. Table 2. Memory Utilization When Using Direct Look-Up and Interpolation FUNCTION ROM (WORDS) STACKLEVELS REGISTERS USED RAM (WORDS) SIN assembly call 32 + 100 3 1 In stack COS assembly call 34 + 100 3 1 In stack COS and SIN assembly call 66 + 100 3 1 In stack SIN Fully C compatible 42 + 100 5 1 In stack COS assembly call 44 + 100 5 1 In stack COS + SIN in one function† assembly call 55 + 125 3 1 In stack † In the case of Sine + Cosine, the same table is used. 2.5 Sine-Generation Precision Figure 2 and Figure 3 are graphs that present the precision of the direct look-up and linear interpolation sine functions. The precision measurement is made by comparing the direct look-up and the floating-point C library results. 2.5.1 One-Sine-Period Analysis The sine period provides a general image of error calculation. In Figure 2 and Figure 3, results of the sine calculation are in Q15 format. 4 SPRA179 Direct Look-Up and Linear Interpolation Method Figure 2. Direct Look-Up With Interpolation of Sine Calculation From 0 to 2*π With a 0.015-Radian Step Digital Sine-Wave Generation Using the TMS320C2xx 5 Direct Look-Up and Linear Interpolation Method Figure 3. Error Between the C Floating-Point Result and Direct Look-Up Calculation From 0 to 2*π With a 0.015-Radian Step 6 SPRA179 Direct Look-Up and Linear Interpolation Method 2.5.2 Quarter-Sine-Period Analysis Figure 4, Figure 5, and Figure 6 graph another precise analysis using a quarter of a half-sine period. In this case, the step is 0.0039 radian. The interpolation is made at 0.125-radian intervals. In this way, interpolation error is exposed on the following graphs. Each interval (table approximation) is displayed with 32 pixels. Figure 4. Results of Direct Look-Up SIN From 0 to π/2 With a 0.0039-Radian Step Digital Sine-Wave Generation Using the TMS320C2xx 7 Direct Look-Up and Linear Interpolation Method Figure 5. Error Between the C Floating-Point Result and the Direct Look-Up SINE Calculation From 0 to π/4 With a 0.0039-Radian Step in Q15 Format 8 SPRA179 Direct Look-Up and Linear Interpolation Method Figure 6. Error Between the C Floating-Point Result and the Direct Look-Up SINE Calculation From 0 to π/4 With a 0.0039-Radian Step in % Digital Sine-Wave Generation Using the TMS320C2xx 9 Sine/Cosine With Mathematical Series 3 Sine/Cosine With Mathematical Series This section explains the second of two methods of implementing a digital sine-wave generator using the TMS320C2xx. 3.1 C- and Assembly-Compatible Functions The sine/cosine method calculates the sine/cosine functions with a mathematical series for the sine period and a mathematical series for cosine. Calculations are made with fixed-point instructions to optimize the time calculation. The dynamics used in the calculation fit with maximum precision without overflow. Two versions of each function are presented: • C-compatible functions • Assembly-compatible functions Examples of a C program and an assembly program (that call sine and cosine functions) are in the appendix. 3.1.1 C-Compatible Functions Fully C-compatible functions employ C conventions to use the stack for parameters passed to the functions. Parameters returned by functions are passed by a pointer. Responsibilities of called functions are managed in a postfix expression called the function designator. Stack pointer AR1 is well-positioned, and the return address of the hardware stack is popped (retrieved) in case of C-interrupt runtime events using C-function features (stack). The frame pointer is not modified and registers AR6 and AR7 are not used. 3.1.2 Assembly-Compatible Functions Assembly-compatible functions do not use their own variables, but instead, rely on variables in a software stack where arguments are passed. The AR1 register points to the stack just after the last argument. After the return from the function, the results are placed in the stack. Registers AR0, AR6, and AR7 are not modified. 10 SPRA179 Sine/Cosine With Mathematical Series 3.2 Sine/Cosine Mathematical Series Figure 7 shows the formula for calculating the value SIN(X) of an angle X. X in radian, If (X>=0.0) SIN(X)=((((0.0372*X)–0.2338)*X+0.0544)*X+0.9826)*X+0.0013 else SIN(X)=((((0.0372*X)+0.2338)*X+0.0544)*X–0.9826)*X+0.0013 Figure 7. Formula for Calculating the Value SIN of an Angle Figure 8 shows the formula for calculating the value COS(X) of an angle X. X in radian, If (X>=0.0) COS(X)=(((((-0.0076*X)+0.0595)*X-0.0211)*X-0.4879)*X-0.0028)*X+1.0 else COS(X)=(((((0.0076*X)+0.0595)*X+0.0211)*X-0.4879)*X+0.0028)*X+1.0 Figure 8. Formula for Calculating the Value COS of an Angle 3.3 Functions Functions SINE and COSINE are illustrated by example in the appendix. Conventions to interface with these functions are: • Input: ANGLE parameters are in the stack pointed to by AR1. The value of this angle is unsigned. 0° <-> 0000h 90° <-> 4000h 180° <-> 8000h 240° or -90° <-> C000h • Output: COS(angle) or SIN(angle) are in ACCUMULATOR in Q15 format (–1 to 1–215). 3.4 System Utilization Table 3 shows processor utilization when using the mathematical series method. Table 3. Processor Utilization (Maximum) When Using Mathematical Series FUNCTION CYCLES EXECUTION TIME SIN assembly main 27 1.35 µs COS assembly main 37 1.85 µs SIN fully C-compatible 34 1.70 µs COS fully C-compatible 44 2.20 µs SIN + COS of an angle – assembly main 64 3.20 µs Digital Sine-Wave Generation Using the TMS320C2xx 11 Sine/Cosine With Mathematical Series Table 4 shows memory utilization when using the mathematical series method. Table 4. Memory Utilization When Using Mathematical Series 3.5 FUNCTION ROM (WORDS) STACK LEVELS REGISTERS USED RAM (WORDS) SIN 54 3 1 In stack COS 67 3 1 In stack SIN 64 5 1 In stack COS 77 5 1 In stack COS and SIN 121 3 1 In stack Sine-Generation Precision The following graphs present the precision of the mathematical series of sine functions. The precision measurement is calculated by comparing the mathematical series and floating-point C library results. 12 SPRA179 Sine/Cosine With Mathematical Series 3.5.1 One-Sine-Period Analysis The sine period provides a general image of error calculation. In Figure 9 and Figure 10, results of the sine calculation are in Q15 format. Figure 9. Mathematical Series Sine Calculation From 0 to 2*π With a 0.015-Radian Step Digital Sine-Wave Generation Using the TMS320C2xx 13 Sine/Cosine With Mathematical Series Figure 10. Error Between the C Floating-Point Result and the Mathematical Series SINE Calculation From 0 to 2*π With a 0.015-Radian Step 3.5.2 Quarter-Sine-Period Analysis Figure 11, Figure 12, and Figure 13 graph another precise analysis using a quarter of a half-sine period. In this case, the step is 0.0039 radian. 14 SPRA179 Sine/Cosine With Mathematical Series Figure 11. Results of Mathematical Series Sine From 0 to π/2 With a 0.0039-Radian Step Digital Sine-Wave Generation Using the TMS320C2xx 15 Sine/Cosine With Mathematical Series Figure 12. Error Between the C Floating-Point Result and a Mathematical Series SINE Calculation From 0 to π/4 With a 0.0039-Radian Step in Q15 Format 16 SPRA179 Sine/Cosine With Mathematical Series Figure 13. Error Between the C Floating-Point Result and a Mathematical Series SINE Calculation From 0 to π/4 With a 0.0039-Radian Step in % Digital Sine-Wave Generation Using the TMS320C2xx 17 18 SPRA179 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions Appendix A A.1 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions Main C Program to Call Sine or Cosine Functions ******************************************************************************** *File Name: Main_trig.c * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * *Description: Very simple main which calls COS or SIN function * * * * * *Processor: C2xx * * * *Status: * * * *Last Update: 19 Oct 96 * *______________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * ******************************************************************************** extern ser_cos(); void main() { double rad; double a; int c; . . . if (rad!=0.0) /*–π < rad < +π*/ c=(int)(32767*rad/3.1415927); else c=0; a=ser_cos(c); . } Digital Sine-Wave Generation Using the TMS320C2xx A-1 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions A.2 Main Assembly Program to Call Sine or Cosine Functions ********************************************************************************** *File Name: Main_trig.asm * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: Very simple main which calls COS or SIN function * * * *Processor: C2xx * *Status: * *Last Update: 19 Oct 96 * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * ********************************************************************************** .mmregs .def _ser_sin .sect “vectors” b _c_int0 b $ ********************************************************************************** * Main routine ********************************************************************************** .text _c_int0: . . LAR AR1,#60h MAR *,AR1 A-2 SPRA179 ;stack preparation Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions LACC #4000h ;π/2 SACL *+ ;parameters in stack CALL _ser_sin . ;result in ACCU . .end Digital Sine-Wave Generation Using the TMS320C2xx A-3 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions A.3 COS Function With Direct Look-Up and Linear Interpolation for Assembly Program ********************************************************************************** *Routine Name: COS * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: COS function with Direct Look–up and * * Interpolation Assembly calling function, * * variables in s/w stack. * * * *Status: * * * *Processor: C2xx * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output : COS(angle)*32767, Q15, in ACCU * * Pointed register AR1 * * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * *Last Update: 16 Oct 96 * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * * ********************************************************************************** COS MAR *– LACC #4000h ADDS * SACL * LT *+ ;add 0.5 for COS ;variable in size_sin ;*******stack : angle/X LACC A-4 #64h SPRA179 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions SACL * ;*******stack : angle/TEMP MPYU * PAC SACH ;integer position in the table ;in High part of Acc *+ ;remainder ;*******stack : angle/indice/X SACL * ; ;*******stack : angle/indice/REMAINDER LACC *,15 AND #0ffffh,15 SACH *– ;*******stack : angle/INDICE/remainder BCND equal_sin,EQ LACC #Table_sin ADD *– ;address of beginning of the table ;address of the nearest first indice ;*******stack : ANGLE/indice/remainder TBLR *+ ;*******stack : y1/INDICE/remainder ADD #1h TBLR * ;Load Y2 with the ordinate of the ;*******stack : y1/Y2/remainder ;nearest second indice LACC *– ;*******stack : Y1/y2/remainder SUB *+ ;difference between the two Y value ;*******stack : y1/Y2/remainder SACL *+ ;*******stack : y1/temp/REMAINDER LT *– MPY * ;*******stack : y1/TEMP/remainder ;*******stack : y1/TEMP/remainder SPH *– ;interpolation between Y1 and Y2 ;*******stack : Y1/temp/remainder LACC *+ ADD *,1 ;*******stack : y1/TEMP/remainder ;Y(Xdata) in ACCU RET Digital Sine-Wave Generation Using the TMS320C2xx A-5 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions equal_sin LACC #Table_sin ADD *– ;address of beginning of the table ;address of the pointed indice ;*******stack : RESULT/ TBLR * LACC *+ end_interp_sin RET ********************************************************************************** * Table ********************************************************************************** Table_sin .include Table_sin_end .word 0 .end A-6 SPRA179 sine.tab Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions A.4 COS Function With Direct Look-Up and Linear Interpolation for C Program ********************************************************************************** *Routine Name: _COS * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: COS function with Direct Look–up and * * Interpolation C calling function, variables in C stack. * * Fully C compatible * * * *Status: * * * *Processor: C2xx * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output : COS(angle)*32767, Q15, in ACCU * * Pointed register AR1 * * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * *Last Update: 16 Oct 96 * * * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * * | * ********************************************************************************** _COS ADRK #2 POPD *+ SAR AR1,* LAR AR2,*,AR2 ;C compatibility Digital Sine-Wave Generation Using the TMS320C2xx A-7 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions SBRK #3 SPM 0 LACC #4000h ADDS * SACL * LT *+ ;C compatibility ;add 0.5 for COS ;variable in size_sin ;*******stack : angle/X LACC #64h SACL * MPYU * ;*******stack : angle/TEMP PAC SACH ;integer position in the table ;in High part of Acc *+ ;remainder ;*******stack : angle/indice/X SACL * LACC *,15 AND #0ffffh,15 SACH *– ; ;*******stack : angle/indice/REMAINDER ;*******stack : angle/INDICE/remainder BCND equal_sin,EQ LACC #Table_sin ADD *– ;address of beginning of the table ;address of the nearest first indice ;*******stack : ANGLE/indice/remainder TBLR *+ ADD #1h TBLR * ;*******stack : y1/INDICE/remainder ;Load Y2 with the ordinate of the ;*******stack : y1/Y2/remainder ;nearest second indice LACC *– SUB *+ ;*******stack : Y1/y2/remainder ;difference between the two Y value ;*******stack : y1/Y2/remainder SACL *+ ;*******stack : y1/temp/REMAINDER LT A-8 *– SPRA179 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions ;*******stack : y1/TEMP/remainder MPY * ;*******stack : y1/TEMP/remainder SPH *– LACC *+ ;interpolation between Y1 and Y2 ;*******stack : Y1/temp/remainder ;*******stack : y1/TEMP/remainder ADD *,1,AR1 ;Y(Xdata) in ACCU MAR *– ;C compatibility PSHD *– SBRK #1 RET equal_sin LACC #Table_sin ADD *– TBLR * LACC *+,0,AR1 ;address of beginning of the table ;address of the pointed indice ;*******stack : RESULT/ MAR *– PSHD *– SBRK #1 ;C compatibility RET ********************************************************************************** * Table ********************************************************************************** Table_sin .include sine.tab Table_sin_end .word 0 .end Digital Sine-Wave Generation Using the TMS320C2xx A-9 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions A.5 SIN Function With Direct Look-Up and Linear Interpolation for Assembly Program ********************************************************************************** *Routine Name: SIN * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: SIN function with Direct Look–up and Interpolation * * Assembly calling function, variables in s/w stack. * * * *Status: * * * *Processor: C2xx * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output : SIN(angle)*32767, Q15, in ACCU * * Pointed register AR1 * * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * * * *Last Update: 16 Oct 96 * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * * | * ********************************************************************************** SIN MAR *+ LT *+ LACC #64h SACL * ;variable in size_sin ;*******stack : angle/X A-10 SPRA179 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions ;*******stack : angle/TEMP MPYU * PAC SACH ;integer position in the table ;in High part of Acc *+ ;remainder ;*******stack : angle/indice/X SACL * LACC *,15 AND #0ffffh,15 SACH *– BCND equal_sin,EQ LACC #Table_sin ADD *– ; ;*******stack : angle/indice/REMAINDER ;*******stack : angle/INDICE/remainder ;address of beginning of the table ;address of the nearest first indice ;*******stack : ANGLE/indice/remainder TBLR *+ ADD #1h TBLR * ;*******stack : y1/INDICE/remainder ;Load Y2 with the ordinate of the ;*******stack : y1/Y2/remainder ;nearest second indice LACC *– SUB *+ ;*******stack : Y1/y2/remainder ;difference between the two Y value ;*******stack : y1/Y2/remainder SACL *+ LT *– ;*******stack : y1/temp/REMAINDER ;*******stack : y1/TEMP/remainder MPY * ;*******stack : y1/TEMP/remainder SPH *– LACC *+ ;interpolation between Y1 and Y2 ;*******stack : Y1/temp/remainder ;*******stack : y1/TEMP/remainder ADD *,1 ;Y(Xdata) in ACCU RET equal_sin Digital Sine-Wave Generation Using the TMS320C2xx A-11 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions LACC #Table_sin ADD *– ;address of beginning of the table ;address of the pointed indice ;*******stack : RESULT/ TBLR * LACC *+ ;*******stack : result/X end_interp_sin RET ********************************************************************************* * Table ********************************************************************************* Table_sin .include Table_sin_end .word 0 A-12 SPRA179 sine.tab Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions A.6 SIN Function With Direct Look-Up and Linear Interpolation for C Program ********************************************************************************** *Routine Name: _SIN * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: * SIN function with Direct Look–up + Interpolation * C calling function, variables in C stack. * * Fully C compatible * * * *Status: * * * *Processor: C2x * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output : SIN(angle)*32767, Q15, in ACCU * * Pointed register AR1 * * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * * * *Last Update: 16 Oct 96 * * * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * * | * ********************************************************************************** _SIN ADRK #2 POPD *+ ;C compatibility Digital Sine-Wave Generation Using the TMS320C2xx A-13 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions SAR AR1,* LAR AR2,*,AR2 SBRK #3 SPM 0 LT *+ LACC #64h SACL * ;C compatibility ;variable in size_sin ;*******stack : angle/X ;*******stack : angle/TEMP MPYU * PAC ;integer position in the table ;in High part of Acc SACH *+ ;remainder SACL * ; ;*******stack : angle/indice/X ;*******stack : angle/indice/REMAINDER LACC *,15 AND #0ffffh,15 SACH *– BCND equal_sin,EQ LACC #Table_sin ADD *– ;*******stack : angle/INDICE/remainder ;address of beginning of the table ;address of the nearest first indice ;*******stack : ANGLE/indice/remainder TBLR *+ ;*******stack : y1/INDICE/remainder ADD #1h TBLR * ;Load Y2 with the ordinate of the ;*******stack : y1/Y2/remainder ;nearest second indice LACC *– ;*******stack : Y1/y2/remainder SUB *+ ;difference between the two Y value ;*******stack : y1/Y2/remainder SACL *+ LT *– ;*******stack : y1/temp/REMAINDER ;*******stack : y1/TEMP/remainder A-14 SPRA179 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions MPY * ;*******stack : y1/TEMP/remainder SPH *– ;interpolation between Y1 and Y2 ;*******stack : Y1/temp/remainder LACC *+ ;*******stack : y1/TEMP/remainder ADD *,1,AR1 ;Y(Xdata) in ACCU MAR *– ;C compatibility PSHD *– SBRK #1 RET equal_sin LACC #Table_sin ADD *– ;address of beginning of the table ;address of the pointed indice ;*******stack : RESULT/... TBLR * LACC *+,0,AR1 ;*******stack : result/X MAR *– PSHD *– SBRK #1 ;C compatibility RET ********************************************************************************** * Table ********************************************************************************** Table_sin .include sine.tab Table_sin_end .word 0 Digital Sine-Wave Generation Using the TMS320C2xx A-15 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions A.7 Table for COS or SIN Function With Direct Look-Up ********************************************************************************** * TABLE Sine and Cosine for separate functions COS and SIN * ********************************************************************************** .word 0 .word 2057 .word 4107 .word 6140 .word 8149 .word 10126 .word 12062 .word 13952 .word 15786 .word 17557 .word 19260 .word 20886 .word 22431 .word 23886 .word 25247 .word 26509 .word 27666 .word 28714 .word 29648 .word 30466 .word 31163 .word 31738 .word 32187 .word 32509 .word 32702 .word 32767 .word 32702 .word 32509 .word 32187 .word 31738 .word 31163 .word 30466 .word 29648 .word 28714 A-16 SPRA179 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions .word 27666 .word 26509 .word 25247 .word 23886 .word 22431 .word 20886 .word 19260 .word 17557 .word 15786 .word 13952 .word 12062 .word 10126 .word 8149 .word 6140 .word 4107 .word 2057 .word 0 .word –2057 .word –4107 .word –6140 .word –8149 .word –10126 .word –12062 .word –13952 .word –15786 .word –17557 .word –19260 .word –20886 .word –22431 .word –23886 .word –25247 .word –26509 .word –27666 .word –28714 .word –29648 .word –30466 .word –31163 .word –31738 Digital Sine-Wave Generation Using the TMS320C2xx A-17 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions .word –32187 .word –32509 .word –32702 .word –32767 .word –32702 .word –32509 .word –32187 .word –31738 .word –31163 .word –30466 .word –29648 .word –28714 .word –27666 .word –26509 .word –25247 .word –23886 .word –22431 .word –20886 .word –19260 .word –17557 .word –15786 .word –13952 .word –12062 .word –10126 .word –8149 .word –6140 .word –4107 .word –2057 A-18 SPRA179 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions A.8 COS_SIN Function With Direct Look-Up and Linear Interpolation for Assembly Program ********************************************************************************** *Routine Name: COS_SIN * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: COS+SIN function with Direct Look–up and Interpolation * * Assembly calling function, variables in s/w stack. * * * *Status: * * * *Processor: C2xx * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output: * * SIN(angle)*32767, Q15, in stack pointed by AR1–1 * * COS(angle)*32767,Q15, in stack pointed by AR1 * * Pointed register AR1 * * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * *Last Update: 16 Oct 96 * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * * | * ********************************************************************************** size_tab .set 64h ;this is not an error COS_SIN MAR *+ LT *+ ;variable in size_sin Digital Sine-Wave Generation Using the TMS320C2xx A-19 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions ;*stack: angle/X LACC #size_tab SACL * MPYU * ;*stack: angle/TEMP PAC SACH ;integer position in the table ;in High part of Acc *+ ;remainder ;*stack: angle/indice/X SACL * ; ;*stack: angle/indice/REMAINDER LACC *,15 AND #0ffffh,15 SACH *– BCND equal_sin,EQ LACC #Table_sin_cos ADD *– ;*stack: angle/INDICE/remainder ;address of beginning of the table ;address of the nearest first indice ;*stack: ANGLE/indice/remainder TBLR *+ ADD #1h TBLR *+ ;*stack: y1/INDICE/remainder ;Load Y2 with the ordinate of the ;nearest second indice ;*stack: y1/y2/REMAINDER ADRK #1 ;*stack: y1/y2/remainder/X ADD #18h TBLR *+ ;*stack: y1/y2/remainder/yy1/X ADD #1h TBLR * ;*stack: y1/y2/remainder/yy1/YY2 LACC *– ;calculate cos interpolate ;*stack: y1/y2/remainder/YY1/yy2 SUB *+ ;difference between the two Y value SACL * ;*stack: y1/y2/remainder/yy1/TEMP LT *– ;*stack: y1/y2/remainder/yy1/YY2 A-20 SPRA179 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions ;*stack: y1/y2/remainder/YY1 SBRK #1 ;*stack: y1/y2/REMAINDER/yy1 MPY * ;*stack: y1/y2/REMAINDER/yy1 ADRK #2 ;*stack: y1/y2/remainder/yy1/TEMP SPH *– ;interpolation between Y1 and Y2 ;*stack: Y1/y2/remainder/YY1/temp LACC *+ ADD *–,1 ;*stack: y1/y2/remainder/yy1/TEMP ;Y(Xdata) in ACCU ;*stack: y1/y2/remainder/YY1 SACL *– ;*stack: y1/y2/REMAINDER/cos ;calculate sin interpolate SBRK #1 ;*stack: y1/Y2/remainder/cos LACC *– SUB *+ ;*stack: Y1/y2/remainder ;difference between the two Y value ;*stack: y1/Y2/remainder/cos SACL *+ ;*stack: y1/temp/REMAINDER/cos LT *– ;*stack: y1/TEMP/remainder/cos MPY * ;*stack: y1/TEMP/remainder/cos SPH *– LACC *+ ;interpolation between Y1 and Y2 ;*stack: Y1/temp/remainder/cos ;*stack: y1/TEMP/remainder/cos ADD *–,1 ;Y(Xdata) in ACCU ;*stack: y1/temp/remainder/cos SACL * ADRK #3 ;*stack: SIN/temp/remainder/cos ;*stack: sin/temp/remainder/COS LACC * Digital Sine-Wave Generation Using the TMS320C2xx A-21 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions SBRK #2 ;*stack: sin/TEMP/remainder/cos SACL * ;*stack: sin/COS RET equal_sin LALK Table_sin_cos ;address of beginning of the table ;*stack: angle/INDICE/remainder ADD *– ;address of the pointed indice ;*stack: ANGLE/indice TBLR *+ ;*stack: sin/INDICE/remainder ADD #19h TBLR * ;*stack: sin/COS end_interp_sin RET ********************************************************************************** * Table ********************************************************************************** Table_sin_cos .include sin_cos.tab Table_sin_cos_end .word A-22 0 SPRA179 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions A.9 Table for COS_SIN Function With Direct Look-Up ********************************************************************************** * TABLE Sine + Cosine for functions COS_SIN * ********************************************************************************** .word 0 .word 2057 .word 4107 .word 6140 .word 8149 .word 10126 .word 12062 .word 13952 .word 15786 .word 17557 .word 19260 .word 20886 .word 22431 .word 23886 .word 25247 .word 26509 .word 27666 .word 28714 .word 29648 .word 30466 .word 31163 .word 31738 .word 32187 .word 32509 .word 32702 .word 32767 .word 32702 .word 32509 .word 32187 .word 31738 .word 31163 .word 30466 .word 29648 .word 28714 Digital Sine-Wave Generation Using the TMS320C2xx A-23 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions .word 27666 .word 26509 .word 25247 .word 23886 .word 22431 .word 20886 .word 19260 .word 17557 .word 15786 .word 13952 .word 12062 .word 10126 .word 8149 .word 6140 .word 4107 .word 2057 .word 0 .word –2057 .word –4107 .word –6140 .word –8149 .word –10126 .word –12062 .word –13952 .word –15786 .word –17557 .word –19260 .word –20886 .word –22431 .word –23886 .word –25247 .word –26509 .word –27666 .word –28714 .word –29648 .word –30466 .word –31163 .word –31738 A-24 SPRA179 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions .word –32187 .word –32509 .word –32702 .word –32767 .word –32702 .word –32509 .word –32187 .word –31738 .word –31163 .word –30466 .word –29648 .word –28714 .word –27666 .word –26509 .word –25247 .word –23886 .word –22431 .word –20886 .word –19260 .word –17557 .word –15786 .word –13952 .word –12062 .word –10126 .word –8149 .word –6140 .word –4107 .word –2057 .word 0 .word 2057 .word 4107 .word 6140 .word 8149 .word 10126 .word 12062 .word 13952 .word 15786 .word 17557 Digital Sine-Wave Generation Using the TMS320C2xx A-25 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions .word 19260 .word 20886 .word 22431 .word 23886 .word 25247 .word 26509 .word 27666 .word 28714 .word 29648 .word 30466 .word 31163 .word 31738 .word 32187 .word 32509 .word 32702 A-26 SPRA179 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions A.10 SIN With Mathematical Series for Assembly Program ********************************************************************************** *Routine Name: sin_ser * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: SIN function with Mathematical Series * * Assembly calling function, variables in s/w stack. * * * *Status: * * * *Processor: C2xx * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output : SIN(angle)*32767, Q15, in ACCU * * Pointed register AR1 * * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * * * *Last Update: 18 Oct 96 * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * * | * ********************************************************************************** sin_ser SETC SXM MAR *– LAC * BCND angle_neg,LT angle_pos Digital Sine-Wave Generation Using the TMS320C2xx A-27 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions LT *+ ;variable in size_sin ;*stack : angle/X MPY #0c90h ;abscissa scale modify degree –> rad *,4 ;angle in rad PAC SACH ;*stack : angle/RAD LT *+ ;*stack : angle/rad/X MPY #985h ;0.0372 ; ;PREG : angle * 0.0372 LACC #0C426h,13 APAC SACH ; in high ACCU ;ACCU : –0.2338 + angle * 0.0372 * ,3 ;temporary value ;angle in TREG MPY * ;multiply by temporary value ;temporary value ;*stack : angle/rad/TEMP LACC #6f69h,10 APAC SACH ;0.0544 ;ACCU: temp + 0.0544 *,2 ;temp ;*stack : angle/RAD/temp ;angle in TREG ;*stack : angle/rad/TEMP MPY * ;temp LACC #7dc5h,13 ;0.9826 *,3 ;treg = rad APAC SACH ;ACCU=0.9826+temp ;temp MPY * ;rad * temp ;temp * angle LACC #05532,4 ;0.0013 SACH * ,3 ;result LACC *– APAC ;*stack : angle/SIN RET A-28 SPRA179 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions angle_neg LT *+ ;variable in size_sin MPY #0c90h ;abscisse scale modif degre –> rad *,4 ;angle in rad ;*stack : angle/X PAC SACH ;*stack : angle/RAD LT *+ ;*stack : angle/rad/X MPY #985h ;0.0372 ; ;PREG : angle * 0.0372 LACC #03bdah,13 APAC ; in high ACCU ;ACCU : –0.2338 + angle * 0.0372 SACH * ,3 ;temporary value MPY * ;multiply by temporary value ;angle in TREG ;temporary value ;*stack : angle/rad/TEMP LACC #6f69h,10 APAC SACH ;0.0544 ;ACCU: temp + 0.0544 *,2 ;temp ;*stack : angle/RAD/temp ;angle in TREG ;*stack : angle/rad/TEMP MPY * ;temp LACC #7dc5h,13 ;0.9826 SPAC ;ACCU=0.9826+temp SACH *,3 ;treg = rad MPY * ;rad * temp ;temp * angle LACC #05532,4 ;0.0013 SACH *,3 ;result LACC *– APAC ;*stack : angle/SIN RET Digital Sine-Wave Generation Using the TMS320C2xx A-29 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions A.11 SIN With Mathematical Series for C Program ********************************************************************************** *Routine Name: _sin_ser * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: SIN function with Mathematical Series * * C calling function, variables in C stack. * * Fully C compatible * * * *Status: * * * *Processor: C2xx * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output : SIN(angle)*32767, Q15, in ACCU * * Pointed register AR1 * * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * *Last Update: 18 Oct 96 * * * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * * | * ********************************************************************************** _sin_ser ADRK #2 POPD *+ SAR AR1,* LAR AR2,*,AR2 SBRK #3 A-30 SPRA179 ;C compatibility ;C compatibility Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions SPM 0 SETC SXM LACC * BCND angle_neg,LT angle_pos LT *+ ;variable in size_sin ;*stack : angle/X MPY #0c90h ;abscissa scale modify degree –> rad ;in PAC SACH *,4 LT *+ ;angle in rad ;*stack : angle/RAD ;*stack : angle/rad/X MPY #985h ;0.0372 ; ;PREG : angle * 0.0372 LACC #0C426h,13 APAC ; in high ACCU ;ACCU : –0.2338 + angle * 0.0372 SACH * ,3 ;temporary value MPY * ;multiply by temporary value ;angle in TREG ;temporary value ;*stack : angle/rad/TEMP LACC #6f69h,10 APAC SACH ;0.0544 ;ACCU: temp + 0.0544 *,2 ;temp ;*stack : angle/RAD/temp ;angle in TREG ;*stack : angle/rad/TEMP MPY * ;temp LACC #7dc5h,13 ;0.9826 APAC SACH ;ACCU=0.9826+temp *,3 ;treg = rad ;temp MPY * ;rad * temp Digital Sine-Wave Generation Using the TMS320C2xx A-31 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions ;temp * angle LACC #05532,4 ;0.0013 SACH * ,3 ;result LACC *–,0,AR1 APAC ;*stack : angle/SIN MAR *– PSHD *– SBRK #1 ;C compatibility RET angle_neg LT *+ ;variable in size_sin ;*stack : angle/X MPY #0c90h ;abscisse scale modif degre –> rad *,4 ;angle in rad PAC SACH ;*stack : angle/RAD LT *+ ;*stack : angle/rad/X MPY #985h ;0.0372 ; ;PREG : angle * 0.0372 LACC #03bdah,13 APAC SACH ; in high ACCU ;ACCU : –0.2338 + angle * 0.0372 * ,3 ;temporary value ;angle in TREG MPY * ;multiply by temporary value ;temporary value ;*stack : angle/rad/TEMP LACC #6f69h,10 APAC SACH ;0.0544 ;ACCU: temp + 0.0544 *,2 ;temp ;*stack : angle/RAD/temp ;angle in TREG ;*stack : angle/rad/TEMP MPY A-32 * SPRA179 ;temp Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions LACC #7dc5h,13 SPAC ;0.9826 ;ACCU=0.9826+temp SACH *,3 ;treg = rad MPY * ;rad * temp ;temp * angle LACC #05532,4 ;0.0013 SACH *,3 ;result LACC *–,0,AR1 APAC ;*stack : angle/SIN MAR *– PSHD *– SBRK #1 ;C compatibility RET Digital Sine-Wave Generation Using the TMS320C2xx A-33 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions A.12 COS With Mathematical Series for Assembly Program ********************************************************************************** *Routine Name: cos_ser * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: COS function with Mathematical Series * * Assembly calling function, variables in s/w stack. * * * *Status: * * * *Processor: C2xx * * * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output : COS(angle)*32767, Q15, in ACCU * * Pointed register AR1 * * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * * * *Last Update: 18 Oct 96 * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * * | * ********************************************************************************** cos_ser SETC SXM MAR *– LACC * BCND angle_neg,LT A-34 SPRA179 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions angle_pos LT *+ ;variable in size_sin ;*stack : angle/X MPY #0c90h ;abscisse scale modif degre –> rad SACH *,4 ;angle in rad LT *+ PAC ;*stack : angle/RAD ;*stack : angle/rad/X MPY #1070h ;0.0076 neg ; ;PREG : angle * 0.0076 LACC #01e76h,15 ; in high ACCU * ,3 ;temporary value APAC SACH ;ACCU : +0.0595 + angle * 0.0076 ;angle in TREG MPY * ;multiply by temporary value ;temporary value ;*stack : angle/rad/TEMP LACC #0f532h,15 APAC SACH ;0.0211 ;ACCU: temp + 0.0211 * ;temp ;*stack : angle/RAD/temp ;angle in TREG ;*stack : angle/rad/TEMP MPY * ;temp LACC #0e0c6h,15 ;0.4879 APAC ;ACCU=0.9826+temp SACH *,2 ;treg = rad MPY * ;rad * temp ;temp * angle LACC #0a440h,5 ;0.0028 SACH *,2 ;result MPY * ; LACC #1000h,15 ;1 APAC APAC Digital Sine-Wave Generation Using the TMS320C2xx A-35 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions SETC OVM SACH *,3 LACC *,16 ADD *,16 SACH * LACC *– ;*stack : angle/SIN RET angle_neg LT *+ ;variable in size_sin ;*stack : angle/X MPY #0c90h ;abscisse scale modif degre –> rad *,4 ;angle in rad PAC SACH ;*stack : angle/RAD LT *+ ;*stack : angle/rad/X MPY #0f90h ;0.0076 neg ; ;PREG : angle * 0.0076 LACC #01e76h,15 ; in high ACCU * ,3 ;temporary value APAC SACH ;ACCU : +0.0595 + angle * 0.0076 ;angle in TREG MPY * ;multiply by temporary value ;temporary value ;*stack : angle/rad/TEMP LACC #00aceh,15 APAC SACH ;0.0211 ;ACCU: temp + 0.0211 * ;temp ;*stack : angle/RAD/temp ;angle in TREG ;*stack : angle/rad/TEMP MPY * ;temp LACC #0e0c6h,15 ;0.4879 APAC A-36 ;ACCU=0.9826+temp SPRA179 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions SACH *,2 ;treg = rad ;temp MPY * ;rad * temp ;temp * angle LACC #05bc0h,5 ;0.0028 APAC SACH *,2 ;result MPY * ; LACC #1000h,15 ;1 APAC SETC OVM SACH *,3 LACC *,16 ADD *,16 SACH * LACC *– ;*stack : angle/SIN RET Digital Sine-Wave Generation Using the TMS320C2xx A-37 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions A.13 COS With Mathematical Series for C Program ********************************************************************************** *Routine Name: _cos_ser * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: COS function with Mathematical Series * * C calling function, * * variables in C stack. Fully C compatible * * * *Status: * * * *Processor: C2xx * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output : COS(angle)*32767, Q15, in ACCU * * Pointed register AR1 * * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * *Last Update: 18 Oct 96 * * * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * * | * ********************************************************************************** _cos_ser ADRK #2 POPD *+ SAR AR1,* LAR AR2,*,AR2 SBRK #3 A-38 SPRA179 ;C compatibility ;C compatibility Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions SPM 0 SETC SXM LAC * BCND angle_neg,LT angle_pos LT *+ ;variable in size_sin ;*stack : angle/X MPY #0c90h ;abscisse scale modif degre –> rad SACH *,4 ;angle in rad LT *+ PAC ;*stack : angle/RAD ;*stack : angle/rad/X MPY #1070h ;0.0076 neg ; ;PREG : angle * 0.0076 LACC #01e76h,15 APAC ; in high ACCU ;ACCU : +0.0595 + angle * 0.0076 SACH * ,3 ;temporary value MPY * ;multiply by temporary value ;angle in TREG ;temporary value ;*stack : angle/rad/TEMP LACC #0f532h,15 APAC SACH ;0.0211 ;ACCU: temp + 0.0211 * ;temp ;*stack : angle/RAD/temp ;angle in TREG ;*stack : angle/rad/TEMP MPY * ;temp LACC #0e0c6h,15 ;0.4879 APAC SACH ;ACCU=0.9826+temp *,2 ;treg = rad ;temp Digital Sine-Wave Generation Using the TMS320C2xx A-39 Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions MPY * ;rad * temp ;temp * angle LACC #0a440h,5 ;0.0028 SACH *,2 ;result MPY * ; LACC #1000h,15 ;1 APAC APAC SETC OVM SACH *,3 LACC *,16 ADD *,16 SACH * LACC *–,0,AR1 ;*stack : angle/SIN MAR *– PSHD *– SBRK #1 ;C compatibility RET angle_neg LT *+ ;variable in size_sin ;*stack : angle/X MPY #0c90h ;abscisse scale modif degre –> rad *,4 ;angle in rad PAC SACH ;*stack : angle/RAD LT *+ MPY #0f90h ;*stack : angle/rad/X ;0.0076 neg ; ;PREG : angle * 0.0076 LACC #01e76h,15 APAC SACH ; in high ACCU ;ACCU : +0.0595 + angle * 0.0076 * ,3 ;temporary value ;angle in TREG MPY A-40 * SPRA179 ;multiply by temporary value Examples of a C Program and an Assembly Program Calling Sine and Cosine Functions ;temporary value ;*stack : angle/rad/TEMP LACC #00aceh,15 APAC SACH ;0.0211 ;ACCU: temp + 0.0211 * ;temp ;*stack : angle/RAD/temp ;angle in TREG ;*stack : angle/rad/TEMP MPY * ;temp LACC #0e0c6h,15 ;0.4879 APAC ;ACCU=0.9826+temp SACH *,2 ;treg = rad MPY * ;rad * temp ;temp * angle in Q28 LACC #05bc0h,5 ;0.0028 SACH *,2 ;result MPY * ; LACC #1000h,15 ;1 APAC SETC OVM SACH *,3 LACC *,16 ADD *,16 SACH * LACC *–,0,AR1 ;*stack : angle/SIN MAR *– PSHD *– SBRK #1 ;C compatibility RET Digital Sine-Wave Generation Using the TMS320C2xx A-41 A-42 SPRA179 Digital Sine-Wave Generation Using the TMS320C2xx ABSTRACT This application report describes two methods for implementing a digital sine-wave generator using the TMS320C2xx: the use of a direct look-up table with linear interpolation, and the use of mathematical series. Both methods are explained in terms of C-compatible and assembly-compatible functions. Formulas used for calculating and graphing the results are included for each method to demonstrate the differences. B Introduction Sine-wave generators are fundamental building blocks of signal processing systems for use in control applications. The following two methods are described in this application report for implementing a digital sine-wave generator using the TMS320C2xx: • Direct look-up with linear interpolation to provide sine waves with a minimum of harmonic distortion • Realization of the sine/cosine functions with a mathematical series The two methods respond to different constraints. The direct look-up method is fast with minimum errors and is significant in ROM programming requirements. The mathematical series method is fast and requires minimum (ROM) programming but results in less precision. Digital Sine-Wave Generation Using the TMS320C2xx A-1 Direct Look-Up and Linear Interpolation Method C Direct Look-Up and Linear Interpolation Method This section describes the Direct Look- Up and Linear Interpolation method of implementing a digital sine-wave generator using the TMS320C2xx. C.1 C- and Assembly-Compatible Functions The Direct Look-Up method, which uses 100 sine-period values in a table, reveals the sine/cosine functions. To provide minimum harmonic distortion, the method includes linear interpolation with a fixed-step table. An extended table is used for the cosine + sine function and is located in program memory. Two versions of each function are presented : • C-compatible functions • Assembly-compatible functions Examples of a C program and an assembly program (that call sine and cosine functions) are in the appendix. C.1.1 C-Compatible Functions Fully C-compatible functions employ C conventions to use the stack for parameters passed to the functions. Parameters returned by the functions are passed by a pointer. Responsibilities of called functions are managed in a postfix expression called the function designator. Stack pointer AR1 is well-positioned, and the return address of the hardware stack is popped (retrieved) in case of C-interrupt runtime events using C-function features (stack). The frame pointer is not modified and registers AR6 and AR7 are not used. C.1.2 Assembly-Compatible Functions Assembly-compatible functions do not use their own variables, but instead, rely on variables in a software stack where arguments are passed. The AR1 register points to the stack just after the last argument. After the return from the function, the results are placed in the stack. Registers AR0, AR6, and AR7 are not modified. A-2 STDZ001A Direct Look-Up and Linear Interpolation Method C.2 Interpolation Figure B–1 shows the formula and the resulting graph for calculating the table interpolation value COS(X) of an angle X. y y X –x Y = y + i x i+ 1 r = - i+1 Y=? i ( y i+ 1 x y ) i y i i ratio x i X x x i+1 where: {xi} = {first coordinates of the table}, {yi} = {second coordinates of the table}, i chosen so that xi < X < xi+1. Figure B–1. The Formula and the Resulting Graph for Calculating the Table Interpolation Value COS of an Angle Table interpolation is comprised of two steps: 1. Direct look-up: looking through the table to find the interval [xi, xi+1] at which the considered angle X is located, with xi < X < xi+1. • C.3 Interpolation: solving the above mentioned calculation to obtain Y. Functions Functions SINE, COSINE, and SINE + COSINE are illustrated by example in the appendix. Conventions to interface with this function are: • Input: ANGLE parameters are in the stack pointed by AR1. The value of this angle is unsigned. 0° <-> 0000h 90° <-> 4000h 180° <-> 8000h 240° <-> C000h • Output: COS(angle) or SIN(angle) are in ACCUMULATOR in Q15 format (–1 to 1–215). C.4 System Utilization Table E–1 shows processor utilization when using the direct look-up and linear interpolation methods. Digital Sine-Wave Generation Using the TMS320C2xx A-3 Direct Look-Up and Linear Interpolation Method Table E–1. Processor Utilization (Maximum) When Using Table Look-Up and Interpolation FUNCTION CYCLES EXECUTION TIME SIN assembly call 35 1.75 µs COS assembly call 38 1.90 µs SIN fully C-compatible 42 2.10 µs COS fully C-compatible 45 2.25 µs SIN + COS of an angle 58 2.90 µs Table E–2 shows memory utilization when using the direct look-up and linear interpolation method. Table E–2. Memory Utilization When Using Direct Look-Up and Interpolation FUNCTION ROM (WORDS) STACKLEVELS REGISTERS USED RAM (WORDS) SIN ssembly call 32 + 100 3 1 In stack COS assembly call 34 + 100 3 1 In stack COS and SINassembly call 66 + 100 3 1 In stack SIN Fully C compatible 42 + 100 5 1 In stack COS assembly call 44 + 100 5 1 In stack COS + SIN in one function† assembly call 55 + 125 3 1 In stack † In the case of Sine + Cosine, the same table is used. C.5 Sine-Generation Precision Figure B–2 and Figure B–3 are graphs that present the precision of the direct look-up and linear interpolation sine functions. The precision measurement is made by comparing the direct look-up and the floating-point C library results. C.5.1 One-Sine-Period Analysis The sine period provides a general image of error calculation. In Figure B–2 and Figure B–3, results of the sine calculation are in Q15 format. A-4 STDZ001A Direct Look-Up and Linear Interpolation Method Figure B–2. Direct Look-Up With Interpolation of Sine Calculation From 0 to 2*π With a 0.015-Radian Step Digital Sine-Wave Generation Using the TMS320C2xx A-5 Direct Look-Up and Linear Interpolation Method Figure B–3. Error Between the C Floating-Point Result and Direct Look-Up Calculation From 0 to 2*π With a 0.015-Radian Step A-6 STDZ001A Direct Look-Up and Linear Interpolation Method C.5.2 Quarter-Sine-Period Analysis Figure B–4, Figure B–5, and Figure B–6 graph another precise analysis using a quarter of a half-sine period. In this case, the step is 0.0039 radian. The interpolation is made at 0.125-radian intervals. In this way, interpolation error is exposed on the following graphs. Each interval (table approximation) is displayed with 32 pixels. Figure B–4. Results of Direct Look-Up SIN From 0 to π/2 With a 0.0039-Radian Step Digital Sine-Wave Generation Using the TMS320C2xx A-7 Direct Look-Up and Linear Interpolation Method Figure B–5. Error Between the C Floating-Point Result and Direct Look-Up SINE Calculation From 0 to π/4 With a 0.0039-Radian Step in Q15 Format A-8 STDZ001A Direct Look-Up and Linear Interpolation Method Figure B–6. Error Between the C Floating-Point Result and Direct Look-Up SINE Calculation From 0 to π/4 With a 0.0039-Radian Step in % Digital Sine-Wave Generation Using the TMS320C2xx A-9 Sine/Cosine With Mathematical Series D Sine/Cosine With Mathematical Series This section explains the second of two methods of implementing a digital sine-wave generator using the TMS320C2xx. D.1 C- and Assembly-Compatible Functions The sine/cosine method calculates the sine/cosine functions with a mathematical series for the sine period and a mathematical series for cosine. Calculations are made with fixed-point instructions to optimize the time calculation. The dynamics used in the calculation fit with maximum precision without overflow. Two versions of each function are presented : • C-compatible functions • Assembly-compatible functions Examples of a C program and an assembly program (that call sine and cosine functions) are in the appendix. D.1.1 C-Compatible Functions Fully C-compatible functions employ C conventions to use the stack for parameters passed to the functions. Parameters returned by functions are passed by a pointer. Responsibilities of called functions are managed in a postfix expression called the function designator. Stack pointer AR1 is well-positioned, and the return address of the hardware stack is popped (retrieved) in case of C-interrupt runtime events using C-function features (stack). The frame pointer is not modified and registers AR6 and AR7 are not used. D.1.2 Assembly-Compatible Functions Assembly-compatible functions do not use their own variables, but instead, rely on variables in a software stack where arguments are passed. The AR1 register points to the stack just after the last argument. After the return from the function, the results are placed in the stack. Registers AR0, AR6, and AR7 are not modified. A-10 STDZ001A Sine/Cosine With Mathematical Series D.2 Sine/Cosine Mathematical Series Figure B–7 shows the formula for calculating the value SIN(X) of an angle X. X in radian, If (X>=0.0) SIN(X)=((((0.0372*X)–0.2338)*X+0.0544)*X+0.9826)*X+0.0013 else SIN(X)=((((0.0372*X)+0.2338)*X+0.0544)*X–0.9826)*X+0.0013 Figure B–7. Formula for Calculating the Value SIN of an Angle Figure B–8 shows the formula for calculating the value COS(X) of an angle X. X in radian, If (X>=0.0) COS(X)=(((((-0.0076*X)+0.0595)*X-0.0211)*X-0.4879)*X-0.0028)*X+1.0 else COS(X)=(((((0.0076*X)+0.0595)*X+0.0211)*X-0.4879)*X+0.0028)*X+1.0 Figure B–8. Formula for Calculating the Value COS of an Angle D.3 Functions Functions SINE and COSINE are illustrated by example in the appendix. Conventions to interface with these functions are: • Input: ANGLE parameters are in the stack pointed toby AR1. The value of this angle is unsigned. 0º <-> 0000h 90 º <-> 4000h 180 º <-> 8000h 240 º or -90º <-> C000h • Output: COS(angle) or SIN(angle) are in ACCUMULATOR in Q15 format (–1 to 1–215). D.4 System Utilization Table E–3 shows processor utilization when using the mathematical series method. Table E–3. Processor Utilization (Maximum) When Using Mathematical Series FUNCTION CYCLES EXECUTION TIME SIN assembly main 27 1.35 µs COS assembly main 37 1.85 µs SIN fully C-compatible 34 1.70 µs COS fully C-compatible 44 2.20 µs SIN + COS of an angle – assembly main 64 3.20 µs Digital Sine-Wave Generation Using the TMS320C2xx A-11 Sine/Cosine With Mathematical Series Table E–4 shows memory utilization when using the mathematical series method. Table E–4. Memory Utilization When Using Mathematical Series D.5 FUNCTION ROM (WORDS) STACK LEVELS REGISTERS USED RAM (WORDS) SIN 54 3 1 In stack COS 67 3 1 In stack SIN 64 5 1 In stack COS 77 5 1 In stack COS and SIN 121 3 1 In stack Sine-Generation Precision The following graphs present the precision of the mathematical series of sine functions. The precision measurement is calculated by comparing the mathematical series and floating-point C library results. A-12 STDZ001A Sine/Cosine With Mathematical Series D.5.1 One-Sine-Period Analysis The sine period provides a general image of error calculation. In Figure B–9 and Figure B–10, results of the sine calculation are in Q15 format. Figure B–9. Mathematical Series Sine Calculation From 0 to 2*π With a 0.015-Radian Step Digital Sine-Wave Generation Using the TMS320C2xx A-13 Sine/Cosine With Mathematical Series Figure B–10. Error Between the C Floating-Point Result and the Mathematical Series SINE Calculation From 0 to 2*π With a 0.015-Radian Step D.5.2 Quarter-Sine-Period Analysis Figure B–11, Figure B–12, and Figure B–13 graph another precise analysis using a quarter of a half-sine period. In this case, the step is 0.0039 radian. A-14 STDZ001A Sine/Cosine With Mathematical Series Figure B–11. Results of Mathematical Series Sine From 0 to π/2 With a 0.0039-Radian Step Digital Sine-Wave Generation Using the TMS320C2xx A-15 Sine/Cosine With Mathematical Series Figure B–12. Error Between the C Floating-Point Result and a Mathematical Series Sine Calculation From 0 to π/4 With a 0.0039-Radian Step in Q15 Format A-16 STDZ001A Sine/Cosine With Mathematical Series Figure B–13. Error Between the C Floating-Point Result and a Mathematical Series Sine Calculation From 0 to π/4 With a 0.0039-Radian Step in % Digital Sine-Wave Generation Using the TMS320C2xx A-17 ******************************************************************************** *File Name: Main_trig.c * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * *Description: Very simple main which calls COS or SIN function * * * * * *Processor: C2xx * * * *Status: * * * *Last Update: 19 Oct 96 * *______________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * ******************************************************************************** extern ser_cos(); void main() { double rad; double a; int c; . . . if (rad!=0.0) /*–π < rad < +π*/ c=(int)(32767*rad/3.1415927); else c=0; a=ser_cos(c); . } ********************************************************************************** *File Name: Main_trig.asm * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * A-1 * * *Description: Very simple main which calls COS or SIN function * * * *Processor: C2xx * *Status: * *Last Update: 19 Oct 96 * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * ********************************************************************************** .mmregs .def _ser_sin .sect “vectors” b _c_int0 b $ ********************************************************************************** * Main routine ********************************************************************************** .text _c_int0: . . LAR AR1,#60h MAR *,AR1 A-2 ;stack preparation LAC #4000h ;π/2 SACL *+ ;parameters in stack CALL _ser_sin . ;result in ACCU . .end ********************************************************************************** *Routine Name: COS * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: COS function with Direct Look–up and * * Interpolation Assembly calling function, * * variables in s/w stack. * * * *Status: * * * *Processor: C2xx * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output : COS(angle)*32767, Q15, in ACCU * * Pointed register AR1 * * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * *Last Update: 16 Oct 96 * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * * ********************************************************************************** COS MAR *– LAC #4000h ADDS * ;add 0.5 for COS A-3 SACL * LT *+ ;variable in size_sin ;*******stack : angle/X LAC #64h SACL * ;*******stack : angle/TEMP MPYU * PAC SACH ;integer position in the table ;in High part of Acc *+ ;remainder ;*******stack : angle/indice/X SACL * ; ;*******stack : angle/indice/REMAINDER LAC *,15 ANDK #0ffffh,15 SACH *– ;*******stack : angle/INDICE/remainder BCND equal_sin,EQ LALK Table_sin ;address of beginning of the table ADD *– ;address of the nearest first indice TBLR *+ ;*******stack : ANGLE/indice/remainder ;*******stack : y1/INDICE/remainder ADD #1h TBLR * ;Load Y2 with the ordinate of the ;*******stack : y1/Y2/remainder ;nearest second indice LAC *– ;*******stack : Y1/y2/remainder SUB *+ SACL *+ ;difference between the two Y value ;*******stack : y1/Y2/remainder ;*******stack : y1/temp/REMAINDER LT *– ;*******stack : y1/TEMP/remainder MPY * SPH *– ;*******stack : y1/TEMP/remainder ;interpolation between Y1 and Y2 ;*******stack : Y1/temp/remainder A-4 LAC *+ ;*******stack : y1/TEMP/remainder ADD *,1 ;Y(Xdata) in ACCU LALK Table_sin ;address of beginning of the table ADD *– ;address of the pointed indice RET equal_sin ;*******stack : RESULT/ TBLR * LAC *+ end_interp_sin RET ********************************************************************************** * Table ********************************************************************************** Table_sin .include sine.tab Table_sin_end .word 0 .end ********************************************************************************** *Routine Name: _COS * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: COS function with Direct Look–up and * * Interpolation C calling function, variables in C stack. * * Fully C compatible * * * *Status: * * * *Processor: C2xx * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output : COS(angle)*32767, Q15, in ACCU * * Pointed register AR1 * A-5 * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * *Last Update: 16 Oct 96 * * * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * * | * ********************************************************************************** _COS ADRK 2 POPD *+ SAR AR1,* LAR AR2,*,AR2 SBRK 3 SPM 0 LAC #4000h ADDS * SACL * LT *+ LAC #64h SACL * MPYU * ;C compatibility ;C compatibility ;add 0.5 for COS ;variable in size_sin ;*******stack : angle/X ;*******stack : angle/TEMP PAC SACH ;integer position in the table ;in High part of Acc *+ ;remainder ;*******stack : angle/indice/X SACL * LAC *,15 ANDK #0ffffh,15 ; ;*******stack : angle/indice/REMAINDER A-6 SACH *– ;*******stack : angle/INDICE/remainder BCND equal_sin,EQ LALK Table_sin ;address of beginning of the table ADD *– ;address of the nearest first indice ;*******stack : ANGLE/indice/remainder TBLR *+ ;*******stack : y1/INDICE/remainder ADD #1h TBLR * ;Load Y2 with the ordinate of the ;*******stack : y1/Y2/remainder ;nearest second indice LAC *– SUB *+ ;*******stack : Y1/y2/remainder ;difference between the two Y value ;*******stack : y1/Y2/remainder SACL *+ ;*******stack : y1/temp/REMAINDER LT *– MPY * ;*******stack : y1/TEMP/remainder ;*******stack : y1/TEMP/remainder SPH *– ;interpolation between Y1 and Y2 ;*******stack : Y1/temp/remainder LAC *+ ;*******stack : y1/TEMP/remainder ADD *,1,AR1 ;Y(Xdata) in ACCU MAR *– ;C compatibility PSHD *– SBRK 1 RET equal_sin LALK Table_sin ;address of beginning of the table ADD *– ;address of the pointed indice TBLR * LAC *+,0,AR1 ;*******stack : RESULT/ A-7 MAR *– PSHD *– SBRK 1 ;C compatibility RET ********************************************************************************** * Table ********************************************************************************** Table_sin .include sine.tab Table_sin_end .word 0 .end ********************************************************************************** *Routine Name: SIN * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: SIN function with Direct Look–up and Interpolation * * Assembly calling function, variables in s/w stack. * * * *Status: * * * *Processor: C2xx * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output : SIN(angle)*32767, Q15, in ACCU * * Pointed register AR1 * * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * * *Last Update: * 16 Oct 96 * *________________________________________________________________________________* A-8 *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * * | * ********************************************************************************** SIN MAR *+ LT *+ ;variable in size_sin ;*******stack : angle/X LAC #64h SACL * ;*******stack : angle/TEMP MPYU * PAC ;integer position in the table ;in High part of Acc SACH *+ ;remainder SACL * ; ;*******stack : angle/indice/X ;*******stack : angle/indice/REMAINDER LAC *,15 ANDK #0ffffh,15 SACH *– BCND equal_sin,EQ LALK Table_sin ;address of beginning of the table ADD *– ;address of the nearest first indice TBLR *+ ;*******stack : angle/INDICE/remainder ;*******stack : ANGLE/indice/remainder ;*******stack : y1/INDICE/remainder ADD #1h TBLR * ;Load Y2 with the ordinate of the ;*******stack : y1/Y2/remainder ;nearest second indice LAC *– ;*******stack : Y1/y2/remainder SUB *+ ;difference between the two Y value ;*******stack : y1/Y2/remainder SACL *+ A-9 ;*******stack : y1/temp/REMAINDER LT *– ;*******stack : y1/TEMP/remainder MPY * SPH *– ;*******stack : y1/TEMP/remainder ;interpolation between Y1 and Y2 ;*******stack : Y1/temp/remainder LAC *+ ;*******stack : y1/TEMP/remainder ADD *,1 ;Y(Xdata) in ACCU LALK Table_sin ;address of beginning of the table ADD *– ;address of the pointed indice RET equal_sin ;*******stack : RESULT/ TBLR * LAC *+ ;*******stack : result/X end_interp_sin RET ********************************************************************************* * Table ********************************************************************************* Table_sin .include sine.tab Table_sin_end .word 0 ********************************************************************************** *Routine Name: _SIN * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: * SIN function with Direct Look–up + Interpolation * C calling function, variables in C stack. * * Fully C compatible * A-10 * * *Status: * * * *Processor: C2x * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output : SIN(angle)*32767, Q15, in ACCU * * Pointed register AR1 * * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * * * *Last Update: 16 Oct 96 * * * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * * | * ********************************************************************************** _SIN ADRK 2 POPD *+ SAR AR1,* LAR AR2,*,AR2 SBRK 3 SPM 0 LT *+ ;C compatibility ;C compatibility ;variable in size_sin ;*******stack : angle/X LAC #64h SACL * ;*******stack : angle/TEMP MPYU * ;integer position in the table A-11 PAC SACH ;in High part of Acc *+ ;remainder ;*******stack : angle/indice/X SACL * ; ;*******stack : angle/indice/REMAINDER LAC *,15 ANDK #0ffffh,15 SACH *– ;*******stack : angle/INDICE/remainder BCND equal_sin,EQ LALK Table_sin ;address of beginning of the table ADD *– ;address of the nearest first indice ;*******stack : ANGLE/indice/remainder TBLR *+ ;*******stack : y1/INDICE/remainder ADD #1h TBLR * ;Load Y2 with the ordinate of the ;*******stack : y1/Y2/remainder ;nearest second indice LAC *– ;*******stack : Y1/y2/remainder SUB *+ SACL *+ ;difference between the two Y value ;*******stack : y1/Y2/remainder ;*******stack : y1/temp/REMAINDER LT *– MPY * ;*******stack : y1/TEMP/remainder ;*******stack : y1/TEMP/remainder SPH *– ;interpolation between Y1 and Y2 ;*******stack : Y1/temp/remainder LAC *+ ADD *,1,AR1 ;Y(Xdata) in ACCU MAR *– ;C compatibility PSHD *– SBRK 1 ;*******stack : y1/TEMP/remainder RET A-12 equal_sin LALK Table_sin ;address of beginning of the table ADD *– ;address of the pointed indice TBLR * LAC *+,0,AR1 MAR *– PSHD *– SBRK 1 ;*******stack : RESULT/... ;*******stack : result/X ;C compatibility RET ********************************************************************************** * Table ********************************************************************************** Table_sin .include sine.tab Table_sin_end .word 0 ********************************************************************************** * TABLE Sine and Cosine for separate functions COS and SIN * ********************************************************************************** .word 0 .word 2057 .word 4107 .word 6140 .word 8149 .word 10126 .word 12062 .word 13952 .word 15786 .word 17557 .word 19260 .word 20886 .word 22431 .word 23886 .word 25247 .word 26509 .word 27666 .word 28714 A-13 .word 29648 .word 30466 .word 31163 .word 31738 .word 32187 .word 32509 .word 32702 .word 32767 .word 32702 .word 32509 .word 32187 .word 31738 .word 31163 .word 30466 .word 29648 .word 28714 .word 27666 .word 26509 .word 25247 .word 23886 .word 22431 .word 20886 .word 19260 .word 17557 .word 15786 .word 13952 .word 12062 .word 10126 .word 8149 .word 6140 .word 4107 .word 2057 .word 0 .word –2057 .word –4107 .word –6140 .word –8149 .word –10126 A-14 .word –12062 .word –13952 .word –15786 .word –17557 .word –19260 .word –20886 .word –22431 .word –23886 .word –25247 .word –26509 .word –27666 .word –28714 .word –29648 .word –30466 .word –31163 .word –31738 .word –32187 .word –32509 .word –32702 .word –32767 .word –32702 .word –32509 .word –32187 .word –31738 .word –31163 .word –30466 .word –29648 .word –28714 .word –27666 .word –26509 .word –25247 .word –23886 .word –22431 .word –20886 .word –19260 .word –17557 .word –15786 .word –13952 A-15 .word –12062 .word –10126 .word –8149 .word –6140 .word –4107 .word –2057 ********************************************************************************** *Routine Name: COS_SIN * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: COS+SIN function with Direct Look–up and Interpolation * * Assembly calling function, variables in s/w stack. * * * *Status: * * * *Processor: C2xx * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output: * * SIN(angle)*32767, Q15, in stack pointed by AR1–1 * * COS(angle)*32767,Q15, in stack pointed by AR1 * * Pointed register AR1 * * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * *Last Update: 16 Oct 96 * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * * | * ********************************************************************************** size_tab .set A-16 64h ;this is not an error COS_SIN MAR *+ LT *+ ;variable in size_sin ;*stack: angle/X LAC #size_tab SACL * ;*stack: angle/TEMP MPYU * PAC SACH ;integer position in the table ;in High part of Acc *+ ;remainder ;*stack: angle/indice/X SACL * LAC *,15 ANDK #0ffffh,15 SACH *– ; ;*stack: angle/indice/REMAINDER ;*stack: angle/INDICE/remainder BCND equal_sin,EQ LALK Table_sin_cos ;address of beginning of the table ADD *– ;address of the nearest first indice ;*stack: ANGLE/indice/remainder TBLR *+ ;*stack: y1/INDICE/remainder ADD #1h TBLR *+ ;Load Y2 with the ordinate of the ;nearest second indice ;*stack: y1/y2/REMAINDER ADRK 1 ADD #18h TBLR *+ ADD #1h TBLR * ;*stack: y1/y2/remainder/yy1/YY2 LAC *– ;calculate cos interpolate ;*stack: y1/y2/remainder/X ;*stack: y1/y2/remainder/yy1/X ;*stack: y1/y2/remainder/YY1/yy2 A-17 SUB *+ ;difference between the two Y value ;*stack: y1/y2/remainder/yy1/YY2 SACL * LT *– ;*stack: y1/y2/remainder/yy1/TEMP ;*stack: y1/y2/remainder/YY1 SBRK 1 MPY * ;*stack: y1/y2/REMAINDER/yy1 ;*stack: y1/y2/REMAINDER/yy1 ADRK 2 ;*stack: y1/y2/remainder/yy1/TEMP SPH *– ;interpolation between Y1 and Y2 ;*stack: Y1/y2/remainder/YY1/temp LAC *+ ;*stack: y1/y2/remainder/yy1/TEMP ADD *–,1 SACL *– ;Y(Xdata) in ACCU ;*stack: y1/y2/remainder/YY1 ;*stack: y1/y2/REMAINDER/cos ;calculate sin interpolate SBRK 1 ;*stack: y1/Y2/remainder/cos LAC *– ;*stack: Y1/y2/remainder SUB *+ ;difference between the two Y value ;*stack: y1/Y2/remainder/cos SACL *+ ;*stack: y1/temp/REMAINDER/cos LT *– MPY * ;*stack: y1/TEMP/remainder/cos ;*stack: y1/TEMP/remainder/cos SPH *– ;interpolation between Y1 and Y2 ;*stack: Y1/temp/remainder/cos LAC *+ ADD *–,1 ;*stack: y1/TEMP/remainder/cos ;Y(Xdata) in ACCU ;*stack: y1/temp/remainder/cos A-18 SACL * ADRK 3 ;*stack: SIN/temp/remainder/cos ;*stack: sin/temp/remainder/COS LAC * SBRK 2 ;*stack: sin/TEMP/remainder/cos SACL * ;*stack: sin/COS RET equal_sin LALK Table_sin_cos ;address of beginning of the table ;*stack: angle/INDICE/remainder ADD *– TBLR *+ ;address of the pointed indice ;*stack: ANGLE/indice ;*stack: sin/INDICE/remainder ADDK 19h TBLR * ;*stack: sin/COS end_interp_sin RET ********************************************************************************** * Table ********************************************************************************** Table_sin_cos .include sin_cos.tab Table_sin_cos_end .word 0 ********************************************************************************** * TABLE Sine + Cosine for functions COS_SIN * ********************************************************************************** .word 0 .word 2057 .word 4107 .word 6140 .word 8149 A-19 .word 10126 .word 12062 .word 13952 .word 15786 .word 17557 .word 19260 .word 20886 .word 22431 .word 23886 .word 25247 .word 26509 .word 27666 .word 28714 .word 29648 .word 30466 .word 31163 .word 31738 .word 32187 .word 32509 .word 32702 .word 32767 .word 32702 .word 32509 .word 32187 .word 31738 .word 31163 .word 30466 .word 29648 .word 28714 .word 27666 .word 26509 .word 25247 .word 23886 .word 22431 .word 20886 .word 19260 .word 17557 .word 15786 A-20 .word 13952 .word 12062 .word 10126 .word 8149 .word 6140 .word 4107 .word 2057 .word 0 .word –2057 .word –4107 .word –6140 .word –8149 .word –10126 .word –12062 .word –13952 .word –15786 .word –17557 .word –19260 .word –20886 .word –22431 .word –23886 .word –25247 .word –26509 .word –27666 .word –28714 .word –29648 .word –30466 .word –31163 .word –31738 .word –32187 .word –32509 .word –32702 .word –32767 .word –32702 .word –32509 .word –32187 .word –31738 .word –31163 A-21 .word –30466 .word –29648 .word –28714 .word –27666 .word –26509 .word –25247 .word –23886 .word –22431 .word –20886 .word –19260 .word –17557 .word –15786 .word –13952 .word –12062 .word –10126 .word –8149 .word –6140 .word –4107 .word –2057 .word 0 .word 2057 .word 4107 .word 6140 .word 8149 .word 10126 .word 12062 .word 13952 .word 15786 .word 17557 .word 19260 .word 20886 .word 22431 .word 23886 .word 25247 .word 26509 .word 27666 .word 28714 .word 29648 A-22 .word 30466 .word 31163 .word 31738 .word 32187 .word 32509 .word 32702 ********************************************************************************** *Routine Name: sin_ser * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: SIN function with Mathematical Series * * Assembly calling function, variables in s/w stack. * * * *Status: * * * *Processor: C2xx * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output : SIN(angle)*32767, Q15, in ACCU * * Pointed register AR1 * * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * * * *Last Update: 18 Oct 96 * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * * | * ********************************************************************************** sin_ser SETC SXM A-23 MAR *– LAC * BCND angle_neg,LT angle_pos LT *+ ;variable in size_sin MPYK 0c90h ;abscissa scale modify degree –> rad SACH *,4 ;angle in rad LT *+ ;*stack : angle/X PAC ;*stack : angle/RAD ;*stack : angle/rad/X MPYK 985h ;0.0372 ; ;PREG : angle * 0.0372 LAC #0C426h,13 APAC ; in high ACCU ;ACCU : –0.2338 + angle * 0.0372 SACH * ,3 ;temporary value MPY * ;multiply by temporary value ;angle in TREG ;temporary value ;*stack : angle/rad/TEMP LAC #6f69h,10 APAC SACH ;0.0544 ;ACCU: temp + 0.0544 *,2 ;temp ;*stack : angle/RAD/temp ;angle in TREG ;*stack : angle/rad/TEMP MPY * ;temp LAC #7dc5h,13 ;0.9826 APAC SACH ;ACCU=0.9826+temp *,3 ;treg = rad ;temp MPY * ;rad * temp LAC #05532,4 ;0.0013 ;temp * angle APAC A-24 SACH * ,3 LAC *– ;result ;*stack : angle/SIN RET angle_neg LT *+ ;variable in size_sin ;*stack : angle/X MPYK 0c90h ;abscisse scale modif degre –> rad *,4 ;angle in rad PAC SACH ;*stack : angle/RAD LT *+ ;*stack : angle/rad/X MPYK 985h ;0.0372 ; ;PREG : angle * 0.0372 LAC #03bdah,13 ; in high ACCU * ,3 ;temporary value APAC SACH ;ACCU : –0.2338 + angle * 0.0372 ;angle in TREG MPY * ;multiply by temporary value ;temporary value ;*stack : angle/rad/TEMP LAC #6f69h,10 APAC SACH ;0.0544 ;ACCU: temp + 0.0544 *,2 ;temp ;*stack : angle/RAD/temp ;angle in TREG ;*stack : angle/rad/TEMP MPY * ;temp LAC #7dc5h,13 ;0.9826 SPAC ;ACCU=0.9826+temp SACH *,3 ;treg = rad MPY * ;rad * temp ;temp * angle LAC #05532,4 ;0.0013 A-25 APAC SACH *,3 LAC *– ;result ;*stack : angle/SIN RET ********************************************************************************** *Routine Name: _sin_ser * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: SIN function with Mathematical Series * * C calling function, variables in C stack. * * Fully C compatible * * * *Status: * * * *Processor: C2xx * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output : SIN(angle)*32767, Q15, in ACCU * * Pointed register AR1 * * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * *Last Update: 18 Oct 96 * * * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * * | * ********************************************************************************** _sin_ser ADRK A-26 2 ;C compatibility POPD *+ SAR AR1,* LAR AR2,*,AR2 SBRK 3 SPM 0 SETC SXM LAC * BCND angle_neg,LT ;C compatibility angle_pos LT *+ ;variable in size_sin ;*stack : angle/X MPYK 0c90h ;abscissa scale modify degree –> rad ;in PAC SACH *,4 ;angle in rad ;*stack : angle/RAD LT *+ MPYK 985h ;*stack : angle/rad/X ;0.0372 ; ;PREG : angle * 0.0372 LAC #0C426h,13 APAC ; in high ACCU ;ACCU : –0.2338 + angle * 0.0372 SACH * ,3 ;temporary value MPY * ;multiply by temporary value ;angle in TREG ;temporary value ;*stack : angle/rad/TEMP LAC #6f69h,10 APAC SACH ;0.0544 ;ACCU: temp + 0.0544 *,2 ;temp ;*stack : angle/RAD/temp ;angle in TREG ;*stack : angle/rad/TEMP MPY * ;temp LAC #7dc5h,13 ;0.9826 A-27 APAC SACH ;ACCU=0.9826+temp *,3 ;treg = rad ;temp MPY * ;rad * temp ;temp * angle LAC #05532,4 ;0.0013 SACH * ,3 ;result LAC *–,0,AR1 APAC ;*stack : angle/SIN MAR *– PSHD *– SBRK 1 ;C compatibility RET angle_neg LT *+ ;variable in size_sin ;*stack : angle/X MPYK 0c90h ;abscisse scale modif degre –> rad SACH *,4 ;angle in rad LT *+ PAC ;*stack : angle/RAD ;*stack : angle/rad/X MPYK 985h ;0.0372 ; ;PREG : angle * 0.0372 LAC #03bdah,13 ; in high ACCU * ,3 ;temporary value APAC SACH ;ACCU : –0.2338 + angle * 0.0372 ;angle in TREG MPY * ;multiply by temporary value ;temporary value ;*stack : angle/rad/TEMP LAC #6f69h,10 APAC SACH A-28 ;0.0544 ;ACCU: temp + 0.0544 *,2 ;temp ;*stack : angle/RAD/temp ;angle in TREG ;*stack : angle/rad/TEMP MPY * ;temp LAC #7dc5h,13 ;0.9826 SPAC ;ACCU=0.9826+temp SACH *,3 ;treg = rad MPY * ;rad * temp ;temp * angle LAC #05532,4 ;0.0013 SACH *,3 ;result LAC *–,0,AR1 APAC ;*stack : angle/SIN MAR *– PSHD *– SBRK 1 ;C compatibility RET ********************************************************************************** *Routine Name: cos_ser * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: COS function with Mathematical Series * * Assembly calling function, variables in s/w stack. * * * *Status: * * * *Processor: C2xx * * * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output : COS(angle)*32767, Q15, in ACCU * * Pointed register AR1 * A-29 * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * * * *Last Update: 18 Oct 96 * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * * | * ********************************************************************************** cos_ser SETC SXM MAR *– LAC * BCND angle_neg,LT angle_pos LT *+ ;variable in size_sin MPYK 0c90h ;abscisse scale modif degre –> rad SACH *,4 ;angle in rad LT *+ ;*stack : angle/X PAC ;*stack : angle/RAD ;*stack : angle/rad/X MPYK 1070h ;0.0076 neg ; ;PREG : angle * 0.0076 LAC #01e76h,15 APAC ; in high ACCU ;ACCU : +0.0595 + angle * 0.0076 SACH * ,3 ;temporary value MPY * ;multiply by temporary value ;angle in TREG ;temporary value A-30 ;*stack : angle/rad/TEMP LAC #0f532h,15 APAC SACH ;0.0211 ;ACCU: temp + 0.0211 * ;temp ;*stack : angle/RAD/temp ;angle in TREG ;*stack : angle/rad/TEMP MPY * ;temp LAC #0e0c6h,15 ;0.4879 APAC ;ACCU=0.9826+temp SACH *,2 ;treg = rad MPY * ;rad * temp LAC #0a440h,5 ;0.0028 ;temp * angle APAC SACH *,2 ;result MPY * ; LAC #1000h,15 ;1 APAC SETC OVM SACH *,3 LAC *,16 ADD *,16 SACH * LAC *– ;*stack : angle/SIN RET angle_neg LT *+ ;variable in size_sin ;*stack : angle/X MPYK 0c90h ;abscisse scale modif degre –> rad SACH *,4 ;angle in rad LT *+ PAC ;*stack : angle/RAD ;*stack : angle/rad/X A-31 MPYK 0f90h ;0.0076 neg ; ;PREG : angle * 0.0076 LAC #01e76h,15 APAC ; in high ACCU ;ACCU : +0.0595 + angle * 0.0076 SACH * ,3 ;temporary value MPY * ;multiply by temporary value ;angle in TREG ;temporary value ;*stack : angle/rad/TEMP LAC #00aceh,15 APAC SACH ;0.0211 ;ACCU: temp + 0.0211 * ;temp ;*stack : angle/RAD/temp ;angle in TREG ;*stack : angle/rad/TEMP MPY * ;temp LAC #0e0c6h,15 ;0.4879 APAC SACH ;ACCU=0.9826+temp *,2 ;treg = rad ;temp MPY * ;rad * temp ;temp * angle LAC #05bc0h,5 ;0.0028 APAC SACH *,2 ;result MPY * ; LAC #1000h,15 ;1 APAC SETC OVM SACH *,3 LAC *,16 ADD *,16 SACH * LAC *– ;*stack : angle/SIN RET A-32 ********************************************************************************** *Routine Name: _cos_ser * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: COS function with Mathematical Series * * C calling function, * * variables in C stack. Fully C compatible * * * *Status: * * * *Processor: C2xx * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output : COS(angle)*32767, Q15, in ACCU * * Pointed register AR1 * * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * *Last Update: 18 Oct 96 * * * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * * | * ********************************************************************************** _cos_ser ADRK 2 POPD *+ SAR AR1,* LAR AR2,*,AR2 SBRK 3 ;C compatibility ;C compatibility A-33 SPM 0 SETC SXM LAC * BCND angle_neg,LT angle_pos LT *+ ;variable in size_sin ;*stack : angle/X MPYK 0c90h ;abscisse scale modif degre –> rad *,4 ;angle in rad PAC SACH ;*stack : angle/RAD LT *+ ;*stack : angle/rad/X MPYK 1070h ;0.0076 neg ; ;PREG : angle * 0.0076 LAC #01e76h,15 ; in high ACCU * ,3 ;temporary value APAC SACH ;ACCU : +0.0595 + angle * 0.0076 ;angle in TREG MPY * ;multiply by temporary value ;temporary value ;*stack : angle/rad/TEMP LAC #0f532h,15 APAC SACH ;0.0211 ;ACCU: temp + 0.0211 * ;temp ;*stack : angle/RAD/temp ;angle in TREG ;*stack : angle/rad/TEMP MPY * ;temp LAC #0e0c6h,15 ;0.4879 APAC SACH ;ACCU=0.9826+temp *,2 ;treg = rad ;temp MPY A-34 * ;rad * temp ;temp * angle LAC #0a440h,5 ;0.0028 APAC SACH *,2 ;result MPY * ; LAC #1000h,15 ;1 APAC SETC OVM SACH *,3 LAC *,16 ADD *,16 SACH * LAC *–,0,AR1 MAR *– PSHD *– SBRK 1 ;*stack : angle/SIN ;C compatibility RET angle_neg LT *+ ;variable in size_sin MPYK 0c90h ;abscisse scale modif degre –> rad SACH *,4 ;angle in rad LT *+ ;*stack : angle/X PAC ;*stack : angle/RAD ;*stack : angle/rad/X MPYK 0f90h ;0.0076 neg ; ;PREG : angle * 0.0076 LAC #01e76h,15 APAC ; in high ACCU ;ACCU : +0.0595 + angle * 0.0076 SACH * ,3 ;temporary value MPY * ;multiply by temporary value ;angle in TREG ;temporary value A-35 ;*stack : angle/rad/TEMP LAC #00aceh,15 APAC SACH ;0.0211 ;ACCU: temp + 0.0211 * ;temp ;*stack : angle/RAD/temp ;angle in TREG ;*stack : angle/rad/TEMP MPY * ;temp LAC #0e0c6h,15 ;0.4879 APAC ;ACCU=0.9826+temp SACH *,2 ;treg = rad MPY * ;rad * temp ;temp * angle in Q28 LAC #05bc0h,5 ;0.0028 SACH *,2 ;result MPY * ; LAC #1000h,15 ;1 APAC SETC OVM SACH *,3 LAC *,16 ADD *,16 SACH * LAC *–,0,AR1 ;*stack : angle/SIN MAR *– PSHD *– SBRK 1 RET A-36 ;C compatibility A-37 ******************************************************************************** *File Name: Main_trig.c * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * *Description: Very simple main which calls COS or SIN function * * * * * *Processor: C2xx * * * *Status: * * * *Last Update: 19 Oct 96 * *______________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * ******************************************************************************** extern ser_cos(); void main() { double rad; double a; int c; . . . if (rad!=0.0) /*–π < rad < +π*/ c=(int)(32767*rad/3.1415927); else c=0; a=ser_cos(c); . } ********************************************************************************** *File Name: Main_trig.asm * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * A-1 * * *Description: Very simple main which calls COS or SIN function * * * *Processor: C2xx * *Status: * *Last Update: 19 Oct 96 * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * ********************************************************************************** .mmregs .def _ser_sin .sect “vectors” b _c_int0 b $ ********************************************************************************** * Main routine ********************************************************************************** .text _c_int0: . . LAR AR1,#60h MAR *,AR1 A-2 ;stack preparation LAC #4000h ;π/2 SACL *+ ;parameters in stack CALL _ser_sin . ;result in ACCU . .end ********************************************************************************** *Routine Name: COS * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: COS function with Direct Look–up and * * Interpolation Assembly calling function, * * variables in s/w stack. * * * *Status: * * * *Processor: C2xx * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output : COS(angle)*32767, Q15, in ACCU * * Pointed register AR1 * * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * *Last Update: 16 Oct 96 * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * * ********************************************************************************** COS MAR *– LAC #4000h ADDS * ;add 0.5 for COS A-3 SACL * LT *+ ;variable in size_sin ;*******stack : angle/X LAC #64h SACL * ;*******stack : angle/TEMP MPYU * PAC SACH ;integer position in the table ;in High part of Acc *+ ;remainder ;*******stack : angle/indice/X SACL * ; ;*******stack : angle/indice/REMAINDER LAC *,15 ANDK #0ffffh,15 SACH *– ;*******stack : angle/INDICE/remainder BCND equal_sin,EQ LALK Table_sin ;address of beginning of the table ADD *– ;address of the nearest first indice TBLR *+ ;*******stack : ANGLE/indice/remainder ;*******stack : y1/INDICE/remainder ADD #1h TBLR * ;Load Y2 with the ordinate of the ;*******stack : y1/Y2/remainder ;nearest second indice LAC *– ;*******stack : Y1/y2/remainder SUB *+ SACL *+ ;difference between the two Y value ;*******stack : y1/Y2/remainder ;*******stack : y1/temp/REMAINDER LT *– ;*******stack : y1/TEMP/remainder MPY * SPH *– ;*******stack : y1/TEMP/remainder ;interpolation between Y1 and Y2 ;*******stack : Y1/temp/remainder A-4 LAC *+ ;*******stack : y1/TEMP/remainder ADD *,1 ;Y(Xdata) in ACCU LALK Table_sin ;address of beginning of the table ADD *– ;address of the pointed indice RET equal_sin ;*******stack : RESULT/ TBLR * LAC *+ end_interp_sin RET ********************************************************************************** * Table ********************************************************************************** Table_sin .include sine.tab Table_sin_end .word 0 .end ********************************************************************************** *Routine Name: _COS * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: COS function with Direct Look–up and * * Interpolation C calling function, variables in C stack. * * Fully C compatible * * * *Status: * * * *Processor: C2xx * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output : COS(angle)*32767, Q15, in ACCU * * Pointed register AR1 * A-5 * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * *Last Update: 16 Oct 96 * * * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * * | * ********************************************************************************** _COS ADRK 2 POPD *+ SAR AR1,* LAR AR2,*,AR2 SBRK 3 SPM 0 LAC #4000h ADDS * SACL * LT *+ LAC #64h SACL * MPYU * ;C compatibility ;C compatibility ;add 0.5 for COS ;variable in size_sin ;*******stack : angle/X ;*******stack : angle/TEMP PAC SACH ;integer position in the table ;in High part of Acc *+ ;remainder ;*******stack : angle/indice/X SACL * LAC *,15 ANDK #0ffffh,15 ; ;*******stack : angle/indice/REMAINDER A-6 SACH *– ;*******stack : angle/INDICE/remainder BCND equal_sin,EQ LALK Table_sin ;address of beginning of the table ADD *– ;address of the nearest first indice ;*******stack : ANGLE/indice/remainder TBLR *+ ;*******stack : y1/INDICE/remainder ADD #1h TBLR * ;Load Y2 with the ordinate of the ;*******stack : y1/Y2/remainder ;nearest second indice LAC *– SUB *+ ;*******stack : Y1/y2/remainder ;difference between the two Y value ;*******stack : y1/Y2/remainder SACL *+ ;*******stack : y1/temp/REMAINDER LT *– MPY * ;*******stack : y1/TEMP/remainder ;*******stack : y1/TEMP/remainder SPH *– ;interpolation between Y1 and Y2 ;*******stack : Y1/temp/remainder LAC *+ ;*******stack : y1/TEMP/remainder ADD *,1,AR1 ;Y(Xdata) in ACCU MAR *– ;C compatibility PSHD *– SBRK 1 RET equal_sin LALK Table_sin ;address of beginning of the table ADD *– ;address of the pointed indice TBLR * LAC *+,0,AR1 ;*******stack : RESULT/ A-7 MAR *– PSHD *– SBRK 1 ;C compatibility RET ********************************************************************************** * Table ********************************************************************************** Table_sin .include sine.tab Table_sin_end .word 0 .end ********************************************************************************** *Routine Name: SIN * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: SIN function with Direct Look–up and Interpolation * * Assembly calling function, variables in s/w stack. * * * *Status: * * * *Processor: C2xx * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output : SIN(angle)*32767, Q15, in ACCU * * Pointed register AR1 * * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * * *Last Update: * 16 Oct 96 * *________________________________________________________________________________* A-8 *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * * | * ********************************************************************************** SIN MAR *+ LT *+ ;variable in size_sin ;*******stack : angle/X LAC #64h SACL * ;*******stack : angle/TEMP MPYU * PAC ;integer position in the table ;in High part of Acc SACH *+ ;remainder SACL * ; ;*******stack : angle/indice/X ;*******stack : angle/indice/REMAINDER LAC *,15 ANDK #0ffffh,15 SACH *– BCND equal_sin,EQ LALK Table_sin ;address of beginning of the table ADD *– ;address of the nearest first indice TBLR *+ ;*******stack : angle/INDICE/remainder ;*******stack : ANGLE/indice/remainder ;*******stack : y1/INDICE/remainder ADD #1h TBLR * ;Load Y2 with the ordinate of the ;*******stack : y1/Y2/remainder ;nearest second indice LAC *– ;*******stack : Y1/y2/remainder SUB *+ ;difference between the two Y value ;*******stack : y1/Y2/remainder SACL *+ A-9 ;*******stack : y1/temp/REMAINDER LT *– ;*******stack : y1/TEMP/remainder MPY * SPH *– ;*******stack : y1/TEMP/remainder ;interpolation between Y1 and Y2 ;*******stack : Y1/temp/remainder LAC *+ ;*******stack : y1/TEMP/remainder ADD *,1 ;Y(Xdata) in ACCU LALK Table_sin ;address of beginning of the table ADD *– ;address of the pointed indice RET equal_sin ;*******stack : RESULT/ TBLR * LAC *+ ;*******stack : result/X end_interp_sin RET ********************************************************************************* * Table ********************************************************************************* Table_sin .include sine.tab Table_sin_end .word 0 ********************************************************************************** *Routine Name: _SIN * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: * SIN function with Direct Look–up + Interpolation * C calling function, variables in C stack. * * Fully C compatible * A-10 * * *Status: * * * *Processor: C2x * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output : SIN(angle)*32767, Q15, in ACCU * * Pointed register AR1 * * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * * * *Last Update: 16 Oct 96 * * * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * * | * ********************************************************************************** _SIN ADRK 2 POPD *+ SAR AR1,* LAR AR2,*,AR2 SBRK 3 SPM 0 LT *+ ;C compatibility ;C compatibility ;variable in size_sin ;*******stack : angle/X LAC #64h SACL * ;*******stack : angle/TEMP MPYU * ;integer position in the table A-11 PAC SACH ;in High part of Acc *+ ;remainder ;*******stack : angle/indice/X SACL * ; ;*******stack : angle/indice/REMAINDER LAC *,15 ANDK #0ffffh,15 SACH *– ;*******stack : angle/INDICE/remainder BCND equal_sin,EQ LALK Table_sin ;address of beginning of the table ADD *– ;address of the nearest first indice ;*******stack : ANGLE/indice/remainder TBLR *+ ;*******stack : y1/INDICE/remainder ADD #1h TBLR * ;Load Y2 with the ordinate of the ;*******stack : y1/Y2/remainder ;nearest second indice LAC *– ;*******stack : Y1/y2/remainder SUB *+ SACL *+ ;difference between the two Y value ;*******stack : y1/Y2/remainder ;*******stack : y1/temp/REMAINDER LT *– MPY * ;*******stack : y1/TEMP/remainder ;*******stack : y1/TEMP/remainder SPH *– ;interpolation between Y1 and Y2 ;*******stack : Y1/temp/remainder LAC *+ ADD *,1,AR1 ;Y(Xdata) in ACCU MAR *– ;C compatibility PSHD *– SBRK 1 ;*******stack : y1/TEMP/remainder RET A-12 equal_sin LALK Table_sin ;address of beginning of the table ADD *– ;address of the pointed indice TBLR * LAC *+,0,AR1 MAR *– PSHD *– SBRK 1 ;*******stack : RESULT/... ;*******stack : result/X ;C compatibility RET ********************************************************************************** * Table ********************************************************************************** Table_sin .include sine.tab Table_sin_end .word 0 ********************************************************************************** * TABLE Sine and Cosine for separate functions COS and SIN * ********************************************************************************** .word 0 .word 2057 .word 4107 .word 6140 .word 8149 .word 10126 .word 12062 .word 13952 .word 15786 .word 17557 .word 19260 .word 20886 .word 22431 .word 23886 .word 25247 .word 26509 .word 27666 .word 28714 A-13 .word 29648 .word 30466 .word 31163 .word 31738 .word 32187 .word 32509 .word 32702 .word 32767 .word 32702 .word 32509 .word 32187 .word 31738 .word 31163 .word 30466 .word 29648 .word 28714 .word 27666 .word 26509 .word 25247 .word 23886 .word 22431 .word 20886 .word 19260 .word 17557 .word 15786 .word 13952 .word 12062 .word 10126 .word 8149 .word 6140 .word 4107 .word 2057 .word 0 .word –2057 .word –4107 .word –6140 .word –8149 .word –10126 A-14 .word –12062 .word –13952 .word –15786 .word –17557 .word –19260 .word –20886 .word –22431 .word –23886 .word –25247 .word –26509 .word –27666 .word –28714 .word –29648 .word –30466 .word –31163 .word –31738 .word –32187 .word –32509 .word –32702 .word –32767 .word –32702 .word –32509 .word –32187 .word –31738 .word –31163 .word –30466 .word –29648 .word –28714 .word –27666 .word –26509 .word –25247 .word –23886 .word –22431 .word –20886 .word –19260 .word –17557 .word –15786 .word –13952 A-15 .word –12062 .word –10126 .word –8149 .word –6140 .word –4107 .word –2057 ********************************************************************************** *Routine Name: COS_SIN * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: COS+SIN function with Direct Look–up and Interpolation * * Assembly calling function, variables in s/w stack. * * * *Status: * * * *Processor: C2xx * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output: * * SIN(angle)*32767, Q15, in stack pointed by AR1–1 * * COS(angle)*32767,Q15, in stack pointed by AR1 * * Pointed register AR1 * * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * *Last Update: 16 Oct 96 * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * * | * ********************************************************************************** size_tab .set A-16 64h ;this is not an error COS_SIN MAR *+ LT *+ ;variable in size_sin ;*stack: angle/X LAC #size_tab SACL * ;*stack: angle/TEMP MPYU * PAC SACH ;integer position in the table ;in High part of Acc *+ ;remainder ;*stack: angle/indice/X SACL * LAC *,15 ANDK #0ffffh,15 SACH *– ; ;*stack: angle/indice/REMAINDER ;*stack: angle/INDICE/remainder BCND equal_sin,EQ LALK Table_sin_cos ;address of beginning of the table ADD *– ;address of the nearest first indice ;*stack: ANGLE/indice/remainder TBLR *+ ;*stack: y1/INDICE/remainder ADD #1h TBLR *+ ;Load Y2 with the ordinate of the ;nearest second indice ;*stack: y1/y2/REMAINDER ADRK 1 ADD #18h TBLR *+ ADD #1h TBLR * ;*stack: y1/y2/remainder/yy1/YY2 LAC *– ;calculate cos interpolate ;*stack: y1/y2/remainder/X ;*stack: y1/y2/remainder/yy1/X ;*stack: y1/y2/remainder/YY1/yy2 A-17 SUB *+ ;difference between the two Y value ;*stack: y1/y2/remainder/yy1/YY2 SACL * LT *– ;*stack: y1/y2/remainder/yy1/TEMP ;*stack: y1/y2/remainder/YY1 SBRK 1 MPY * ;*stack: y1/y2/REMAINDER/yy1 ;*stack: y1/y2/REMAINDER/yy1 ADRK 2 ;*stack: y1/y2/remainder/yy1/TEMP SPH *– ;interpolation between Y1 and Y2 ;*stack: Y1/y2/remainder/YY1/temp LAC *+ ;*stack: y1/y2/remainder/yy1/TEMP ADD *–,1 SACL *– ;Y(Xdata) in ACCU ;*stack: y1/y2/remainder/YY1 ;*stack: y1/y2/REMAINDER/cos ;calculate sin interpolate SBRK 1 ;*stack: y1/Y2/remainder/cos LAC *– ;*stack: Y1/y2/remainder SUB *+ ;difference between the two Y value ;*stack: y1/Y2/remainder/cos SACL *+ ;*stack: y1/temp/REMAINDER/cos LT *– MPY * ;*stack: y1/TEMP/remainder/cos ;*stack: y1/TEMP/remainder/cos SPH *– ;interpolation between Y1 and Y2 ;*stack: Y1/temp/remainder/cos LAC *+ ADD *–,1 ;*stack: y1/TEMP/remainder/cos ;Y(Xdata) in ACCU ;*stack: y1/temp/remainder/cos A-18 SACL * ADRK 3 ;*stack: SIN/temp/remainder/cos ;*stack: sin/temp/remainder/COS LAC * SBRK 2 ;*stack: sin/TEMP/remainder/cos SACL * ;*stack: sin/COS RET equal_sin LALK Table_sin_cos ;address of beginning of the table ;*stack: angle/INDICE/remainder ADD *– TBLR *+ ;address of the pointed indice ;*stack: ANGLE/indice ;*stack: sin/INDICE/remainder ADDK 19h TBLR * ;*stack: sin/COS end_interp_sin RET ********************************************************************************** * Table ********************************************************************************** Table_sin_cos .include sin_cos.tab Table_sin_cos_end .word 0 ********************************************************************************** * TABLE Sine + Cosine for functions COS_SIN * ********************************************************************************** .word 0 .word 2057 .word 4107 .word 6140 .word 8149 A-19 .word 10126 .word 12062 .word 13952 .word 15786 .word 17557 .word 19260 .word 20886 .word 22431 .word 23886 .word 25247 .word 26509 .word 27666 .word 28714 .word 29648 .word 30466 .word 31163 .word 31738 .word 32187 .word 32509 .word 32702 .word 32767 .word 32702 .word 32509 .word 32187 .word 31738 .word 31163 .word 30466 .word 29648 .word 28714 .word 27666 .word 26509 .word 25247 .word 23886 .word 22431 .word 20886 .word 19260 .word 17557 .word 15786 A-20 .word 13952 .word 12062 .word 10126 .word 8149 .word 6140 .word 4107 .word 2057 .word 0 .word –2057 .word –4107 .word –6140 .word –8149 .word –10126 .word –12062 .word –13952 .word –15786 .word –17557 .word –19260 .word –20886 .word –22431 .word –23886 .word –25247 .word –26509 .word –27666 .word –28714 .word –29648 .word –30466 .word –31163 .word –31738 .word –32187 .word –32509 .word –32702 .word –32767 .word –32702 .word –32509 .word –32187 .word –31738 .word –31163 A-21 .word –30466 .word –29648 .word –28714 .word –27666 .word –26509 .word –25247 .word –23886 .word –22431 .word –20886 .word –19260 .word –17557 .word –15786 .word –13952 .word –12062 .word –10126 .word –8149 .word –6140 .word –4107 .word –2057 .word 0 .word 2057 .word 4107 .word 6140 .word 8149 .word 10126 .word 12062 .word 13952 .word 15786 .word 17557 .word 19260 .word 20886 .word 22431 .word 23886 .word 25247 .word 26509 .word 27666 .word 28714 .word 29648 A-22 .word 30466 .word 31163 .word 31738 .word 32187 .word 32509 .word 32702 ********************************************************************************** *Routine Name: sin_ser * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: SIN function with Mathematical Series * * Assembly calling function, variables in s/w stack. * * * *Status: * * * *Processor: C2xx * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output : SIN(angle)*32767, Q15, in ACCU * * Pointed register AR1 * * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * * * *Last Update: 18 Oct 96 * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * * | * ********************************************************************************** sin_ser SETC SXM A-23 MAR *– LAC * BCND angle_neg,LT angle_pos LT *+ ;variable in size_sin MPYK 0c90h ;abscissa scale modify degree –> rad SACH *,4 ;angle in rad LT *+ ;*stack : angle/X PAC ;*stack : angle/RAD ;*stack : angle/rad/X MPYK 985h ;0.0372 ; ;PREG : angle * 0.0372 LAC #0C426h,13 APAC ; in high ACCU ;ACCU : –0.2338 + angle * 0.0372 SACH * ,3 ;temporary value MPY * ;multiply by temporary value ;angle in TREG ;temporary value ;*stack : angle/rad/TEMP LAC #6f69h,10 APAC SACH ;0.0544 ;ACCU: temp + 0.0544 *,2 ;temp ;*stack : angle/RAD/temp ;angle in TREG ;*stack : angle/rad/TEMP MPY * ;temp LAC #7dc5h,13 ;0.9826 APAC SACH ;ACCU=0.9826+temp *,3 ;treg = rad ;temp MPY * ;rad * temp LAC #05532,4 ;0.0013 ;temp * angle APAC A-24 SACH * ,3 LAC *– ;result ;*stack : angle/SIN RET angle_neg LT *+ ;variable in size_sin ;*stack : angle/X MPYK 0c90h ;abscisse scale modif degre –> rad *,4 ;angle in rad PAC SACH ;*stack : angle/RAD LT *+ ;*stack : angle/rad/X MPYK 985h ;0.0372 ; ;PREG : angle * 0.0372 LAC #03bdah,13 ; in high ACCU * ,3 ;temporary value APAC SACH ;ACCU : –0.2338 + angle * 0.0372 ;angle in TREG MPY * ;multiply by temporary value ;temporary value ;*stack : angle/rad/TEMP LAC #6f69h,10 APAC SACH ;0.0544 ;ACCU: temp + 0.0544 *,2 ;temp ;*stack : angle/RAD/temp ;angle in TREG ;*stack : angle/rad/TEMP MPY * ;temp LAC #7dc5h,13 ;0.9826 SPAC ;ACCU=0.9826+temp SACH *,3 ;treg = rad MPY * ;rad * temp ;temp * angle LAC #05532,4 ;0.0013 A-25 APAC SACH *,3 LAC *– ;result ;*stack : angle/SIN RET ********************************************************************************** *Routine Name: _sin_ser * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: SIN function with Mathematical Series * * C calling function, variables in C stack. * * Fully C compatible * * * *Status: * * * *Processor: C2xx * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output : SIN(angle)*32767, Q15, in ACCU * * Pointed register AR1 * * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * *Last Update: 18 Oct 96 * * * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * * | * ********************************************************************************** _sin_ser ADRK A-26 2 ;C compatibility POPD *+ SAR AR1,* LAR AR2,*,AR2 SBRK 3 SPM 0 SETC SXM LAC * BCND angle_neg,LT ;C compatibility angle_pos LT *+ ;variable in size_sin ;*stack : angle/X MPYK 0c90h ;abscissa scale modify degree –> rad ;in PAC SACH *,4 ;angle in rad ;*stack : angle/RAD LT *+ MPYK 985h ;*stack : angle/rad/X ;0.0372 ; ;PREG : angle * 0.0372 LAC #0C426h,13 APAC ; in high ACCU ;ACCU : –0.2338 + angle * 0.0372 SACH * ,3 ;temporary value MPY * ;multiply by temporary value ;angle in TREG ;temporary value ;*stack : angle/rad/TEMP LAC #6f69h,10 APAC SACH ;0.0544 ;ACCU: temp + 0.0544 *,2 ;temp ;*stack : angle/RAD/temp ;angle in TREG ;*stack : angle/rad/TEMP MPY * ;temp LAC #7dc5h,13 ;0.9826 A-27 APAC SACH ;ACCU=0.9826+temp *,3 ;treg = rad ;temp MPY * ;rad * temp ;temp * angle LAC #05532,4 ;0.0013 SACH * ,3 ;result LAC *–,0,AR1 APAC ;*stack : angle/SIN MAR *– PSHD *– SBRK 1 ;C compatibility RET angle_neg LT *+ ;variable in size_sin ;*stack : angle/X MPYK 0c90h ;abscisse scale modif degre –> rad SACH *,4 ;angle in rad LT *+ PAC ;*stack : angle/RAD ;*stack : angle/rad/X MPYK 985h ;0.0372 ; ;PREG : angle * 0.0372 LAC #03bdah,13 ; in high ACCU * ,3 ;temporary value APAC SACH ;ACCU : –0.2338 + angle * 0.0372 ;angle in TREG MPY * ;multiply by temporary value ;temporary value ;*stack : angle/rad/TEMP LAC #6f69h,10 APAC SACH A-28 ;0.0544 ;ACCU: temp + 0.0544 *,2 ;temp ;*stack : angle/RAD/temp ;angle in TREG ;*stack : angle/rad/TEMP MPY * ;temp LAC #7dc5h,13 ;0.9826 SPAC ;ACCU=0.9826+temp SACH *,3 ;treg = rad MPY * ;rad * temp ;temp * angle LAC #05532,4 ;0.0013 SACH *,3 ;result LAC *–,0,AR1 APAC ;*stack : angle/SIN MAR *– PSHD *– SBRK 1 ;C compatibility RET ********************************************************************************** *Routine Name: cos_ser * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: COS function with Mathematical Series * * Assembly calling function, variables in s/w stack. * * * *Status: * * * *Processor: C2xx * * * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output : COS(angle)*32767, Q15, in ACCU * * Pointed register AR1 * A-29 * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * * * *Last Update: 18 Oct 96 * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * * | * ********************************************************************************** cos_ser SETC SXM MAR *– LAC * BCND angle_neg,LT angle_pos LT *+ ;variable in size_sin MPYK 0c90h ;abscisse scale modif degre –> rad SACH *,4 ;angle in rad LT *+ ;*stack : angle/X PAC ;*stack : angle/RAD ;*stack : angle/rad/X MPYK 1070h ;0.0076 neg ; ;PREG : angle * 0.0076 LAC #01e76h,15 APAC ; in high ACCU ;ACCU : +0.0595 + angle * 0.0076 SACH * ,3 ;temporary value MPY * ;multiply by temporary value ;angle in TREG ;temporary value A-30 ;*stack : angle/rad/TEMP LAC #0f532h,15 APAC SACH ;0.0211 ;ACCU: temp + 0.0211 * ;temp ;*stack : angle/RAD/temp ;angle in TREG ;*stack : angle/rad/TEMP MPY * ;temp LAC #0e0c6h,15 ;0.4879 APAC ;ACCU=0.9826+temp SACH *,2 ;treg = rad MPY * ;rad * temp LAC #0a440h,5 ;0.0028 ;temp * angle APAC SACH *,2 ;result MPY * ; LAC #1000h,15 ;1 APAC SETC OVM SACH *,3 LAC *,16 ADD *,16 SACH * LAC *– ;*stack : angle/SIN RET angle_neg LT *+ ;variable in size_sin ;*stack : angle/X MPYK 0c90h ;abscisse scale modif degre –> rad SACH *,4 ;angle in rad LT *+ PAC ;*stack : angle/RAD ;*stack : angle/rad/X A-31 MPYK 0f90h ;0.0076 neg ; ;PREG : angle * 0.0076 LAC #01e76h,15 APAC ; in high ACCU ;ACCU : +0.0595 + angle * 0.0076 SACH * ,3 ;temporary value MPY * ;multiply by temporary value ;angle in TREG ;temporary value ;*stack : angle/rad/TEMP LAC #00aceh,15 APAC SACH ;0.0211 ;ACCU: temp + 0.0211 * ;temp ;*stack : angle/RAD/temp ;angle in TREG ;*stack : angle/rad/TEMP MPY * ;temp LAC #0e0c6h,15 ;0.4879 APAC SACH ;ACCU=0.9826+temp *,2 ;treg = rad ;temp MPY * ;rad * temp ;temp * angle LAC #05bc0h,5 ;0.0028 APAC SACH *,2 ;result MPY * ; LAC #1000h,15 ;1 APAC SETC OVM SACH *,3 LAC *,16 ADD *,16 SACH * LAC *– ;*stack : angle/SIN RET A-32 ********************************************************************************** *Routine Name: _cos_ser * *Project: DMC Mathematical Library * *Originator: Pascal DORSTER (Texas Instruments) * * * *Description: COS function with Mathematical Series * * C calling function, * * variables in C stack. Fully C compatible * * * *Status: * * * *Processor: C2xx * * * *Calling convention: * * Input : Angle in stack value 0–360 degrees <=>0h–FFFFh * * Output : COS(angle)*32767, Q15, in ACCU * * Pointed register AR1 * * * *Stack commentary: * * Position of current register in Caps * * Stack at beginning : angle/X * * * *Last Update: 18 Oct 96 * * * *________________________________________________________________________________* *Date of Mod | DESCRIPTION * *––––––––––––––|–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––* * | * * | * ********************************************************************************** _cos_ser ADRK 2 POPD *+ SAR AR1,* LAR AR2,*,AR2 SBRK 3 ;C compatibility ;C compatibility A-33 SPM 0 SETC SXM LAC * BCND angle_neg,LT angle_pos LT *+ ;variable in size_sin ;*stack : angle/X MPYK 0c90h ;abscisse scale modif degre –> rad *,4 ;angle in rad PAC SACH ;*stack : angle/RAD LT *+ ;*stack : angle/rad/X MPYK 1070h ;0.0076 neg ; ;PREG : angle * 0.0076 LAC #01e76h,15 ; in high ACCU * ,3 ;temporary value APAC SACH ;ACCU : +0.0595 + angle * 0.0076 ;angle in TREG MPY * ;multiply by temporary value ;temporary value ;*stack : angle/rad/TEMP LAC #0f532h,15 APAC SACH ;0.0211 ;ACCU: temp + 0.0211 * ;temp ;*stack : angle/RAD/temp ;angle in TREG ;*stack : angle/rad/TEMP MPY * ;temp LAC #0e0c6h,15 ;0.4879 APAC SACH ;ACCU=0.9826+temp *,2 ;treg = rad ;temp MPY A-34 * ;rad * temp ;temp * angle LAC #0a440h,5 ;0.0028 APAC SACH *,2 ;result MPY * ; LAC #1000h,15 ;1 APAC SETC OVM SACH *,3 LAC *,16 ADD *,16 SACH * LAC *–,0,AR1 MAR *– PSHD *– SBRK 1 ;*stack : angle/SIN ;C compatibility RET angle_neg LT *+ ;variable in size_sin MPYK 0c90h ;abscisse scale modif degre –> rad SACH *,4 ;angle in rad LT *+ ;*stack : angle/X PAC ;*stack : angle/RAD ;*stack : angle/rad/X MPYK 0f90h ;0.0076 neg ; ;PREG : angle * 0.0076 LAC #01e76h,15 APAC ; in high ACCU ;ACCU : +0.0595 + angle * 0.0076 SACH * ,3 ;temporary value MPY * ;multiply by temporary value ;angle in TREG ;temporary value A-35 ;*stack : angle/rad/TEMP LAC #00aceh,15 APAC SACH ;0.0211 ;ACCU: temp + 0.0211 * ;temp ;*stack : angle/RAD/temp ;angle in TREG ;*stack : angle/rad/TEMP MPY * ;temp LAC #0e0c6h,15 ;0.4879 APAC ;ACCU=0.9826+temp SACH *,2 ;treg = rad MPY * ;rad * temp ;temp * angle in Q28 LAC #05bc0h,5 ;0.0028 SACH *,2 ;result MPY * ; LAC #1000h,15 ;1 APAC SETC OVM SACH *,3 LAC *,16 ADD *,16 SACH * LAC *–,0,AR1 ;*stack : angle/SIN MAR *– PSHD *– SBRK 1 RET A-36 ;C compatibility A-37