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

📄 fixed.asm

📁 文件为美军4800bps语音压缩编码标准在TI的DSP芯片TMS320C5X上的实时实现源代码。
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	.version        50
	.mmregs
;       following varibles must be placed in same block with same DP value
        .bss    LOOPNUM,1
        .bss    SLK,1
        .bss    SEK,1
        .bss    SRK,1
        .bss    SRK1,1
        .bss    SRK2,1
        .bss    SEZK,1
        .bss    DK,1
        .bss    DQK,1
        .bss    DQK1,1
        .bss    DQK2,1
        .bss    DQK3,1
        .bss    DQK4,1
        .bss    DQK5,1
        .bss    DQK6,1
        .bss    PK,1
        .bss    PK1,1
        .bss    PK2,1
        .bss    S0,1
        .bss    S1,1
        .bss    S2,1
        .bss    S3,1
        .bss    S4,1
        .bss    S5,1
        .bss    S6,1
        .bss    TRK,1
        .bss    TDK,1


        .bss    YLKFL,1
        .bss    YLKFH,1
        .bss    YLK1FL,1
        .bss    YLK1FH,1 
;long ylkf,ylk1f;//3,...,-15

        .bss    YKF,1 
        .bss    YUKF,1
        .bss    YUK1F,1 
        .bss    ALKF,1 
        .bss    APKF,1 
        .bss    APK1F,1
        .bss    FIKF,1 
        .bss    FA1K1F,1
;int ykf,yukf,yuk1f,alkf,apkf,apk1f,fikf,fa1k1f;

        .bss    DMSKF,1         
        .bss    DMLKF,1
        .bss    DMSK1F,1
        .bss    DMLK1F,1 
;int dmskf,dmlkf,dmsk1f,dmlk1f;

        .bss    A1KF,1
        .bss    A1K1F,1
        .bss    A2KF,1
        .bss    A2K1F,1 
        .bss    WIKF,1 
;int a1kf,a1k1f,a2kf,a2k1f,wikf;

        .bss    B1KF,1
        .bss    B2KF,1 
        .bss    B3KF,1 
        .bss    B4KF,1 
        .bss    B5KF,1 
        .bss    B6KF,1
        .bss    B1K1F,1 
        .bss    B2K1F,1 
        .bss    B3K1F,1 
        .bss    B4K1F,1 
        .bss    B5K1F,1
        .bss    B6K1F,1 
;int b1kf,b2kf,b3kf,b4kf,b5kf,b6kf,b1k1f,b2k1f,b3k1f,b4k1f,b5k1f,b6k1f;

        .bss    I0K,1         
        .bss    I1K,1 
;unsigned char i0k,i1k;
        .bss    TEMP1,1
        .bss    TEMP2,1
        .bss    TEMP3,1
        .bss    TEMP4,1

        .text
        CALL    C50_INIT
        CALL    ADPCM_INIT
        SPLK    #0,LOOPNUM

M1      CALL    RECONSTRUCT
        CALL    DELTASIGNAL
        CALL    SPEEDCTL
        CALL    QUANTIZERSCALE
        CALL    ADAPTIVEQUANTIZER
        CALL    INVERSEQUANTIZER
        CALL    UPDATE
        LACC    LOOPNUM
        ADD     #1
        SACL    LOOPNUM
        B       M1
        RET

ADPCM_INIT
        LDP     #YUK1F
        LACC    #544
        SACL    YUK1F
        LACC    #0
        SACL    YLK1FH
        LACC    #34816
        SACL    YLK1FL
        LACC    #0
        SACL    APK1F
        SACL    DMSK1F
        SACL    DMLK1F
        SACL    PK1
        SACL    PK2
        SACL    A1K1F
        SACL    A2K1F
        SACL    B1K1F
        SACL    B2K1F
        SACL    B3K1F
        SACL    B4K1F
        SACL    B5K1F
        SACL    B6K1F
        SACL    DQK1
        SACL    DQK2
        SACL    DQK3
        SACL    DQK4
        SACL    DQK5
        SACL    DQK6
        SACL    SRK1
        SACL    SRK2
        RET
                                                  
