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

📄 sacmv32.asm

📁 电子词典的设计开发
💻 ASM
📖 第 1 页 / 共 3 页
字号:
        
        .if BODY_TYPE == SPCE061A
        R1 = [P_INT_Mask]		//
        .endif
   //     .if BODY_TYPE == SPCE500A
  //      R1 = [R_InterruptStatus]		//
  //      .endif 
        
        R1 |= C_FIQ_TMA					// Enable Timer A FIQ
    //    [R_InterruptStatus] = R1		//
        [P_INT_Ctrl] = R1				//
        RETF

//----------------------------------------------------
// S200
//----------------------------------------------------
//////////////////////////////////////////////////////////////////
// Function: The partial code of hardware setting of SACM_S200_Initial() 
//			or F_SACM_S200_Initial:
//////////////////////////////////////////////////////////////////       

F_SP_SACM_S200_Init_:

 		//R1 = 0X0098; // Set CPU Clock=Fosc (49Mhz)
 		R1 = C_SystemClock;  // 24.576MHz
 		[P_SystemClock] = R1;
 		R1 = 0X0230; // source =FOSC/2, PWMO 8/16
 		[P_TimerA_Ctrl] = R1;
 		//R1 = 0XFa00; // Sample rate = 32khz
 		R1= C_S200_Timer_Setting; // 24kHz
 		[P_TimerA_Data] = R1;

 		//R1 = 0X2000; // FIQ TMA
 		//[P_INT_Ctrl] = R1;
        .if BODY_TYPE == SPCE061A
        R1 = [P_INT_Mask]		//
        .endif
    //    .if BODY_TYPE == SPCE500A
   //     R1 = [R_InterruptStatus]		//
   //     .endif 
        
        R1 |= C_FIQ_TMA					// Enable Timer A FIQ
   //     [R_InterruptStatus] = R1		//
        [P_INT_Ctrl] = R1				//
        RETF
 RETF;
 
 
//----------------------------------------------------
// MS01
//----------------------------------------------------
//////////////////////////////////////////////////////////////////
// Function: The partial code of hardware setting of SACM_MS01_Initial() 
//			or F_SACM_MS01_Initial:
//
//	Ex: F_SACM_MS01_Initial:
//			...
//			call F_SP_SACM_MS01_Init_
//			call F_SP_Play_Mode0/1/2/3	->0,1,2,3 depending on the para1
//			...
//			retf
//////////////////////////////////////////////////////////////////
F_SP_SACM_MS01_Init_:	
		R1 = C_SystemClock;                    // 24MHz, Fcpu=Fosc
        [P_SystemClock] = R1;        	// Initial System Clock
        R1 = 0x0030;                    // TimerA CKA=Fosc/2 CKB=1 Tout:off
        [P_TimerA_Ctrl] = R1			// Initial Timer A
        R1 = 0x0003
        [P_TimerB_Ctrl] = R1;
        R1 = 0xFFFF 					// Any time for ADPCM channel 0,1
        [P_TimerB_Data] = R1			// Initial Timer B -> 8192	
        
		R1 = 0xffff
        [P_INT_Clear] = R1          	// Clear interrupt occuiped events
        RETF

//........................................
F_SP_PlayMode0_:						// with F_SP_SACM_MS01_Initial
		R1 = 0x0006
        [P_DAC_Ctrl] = R1
        //R1 = 0xFE00
        R1 = C_Timer_Setting_24K_For_49MHz
        [P_TimerA_Data] = R1 			//
        
        .if BODY_TYPE == SPCE061A
        R1 = [P_INT_Mask]		//
        .endif
    //    .if BODY_TYPE == SPCE500A
   //     R1 = [R_InterruptStatus]		//
   //     .endif 
        R1 |= C_FIQ_PWM+C_IRQ2_TMB+C_IRQ4_1KHz
        //R1 = C_FIQ_PWM+C_IRQ2_TMB+C_IRQ4_1KHz
   //     [R_InterruptStatus] = R1 		//
        [P_INT_Ctrl] = R1				//
        RETF

F_SP_PlayMode1_:						// with F_SP_SACM_MS01_Initial
		R1 = 0x00A8
        [P_DAC_Ctrl] = R1
        //R1 = 0xFE00
        R1 = C_Timer_Setting_24K_For_49MHz
        [P_TimerA_Data] = R1 			//
        
        .if BODY_TYPE == SPCE061A
        R1 = [P_INT_Mask]		//
        .endif
  //      .if BODY_TYPE == SPCE500A
   //     R1 = [R_InterruptStatus]		//
  //      .endif 
        
        //R1 = C_FIQ_TMA+C_IRQ2_TMB+C_IRQ4_1KHz
        R1 |= C_FIQ_TMA+C_IRQ2_TMB+C_IRQ4_1KHz        
   //     [R_InterruptStatus] = R1 		//
        [P_INT_Ctrl] = R1				//
        RETF


F_SP_PlayMode2_:	 						// with F_SP_SACM_MS01_Initial
		R1 = 0x00A8
        [P_DAC_Ctrl] = R1
        //R1 = 0xFD9A
        R1=C_Timer_Setting_20K_For_49MHz
        [P_TimerA_Data] = R1 				//
        
        .if BODY_TYPE == SPCE061A
        R1 = [P_INT_Mask]		//
        .endif
  //      .if BODY_TYPE == SPCE500A
  //      R1 = [R_InterruptStatus]		//
  //      .endif 
        
        //R1 = C_FIQ_TMA+C_IRQ2_TMB+C_IRQ4_1KHz
        R1 |= C_FIQ_TMA+C_IRQ2_TMB+C_IRQ4_1KHz        
   //     [R_InterruptStatus] = R1 			//
        [P_INT_Ctrl] = R1					//
        RETF

      
F_SP_PlayMode3_:							// with F_SP_SACM_MS01_Initial
		R1 = 0x00A8
        [P_DAC_Ctrl] = R1
        R1 = C_Timer_Setting_16K_For_49MHz;
        [P_TimerA_Data] = R1 			//
        
        .if BODY_TYPE == SPCE061A
        R1 = [P_INT_Mask]		//
        .endif
  //      .if BODY_TYPE == SPCE500A
  //      R1 = [R_InterruptStatus]		//
  //      .endif 
        
        //R1 = C_FIQ_TMA+C_IRQ2_TMB+C_IRQ4_1KHz
        R1 |= C_FIQ_TMA+C_IRQ2_TMB+C_IRQ4_1KHz        
//	    [R_InterruptStatus] = R1 		//
        [P_INT_Ctrl] = R1				//
        RETF


//--------------------------------------------------------------------
//-- Function: F_SP_IRQ2_ON
//-- Parameter: NONE
//-- Return: NONE
//-- Description: This function called by library to turn on IRQ2 
//--------------------------------------------------------------------
.public F_SP_IRQ2_ON
F_SP_IRQ2_ON:
		//------------------------------------------
		// By Arthur 01/16/2003 (123)
		//------------------------------------------
		.if BODY_TYPE == SPCE061A
        R1 = [P_INT_Mask]		//
        .endif
    //    .if BODY_TYPE == SPCE500A
   //     R1 = [R_InterruptStatus]		//
   //     .endif       
		//------------------------------------------	
        r1 |= C_IRQ2_TMB ;
   //     [R_InterruptStatus] = r1;				//
        [P_INT_Ctrl] = R1
retf
//--------------------------------------------------------------------
//-- Function: F_SP_IRQ2_OFF
//-- Parameter: NONE
//-- Return: NONE
//-- Description: This function called by library to turn off IRQ2 
//--------------------------------------------------------------------
.public F_SP_IRQ2_OFF
F_SP_IRQ2_OFF:
		//------------------------------------------
		// By Arthur 01/16/2003 (123)
		//------------------------------------------
		.if BODY_TYPE == SPCE061A
        R1 = [P_INT_Mask]		//
        .endif
   //     .if BODY_TYPE == SPCE500A
   //     R1 = [R_InterruptStatus]		//
   //     .endif       
		//------------------------------------------	
        r1 &= ~C_IRQ2_TMB ;
   //     [R_InterruptStatus] = r1;				//
        [P_INT_Ctrl] = R1
retf
//--------------------------------------------------------------------
//-- Function: F_SP_Send_DAC1
//-- Parameter: R4 = audio out data
//-- Return: NONE
//-- Description: This function called by library to send audio data to 
//                DAC1
//--------------------------------------------------------------------
.public F_SP_Send_DAC1
F_SP_Send_DAC1:
		[P_DAC1] = R4
		retf
//--------------------------------------------------------------------
//-- Function: F_SP_Send_DAC2
//-- Parameter: R4 = audio out data
//-- Return: NONE
//-- Description: This function called by library to send audio data to 
//                DAC1
//--------------------------------------------------------------------
.public F_SP_Send_DAC2
F_SP_Send_DAC2:
		[P_DAC2] = R4
		retf
/////////////////////////////////////////////////////////


	
//----------------------------------------------------
// DVR
//----------------------------------------------------
///////////////////////////////////////////////////////////////////////////////
// Function: The partial code of hardware setting of SACM_MS01_Initial() 
//			or F_SACM_MS01_Initial:
//
//	Ex: F_SACM_DVR_Initial:
//			...
//			call F_SP_SACM_DVR_Init_
//			call F_SP_Play_Mode0/1/2/3	->0,1,2,3 depending on the para1
//			...
//			retf
//	Ex1:
//		F_SACM_DVR_Record: (or F_SACM_DVR_InitEncoder)
//			...
//			call F_SP_SACM_DVR_Rec_Init
//			...
//			retf
//	Ex2:
//		F_SACM_DVR_Play: (or F_SACM_DVR_InitDecoder)
//			...
//			call F_SP_SACM_DVR_Play_Init_
//			...
//			retf
///////////////////////////////////////////////////////////////////////////////
F_SP_SACM_DVR_Init_:
        r1 = C_SystemClock;             // 24MHz, Fcpu=Fosc
        [P_SystemClock] = r1;           //  Frequency 20MHz
        r1 = 0x0030;                    // TimerA CKA=Fosc/2 CKB=1 Tout:off
        [P_TimerA_Ctrl] = r1;
        r1 = C_DVR_Timer_Setting;       // 8K @ 24.576MHz
        //r1 = 0xfb1d;                  // 8K @ 20MHz
        [P_TimerA_Data] = r1;
       //
       //SPCE500A setting
       // --------------------------
       .if BODY_TYPE == SPCE500A       
		R1=0x0015;	// 500A: MIC IN, Auto,AGC,Enable ADC
//		R1=0x0011;	// 500A: MIC IN, Auto ,Enable ADC
//	    R1=0x0013;	// 500A: LINE IN, Auto,Enable ADC       
        [P_ADC_Ctrl] = r1;
        r1 = 0x00AC;                    // DAC1-TMA, DAC2-TMA, ADC-TMA  
        [P_DAC_Ctrl] = r1;
        
        r1 = 0xffff;
        [P_INT_Clear] = r1;          	// Clear interrupt occuiped events

   //     R1 = [R_InterruptStatus]		//
    
        R1 |= C_FIQ_TMA					// Enable Timer A FIQ
    //    [R_InterruptStatus] = R1		//
        [P_INT_Ctrl] = R1				//
        .endif 
       
       // 
       // SPCE061A Setting   
       // --------------------------
       .if BODY_TYPE == SPCE061A  
        r1 = 0x0115;  // 061A: MIC IN, AGC,Enable ADC 
//      r1 = 0x0101;  // 061A: MIC IN, Enable ADC      
//      r1 = 0x0103;  // 061A: LINE IN, Enable ADC              
     
        [P_ADC_Ctrl] = r1;
        
		R1=0x0000					// Mic
//		R1 = 0x0001      			// Line_in 1
        [P_ADC_MUX_Ctrl] = R1
//      R1=[P_ADC_LINEIN_Data]; 
        
 //      r1 = 0x00A8;                    // 061A: DAC1-TMA, DAC2-TMA, ADC-TMA     
        r1 = 0x00A0;                    // 061A: DAC1-TMA, DAC2-TMA, ADC-Direct   
        [P_DAC_Ctrl] = r1;
        
        r1 = 0xffff;
        [P_INT_Clear] = r1;          	// Clear interrupt occuiped events
 
        R1 = [P_INT_Mask]		//
    
        R1 |= C_FIQ_TMA					// Enable Timer A FIQ
   //     [R_InterruptStatus] = R1		//
        [P_INT_Ctrl] = R1				//
        R1=[P_ADC]
        R1=[P_ADC_LINEIN_Data]  
       .endif       
        RETF




//--------------------------------------------------------------------
//-- Function: F_SP_SACM_DVR_Rec_Init_
//-- Parameter: NONE
//-- Return: NONE
//-- Description: This function called by library to set  
//                ADC and sampling rate for recording. 
//                Uaser would have to modified the function body 
//                based on the need to fulfill this request from 
//                library. 
//--------------------------------------------------------------------
F_SP_SACM_DVR_Rec_Init_:				// call by SACM_DVR_Record / SACM_DVR_InitEncoder
               	
        R1 = C_DVR_Rec_Timer_Setting    //24K @ 24.576/49.152 MHz
        [P_TimerA_Data] = r1 
		RETF
//--------------------------------------------------------------------
//-- Function: F_SP_SACM_DVR_Play_Init_
//-- Parameter: NONE
//-- Return: NONE
//-- Description: This function called by library to set  
//                ADC and sampling rate for playback. 
//                Uaser would have to modified the function body 
//                based on the need to fulfill this request from 
//                library. 
//--------------------------------------------------------------------
F_SP_SACM_DVR_Play_Init_:
	    r1 = 0x0000						// call by SACM_DVR_Stop / SACM_DVR_Play
        [P_ADC_Ctrl] = r1;       		// Disable ADC
        	
        R1 = C_DVR_Play_Timer_Setting   // 16K @ 24.576/49.152 MHz
        [P_TimerA_Data] = r1;
        RETF

