📄 dma.asm
字号:
.section program;
#define MDMAS0_CONFIG 0xffc00f48
#define MDMAD0_CONFIG 0xffc00f08
#define MDMAS0_IRQ_STATUS 0xffc00f68
#define MDMAD0_IRQ_STATUS 0xffc00f28
#define MDMAS0_START_ADDR 0xffc00f44
#define MDMAD0_START_ADDR 0xffc00f04
#define MDMAS0_CURR_ADDR 0xffc00f64
#define MDMAS0_X_MODIFY 0xffc00f54
#define MDMAD0_X_MODIFY 0xffc00f14
#define MDMAS0_X_COUNT 0xffc00f50
#define MDMAD0_X_COUNT 0xffc00f10
#define MDMAS0_Y_COUNT 0xffc00f58
#define MDMAD0_Y_COUNT 0xffc00f18
#define MDMAS0_Y_MODIFY 0xffc00f5c
#define MDMAD0_Y_MODIFY 0xffc00f1c
#define SIC_IMASK 0xffc0010c
#define SIC_ISR 0xffc00120
#define IVG13 0xffe02034
#define CORE_IMASK 0xffe02104
.extern _counter;
dma_isr:
[--sp] = r0;
[--sp] = p0;
[--sp] = r1;
// Just for test, count the times of interrupt
p0.l = lo(_counter);
p0.h = hi(_counter);
r0 = [p0];
r0 += 1;
[p0] = r0;
p0.h = hi(MDMAS0_IRQ_STATUS);
p0.l = lo(MDMAS0_IRQ_STATUS);
r0 = w[p0](z); // Get DMA_DONE flag
r1 = 1;
r1 = r1 & r0;
cc = r1 == 1;
if !cc jump JUDGE_DEST(bp);
/* If DMA_DONE is set */
w[p0] = r1; // Clear DMA_DONE
r0 >>= 3; // Get DMA_RUN flag
cc = r0;
if cc jump JUDGE_DEST;
/* if DMA_RUN is cleared */
p0.h = hi(MDMAS0_CONFIG);
p0.l = lo(MDMAS0_CONFIG);
r0 = 0;
w[p0] = r0; // Disable MDMAS0
JUDGE_DEST:
p0.h = hi(MDMAD0_IRQ_STATUS);
p0.l = lo(MDMAD0_IRQ_STATUS);
r0 = w[p0](z); // Get DMA_DONE flag
r1 = 1;
r1 = r1 & r0;
cc = r1 == 1;
if !cc jump FINISH;
/* If DMA_DONE is set */
w[p0] = r1; // Clear DMA_DONE
r0 >>= 3; // Get DMA_RUN flag
cc = r0;
if cc jump FINISH(bp);
/* If DMA_RUN is cleared */
p0.h = hi(MDMAD0_CONFIG);
p0.l = lo(MDMAD0_CONFIG);
r0 = 0;
w[p0] = r0; // Disable MDMAD0
.extern _EnterResult;
p0.h = hi(_EnterResult);
p0.l = lo(_EnterResult);
reti = p0;
FINISH:
r1 = [sp++];
p0 = [sp++];
r0 = [sp++];
rti;
dma_isr.end:
_config:
.global _config;
p0.h = hi(SIC_IMASK);
p0.l = lo(SIC_IMASK);
r0.h = 0x6000;
r0.l = 0;
r1 = [p0];
r0 = r0 | r1;
[p0] = r0; // Enable MDMA interrupt
p0.h = hi(IVG13);
p0.l = lo(IVG13);
r0.h = hi(dma_isr);
r0.l = lo(dma_isr);
[p0] = r0; // Set DMA interrupt vector
p0.h = hi(CORE_IMASK);
p0.l = lo(CORE_IMASK);
r0 = [p0];
bitset(r0, 13); // Enable EVT13
[p0] = r0;
rts;
_config.end:
/*
_dma_config:
.global _dma_config;
p0.h = hi(MDMAS0_START_ADDR);
p0.l = lo(MDMAS0_START_ADDR);
[p0] = r0;
p0.h = hi(MDMAD0_START_ADDR);
p0.l = lo(MDMAD0_START_ADDR);
[p0] = r1;
p0.h = hi(MDMAS0_X_COUNT);
p0.l = lo(MDMAS0_X_COUNT);
r2 = 10;
w[p0] = r2;
p0.h = hi(MDMAD0_X_COUNT);
p0.l = lo(MDMAD0_X_COUNT);
w[p0] = r2;
p0.h = hi(MDMAS0_X_MODIFY);
p0.l = lo(MDMAS0_X_MODIFY);
r0 = 0x4;
w[p0] = r0;
p0.h = hi(MDMAD0_X_MODIFY);
p0.l = lo(MDMAD0_X_MODIFY);
w[p0] = r0;
p0.h = hi(MDMAS0_Y_MODIFY);
p0.l = lo(MDMAS0_Y_MODIFY);
w[p0] = r0;
p0.h = hi(MDMAD0_Y_MODIFY);
p0.l = lo(MDMAD0_Y_MODIFY);
w[p0] = r0;
p0.h = hi(MDMAS0_Y_COUNT);
p0.l = lo(MDMAS0_Y_COUNT);
r0 = 3;
w[p0] = r0;
p0.h = hi(MDMAD0_Y_COUNT);
p0.l = lo(MDMAD0_Y_COUNT);
w[p0] = r0;
p0.h = hi(MDMAS0_CONFIG);
p0.l = lo(MDMAS0_CONFIG);
r0 = 0x00b9;
w[p0] = r0;
r0 = 0x00bb;
p0.h = hi(MDMAD0_CONFIG);
p0.l = lo(MDMAD0_CONFIG);
w[p0] = r0;
rts;
_dma_config.end:
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -