www.pudn.com > OS.rar > SndSACM.asm, change:2007-01-21,size:9976b


//============================================== 
//compiler config 
//.define LEDDEBUG 
.define SND_CB_PLAYEND 
//============================================== 
 
.include .\system\GPL162002_Far\include\minios\unOS.inc 
.include .\system\GPL162002_Far\include\hal\ophw.inc 
.include .\system\GPL162002_Far\include\system\GPL162002.inc			//mgl 2005/03/11 for SPl162001 
.include ..\Include\SACM_Constant.inc		// for flag / buffer constants 
.include ..\Include\Snd_ArithmConfig.inc	// define compiler config const 
.include ..\Include\SACM_API.inc 
.include ..\Include\sacm.inc 
.include ..\Include\Ram_External.inc 
 
//============================================== 
// Definitions for MiniOS 
//============================================== 
.define		C_SNDTASK_SACM_DECODE	1 
.define		C_SNDTASK_SACM_ENCODE	2 
 
.define		C_SNDTASK_MS02		5 
.define		C_SNDTASK_TTS		6 
 
//============================================== 
.external _unOSSemPost 
.external _unOSSemPend 
.external _unOSQPost 
.external _unOSQPend 
 
//MsgID = (unsigned int)unOSQPend(hSndTaskQ,0,&err); 
.ifndef FARRELEASE 
MY_unOSQPend:	.macro	hSndTaskQ,qaz,err 
	R1 = [hSndTaskQ]; 
	R2 = qaz; 
	R3 = err; 
	push R1,R3 to [SP];		//param for unOSQPend 
	call _unOSQPend; 
	sp += 3 
.ENDM 
.else 
MY_unOSQPend:	.macro	hSndTaskQ,qaz,err 
	R1 = [hSndTaskQ]; 
	R2 = 0x0000; 
	R3 = qaz; 
	R4 = err; 
	push R1,R4 to [SP];		//param for unOSQPend 
	call _unOSQPend; 
	sp += 4 
.ENDM 
.endif 
 
//unOSQPost (hSndTaskQ,(void*)MsgID); 
.ifndef FARRELEASE 
MM_unOSQPost:	.macro	hSndTaskQ,MsgID 
	R1 = [hSndTaskQ]; 
	R2 = MsgID 
	push R1,R2 to [SP]; 
	call _unOSQPost; 
	pop R1,R2 from [SP]; 
.ENDM 
.else 
MM_unOSQPost:	.macro	hSndTaskQ,MsgID 
	R1 = [hSndTaskQ]; 
	R2 = 0x0000; 
	R3 = MsgID 
	push R1,R3 to [SP]; 
	call _unOSQPost; 
	pop R1,R3 from [SP]; 
.ENDM 
.endif 
 
//guili 2005/07/20 
//msg = unOSMboxPend(hSndMailBox,0,&err); 
.ifndef FARRELEASE 
MY_unOSMboxPend:	.macro	hSndMailBox,qaz,err 
	R1 = [hSndMailBox]; 
	R2 = qaz; 
	R3 = err; 
	push R1,R3 to [SP];		//param for unOSMboxPend 
	call _unOSMboxPend; 
	sp += 3 
.ENDM 
//add for far release,xiaolei 2006/01/03 
.else 
MY_unOSMboxPend:	.macro	hSndMailBox,qaz,err 
	R1 = [hSndMailBox]; 
	R2 = 0x0000; 
	R3 = qaz; 
	R4 = err; 
	R5 = 0; 
	push R1,R5 to [SP];		//param for unOSMboxPend 
	call _unOSMboxPend; 
	sp += 5 
.ENDM 
.endif 
 
//unOSMboxPost (hSndMailBox,(void*)MsgID); 
.ifndef FARRELEASE 
MM_unOSMboxPost:	.macro	hSndMailBox,MsgID 
	R1 = [hSndMailBox]; 
	R2 = MsgID 
	push R1,R2 to [SP]; 
	call _unOSMboxPost; 
	pop R1,R2 from [SP]; 
