#include #include #include .segment /dm seg_dmda; /* AD1836 stereo-channel data holders - used for DSP processing of audio data received from codec */ // input channels .var _Left_Channel_In0; /* Input values from the 2 AD1836 internal stereo ADCs */ .var _Left_Channel_In1; /* 1/8th inch stereo jack connected to internal stereo ADC1 */ .var _Right_Channel_In0; .var _Right_Channel_In1; .var _Left_Channel_SPDIF_rx; /* Input values from the DAR CS8414 */ .var _Right_Channel_SPDIF_rx; //output channels .var _Left_Channel_Out0; /* Output values for the 3 AD1836 internal stereo DACs */ .var _Left_Channel_Out1; /* Left and Right Channel 0 DACs go to headphone jack */ .var _Left_Channel_Out2; .var _Right_Channel_Out0; .var _Right_Channel_Out1; .var _Right_Channel_Out2; .var _Left_Channel_AD1852; /* Output values for AD1852 stereo DAC */ .var _Right_Channel_AD1852; .var _Left_Channel; /* Can use these variables as intermediate results to next filtering stage */ .var _Right_Channel; .global _Left_Channel_In0; .global _Left_Channel_In1; .global _Right_Channel_In0; .global _Right_Channel_In1; .global _Left_Channel_Out0; .global _Left_Channel_Out1; .global _Left_Channel_Out2; .global _Right_Channel_Out0; .global _Right_Channel_Out1; .global _Right_Channel_Out2; .global _Left_Channel_AD1852; .global _Right_Channel_AD1852; .global _Left_Channel_SPDIF_rx; .global _Right_Channel_SPDIF_rx; .extern _rx0a_buf; .extern _tx2a_buf; .extern _i; .extern _DelayLine; // bufor probek .endseg; .segment /pm seg_pmco; //############################################################# //####### procedura odczytująca próbki z wejścia AUDIO ######## //############################################################# _Receive_Samples: .global _Receive_Samples; /* get AD1836 left channel input samples, save to data holders for processing */ r1 = -31; r0 = dm(_rx0a_buf + Internal_ADC_L0); f0 = float r0 by r1; dm(_Left_Channel_In0) = f0; r0 = dm(_rx0a_buf + Internal_ADC_L1); f0 = float r0 by r1; dm(_Left_Channel_In1) = f0; //dm(_Right_Channel_In1) = r0; //R0 = ABS R0; r0 = dm(_rx0a_buf + AUX_ADC_L0); f0 = float r0 by r1; dm(_Left_Channel_SPDIF_rx) = r0; /* get AD1836 right channel input samples, save to data holders for processing */ r0 = dm(_rx0a_buf + Internal_ADC_R0); f0 = float r0 by r1; dm(_Right_Channel_In0) = f0; r0 = dm(_rx0a_buf + Internal_ADC_R1); f0 = float r0 by r1; dm(_Right_Channel_In1) = f0; r0 = dm(_rx0a_buf + AUX_ADC_R0); f0 = float r0 by r1; dm(_Right_Channel_SPDIF_rx) = r0; leaf_exit; _Receive_Samples.end: //############################################################## //####### procedura zapisaująca próbki na wyjścia AUDIO ######## //############################################################## _Transmit_Samples: .global _Transmit_Samples; r1 = 31; /* output processed left ch audio samples to AD1836 */ f0 = dm(_Left_Channel_Out0); r0 = trunc f0 by r1; dm(_tx2a_buf + Internal_DAC_L0) = r0; r0 = dm(_Left_Channel_Out1); r0 = trunc f0 by r1; dm(_tx2a_buf + Internal_DAC_L1) = r0; r0 = dm(_Left_Channel_Out2); r0 = trunc f0 by r1; dm(_tx2a_buf + Internal_DAC_L2) = r0; r0 = dm(_Left_Channel_AD1852); r0 = trunc f0 by r1; dm(_tx2a_buf + AUX_DAC_L0) = r0; /* output processed right ch audio samples to AD1836 */ f0 = dm(_Right_Channel_Out0); r0 = trunc f0 by r1; dm(_tx2a_buf + Internal_DAC_R0) = r0; r0 = dm(_Right_Channel_Out1); r0 = trunc f0 by r1; dm(_tx2a_buf + Internal_DAC_R1) = r0; r0 = dm(_Right_Channel_Out2); r0 = trunc f0 by r1; dm(_tx2a_buf + Internal_DAC_R2) = r0; r0 = dm(_Right_Channel_AD1852); r0 = trunc f0 by r1; dm(_tx2a_buf + AUX_DAC_R0) = r0; leaf_exit; _Transmit_Samples.end: //################################################################### //################ procedura przetwarzania dźwięku ################## //################################################################### _echo_ASM: .global _echo_ASM; BIT SET MODE1 SRD1L | SRD1H | SRD2L |SRD2H | SRRFL | SRRFH | SRCU ; // Activate alternate registers NOP; // Wait for access to alternates f0=dm(_Left_Channel_In1); //zapisanie próbki z mikrofonu do bufora kołowego dm(i0,m0)=f0; f1=dm(i1,m1); //opóznienie f2=dm(i2,m2); f5=0.7; f0=f1*f5; f5=0.3; f6=f2*f5; f0=f0+f6; dm(_Right_Channel_Out0)=f0; //prawy kanał dm(_Left_Channel_Out0)=f0; //lewy kanał BIT CLR MODE1 SRD1L | SRD1H | SRD2L |SRD2H | SRRFL | SRRFH | SRCU ; // przywróć podstawowy zestaw rejestrów NOP; // Wait for access to alternates leaf_exit; _echo_ASM.end: _init_echo_ASM: .global _init_echo_ASM; BIT SET MODE1 SRD1L | SRD1H | SRD2L |SRD2H | SRRFL | SRRFH | SRCU ; // Activate alternate registers NOP; // Wait for access to alternates r0=0x200000; // bufor probek B0=r0; B1=B0; B2=B0; r0=80000; //długość bufora L0=r0; L1=r0; L2=r0; M0=1; M1=M0; M2=1; I0=B0; R1=B0; R0=40000; //opóźnienie 40 tys. próbek = ok. 1 sekundy R0=R1+R0; I1=R0; R0=1; //opóźnienie 79999 próbek = ok. 2 sekundy R0=R1+R0; I2=R0; BIT CLR MODE1 SRD1L | SRD1H | SRD2L |SRD2H | SRRFL | SRRFH | SRCU ; // przywróć podstawowy zestaw rejestrów NOP; // Wait for access to alternates leaf_exit; _init_echo_ASM.end: .endseg;