Initial code package commit.
[apps/c55x-digital-mic-decimation.git] / src / diggain_f1.asm
1 ;============================================================================
2 ; Copyright (c) 2016 Texas Instruments Incorporated.
3 ;
4 ;  Redistribution and use in source and binary forms, with or without
5 ;  modification, are permitted provided that the following conditions
6 ;  are met:
7 ;
8 ;    Redistributions of source code must retain the above copyright
9 ;    notice, this list of conditions and the following disclaimer.
10 ;
11 ;    Redistributions in binary form must reproduce the above copyright
12 ;    notice, this list of conditions and the following disclaimer in the
13 ;    documentation and/or other materials provided with the
14 ;    distribution.
15 ;
16 ;    Neither the name of Texas Instruments Incorporated nor the names of
17 ;    its contributors may be used to endorse or promote products derived
18 ;    from this software without specific prior written permission.
19 ;
20 ;  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 ;  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 ;  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 ;  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 ;  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 ;  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 ;  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 ;  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 ;  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 ;  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 ;  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 ;
32 ;===============================================================================
33 ; Function:    _appDiggain
34 ; Processor:   C55xx, Rev. 3
35 ; Description: 
36 ;   Applies digital gain and saturates output.
37 ;   S18Q16 input data, S16Q15 output data.
38 ;   U16Q8 digital gain.
39 ;
40 ;   x cycle inner loop.
41 ;
42 ;   C-callable.
43 ;   Mnemonic assembly.
44 ;
45 ; Usage:    void blkFirDecim2(
46 ;               Int32   *inSamps,      -> XAR0
47 ;               Uint16  diggain,       -> T0
48 ;               Int16   *outSamps,     -> XAR1
49 ;               Uint16  numInSamps     -> T1
50 ;           );
51 ;
52 ;
53 ; NOTE: additional optimizations possible, but low MHz contributor.
54 ;****************************************************************
56                 .C54CM_off                      ; enable assembler for C54CM=0
57                 .ARMS_off                       ; enable assembler for ARMS=0
58                 .CPL_on                         ; enable assembler for CPL=1
60                 .mmregs                         ; enable mem mapped register names
62                 .def    _appDiggain
64 ; Stack frame
65 ; -----------
66 RET_ADDR_SZ     .set    1                       ; return address
67 REG_SAVE_SZ     .set    0                       ; save-on-entry registers saved
68 FRAME_SZ        .set    1                       ; local variables
69 ARG_BLK_SZ      .set    0                       ; argument block
70 PARAM_OFFSET    .set    ARG_BLK_SZ + FRAME_SZ + REG_SAVE_SZ + RET_ADDR_SZ   ; offset to function arguments on stack
72 ; Local variables
73 ; ---------------
74                 .asg    2, digGain
76 ; Register usage
77 ; --------------
78                 .asg    CDP, x_ptr              ; input sample pointer
79                 .asg    AR1, r_ptr              ; output sample pointer
81                 .asg    XCDP, xx_ptr            ; extended input sample pointer
83                 .asg    BRC0, outer_cnt         ; outer loop count
85 QUANT_TRUNC     .set    0                       ; truncate
86 QUANT_RND       .set    1                       ; round according to rounding mode
87 QUANT_MODE      .set    QUANT_RND
90                 .text
91 _appDiggain:
93 ;
94 ; Save any save-on-entry registers that are used
95 ;----------------------------------------------------------------
97 ;
98 ; Allocate the local frame and argument block
99 ;----------------------------------------------------------------
100                 AADD        #-(ARG_BLK_SZ + FRAME_SZ), SP 
103 ; Save entry values for later
104 ;----------------------------------------------------------------
105                 MOV         T0, *SP(digGain)
108 ; Configure the status registers as needed
109 ;----------------------------------------------------------------
110                 AND         #001FFh, mmap(ST0_55)   ; clear ACOV[0-3], TC[1-2], and C
112                 OR          #04540h, mmap(ST1_55)   ; set CPL, M40, SXMD, and FRCT
113                 ;AND         #0F9DFh, mmap(ST1_55)   ; clear M40, SATD, 54CM 
115                 BCLR        ARMS                    ; clear ARMS
117                 ;AND         #0FCDDh, mmap(ST3_55)   ; clear SATA, SMUL ; note -- must always write 1100b to bits 11-8, 0b to bit 4
121 ; Setup passed parameters in their destination registers
122 ;----------------------------------------------------------------
124 ; x pointer - passed in its destination register
125                 AMOV        XAR0, xx_ptr
127 ; r pointer - already passed in its destination register
131 ; Setup loop counts
132 ;----------------------------------------------------------------
133                 MOV                     T1, AC0                                 ; AC0 = nx (nx unsigned, constrained to < 32768 since SXM is enabled)
134                 SUB         #1, AC0                 ; AC0 = nx-1
135                 MOV         AC0, mmap(outer_cnt)    ; outer_cnt = nx-1
137     
139 ; Start of outer loop
140 ;----------------------------------------------------------------
141                 RPTBLOCAL   loop0-1                 ; outer loop nx iterations
143                 MPY         *SP(#digGain), *x_ptr+, AC1          ; Low x High
144                 MPY         *SP(#digGain), uns(*x_ptr+), AC0     ; Low x Low
145                 ADD         AC1 << #16, AC0
146                 SFTS        AC0, #6
147                 .if (QUANT_MODE == QUANT_TRUNC)
148                 SAT         AC0
149                 .else
150                 SATR        AC0
151                 .endif
153                 ; Store result to memory
154                 MOV         HI(AC0), *r_ptr+        ; store S16Q15 value to memory
155 loop0: ; end of outer loop
159 ; Restore status regs to expected C-convention values as needed
160 ;----------------------------------------------------------------
161                 BCLR        M40                     ; clear M40
162                 BCLR        FRCT                    ; clear FRCT
164                 AND         #0FE00h, mmap(ST2_55)   ; clear CDPLC and AR[7-0]LC
165                 BSET        ARMS                    ; set SMUL
167                 ;BSET        SMUL                    ; set SMUL
170 ; Deallocate the local frame and argument block
171 ;----------------------------------------------------------------
172                 AADD        #(ARG_BLK_SZ + FRAME_SZ), SP 
175 ; Restore any save-on-entry registers that are used
176 ;----------------------------------------------------------------
179 ; Return to calling function
180 ;----------------------------------------------------------------
181                 RET                             ; return to calling function