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

📄 amf_delayeven_render.asm

📁 ADI SHARC DSP 音频算法标准模块库
💻 ASM
字号:
// Copyright(c) 2005 Analog Devices, Inc. All Rights Reserved.
// This software is proprietary and confidential to Analog Devices, Inc. and its licensors.

// File    : $Id: //depot/development/visualaudio/modules/2.5.0/SHARC/Source/AMF_DelayEven_Render.asm#3 $ 
// Part of : VisualAudio V2.5.0 
// Updated : $Date: 2006/10/12 $ by $Author: Fernando $




//    Module Name     : AMF_DelayEven_Render.asm 
//    DSP Processor   : ADSP21161
//    Description     : Delay even audio module ASM file.
//    Owner           : Analog Devices
//    Original Author : Tim Stilson    
//    Date               : 7/18/03
//====================================================================================
// Processor resources used:
//  37 words pmem INTERNAL
// 312 cycles (TickSize=128) (56 + 4*tickSize/2)
// (SIMD used)
//====================================================================================

#if 1

    ////////////////////////////////////////////////////////////////////////////////
    //
    // History:
    //
    // 7/18/03 Tim Stilson: created
    //
    ////////////////////////////////////////////////////////////////////////////////
    //
    // Mono Delay with SIMD access to delay memory (for on-chip delay storage)
    //
    // Special Requirements:
    //     - Delay length must be an even number of samples, due to an interaction between 
    //       circular-buffer handling and SIMD memory accesses.
    //
    ////////////////////////////////////////////////////////////////////////////////

    
#include "processor.h"
#include "AMF_DelayEven.h"
#include "asm_macros.h"
#include "asm_sprt.h"

// global routines
.global    _AMF_DelayEven_Render;            ;

.segment /pm SEG_MOD_FAST_CODE;

////////////////////////////////////////////////////////////////////////////////
// DelayEven filter
//
_AMF_DelayEven_Render:
    
 // push context on stack
     puts=mode1;
    r0=i2; puts=r0;
    r0=i1; puts=r0;
    r0=i0; puts=r0;
    r0=b1; puts=r0;

    i4=r8;                    // i4->*buffers
    
 // initialize input and output samples pointers
    i0=dm(0,i4);            // i1->buffers[0], input
    i2=dm(1,i4);            // i2->buffers[1], output

    i4=r4;                    //i4->testModuleInstance[0]
       
 // initialize coefficient pointer, and check for orphan write pointer
     r4=0xfffffffe;
    r1=dm(AMF_DelayEven_DelayBuffer,i4);                   // buffer base
    r0=dm(AMF_DelayEven_Delay,i4);                         // length of delay buffer in samples
    r0=r0 and r4,  r4=dm(AMF_DelayEven_DelayWritePtr, i4); // force delay length to be even
    l1=r0;                                                 // setup circular buffer
    r0 = r1+r0,    b1=r1;                                  // r0 = end of buffer + 1, set buffer base
    comp(r4,r0),   i1=r4;                                  // check if writeptr is beyond end of buffer, i1 = "else" value
    if ge          i1=r1;                                  // if so, set to beginning of buffer (to handle possible case of "orphaned" writeptr when delay is set to smaller value while running)

    r12=lshift r12 by -1;
    
    bit set MODE1 PEYEN;        
    m4 = 2;

    lcntr=r12, do AMF_DelayEven_Loop until lce;
        r1=dm(i0,m4);                                // r1/s1 = in[i/i+1];
        r0=dm(i1,m5);                                // r0/s0 = delay[index/index+1];
        dm(i2,m4)=r0;                                // out=delayout
AMF_DelayEven_Loop:
        dm(i1,m4)=r1;                                // delay[index/index+1]=in, incr and wrap index

    bit clr mode1 PEYEN;    // Disable PEy:SIMD
    l1 = 0;

    r0=i1;
    dm(AMF_DelayEven_DelayWritePtr,i4)=r0;                 // store away current delay pointer

 // pop context off stack
    b1=gets(1);
    i0=gets(2);
    i1=gets(3);
    i2=gets(4);
    mode1=gets(5);
    alter(5);

//------------------------------------------------------------------------------------
_AMF_DelayEven_Render.END:
    leaf_exit; // C-rth requires this instead of rts
//------------------------------------------------------------------------------------
    
.endseg;
#endif

⌨️ 快捷键说明

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