?? fir32_emac.s
字號:
mac.l a6,d5,<<,ACC0 ;ACC0+=a6*d5;
mac.l a6,d6,<<,-(a3),a6,ACC1 ;ACC1+=a6*d6; a6=*--pCurCoef;
mac.l a6,d6,<<,ACC0 ;ACC0+=a6*d6
.ENDBUFx: ;}//end if #3
;}//end if #1
;//storing results
movclr.l ACC0,d6 ;d6=ACC0; ACC0=0;
move.l d6,(a0)+ ;(*pCurY++)=d6;
movclr.l ACC1,d6 ;d6=ACC1; ACC1=0;
move.l d6,(a0)+ ;(*pCurY++)=d6;
movclr.l ACC2,d6 ;d6=ACC2; ACC2=0;
move.l d6,(a0)+ ;(*pCurY++)=d6;
movclr.l ACC3,d6 ;d6=ACC3; ACC3=0;
move.l d6,(a0)+ ;(*pCurY++)=d6;
addq.l #4,d1 ;//i+=4;
bra .FORi1 ;//jumping to .FORi1
.ENDFORi1: ;}//end of outer loop #1
move.l d0,d7 ;d7=N%4;
andi.l #3,d7
move.l d0,d5 ;d5=N-d7+1;
sub.l d7,d5
addq.l #1,d5
moveq.l #1,d1 ;//i=1;
;//cycle of computing a "tail" of output samples from Y[N-N%4+1] to Y[N]
.FORi2: ;for(i=1; i<=N%4; i++){ //begin of outer loop #2
cmp.l d7,d1 ;//comparing i with N%4
bhi .ENDFORi2 ;//if (i>N%4) then jump to .ENDFORi2
move.l 68(a7),a6 ;pCurX=pX+d5;
lea (0,a6,d5.l*4),a1
move.l (a2),a3 ;pCurCoef=pFIR->pFirCoef;
//cycle of getting Y[d5]
moveq #0,d2
move.l (a3)+,d4 ;d4=*pCurCoef++;
.FORk21: ;for (k=0; k<d5; k++) { //begin of inner loop #4
move.l -(a1),d3 ;d3=*--pCurX
mac.l d3,d4,<<,(a3)+,d4,ACC0 ;ACC0+=d3*d4; d4=*pCurCoef++;
addq.l #1,d2 ;//Incrementing k
cmp.l d5,d2 ;//Comparing k with i
bcs .FORk21 ;//if (k<i) then jump to .FORk21
;} //end of inner loop #4
;//Testing that History Buffer is filled => this is not first calling of this function
tst.l 12(a2) ;if(pFIR->iFirHistoryCount>0) { //if #4
beq .NEXTif ;//if (pFIR->iFirHistoryCount=0) then jump to .NEXTif
move.l 8(a2),a6
lea (-4,a6,d0.l*4),a4 ;pCurHistory=pFIR->pFirHistory+N-1;
move.l d5,d2 ;for(k=d5;k<N;k++) { //begin of inner loop #5
.FORk22:
cmp.l d0,d2 ;//Comparing k with N
bcc .NEXTif
move.l -(a4),d3 ;d3=*--pCurHistory
mac.l d3,d4,<<,(a3)+,d4,ACC0 ;ACC0+=d3*d4; d4=*pCurCoef++;
addq.l #1,d2 ;//Incrementing k
bra .FORk22 ;//jumping to .FORk2
.NEXTif: ;}//end of inner loop #5
;// End of cycle of getting Y[d5]
;}//end if #4
movclr.l ACC0,d6 ;d6=ACC0; ACC0=0;
move.l d6,(a0)+ ;(*pCurY++)=d6;
addq.l #1,d1 ;//incrementing i
addq.l #1,d5 ;//incrementing d5
bra .FORi2 ;//Jumping to .FORi2
.ENDFORi2: ;//end of outer loop #2
;//End of getting Y[1]..Y[N]
;//begin of getting Y[N+1]..Y[n]
move.l 76(a7),d7 ;d7=n;//length of input and output arrays
cmpi.l #4,d0 ;//if (N>=4) then jump to .NMORE3
bcc .NMORE3 ;if (N<4) { //if #5
move.l d0,d1 ;d1=N+1;
addq.l #1,d1
bra .FORi4 ;//jumping to .FORi4
.NMORE3: ;}//end if #5
;//if number of coefficients more and equal 4
move.l d0,d1 ;if (N>=4) { //if #6
addq.l #4,d1 ;d1=N+4
.FORi3: ;for (i=d1; i<=n; i+=4){ //begin of outer loop #3
cmp.l d7,d1 ;//comparing i with n
bhi .ENDFORi3 ;//if (i>n) then jump to .ENDFORi3
move.l (a2),a3 ;pCurCoef=pFIR->pFirCoef;
move.l 68(a7),a6 ;pCurX=pX+i-4;
lea (-16,a6,d1.l*4),a1
movem.l (a1),d3-d6 ;d3=*pCurX++; d4=*pCurX++; d5=*pCurX++; d6=*pCurX; pCurX-=3;
move.l (a3)+,a6 ;a6=*pCurCoef++;
move.l d0,d2 ;d2=N%4+4;
andi.l #3,d2
addq.l #4,d2
cmpi.l #4,d2 ;if (d2=4){ //if #7
bne .CYCLE_BEGIN2
addq.l #1,d2 ;d2+=1;
;}//end if #7
.CYCLE_BEGIN2:
;//multiplying 4 input samples on first coefficient
mac.l a6,d6,<<,-(a1),d6,ACC3 ;ACC3+=a6*d6; d6=*--pCurX;
mac.l a6,d5,<<,ACC2 ;ACC2+=a6*d5;
mac.l a6,d4,<<,ACC1 ;ACC1+=a6*d4;
mac.l a6,d3,<<,(a3)+,a6,ACC0 ;ACC0+=a6*d3; a6=*pCurCoef++;
;//cycle of multiplying 8 input samples on 4 coefficients per iteration
.FORk4: ;for(k=d2; k<=N; k+=4) { //begin of inner loop #6
cmp.l d0,d2 ;//comparing k with N
bhi .ENDFORk4 ;//if (k>N) then jump to .ENDFORk4
mac.l a6,d5,<<,-(a1),d5,ACC3 ;ACC3+=a6*d5; d5=*--pCurX;
mac.l a6,d4,<<,ACC2 ;ACC2+=a6*d4;
mac.l a6,d3,<<,ACC1 ;ACC1+=a6*d3;
mac.l a6,d6,<<,(a3)+,a6,ACC0 ;ACC0+=a6*d6; a6=*pCurCoef++;
mac.l a6,d4,<<,-(a1),d4,ACC3 ;ACC3+=a6*d4; d4=*--pCurX;
mac.l a6,d3,<<,ACC2 ;ACC2+=a6*d3;
mac.l a6,d6,<<,ACC1 ;ACC1+=a6*d6;
mac.l a6,d5,<<,(a3)+,a6,ACC0 ;ACC0+=a6*d5; a6=*pCurCoef++;
mac.l a6,d3,<<,-(a1),d3,ACC3 ;ACC3+=a6*d3; d3=*--pCurX;
mac.l a6,d6,<<,ACC2 ;ACC2+=a6*d6;
mac.l a6,d5,<<,ACC1 ;ACC1+=a6*d5;
mac.l a6,d4,<<,(a3)+,a6,ACC0 ;ACC0+=a6*d4; a6=*pCurCoef++;
mac.l a6,d6,<<,-(a1),d6,ACC3 ;ACC3+=a6*d6; d6=*--pCurX;
mac.l a6,d5,<<,ACC2 ;ACC2+=a6*d5;
mac.l a6,d4,<<,ACC1 ;ACC1+=a6*d4;
mac.l a6,d3,<<,(a3)+,a6,ACC0 ;ACC0+=a6*d3; a6=*pCurCoef++;
addq.l #4,d2 ;//k+=4;
bra .FORk4 ;//jumping to .FORk4
.ENDFORk4: ;}//end of inner loop #6
move.l d0,d2 ;//k=(N-1)%4
subq.l #1,d2
andi.l #3,d2
;//cycle of multiplying 4 input samples on 1 coefficient per iteration
.FORk5: ;for(k=(N-1)%4; k>0; k--) { //begin of inner loop #7
cmpi.l #0,d2 ;//comparing k with 0
beq .ENDFORk5 ;//if (k=0) then jump to .ENDFORk5
mac.l a6,d5,<<,ACC3 ;ACC3+=a6*d5;
mac.l a6,d4,<<,ACC2 ;ACC2+=a6*d4;
mac.l a6,d3,<<,ACC1 ;ACC1+=a6*d3;
mac.l a6,d6,<<,(a3)+,a6,ACC0 ;ACC0+=a6*d6; a6=*pCurCoef++;
move.l d4,d5 ;d5=d4;
move.l d3,d4 ;d4=d3;
move.l d6,d3 ;d3=d6;
move.l -(a1),d6 ;d6=*--pCurX;
subq.l #1,d2 ;//decrementing k
bra .FORk5 ;//jumping to .FORk5
.ENDFORk5: ;}//end of inner loop #7
;//multiplying currently computing samples on coefficients and storing results
movclr.l ACC0,d4 ;d4=ACC0; ACC0=0;
move.l d4,(a0)+ ;(*pCurY++)=d4;
movclr.l ACC1,d4 ;d4=ACC1; ACC1=0;
move.l d4,(a0)+ ;(*pCurY++)=d4;
movclr.l ACC2,d4 ;d4=ACC2; ACC2=0;
move.l d4,(a0)+ ;(*pCurY++)=d4;
movclr.l ACC3,d4 ;d4=ACC3; ACC3=0;
move.l d4,(a0)+ ;(*pCurY++)=d4;
addq.l #4,d1 ;//i+=4
bra .FORi3 ;//jumping to .FORi3
.ENDFORi3: ;}//end of outer loop #3
move.l d7,d5 ;d5=(n-N)%4;
sub.l d0,d5
andi.l #3,d5
move.l d7,d1 ;d1=n-d5+1;
sub.l d5,d1
addq.l #1,d1
;}//end if #6
;//computing a "tail" of output samples
.FORi4: ;for(i=d1; i<=n; i++) { //begin of outer loop #4
cmp.l d7,d1 ;//comparing i with n
bhi .ENDFORi4 ;//if (i>n) then jump to .ENDFORi4
move.l 68(a7),a6 ;pCurX=pX+i;
lea (0,a6,d1.l*4),a1
move.l (a2),a3 ;pCurCoef=pFIR->pFirCoef;
moveq #0,d2 ;for(k=0;k<N;k++) {//begin of inner loop #8
move.l (a3)+,d4 ;d4=*pCurCoef++;
.FORk41:
move.l -(a1),d3 ;d3=*--pCurX;
mac.l d3,d4,<<,(a3)+,d4,ACC0 ;ACC0+=d3*d4; d4=pCurCoef++;
addq.l #1,d2 ;//Incrementing k
cmp.l d0,d2 ;//Comparing k with N
bcs .FORk41 ;//If (k<N) then jump to .FORk41
;} //end of inner loop #8
movclr.l ACC0,d6 ;d6=ACC0; ACC0=0;
move.l d6,(a0)+ ;(*pCurY++)=d6;
addq.l #1,d1 ;//Incrementing i
bra .FORi4 ;//Jumping to .FORi4
.ENDFORi4: ;}//end of outer loop #4
;---====== Begin of History Buffer Loading ======---
sub.l d0,d7
move.l 68(a7),a5
lea (4,a5,d7.l*4),a1 ;pCurX=pX+N+1;
move.l 8(a2),a4 ;pCurHistory=pFIR->pFirHistory;
moveq #1,d1 ;for(i=1;i<N;i++)
.FORbuf:
cmp.l d0,d1 ;//Comparing i with N
bcc .ENDbuf ;//If (i=>N) then jump to .ENDbuf
move.l (a1)+,(a4)+ ;*pCurHistory++=*pCurX++;
addq.l #1,d1 ;//Incrementing i
bra .FORbuf ;//Jumping to .FORbuf
.ENDbuf: ;}
subq.l #1,d1 ;pFIR->iFirHistoryCount=N-1;
move.l d1,12(a2) ; }//end
; ---====== End of History Buffer Loading ======--
;-=Restoring values of used registers=-
lea -4(a7),a7
move.l (a7),d0
move.l d0,MACSR
lea 4(a7),a7
movem.l (a7),d0-d7/a0-a6;
lea 60(a7),a7
rts
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -