📄 bits.dsp
字号:
#define stream_port 0x201
#define speech_port 0x200
/****************************************************************************
* bit stream manipulation routines *
* The transmitted parameters are: *
* LPC: 1st codebook 7+1 bit *
* 2nd codebook 5+5 bit *
* 1st subframe: *
* pitch period 8 bit *
* parity check on 1st period 1 bit *
* codebook index1 (positions) 13 bit *
* codebook index2 (signs) 4 bit *
* pitch and codebook gains 4+3 bit *
* 2nd subframe: *
* pitch period (relative) 5 bit *
* codebook index1 (positions) 13 bit *
* codebook index2 (signs) 4 bit *
* pitch and codebook gains 4+3 bit *
* $$01/10/2000 checked stream module data variables and function *
* $$01/11/2000 modify pointer and varaibles to adapt table change *
* $$01/16/2001 modified and printed,Author: Jason.wang (zhigang wang) *
* $$01/16/2001 Email: wzg119@yeah.net, BP: 86+02195950-161452 *
* $$01/16/2001 This modlue is not optimized! should be test on Emulator *
*****************************************************************************/
.MODULE/SEG=App_PM FrameBits;
/****************************************************************************/
#include "ld8a.inc"
#include "vad.inc"
#include "dtx.inc"
#include "octet.inc"
#include "tab_dtx.inc"
#include "tab_ld8a.inc"
/****************************************************************************/
.EXTERNAL Encode_FrameID,Encode_nbwords;
.EXTERNAL Decode_FrameID,put_position;
.EXTERNAL DecodeParm,InputSerial,OutSerial;
.EXTERNAL Check_Parity_Pitch;
/*****************************************************************************
* prm2bits_ld8a -converts encoder parameter vector into vector of serial bits*
* $$01/10/2000 only used in encoder *
* $$01/11/2000 modify pointer and varaibles to adapt table change *
* Calling Parameters *
* I1 : encoded parameters (PRM_SIZE parameters) *
* Return Values *
* I0 : serial bits (SERIAL_SIZE ) bits[0] = bfi bits[1] = 80 *
* Altered Registers: SR,AR,AF,AX0,I0,I1,I3,I4 *
* Computation Time : 18 cycles *
******************************************************************************/
.ENTRY prm2bits_ld8a;
prm2bits_ld8a: AR=DM(Encode_FrameID);
SR=LSHIFT AR BY 2(LO);
AR=DM(I1,M1);
AR=PASS AR;
IF NE JUMP case_1;
AR=SR0 OR RATE_0;
DM(Encode_FrameID)=AR;
RTS;
case_1: AR=AR-1;
IF NE JUMP case_2;
AR=SR0 OR RATE_8000;
DM(Encode_FrameID)=AR;
AX0=DM(Encode_nbwords);
AR=AX0+5;
DM(Encode_nbwords)=AR;
AR=DM(I1,M1);
SR=LSHIFT AR BY 8(HI); {8 bits}
AR=DM(I1,M1);
SR=SR OR LSHIFT AR BY -2(HI); {8 bits}
DM(I0,M1)=SR1;
SR=LSHIFT AR BY 14(HI); {2 bits}
AR=DM(I1,M1);
SR=SR OR LSHIFT AR BY 6(HI); {8 bits}
AR=DM(I1,M1);
SR=SR OR LSHIFT AR BY 5(HI); {1 bits}
AR=DM(I1,M1);
SR=SR OR LSHIFT AR BY -8(HI); {5 bits}
DM(I0,M1)=SR1;
SR=LSHIFT AR BY 8(HI); {8 bits}
AR=DM(I1,M1);
SR=SR OR LSHIFT AR BY 4(HI); {4 bits}
AR=DM(I1,M1);
SR=SR OR LSHIFT AR BY -3(HI); {4 bits}
DM(I0,M1)=SR1;
SR=LSHIFT AR BY 13(HI); {3 bits}
AR=DM(I1,M1);
SR=SR OR LSHIFT AR BY 8(HI); {5 bits}
AR=DM(I1,M1);
SR=SR OR LSHIFT AR BY -5(HI); {8 bits}
DM(I0,M1)=SR1;
SR=LSHIFT AR BY 11(HI); {5 bits}
AR=DM(I1,M1);
SR=SR OR LSHIFT AR BY 7(HI); {4 bits}
AX0=DM(I1,M1);
AY0=H#007F;
AF=AX0 AND AY0; {7 bits}
AR=SR1 OR AF;
DM(I0,M1)=AR;
RTS;
case_2: AR=AR-1;
IF NE RTS;
AR=SR0 OR RATE_SID;
DM(Encode_FrameID)=AR;
AX0=DM(Encode_nbwords);
AR=AX0+1;
DM(Encode_nbwords)=AR;
AR=DM(I1,M1);
SR=LSHIFT AR BY 15(HI); {1 bits}
AR=DM(I1,M1);
SR=SR OR LSHIFT AR BY 10(HI); {5 bits}
AR=DM(I1,M1);
SR=SR OR LSHIFT AR BY 6(HI); {4 bits}
AR=DM(I1,M1);
SR=SR OR LSHIFT AR By 1(HI); {5 bits}
DM(I0,M1)=SR1;
RTS;
/*****************************************************************************
* bits2prm_ld8a - converts serial received bits to encoder parameter vector *
* Calling Parameters *
* $$01/10/2000 only used in decoder *
* $$01/11/2000 modify pointer and varaibles to adapt table change *
* I1 : serial bits (80) *
* Return Values *
* I0 : decoded parameters (11 parameters) *
* Altered Registers: SR,SE,AR,AF,AX0,AY0,I0,I1,I4 *
* Computation Time : 18 cycles *
******************************************************************************/
.ENTRY bits2prm_ld8a;
bits2prm_ld8a: AR=DM(Decode_FrameID);
SR=LSHIFT AR BY 2(LO);
DM(Decode_FrameID)=SR0;
SR=LSHIFT AR BY -14(LO);
DM(I0,M1)=0;
AF=SR0-RATE_8000;
IF NE JUMP case_01;
DM(I0,M1)=1;
AR=DM(I1,M1);
SR=LSHIFT AR BY -8(HI); { 8 bits}
DM(I0,M1)=SR1;
SR=LSHIFT SR0 BY -6(HI); { 8 bits}
AR=DM(I1,M1);
SR=SR OR LSHIFT AR BY -14(HI); { 2 bits}
DM(I0,M1)=SR1;
SR=LSHIFT SR0 BY -8(HI); { 8 bits}
DM(I0,M1)=SR1;
SR=LSHIFT SR0 BY -15(HI); { 1 bits}
DM(I0,M1)=SR1;
SR=LSHIFT SR0 BY -3(HI); { 5 bits}
AR=DM(I1,M1);
SR=SR OR LSHIFT AR BY -8(HI); { 8 bits}
DM(I0,M1)=SR1;
SR=LSHIFT SR0 BY -12(HI); { 4 bits}
DM(I0,M1)=SR1;
SR=LSHIFT SR0 BY -9(HI); { 4 bits}
AR=DM(I1,M1);
SR=SR OR LSHIFT AR BY -13(HI); { 3 bits}
DM(I0,M1)=SR1;
SR=LSHIFT SR0 BY -11(HI); { 5 bits}
DM(I0,M1)=SR1;
SR=LSHIFT SR0 BY -3(HI); { 8 bits}
AR=DM(I1,M1);
SR=SR OR LSHIFT AR BY -11(HI); { 5 bits}
DM(I0,M1)=SR1;
SR=LSHIFT SR0 BY -12(HI); { 4 bits}
DM(I0,M1)=SR1;
SR=LSHIFT SR0 BY -9(HI); { 7 bits}
DM(I0,M1)=SR1;
JUMP case_comm;
case_01: AF=SR0-RATE_SID;
IF NE JUMP case_02;
DM(I0,M1)=2;
AR=DM(I1,M1);
SR=LSHIFT AR BY -15(HI); { 1 bits}
DM(I0,M1)=SR1;
SR=LSHIFT SR0 BY -11(HI); { 5 bits}
DM(I0,M1)=SR1;
SR=LSHIFT SR0 BY -12(HI); { 4 bits}
DM(I0,M1)=SR1;
SR=LSHIFT SR0 BY -11(HI); { 5 bits}
DM(I0,M1)=SR1;
JUMP case_comm;
case_02: DM(I0,M1)=0;
case_comm: AR=DM(DecodeParm+1);
AR=AR-1;
IF NE RTS;
SI=DM(DecodeParm+4);
AY0=DM(DecodeParm+5);
CALL Check_Parity_Pitch;
DM(DecodeParm+5)=AR;
RTS;
/*****************************************************************************
* read one frame (10ms) data from speech channel *
* $$01/10/2000 only used in decoder *
* Calling Parameters *
* Return Values *
* Altered Registers: SR,SE,SI,AR,AF,AX0,AX1,AY0,AY1,I0,I1,I2,I3 *
* Computation Time : 18 cycles *
******************************************************************************/
.ENTRY read_seag;
read_seag: CNTR=8;
AR=PASS 0;
AY0=H#0003;
SR0=IO(stream_port);
DM(Decode_FrameID)=SR0;
DO sum_nbwords UNTIL CE;
AF=SR0 AND AY0;
IF EQ JUMP sum_nbwords;
AR=AR+1;
AF=AF-1;
IF EQ JUMP sum_nbwords;
AR=AR+4;
AF=AF-1;
IF NE AR=AR-5;
sum_nbwords: SR=LSHIFT SR0 BY -2(LO);
AR=PASS AR;
IF LE RTS;
CNTR=AR;
I1=^InputSerial;
DO read_sample UNTIL CE;
AR=IO(stream_port);
read_sample: DM(I1,M1)=AR;
RTS;
/*****************************************************************************
* read one frame (10ms) data from speech channel *
* $$01/10/2000 only used in encoder *
* Calling Parameters *
* I1: New Speech samples read *
* Return Values *
* Altered Registers: AR,I1,M1 *
* Computation Time : 18 cycles *
******************************************************************************/
.ENTRY read_speech;
read_speech: CNTR=L_FRAME;
DO read_loop UNTIL CE;
AR=IO(speech_port);
read_loop: DM(I1,M1)=AR;
RTS;
/*****************************************************************************
* read one frame (10ms) data from speech channel *
* $$01/10/2000 only used in encoder *
* Calling Parameters *
* I1: New Speech samples read *
* Return Values *
* Altered Registers: AR,I1,M1 *
* Computation Time : 18 cycles *
******************************************************************************/
.ENTRY out_speech;
out_speech: AY0=H#0007;
AR=AR AND AY0;
IF NE RTS;
SI=DM(Encode_FrameID);
IO(stream_port)=SI;
AR=DM(Encode_nbwords);
AR=PASS AR;
IF LE JUMP skip_out;
CNTR=AR;
I1=^OutSerial;
DO output_sample UNTIL CE;
SI=DM(I1,M1);
output_sample: IO(stream_port)=SI;
skip_out: AR=PASS 0;
I1=^OutSerial;
DM(put_position)=I1;
DM(Encode_nbwords)=AR;
DM(Encode_FrameID)=AR;
CNTR=SERIAL_SIZE;
Do reset_serial UNTIL CE;
reset_serial: DM(I1,M1)=0;
RTS;
/*********************************************************************
* Last processing of encoder *
* $$01/10/2000 last encoder frame function *
**********************************************************************/
.ENTRY flush_speech;
flush_speech: AY0=H#000F;
SR=LSHIFT AR By 1(LO);
AF=SR0 AND AY0;
IF EQ RTS;
AX0=16;
AR=AX0-AF;
SE=AR;
SI=DM(Encode_FrameID);
IO(stream_port)=SI;
SR=LSHIFT SI (LO);
AR=DM(Encode_nbwords);
AR=PASS AR;
IF LE RTS;
CNTR=AR;
DO flush_sample UNTIL CE;
SI=DM(I1,M1);
flush_sample: IO(stream_port)=SI;
RTS;
/*****************************************************************************/
.ENDMOD;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -