⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cfft128c.asm

📁 2407TI库函数
💻 ASM
📖 第 1 页 / 共 3 页
字号:
; ARP=2
; AR6->(PR+1,PI+1,....) 
; AR2->(QR+1,QI+1,....)
;------------------------------------------------------         
;                                                           (Content of REG after exec.)
P3BY4I  .macro  p,m                 ;                       AR5     PREG    AR6  AR2 ARP
                        
            MPY     *+,AR5          ;PREG:=W*QR/2           -       W*QR/2  PR   QI   5   
            SPH     *,AR6           ;TMP:=W*QR/2            W*QR/2  W*QR/2  PR   QI   6
            
            LACC    *,15,AR2        ;ACC:=PR/2              W*QR/2  W*QR/2  PR   QI   2
            MPYA    *-              ;ACC:=(PR+W*QR)/2       W*QR/2  W*QI/2  PR   QR   2
            SPAC                    ;ACC:=(PR-W*QI+W*QR)/2  W*QR/2  W*QI/2  PR   QR   2
            SACH    *+,0,AR6        ;QR':=(PR-W*QI+W*QR)/2  W*QR/2  W*QI/2  PR   QI   6
            SUB     *,16            ;ACC:=(-PR-W*QI+W*QR)/2 W*QR/2  W*QI/2  PR   QI   6
            NEG                     ;ACC:=(PR+W*QI-W*QR)/2  W*QR/2  W*QI/2  PR   QI   6
            SACH    *+              ;PR'=(PR+W*QI-W*QR)/2   W*QR/2  W*QI/2  PI   QI   6                                                            
                                                                               
            LACC    *,15,AR5        ;ACC:=PI/2              W*QR/2  W*QI/2  PI   QI   5
            APAC                    ;ACC:=(PI+W*QI)/2       W*QR/2  W*QI/2  PI   QI   5
            ADD     *,16,AR2        ;ACC:=(PI+W*QI+W*QR)/2  W*QR/2  W*QI/2  PI   QI   2 
            SACH    *:m:+,0,AR6     ;QI':=(PI+W*QI+W*QR)/2  W*QR/2  W*QI/2  PI   QR+1 2
            SUB     *,16            ;ACC:=(-PI+W*QI+W*QR)/2 W*QR/2  W*QI/2  PI   QR+1 2
            NEG                     ;ACC:=(PI-W*QI-W*QR)/2  W*QR/2  W*QI/2  PI   QR+1 2
            SACH    *:m:+,0,AR:p:   ;PI':=(PI-W*QI-W*QR)/2  W*QR/2  W*QI/2  PR+1 QR+1 :P: 
            
        .endm  


;----------------------------------------------------
; MACRO 'BFLY'      
; Number of WORDS/Number of Cycles 18
; USAGE: General Butterfly RADIX 2 -> TWIDDLE FACTOR W=WR-jWI 
; 
; P=PR+jPI, Q=QR+jQI, W=WR-jWI
; P'=P+W*Q and Q'=P-W*Q
;
; POINTERS AT ENTRY
; ARP=2
; AR6->(PR,PI,PR+1,PI+1,PR+2,PI+2,....)
; AR2->(QR,QI,QR+1,QI+1,QR+2,QR+2,....)
; AR3-> Real Part of Twiddle Factor: WR(COSx)
; AR4-> Imaginary Part of Twiddle Factor: WI(SINx)
; AR5-> Temporary Variable
; CALCULATION PERFORMED: INPLACE COMPUTATION 
; AR6   ->      PR'=(PR+QR*WR+QI*WI)/2  
; AR2   ->      QR'=(PR-QR*WR-QI*WI)/2
; AR6+1 ->      PI'=(PI+QI*WR-QR*WI)/2
; AR2+1 ->      QI'=(PI-QI*WR+QR*WI)/2
; PR and PR', PI and PI', QR and QR', QI and QI' are
; stored in the same locations
; POINTERS AT EXIT
; ARP=2
; AR6->(PR+1,PI+1,....) 
; AR2->(QR+1,QI+1,....)
; AR3-> Real Part of Next Twiddle Factor
; AR4-> Imaginary Part ofNext Twiddle Factor


