/*
gbasys - a gameboy advance hardware abstraction library
-Copyright (C) 2004-2014 John Tsiombikas <nuclear@member.fsf.org>
+Copyright (C) 2004-2021 John Tsiombikas <nuclear@member.fsf.org>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
/* --- perform a copy of words or halfwords using DMA --- */
-void dma_copy32(int channel, void *dst, void *src, int words)
+void dma_copy32(int channel, void *dst, void *src, int words, unsigned int flags)
{
reg_dma[channel][DMA_SRC] = (unsigned long)src;
reg_dma[channel][DMA_DST] = (unsigned long)dst;
- reg_dma[channel][DMA_CTRL] = words | DMA_TIMING_IMMED | DMA_32 | DMA_ENABLE;
+ reg_dma[channel][DMA_CTRL] = words | flags | DMA_32 | DMA_ENABLE;
}
-void dma_copy16(int channel, void *dst, void *src, int halfwords)
+void dma_copy16(int channel, void *dst, void *src, int halfwords, unsigned int flags)
{
reg_dma[channel][DMA_SRC] = (unsigned long)src;
reg_dma[channel][DMA_DST] = (unsigned long)dst;
- reg_dma[channel][DMA_CTRL] = halfwords | DMA_TIMING_IMMED | DMA_16 | DMA_ENABLE;
+ reg_dma[channel][DMA_CTRL] = halfwords | flags | DMA_16 | DMA_ENABLE;
}
/* --- fill a buffer with an ammount of words and halfwords using DMA --- */
+static unsigned long fill[4];
+
void dma_fill32(int channel, void *dst, unsigned long val, int words)
{
- unsigned long valmem = val;
- reg_dma[channel][DMA_SRC] = (unsigned long)&valmem;
+ fill[channel] = val;
+ reg_dma[channel][DMA_SRC] = (unsigned long)(fill + channel);
reg_dma[channel][DMA_DST] = (unsigned long)dst;
reg_dma[channel][DMA_CTRL] = words | DMA_SRC_FIX | DMA_TIMING_IMMED | DMA_32 | DMA_ENABLE;
}
void dma_fill16(int channel, void *dst, unsigned short val, int halfwords)
{
- unsigned short valmem = val;
- reg_dma[channel][DMA_SRC] = (unsigned long)&valmem;
+ fill[channel] = val;
+ reg_dma[channel][DMA_SRC] = (unsigned long)(fill + channel);
reg_dma[channel][DMA_DST] = (unsigned long)dst;
reg_dma[channel][DMA_CTRL] = halfwords | DMA_SRC_FIX | DMA_TIMING_IMMED | DMA_16 | DMA_ENABLE;
}