* initialization n equ 20 start equ $40 wddr equ $0 cddr equ $0 input equ $ffe0 output equ $ffe1 ; org p:start move #wddr,r0 ;r0 ¬ samples move #cddr,r4 ;r1 ¬ coefficients move #n-1,m0 ;set modulo arithmetic move m0,m4 ;for the 2 circular buffers ; opt cc ; filter loop :8+(n-1) cycles movep y:input,x: (r0) ;input sample in memory clr a x:(r0)+,x0 y: (r4)+,y0 rep #n-1 mac x0,y0,a x:(r0)+,x0 y:(r4)+,y0 macr x0,x0,a (r0)- movep a,y:output ;output filtered sample fftr2a macro points,data,coef fftr2a: ident 1,1 move #points/2,n0 ;initialize butterflies per group move #1,n2 ;initialize groups per pass move #points/4,n6 ;initialize C pointer offset move #-1,m0 ;initialize A and B address modifiers move m0,m1 ;for linear addressing move m0,m4 move m0,m5 move #0,m6 ;initialize C address modifier for ;reverse carry (bit-reversed) addressing do #@cvi (@log(points)/@log(2)+0.5),_end_pass move #data,r0 ;initialize A input pointer move r0,r4 ;initialize A output pointer _end_bfy move a,x:(r5)+n5 y:(r1)+n1,y1 end_cell rnd a movep #0,x:$fffe dc @sin(@cvf(count)*freq) move #twiddle,r2 MOVE L:<$1,A SUB X,A L:<$3,B bad_label good_label: