.MODULE/ROM fir-subroutine
.INCLUDE <const.h> {файл 16-ричных констатнт}
.PORT ad_input
.PORT da_output
.ENTRY start_fir
.EXTERNAL data, coefficients
STARTFILTER: {тело подпрограммы}
IO=^data; {указывает на начальный адрес буфера данных}
I4=^coefficients; {указывает на начальный адрес массива
коэффициентов}
CNTR=NTAPS;
SI=DM(ad_input); {входная выборка в регистр сдвигателя}
DM(I0,M0)=SI; {копирование выборки в линию задержки}
MR=0, MX0=DM(I0,M0),MY0=PM(I4,M4); {данные в MX и
коэффициенты в MY}
DO taploop UNTIL CE;
taploop: MR=MR+MX0*MY0,MX0=DM(I0,M)),MY0=PM(I4,M4);
MR=MR+MX0*MY0(RND); {последний элемент свертки и
округление}
DM(DA_output)=MR1; {вывод выходного сигнала на ЦАП }
RTS; {возврат из подпрограммы}
Данная подпрограмма вызывается из основной программы, которая в свою
очередь может вызывать другие модули ввода вывода и обработки данных:
. MODULE/ROM/ABS=0 main program;
.INCLUDE <const.h> {include constants}
.VAR/DM/RAM/CIRC data[ntaps];
.VAR/PM/ROM/CIRC coefficients[ntaps];
.GLOBAL data, coefficients;
.EXTERNAL fir_subroutine, other_stuff;
{initialization}
L0=^data; {buffers}
L4=^coefficients;
M0=1;
M4=1;
I0=^data; {data pointer}
CNTR=^data; {data buffer length}
DO zero UNTIL CE; {clear data buffer}
zero: DM(I0,M0)=0;
mainloop: CALL fir_subroutine; {data grab, filter, output}
CALL other_stuff; {other processing}
JUMP mainloop;
83