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

📄 setup_evt.asm

📁 ADI BF DSP的CF卡的读写源码
💻 ASM
字号:

/************************************************************************************************/
/*	This routine sets up the EVT table and the interrupt service routines for IVG8 - SPORT0 RX	*/ 
/*	DMA interrupt, and IVG12 - PF interrupt A (PF4, PF6, and PF7).								*/
/*															  Last Modified 02-26-03.  H. Desai */
/************************************************************************************************/

#include <def21535.h>

.GLOBAL Setup_EVT;
.GLOBAL Roll_Over;
.EXTERN Process_AD1885_Audio_Samples;
.EXTERN RX_Status;
.EXTERN tx_buf;
.EXTERN rx_buf;
.EXTERN predac_buffer_rdptr;
.EXTERN predac_buffer;
.EXTERN Next_MP3;
.EXTERN MP3_Cluster_Ptr;
.EXTERN MP3_Startclusters;
.EXTERN MP3_END_Cluster_Ptr;

.SECTION program;

Setup_EVT:

// Setup Event Vectors and Handlers
	R0 = 0;
	p0.l = EVT0 & 0xffff;
	p0.h = EVT0 >> 16;
	r1 = _EHANDLER (Z);
	r1.h = _EHANDLER;  	// Emulation Handler (Int0)
      [ P0 ++ ] = R1;

    R0 = _RHANDLER (Z);
    R0.H = _RHANDLER;  	// Reset Handler (Int1)
      [ P0 ++ ] = R0;

    R0 = _NHANDLER (Z);
	R0.H = _NHANDLER;  	// NMI Handler (Int2)
      [ P0 ++ ] = R0;

    R0.L = _XHANDLER;
  	R0.H = _XHANDLER;  	// Exception Handler (Int3)
      [ P0 ++ ] = R0;
	
	[ P0 ++ ] = R0; 	// IVT4 isn't used

      R0 = _HWHANDLER (Z);
	R0.H = _HWHANDLER; 	// HW Error Handler (Int5)
      [ P0 ++ ] = R0;
	
      R0 = _THANDLER (Z);
	R0.H = _THANDLER;  	// Timer Handler (Int6)
      [ P0 ++ ] = R0;
	
      R0 = _RTCHANDLER (Z);
	R0.H = _RTCHANDLER; 	// IVG7 Handler
      [ P0 ++ ] = R0;

      R0 = _I8HANDLER (Z);
	R0.H = _I8HANDLER; 	// IVG8 Handler
      [ P0 ++ ] = R0;

      R0 = _I9HANDLER (Z);
	R0.H = _I9HANDLER; 	// IVG9 Handler
      [ P0 ++ ] = R0;

      R0 = _I10HANDLER (Z);
	R0.H = _I10HANDLER;// IVG10 Handler
      [ P0 ++ ] = R0;

      R0 = _I11HANDLER (Z);
	R0.H = _I11HANDLER;// IVG11 Handler
      [ P0 ++ ] = R0;

      R0 = _I12HANDLER (Z);
	R0.H = _I12HANDLER;// IVG12 Handler
      [ P0 ++ ] = R0;

      R0 = _I13HANDLER (Z);
	R0.H = _I13HANDLER;// IVG13 Handler
      [ P0 ++ ] = R0;

      R0 = _I14HANDLER (Z);
	R0.H = _I14HANDLER;// IVG14 Handler
      [ P0 ++ ] = R0;

      R0 = _I15HANDLER (Z);
	R0.H = _I15HANDLER;// IVG15 Handler
      [ P0 ++ ] = R0;

	P0.L = EVT_OVERRIDE & 0xffff;  // added in to address anomaly 20 for rev 0.1 ADSP-21535 silicon
	P0.H = EVT_OVERRIDE >> 16;
   	R0 = 0;
   	[ P0  ] = R0;
   	
   	//SP.H = 0xF003;					//Set up supervisor stack
	//SP.L = 0xFFDC;
	P0.L = EVT15 & 0xFFFF;		//Point to IVG15 in Event Vector Table		
	P0.H = (EVT15 >> 16) & 0xFFFF;
	P1.L = START;					//Point to start of  code	
	P1.H = START;
	[P0] = P1;						//Place the address of start code in IVG15 of EVT
	P0.L = IMASK & 0xFFFF;
	R0 = W[P0];
	R1.L = EVT_IVG15 & 0xFFFF;
	R0 = R0 | R1;
	W[P0] = R0;						//Set(enable) IVG15 bit in FCIC Interrupt Mask Register
	RAISE 15;						//Invoke IVG15 interrupt
	P0.L = WAIT_HERE;
	P0.H = WAIT_HERE;
	RETI = P0;
	nop;
	nop;
	nop;
	nop;
	RTI;							//Return from Reset Interrupt

	WAIT_HERE:						//Wait here till IVG15 interrupt is processed
		JUMP WAIT_HERE;
/********************************************************************************************/

START:
	[--SP] = RETI;					//RETI must be pushed to enable interrupts.  Boot code in supervisor mode starts here.
	R0 = [SP++];

RTS;
   	
_EHANDLER:            // Emulation Handler 0
    RTE;

_RHANDLER:            // Reset Handler 1
    RTI;

_NHANDLER:            // NMI Handler 2
	RTN;

_XHANDLER:            // Exception Handler 3
    RTX;

_HWHANDLER:           // HW Error Handler 5
    RTI;

_THANDLER:            // Timer Handler 6
	RTI;

_RTCHANDLER:           // IVG 7 Handler  (RTC)
	RTI;