UPDATE
        LDP     #SRK             
        LACC    SEK
        ADD     DQK
        SACL    SRK     ;srk=sek+dqk

        LACC    DQK
        ADD     SEZK
        SACL    PK      ;pk=dqk+sezk

        XC      2,GT
        SPLK    #1,S0
        XC      2,EQ
        SPLK    #0,S0
        XC      2,LT
        SPLK    #-1,S0

        LACC    PK1
        NOP
        XC      2,GEQ
        SPLK    #1,S1
        XC      2,LT
        SPLK    #-1,S1
        
        LACC    PK2
        NOP
        XC      2,GEQ
        SPLK    #1,S2
        XC      2,LT
        SPLK    #-1,S2

U7      LACC    A1K1F
        ABS
        SUB     #2000h
        BCND    U8,GT
        LACC    A1K1F
        SFR
        SFL
        SFL
        SACL    FA1K1F
        B       U9
U8      LACC    A1K1F
        BCND    U10,LT
        SPLK    #4000h,FA1K1F
        B       U9
U10     SPLK    #-4000h,FA1K1F
U9      SPM     0
        LT      S0
        MPY     S1
        SPL     TEMP1
        LT      TEMP1
        MPY     FA1K1F
        SPL     TEMP2           ;TEMP2=FA1K1F*S0*S1

        LT      S0
        MPY     S2
        SPL     TEMP1
        LACC    TEMP1,13
        SUB     TEMP2
        SFL
        LT      A2K1F
        MPY     #127
        APAC
        BSAR    7
        SACL    A2KF

        LACC    A2KF
        SACB
        LACC    #3000h
        CRLT
        SACL    A2KF
        SACB                    ;ACC=ACCB=A2KF
        LACC    #-3000h
        CRGT
        SACL    A2KF

U13     SPM     0
        LT      S0
        MPY     S1
        SPL     TEMP1
        LT      TEMP1
        MPY     #3
        SPL     TEMP1
        LACC    TEMP1,14        ;ACC=(3*S0*S1)<<14
        LT      A1K1F
        MPY     #255
        APAC
        BSAR    8
        SACL    A1KF
        SACB                    ;ACCB=A1KF
        LACC    #3C00h
        SUB     A2KF
        SACL    TEMP1           ;TEMP1=ACC=0X3C00-A2KF
        CRLT
        SACL    A1KF
        SACB                    ;ACCB=A1KF
        LACC    TEMP1
        NEG                     ;ACC=-TEMP1
        CRGT
        SACL    A1KF

;        acc=3*s0*s1;
;        acc=acc<<14;
;        p=255*(long)a1k1f;
;        acc=acc+p;
;        a1kf=acc>>8;
;        temp1=0x3c00-(long)a2kf;//temp1:s,0,...,-14
;        if( (long)a1kf>temp1 ) a1kf=temp1; else if( (long)a1kf<-temp1 ) a1kf=-temp1;


;used for quantizerscale
        SPM     0
        LACC    I0K
        SUB     I1K
        NOP
        XC      2,EQ
        SPLK    #-22,WIKF
        XC      2,NEQ
        SPLK    #439,WIKF

        LACC    WIKF,5
        LT      YKF
        MPY     #31
        APAC
        BSAR    5
        SACL    YUKF

        SACB                    ;ACCB=YUKF
        LACC    #5120
        CRLT
        SACL    YUKF
        SACB
        LACC    #542
        CRGT
        SACL    YUKF

