X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Fdma.c;h=3d7606f8f3d8a51b4278cbf1f86c5c5a7b1eb9f6;hb=2cbb408ae15196bf4153fa6b17fb07fee6fe211b;hp=78b516f2bebd5a2a2e49419974fcc849d5031a4b;hpb=3eebc6b38f3ad1fd082ae9d4d3263c42c384951c;p=gba_blender diff --git a/src/dma.c b/src/dma.c index 78b516f..3d7606f 100644 --- 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 +Copyright (C) 2004-2021 John Tsiombikas 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; }