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


 
.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 
 
.external _S200TTS1BIN_Access_Init	//added by mgl for open SP_WORD.200 
.external _S200TTS1BIN_Access_GetData	//added by mgl for get SP_WORD.200 data 
.external _S200TTS1BIN_Access_End	//added by mgl for close SP_WORD.200 
 
//.external R_Curr_Column,		R_Curr_Page 
//.external T_DIC_Table 
.external R_SACM_XXXX_Resouce_BS,	R_SACM_XXXX_Resouce_DS 
.EXTERNAL R_SACM_Resouce_BS,		R_SACM_Resouce_DS	//guili 2005.12.01 for S480 no Speed control 
.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_Decode_In_PTR,		R_SACM_Decode_In_Buffer	//guili 2005.12.01 for S480 no Speed control 
 
.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	0x0009 
 
.CODE 
//------------------------------------------------------------ 
F_SACM_TTS200_System_Get_SAC_Manual: .proc 
	push bp to [sp] 
 
	R3 = [R_SACM_XXXX_Resouce_DS]; 
	R3 = R3 LSR 4; 
	R3 = R3 LSR 4; 
	R3 = R3 LSR 2; 
	[R_SACM_XXXX_Resouce_DS] = R3; 
		 
	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_XXXX_Resouce_DS]; 
.ifdef C_SYSTEM_SPL16256 
	[P_DS_Setup]=R3;		// for 16256 cfwei 20040506 
.else	 
	DS = R3;			// for 161001 cfwei 20040506/ 
.endif 
	R2 = [R_SACM_XXXX_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 
  	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 
	[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	//added by mgl for open SP_WORD.200 
// ========== end ======================= 
	call F_S200TTS_System_Get_BS_ExtRam	//get all data of this word to buffer 
	call _S200TTS1BIN_Access_End	//added by mgl for close SP_WORD.200 
	RETF; 
.endp 
 
//------------------------------------------------------------ 
F_SACM_TTS200_System_Get_BS_Manual:  .proc 
	R1 = [R_SACM_XXXX_Decode_In_PTR]; 
	cmp R1, R_SACM_XXXX_Decode_In_Buffer; 
	jne ?_Continue_1; 
	goto ?_Branch_0; 
?_Continue_1: 
	cmp R1, R_SACM_XXXX_Decode_In_Buffer + C_DECODE_IN_LENGTH; 
	jl ?_Branch_1; 
		 
	R1 = R_SACM_XXXX_Decode_In_Buffer; 
	[R_SACM_XXXX_Decode_In_PTR] = R1; 
	jmp ?_Branch_2; 
		 
?_Branch_1: 
	R2 = R_SACM_XXXX_Decode_In_Buffer; 
	R3 = R_SACM_XXXX_Decode_In_Buffer + C_DECODE_IN_LENGTH; 
	 
?_Loop_0: 
	R4 = [R1++]; 
	[R2++] = R4; 
	cmp R1, R3; 
	jne ?_Loop_0; 
 
	[R_SACM_XXXX_Decode_In_PTR] = R2; 
 
?_Branch_2: 
	R1 = [R_SACM_XXXX_Decode_In_PTR]; 
	R2 = R_SACM_XXXX_Decode_In_Buffer + C_DECODE_IN_LENGTH; 
	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_XXXX_Decode_In_Buffer; 
	[R_SACM_XXXX_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 = 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 _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 
 
//------------------------------------------------------------ 
.endif	//---C_SND_S200TTS_SUPPORT