.include "m8def.inc"
/* Программа вычисления гармонических составляющих входного сигнала */
.def zeroreg = r2;
.def count_k = r3;
.def count_n = r4;
.def accum_a_l = r5;
.def accum_a_h = r6;
.def accum_b_l = r7;
.def accum_b_h = r8;
.def tmpX = r9;

.def signal = r16;		r16...r23 only!
.def coeff = r17;		r16...r23 only!
.def tmp = r18;

ldi tmp, high(RAMEND);
out SPH, tmp;
ldi tmp, low(RAMEND);
out SPL, tmp;			установка стека

ldi r27, $01;
clr r26;			X - sin/cos(nk), $0100 = 256
clr r29;
ldi r28, $60;		Y - s(n), $0060 = 96
ldi tmp, 16

clr count_k;
ldi r31, high(input_signal*2);
ldi r30, low(input_signal*2);
loop_test:
lpm tmpX, Z+;
st Y+, tmpX;
inc count_k;
cpse count_k, tmp;
rjmp loop_test;

clr count_k;
ldi r31, high(coeff_sinus*2);
ldi r30, low(coeff_sinus*2);
loop_prepare:
lpm tmpX, Z+;
st X+, tmpX;
inc count_k;
cpse count_k, tmp;
rjmp loop_prepare;


;______________________________________________________
sin_cos_transform:		;начало (основной) подпрограммы

clr count_k;			инициализация счётчика гармоник
clr r31;
ldi r30, $B0;			Z - a(k) & b(k). $00B0 = 176

loop_k:
;{ loop_k
	inc count_k;		инкремент счётчика k для получения 1-ой гармоники
	ldi r27, $01;
	clr r26;			X - sin/cos(nk), $0100 = 256
	clr r29;
	ldi r28, $60;		Y - s(n), $0060 = 96

	clr accum_a_l;
	clr accum_a_h;
	clr accum_b_l;
	clr accum_b_h;
	clr count_n;		
	loop_n:
	;{{ loop_n
		ld signal, Y+;	загрузка отсчёта сигнала с пост-инкрементом
		ld coeff, X;?	загрузка отсчёта синуса
		mov tmpX, r26;	сохраняем следующий адрес	

		mulsu coeff, signal;	s(n)*sin(nk)
		adc r1, zeroreg;

		clr r0;
		sbrc r1,7
		com r0;
		add accum_a_l, r1;
		adc accum_a_h, r0;
		
		ldi tmp, 4;		%%%%%%%%%%%%%%%%%%%%
		add r26, tmp;	прибавляем Nfft/4 чтобы получить косинус
		andi r26, 0b00001111;	маска чтобы не вылезти за пределы таблицы
		ld coeff, X;?	загрузка отсчёта косинуса
		mov r26, tmpX;	восстанавливаем след. адрес синуса
		add r26, count_k;?		инкремент согласно номеру гармоники
		andi r26, 0b00001111;	маска чтобы не вылезти за пределы таблицы		
				
		mulsu coeff, signal;	s(n)*cos(nk)
		adc r1, zeroreg;

		clr r0;
		sbrc r1,7
		com r0;
		add accum_b_l, r1;
		adc accum_b_h, r0;

		inc count_n;
		ldi tmp, 15;15				Nfft-1			%%%%%%%%%%%%%%%%%%%%%%%%%%%
		cpse count_n, tmp;
		rjmp loop_n;
	;}} loop_n
	rol accum_a_l;
	rol accum_a_h;
	rol accum_a_l;
	rol accum_a_h;
	rol accum_a_l;
	rol accum_a_h;
	rol accum_a_l;
	rol accum_a_h;
	rol accum_a_l;
	rol accum_a_h;
	st Z+, accum_a_h;
	rol accum_b_l;
	rol accum_b_h;
	rol accum_b_l;
	rol accum_b_h;
	rol accum_b_l;
	rol accum_b_h;
	rol accum_b_l;
	rol accum_b_h;
	rol accum_b_l;
	rol accum_b_h;	
	st Z+, accum_b_h;

	ldi tmp, 8;8				Nfft/2				%%%%%%%%%%%%%%%%%%%%%%%%%%%
	cpse count_k, tmp;
	rjmp loop_k;
;} loop_k

;END of sin-cos-transform
;______________________________________________________



nop;
nop;











.cseg
input_signal:
;.db 128, 176, 218, 245, 255, 245, 218, 176, 128, 79, 37, 10, 0, 10, 37, 79;sinus_1 0...255
.db 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0;conus_8 0...255
coeff_sinus:
.db 0, 49, 90, 117, 127, 117, 90, 49, 0, -49, -90, -117, -127, -117, -90, -49;127*sinus
