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