📄 amf_delayeven_render.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 + -