
.globl mac_init;
  
ALIGN;
mac_init:
	movel #0,%macsr
	movel #0xfffffdff,%mask /*CFG_ADC_BUF_MASK */
	movel #0x0,%acc0
	movel #0x0,%acc1
	clrl  %d0
	rts
 
   

/*
在内核中函数调用压栈的顺序为从右到左，最后压栈的为返回地址。
例如下列函数中返回地址为sp(0)，a的地址为sp(4),b的地址为sp(8), c的地址为sp(12).
void abc(int a,int b, int c)
{
}
void fourier32(short *dots,short * real_image_pair,int harmonic)
*/
.globl fourier32;
ALIGN;
fourier32:
	subal	#(3*4), %sp
	moveml	%d2/%a2-%a3 ,%sp@

	/*得到初值*/
	movel 	%sp@(16),%a0				/*a0: 采样值的地址*/
	moveal	%sp@(24),%a1				/*a1:本次实部系数地址*/
	moveal 	%a1,%a2
	addl	#64,%a2						/*a2本次虚部系数地址*/
	movel 	%sp@(20),%a3				/*a3: 返回复数对的地址*/
	
	
	movel	#0,%acc0					/*ACC0清零*/
	movel	#0,%acc1					/*ACC1清零*/
	clrl	%d0
	
	mac.w	%d0u,%d2u,(%a0)+&,%d0,%acc0	/*%d2高16位为0,并取回下一个采样值*/
	movel	(%a1)+,%d1					/*实部系数*/
	
	/*循环计算*/
	mac.w	%d0l,%d1l,%acc0				/*乘加实部低16位*/
	mac.w	%d0u,%d1u,(%a2)+,%d2,%acc0		/*乘加实部高16位,并取虚部系数*/
	mac.w	%d0l,%d2l,(%a1)+,%d1,%acc1		/*乘加虚部低16位,并取实部系数*/
	mac.w	%d0u,%d2u,(%a0)+&,%d0,%acc1	/*乘加虚部高16位,并取采样值*/

	mac.w	%d0l,%d1l,%acc0				/*乘加实部低16位*/
	mac.w	%d0u,%d1u,(%a2)+,%d2,%acc0		/*乘加实部高16位,并取虚部系数*/
	mac.w	%d0l,%d2l,(%a1)+,%d1,%acc1		/*乘加虚部低16位,并取实部系数*/
	mac.w	%d0u,%d2u,(%a0)+&,%d0,%acc1	/*乘加虚部高16位,并取采样值*/
	
	mac.w	%d0l,%d1l,%acc0				/*乘加实部低16位*/
	mac.w	%d0u,%d1u,(%a2)+,%d2,%acc0		/*乘加实部高16位,并取虚部系数*/
	mac.w	%d0l,%d2l,(%a1)+,%d1,%acc1		/*乘加虚部低16位,并取实部系数*/
	mac.w	%d0u,%d2u,(%a0)+&,%d0,%acc1	/*乘加虚部高16位,并取采样值*/
	
	mac.w	%d0l,%d1l,%acc0				/*乘加实部低16位*/
	mac.w	%d0u,%d1u,(%a2)+,%d2,%acc0		/*乘加实部高16位,并取虚部系数*/
	mac.w	%d0l,%d2l,(%a1)+,%d1,%acc1		/*乘加虚部低16位,并取实部系数*/
	mac.w	%d0u,%d2u,(%a0)+&,%d0,%acc1	/*乘加虚部高16位,并取采样值*/
	
	mac.w	%d0l,%d1l,%acc0				/*乘加实部低16位*/
	mac.w	%d0u,%d1u,(%a2)+,%d2,%acc0		/*乘加实部高16位,并取虚部系数*/
	mac.w	%d0l,%d2l,(%a1)+,%d1,%acc1		/*乘加虚部低16位,并取实部系数*/
	mac.w	%d0u,%d2u,(%a0)+&,%d0,%acc1	/*乘加虚部高16位,并取采样值*/
	
	mac.w	%d0l,%d1l,%acc0				/*乘加实部低16位*/
	mac.w	%d0u,%d1u,(%a2)+,%d2,%acc0		/*乘加实部高16位,并取虚部系数*/
	mac.w	%d0l,%d2l,(%a1)+,%d1,%acc1		/*乘加虚部低16位,并取实部系数*/
	mac.w	%d0u,%d2u,(%a0)+&,%d0,%acc1	/*乘加虚部高16位,并取采样值*/
	
	mac.w	%d0l,%d1l,%acc0				/*乘加实部低16位*/
	mac.w	%d0u,%d1u,(%a2)+,%d2,%acc0		/*乘加实部高16位,并取虚部系数*/
	mac.w	%d0l,%d2l,(%a1)+,%d1,%acc1		/*乘加虚部低16位,并取实部系数*/
	mac.w	%d0u,%d2u,(%a0)+&,%d0,%acc1	/*乘加虚部高16位,并取采样值*/
	
	mac.w	%d0l,%d1l,%acc0				/*乘加实部低16位*/
	mac.w	%d0u,%d1u,(%a2)+,%d2,%acc0		/*乘加实部高16位,并取虚部系数*/
	mac.w	%d0l,%d2l,(%a1)+,%d1,%acc1		/*乘加虚部低16位,并取实部系数*/
	mac.w	%d0u,%d2u,(%a0)+&,%d0,%acc1	/*乘加虚部高16位,并取采样值*/
	
	mac.w	%d0l,%d1l,%acc0				/*乘加实部低16位*/
	mac.w	%d0u,%d1u,(%a2)+,%d2,%acc0		/*乘加实部高16位,并取虚部系数*/
	mac.w	%d0l,%d2l,(%a1)+,%d1,%acc1		/*乘加虚部低16位,并取实部系数*/
	mac.w	%d0u,%d2u,(%a0)+&,%d0,%acc1	/*乘加虚部高16位,并取采样值*/
	
	mac.w	%d0l,%d1l,%acc0				/*乘加实部低16位*/
	mac.w	%d0u,%d1u,(%a2)+,%d2,%acc0		/*乘加实部高16位,并取虚部系数*/
	mac.w	%d0l,%d2l,(%a1)+,%d1,%acc1		/*乘加虚部低16位,并取实部系数*/
	mac.w	%d0u,%d2u,(%a0)+&,%d0,%acc1	/*乘加虚部高16位,并取采样值*/
	
	mac.w	%d0l,%d1l,%acc0				/*乘加实部低16位*/
	mac.w	%d0u,%d1u,(%a2)+,%d2,%acc0		/*乘加实部高16位,并取虚部系数*/
	mac.w	%d0l,%d2l,(%a1)+,%d1,%acc1		/*乘加虚部低16位,并取实部系数*/
	mac.w	%d0u,%d2u,(%a0)+&,%d0,%acc1	/*乘加虚部高16位,并取采样值*/
	
	mac.w	%d0l,%d1l,%acc0				/*乘加实部低16位*/
	mac.w	%d0u,%d1u,(%a2)+,%d2,%acc0		/*乘加实部高16位,并取虚部系数*/
	mac.w	%d0l,%d2l,(%a1)+,%d1,%acc1		/*乘加虚部低16位,并取实部系数*/
	mac.w	%d0u,%d2u,(%a0)+&,%d0,%acc1	/*乘加虚部高16位,并取采样值*/
	
	mac.w	%d0l,%d1l,%acc0				/*乘加实部低16位*/
	mac.w	%d0u,%d1u,(%a2)+,%d2,%acc0		/*乘加实部高16位,并取虚部系数*/
	mac.w	%d0l,%d2l,(%a1)+,%d1,%acc1		/*乘加虚部低16位,并取实部系数*/
	mac.w	%d0u,%d2u,(%a0)+&,%d0,%acc1	/*乘加虚部高16位,并取采样值*/
	
	mac.w	%d0l,%d1l,%acc0				/*乘加实部低16位*/
	mac.w	%d0u,%d1u,(%a2)+,%d2,%acc0		/*乘加实部高16位,并取虚部系数*/
	mac.w	%d0l,%d2l,(%a1)+,%d1,%acc1		/*乘加虚部低16位,并取实部系数*/
	mac.w	%d0u,%d2u,(%a0)+&,%d0,%acc1	/*乘加虚部高16位,并取采样值*/
	
	mac.w	%d0l,%d1l,%acc0				/*乘加实部低16位*/
	mac.w	%d0u,%d1u,(%a2)+,%d2,%acc0	/*乘加实部高16位,并取虚部系数*/
	mac.w	%d0l,%d2l,(%a1)+,%d1,%acc1	/*乘加虚部低16位,并取实部系数*/
	mac.w	%d0u,%d2u,(%a0)+&,%d0,%acc1	/*乘加虚部高16位,并取采样值*/
	
	mac.w	%d0l,%d1l,%acc0				/*乘加实部低16位*/
	mac.w	%d0u,%d1u,(%a2)+,%d2,%acc0	/*乘加实部高16位,并取虚部系数*/
	mac.w	%d0l,%d2l,%acc1				/*乘加虚部低16位*/
	mac.w	%d0u,%d2u,%acc1				/*乘加虚部高16位*/

	/*取得结果,并四舍五入*/
	movel 	%acc0,%d0		/*结果->D0*/
	addl	#0x8000,%d0		/*大于0.5就加一，已考虑正负数问题。*/
	swap	%d0				/*交换高低16位，就是将结果值除以65536*/
	move.w 	%d0,(%a3)+		/*保存结果*/
	
	movel 	%acc1,%d0		/*结果->D0*/
	addl	#0x8000,%d0		/*大于0.5就加一，已考虑正负数问题。*/
	swap	%d0				/*交换高低16位，就是将结果值除以65536*/
	move.w 	%d0,(%a3)		/*保存结果*/

	/*函数退出*/
	moveml 	%sp@,%d2/%a2-%a3
	addal	#(3*4), %sp
	
	rts        

	.globl fourier32_half;
