📄 txtpcm.asm
字号:
.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 + -