//--------------------------------------------------------------------
//-- Function: F_SP_GetADC
//-- Parameter: R1 = ADC Channel
//-- Return: R1 = ADC data
//-- Description: This function called by library to get  
//                ADC data for recording. It can be from either Microphone
//                or line-in.
//                User would have to modified the function body 
//                based on the need to fulfill this request from 
//                library. 
//                User should store the value in register(R2-R5)if use them. 
//--------------------------------------------------------------------
.public F_SP_GetADC
F_SP_GetADC:
        
        cmp R1,0;
        jnz ?L_WaitLinIn;
		//For Mic
		?L_Mic:
		r1 = [P_ADC]  // from 500A/061A microphone or 500A Lin-in
        retf
		
		// For Line in
		?L_WaitLinIn:  // Wait for ADC ready    		
		.if BODY_TYPE == SPCE500A    
		r1 = [P_ADC] ; // from 500A/061A microphone or 500A Lin-in
        .endif		
        		 
		.if BODY_TYPE == SPCE061A    
        R1 = [P_ADC_MUX_Ctrl] 
        R1 &= 0x8000
        jz ?L_WaitLinIn;	
		r1 = [P_ADC_LINEIN_Data]  // from 061A line-in only
        .endif
        retf

//---------------------------------------------------------------
//Function : F_SP_SwitchChannel
//Description: This function switches the A/D channel based on 
//             the parameter. 
//Used register: r1
//Return: none
//---------------------------------------------------------------
.PUBLIC F_SP_SwitchChannel
F_SP_SwitchChannel: .proc
 push R2 to [sp]
 //
 // SPCE500A Setting
 //
  .if BODY_TYPE == SPCE500A
 // Check if microphone selected
 cmp R1,0;
 jnz ?L_LineIn;
 
 // Wait for ADC ready
 ?L_Wait_AD_ready_0:
   R1=0x0015;	// 500A: MIC IN, Auto,AGC,Enable ADC
   [P_ADC_Ctrl] = r1;
    jmp ?L_Done;
 
 // Wait for ADC ready
 ?L_LineIn:	
   R1=0x0013;	// 500A: LINE IN, Auto,Enable ADC       
   [P_ADC_Ctrl] = r1;
 
 ?L_Done:
 .endif
 //
 // SPCE500A Setting
 //
 .if BODY_TYPE == SPCE061A
 // Check if microphone selected
 cmp R1,0;
 jnz ?L_LineIn;
 
 // Wait for ADC ready
 ?L_Wait_AD_ready_0:
 r2 = [P_ADC_Status];
 r2 = r2 & 0x8000;
 jz  ?L_Wait_AD_ready_0
 r2 = 0x0115;  // 061A: Mic, Enable ADC              
 [P_ADC_Ctrl] = r2; 
 [P_ADC_MUX_Ctrl] = R1; // Switch channel to Mic
 R2 = [P_ADC]
 jmp ?L_Done;
 
 // Wait for ADC ready
 ?L_LineIn:	
 ?L_Wait_AD_ready_1:
 r2 = [P_ADC_Status];
 r2 = r2 & 0x8000;
 jz  ?L_Wait_AD_ready_1
   
 r2 = 0x0113;  // 061A: LINE IN, Enable ADC              
 [P_ADC_Ctrl] = r2; 
 
 [P_ADC_MUX_Ctrl] = R1; // Switch channel to Line_in
 R2 = [P_ADC_LINEIN_Data]; 
 
 ?L_Done:
 .endif
 pop R2 from [sp];
 retf;

.ENDP
///////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
// Functions: Reserve old defintion
// Note: Some user who use old library may use the old name
//////////////////////////////////////////////////////////////////
.DEFINE F_RampUpDAC1 F_SP_RampUpDAC1
.DEFINE F_RampDnDAC1 F_SP_RampDnDAC1
.DEFINE F_RampUpDAC2 F_SP_RampUpDAC2
.DEFINE F_RampDnDAC2 F_SP_RampDnDAC2

.DEFINE _STD_RampUpDAC1 _SP_RampUpDAC1
.DEFINE _STD_RampDnDAC1 _SP_RampDnDAC1
.DEFINE _STD_RampUpDAC2 _SP_RampUpDAC2
.DEFINE _STD_RampDnDAC2 _SP_RampDnDAC2
                
//========================================================================================        
// End of sacmv32.asm
//========================================================================================



        
        
        

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -