|
#define fskfilter(res,val,state,coeff) \
asm volatile ( \
"sr1=%1; i0=%2;"\
"DIS M_MODE;"\
"se=1;"\
"m1=1;"\
"m3=-3;"\
"i6=%3;"\
"m6=1;"\
"mx0=dm(i0,m1), my0=pm(i6,m6);"\
"mr=mx0*my0(ss), mx1=dm(i0,m1), my0=pm(i6,m6);"\
"mr=mr+mx1*my0(ss), my0=dm(i6,m6);"\
"mr=mr+sr1*my0(ss), mx0=dm(i0,m1), my0=pm(i6,m6);"\
"mr=mr+mx0*my0(ss), mx0=dm(i0,m3), my0=pm(i6,m6);"\
"dm(i0,m1)=mx1, mr=mr+mx0*my0(rnd);"\
"dm(i0,m1)=sr1, sr=ashift mr1(hi);"\
"mx0=dm(i0,m1), my0=pm(i6,m6);"\
"mr=mx0*my0(ss), mx1=dm(i0,m1), my0=pm(i6,m6);"\
"mr=mr+mx1*my0(ss), my0=dm(i6,m6);"\
"mr=mr+sr1*my0(ss), mx0=dm(i0,m1), my0=pm(i6,m6);"\
"mr=mr+mx0*my0(ss), mx0=dm(i0,m3), my0=pm(i6,m6);" \
"dm(i0,m1)=mx1, mr=mr+mx0*my0(rnd);"\
"dm(i0,m1)=sr1, sr=ashift mr1(hi);"\
"dm(i0,m1)=mx0;"\
"dm(i0,m1)=sr1;"\
"ENA M_MODE;"\
"%0=sr1;"\
: "=r"(res) : "r"(val) , "r"(state), "r"(coeff) : "SR", "I0", "I6", "MX0", "MX1", "MY0", "SE", "MR", "M1", "M3", "M6" )
unsigned decode(short *buf,unsigned num,bool *out,fsk_state *fskstate)
{
unsigned i;
short *pdelay=fskstate->delay;
bool *outbuf=out;
unsigned lenmax=FSK_MAXFSKBUF;
short *ptr=buf;
for(i=0;i bool newbit=(rt<0);
E-mail:
info@telesys.ru
pdelay=buf;
}
int rt;
fskfilter(rt,(*ptr++)*(*pdelay++),fskstate->filter_state,fskstate->coeff);
if (fskstate->lastbit != newbit) {
fskstate->lastbit = newbit;
if (fskstate->phase< 0x8000)
fskstate->phase += FSK_BAUD_PLL_ADJ;
else
fskstate->phase -= FSK_BAUD_PLL_ADJ;
}
// asm overflow optimization
fskstate->phase+=fskstate->phase_incr;
asm volatile ("if not ac jump .adrcont;");
if(lenmax) {
*outbuf++ = fskstate->lastbit;
lenmax--;
}
asm volatile (".adrcont:");
}
// save state
fskstate->delay=pdelay;
return ((unsigned)outbuf)-(unsigned)out;
}
Ответы