📄 setup_evt.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 + -