www.pudn.com > OS.rar > S320TTS_Data_Access.asm, change:2006-12-11,size:7997b
.include SACM_Constant.inc // for flag / buffer constants
.include Snd_ArithmConfig.inc // define compiler config const
.ifdef C_SND_S320TTS_SUPPORT
//----------------------------------------------------------
.PUBLIC F_TTS320_System_Get_SAC_Manual
.PUBLIC F_SACM_TTS320_Decode_Initial_BS
.PUBLIC F_TTS320_System_Get_BS_Manual
.EXTERNAL T_SACM_CS0S320TTS_Table
.external R_SACM_Resouce_BS, R_SACM_Resouce_DS
.external R_SACM_Decode_Length_L, R_SACM_Decode_Length_H //guili 2005.12.01 for S480 no Speed control
.external R_SACM_Decode_Count_L, R_SACM_Decode_Count_H //guili 2005.12.01 for S480 no Speed control
.external R_SACM_Decode_In_PTR, R_SACM_Decode_In_Buffer //guili 2005.12.01 for S480 no Speed control
.public _TTS_Syllable_Num
.public _TTS1BIN_Dest_Offset
.public _Frame_Length
.define MAX_SEG 20
OVERLAP_TTS_DM_BLOCK: .SECTION .ORAM
R_DIC_Buffer: .DW MAX_SEG DUP(?)
R_START_ADDR_BUFFER: .DW MAX_SEG * 2 DUP(?)
R_DIC_PTR: .DW ?
R_ADDR_PTR: .DW ?
R_Syllable_Num: .DW ?
_TTS_Syllable_Num: .DW 3
//not change this 4 var define order,because at another place,TTS1BIN_Dest_Addr is used as long
.var _TTS1BIN_Curr_Addr, _TTS1BIN_Curr_DS
.var _TTS1BIN_Dest_Addr, _TTS1BIN_Dest_DS
.var _TTS1BIN_Dest_Offset
.var _Frame_Length
.CODE
//-------------------------------------------------
//2005/03/29
F_TTS320_System_Get_SAC_Manual: .PROC
push BP to [SP]
// DS:R4 = DS:BS
SR &= ~0xfc00
SR |= [R_SACM_Resouce_DS] //2005/03/29
R4 = [R_SACM_Resouce_BS] //2005/03/29
// R_Syllable_Num = R5 = DS:[R4] & 0xFF
//R1 = DS:[R4] //del by mgl 2005/04/05
//R5 = R1 & 0xFF //del by mgl 2005/04/05
R5 = [_TTS_Syllable_Num]
// if(R5>MAX_SEG) R5 = MAX_SEG;
cmp R5, MAX_SEG
jle ?_EndOfLimiter
R5 = MAX_SEG
?_EndOfLimiter:
[R_Syllable_Num] = R5
//Get Segment information
R1 = R_DIC_Buffer
[R_DIC_PTR] = R1
R1 = R_START_ADDR_BUFFER
[R_ADDR_PTR] = R1
?_even:
//?_odd:
// even //////////////////////////
// if(SybCnt==0) break;
cmp R5, 0
jz ?_EndOfGetSeg
// SybCnt--;
R5 -= 1
// Address_Low
R3 = [R_ADDR_PTR]
R1 = DS:[R4++]
R2 = R1 LSL 2
[R3++] = R2
// Address_High
R2 = DS:[R4]
R2 &= 0x3
R1 = R1 LSL 4
R2 = R2 ROL 2
[R3++] = R2
[R_ADDR_PTR] = R3
// DataLength (= FrameLength * 4)
R3 = [R_DIC_PTR]
R1 = DS:[R4]
R1 &= 0xFC //<<2 already
[R3++] = R1
[R_DIC_PTR] = R3
// jmp ?_odd
// odd //////////////////////////
// if(SybCnt==0) break;
cmp R5, 0
jz ?_EndOfGetSeg
// SybCnt--;
R5 -= 1
// Address_Low
R3 = [R_ADDR_PTR]
R1 = DS:[R4++]
R2 = DS:[R4]
R1 = R1 LSL 4
R2 = R2 ROL 4
R1 = R1 LSL 4
R2 = R2 ROL 4
R2 = R2 LSL 2
[R3++] = R2
// Address_High
R1 = DS:[R4++]
R1 = R1 LSR 4
R1 = R1 LSR 2
R2 = R1 & 0x0F
[R3++] = R2
[R_ADDR_PTR] = R3
// DataLength (= FrameLength * 4)
R3 = [R_DIC_PTR]
R1 = R1 LSR 2
R1 &= 0xFC
[R3++] = R1
[R_DIC_PTR] = R3
jmp ?_even
?_EndOfGetSeg:
R1 = R_DIC_Buffer
[R_DIC_PTR] = R1
R1 = R_START_ADDR_BUFFER
[R_ADDR_PTR] = R1
pop BP from [SP]
retf;
.endp
//-------------------------------------------------
F_SACM_TTS320_Decode_Initial_BS: .PROC
R1 = R_DIC_Buffer
R2 = R1 + [R_Syllable_Num]
R3 = 0
cmp R1, R2
je ?_EndOfSum
?_SumLoop:
R3 += [R1++] //get the whole number of the TTS words
cmp R1, R2
jne ?_SumLoop
?_EndOfSum:
R4 = 0
[R_SACM_Decode_Length_L] = R3 //2005/03/31
[R_SACM_Decode_Length_H] = R4 //2005/03/31
[R_SACM_Decode_Count_L] = R4 //2005/03/31
[R_SACM_Decode_Count_H] = R4 //2005/03/31
retf
.ENDP
//-------------------------------------------------
F_TTS320_System_Get_BS_Manual: .proc
R1 = [R_SACM_Decode_In_PTR] //2005/03/31
cmp R1, R_SACM_Decode_In_Buffer //2005/03/31
je ?_EndOfGetBS
// Get BS
cmp R1, R_SACM_Decode_In_Buffer + C_DECODE_IN_LENGTH //2005/03/31
jl ?_DataMoveUp
R1 = R_SACM_Decode_In_Buffer //2005/03/31
[R_SACM_Decode_In_PTR] = R1 //2005/03/31
jmp ?_EndOfDataMoveUp
?_DataMoveUp:
R2 = R_SACM_Decode_In_Buffer //2005/03/31
R3 = R_SACM_Decode_In_Buffer + C_DECODE_IN_LENGTH //2005/03/31
?_DataMoveUpLoop:
R4 = [R1++]
[R2++] = R4
cmp R1, R3
jne ?_DataMoveUpLoop
[R_SACM_Decode_In_PTR] = R2 //2005/03/31
?_EndOfDataMoveUp:
R1 = [R_SACM_Decode_In_PTR] //2005/03/31
R2 = R_SACM_Decode_In_Buffer + C_DECODE_IN_LENGTH; //2005/03/31
R2 -= R1
push R1, R2 to [SP]
call F_TTS320_GetData; // parameter: R1 = Destination buffer pointer,
// R2 = FrameLength
SP += 2
R1 = R_SACM_Decode_In_Buffer //2005/03/31
[R_SACM_Decode_In_PTR] = R1 //2005/03/31
?_EndOfGetBS:
retf
.endp
//-------------------------------------------------
// short *F_TTS320_GetData(short *DesPtr, short CopyLen)
F_TTS320_GetData: .PROC
.define DesPtr 0
.define CopyLen 1
push BP to [SP]
BP = SP + 4
// if(CopyLen=0) goto EndOfLoop
R1 = [BP+CopyLen]
cmp R1, 0
jg ?_LoopStart
goto ?_EndOfLoop
// while(1)
?_LoopStart:
// if(R_Syllable_Num=0)
R4 = [R_Syllable_Num]
cmp R4, 0
jg ?_EndOfSyllableNumLessEquZero
// while(CopyLen){
// *DesPtr++ = 0;
// CopyLen--;}
R1 = [BP+DesPtr]
R2 = [BP+CopyLen]
R3 = 0
?_CopySilence:
[R1++] = R3
R2 -= 1
jnz ?_CopySilence
[BP+DesPtr] = R1
[BP+CopyLen] = R2
// break;
goto ?_EndOfLoop
?_EndOfSyllableNumLessEquZero:
// if(*dic=0) goto NextSegment
R1 = [R_DIC_PTR]
R2 = [R1]
cmp R2, 0
jle ?_NextSegment
// if(*dic>=CopyLen) // Complete Segment
cmp R2, [BP+CopyLen]
jl ?_EndOfCompleteSegment
// DesPtr = CopyFarData(DesPtr,sa,CopyLen)
R1 = [R_ADDR_PTR]
R2 = [R1++]
R3 = [R1--]
R1 = [BP+DesPtr]
R4 = [BP+CopyLen]
push R1, R4 to [SP]
call _CopyTTS320DB
SP += 4
[BP+DesPtr] = R1
// *dic -= CopyLen;
R1 = [R_DIC_PTR]
R2 = [R1]
R2 -= [BP+CopyLen]
[R1] = R2
// *sa += CopyLen;
R1 = [R_ADDR_PTR]
R2 = [R1++]
R3 = [R1--]
R2 += [BP+CopyLen]
R3 += 0, carry
[R1++] = R2
[R1--] = R3
// break
jmp ?_EndOfLoop
?_EndOfCompleteSegment:
// else // Uncomplete Segment:
// CopyLen -= *dic;
R1 = [BP+CopyLen] //先将下次可以取出的数据个数存放起来
R2 = [R_DIC_PTR] //保证下次取数时不超过最大限制
R1 -= [R2]
[BP+CopyLen] = R1
// DesPtr = CopyFarData(DesPtr,*sa++,*dic++);
R1 = [R_ADDR_PTR]
R2 = [R1++]
R3 = [R1--]
R1 = [R_DIC_PTR]
R4 = [R1]
R1 = [BP+DesPtr]
push R1, R4 to [SP]
call _CopyTTS320DB
SP += 4
[BP+DesPtr] = R1
// NextSegment:
?_NextSegment:
// dic++;
R1 = [R_DIC_PTR]
R1 += 1
[R_DIC_PTR] = R1
// sa++;
R1 = [R_ADDR_PTR]
R1 += 2
[R_ADDR_PTR] = R1
// R_Syllable_Num--;
R1 = [R_Syllable_Num]
R1 -= 1
[R_Syllable_Num] = R1
goto ?_LoopStart
?_EndOfLoop:
// return DesPtr
R1 = [BP+DesPtr]
pop BP from [SP]
retf
.ENDP
//-------------------------------------------------
// short *CopyTTS320DB(short *DesPtr,FARPTR sa,short CopyLen)
.define CopyTTS320DB_DesPtr 0
.define CopyTTS320DB_sa_L 1
.define CopyTTS320DB_sa_H 2
.define CopyTTS320DB_CopyLen 3
_CopyTTS320DB: .PROC
push BP to [SP]
BP = SP + 4
// R1 = DesPtr
// R2 = CopyLen
R1 = [BP+CopyTTS320DB_DesPtr]
R2 = [BP+CopyTTS320DB_CopyLen]
// if(R2=0) return DesPtr;
cmp R2, 0
jle ?_Return
// DS:R3 = sa
R4 = SEG T_SACM_CS0S320TTS_Table
DS = R4
R4 = OFFSET T_SACM_CS0S320TTS_Table
r3 = DS:[r4++]
r4 = DS:[r4]
R3 += [BP + CopyTTS320DB_sa_L]
R4 += [BP + CopyTTS320DB_sa_H],carry
// R3 += [T_SACM_CS0S320TTS_Table]
// R4 += [T_SACM_CS0S320TTS_Table+1], carry
.ifdef C_SYSTEM_SPL16256
SR &= ~0xfc00
R4 = R4 LSL 4
R4 = R4 LSL 4
SR |= R4 LSL 2
.else
DS = r4
.endif
// do
?_LoopStart:
// *DS:R3++ = *R1++;
R4 = DS:[R3++]
[R1++] = R4
// R2--;
R2 -= 1
// while(R2)
jnz ?_LoopStart
?_Return:
// return R1;
pop BP from [SP]
retf
.ENDP
//----------------------------------------------------------
.endif //C_CODEC_S320TTS_SUPPORT