; EECS 452 recursive sine generator ; ; 6 October 2003 .. initial version .. KM .sect ".text" ;place into the code section .align 4 ;force 32-bit boundary .global _asinegen ;make entry visible to linker alpha .set 32488 ;alpha stands for the a variable r .set (-0x7FFF) ;define start w_1 value s .set 0x4000 ;define start w_2 value .asg t0, w_1 ;renaming t0 at w_1 .asg t1, w_2 ;renaming t1 as w_2 _asinegen: bset sxmd ;enable sign extend bset frct ;shift left 1 on multiply bset m40 ;use 40 bit accumulator bset rdm ;round bclr c54cm ;not C54x compatible mov #r,w_1 ;initialize w_1 mov #s,w_2 ;initialize w_2 L1: mov #alpha<<#16,ac0 ;ac0h = a mpy w_1,ac0 ;a*w_1 sftsc ac0,#1 ;2*a*w_1 sub mmap(w_2)<<#16, ac0 ;2*a*w_1-w_2 mov w_1,w_2 ;w_2 = w_1 mov rnd(hi(saturate(ac0))),mmap(t0) ;w_1 = y; mov w_1,port(#0x3002) ;McBSP_reg(2, McBSP_DXR2) = y; mov w_1,port(#0x3003) ;McBSP_reg(2, McBSP_DXR1) = y; L2: btst #1,port(#0x3004),tc1 bcc L2,!tc1 ;while((McBSP_reg(2, McBSP_SPCR2)&0x0002) == 0); b L1 ;generate next sinewave value .end