/************************************************************************ File Name: Fir_test.asm Date Modified: 6/22/01 BM Purpose: Demonstrate initialization and operation of FIR.asm on the ADSP-2192. FIR.asm is a single precision direct form FIR filter. All coefficients and data values are assumed to be in 1.15 format. ************************************************************************/ #define Num_Samp 512 /* NUmber of Input samples */ #define Taps 31 /* Number of filter taps */ #define Shift 2 /* Number of shifts */ #define Samps_per_Bin 40 /* Number of Input samples in each bin */ #define Num_Bins (Num_Samp/Samps_per_Bin) /* Number of bins */ .EXTERN fir; /* DM data */ .section/data data1; .VAR IN[Num_Samp] = "input_dec.dat"; /* Input buffer */ .VAR OUT[Num_Samp]; /* Output buffer */ .VAR Delay_Line[Taps]; /* Delay line */ /* PM data */ .section/pm data2; .VAR COEFF[Taps] = "coeff_l.dat"; /* PM interrupt vector code */ .section/pm IVreset; JUMP start; NOP; NOP; NOP; /* Program memory code */ .section/pm program; start: I0=Delay_Line; /* Initialize delay line pointer */ M1 = 1; I1 = IN; /* Initialize Input pointer */ I2 = OUT; /* Initialize Output pointer */ L1=0; /* Initialize for modulo addressing */ L2=0; /* Initialize for modulo addressing */ M3=-1; M4=1; SE = Shift; DMPG2=page(COEFF); L0=LENGTH (Delay_Line); /* Initialize delay line circular buffer */ ax0 = Delay_Line; REG(b0) = ax0; /* Initialize pointer to delay line */ L4=length(COEFF); /* Initialize coeficient circular buffer */ ax0 = COEFF; reg(b4) = ax0; /* Initialize pointer to coeficient */ CNTR=Taps; /* 'Taps' location delay line */ DO zero UNTIL CE; zero: dm(I0,M1)=L0; /* Delay_line = 0 */ CNTR = Num_Bins; /* Num_Bins to process Num_Samp */ do per_bin until CE; call fir (db); I4=COEFF; /* Load Coeff buffer pointer */ nop; per_bin: nop; looping: JUMP looping; /* Loop upon itself */ /************************************************************************/