📄 cbrev.asm
字号:
;***********************************************************
; Version 2.20.01
;***********************************************************
;*****************************************************************************
; Function: cbrev
; Description: complex bit-reverse routine (C54x)
;
; Copyright Texas instruments Inc, 1998
;-----------------------------------------------------------------------------
; Revision History:
; 1.00 R. Piedra, 8/31/98. Original release.
; 1.10 A. Aboagye, 10/7/99 - Removed setting of sign extension mode bit
;*****************************************************************************
.mmregs
.if __far_mode
offset .set 1
.else
offset .set 0
.endif
; stack description
.asg (0), ret_addr
; x in A
.asg (3+ offset), arg_y
.asg (4+ offset), arg_n
; register usage
; ar0 : bit reversing idx
.asg ar2,ar_dst
.asg ar3,ar_src
.global _cbrev
.text
_cbrev
PSHM ST0 ; 1 cycle
PSHM ST1 ; 1 cycle
RSBX OVA ; 1 cycle
RSBX OVB ; 1 cycle
rsbx sxm ; (1)
; Get arguments
; -------------
stlm a, ar_src ; pointer to src (1)
mvdk *sp(arg_y), *(ar_dst) ; pointer to dst (temporary) (2)
ld *sp(arg_n), a ; a = n (1)
stlm a, AR0 ; AR0 = n = 1/2 size of circ buffer (1)
sub #3,a ; a = n-3(by pass 1st and last elem)(2)
; Select in-place or off-place bit-reversing
; ------------------------------------------
ldm ar_src,b ; b = src_addr (1)
sub *sp(arg_y),b ; b = src_addr - dst_addr (1)
bcd in_place, beq ; if (ar_src==ar_dst)then in_place (2)
stlm a, brc ; brc = n-3 (1)
nop ; (1)
; Off-place bit-reversing
; -----------------------
off_place:
_start1:
; unroll to fill delayed slots
rptbd off_place_end-1 ; (2)
mvdd *ar_src+,*ar_dst+ ; move real component (1)
mvdd *ar_src-,*ar_dst+ ; move Im component (1)
mar *ar_src+0B ; (1)
mvdd *ar_src+,*ar_dst+ ; move real component (1)
mvdd *ar_src-,*ar_dst+ ; move Im component (1)
off_place_end:
mar *ar_src+0B ; (1)
bd end ; (2)
mvdd *ar_src+,*ar_dst+ ; move real component (1)
mvdd *ar_src-,*ar_dst+ ; move Im component (1)
; In-place bit-reversing
; ----------------------
in_place:
mar *ar_src+0B ; bypass first and last element (1)
mar *+ar_dst(2) ; (1)
_start2:
rptbd in_place_end-1 ; (2)
ldm ar_src,a ; b = src_addr (1)
ldm ar_dst, b ; a = dst_addr (1)
sub b,a ; a = src_addr - dst_addr (1)
; if >=0 bypass move just increment
bcd bypass, ageq ; if (src_addr>=dst_addr) then skip(2)
ld *ar_dst+, a ; a = Re dst element (preserve) (1)
ld *ar_dst-, b ; b = Im dst element (preserve) (1)
mvdd *ar_src+, *ar_dst+ ; Re dst = Re src (1)
mvdd *ar_src , *ar_dst- ; Im dst = Im src;point to Re (1)
stl b, *ar_src- ; Im src = b = Im dst;point to Re (1)
stl a, *ar_src ; Re src = a = Re dst (1)
bypass
mar *ar_src+0B ; (1)
mar *+ar_dst(2) ; (1)
ldm ar_src,a ; b = src_addr (1)
ldm ar_dst, b ; a = dst_addr (1)
in_place_end
; Return
; ------
_end:
end
POPM ST1 ; 1 cycle
POPM ST0 ; 1 cycle
.if __far_mode
fretd
.else
retd
.endif
nop
nop
;end of file. please do not remove. it is left here to ensure that no lines of code are removed by any editor
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -