📄 sacmv32.asm
字号:
.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 + -