ALIGN;
fourier32_half:
	subal	#(3*4), %sp
	moveml	%d2/%a2-%a3 ,%sp@

	/*得到初值*/
	movel 	%sp@(16),%a0				/*a0: 采样值的地址*/
	moveal	%sp@(24),%a1				/*a1:本次实部系数地址*/
	moveal 	%a1,%a2
	addl	#64,%a2						/*a2本次虚部系数地址*/
	movel 	%sp@(20),%a3				/*a3: 返回复数对的地址*/
	
	
	movel	#0,%acc0					/*ACC0清零*/
	movel	#0,%acc1					/*ACC1清零*/
	clrl	%d0
	
	mac.w	%d0u,%d2u,(%a0)+&,%d0,%acc0	/*%d2高16位为0,并取回下一个采样值*/
	movel	(%a1)+,%d1					/*实部系数*/
	
	/*循环计算*/
	mac.w	%d0l,%d1l,%acc0				/*乘加实部低16位*/
	mac.w	%d0u,%d1u,(%a2)+,%d2,%acc0		/*乘加实部高16位,并取虚部系数*/
	mac.w	%d0l,%d2l,(%a1)+,%d1,%acc1		/*乘加虚部低16位,并取实部系数*/
	mac.w	%d0u,%d2u,(%a0)+&,%d0,%acc1	/*乘加虚部高16位,并取采样值*/

	mac.w	%d0l,%d1l,%acc0				/*乘加实部低16位*/
	mac.w	%d0u,%d1u,(%a2)+,%d2,%acc0		/*乘加实部高16位,并取虚部系数*/
	mac.w	%d0l,%d2l,(%a1)+,%d1,%acc1		/*乘加虚部低16位,并取实部系数*/
	mac.w	%d0u,%d2u,(%a0)+&,%d0,%acc1	/*乘加虚部高16位,并取采样值*/
	
	mac.w	%d0l,%d1l,%acc0				/*乘加实部低16位*/
	mac.w	%d0u,%d1u,(%a2)+,%d2,%acc0		/*乘加实部高16位,并取虚部系数*/
	mac.w	%d0l,%d2l,(%a1)+,%d1,%acc1		/*乘加虚部低16位,并取实部系数*/
	mac.w	%d0u,%d2u,(%a0)+&,%d0,%acc1	/*乘加虚部高16位,并取采样值*/
	
	mac.w	%d0l,%d1l,%acc0				/*乘加实部低16位*/
	mac.w	%d0u,%d1u,(%a2)+,%d2,%acc0		/*乘加实部高16位,并取虚部系数*/
	mac.w	%d0l,%d2l,(%a1)+,%d1,%acc1		/*乘加虚部低16位,并取实部系数*/
	mac.w	%d0u,%d2u,(%a0)+&,%d0,%acc1	/*乘加虚部高16位,并取采样值*/
	
	mac.w	%d0l,%d1l,%acc0				/*乘加实部低16位*/
	mac.w	%d0u,%d1u,(%a2)+,%d2,%acc0		/*乘加实部高16位,并取虚部系数*/
	mac.w	%d0l,%d2l,(%a1)+,%d1,%acc1		/*乘加虚部低16位,并取实部系数*/
	mac.w	%d0u,%d2u,(%a0)+&,%d0,%acc1	/*乘加虚部高16位,并取采样值*/
	
	mac.w	%d0l,%d1l,%acc0				/*乘加实部低16位*/
	mac.w	%d0u,%d1u,(%a2)+,%d2,%acc0		/*乘加实部高16位,并取虚部系数*/
	mac.w	%d0l,%d2l,(%a1)+,%d1,%acc1		/*乘加虚部低16位,并取实部系数*/
	mac.w	%d0u,%d2u,(%a0)+&,%d0,%acc1	/*乘加虚部高16位,并取采样值*/
	
	mac.w	%d0l,%d1l,%acc0				/*乘加实部低16位*/
	mac.w	%d0u,%d1u,(%a2)+,%d2,%acc0	/*乘加实部高16位,并取虚部系数*/
	mac.w	%d0l,%d2l,(%a1)+,%d1,%acc1	/*乘加虚部低16位,并取实部系数*/
	mac.w	%d0u,%d2u,(%a0)+&,%d0,%acc1	/*乘加虚部高16位,并取采样值*/
	
	mac.w	%d0l,%d1l,%acc0				/*乘加实部低16位*/
	mac.w	%d0u,%d1u,(%a2)+,%d2,%acc0	/*乘加实部高16位,并取虚部系数*/
	mac.w	%d0l,%d2l,%acc1				/*乘加虚部低16位*/
	mac.w	%d0u,%d2u,%acc1				/*乘加虚部高16位*/

	/*取得结果,并四舍五入*/
	movel 	#2,%d1
	movel 	%acc0,%d0		/*结果->D0*/
	mulsl	%d1,%d0			/*有符号乘以2*/
	addl	#0x8000,%d0		/*大于0.5就加一，已考虑正负数问题。*/
	swap	%d0				/*交换高低16位，就是将结果值除以65536*/
	move.w 	%d0,(%a3)+		/*保存结果*/
	
	movel 	%acc1,%d0		/*结果->D0*/
	mulsl	%d1,%d0			/*有符号乘以2*/
	addl	#0x8000,%d0		/*大于0.5就加一，已考虑正负数问题。*/
	swap	%d0				/*交换高低16位，就是将结果值除以65536*/
	move.w 	%d0,(%a3)		/*保存结果*/

	/*函数退出*/
	moveml 	%sp@,%d2/%a2-%a3
	addal	#(3*4), %sp
	
	rts                                                                                                                             
 
.globl bkpt_disable;
  
ALIGN;
bkpt_disable:
	lea	wdbg_bkpt,%a0
	wdebug	(%a0)
	clrl  %d0
	rts

 	.data
	.align	4

wdbg_bkpt:
	.word	0x2c80	/* DR0 */
	.word	0x0006	/* 31:16 */
	.word	0x0000	/* 15:0 -- enable UHE */
	.word	0x0000	/* unused */


