#include <7047.h>


void InitSH(void)
{
    PFC.PECRL1.WORD=0;
    PFC.PECRL2.WORD=0;
    PFC.PEIORL.WORD=0xFFFF;//PE I/O 書き出しモード

    PFC.PACRL2.WORD=0;
    PFC.PAIORL.WORD=0xFFFF;

    PFC.PBCR1.BIT.PB5MD=0; //PB=出力
    PFC.PBCR2.BIT.PB5MD=0;
    PFC.PBCR1.WORD=0;

    PFC.PBIOR.BIT.B5=1;
    PFC.PBIOR.WORD=0XFFFF;
    PFC.PDIORL.WORD=0xFFFF;


    MST.CR2.BIT._AD0=0; // この設定がないと、AD変換器が動かない
    AD0.ADCR.BIT.ADST=0;
    AD0.ADCR.BYTE=0;
    AD0.ADCSR.BYTE=0;
    AD0.ADCR.BIT.CKS=0x3;
    AD0.ADCR.BIT.ADST=1; //start AD
}


#define N 81 //firのタップ数 奇数にする



short fir[N]={
//; ----------------------------------------------------------
//;81taps Q10 Band(1) Low:0.00000 High:0.10000 R= -141.8897
//; Band(2) Low:0.20000 High:0.30000 R= 6.98759E-07
//; Band(3) Low:0.40000 High:0.50000 R= -141.8897
//;----------------------------------------------------------
0,0,0,0,
0,0,0,0,
0,1,0,-1,
1,-2,0,3,
-2,1,-1,-7,
5,2,2,12,
-13,-9,3,-13,
28,20,-21,7,
-47,-30,75,6,
63,31,-313,-21,
442,-21,-313,31,
63,6,75,-30,
-47,7,-21,20,
28,-13,3,-9,
-13,12,2,2,
5,-7,-1,1,
-2,3,0,-2,
1,-1,0,1,
0,0,0,0,
0,0,0,0,
0

};

short data_up[N]={0};
short data_low[N]={0};
short data=0;


inline void kakunou(unsigned char j,short data3,unsigned char k)
{
    data_up[k-1-j]=data3; //下から格納する
    data_low[k-1-j]=data3; //同じ
}

inline void clrmac(void)
{
    asm("clrmac");
}

int macw( short *a,short *b )
{
    int c;
    asm("mov.l %0,r2\n"
    "mov.l %1,r3"::"m" (a),"m" (b) );
    asm(".rept 81\n" //ここのNだけは、手動で変える事
    "mac.w @r2+,@r3+\n"
    ".endr");
    asm("sts MACL,r4\n" //積和MACの下位だけr4に移す。MACHに溢れたら、どうするんや?
    "mov.l r4,%0":"=m" (c));
    return c; //int Cを返す
}

int data_chukan=0;
unsigned char i=0;

int main(void)
{
    InitSH();
    i=0;

    while(1)
    {
    PE.DRL.BIT.B12=1; //DA変換器用タイミング

    if (AD0.ADCSR.BIT.ADF)
        {
        AD0.ADCSR.BIT.ADF=0;
        AD0.ADCR.BIT.ADST=0;

        data=AD0.ADDR0.WORD;
        data -=0x82C0;//無入力時のAD0の値
        data=data>>6;//上位10ビットが有効
        kakunou(i,data,N);
        data_chukan=macw( (data_up+N-1-i),fir);
        clrmac();
        data=(data_chukan>>10); //ここの出力が、要調整?
        data +=0x82C0;//無入力時のAD0の値を足す
        PE.DRL.WORD =data;
        i++;
        if( i==N) i=0;

        AD0.ADCR.BIT.ADST=1;
         }

    PE.DRL.BIT.B12=0; //DA変換器用タイミング
    }

return 1;
}