www.pudn.com > OS.rar > S200TTS_Data_Access_prefetch.asm, change:2006-12-11,size:11256b


 
.include system_head.inc 
.include SACM_Constant.inc		// for flag / buffer constants 
.include Snd_ArithmConfig.inc	// define compiler config const 
 
.ifdef C_SND_S200TTS_SUPPORT 
//---------------------------------------------------- 
 
.public F_SACM_TTS200_System_Get_SAC_Manual 
.public F_SACM_TTS200_System_Get_BS_Manual 
.public F_SACM_TTS200_System_Get_BS_Initial 
 
.public F_SACM_S200TTS_Decode_Init_BS 
 
//.external R_SACM_XXXX_Resouce_BS,	R_SACM_XXXX_Resouce_DS 
//.external R_SACM_XXXX_Decode_Length_L,	R_SACM_XXXX_Decode_Length_H 
//.external R_SACM_Decode_Length_L,	R_SACM_Decode_Length_H	//guili 2005.12.01 for S480 no Speed control 
//.external R_SACM_XXXX_Decode_Count_L,	R_SACM_XXXX_Decode_Count_H 
//.external R_SACM_Decode_Count_L,	R_SACM_Decode_Count_H	//guili 2005.12.01 for S480 no Speed control 
//.external R_SACM_XXXX_Decode_In_PTR,	R_SACM_XXXX_Decode_In_Buffer 
.external R_SACM_S200_Decode_In_PTR,	R_SACM_S200_Decode_In_Buffer 
.external R_SACM_Resouce_BS,		R_SACM_Resouce_DS	//guili 2005.12.01 for S480 no Speed control 
.external R_SACM_S200_Decode_Length_L, R_SACM_S200_Decode_Length_H 
.external R_SACM_S200_Decode_Count_L, R_SACM_S200_Decode_Count_H 
.external R_DECODE_IN_LENGTH 
//.external R_SACM_Decode_In_PTR,		R_SACM_Decode_In_Buffer	//guili 2005.12.01 for S480 no Speed control 
.external decvar_bit_pack_buffer, MODE 
 
.public R_DIC_Buffer,	R_DIC_PTR 
.public R_START_ADDR_BUFFER,	R_ADDR_PTR 
.public R_Syllable_Num 
 
.public _TTS_Syllable_Num 
.public _TTS1BIN_Curr_Addr,	_TTS1BIN_Curr_DS 
.public _TTS1BIN_Dest_Addr,	_TTS1BIN_Dest_DS 
.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 
 
.define C_EXTRAM_IN_LENGTH 2000 
.define R_SACM_XXXX_ExtRam_In_Buffer_Low	0x0000	//mgl 2005/04/04 fix __sp_..._end=0x7d0 
.define R_SACM_XXXX_ExtRam_In_Buffer_High	0x0025	//For NandBoot 2002 
 
.CODE 
//------------------------------------------------------------ 
F_SACM_TTS200_System_Get_SAC_Manual: .proc 
	push bp to [sp] 
 
	R3 = [R_SACM_Resouce_DS]; 
	R3 = R3 LSR 4; 
	R3 = R3 LSR 4; 
	R3 = R3 LSR 2; 
	[R_SACM_Resouce_DS] = R3;//into the word type 
 
	R1 = [_TTS_Syllable_Num] 
	[R_Syllable_Num] = R1; 
 
	R2 = R_DIC_Buffer; 
	[R_DIC_PTR] = R2;  
 
	R1 = R_START_ADDR_BUFFER;	//store start addr 
	[R_ADDR_PTR] = R1; 
 
	R3 = [R_SACM_Resouce_DS]; 
.ifdef C_SYSTEM_SPL16256 
	[P_DS_Setup]=R3;		// for 16256 
.else 
	DS = R3;			// for 161001 
.endif 
	R2 = [R_SACM_Resouce_BS]; 
 
?_Loop: 
	r1 = [R_Syllable_Num] 
	jz ?_End_Proc 
	r1 -= 1 
	[R_Syllable_Num] = r1 
 
	//DIC_Buffer: 	     |Length |Length |...| 
	//START_ADDR_BUFFER: | L |H  | L | H |...| 
	r1 = [R_ADDR_PTR] 
  	R3 = DS:[R2++];			//Addr low 
  	R4 = DS:[R2++];			//Addr high 
  	r4 &= 0x00ff 
  	r3 += r3 lsl 2			//r3*5 = r3*(1 + 4) = r3 + r3<<2	by xiaolei 
  	r5 = r5 lsl 2			//shift SR,have no effect to Carry 
  	r4 += r4 rol 2,carry 
	r1 = [R_ADDR_PTR] 
  	[r1++] = r3 
  	[r1++] = r4				//r4r3=addr*5 
  	[R_ADDR_PTR] = r1 
	r4 = [R_DIC_PTR] 
  	r3 = DS:[r2--] 
  	r3 = DS:[r2++] 
  	r3 &= 0xff00 
	r3 = r3 lsr 4 
	r3 = r3 lsr 4 
	r3 += r3 lsl 2 
	[r4++] = r3				//r3 = length*5,int bytes 
	[R_DIC_PTR] = r4 
	goto ?_Loop; 
 
?_End_Proc: 
	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_TTS200_System_Get_BS_Initial: .proc 
	R1 = R_DIC_Buffer; 
	r4 = [r1++] 
	[_Frame_Length] = R4; 
	[R_DIC_PTR] = r1 
 
	R1 = R_START_ADDR_BUFFER 
	R3 = [R1++];			//L 
	R2 = [R1++];			//H 
	[R_ADDR_PTR] = R1;		//second DIC start addr 
 
?_LengthToPage: 
// ========== begin ======================= 
	[_TTS1BIN_Curr_DS]=r2 
	[_TTS1BIN_Curr_Addr]=r3	 
	//call _S200TTS1BIN_Access_Init	//marked by mgl 2005/04/19 for memory need not init 
// ========== end ======================= 
	call F_S200TTS_System_Get_BS_ExtRam 
 
	RETF; 
.endp 
 
//============================================================== 
F_SACM_S200TTS_Decode_Init_BS: .PROC 
.comment @ 
	R1 = R_DIC_Buffer 
	R2 = R1 + [_TTS_Syllable_Num] 
	R3 = 0 
	cmp R1, R2 
	je ?_EndOfSum 
?_SumLoop: 
	R3 += [R1++] 
	cmp R1, R2 
	jne ?_SumLoop 
?_EndOfSum: 
	R4 = 0 
 	[R_SACM_S200_Decode_Length_L] = R3 	//2005/03/31 
 	[R_SACM_S200_Decode_Length_H] = R4 	//2005/03/31 
	[R_SACM_S200_Decode_Count_L] = R4  	//2005/03/31 
	[R_SACM_S200_Decode_Count_H] = R4  	//2005/03/31 
 
	R1 = [R_SACM_S200_Decode_In_PTR]; 
	R1 += 2 
	R2 = [R1++]; 
	R2 -= 1; 
	///////////		//jacky 0727 
	//////////[0xb73]=r2 
	[MODE] = R2; 
	R2 = [R1++]; 
//	jacky 0512 
//	[0x74]=r2 
	[decvar_bit_pack_buffer] = R2; 
 
   	[R_SACM_S200_Decode_In_PTR] = R1; 
@ 
	retf 
.ENDP 
 
//------------------------------------------------------------ 
 
F_SACM_TTS200_System_Get_BS_Manual:  .proc 
	R1 = [R_SACM_S200_Decode_In_PTR]; 
	cmp R1, R_SACM_S200_Decode_In_Buffer; 
	jne ?_Continue_1; 
	goto ?_Branch_0; 
?_Continue_1: 
	R2 = [R_DECODE_IN_LENGTH] 
//	cmp R1, R_SACM_S200_Decode_In_Buffer + C_DECODE_IN_LENGTH;	 
	R2 += R_SACM_S200_Decode_In_Buffer 
	cmp R1, R2 
 
	jl ?_Branch_1; 
		 
	R1 = R_SACM_S200_Decode_In_Buffer; 
	[R_SACM_S200_Decode_In_PTR] = R1; 
	jmp ?_Branch_2; 
		 
?_Branch_1: 
	R2 = R_SACM_S200_Decode_In_Buffer; 
//	R3 = R_SACM_S200_Decode_In_Buffer + C_DECODE_IN_LENGTH; 
	R3 = [R_DECODE_IN_LENGTH] 
	R3 += R_SACM_S200_Decode_In_Buffer 
	 
?_Loop_0: 
	R4 = [R1++]; 
	[R2++] = R4; 
	cmp R1, R3; 
	jne ?_Loop_0; 
 
	[R_SACM_S200_Decode_In_PTR] = R2; 
 
?_Branch_2: 
	R1 = [R_SACM_S200_Decode_In_PTR]; 
//	R2 = R_SACM_S200_Decode_In_Buffer + C_DECODE_IN_LENGTH; 
	R2 = [R_DECODE_IN_LENGTH] 
	R2 += R_SACM_S200_Decode_In_Buffer 
 
	R2 -= R1; 
	push r1,r2 to [sp] 
	 
 	call F_TTS200_GetData		//mgl 2005/03/15 
	// parameter: R1 = R_SACM_Decode_In_Buffer, 
	//            R2 = C_DECODE_IN_LENGTH   
	// return with R_SACM_Decode_In_Buffer filled 	  
 
	sp += 2 
	R1 = R_SACM_S200_Decode_In_Buffer; 
	[R_SACM_S200_Decode_In_PTR] = R1; 
 
