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