_I8HANDLER:           // IVG 8 Handler
	[--SP] = ASTAT;
	[--SP] = RETS;
	[--SP] = (r7:0);
	[--SP] = (p5:0);
	[--SP] = I0;
	[--SP] = L0;
	[--SP] = B0;
		
	R0 = 0x10;//LENGTH(rx_buf);
	p0.l = SPORT0_COUNT_RX & 0xFFFF;
	p0.h = (SPORT0_COUNT_RX >> 16) & 0xFFFF;
	R1 = W[p0];
	R0 = R0 - R1;
	R1 = 0x0(Z);
	CC = R0 == R1;
	IF !CC jump Roll_Over;

	//R0.l = 0x8000;
	R0 = 0x8000(Z);
	p0.l = RX_Status;
	p0.h = RX_Status;
	r1 = w[p0](Z);
	//R0 = R0 & R1;
	CC = R0 == R1;
    IF CC jump Roll_Over;
	jump Process_AD1885_Audio_Samples;

Roll_Over:
	R0 = 0x0007(Z);			// Clear RX Interrupts
	P0.L = SPORT0_IRQSTAT_RX & 0xFFFF;
	P0.H = (SPORT0_IRQSTAT_RX >> 16) & 0xFFFF;
	W[p0] = R0;
	
	B0 = [SP++];
	L0 = [SP++];
	I0 = [SP++];
	(p5:0) = [SP++];  		// Restore Regs
	(r7:0) = [SP++];
	RETS = [SP++];
	ASTAT = [SP++];
	RTI;

_I9HANDLER:           // IVG 9 Handler
    RTI;

_I10HANDLER:          // IVG 10 Handler
    RTI;

_I11HANDLER:          // IVG 11 Handler
    RTI;

_I12HANDLER:          // IVG 12 Handler
	[--SP] = ASTAT;
	[--SP] = RETS;
	[--SP] = (r7:0);
	[--SP] = (p5:0);
	
	P0.H = FIO_FLAG_C >> 16;		//Determine which PFx interrupt came in
	P0.L = FIO_FLAG_C & 0xFFFF;
	R0 = W[P0];
	CC = BITTST(R0,7);
	IF CC JUMP PF7_INT;				//Jump to PF7_INT for 'NEXT MP3 SONG'
	CC = BITTST(R0,4);
	IF CC JUMP PF4_INT;				//Jump to PF4_INT for 'RESTART CURRENT SONG'
	CC = BITTST(R0,5);
	IF CC JUMP PF5_INT;
	
PF6_INT:							//STOP
	R0.L = 0x0040;
	W[P0] = R0.L;					//Clear PF6 interrupt
		
	Stop:
		R0 = W[P0];
		cc = BITTST(R0,5);
		IF !cc JUMP Stop;			//Wait here until PF5 (PLAY) is pressed
	JUMP RETURN;

PF7_INT:							//NEXT MP3 SONG
	R0.L = 0x0080;
	W[P0] = R0.L;					//Clear PF7 interrupt

	P0.H = Next_MP3;
	P0.L = Next_MP3;
	RETI = P0;
	JUMP RETURN;
	
PF4_INT:							//RESTART CURRENT SONG
	R0.L = 0x0010;
	W[P0] = R0.L;					//Clear PF4 interrupt
	
	P0.H = MP3_Cluster_Ptr;
	P0.L = MP3_Cluster_Ptr;
	P1 = [P0];						//P1 = NEXT MP3 SONG
	P2.H = MP3_Startclusters;
	P2.L = MP3_Startclusters;
	CC = P1 == P2;					//Check if the NEXT MP3 SONG ptr points to the beginning of the buffer
	IF !CC JUMP NOT_LAST_SONG;
	P2.H = MP3_END_Cluster_Ptr;
	P2.L = MP3_END_Cluster_Ptr;
	P1 = [P2];						//Point to the LAST MP3 SONG (+ 2)
	
NOT_LAST_SONG: 
	P1 += -2;						//P1 = CURRENT SONG
	[P0] = P1;
	
	P0.H = Next_MP3;
	P0.L = Next_MP3;
	RETI = P0;						//Set return vector to 'Next_MP3'
	JUMP RETURN;
	
PF5_INT:
	R0.L = 0x0020;
	W[P0] = R0.L;					//Clear PF5 interrupt
	
	P0.H = rx_buf;
	P0.L = rx_buf;
	R0 = W[P0](Z);
	CC = BITTST(R0,15);
	IF !CC JUMP RETURN;				//Check if we have a valid receive tag
	
	P0.H = VOL;
	P0.L = VOL;
	R0 = W[P0](Z);
	R1 = 0x0808(Z);
	R0 = R0 + R1;
	R2 = 0x1F1F;
	CC = R0 < R2;
	IF CC JUMP UNDER_MAX_VOL_ATTEN;
	R0 = 0x0404;
	
UNDER_MAX_VOL_ATTEN:
	W[P0] = R0;						//Save of Volume Attenuation
	P0.H = tx_buf;
	P0.L = tx_buf;
	W[P0+4] = R0;					//Head Volume Value
	R0 = 0xE000(Z);
	W[P0] = R0;						//TAG = 0xE000:  TAG, COMMAND ADDRESS, COMMAND VALUE
	R0 = 0x0400;
	W[P0+2] = R0;					//Head Volume Address
	
	JUMP RETURN;
	
RETURN:
	(p5:0) = [SP++];  				//Restore Regs
	(r7:0) = [SP++];
	RETS = [SP++];
	ASTAT = [SP++];
	
	RTI;

_I13HANDLER:		// IVG 13 Handler
    RTI;

_I14HANDLER:
    RTI;

_I15HANDLER:
    RTI;
    
.ALIGN 4;
.VAR COUNTER = 0x0;
.BYTE2 VOL = 0x0000;

⌨️ 快捷键说明

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