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

📄 sharc_hd.asm

📁 dsp AD公司ADSP21的代码,里面有FFT FIR IIR EQULIZER G722_21F 等可以在项目中直接应用的代码.此代码的来源是ADI公司自己出版的书籍,此书在美国购得
💻 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 + -