?_Branch_0:		 
 	retf; 
.endp 
 
//------------------------------------------------------------ 
// parameter: R1 = R_SACM_Decode_In_Buffer, 
//            R2 = C_DECODE_IN_LENGTH   
// return with R_SACM_Decode_In_Buffer filled 	  
.define DesPtr	0 
.define CopyLen	1 
F_TTS200_GetData:	.proc 
	push BP to [SP] 
	BP = SP + 4 
 
	r1 = [bp+DesPtr] 
	r2 = [bp+CopyLen] 
 
	R3 = [_TTS1BIN_Dest_Addr]; 
	R4 = [_TTS1BIN_Dest_DS];  
	DS = R4; 
?L_Get_Loop: 
	cmp R2, 0; 
	jz ?L_End; 
	R4 = DS:[R3++]; 
	[R1++] = R4; 
	R2 -= 1; 
	jmp ?L_Get_Loop; 
 
?L_End: 
	R4 = DS; 
	[_TTS1BIN_Dest_DS] = R4; 
	[_TTS1BIN_Dest_Addr] = R3; 
 
	pop bp from [sp] 
	retf; 
.endp 
 
 
//------------------------------------------------------------ 
F_S200TTS_System_Get_BS_ExtRam: .proc 
	r2 = [_TTS_Syllable_Num] 
	[R_Syllable_Num] = r2 
	r5 = R_DIC_Buffer 
	// Length = sum of SAC_FC *5 bytes 
	r3 = 0 
	R4 = 0			//sum of FrameCount 
?_Sum_of_FrameCount: 
	R1 = [r5++];		//FrameCount 
	R3 += R1; 
	r4 += 0,Carry 
	R2 -= 1; 
	JNE ?_Sum_of_FrameCount; 
	r3 += 2			//add S200TTS head 00 0c 
	r4 += 0,Carry 
 
	//save it to Buffer 
	R1 = R_SACM_XXXX_ExtRam_In_Buffer_High 
	DS = R1 
	R2 = 0x000c 
	//R1 = offset R_SACM_XXXX_ExtRam_In_Buffer; 
	R1 = R_SACM_XXXX_ExtRam_In_Buffer_Low; 
	DS:[r1++] = R3		//save Length Low,±£´æµØÖ·ÐÅÏ¢ 
	DS:[r1++] = R4		//save Length High 
	DS:[r1++] = R2		//save charactor code 
	R2 = DS 
	[_TTS1BIN_Dest_DS] = R2; 
	[_TTS1BIN_Dest_Addr] = R1; 
	r3 = 0	 
	[_TTS1BIN_Dest_Offset] = r3 
 
	R1 = R_DIC_Buffer; 
	r4 = [r1++] 
	[_Frame_Length] = R4; 
	[R_DIC_PTR] = r1 
		 
	R1 = R_START_ADDR_BUFFER 
	R3 = [R1++];		//L 
	R2 = [R1++];		//H 
	[R_ADDR_PTR] = R1;	//second DIC start addr 
 
	[_TTS1BIN_Curr_DS]=r2		 
	[_TTS1BIN_Curr_Addr]=r3	 
 
?_Branch_2: 
	//save tts1.bin in R_SACM_XXXX_ExtRam_In_Buffer 
	//S200TTS1BIN_Access_GetData(ULONG DesPtr,ULONG saPtr,short CopyLen) 
	call F_S200TTS1BIN_Access_GetData	//in S200TTS1BIN_Access_byFAT.c 
 
?_Check_DecodeInBuffer_Full: 
	R1 = [_TTS1BIN_Dest_Addr]; 
	R2 = R_SACM_XXXX_ExtRam_In_Buffer_Low + C_EXTRAM_IN_LENGTH; 
	cmp R1,R2; 
	jb ?_Change_Syllable; 
	goto ?_End; 
 
?_Change_Syllable:	 
	R1 = [R_Syllable_Num]; 
 	R1 -= 1; 
	[R_Syllable_Num] = R1; 
	jz ?_End; 
?_Refresh_Parameter: 
	R1 = [R_ADDR_PTR] 
	R3 = [R1++];		//low 
	R2 = [R1++];		//high 
	[R_ADDR_PTR] = R1 
	R1 = [R_DIC_PTR] 
	R4 = [R1++];		//length 
	[_Frame_Length] = R4;	//modified frame length 
	[R_DIC_PTR] = r1 
		 
?_LengthToPage: 
	// now R2,R3 is the start address * 5 
	 
	[_TTS1BIN_Curr_DS]=r2		 
	[_TTS1BIN_Curr_Addr]=r3	 
	goto ?_Branch_2 
		 
?_End: 
	R1 = R_SACM_XXXX_ExtRam_In_Buffer_High; 
	[_TTS1BIN_Dest_DS] = R1; 
	R1 = R_SACM_XXXX_ExtRam_In_Buffer_Low; 
	[_TTS1BIN_Dest_Addr] = R1;	 
	RETF; 
.endp 
 
 
//------------------------------------------------------------ 
//S200TTS1BIN_Access_GetData(ULONG DesPtr,ULONG saPtr,short CopyLen); 
//S200TTS1BIN_Access_GetData(ULONG TTS1BIN_Dest,ULONG TTS1BIN_Curr,short Frame_Length); 
.external T_SACM_CS0S200TTS_Table 
F_S200TTS1BIN_Access_GetData:	.proc 
	r5 = 0				//src offset 
	//r4 = 0			//dst offset,_TTS1BIN_Dest_Offset 
	r4 = [_TTS1BIN_Dest_Offset]	//dst offset,_TTS1BIN_Dest_Offset 
	r1 = [_TTS1BIN_Curr_Addr]	//in bytes 
	r2 = [_TTS1BIN_Curr_DS] 
	r5 = r1&0x0001			//r5=Curr Offset 
	r2 = r2 lsr 1 
	r3 = r3 lsr 3 
	r1 = r1 ror 1 
	[_TTS1BIN_Curr_Addr] = r1	//in words 
	[_TTS1BIN_Curr_DS] = r2 
 
	ds = seg T_SACM_CS0S200TTS_Table 
	r2 = offset T_SACM_CS0S200TTS_Table 
	r1 = DS:[r2++] 
	r2 = DS:[r2] 
	r1 += [_TTS1BIN_Curr_Addr] 
	r2 += [_TTS1BIN_Curr_DS],Carry 
	[_TTS1BIN_Curr_Addr] = r1 
	[_TTS1BIN_Curr_DS] = r2 
?L_Loop: 
	r1 = [_Frame_Length] 
	cmp r1,0 
	jnz ?L_ReadData 
	goto ?L_End 
 
?L_ReadData: 
	r1 = [_TTS1BIN_Curr_DS] 
	DS = r1 
	r1 = [_TTS1BIN_Curr_Addr] 
	r2 = DS:[r1++] 
	cmp r5,0 
	jnz ?L_OddByte 
?L_EvenByte: 
	r2 &= 0x00ff 
	r1 -= 1 
	r3 = DS 
	[_TTS1BIN_Curr_DS] = r3 
	[_TTS1BIN_Curr_Addr] = r1 
	jmp ?L_SaveData 
?L_OddByte: 
	r2 = r2 lsr 4 
	r2 = r2 lsr 4 
	r3 = DS 
	[_TTS1BIN_Curr_DS] = r3 
	[_TTS1BIN_Curr_Addr] = r1 
 
?L_SaveData:	//r2=data,R4=_TTS1BIN_Dest_Offset,r5=_TTS1BIN_Curr_Offset 
	r5 += 1 
	r5 &= 0x0001 
	cmp r4,0 
	jz ?L_NewWord 
	r2 = r2 lsl 4 
	r2 = r2 lsl 4 
	r1 = [_TTS1BIN_Dest_DS] 
	DS = r1 
	r1 = [_TTS1BIN_Dest_Addr] 
	r3 = DS:[r1] 
	r2 |= r3 
	DS:[r1++] = r2 
	r3 = DS 
	[_TTS1BIN_Dest_DS] = r3 
	[_TTS1BIN_Dest_Addr] = r1 
	r1 = [_Frame_Length] 
	r1 -= 1 
	[_Frame_Length] = r1 
	r4 += 1 
	r4 &= 0x0001 
	goto ?L_Loop 
 
?L_NewWord: 
	r1 = [_TTS1BIN_Dest_DS] 
	DS = r1 
	r1 = [_TTS1BIN_Dest_Addr] 
	DS:[r1] = r2 
	r3 = DS 
	[_TTS1BIN_Dest_DS] = r3 
	[_TTS1BIN_Dest_Addr] = r1 
	r1 = [_Frame_Length] 
	r1 -= 1 
	[_Frame_Length] = r1 
	r4 += 1 
	r4 &= 0x0001 
	goto ?L_Loop 
 
?L_End: 
	[_TTS1BIN_Dest_Offset] = r4 
	retf 
.endp 
 
//------------------------------------------------------------ 
.endif	//---C_SND_S200TTS_SUPPORT