summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorProjectRevoTPP <projectrevotpp@hotmail.com>2018-01-17 17:47:46 -0500
committerProjectRevoTPP <projectrevotpp@hotmail.com>2018-01-17 17:47:46 -0500
commitf07cdb4c9723bdbb1fcdbbe622d39936ae5b532f (patch)
tree6b423f3b23c640582d6a7f44a802f8ba3dc6121e
parent05d18468a4b817c0976b16017ef7b6044befed7f (diff)
use Dma Large loops for every while(1) Dma loop
-rw-r--r--include/gba/macro.h53
-rw-r--r--src/battle/battle_controller_player.c17
-rw-r--r--src/engine/naming_screen.c15
-rw-r--r--src/engine/option_menu.c17
-rw-r--r--src/engine/reset_rtc_screen.c20
-rw-r--r--src/engine/trade.c20
-rw-r--r--src/engine/trainer_card.c46
-rw-r--r--src/field/menu_helpers.c19
-rw-r--r--src/field/overworld.c19
-rw-r--r--src/field/party_menu.c18
-rw-r--r--src/field/wallclock.c19
-rw-r--r--src/pokemon/pokedex.c29
-rw-r--r--src/scene/contest_painting.c17
13 files changed, 75 insertions, 234 deletions
diff --git a/include/gba/macro.h b/include/gba/macro.h
index dcad009e1..d39d10738 100644
--- a/include/gba/macro.h
+++ b/include/gba/macro.h
@@ -167,4 +167,57 @@
#define DmaFill16Defvars(dmaNum, fillval, dest, size) DmaFillDefvars(dmaNum, fillval, dest, size, 16)
#define DmaFill32Defvars(dmaNum, fillval, dest, size) DmaFillDefvars(dmaNum, fillval, dest, size, 32)
+// from pokeemerald
+// Maximum amount of data we will transfer in one operation
+#define MAX_DMA_BLOCK_SIZE 0x1000
+
+#define MAX_DMA_REQUESTS 128
+
+#define DMA_REQUEST_COPY32 1
+#define DMA_REQUEST_FILL32 2
+#define DMA_REQUEST_COPY16 3
+#define DMA_REQUEST_FILL16 4
+
+#define Dma3CopyLarge_(src, dest, size, bit) \
+{ \
+ const void *_src = src; \
+ void *_dest = dest; \
+ u32 _size = size; \
+ while (1) \
+ { \
+ if (_size <= MAX_DMA_BLOCK_SIZE) \
+ { \
+ DmaCopy##bit(3, _src, _dest, _size); \
+ break; \
+ } \
+ DmaCopy##bit(3, _src, _dest, MAX_DMA_BLOCK_SIZE); \
+ _src += MAX_DMA_BLOCK_SIZE; \
+ _dest += MAX_DMA_BLOCK_SIZE; \
+ _size -= MAX_DMA_BLOCK_SIZE; \
+ } \
+}
+
+#define Dma3CopyLarge16_(src, dest, size) Dma3CopyLarge_(src, dest, size, 16)
+#define Dma3CopyLarge32_(src, dest, size) Dma3CopyLarge_(src, dest, size, 32)
+
+#define Dma3FillLarge_(value, dest, size, bit) \
+{ \
+ void *_dest = dest; \
+ u32 _size = size; \
+ while (1) \
+ { \
+ if (_size <= MAX_DMA_BLOCK_SIZE) \
+ { \
+ DmaFill##bit(3, value, _dest, _size); \
+ break; \
+ } \
+ DmaFill##bit(3, value, _dest, MAX_DMA_BLOCK_SIZE); \
+ _dest += MAX_DMA_BLOCK_SIZE; \
+ _size -= MAX_DMA_BLOCK_SIZE; \
+ } \
+}
+
+#define Dma3FillLarge16_(value, dest, size) Dma3FillLarge_(value, dest, size, 16)
+#define Dma3FillLarge32_(value, dest, size) Dma3FillLarge_(value, dest, size, 32)
+
#endif // GUARD_GBA_MACRO_H
diff --git a/src/battle/battle_controller_player.c b/src/battle/battle_controller_player.c
index 0d05b7aed..f036e841f 100644
--- a/src/battle/battle_controller_player.c
+++ b/src/battle/battle_controller_player.c
@@ -2749,22 +2749,7 @@ void PlayerHandleDMATransfer(void)
| (gBattleBufferA[gActiveBank][4] << 24);
u16 val2 = gBattleBufferA[gActiveBank][5] | (gBattleBufferA[gActiveBank][6] << 8);
- const u8 *src = &gBattleBufferA[gActiveBank][7];
- u8 *dst = (u8 *)val1;
- u32 size = val2;
-
- while (1)
- {
- if (size <= 0x1000)
- {
- DmaCopy16(3, src, dst, size);
- break;
- }
- DmaCopy16(3, src, dst, 0x1000);
- src += 0x1000;
- dst += 0x1000;
- size -= 0x1000;
- }
+ Dma3CopyLarge16_(&gBattleBufferA[gActiveBank][7], (u8 *)val1, val2);
PlayerBufferExecCompleted();
}
diff --git a/src/engine/naming_screen.c b/src/engine/naming_screen.c
index eddfdeda5..d54b84720 100644
--- a/src/engine/naming_screen.c
+++ b/src/engine/naming_screen.c
@@ -258,20 +258,7 @@ static void NamingScreen_InitDisplayMode(void)
static void NamingScreen_ClearVram(void)
{
- u8 *addr = (void *)VRAM;
- u32 size = 0x10000;
-
- while (1)
- {
- DmaFill16(3, 0, addr, 0x1000);
- addr += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaFill16(3, 0, addr, size);
- break;
- }
- }
+ DmaFill16Large(3, 0, (void *)VRAM, 0x10000, 0x1000);
}
static void NamingScreen_ClearOam(void)
diff --git a/src/engine/option_menu.c b/src/engine/option_menu.c
index 1fc78efaa..d4e921a0e 100644
--- a/src/engine/option_menu.c
+++ b/src/engine/option_menu.c
@@ -76,9 +76,6 @@ void CB2_InitOptionMenu(void)
default:
case 0:
{
- u8 *addr;
- u32 size;
-
SetVBlankCallback(NULL);
REG_DISPCNT = 0;
REG_BG2CNT = 0;
@@ -90,19 +87,7 @@ void CB2_InitOptionMenu(void)
REG_BG1VOFS = 0;
REG_BG0HOFS = 0;
REG_BG0VOFS = 0;
- addr = (u8 *)VRAM;
- size = 0x18000;
- while (1)
- {
- DmaFill16(3, 0, addr, 0x1000);
- addr += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaFill16(3, 0, addr, size);
- break;
- }
- }
+ DmaFill16Large(3, 0, (u8 *)VRAM, 0x18000, 0x1000);
DmaClear32(3, OAM, OAM_SIZE);
DmaClear16(3, PLTT, PLTT_SIZE);
gMain.state++;
diff --git a/src/engine/reset_rtc_screen.c b/src/engine/reset_rtc_screen.c
index c7d45e929..ce4afe922 100644
--- a/src/engine/reset_rtc_screen.c
+++ b/src/engine/reset_rtc_screen.c
@@ -414,28 +414,10 @@ void Task_ResetRtc_0(u8 taskId)
void CB2_InitResetRtcScreen(void)
{
- u8 *addr;
- u32 size;
-
REG_DISPCNT = 0;
SetVBlankCallback(NULL);
-
DmaClear16(3, PLTT, PLTT_SIZE);
-
- addr = (u8 *)VRAM;
- size = 0x18000;
- while (1)
- {
- DmaFill16(3, 0, addr, 0x1000);
- addr += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaFill16(3, 0, addr, size);
- break;
- }
- }
-
+ DmaFill16Large(3, 0, (u8 *)VRAM, 0x18000, 0x1000);
ResetOamRange(0, 128);
LoadOam();
ScanlineEffect_Stop();
diff --git a/src/engine/trade.c b/src/engine/trade.c
index 3a14adaca..81485d3f6 100644
--- a/src/engine/trade.c
+++ b/src/engine/trade.c
@@ -1453,9 +1453,7 @@ static void sub_8048AB4(void)
static void sub_8048B0C(u8 a0)
{
int i;
- u16 *dest;
- const u16 *src;
- u32 size;
+
switch (a0)
{
case 0:
@@ -1464,21 +1462,7 @@ static void sub_8048B0C(u8 a0)
gPlttBufferUnfaded[i] = *(gUnknown_08EA02C8 + i);
gPlttBufferFaded[i] = *(gUnknown_08EA02C8 + i);
}
- src = gUnknown_08EA0348;
- dest = (u16 *)BG_VRAM;
- size = 0x1280;
- while (1)
- {
- DmaCopy16(3, src, dest, BLOCKSIZE * sizeof(u16));
- src += BLOCKSIZE;
- dest += BLOCKSIZE;
- size -= BLOCKSIZE * sizeof(u16);
- if (size <= BLOCKSIZE * sizeof(u16))
- {
- DmaCopy16(3, src, dest, size);
- break;
- }
- }
+ DmaCopyLarge16(3, gUnknown_08EA0348, (void *)BG_VRAM, 0x1280, 0x1000);
for (i = 0; i < 0x400; i ++)
gUnknown_03004824->unk_00c8.unk_12[i] = gUnknown_08EA15C8[i];
dest = BG_SCREEN_ADDR(6);
diff --git a/src/engine/trainer_card.c b/src/engine/trainer_card.c
index 9d09575c8..b49628bfa 100644
--- a/src/engine/trainer_card.c
+++ b/src/engine/trainer_card.c
@@ -441,27 +441,12 @@ static void sub_8093550(void)
void sub_8093598(void)
{
- u8 *addr = (void *)VRAM;
- u32 size = 0x10000;
-
- while (1)
- {
- DmaFill16(3, 0, addr, 0x1000);
- addr += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaFill16(3, 0, addr, size);
- break;
- }
- }
+ DmaFill16Large(3, 0, (void *)VRAM, 0x10000, 0x1000);
}
void sub_80935EC(void)
{
- void *addr = (void *)OAM;
-
- DmaFill16(3, 0, addr, 0x400);
+ DmaFill16Defvars(3, 0, (void *)OAM, 0x400);
}
void sub_8093610(void)
@@ -1163,33 +1148,10 @@ static void TrainerCard_ResetOffsetRegisters(void)
static void TrainerCard_CopyGraphics(void)
{
- const u8 *src;
- u8 *dst;
- u32 size;
-
TrainerCard_LoadPalettes();
LoadPalette(gUnknown_083B5F6C, 0xE0, 32);
- src = gMenuTrainerCard_Gfx;
- dst = (void *)VRAM;
- size = 0x1480;
- while (1)
- {
- DmaCopy16(3, src, dst, 0x1000);
- src += 0x1000;
- dst += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaCopy16(3, src, dst, size);
- break;
- }
- }
- {
- const void *src = gBadgesTiles;
- void *dst = (void *)(VRAM + 0x1480);
-
- DmaCopy16(3, src, dst, 0x400);
- }
+ DmaCopyLarge16(3, gMenuTrainerCard_Gfx, (void *)VRAM, 0x1480, 0x1000);
+ DmaCopy16Defvars(3, gBadgesTiles, (void *)(VRAM + 0x1480), 0x400);
}
extern const u16 *const gTrainerCardPalettes[];
diff --git a/src/field/menu_helpers.c b/src/field/menu_helpers.c
index 54668addb..388d98ec7 100644
--- a/src/field/menu_helpers.c
+++ b/src/field/menu_helpers.c
@@ -296,9 +296,6 @@ bool8 sub_80F9344(void)
void sub_80F9368(void)
{
- u8 *addr;
- u32 size;
-
REG_DISPCNT = 0;
REG_BG3CNT = 0;
REG_BG2CNT = 0;
@@ -312,21 +309,7 @@ void sub_80F9368(void)
REG_BG1VOFS = 0;
REG_BG0HOFS = 0;
REG_BG0VOFS = 0;
-
- addr = (u8 *)VRAM;
- size = 0x18000;
- while (1)
- {
- DmaFill16(3, 0, addr, 0x1000);
- addr += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaFill16(3, 0, addr, size);
- break;
- }
- }
-
+ DmaFill16Large(3, 0, (u8 *)VRAM, 0x18000, 0x1000);
DmaClear32(3, OAM, OAM_SIZE);
DmaClear16(3, PLTT, PLTT_SIZE);
}
diff --git a/src/field/overworld.c b/src/field/overworld.c
index 86b0a5dac..a6d34e103 100644
--- a/src/field/overworld.c
+++ b/src/field/overworld.c
@@ -1664,29 +1664,12 @@ void do_load_map_stuff_loop(u8 *a1)
void sub_8054BA8(void)
{
- u8 *addr;
- u32 size;
-
REG_DISPCNT = 0;
ScanlineEffect_Stop();
DmaClear16(3, PLTT + 2, PLTT_SIZE - 2);
-
- addr = (void *)VRAM;
- size = 0x18000;
- while (1)
- {
- DmaFill16(3, 0, addr, 0x1000);
- addr += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaFill16(3, 0, addr, size);
- break;
- }
- }
-
+ DmaFill16Large(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000);
ResetOamRange(0, 128);
LoadOam();
}
diff --git a/src/field/party_menu.c b/src/field/party_menu.c
index 48275435e..53bad9618 100644
--- a/src/field/party_menu.c
+++ b/src/field/party_menu.c
@@ -620,27 +620,11 @@ bool8 SetupDefaultPartyMenu(void)
bool8 InitPartyMenu(void)
{
- u8 *addr;
- u32 size;
-
switch (gMain.state)
{
case 0:
SetVBlankCallback(NULL);
- addr = (u8 *)VRAM;
- size = VRAM_SIZE;
- while (1)
- {
- DmaFill16(3, 0, addr, 0x1000);
- addr += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaFill16(3, 0, addr, size);
- break;
- }
- }
-
+ DmaFill16Large(3, 0, (void *)(VRAM + 0x0), VRAM_SIZE, 0x1000);
DmaClear32(3, OAM, OAM_SIZE);
DmaClear16(3, PLTT, PLTT_SIZE);
diff --git a/src/field/wallclock.c b/src/field/wallclock.c
index aaa7f9ae8..1f743a61a 100644
--- a/src/field/wallclock.c
+++ b/src/field/wallclock.c
@@ -190,10 +190,7 @@ static void WallClockVblankCallback(void)
static void LoadWallClockGraphics(void)
{
- u8 *addr;
- u32 size;
-
- SetVBlankCallback(0);
+ SetVBlankCallback(NULL);
REG_DISPCNT = 0;
REG_BG3CNT = 0;
REG_BG2CNT = 0;
@@ -208,19 +205,7 @@ static void LoadWallClockGraphics(void)
REG_BG0HOFS = 0;
REG_BG0VOFS = 0;
- addr = (void *)VRAM;
- size = 0x18000;
- while (1)
- {
- DmaFill16(3, 0, addr, 0x1000);
- addr += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaFill16(3, 0, addr, size);
- break;
- }
- }
+ DmaFill16Large(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000);
DmaClear32(3, OAM, OAM_SIZE);
DmaClear16(3, PLTT, PLTT_SIZE);
diff --git a/src/pokemon/pokedex.c b/src/pokemon/pokedex.c
index faebe526a..cbd816206 100644
--- a/src/pokemon/pokedex.c
+++ b/src/pokemon/pokedex.c
@@ -1394,29 +1394,12 @@ void CB2_InitPokedex(void)
{
case 0:
default:
- {
- u8 *addr;
- u32 size;
-
- SetVBlankCallback(NULL);
- sub_8091060(0);
- addr = (u8 *)VRAM;
- size = VRAM_SIZE;
- while (1)
- {
- DmaFill16(3, 0, addr, 0x1000);
- addr += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaFill16(3, 0, addr, size);
- break;
- }
- }
- DmaClear32(3, OAM, OAM_SIZE);
- DmaClear16(3, PLTT, PLTT_SIZE);
- gMain.state = 1;
- }
+ SetVBlankCallback(NULL);
+ sub_8091060(0);
+ DmaFill16Large(3, 0, (void *)(VRAM + 0x0), VRAM_SIZE, 0x1000);
+ DmaClear32(3, OAM, OAM_SIZE);
+ DmaClear16(3, PLTT, PLTT_SIZE);
+ gMain.state = 1;
break;
case 1:
ScanlineEffect_Stop();
diff --git a/src/scene/contest_painting.c b/src/scene/contest_painting.c
index 3aa898b03..0aa02312f 100644
--- a/src/scene/contest_painting.c
+++ b/src/scene/contest_painting.c
@@ -156,23 +156,8 @@ static void ShowContestPainting(void)
break;
case 1:
{
- u8 *addr;
- size_t size;
-
ResetPaletteFade();
- addr = (void *)VRAM;
- size = 0x18000;
- while (1)
- {
- DmaFill32(3, 0, addr, 0x1000);
- addr += 0x1000;
- size -= 0x1000;
- if (size <= 0x1000)
- {
- DmaFill32(3, 0, addr, size);
- break;
- }
- }
+ DmaFill32Large(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000);
ResetSpriteData();
gMain.state++;
break;