- fixed spritesheet conversion and setup
[gba_blender] / src / dma.c
index 78b516f..3d7606f 100644 (file)
--- a/src/dma.c
+++ b/src/dma.c
@@ -1,6 +1,6 @@
 /*
 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
@@ -44,34 +44,36 @@ static volatile unsigned long *reg_dma[4] = {(void*)0x040000b0, (void*)0x040000b
 
 /* --- 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;
 }