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