;------------------------------------------------------         
;                                                           (Content of REG after exec.)
BFLY    .macro  p                   ;                         TREG  AR6     AR2     AR3     AR4     ARP
                                   
            LT      *+,AR3          ;TREG:=QR                 QR    PR      QI      WR      WI      3
            MPY     *,AR2           ;PREG:=(QR*WR)/2          QR    PR      QI      WR      WI      2
            LTP     *-,AR4          ;ACC:=(QR*WR)/2           QI    PR      QR      WR      WI      4 
            MPY     *,AR3           ;PREG:=(QI*WI)/2          QI    PR      QR      WR      WI      3
            MPYA    *0+,AR2         ;ACC:=(QR*WR+QI*WI)/2     QI    PR      QR      WR+n    WI      2
                                    ;PREG:=QI*WR
            LT      *,AR5           ;TREG:=QR                 QR    PR      QR      WR+n    WI      5
            SACH    *,1,AR6         ;TEMP:=QR*WR+QI*WI        QR    PR      QR      WR+n    WI      6
            
            ADD     *,15            ;ACC:=(PR+QR*WR+QI*WI)/2  QR    PI      QR      WR+n    WI      6
            SACH    *+,AR5          ;PR':=(PR+QR*WR+QI*WI)/2  QR    PI      QR      WR+n    WI      5
            SUB     *,16,AR2        ;ACC:=(PR-QR*WR-QI*WI)/2  QR    PI      QR      WR+n    WI      2 
            SACH    *+,0,AR6        ;QR':=(PR-QR*WR-QI*WI)/2  QR    PI      QI      WR+n    WI      6 
            
            LACC    *,15,AR4        ;ACC:=PI/2                QR    PI      QI      WR+n    WI      4
            MPYS    *0+,AR2         ;ACC:=(PI-QI*WR)/2        QR    PI      QI      WR+n    WI+n    2
                                    ;PREG:=QR*WI
            APAC                    ;ACC:=(PI-QI*WR+QR*WI)/2  QR    PI      QR+1    WR+n    WI+n    2
            SACH    *+,0,AR6        ;QI':=(PI-QI*WR+QR*WI)/2  QR    PI      QR+1    WR+n    WI+n    6
            NEG                     ;ACC:=(-PI+QI*WR-QR*WI)/2 QR    PI      QR+1    WR+n    WI+n    6
            ADD     *,16            ;ACC:=(PI+QI*WR-QR*WI)/2  QR    PI      QR+1    WR+n    WI+n    6
            SACH    *+,0,AR:p:      ;PI':=(PI+QI*WR-QR*WI)/2  QR    PR+1    QR+1    WR+n    WI+n   :p:
        .endm
    
            
;----------------------------------------------------
; MACRO 'COMBO'     
; Number of WORDS/Number of Cycles 33
; USAGE: RADIX 4 USED AT THE FIRST STAGE
;
; POINTERS AT ENTRY 
; ARP=3
; AR6->(R1,I1)
; AR2->(R2,I2)
; AR3->(R3,I3)
; AR4->(R4,I4)
; AR5-> Temporary Variable
; CALCULATION PERFORMED: INPLACE COMPUTATION 
; AR6   ->      R1'=(R1+R2+R3+R4)/4
; AR2   ->      R2'=(R1-R2+I3-I4)/4
; AR3   ->      R3'=(R1+R2-R3-R4)/4
; AR4   ->      R4'=(R1-R2-I3+I4)/4
; AR6+1 ->      I1'=(I1+I2+I3+I4)/4
; AR2+1 ->      I2'=(I1-I2-R3+R4)/4
; AR3+1 ->      I3'=(I1+I2-I3-I4)/4
; AR4+1 ->      I4'=(I1-I2+R3-R4)/4
; POINTERS AT EXIT
; ARP=7
; AR6->(R5,I5) 
; AR2->(R6,I6)
; AR3->(R7,I7) 
; AR4->(R8,I8)
;------------------------------------------------------         
;                                                           (Content of REG after exec.)            
            