;        //wik s,6,...,-4  yk:3,...,-9 yuk:3,...,-9
;        if( i0k==i1k ) wikf=-22; else wikf=439;
;        acc=(long)wikf<<5;
;        p=31*(long)ykf;
;        acc=acc+p;
;        yukf=acc>>5;
;        if(yukf>5120) yukf=5120;
;                else if(yukf<542) yukf=542;

        SPM     0
        LT      YLK1FH
        MPY     #63
        SPL     TEMP1
        LACC    TEMP1,16
        LT      YLK1FL
        SPLK    #63,TEMP2
        MPYU    TEMP2
        APAC
        SACB
        LACC    YUKF,6
        ADDB
        BSAR    6
        SACH    YLKFH
        SACL    YLKFL
                    
;        //ylk1 3,...,-15   yuk  3,...,-9
;        acc=(long)yukf<<6;
;        p=63*(long)ylk1f;
;        acc=acc+p;
;        ylkf=acc>>6;

;tone and transition detector
        LACC    A2KF
        ADD     #11776
        NOP
        XC      2,LT
        SPLK    #1,TDK
        XC      2,GEQ
        SPLK    #0,TDK

        LACC    YLKFH,16
        OR      YLKFL           ;ACC=YLKF
        BSAR    8
        SACL    TEMP4           ;TEMP4=YLKF>>8

        BSAR    7               ;ACC=TEMP4=YLKF>>8
        AND     #0Fh
        SUB     #14
        NEG
        SAMM    TREG1           ;TREG1=14-(TEMP4>>7)&0X0F

        LACC    TEMP4
        AND     #7Fh 
        ADD     #80h
        SACL    TEMP3           ;TEMP3=0X80+TEMP4&0X7F
        LACC    TEMP3,7
        SATL
        SACL    TEMP2

        LACC    TEMP4
        NOP
        XC      2,LT     
        SPLK    #1,TEMP2        ;TEMP2=POW(2,TEMP4)

        SPM     0
        LT      TEMP2
        MPY     #24
        LACC    DQK
        ABS
        SPAC
        BCND    U14,LEQ
        LACC    TDK
        SACL    TRK
        B       U15
U14     SPLK    #0,TRK
U15


;        if(a2kf<-11776) tdk=1; else tdk=0;
;        if(ylkf<0) temp2=1;
;                else {
;                        temp4=ylkf>>8; //temp4:3,...,-7
;                        temp1=(temp4>>7) & 0x0f;//4bit exponent
;                        temp3=temp4 & 0x7f;//7bit mantissa
;                        temp2=((0x080+temp3)<<7) >> (14-temp1);
;                        }
;        p=24*(long)temp2;
;
;        if( (a2kf<-11776) && ((long)abs(dqk)>p) ) trk=1;
;                else trk=0;


;used for speedctl
        LACC    I0K
        SUB     I1K
        NOP
        XC      2,EQ
        SPLK    #0,FIKF
        XC      2,NEQ
        SPLK    #7,FIKF

        SPM     0
        LACC    FIKF,9
        LT      DMSK1F
        MPY     #31
        APAC
        BSAR    5
        SACL    DMSKF

;        if( i0k==i1k ) fikf=0; else fikf=7;
;        acc=fikf<<9;
;        p=31*(long)dmsk1f;
;        acc=acc+p;
;        dmskf=acc>>5;

        LACC    FIKF,11
        LT      DMLK1F          
        MPY     #127
        APAC
        BSAR    7
        SACL    DMLKF
        SACL    DMLK1F
        LACC    DMSKF
        SACL    DMSK1F

;        acc=fikf<<11;
;        acc=acc+127*(long)dmlk1f;
;        dmlkf=acc>>7;
;        dmsk1f=dmskf;
;        dmlk1f=dmlkf;

        LACC    DMLKF
        BSAR    2
        SUB     DMSKF
        ABS
        SACB
        LACC    DMLKF
        BSAR    5
        SBB
        BCND    U16,LEQ
        LACC    YKF
        SUB     #600h
        BCND    U16,LT
        LACC    TDK
        BCND    U16,NEQ
        LACC    TRK
        BCND    U17,EQ
        SPLK    #100h,APKF
        B       U18
U17     LT      APK1F
        MPY     #15
        PAC
        BSAR    4

⌨️ 快捷键说明

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