.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 */