COMBO   .macro                  ;                           AR6 AR2 AR3 AR4 AR5 ARP 
            LACC    *,14,AR4    ;ACC:=R3/4                  R1  R2  R3  R4  T1  4
            SUB     *,14,AR5    ;ACC:=(R3-R4)/4             R1  R2  R3  R4  T1  5
            SACH    *+,1,AR4    ;T1:=(R3-R4)/2              R1  R2  R3  R4  T2  4  
            
            ADD     *+,15,AR5   ;ACC:=(R3+R4)/4             R1  R2  R3  I4  T2  5
            SACH    *,1,AR2     ;T2:=(R3+R4)/2              R1  R2  R3  I4  T2  2
            
            ADD     *,14,AR6    ;ACC:=(R2+R3+R4)/4          R1  R2  R3  I4  T2  6
            ADD     *,14        ;ACC:=(R1+R2+R3+R4)/4       R1  R2  R3  I4  T2  6
            SACH    *+,0,AR5    ;R1':=(R1+R2+R3+R4)/4       I1  R2  R3  I4  T2  5
            SUB     *,16,AR3    ;ACC:=(R1+R2-R3-R4)/4       I1  R2  R3  I4  T2  3
            SACH    *+,0,AR5    ;R3':=(R1+R2-R3-R4)/4       I1  R2  I3  I4  T2  5
            
            ADD     *,15,AR2    ;ACC:=(R1+R2)/4             I1  R2  I3  I4  T2  2
            SUB     *,15,AR3    ;ACC:=(R1-R2)/4             I1  R2  I3  I4  T2  3
            ADD     *,14,AR4    ;ACC:=(R1-R2+I3)/4          I1  R2  I3  I4  T2  4
            SUB     *,14,AR2    ;ACC:=(R1-R2+I3-I4)/4       I1  R2  I3  I4  T2  2
            SACH    *+,0,AR4    ;R2':=(R1-R2+I3-I4)/4       I1  I2  I3  I4  T2  2
            ADD     *-,15,AR3   ;ACC:=(R1-R2+I3+I4)/4       I1  I2  I3  R4  T2  2
            SUB     *,15,AR4    ;ACC:=(R1-R2-I3+I4)/4       I1  I2  I3  R4  T2  4
            SACH    *+,0,AR6    ;R4':=(R1-R2-I3+I4)/4       I1  I2  I3  I4  T2  6
            
            LACC    *,14,AR2    ;ACC:=I1/4                  I1  I2  I3  I4  T2  2
            SUB     *,14,AR5    ;ACC:=(I1-I2)/4             I1  I2  I3  I4  T2  5
            SACH    *,1,AR2     ;T2:=(I1-I2)/2              I1  I2  I3  I4  T2  2
            ADD     *,15,AR3    ;ACC:=(I1+I2)/4             I1  I2  I3  I4  T2  3
            ADD     *,14,AR4    ;ACC:=(I1+I2+I3)/4          I1  I2  I3  I4  T2  3
            ADD     *,14,AR6    ;ACC:=(I1+I2+I3+I4)/4       I1  I2  I3  I4  T2  6
            SACH    *0+,0,AR3   ;I1':=(I1+I2+I3+I4)/4       R5  I2  I3  I4  T2  3
            SUB     *,15,AR4    ;ACC:=(I1+I2-I3+I4)/4       R5  I2  I3  I4  T2  4
            SUB     *,15,AR3    ;ACC:=(I1+I2-I3-I4)/4       R5  I2  I3  I4  T2  3
            SACH    *0+,0,AR5   ;I3':=(I1+I2-I3-I4)/4       R5  I2  R7  I4  T2  5
            
            LACC    *-,15       ;ACC:=(I1-I2)4              R5  I2  R7  I4  T1  5
            SUB     *,15,AR2    ;ACC:=(I1-I2-R3+R4)/4       R5  I2  R7  I4  T1  2
            SACH    *0+,0,AR5   ;I2':=(I1-I2-R3+R4)/4       R5  R6  R7  I4  T1  5
            ADD     *,16,AR4    ;ACC:=(I1-I2+R3-R4)/4       R5  R6  R7  I4  T1  4 
            SACH    *0+,0,AR7   ;I4':=(I1-I2+R3-R4)/4       R5  R6  R7  R8  T1  7 
        .endm
                                


;----------------------------------------------------------------------
; FFT Computation Routine
;----------------------------------------------------------------------
;====================================================================
; Function Local Frame
;====================================================================
;   |_______|
;   |_______|<- Stack Pointer                           (FP+9) <---AR1 
;   |_______|<- GLCB                                    (FP+8)
;   |_______|<- (T2)                                    (FP+7)
;   |_______|<- (T1)                                    (FP+6) <---AR5
;   |_______|<- BLC  (Butterfly loop counter)           (FP+5)
;   |_______|<- GLC  (Group loop counter)               (FP+4)
;   |_______|<- SLC  (Stage loop counter)               (FP+3)
;   |_______|<- TOST (Twiddle offset, for decimation)   (FP+2)
;   |_______|<- DOST (Data offset)                      (FP+1)
;   |_______|<- ipcbptr                                 (FP)    
;   |_______|<- Old FP (AR0)                            (FP-1)
;   |_______|<- Context Save of AR7                     (FP-2)
;   |_______|<- Context Save of AR6                     (FP-3)
;   |_______|<- Return Address of the Caller            (FP-4)
;   |_______|<- FFTxxxx_handle                          (FP-5) 
;                                                
;===================================================================

__FFT128C_calc_frs  .set    00009h  ; Local frame size for this routine 

_FFT128C_calc:
            POPD    *+              ; Store the Return Address in stack
            SAR     AR6,*+          ; Entry On Save Register AR6
            SAR     AR7,*+          ; Entry On Save Registe AR7
            SAR     AR0,*+          ; Store the Caller's Frame Pointer
            SAR     AR1,*                 
            LAR     AR5,*           ; AR5=FP    
            LAR     AR0,#__FFT128C_calc_frs     
            LAR     AR0,*0+,AR7     ; Create Local frame 
            
                    
            SETC    SXM
            SPM     #0    
                      
            LAR     AR7,#0FFFBh     ; ARP=AR7, AR7=-5    
            MAR     *0+             ; ARP=AR7, AR7->FFT128C_handle->ipcbptr
            LAR     AR7,*           ; ARP=AR7, AR7->&ipcb[0]  
                                                          
            LAR     AR6,*,AR5       ; ARP=AR5, AR5->ipcbptr(Stack), AR6=ipcbptr
            SAR     AR6,*           ; ARP=AR5, AR5->ipcbptr(Stack), ipcbptr(Stack)=ipcbptr
            ADRK    #6              ; ARP=AR5, AR5->T1
            MAR     *,AR7
;-----------------------------------------------------------------
; Stage 1 & 2 - Using the RADIX 4 COMBO Macro
;-----------------------------------------------------------------
                   
            LAR     AR6,*           ; ARP=AR7, AR7->&ipcb[0], AR6=&ipcb[0]

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -