📄 tts320_data_access.asm
字号:
//.INCLUDE SACM_S320_Constant.inc //2005/03/29
//.INCLUDE SACM_XXXX_Constant.inc
.INCLUDE SACM_Constant.inc //add by bennwang 20051020
.PUBLIC F_TTS320_System_Get_SAC_Manual
.PUBLIC F_SACM_TTS320_Decode_Initial_BS
.PUBLIC F_SACM_TTS320_System_Get_BS_Manual
//.PUBLIC _USER_SetStartAddr //2005/03/29
// version
.PUBLIC _TTS320_DATA_ACCESS_VERSION
.PUBLIC _TTS320_DATA_ACCESS_VERSION_STRING
//20051020
.EXTERNAL R_SACM_Resouce_BS, R_SACM_Resouce_DS
.EXTERNAL R_SACM_S320_Decode_Length_L, R_SACM_S320_Decode_Length_H
.EXTERNAL R_SACM_S320_Decode_Count_L, R_SACM_S320_Decode_Count_H
.EXTERNAL R_SACM_S320_Decode_In_PTR
.EXTERNAL R_SACM_S320_Decode_In_Buffer
.EXTERNAL TTS320_Database_SA
//.EXTERNAL T_DIC_Table
//2005/03/29
.comment @ //20051020
.EXTERNAL R_Resouce_BS, R_Resouce_DS
.EXTERNAL R_SACM_XXXX_Decode_Length_L, R_SACM_XXXX_Decode_Length_H
.EXTERNAL R_SACM_XXXX_Decode_Count_L, R_SACM_XXXX_Decode_Count_H
.EXTERNAL R_SACM_XXXX_Decode_In_PTR
.EXTERNAL R_SACM_XXXX_Decode_In_Buffer
@
.define MAX_SEG 20
OVERLAP_TTS320_DM_BLOCK: .SECTION .ORAM
R_DIC_Buffer: .DW MAX_SEG DUP(?)
R_START_ADDR_BUFFER: .DW MAX_SEG*2 DUP(?)
R_Syllable_Num: .DW ?
R_DIC_PTR: .DW ?
R_ADDR_PTR: .DW ?
.TEXT
_TTS320_DATA_ACCESS_VERSION: .DW 0x1001
_TTS320_DATA_ACCESS_VERSION_STRING: .DW '@Sunplus TTS320 Data Access Module on SPL161001 by Jacky Lu',0
.CODE
//2005/03/29
.comment @
//--------------------------------------------------------------------
//-- Procedure: _USER_SetStartAddr
//-- Syntax: USER_SetStartAddr(int)
//-- Parameter: R1 = PlayIndex
//-- Return: NONE
//-- Description: This API allows users to set the beginning address
// to fetch data. This address can be either a ROM address
// or a external storage address. User would have to modify
// the function body based on the application's need.
//--------------------------------------------------------------------
_USER_SetStartAddr:
//-----------------------
// defined by user
//-----------------------
R1 = SP + 3
R1 = [R1]
R1 += T_DIC_Table
R1 = [R1];
R2 = [R1 ++];
[R_SACM_S320_Resouce_BS] = R2;
R1 = [R1];
R1 = R1 LSL 4;
R1 = R1 LSL 4;
R1 = R1 LSL 2;
[R_SACM_S320_Resouce_DS] = R1;
//-----------------------
// end of user define area
//-----------------------
retf
@
F_TTS320_System_Get_SAC_Manual: .PROC
push BP to [SP]
r4 = [R_SACM_Resouce_DS]; //20051020
ds=r4 //20051020
R4 = [R_SACM_Resouce_BS]; //20051020
//SR &= ~0xfc00
//SR |= [R_SACM_Resouce_DS] //20051020
//R4 = [R_SACM_Resouce_BS] //20051020
// R_Syllable_Num = R5 = D:[R4] & 0xFF
R1 = D:[R4]
R5 = R1 & 0xFF
// 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
?_odd:
// odd //////////////////////////
// if(SybCnt==0) break;
cmp R5, 0
jz ?_EndOfGetSeg
// SybCnt--;
R5 -= 1
// Address_Low
R3 = [R_ADDR_PTR]
R1 = D:[R4++]
R2 = D:[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 = D:[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
// even //////////////////////////
// if(SybCnt==0) break;
cmp R5, 0
jz ?_EndOfGetSeg
// SybCnt--;
R5 -= 1
// Address_Low
R3 = [R_ADDR_PTR]
R1 = D:[R4++]
R2 = R1 LSL 2
[R3++] = R2
// Address_High
R2 = D:[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 = D:[R4]
R1 &= 0xFC
[R3++] = R1
[R_DIC_PTR] = R3
jmp ?_odd
?_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++]
cmp R1, R2
jne ?_SumLoop
?_EndOfSum:
R4 = 0
[R_SACM_S320_Decode_Length_L] = R3 //20051020
//[R_SACM_XXXX_Decode_Length_L] = R3 //2005/03/29
[R_SACM_S320_Decode_Length_H] = R4 //20051020
//[R_SACM_XXXX_Decode_Length_H] = R4 //2005/03/29
[R_SACM_S320_Decode_Count_L] = R4 //20051020
//[R_SACM_XXXX_Decode_Count_L] = R4 //2005/03/29
[R_SACM_S320_Decode_Count_H] = R4 //20051020
//[R_SACM_XXXX_Decode_Count_H] = R4 //2005/03/29
retf
.ENDP
F_SACM_TTS320_System_Get_BS_Manual: .proc
R1 = [R_SACM_S320_Decode_In_PTR] //20051020
//R1 = [R_SACM_XXXX_Decode_In_PTR] //2005/03/29
cmp R1, R_SACM_S320_Decode_In_Buffer //20051020
//cmp R1, R_SACM_XXXX_Decode_In_Buffer //2005/03/29
je ?_EndOfGetBS
// Get BS
cmp R1, R_SACM_S320_Decode_In_Buffer + C_DECODE_IN_LENGTH //20051020
//cmp R1, R_SACM_XXXX_Decode_In_Buffer + C_DECODE_IN_LENGTH //2005/03/29
jl ?_DataMoveUp
R1 = R_SACM_S320_Decode_In_Buffer //20051020
//R1 = R_SACM_XXXX_Decode_In_Buffer //2005/03/29
[R_SACM_S320_Decode_In_PTR] = R1 //20051020
//[R_SACM_XXXX_Decode_In_PTR] = R1 //2005/03/29
jmp ?_EndOfDataMoveUp
?_DataMoveUp:
R2 = R_SACM_S320_Decode_In_Buffer //20051020
//R2 = R_SACM_XXXX_Decode_In_Buffer //2005/03/29
R3 = R_SACM_S320_Decode_In_Buffer + C_DECODE_IN_LENGTH //20051020
//R3 = R_SACM_XXXX_Decode_In_Buffer + C_DECODE_IN_LENGTH //2005/03/29
?_DataMoveUpLoop:
R4 = [R1++]
[R2++] = R4
cmp R1, R3
jne ?_DataMoveUpLoop
[R_SACM_S320_Decode_In_PTR] = R2 //20051020
//[R_SACM_XXXX_Decode_In_PTR] = R2 //2005/03/29
?_EndOfDataMoveUp:
R1 = [R_SACM_S320_Decode_In_PTR] //20051020
//R1 = [R_SACM_XXXX_Decode_In_PTR] //2005/03/29
R2 = R_SACM_S320_Decode_In_Buffer + C_DECODE_IN_LENGTH; //20051020
//R2 = R_SACM_XXXX_Decode_In_Buffer + C_DECODE_IN_LENGTH; //2005/03/29
R2 -= R1
push R1, R2 to [SP]
call F_TTS320_GetData; // parameter: R1 = Destination buffer pointer,
// R2 = FrameLength
SP += 2
R1 = R_SACM_S320_Decode_In_Buffer //20051020
//R1 = R_SACM_XXXX_Decode_In_Buffer //2005/03/29
[R_SACM_S320_Decode_In_PTR] = R1 //20051020
//[R_SACM_XXXX_Decode_In_PTR] = R1 //2005/03/29
?_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)
// .PUBLIC _CopyTTS320DB
_CopyTTS320DB: .PROC
.define CopyTTS320DB_DesPtr 0
.define CopyTTS320DB_sa_L 1
.define CopyTTS320DB_sa_H 2
.define CopyTTS320DB_CopyLen 3
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
// D:R3 = sa
R3 = [BP+CopyTTS320DB_sa_L]
R4 = [BP+CopyTTS320DB_sa_H]
R3 += [TTS320_Database_SA]
R4 += [TTS320_Database_SA+1], carry
SR &= ~0xfc00
R4 = R4 LSL 4
R4 = R4 LSL 4
SR |= R4 LSL 2
// do
?_LoopStart:
// *D:R3++ = *R1++;
R4 = D:[R3++]
[R1++] = R4
// R2--;
R2 -= 1
// while(R2)
jnz ?_LoopStart
?_Return:
// return R1;
pop BP from [SP]
retf
.ENDP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -