Ну тогда спецпально для Вас читабельная версия (если опять табуляция не испортится), суть в том что с умом можно вставлять можно что угодно и компилер это учитывает
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено bmf 07 сентября 2005 г. 16:45
В ответ на: Нет, про море Вы мне не рассказывайте:-) Я на adsp21чx асме достаточно писал в свое время. отправлено -=ВН=- 07 сентября 2005 г. 16:14

#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 if(i==FSK_DELAY) {
pdelay=buf;
}


int rt;
fskfilter(rt,(*ptr++)*(*pdelay++),fskstate->filter_state,fskstate->coeff);

bool newbit=(rt<0);


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;
}


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru