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

📄 txtpcm.asm

📁 文件为美军4800bps语音压缩编码标准在TI的DSP芯片TMS320C5X上的实时实现源代码。
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	.version        50
	.mmregs

	 ;********************************************************************
	 ;following varibles must be placed in the same DP sect by the linker*
	 ;********************************************************************
	.bss    ENCODE,1
	.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

;;;;;used for A law pcm convert
	.bss    PCM,1
	.bss    SEGNUM,1
	.bss    QVALUE,1

;not used for ADPCM coding(originally used in sj4.asm)
	.bss    IN_BITS,1         ;.set    60h             ;input bits C1C0
	.bss    NODE,1            ;.set    61h             ;current node NO.
	.bss    C0,1              ;.set    62h
	.bss    C1,1              ;.set    63h
	.bss    IN_C0,1           ;.set    64h
	.bss    IN_C1,1           ;.set    65h
	.bss    Q,7               ;.set    66h             ;(66h-6ch) Q0-Q6
	.bss    TEM,1             ;.set    6dh
	.bss    PRE_POINTER,1     ;.set    6eh             ;temporary store previous stage error pointer
	.bss    CUR_POINTER,1     ;.set    6fh             ;temporary store current stage error pointer
	.bss    CRC_RESULT,1      ;.set    70h             ;store the crc result value

	.bss    CRCOK,1           ; CRCOK=0xff,CRC check fail; CRCOK=0X00,CRC check is successful
	.bss    SWITCH,1          ; select BWD_SERIAL1 or BWD_SERIAL2
				  ; SWITCH=0; RINT uses BWD_SERIAL1, ISR4 uses BWD_SERIAL2; and vice versa
	.bss    TIMES,1           ; counter for RINT subroutine
	.bss    VSWITCH,1         ; VSWITCH=0; XINT uses FWD_SERIAL1, ISR4 uses FWD_SERIAL2; and vice versa
	.bss    VTIMES,1          ; counter for XINT subroutine

	.bss    SPACE,24h

	; This buffer is used for ADPCM decoding
DECODE          .usect  "daramb1",128

	; These four buffers are used in viterbi decoding(the last one may need changing)
ODD_ERROR       .usect  "block3",64         ;odd stages error
EVEN_ERROR      .usect  "block3",64         ;even stages error
DELTA_ERROR     .usect  "block3",512        ;512 words store delta_error value when input=00,01,10,11
FATHER_INDX     .usect  "block3",752        ;752 words (188*4) store father indx bits: 0(father1) and 1(father2)

	; These two buffers are used as forward data buffer(including VOICE signal and ORDER signal)
FWD_RSV_BUF     .usect  "block3",384        ;384 words store received bits streams after block_de_interleave
FWD_SERIAL1     .usect  "block4",320        ;320 words(bits) buffer 1 used to send VOICE signal to serial port
FWD_SERIAL2     .usect  "block4",320        ;320 words(bits) buffer 2 used to send VOICE signal to serial port

	; These three buffers are used as backword data buffer(including VOICE signal and ORDER signal)
BWD_230_BUF     .usect  "block4",230        ;230 words store backword source data
BWD_576_BUF     .usect  "block4",576        ;576 words store data after backward convolution encode
BWD_SERIAL1     .usect  "block4",340        ;320 words(bits) buffer 1 used to receive VOICE signal from serial port(12 CRC+8)
BWD_SERIAL2     .usect  "block5",340        ;320 words(bits) buffer 2 used to receive VOICE signal from serial port(12 CRC+8)

TEMP_BUF        .usect  "block5",576        ;576 words buffer used to store any temporary data

	; DSP320C50 I/O ports start address definition
FPGA_BUF        .set    0fc00h          ;FPGA DATA(including VOICE and ORDER signal)start address
FPGA_ORDER_BUF  .set    0f100h          ;FPGA ORDER data start address

	.sect "vectors"
RESET   B       MAIN
	.space  16*8
SPRINT  B       RINT
SPXINT  B       XINT
	.space 16*4
INT4    B       ISR4
	.space  16*44

	.text
MAIN    CALL    C50_INIT

	LDP     #IN_BITS
	LACC    #0
	SACL    TIMES
	SACL    VTIMES
	SACL    SWITCH
	SACL    VSWITCH

	LDP     #ENCODE
	CALL    ADPCM_INIT
	LDP     #DECODE
	CALL    ADPCM_INIT

	LACC    #0030h
	SAMM    IMR             ;ENABLE INT4.RINT.TINT
	LAMM    IFR
	SAMM    IFR             ;CLEAR ALL INTERRUPTS
	CLRC    INTM            ;ENABEL INTERRUPT

	LDP     #PCM
	LACC    PCM
	SAMM    DXR             ;INI SPORT TRANSMIT


LOP100  LAMM    IFR
	AND     #0100h
	BCND    LOP100,EQ
	LACC    #0100h
	SAMM    IFR             ;CLEAR INTERRUPT 4

	CALL    ISR4
	LDP     #LOOPNUM
	LACC    LOOPNUM
	ADD     #1
	SACL    LOOPNUM

	NOP
	NOP
	B       LOP100
	RET


	;********************************************************
	;*THIS SUBROUTINE INITIALIZE C50'S RESGISTERS AND MEMORY*
	;********************************************************
C50_INIT
	SETC    OVM
	SETC    SXM
	CLRC    HM
	CLRC    CNF             ;map DARAM B0 into data memory
	LDP     #0
	SPLK    #0834h,PMST     ;map 9K SARAM into both program and data memory
				;relocate interrupt vector at 0x8000h
	SPLK    #0010h,CWSR     ;SET BIG MODE BIT
	SPLK    #0FFFFh,IOWSR   ;SET I/O WAIT STATUS TO 3

	SPLK    #00001100b,SPC  ;setup serial port
	SPLK    #11001100b,SPC
	SPLK    #003eh,TSPC

	RET


	;*************************************************
	; NOTE: Here begins the ADPCM subroutuines.      *
	;*************************************************

ADPCM_INIT
	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
	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
	SACL    APKF
	B       U18
U16     LT      APK1F
	MPY     #15
	LACC    #512
	APAC
	BSAR    4
	SACL    APKF
U18

;        if( (abs(dmskf-(dmlkf>>2))>=(dmlkf>>5)) || (ykf<0x600) || (tdk==1) )
;                {       acc=15*(long)apk1f+512;
;                        apkf=acc>>4;}
;                else { if(trk==1) apkf=0x100;
;                        else apkf=(15*(long)apk1f)>>4;}



;used for reconstruct
	LACC    DQK
	NOP
	XC      2,GT
	SPLK    #1,S0
	XC      2,EQ
	SPLK    #0,S0
	XC      2,LT
	SPLK    #-1,S0

	LACC    DQK1
	NOP
	XC      2,GEQ
	SPLK    #1,S1
	XC      2,LT
	SPLK    #-1,S1

	LACC    DQK2
	NOP
	XC      2,GEQ
	SPLK    #1,S2
	XC      2,LT
	SPLK    #-1,S2

	LACC    DQK3
	NOP
	XC      2,GEQ

⌨️ 快捷键说明

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