.ENDM 
.else 
MM_unOSMboxPost:	.macro	hSndMailBox,MsgID 
	R1 = [hSndMailBox]; 
	R2 = 0x0000; 
	R3 = MsgID 
	R4 = 0; 
	push R1,R4 to [SP]; 
	call _unOSMboxPost; 
	pop R1,R4 from [SP]; 
.ENDM 
.endif 
 
//============================================== 
 
.ifdef C_SND_CTTS_SUPPORT 
.ifdef C_SND_ETTS_SUPPORT 
	.external _CTTS1BIN_Access_End 
	.external _Snd_CTTS_IsPlaying 
	.define C_CTTS_PLAYING		2 
.endif 
.endif 
 
.ifdef C_SND_S200TTS_SUPPORT 
	.external _S200TTS1BIN_Access_End; 
.endif 
 
.ifdef C_SND_S320TTS_SUPPORT 
	.ifdef TTS320FAT//FAT	xiaolei modify 2006/03/02 
		.external _S320TTS1BIN_Access_End; 
	.endif 
.endif 
 
.ifdef C_SND_DVR_SUPPORT 
	.external _SACM_ENCODE_ServiceLoop 
	.external F_ISR_Service_SACM_Encode 
	.define SND_CB_RECEND 
	.external _Snd_onRecEnd 
	.public _Snd_SACM_AudioREC_ISR 
.endif 
 
.external _Snd_onPlayEnd 
 
.public _Snd_SACM_AudioFIFO_ISR 
 
.ifdef AUDIOBINTREGISTER 
	.public _Snd_SACM_AudioFIFO_ISR1 
.endif 
 
.public _Snd_SACM_CodecTask 
.public _Snd_Init_ASM 
 
//============================================== 
//.external _hSndTaskQ	//guili 2005/07/20 
.external _hSndMailBox	//guili 2005/07/20 
.external _SndSem_Critical_Err 
.external _SndTask_unOS_Err 
.external _SndSACM_curPlayID 
.external _SndSACM_curCodec 
.external _SACM_Middle_StopTTS 
.external _PCMBufferFlag 
.external _CTTS_EndFlag 
.external F_SendPCMData 
 
.ifdef FAT 
.external _NFAT_DS_fodenum 
.endif 
//============================================== 
SndSACM_ROM_BLOCK:	.SECTION	.CODE 
//============================================== 
.ifdef C_SND_DVR_SUPPORT 
_Snd_SACM_AudioREC_ISR: .proc 
	push R1,R5 to [SP]; 
 
	call F_ISR_Service_SACM_Encode;	//clear Interrupt Flag in it 
	cmp R1,1		// R1 = Result 
	jne ?AudioREC_ISR_End; 
 
?AudioREC_ISR_Post: 
	//MM_unOSQPost	_hSndTaskQ,C_SNDTASK_SACM_ENCODE 
	MM_unOSMboxPost	_hSndMailBox,C_SNDTASK_SACM_ENCODE 
 
?AudioREC_ISR_End: 
	pop R1,R5 from [SP]; 
	retf; 
.endp 
.endif 
 
//============================================== 
_Snd_SACM_AudioFIFO_ISR: .proc 
	push R1,R5 to [SP]; 
 
	r1 = [P_CHA_Ctrl]	//clear interrupt 
	[P_CHA_Ctrl] = r1 
	r1 = [P_CHB_Ctrl] 
	[P_CHB_Ctrl] = r1 
//Add for CTTS PCM Data play: 
.ifdef C_SND_CTTS_SUPPORT 
	R1 = [R_CODEC_TYPE] 
	cmp R1, C_CODEC_CTTS 
	jne ?L_OtherCodec 
	call F_SendPCMData 
	cmp R1, 1 
	jne ?AudioFIFO_ISR_End 
	call _SACM_Middle_StopTTS 
.ifdef SND_CB_PLAYEND 
	call _Snd_onPlayEnd 
	jmp ?AudioFIFO_ISR_End 
.endif 
?L_OtherCodec: 
.endif 
 
	R1 = FR 			//2005/03/31,because S320 will change fraction 
	push R1 to [SP] 	//but '*gain,us' need fraction off,so save FR 
	FRACTION OFF 
	FIR_MOV OFF			//2005/03/31,because kernal need FIR_MOV OFF 
	call F_ISR_Service_SACM_Decode; 
	pop R2 from [SP] 	//2005/03/31 
	FR = R2 			//2005/03/31 
 
	cmp R1,2			// R1 = Result 
	jne ?AudioFIFO_ISR_Test; 
 
.ifdef SND_CB_PLAYEND 
	call _Snd_onPlayEnd 
.endif 
 
//--2005/09/21 added by mgl for close SP_WORD.200 and SP_WORD.320 and CTTS resource 
	r1 = [_SndSACM_curCodec] 
.ifdef C_SND_S200TTS_SUPPORT 
	cmp r1,C_CODEC_S200TTS 
	jnz ?L_S320TTSResClose 
.ifdef FAT 
	call _S200TTS1BIN_Access_End; 
	jmp ?L_ResClodeAll 
.endif 
?L_S320TTSResClose: 
.endif 
.ifdef C_SND_S320TTS_SUPPORT 
	cmp r1,C_CODEC_S320TTS 
	jnz ?L_CTTSResClose 
.ifdef TTS320FAT//FAT		//xiaolei modify 2006/03/02 
	call _S320TTS1BIN_Access_End; 
	jmp ?L_ResClodeAll 
.endif	//end define FAT 
?L_CTTSResClose: 
.endif 
 
?L_ResClodeAll: 
//---------------------- 
 
.ifdef C_SND_CTTS_SUPPORT 
	r1 = [_SndSACM_curCodec] 
	cmp r1,C_CODEC_CTTS 
	jz ?L_PlayIDResetSkip 
	cmp r1,C_CODEC_CTTS_ETTS 
	jz ?L_PlayIDResetSkip 
.endif 
 
.ifdef FAT 
	R1 = -1						//added by chengye 200/9/22 
	[_NFAT_DS_fodenum] = R1;	//GUILI 2005.11.30 
.endif 
 
	R1 = 0; 
	[_SndSACM_curPlayID] = R1;	// decoding end. 
?L_PlayIDResetSkip: 
	//jmp ?AudioFIFO_ISR_Post	//have already end,why post, 
	jmp ?AudioFIFO_ISR_End		//so direct end,mgl 2005/05/19 
 
?AudioFIFO_ISR_Test: 
 	R1 = [R_SACM_Play_Flag]; 
	test R1, C_SACM_DECODE_WORK;// Check if decoding 
	jz ?AudioFIFO_ISR_End 
 
	//r1 != 2, C_SACM_DECODE_WORK, decode 
?AudioFIFO_ISR_Post: 
//guili 2005/07/20	MM_unOSQPost	_hSndTaskQ,C_SNDTASK_SACM_DECODE 
r1=r1; 
	MM_unOSMboxPost	_hSndMailBox,C_SNDTASK_SACM_DECODE 
 
?AudioFIFO_ISR_End: 
	pop R1,R5 from [SP]; 
	retf; 
.endp 
 
//======================================================== 
//=========xiaolei add for AudioB Interrupt:2006/12/20==== 
.ifdef AUDIOBINTREGISTER 
_Snd_SACM_AudioFIFO_ISR1: .proc 
	r1 = [P_CHB_Ctrl] 
	[P_CHB_Ctrl] = r1 
	retf 
.endp 
.endif 
//=====================xiaolei add end 2006/12/20========= 
 
//============================================== 
_Snd_SACM_CodecTask: .proc 
 
?_SACM_CodecTask_loop: 
 
.ifdef LEDDEBUG 
	shiftLED; 			//Debug LED 
.endif 
//guili 2005/07/20	MY_unOSQPend	_hSndTaskQ,0,_SndTask_unOS_Err 
 
	MY_unOSMboxPend	_hSndMailBox,0,_SndTask_unOS_Err 
	R2 = R1 & 0x00ff 
?is_SACM_decode: 
	cmp R2, C_SNDTASK_SACM_DECODE 
	jne ?is_SACM_encode 
 
	r1 = fr 
	push R1 to [sp] 
	call _SACM_DECODE_ServiceLoop; 
	pop r1 from [sp] 
	fr = r1 
 
	goto ?_SACM_CodecTask_loop; 
 
?is_SACM_encode: 
.ifdef C_SND_DVR_SUPPORT 
	cmp R2, C_SNDTASK_SACM_ENCODE 
	jne ?others 
 
	call _SACM_ENCODE_ServiceLoop; 
	goto ?_SACM_CodecTask_loop; 
.endif 
?others: 
	goto ?_SACM_CodecTask_loop; 
	retf; 
.endp 
 
//============================================== 
_Snd_Init_ASM: .proc 
	call F_SACM_DisableAudioTimer	//20050124 cfwei, fix GGV startup code problem 
	call F_SACM_DisableDAC1		//20050126 cfwei 
	call F_SACM_DisableDAC2		//20050126 cfwei 
	retf 
.endp 
 
//============================================== 
//add by mgl 2005/03/15 for unOS changed start,those API have not in new OS lib 
.ifdef NOTCONDENSE		//xiaolei add for HanHai condense the Sound Code 
	.public _Snd_DisINTSrc_AUDIOA 
	.public _Snd_DisINTSrc_AUDIOB 
	.public _Snd_DisINTSrc_TIMERE 
	.public _Snd_DisINTSrc_TIMERF 
	 
	_Snd_DisINTSrc_AUDIOA:	.proc 
		__clrb	P_CHA_Ctrl,14,r1 
	.endp 
	 
	_Snd_DisINTSrc_AUDIOB:	.proc 
		__clrb	P_CHB_Ctrl,14,r1 
	.endp 
	 
	_Snd_DisINTSrc_TIMERE:	.proc 
		__clrb	P_TimerE_Ctrl,14,r1 
	.endp 
	 
	_Snd_DisINTSrc_TIMERF:	.proc 
		__clrb	P_TimerF_Ctrl,14,r1 
	.endp 
.endif 
//add by mgl 2005/03/15 for unOS changed end 
 
//============================================== 
 
//============================================== 
.ifdef LEDDEBUG 
shiftLED: .MACRO 
	R2 = [_shiftLED_iLED]; 
	R1 = [_shiftLED_LEDDir]; 
	jz ?shiftLED_R; 
	?shiftLED_L: 
	R2 = R2 lsl 1; 
	cmp R2, 0x0100; 
	jne ?shiftLED_End; 
	R2 = 0x0101; 
	jmp ?shiftLED_End; 
?shiftLED_R: 
	R2 = R2 lsr 1; 
	cmp R2, 0x0080; 
	jne ?shiftLED_End; 
	R2 = 0x8080; 
?shiftLED_End: 
 
	[_shiftLED_iLED] = R2; 
 
	R1 = 0XFFFF; 
	[P_IOA_Dir] = R1; 
	R1 = 0XFFFF; 
	[P_IOA_Attrib] = R1; 
	R1 = [_shiftLED_oLED]; 
	R1 ^= R2; 
	[P_IOA_Data] = R1; 
.ENDM 
.endif 
//========SndSACM.asm=========================== 
.ifdef MP3_TASK_TIMETEST 
 
.external _Timer_Count 
.public _TimerA_ISR_Service 
.public _Start_TimerA 
 
_TimerA_ISR_Service:.proc 
	R1 = [P_TimerA_Ctrl] 
	[P_TimerA_Ctrl] = R1 
	R1 = [_Timer_Count] 
	R2 = [_Timer_Count + 1] 
	R1 += 1 
	R2 += 0, Carry 
	[_Timer_Count] = R1 
	[_Timer_Count + 1] = R2 
	retf 
.endp 
 
_Start_TimerA:.proc 
	call _unOSIrqOff 
	push R1 to [sp] 
	R1 = 0xfffe 
	[P_TimerA_Preload] = R1 
	R1 = 0x6062 
	[P_TimerA_Ctrl] = R1 
	pop R1 from [sp] 
	call _unOSIrqOn 
	retf 
.endp 
 
.endif		//End of MP3_TASK_TIMETEST