📄 sharc_hd.asm
字号:
/* This file contains the interrupt table for the ADSP-21060 */
/* When the C program exits either by returning from main() or by an */
/* explicit or implicit call to exit(), control will transfer to the */
/* label ___lib_prog_term. Currently, the ___lib_prog_term label is */
/* defined at the end of the reset vector as an IDLE instruction. */
/* If your application needs to perform some operation AFTER the C */
/* program has finished executing, remove the ___lib_prog_term label */
/* from the runtime header, and place it at the beginning of your */
/* code. */
/* Done by AS on 6/94 to adapt to new fast/super fast dispatchers written */
/* modified for 21062 EZ-LAB and MAFE play/record (1 channel)
and updated for version 3.1 tools by P. Embree 1-15-95 */
#include <def21060.h>
#include <asm_sprt.h>
#include "rtdsp.h"
#define SPORT0_CHANNELS 16
#define SPORT0_BITS 16
#define DMA_CHANNELS 3
/* sample buffers for audio */
.SEGMENT/DM seg_dmda;
.GLOBAL tx_buf0,rx_buf0;
.EXTERN _ezset;
.VAR tx_buf0[DMA_CHANNELS]= 0xc000, 0x0000, 0x0000; /* initially set MCE */
.VAR rx_buf0[DMA_CHANNELS]; /* Status + L data + R data */
#define out_audio_l (tx_buf0+1)
#define out_audio_r (tx_buf0+2)
#define in_audio_l (rx_buf0+1)
#define in_audio_r (rx_buf0+2)
.VAR _play_fifo[FIFO_LENGTH];
.VAR _record_fifo[FIFO_LENGTH];
.VAR save_astat,save_mode1;
.ENDSEG;
.GLOBAL _play_fifo;
.GLOBAL _record_fifo;
.GLOBAL ___lib_prog_term; /*Termination address */
.EXTERN ___lib_setup_c;
.SEGMENT/PM seg_rth; /*Runtime header segment*/
NOP;NOP;NOP;NOP; /*Reserved interrupt */
___lib_RSTI: NOP; /* Not really executed */
CALL ___lib_setup_c; /* Setup C runtime model*/
JUMP _ez_main; /* Begin C program */
___lib_prog_term: JUMP ___lib_prog_term; /* Stay at this label */
NOP;NOP;NOP;NOP; /*Reserved interrupt */
/* Interrupt vector for status stack/loop stack overflow or PC stack full: */
___lib_SOVFI: BIT CLR MODE1 0x1000; /*Disable interrupts */
JUMP ___z3_int_determiner (DB); /*jmp to finish setting up*/
DM(I7,M7)=I15; /*Save I15 (scratch reg)*/
I15=___lib_int_table+3*6; /*Base of int table */
/* Interrupt vector for high priority timer interrupt: toggle FLG2 */
___lib_TMZHI: BIT CLR MODE1 0x1000; /*Disable interrupts */
JUMP timer_irq;
NOP;
NOP;
/* Interrupt vector for external interrupts:*/
___lib_VIRPTI: BIT CLR MODE1 0x1000; /*Disable interrupts */
JUMP ___z3_int_determiner (DB); /*jmp to finish setting up*/
DM(I7,M7)=I15; /*Save I15 (scratch reg)*/
I15=___lib_int_table+5*6; /*Base of int table */
___lib_IRQ2I: BIT CLR MODE1 0x1000; /*Disable interrupts */
JUMP ___z3_int_determiner (DB); /*jmp to finish setting up*/
DM(I7,M7)=I15; /*Save I15 (scratch reg)*/
I15=___lib_int_table+6*6; /*Base of int table */
___lib_IRQ1I: BIT CLR MODE1 0x1000; /*Disable interrupts */
JUMP button_irq;
NOP;
NOP;
___lib_IRQ0I: BIT CLR MODE1 0x1000; /*Disable interrupts */
JUMP ___z3_int_determiner (DB); /*jmp to finish setting up*/
DM(I7,M7)=I15; /*Save I15 (scratch reg)*/
I15=___lib_int_table+8*6; /*Base of int table */
NOP;NOP;NOP;NOP; /*Reserved interrupt */
/* Interrupt vectors for Serial port DMA channels: */
___lib_SPR0I:
JUMP rx0_irq (DB); /*jmp to irq routine */
DM(save_astat)=astat;
DM(save_mode1)=mode1;
nop;
___lib_SPR1I: BIT CLR MODE1 0x1000; /*Disable interrupts */
JUMP ___z3_int_determiner (DB); /*jmp to finish setting up*/
DM(I7,M7)=I15; /*Save I15 (scratch reg)*/
I15=___lib_int_table+11*6; /*Base of int table */
___lib_SPT0I:
JUMP tx0_irq (DB); /*jmp to finish setting up*/
nop;
nop;
nop;
___lib_SPT1I: BIT CLR MODE1 0x1000; /*Disable interrupts */
JUMP ___z3_int_determiner (DB); /*jmp to finish setting up*/
DM(I7,M7)=I15; /*Save I15 (scratch reg)*/
I15=___lib_int_table+13*6; /*Base of int table */
/* Interrupt vectors for link port DMA channels: */
___lib_LP2I: BIT CLR MODE1 0x1000; /*Disable interrupts */
JUMP ___z3_int_determiner (DB); /*jmp to finish setting up*/
DM(I7,M7)=I15; /*Save I15 (scratch reg)*/
I15=___lib_int_table+14*6; /*Base of int table */
___lib_LP3I: BIT CLR MODE1 0x1000; /*Disable interrupts */
JUMP ___z3_int_determiner (DB); /*jmp to finish setting up*/
DM(I7,M7)=I15; /*Save I15 (scratch reg)*/
I15=___lib_int_table+15*6; /*Base of int table */
/* Interrupt vectors for External port DMA channels: */
___lib_EP0I: BIT CLR MODE1 0x1000; /*Disable interrupts */
JUMP ___z3_int_determiner (DB); /*jmp to finish setting up*/
DM(I7,M7)=I15; /*Save I15 (scratch reg)*/
I15=___lib_int_table+16*6; /*Base of int table */
___lib_EP1I: BIT CLR MODE1 0x1000; /*Disable interrupts */
JUMP ___z3_int_determiner (DB); /*jmp to finish setting up*/
DM(I7,M7)=I15; /*Save I15 (scratch reg)*/
I15=___lib_int_table+17*6; /*Base of int table */
___lib_EP2I: BIT CLR MODE1 0x1000; /*Disable interrupts */
JUMP ___z3_int_determiner (DB); /*jmp to finish setting up*/
DM(I7,M7)=I15; /*Save I15 (scratch reg)*/
I15=___lib_int_table+18*6; /*Base of int table */
___lib_EP3I: BIT CLR MODE1 0x1000; /*Disable interrupts */
JUMP ___z3_int_determiner (DB); /*jmp to finish setting up*/
DM(I7,M7)=I15; /*Save I15 (scratch reg)*/
I15=___lib_int_table+19*6; /*Base of int table */
/* Interrupt vector for Link service request */
___lib_LSRQ: BIT CLR MODE1 0x1000; /*Disable interrupts */
JUMP ___z3_int_determiner (DB); /*jmp to finish setting up*/
DM(I7,M7)=I15; /*Save I15 (scratch reg)*/
I15=___lib_int_table+20*6; /*Base of int table */
/* Interrupt vector for DAG1 buffer 7 circular buffer overflow */
___lib_CB7I: BIT CLR MODE1 0x1000; /*Disable interrupts */
JUMP ___z3_int_determiner (DB); /*jmp to finish setting up*/
DM(I7,M7)=I15; /*Save I15 (scratch reg)*/
I15=___lib_int_table+21*6; /*Base of int table */
/* Interrupt vector for DAG2 buffer 15 circular buffer overflow */
___lib_CB15I: BIT CLR MODE1 0x1000; /*Disable interrupts */
JUMP ___z3_int_determiner (DB); /*jmp to finish setting up*/
DM(I7,M7)=I15; /*Save I15 (scratch reg)*/
I15=___lib_int_table+22*6; /*Base of int table */
/* Interrupt vector for lower priority timer interrupt */
___lib_TMZLI: BIT CLR MODE1 0x1000; /*Disable interrupts */
JUMP ___z3_int_determiner (DB); /*jmp to finish setting up*/
DM(I7,M7)=I15; /*Save I15 (scratch reg)*/
I15=___lib_int_table+23*6; /*Base of int table */
/* Interrupt vector for fixed point overflow interrupt */
___lib_FIXI: BIT CLR MODE1 0x1000; /*Disable interrupts */
JUMP ___z3_int_determiner (DB); /*jmp to finish setting up*/
DM(I7,M7)=I15; /*Save I15 (scratch reg)*/
I15=___lib_int_table+24*6; /*Base of int table */
/* Interrupt vector for floating point overflow interrupt */
___lib_FLTOI: BIT CLR MODE1 0x1000; /*Disable interrupts */
JUMP ___z3_int_determiner (DB); /*jmp to finish setting up*/
DM(I7,M7)=I15; /*Save I15 (scratch reg)*/
I15=___lib_int_table+25*6; /*Base of int table */
/* Interrupt vector for floating point underflow interrupt */
___lib_FLTUI: BIT CLR MODE1 0x1000; /*Disable interrupts */
JUMP ___z3_int_determiner (DB); /*jmp to finish setting up*/
DM(I7,M7)=I15; /*Save I15 (scratch reg)*/
I15=___lib_int_table+26*6; /*Base of int table */
/* Interrupt vector for floating point invalid operation interrupt */
___lib_FLTII: BIT CLR MODE1 0x1000; /*Disable interrupts */
JUMP ___z3_int_determiner (DB); /*jmp to finish setting up*/
DM(I7,M7)=I15; /*Save I15 (scratch reg)*/
I15=___lib_int_table+27*6; /*Base of int table */
/* Interrupt vectors for user interrupts 0 - 7 */
___lib_SFT0I: BIT CLR MODE1 0x1000; /*Disable interrupts */
JUMP ___z3_int_determiner (DB); /*jmp to finish setting up*/
DM(I7,M7)=I15; /*Save I15 (scratch reg)*/
I15=___lib_int_table+28*6; /*Base of int table */
___lib_SFT1I: BIT CLR MODE1 0x1000; /*Disable interrupts */
JUMP ___z3_int_determiner (DB); /*jmp to finish setting up*/
DM(I7,M7)=I15; /*Save I15 (scratch reg)*/
I15=___lib_int_table+29*6; /*Base of int table */
___lib_SFT2I: BIT CLR MODE1 0x1000; /*Disable interrupts */
JUMP ___z3_int_determiner (DB); /*jmp to finish setting up*/
DM(I7,M7)=I15; /*Save I15 (scratch reg)*/
I15=___lib_int_table+30*6; /*Base of int table */
___lib_SFT3I: BIT CLR MODE1 0x1000; /*Disable interrupts */
JUMP ___z3_int_determiner (DB); /*jmp to finish setting up*/
DM(I7,M7)=I15; /*Save I15 (scratch reg)*/
I15=___lib_int_table+31*6; /*Base of int table */
___z3_int_determiner: DM(I7,M7)=I13; /*Save I13 (scratch reg)*/
I13=PM(5,I15); /*get disp to jump to */
JUMP (M13, I13) (DB); /*Jump to dispatcher */
BIT SET MODE2 0x80000; /*Freeze cache */
I13=PM(2,I15); /*rd handler addr (base+2)*/
/* Note: It's okay to use PM in getting the above values b'cse z3 has a linear memory.
Therefore dm and pm are the same and we can use either. */
/* setup ezlab using ezset() before jump to main */
_ez_main:
ccall(_ezset);
nop;
jump _main;
/* timer interrupt code to fix 0.4 anomaly */
timer_irq:
pop sts; /* get astat from stack, pushed there by irq */
bit tgl astat FLG2; /* toggle the flag 2 LED */
nop;
push sts; /* restore stack so effect happens after rti */
bit tgl IMASKP TMZHI | 4;
bit clr IRPTL TMZHI;
rti (db);
pop sts;
nop;
/* push button on EZ_LAB interrupt code to fix 0.4 anomaly */
button_irq:
pop sts; /* get astat from stack, pushed there by irq */
bit tgl astat FLG0; /* toggle the flag 0 LED, record mode indicator */
nop;
push sts; /* restore stack so effect happens after rti */
bit tgl IMASKP IRQ1I | 4;
bit clr IRPTL IRQ1I;
rti (db);
pop sts;
nop;
/* SPORT0 tx interupt gets sent here */
/* if r4 not 0 then sends next command pointed to by i4 */
/* uses primary registers, can not be used during C program */
tx0_irq:
r4 = pass r4; /* tickle zero flag */
if eq rti; /* if r4 == 0 then return */
r4 = r4 - 1; /* dec r4 */
r0 = dm(i4, 1); /* get next command */
dm(tx_buf0) = r0; /* put command into tx buffer */
rti;
/* SPORT0 rx interupt gets sent here */
rx0_irq: {.....16 bit audio record/playback.....}
bit set mode1 SRD1L|SRD1H|SRRFL|SRRFH; { use all secondary registers}
nop;
/* playback interupt routine, play r3 or r4 depending on ustat */
playback:
r4=dm(i0,0); { get 2 samples }
r3=lshift r4 by 16; { get lower sample }
bit tst ustat1 1; { test if we have a sample ready }
if not tf r3 = pass r4, modify(i0,m1); { bump pointer }
bit tgl ustat1 1; { toggle the ready flag }
r3 = LSHIFT r3 BY -16;
dm(out_audio_r)=r3; { output right value }
dm(out_audio_l)=r3; { output left value }
/* determine if are doing simultaneous record/playback */
bit tst astat FLG0; { test the flag 0 LED}
if tf jump pr_exit (db);
r3=dm(in_audio_r); { get right channel }
r4=dm(in_audio_l); { get left channel }
/* record interupt routine */
record:
r3 = LSHIFT r3 BY 16; { zero out bottom }
r4 = LSHIFT r4 BY 16; { zero out bottom }
r3= (r4 + r3)/2; { sum two inputs /2 to get one channel }
r4 = r3 and r5; { zero out bottom }
r4=r4 or lshift r2 by -16; { 2 16 bit -> 32 DM }
r2 = r3; { save sample }
bit tst ustat1 2; { test if we have a record sample ready }
if tf dm(i3,m1)=r4; { store two samples }
bit tgl ustat1 2; { toggle the record ready flag }
pr_exit:
astat=dm(save_astat);
mode1=dm(save_mode1);
rti;
.ENDSEG;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -