📄 interrupts.asm
字号:
#include "defBF531.h"
#include "BF531_USB_Head.h"
.extern AudioFrameCnt;
.extern UsbAudioBuffer;
.extern Ch1Vol,Ch2Vol,Ch3Vol,Ch4Vol;
.extern UsbABuf_RPtr,UsbABuf_RPtrPre,UsbABuf_RPtrPst;
.extern UsbABuf_WPtr,UsbABuf_WPtrPre,UsbABuf_WPtrPst;
.extern UsbABuf_RWPtrSamePage;
.extern UsbABuf_WBeyondR_Distance;
.extern Led0Tgl,Led0Off,Led0On;
.extern Led1Tgl,Led1Off,Led1On;
.extern Led2Tgl,Led2Off,Led2On;
.extern Led3Tgl,Led3Off,Led3On;
.extern Rx0BufStartAddr,Tx0BufStartAddr;
.extern Rx0_BufA, Rx0_BufB;
.extern Tx0_BufA, Tx0_BufB;
.extern OutPutGainTableForAllCh;
.extern UsDelay;
.section SECTION_Code1;
.global _SPORT0_RX_ISR;
_SPORT0_RX_ISR:
//-------------------------------------------------------------------------------
//push registers into stack----start
[ --SP ] = RETI;
[ --SP ] = RETN;
[ --SP ] = RETE;
[ --SP ] = RETX;
[ --SP ] = RETS;
[ --SP ] = ASTAT;
[ --SP ] = USP;
[ --SP ] = FP;
[ --SP ]=r0;[ --SP ]=r1;[ --SP ]=r2;[ --SP ]=r3;
[ --SP ]=r4;[ --SP ]=r5;[ --SP ]=r6;[ --SP ]=r7;
[ --SP ]=p0;[ --SP ]=p1;[ --SP ]=p2;
[ --SP ]=p3;[ --SP ]=p4;[ --SP ]=p5;
[ --SP ]=i0;[ --SP ]=i1;[ --SP ]=i2;[ --SP ]=i3;
[ --SP ]=m0;[ --SP ]=m1;[ --SP ]=m2;[ --SP ]=m3;
[ --SP ]=l0;[ --SP ]=l1;[ --SP ]=l2;[ --SP ]=l3;
[ --SP ]=b0;[ --SP ]=b1;[ --SP ]=b2;[ --SP ]=b3;
[ --SP ]=a0.w;[ --SP ]=a1.w;//??
[ --SP ]=lc0;[ --SP ]=lt0;[ --SP ]=lb0;
[ --SP ]=lc1;[ --SP ]=lt1;[ --SP ]=lb1;
//push registers into stack----end
//-------------------------------------------------------------------------------
//call Led3On;
p0.l=BlinkCnt;
p0.h=BlinkCnt;
r0=[p0];
r0+=1;
r1=750;
cc=r0<r1;
if cc jump NoBlink;
p1.l=lo(FIO_FLAG_T);
p1.h=hi(FIO_FLAG_T);
r7.l=0xe000;
//w[ p1 ]=r7.l;
r0=0;
NoBlink:
[p0]=r0;
//-------------------------------------------------------------------------------
//clear interrupt flag, and blink LED0 to indicate each 750 frames----start
// Confirm interrupt
// Clear DMA_DONE bit in DMA1 status register
P0.L = LO(DMA1_IRQ_STATUS);
P0.H = HI(DMA1_IRQ_STATUS);
R1.L = W[ P0 ];
BITSET(R1,0);
W[ P0 ] = R1.L;
//ssync;
P0.L = AudioFrameCnt;
P0.H = AudioFrameCnt;
R1 = [ P0 ];
R1 += 1;
[ P0 ] = R1;
R0 = 750;
CC = R1==R0;
IF !CC JUMP SportIntrLEDNotToggle;
SportIntrLEDToggle:
//call Led0Tgl;
P0.L = AudioFrameCnt;
P0.H = AudioFrameCnt;
R1 = 0;
[ P0 ] = R1;
SportIntrLEDNotToggle:
//clear interrupt flag, and blink LED0 to indicate each 750 frames----end
//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
//check weather SPORT DMA buffer A to use or B to use ----start
p0.l=Rx0_BufA;
p0.h=Rx0_BufA; //p0 points to Rx0 buffer A
p1.l=Tx0_BufA;
p1.h=Tx0_BufA; //p1 points to Tx0 buffer A
P2.L = AudioFrameCnt;
P2.H = AudioFrameCnt;
R1 = [ P2 ];
cc=bittst(r1,0);
if cc jump ToUseTxBufferA;
ToUseTxBufferB:
p0.l=Rx0_BufB;
p0.h=Rx0_BufB; //p0 points to Rx0 buffer B
p1.l=Tx0_BufB;
p1.h=Tx0_BufB; //p1 points to Tx0 buffer B
ToUseTxBufferA:
p2.l=Rx0BufStartAddr;
p2.h=Rx0BufStartAddr;
r0=p0;
[ p2 ]=r0; //save Rx0 buffer start address
p2.l=Tx0BufStartAddr;
p2.h=Tx0BufStartAddr;
r0=p1;
[ p2 ]=r0; //save Tx0 buffer start address
//check whether SPORT DMA buffer A to use or B to use ----end
//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
// audio process start
//here audio process is: Output Gain for each channel ONLY
//prepare audio out DMA buffer pointer first
p4.l=Tx0BufStartAddr;
p4.h=Tx0BufStartAddr;
r1=[ p4 ];
p4=r1;
//check if UsbABuf_WBeyondR_Distance>64
p0.h=UsbABuf_WBeyondR_Distance;
p0.l=UsbABuf_WBeyondR_Distance;
r0=[ p0 ];
r1=32;
cc=r0<r1;
if cc jump WPtrNotBeyondEnough_UsbAudioSampleNotEnough;
WPtrBeyondEnough_UsbAudioSampleEnough:
call Led1Tgl;
//Get 32 samples for 4 channels from UsbAudioBuffer, according tp RPtr
//first RPtrPre=RPtr
p1.h=UsbABuf_RPtr;
p1.l=UsbABuf_RPtr;
p2.h=UsbABuf_RPtrPre;
p2.l=UsbABuf_RPtrPre;
r0=[ p1 ];
[ p2 ]=r0;
//prepare circular buffer of UsbAudioBuf
l0=240*UsbAudioBufferSlotSize*2;
r1.l=(UsbAudioBuffer);
r1.h=(UsbAudioBuffer);
b0=r1;
i0=r0; //the source
m0=4;
//source check, if source is not XXE4, then indicate error
r1=0x000f;
r1=r1&r0;
r1.h=0;
r0.h=0;
r0.l=0x0004;
cc=r0==r1;
if cc jump SourceCheckOK;
SourceCheckBad:
call Led3On;
SourceCheckOK:
//output gain coef prepare
p0.l=Ch1Vol;
p0.h=Ch1Vol;
r1.l=w[ p0 ];
p0.l=Ch2Vol;
p0.h=Ch2Vol;
r1.h=w[ p0 ];
p0.l=Ch3Vol;
p0.h=Ch3Vol;
r2.l=w[ p0 ];
p0.l=Ch4Vol;
p0.h=Ch4Vol;
r2.h=w[ p0 ];
p5 = FrameLength;
lsetup(OutputUsbAudio_LoopStart, OutputUsbAudio_LoopEnd) lc1=p5;
OutputUsbAudio_LoopStart:
r0=[ i0++ m0 ];
//output gain for ch1 and ch2
A1=R0.H*R1.H,A0=R0.L*R1.L;
r0.l=a0,r0.h=a1; //Ch1 and Ch2 in r0
[ p4++ ]=r0;
r0=[ i0++ m0 ];
//output gain for ch3 and ch4
A1=R0.H*R2.H,A0=R0.L*R2.L;
r0.l=a0,r0.h=a1; //Ch3 and Ch4 in r0
OutputUsbAudio_LoopEnd:
[ p4++ ]=r0;
//save RPtr, and RPtrPst=RPtr
p1.h=UsbABuf_RPtr;
p1.l=UsbABuf_RPtr;
r0=i0;
[ p1 ]=r0;
p2.h=UsbABuf_RPtrPst;
p2.l=UsbABuf_RPtrPst;
[ p2 ]=r0;
//UsbABuf_RWPtrSamePage update
//if RPtrPos-RPtrPre < 0 then RWPtrSamePage*=-1
p0.h=UsbABuf_RPtrPre;
p0.l=UsbABuf_RPtrPre;
p1.h=UsbABuf_RPtrPst;
p1.l=UsbABuf_RPtrPst;
r0=[ p0 ];
r1=[ p1 ];
r1=r1-r0;
cc=r1<0;
if !cc jump _NotToNeg_RWPtrSamePage;
_ToNeg_RWPtrSamePage:
p0.h=UsbABuf_RWPtrSamePage;
p0.l=UsbABuf_RWPtrSamePage;
r0=[ p0 ];
r0= -r0;
[ p0 ]=r0;
_NotToNeg_RWPtrSamePage:
nop;
//update UsbABuf_WBeyondR_Distance
p0.h=UsbABuf_RWPtrSamePage;
p0.l=UsbABuf_RWPtrSamePage;
r0=[ p0 ];
cc=r0<0;
if cc jump _RWPtrIsNotInSamePage;
_RWPtrIsInSamePage:
//the distance that WPtr beyond RPtr is:
//d=(Wptr-RPte)>>3;
p0.h=UsbABuf_RPtr;
p0.l=UsbABuf_RPtr;
p1.h=UsbABuf_WPtr;
p1.l=UsbABuf_WPtr;
r0=[ p0 ];
r1=[ p1 ];
r1=r1-r0;
r1>>=3;
p0.h=UsbABuf_WBeyondR_Distance;
p0.l=UsbABuf_WBeyondR_Distance;
[ p0 ]=r1;
jump AudioProcessFinishes;
_RWPtrIsNotInSamePage:
//the distance that WPtr beyond RPtr is:
//d=(Wptr+240*UsbAudioBufferSlotSize*2-RPte)>>3;
p0.h=UsbABuf_RPtr;
p0.l=UsbABuf_RPtr;
p1.h=UsbABuf_WPtr;
p1.l=UsbABuf_WPtr;
r0=[ p0 ];
r1=[ p1 ];
r1=r1-r0;
r0=240*UsbAudioBufferSlotSize*2;
r1=r1+r0;
r1>>=3;
p0.h=UsbABuf_WBeyondR_Distance;
p0.l=UsbABuf_WBeyondR_Distance;
[ p0 ]=r1;
jump AudioProcessFinishes;
WPtrNotBeyondEnough_UsbAudioSampleNotEnough:
//output all zeros
//move audio samples into tx0 buf
r0=0;
p5 = FrameLength;
lsetup(OutputAllZeros_LoopStart, OutputAllZeros_LoopEnd) lc1=p5;
OutputAllZeros_LoopStart:
[ p4++ ]=r0;
OutputAllZeros_LoopEnd:
[ p4++ ]=r0;
jump AudioProcessFinishes;
AudioProcessFinishes:
// audio process end
//-------------------------------------------------------------------------------
//r0=300;
//call UsDelay;
//call Led3Off;
//-------------------------------------------------------------------------------
//pop registers from stack----start
SPORT0_RX_ISR_Finish:
lb1=[ SP++ ];lt1=[ SP++ ];lc1=[ SP++ ];
lb0=[ SP++ ];lt0=[ SP++ ];lc0=[ SP++ ];
a1.w=[ SP++ ];a0.w=[ SP++ ];//??
b3=[ SP++ ];b2=[ SP++ ];b1=[ SP++ ];b0=[ SP++ ];
l3=[ SP++ ];l2=[ SP++ ];l1=[ SP++ ];l0=[ SP++ ];
m3=[ SP++ ];m2=[ SP++ ];m1=[ SP++ ];m0=[ SP++ ];
i3=[ SP++ ];i2=[ SP++ ];i1=[ SP++ ];i0=[ SP++ ];
p5=[ SP++ ];p4=[ SP++ ];p3=[ SP++ ];
p2=[ SP++ ];p1=[ SP++ ];p0=[ SP++ ];
r7=[ SP++ ];r6=[ SP++ ];r5=[ SP++ ];r4=[ SP++ ];
r3=[ SP++ ];r2=[ SP++ ];r1=[ SP++ ];r0=[ SP++ ];
FP = [ SP++ ];
USP = [ SP++ ];
ASTAT = [ SP++ ];
RETS = [ SP++ ];
RETX = [ SP++ ];
RETE = [ SP++ ];
RETN = [ SP++ ];
RETI = [ SP++ ];
//pop registers from stack----end
//-------------------------------------------------------------------------------
#ifdef SoftSimu
RTS;
#endif
#ifndef SoftSimu
RTI;
#endif
_SPORT0_RX_ISR.end:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -