⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tts320_data_access.asm

📁 GPL162001的A1600與A4800音源壓縮格式demo程式
💻 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 + -