	XDEF _fft
	XDEF _spec
	XDEF _f


g equ 256	;Anzahl Daten
n equ 8		;g=2^n
nk equ 10	;Anzahl binäre Nachkommastellen

LMULS: 	MACRO
;\1*\2=\1
;\1: Langwort	Ergebnis
;\2: Wort	bleibt erhalten
;\3: Langwort	Hilfsregister

	tst.w	\2
	bgt	lm_gt\@
	neg.w	\2
	neg.l	\1
lm_gt\@:
	move.w	\1,\3
	mulu	\2,\3
	swap	\1
	muls	\2,\1
	swap	\1
	clr.w	\1
	add.l	\3,\1

	ENDM


_fft:
	movem.l	d0-d7/a1-a6,-(sp)

	lea	_e(pc),a0
	lea	_f(pc),a1

;l:	bra	l

	move.w	#n,a3		;m=n
fft_l1:
	move.w	#0,a4		;k=0
	moveq	#1,d0
	move.w	a3,d1
	lsl.w	d1,d0
	move.w	d0,a5		;a5=2^m
	asr.w	#1,d0
	subq.w	#1,d0
	move.w	d0,a6		;a6=2^(m-1)-1
fft_l2:
	moveq	#0,d7		;r=0
fft_l3:
	move.w	a4,d0
	add.w	d7,d0
	asl.w	#3,d0		;ia=(r+k) *8
	move.w	a5,d1
	asl.w	#2,d1
	add.w	d0,d1		;ib=(r+k+2^(m-1)) *8

	move.l	0(a1,d0.w),d2	;u_re= f[ia].re
	move.l	4(a1,d0.w),d3	;u_im= f[ia].im
	move.l	0(a1,d1.w),d4	;v_re= f[ib].re
	move.l	4(a1,d1.w),d5	;v_im= f[ib].im

	move.l	d2,d6
	add.l	d4,d6
	asr.l	#1,d6
	move.l	d6,0(a1,d0.w)	;f[ia].re= u_re+v_re >> 1
	move.l	d3,d6
	add.l	d5,d6
	asr.l	#1,d6
	move.l	d6,4(a1,d0.w)	;f[ia].im= u_im+v_im >> 1

	sub.l	d4,d2		;h_re= u_re-v_re
	sub.l	d5,d3		;h_im= u_im-v_im

	move.l	d2,d4
	move.w	(a0),d0
	LMULS	d4,d0,d6
	moveq	#nk+1,d6	;d6= nk+1
	asr.l	d6,d4
	move.l	d3,d5
	move.w	2(a0),d0
	LMULS	d5,d0,d6
	moveq	#nk+1,d6	;d6= nk+1
	asr.l	d6,d5
	sub.l	d5,d4
	move.l	d4,0(a1,d1.w)	;f[ib].re= h_re*e_re>>d6 - h_im*e_im>>d6

	move.l	d2,d4
	move.w	2(a0),d0
	LMULS	d4,d0,d6
	moveq	#nk+1,d6	;d6= nk+1
	asr.l	d6,d4
	move.l	d3,d5
	move.w	(a0),d0
	LMULS	d5,d0,d6
	moveq	#nk+1,d6	;d6= nk+1
	asr.l	d6,d5
	add.l	d5,d4
	move.l	d4,4(a1,d1.w)	;f[ib].im= h_re*e_im>>d6 + h_im*e_re>>d6

	add.w	a5,d7
	cmp.w	#g-1,d7
	ble	fft_l3

	addq.l	#4,a0
	addq.w	#1,a4
	move.w	a4,d0
	cmp.w	a6,d0
	ble	fft_l2

	subq.w	#1,a3
	move.w	a3,d0
	bgt	fft_l1

	moveq	#0,d7
	moveq	#12,d6
	lea	_p(pc),a0
	lea	_f(pc),a1
	lea	_spec(pc),a2

;p:	bra 	p

p_loop:	move.w	(a0,d7.w),d2

	move.l	(a1,d2.w),d0
	asr.l	#5,d0
	muls	d0,d0

	move.l	4(a1,d2.w),d1
	asr.l	#5,d1
	muls	d1,d1

	add.l	d1,d0
	asr.l	d6,d0
	move.w	d0,(a2)+	
	addq.w	#2,d7
	cmp.w	#256,d7
	blt	p_loop

	movem.l	(sp)+,d0-d7/a1-a6
	rts


_e:	incbin "e.func"	;(komplexe Hilfsfunktion, 2*256 words)
_f:	ds.l	2*256	;(komplexe Arbeitsfunktion)
_p:	incbin "p.func" ;(bit reversive, 256 words)
_spec:  ds.w	128	;(Ergebnis: Spektrum)

