summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle_transition.c7
-rw-r--r--src/bg.c395
-rw-r--r--src/tileset_anims.c248
-rw-r--r--src/util.c256
4 files changed, 311 insertions, 595 deletions
diff --git a/src/battle_transition.c b/src/battle_transition.c
index 0fd92d631..9a04218de 100644
--- a/src/battle_transition.c
+++ b/src/battle_transition.c
@@ -1380,10 +1380,9 @@ static bool8 BT_Phase2FullScreenWave_UpdateWave(struct Task *task)
for (i = 0; i < 160; ++i, theta += frequency)
{
s16 var = theta >> 8;
-
- #ifndef NONMATCHING
- asm("");
- #endif
+
+ ++var;
+ --var;
gScanlineEffectRegBuffers[0][i] = sTransitionStructPtr->bg123VOfs + Sin(var, amplitude);
}
if (++task->tDelayForFade == 41)
diff --git a/src/bg.c b/src/bg.c
index 18cb4ec05..33a462707 100644
--- a/src/bg.c
+++ b/src/bg.c
@@ -1024,295 +1024,49 @@ void CopyToBgTilemapBufferRect_ChangePalette(u8 bg, const void *src, u8 destX, u
{
CopyRectToBgTilemapBufferRect(bg, src, 0, 0, rectWidth, rectHeight, destX, destY, rectWidth, rectHeight, palette, 0, 0);
}
-// Skipping for now, it probably uses structs passed by value
-/*
-void CopyRectToBgTilemapBufferRect(u8 bg, void* src, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette1, u16 tileOffset, u16 palette2)
-{
- u16 attribute;
- u16 mode;
- u16 mode2;
- void* srcCopy;
- u16 destX16;
- u16 destY16;
+void CopyRectToBgTilemapBufferRect(u8 bg, const void *src, u8 srcX, u8 srcY, u8 srcWidth, u8 unused, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, s16 palette1, s16 tileOffset)
+{
+ u16 screenWidth, screenHeight, screenSize;
+ u16 var;
+ const void *srcPtr;
+ u16 i, j;
- if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE)
+ if (!IsInvalidBg32(bg) && !IsTileMapOutsideWram(bg))
{
- attribute = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE);
- mode = GetBgMetricTextMode(bg, 0x1) * 0x20;
- mode2 = GetBgMetricTextMode(bg, 0x2) * 0x20;
+ screenSize = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE);
+ screenWidth = GetBgMetricTextMode(bg, 0x1) * 0x20;
+ screenHeight = GetBgMetricTextMode(bg, 0x2) * 0x20;
switch (GetBgType(bg))
{
- case 0:
- srcCopy = src;
- for (destY16 = destY; destY16 < (destY + rectHeight); destY16++)
+ case 0:
+ srcPtr = src + ((srcY * srcWidth) + srcX) * 2;
+ for (i = destX; i < (destX + rectWidth); i++)
+ {
+ for (j = srcHeight; j < (srcHeight + destY); j++)
{
- for (destX16 = destX; destX16 < (destX + rectWidth); destX16++)
- {
- CopyTileMapEntry(&((u16*)srcCopy)[(srcY * rectWidth) + srcX], &((u16*)sGpuBgConfigs2[bg].tilemap)[GetTileMapIndexFromCoords(destX16, destY16, attribute, mode, mode2)], palette1, tileOffset, palette2);
- }
+ u16 index = GetTileMapIndexFromCoords(j, i, screenSize, screenWidth, screenHeight);
+ CopyTileMapEntry(srcPtr, sGpuBgConfigs2[bg].tilemap + (index * 2), rectHeight, palette1, tileOffset);
+ srcPtr += 2;
}
- break;
- case 1:
- srcCopy = src;
- mode = GetBgMetricAffineMode(bg, 0x1);
- for (destY16 = destY; destY16 < (destY + rectHeight); destY16++)
+ srcPtr += (srcWidth - destY) * 2;
+ }
+ break;
+ case 1:
+ srcPtr = src + ((srcY * srcWidth) + srcX);
+ var = GetBgMetricAffineMode(bg, 0x1);
+ for (i = destX; i < (destX + rectWidth); i++)
+ {
+ for (j = srcHeight; j < (srcHeight + destY); j++)
{
- for (destX16 = destX; destX16 < (destX + rectWidth); destX16++)
- {
- CopyTileMapEntry(&((u16*)srcCopy)[(srcY * rectWidth) + srcX], &((u16*)sGpuBgConfigs2[bg].tilemap)[GetTileMapIndexFromCoords(destX16, destY16, attribute, mode, mode2)], palette1, tileOffset, palette2);
- }
+ *(u8*)(sGpuBgConfigs2[bg].tilemap + ((var * i) + j)) = *(u8*)(srcPtr) + palette1;
+ srcPtr++;
}
- break;
+ srcPtr += (srcWidth - destY);
+ }
+ break;
}
}
-}*/
-NAKED
-void CopyRectToBgTilemapBufferRect(u8 bg, const void* src, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette1, u16 tileOffset, u16 palette2)
-{
- asm("push {r4-r7,lr}\n\
- mov r7, r10\n\
- mov r6, r9\n\
- mov r5, r8\n\
- push {r5-r7}\n\
- sub sp, #0x40\n\
- str r1, [sp, #0x8]\n\
- ldr r1, [sp, #0x60]\n\
- ldr r4, [sp, #0x68]\n\
- ldr r5, [sp, #0x6C]\n\
- ldr r6, [sp, #0x70]\n\
- ldr r7, [sp, #0x74]\n\
- mov r8, r7\n\
- ldr r7, [sp, #0x78]\n\
- mov r9, r7\n\
- ldr r7, [sp, #0x7C]\n\
- mov r10, r7\n\
- ldr r7, [sp, #0x80]\n\
- mov r12, r7\n\
- lsl r0, #24\n\
- lsr r0, #24\n\
- str r0, [sp, #0x4]\n\
- lsl r2, #24\n\
- lsr r2, #24\n\
- str r2, [sp, #0xC]\n\
- lsl r3, #24\n\
- lsr r3, #24\n\
- str r3, [sp, #0x10]\n\
- lsl r1, #24\n\
- lsr r7, r1, #24\n\
- lsl r4, #24\n\
- lsr r4, #24\n\
- str r4, [sp, #0x14]\n\
- lsl r5, #24\n\
- lsr r5, #24\n\
- lsl r6, #24\n\
- lsr r6, #24\n\
- str r6, [sp, #0x18]\n\
- mov r0, r8\n\
- lsl r0, #24\n\
- lsr r4, r0, #24\n\
- mov r1, r9\n\
- lsl r1, #24\n\
- lsr r1, #24\n\
- str r1, [sp, #0x1C]\n\
- mov r2, r10\n\
- lsl r2, #16\n\
- lsr r2, #16\n\
- str r2, [sp, #0x20]\n\
- mov r0, r12\n\
- lsl r0, #16\n\
- lsr r0, #16\n\
- str r0, [sp, #0x24]\n\
- ldr r0, [sp, #0x4]\n\
- bl IsInvalidBg32\n\
- cmp r0, #0\n\
- beq _08002592\n\
- b _080026EE\n\
-_08002592:\n\
- ldr r0, [sp, #0x4]\n\
- bl IsTileMapOutsideWram\n\
- cmp r0, #0\n\
- beq _0800259E\n\
- b _080026EE\n\
-_0800259E:\n\
- ldr r0, [sp, #0x4]\n\
- mov r1, #0x4\n\
- bl GetBgControlAttribute\n\
- lsl r0, #16\n\
- lsr r0, #16\n\
- str r0, [sp, #0x30]\n\
- ldr r0, [sp, #0x4]\n\
- mov r1, #0x1\n\
- bl GetBgMetricTextMode\n\
- lsl r0, #21\n\
- lsr r0, #16\n\
- str r0, [sp, #0x28]\n\
- ldr r0, [sp, #0x4]\n\
- mov r1, #0x2\n\
- bl GetBgMetricTextMode\n\
- lsl r0, #21\n\
- lsr r0, #16\n\
- str r0, [sp, #0x2C]\n\
- ldr r0, [sp, #0x4]\n\
- bl GetBgType\n\
- cmp r0, #0\n\
- beq _080025D8\n\
- cmp r0, #0x1\n\
- beq _08002674\n\
- b _080026EE\n\
-_080025D8:\n\
- ldr r1, [sp, #0x10]\n\
- add r0, r1, #0\n\
- mul r0, r7\n\
- ldr r2, [sp, #0xC]\n\
- add r0, r2\n\
- lsl r0, #1\n\
- ldr r1, [sp, #0x8]\n\
- add r6, r1, r0\n\
- add r0, r5, r4\n\
- cmp r5, r0\n\
- blt _080025F0\n\
- b _080026EE\n\
-_080025F0:\n\
- ldr r2, [sp, #0x18]\n\
- sub r2, r7, r2\n\
- str r2, [sp, #0x34]\n\
- str r0, [sp, #0x38]\n\
-_080025F8:\n\
- ldr r4, [sp, #0x14]\n\
- ldr r7, [sp, #0x18]\n\
- add r0, r4, r7\n\
- add r1, r5, #0x1\n\
- str r1, [sp, #0x3C]\n\
- cmp r4, r0\n\
- bge _0800265A\n\
- ldr r2, [sp, #0x4]\n\
- lsl r0, r2, #4\n\
- ldr r1, =sGpuBgConfigs2+4\n\
- add r0, r1\n\
- mov r10, r0\n\
- ldr r7, [sp, #0x20]\n\
- lsl r7, #16\n\
- mov r9, r7\n\
- ldr r1, [sp, #0x24]\n\
- lsl r0, r1, #16\n\
- asr r0, #16\n\
- mov r8, r0\n\
-_0800261E:\n\
- ldr r2, [sp, #0x2C]\n\
- str r2, [sp]\n\
- add r0, r4, #0\n\
- add r1, r5, #0\n\
- ldr r2, [sp, #0x30]\n\
- ldr r3, [sp, #0x28]\n\
- bl GetTileMapIndexFromCoords\n\
- lsl r0, #16\n\
- lsr r0, #15\n\
- mov r7, r10\n\
- ldr r1, [r7]\n\
- add r1, r0\n\
- mov r0, r8\n\
- str r0, [sp]\n\
- add r0, r6, #0\n\
- ldr r2, [sp, #0x1C]\n\
- mov r7, r9\n\
- asr r3, r7, #16\n\
- bl CopyTileMapEntry\n\
- add r6, #0x2\n\
- add r0, r4, #0x1\n\
- lsl r0, #16\n\
- lsr r4, r0, #16\n\
- ldr r1, [sp, #0x14]\n\
- ldr r2, [sp, #0x18]\n\
- add r0, r1, r2\n\
- cmp r4, r0\n\
- blt _0800261E\n\
-_0800265A:\n\
- ldr r5, [sp, #0x34]\n\
- lsl r0, r5, #1\n\
- add r6, r0\n\
- ldr r7, [sp, #0x3C]\n\
- lsl r0, r7, #16\n\
- lsr r5, r0, #16\n\
- ldr r0, [sp, #0x38]\n\
- cmp r5, r0\n\
- blt _080025F8\n\
- b _080026EE\n\
- .pool\n\
-_08002674:\n\
- ldr r1, [sp, #0x10]\n\
- add r0, r1, #0\n\
- mul r0, r7\n\
- ldr r2, [sp, #0xC]\n\
- add r0, r2\n\
- ldr r1, [sp, #0x8]\n\
- add r6, r1, r0\n\
- ldr r0, [sp, #0x4]\n\
- mov r1, #0x1\n\
- bl GetBgMetricAffineMode\n\
- lsl r0, #16\n\
- lsr r0, #16\n\
- mov r9, r0\n\
- add r0, r5, r4\n\
- cmp r5, r0\n\
- bge _080026EE\n\
- ldr r2, [sp, #0x18]\n\
- sub r2, r7, r2\n\
- str r2, [sp, #0x34]\n\
- str r0, [sp, #0x38]\n\
- ldr r7, =sGpuBgConfigs2+4\n\
- mov r10, r7\n\
- ldr r0, [sp, #0x4]\n\
- lsl r0, #4\n\
- mov r8, r0\n\
-_080026A8:\n\
- ldr r4, [sp, #0x14]\n\
- ldr r1, [sp, #0x18]\n\
- add r0, r4, r1\n\
- add r2, r5, #0x1\n\
- str r2, [sp, #0x3C]\n\
- cmp r4, r0\n\
- bge _080026DE\n\
- mov r3, r8\n\
- add r3, r10\n\
- mov r7, r9\n\
- mul r7, r5\n\
- mov r12, r7\n\
- add r2, r0, #0\n\
-_080026C2:\n\
- ldr r1, [r3]\n\
- mov r5, r12\n\
- add r0, r5, r4\n\
- add r1, r0\n\
- ldrb r0, [r6]\n\
- ldr r7, [sp, #0x20]\n\
- add r0, r7\n\
- strb r0, [r1]\n\
- add r6, #0x1\n\
- add r0, r4, #0x1\n\
- lsl r0, #16\n\
- lsr r4, r0, #16\n\
- cmp r4, r2\n\
- blt _080026C2\n\
-_080026DE:\n\
- ldr r0, [sp, #0x34]\n\
- add r6, r0\n\
- ldr r1, [sp, #0x3C]\n\
- lsl r0, r1, #16\n\
- lsr r5, r0, #16\n\
- ldr r2, [sp, #0x38]\n\
- cmp r5, r2\n\
- blt _080026A8\n\
-_080026EE:\n\
- add sp, #0x40\n\
- pop {r3-r5}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- mov r10, r5\n\
- pop {r4-r7}\n\
- pop {r0}\n\
- bx r0\n\
- .pool\n");
}
void FillBgTilemapBufferRect_Palette0(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height)
@@ -1494,78 +1248,29 @@ u32 GetTileMapIndexFromCoords(s32 x, s32 y, s32 screenSize, u32 screenWidth, u32
return (y * 0x20) + x;
}
-#ifdef NONMATCHING // This one has some weird switch statement cases that refuse to cooperate
-void CopyTileMapEntry(u16 *src, u16 *dest, s32 palette1, u32 tileOffset, u32 palette2)
+void CopyTileMapEntry(const u16 *src, u16 *dest, s32 palette1, s32 tileOffset, s32 palette2)
{
- u16 test;
+ u16 var;
+
+ if (palette1 == 16)
+ goto CASE_16;
switch (palette1)
{
- default:
- if (palette1 > 0x10 || palette1 < 0)
- test = *src + tileOffset + (palette2 << 12);
- else
- test = ((*src + tileOffset) & 0xFFF) + ((palette1 + palette2) << 12);
- break;
- case 0x10:
- test = ((*dest & 0xFC00) + (palette2 << 12)) | ((*src + tileOffset) & 0x3FF);
- break;
+ case 0 ... 16:
+ var = ((*src + tileOffset) & 0xFFF) + ((palette1 + palette2) << 12);
+ break;
+ CASE_16:
+ var = *dest;
+ var &= 0xFC00;
+ var += palette2 << 12;
+ var |= (*src + tileOffset) & 0x3FF;
+ break;
+ default:
+ var = *src + tileOffset + (palette2 << 12);
+ break;
}
-
- *dest = test;
+ *dest = var;
}
-#else
-NAKED
-void CopyTileMapEntry(u16 *src, u16 *dest, s32 palette1, u32 tileOffset, u32 palette2)
-{
- asm("push {r4-r6,lr}\n\
- add r4, r0, #0\n\
- add r6, r1, #0\n\
- ldr r5, [sp, #0x10]\n\
- cmp r2, #0x10\n\
- beq _08002B14\n\
- cmp r2, #0x10\n\
- bgt _08002B34\n\
- cmp r2, #0\n\
- blt _08002B34\n\
- ldrh r0, [r4]\n\
- add r0, r3\n\
- ldr r3, =0x00000fff\n\
- add r1, r3, #0\n\
- and r0, r1\n\
- add r1, r2, r5\n\
- lsl r1, #12\n\
- b _08002B3A\n\
- .pool\n\
-_08002B14:\n\
- ldrh r1, [r6]\n\
- mov r0, #0xFC\n\
- lsl r0, #8\n\
- and r1, r0\n\
- lsl r2, r5, #12\n\
- add r2, r1, r2\n\
- ldrh r0, [r4]\n\
- add r0, r3\n\
- ldr r3, =0x000003ff\n\
- add r1, r3, #0\n\
- and r0, r1\n\
- orr r0, r2\n\
- b _08002B3C\n\
- .pool\n\
-_08002B34:\n\
- ldrh r0, [r4]\n\
- add r0, r3\n\
- lsl r1, r5, #12\n\
-_08002B3A:\n\
- add r0, r1\n\
-_08002B3C:\n\
- lsl r0, #16\n\
- lsr r1, r0, #16\n\
- strh r1, [r6]\n\
- pop {r4-r6}\n\
- pop {r0}\n\
- bx r0\n");
-}
-#endif // NONMATCHING
u32 GetBgType(u8 bg)
{
diff --git a/src/tileset_anims.c b/src/tileset_anims.c
new file mode 100644
index 000000000..30f390512
--- /dev/null
+++ b/src/tileset_anims.c
@@ -0,0 +1,248 @@
+#include "global.h"
+#include "graphics.h"
+#include "palette.h"
+#include "util.h"
+#include "battle_transition.h"
+#include "task.h"
+#include "fieldmap.h"
+
+static EWRAM_DATA struct {
+ const u16 *src;
+ u16 *dest;
+ u16 size;
+} sTilesetDMA3TransferBuffer[20] = {0};
+
+static u8 sTilesetDMA3TransferBufferSize;
+static u16 sPrimaryTilesetAnimCounter;
+static u16 sPrimaryTilesetAnimCounterMax;
+static u16 sSecondaryTilesetAnimCounter;
+static u16 sSecondaryTilesetAnimCounterMax;
+static void (*sPrimaryTilesetAnimCallback)(u16);
+static void (*sSecondaryTilesetAnimCallback)(u16);
+
+static void _InitPrimaryTilesetAnimation(void);
+static void _InitSecondaryTilesetAnimation(void);
+
+extern const u16 *const gUnknown_83A7660[];
+extern const u16 *const gUnknown_83AA654[];
+extern const u16 *const gUnknown_83AB874[];
+extern const u16 *const gUnknown_83ABDB4[];
+extern const u16 *const gUnknown_83AC1E8[];
+extern const u16 *const gUnknown_83AC5F8[];
+extern const u16 *const gUnknown_83AC7C8[];
+extern const u16 *const gUnknown_83AC950[];
+
+static void ResetTilesetAnimBuffer(void)
+{
+ sTilesetDMA3TransferBufferSize = 0;
+ CpuFill32(0, sTilesetDMA3TransferBuffer, sizeof sTilesetDMA3TransferBuffer);
+}
+
+static void AppendTilesetAnimToBuffer(const u16 *src, u16 *dest, u16 size)
+{
+ if (sTilesetDMA3TransferBufferSize < 20)
+ {
+ sTilesetDMA3TransferBuffer[sTilesetDMA3TransferBufferSize].src = src;
+ sTilesetDMA3TransferBuffer[sTilesetDMA3TransferBufferSize].dest = dest;
+ sTilesetDMA3TransferBuffer[sTilesetDMA3TransferBufferSize].size = size;
+ sTilesetDMA3TransferBufferSize++;
+ }
+}
+
+void TransferTilesetAnimsBuffer(void)
+{
+ int i;
+
+ for (i = 0; i < sTilesetDMA3TransferBufferSize; i++)
+ DmaCopy16(3, sTilesetDMA3TransferBuffer[i].src, sTilesetDMA3TransferBuffer[i].dest, sTilesetDMA3TransferBuffer[i].size);
+
+ sTilesetDMA3TransferBufferSize = 0;
+}
+
+void InitTilesetAnimations(void)
+{
+ ResetTilesetAnimBuffer();
+ _InitPrimaryTilesetAnimation();
+ _InitSecondaryTilesetAnimation();
+}
+
+void InitSecondaryTilesetAnimation(void)
+{
+ _InitSecondaryTilesetAnimation();
+}
+
+void UpdateTilesetAnimations(void)
+{
+ ResetTilesetAnimBuffer();
+ if (++sPrimaryTilesetAnimCounter >= sPrimaryTilesetAnimCounterMax)
+ sPrimaryTilesetAnimCounter = 0;
+ if (++sSecondaryTilesetAnimCounter >= sSecondaryTilesetAnimCounterMax)
+ sSecondaryTilesetAnimCounter = 0;
+
+ if (sPrimaryTilesetAnimCallback)
+ sPrimaryTilesetAnimCallback(sPrimaryTilesetAnimCounter);
+ if (sSecondaryTilesetAnimCallback)
+ sSecondaryTilesetAnimCallback(sSecondaryTilesetAnimCounter);
+}
+
+static void _InitPrimaryTilesetAnimation(void)
+{
+ sPrimaryTilesetAnimCounter = 0;
+ sPrimaryTilesetAnimCounterMax = 0;
+ sPrimaryTilesetAnimCallback = NULL;
+ if (gMapHeader.mapData->primaryTileset && gMapHeader.mapData->primaryTileset->callback)
+ gMapHeader.mapData->primaryTileset->callback();
+}
+
+static void _InitSecondaryTilesetAnimation(void)
+{
+ sSecondaryTilesetAnimCounter = 0;
+ sSecondaryTilesetAnimCounterMax = 0;
+ sSecondaryTilesetAnimCallback = NULL;
+ if (gMapHeader.mapData->secondaryTileset && gMapHeader.mapData->secondaryTileset->callback)
+ gMapHeader.mapData->secondaryTileset->callback();
+}
+
+static void sub_80700A4(u16 timer)
+{
+ const u16 *const *ptr = gUnknown_83A7660;
+ u16 i = timer % 5;
+
+ AppendTilesetAnimToBuffer(ptr[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(508)), 0x80);
+}
+
+static void sub_80700D0(u16 timer)
+{
+ const u16 *const *ptr = gUnknown_83AA654;
+ u16 i = timer % 8;
+
+ AppendTilesetAnimToBuffer(ptr[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(416)), 0x600);
+}
+
+static void sub_80700F8(u16 timer)
+{
+ const u16 *const *ptr = gUnknown_83AB874;
+ u16 i = timer % 8;
+
+ AppendTilesetAnimToBuffer(ptr[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(464)), 0x240);
+}
+
+static void sub_8070120(u16 timer)
+{
+ if (timer % 8 == 0)
+ sub_80700F8(timer >> 3);
+ if (timer % 16 == 1)
+ sub_80700D0(timer >> 4);
+ if (timer % 16 == 2)
+ sub_80700A4(timer >> 4);
+}
+
+void sub_8070154(void)
+{
+ sPrimaryTilesetAnimCounter = 0;
+ sPrimaryTilesetAnimCounterMax = 640;
+ sPrimaryTilesetAnimCallback = sub_8070120;
+}
+
+static void sub_807017C(u16 timer)
+{
+ const u16 *const *ptr = gUnknown_83ABDB4;
+ u16 i = timer % 5;
+
+ AppendTilesetAnimToBuffer(ptr[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(744)), 0x100);
+}
+
+static void sub_80701AC(u16 timer)
+{
+ if (timer % 12 == 0)
+ sub_807017C(timer / 12);
+}
+
+void sub_80701D8(void)
+{
+ sSecondaryTilesetAnimCounter = 0;
+ sSecondaryTilesetAnimCounterMax = 120;
+ sSecondaryTilesetAnimCallback = sub_80701AC;
+}
+
+static void sub_80701FC(u16 timer)
+{
+ const u16 *const *ptr = gUnknown_83AC1E8;
+ u16 i = timer % 4;
+
+ AppendTilesetAnimToBuffer(ptr[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(976)), 0x100);
+}
+
+static void sub_8070224(u16 timer)
+{
+ if (timer % 10 == 0)
+ sub_80701FC(timer / 10);
+}
+
+void sub_8070250(void)
+{
+ sSecondaryTilesetAnimCounter = 0;
+ sSecondaryTilesetAnimCounterMax = 160;
+ sSecondaryTilesetAnimCallback = sub_8070224;
+}
+
+static void sub_8070274(u16 timer)
+{
+ const u16 *const *ptr = gUnknown_83AC5F8;
+ u16 i = timer % 4;
+
+ AppendTilesetAnimToBuffer(ptr[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(896)), 0x100);
+}
+
+static void sub_807029C(u16 timer)
+{
+ if (timer % 16 == 0)
+ sub_8070274(timer >> 4);
+}
+
+void sub_80702B4(void)
+{
+ sSecondaryTilesetAnimCounter = 0;
+ sSecondaryTilesetAnimCounterMax = 256;
+ sSecondaryTilesetAnimCallback = sub_807029C;
+}
+
+static void sub_80702DC(u16 timer)
+{
+ u16 i = timer % 2;
+
+ AppendTilesetAnimToBuffer(gUnknown_83AC7C8[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(880)), 0xE0);
+}
+
+static void sub_8070304(u16 timer)
+{
+ if (timer % 2 == 0)
+ sub_80702DC(timer >> 1);
+}
+
+void sub_807031C(void)
+{
+ sSecondaryTilesetAnimCounter = 0;
+ sSecondaryTilesetAnimCounterMax = 240;
+ sSecondaryTilesetAnimCallback = sub_8070304;
+}
+
+static void sub_8070340(u16 timer)
+{
+ u16 i = timer % 4;
+
+ AppendTilesetAnimToBuffer(gUnknown_83AC950[i], (u16 *)(BG_VRAM + TILE_OFFSET_4BPP(739)), 0x80);
+}
+
+static void sub_8070368(u16 timer)
+{
+ if (timer % 16 == 0)
+ sub_8070340(timer >> 4);
+}
+
+void sub_8070380(void)
+{
+ sSecondaryTilesetAnimCounter = 0;
+ sSecondaryTilesetAnimCounterMax = 256;
+ sSecondaryTilesetAnimCallback = sub_8070368;
+}
diff --git a/src/util.c b/src/util.c
index 5b5fdbb9d..93aa60f84 100644
--- a/src/util.c
+++ b/src/util.c
@@ -151,7 +151,6 @@ void DoBgAffineSet(struct BgAffineDstData *dest, u32 texX, u32 texY, s16 scrX, s
BgAffineSet(&src, dest, 1);
}
-#ifdef NONMATCHING
void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output)
{
u8 x, y;
@@ -166,7 +165,7 @@ void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output)
for (x = 0; x < w; x++)
{
- int tile = (*tilemap & 0x3ff) * 32;
+ u16 tile = (*tilemap & 0x3ff) * 32;
int attr = *tilemap & 0xc00;
if (attr == 0)
@@ -177,7 +176,11 @@ void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output)
{
for (i = 0; i < 8; i++)
{
- DmaCopy32Defvars(3, (7 - i) * 4 + tile + tiles, output + i * 4, 4);
+ u8 requiredForMatching = 0;
+
+ ++requiredForMatching;
+ --requiredForMatching;
+ DmaCopy32Defvars(3, tile + (7 - i) * 4 + tiles, output + i * 4, 4);
}
}
else // xflip
@@ -187,14 +190,16 @@ void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output)
for (j = 0; j < 4; j++)
{
u8 i2 = i * 4;
- xflip[i2 + (3-j)] = (tiles[tile + i2 + j] & 0xf) << 4;
- xflip[i2 + (3-j)] |= tiles[tile + i2 + j] >> 4;
+ xflip[i2 + (3 - j)] = (tiles[tile + i2 + j] & 0xf) << 4;
+ xflip[i2 + (3 - j)] |= tiles[tile + i2 + j] >> 4;
}
}
if (*tilemap & 0x800) // yflip
{
for (i = 0; i < 8; i++)
{
+ ++tile;
+ --tile;
DmaCopy32Defvars(3, (7 - i) * 4 + xflip, output + i * 4, 4);
}
}
@@ -209,247 +214,6 @@ void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output)
tilemap += filler;
}
}
-#else
-NAKED
-void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output)
-{
- asm_unified("\tpush {r4-r7,lr}\n"
- "\tmov r7, r10\n"
- "\tmov r6, r9\n"
- "\tmov r5, r8\n"
- "\tpush {r5-r7}\n"
- "\tsub sp, 0x3C\n"
- "\tstr r2, [sp, 0x20]\n"
- "\tadds r4, r3, 0\n"
- "\tldr r7, [sp, 0x5C]\n"
- "\tlsls r0, 24\n"
- "\tlsls r1, 24\n"
- "\tldr r2, _0804504C @ =sSpriteDimensions\n"
- "\tlsrs r1, 23\n"
- "\tlsrs r0, 21\n"
- "\tadds r1, r0\n"
- "\tadds r0, r2, 0x1\n"
- "\tadds r0, r1, r0\n"
- "\tldrb r0, [r0]\n"
- "\tstr r0, [sp, 0x24]\n"
- "\tadds r1, r2\n"
- "\tldrb r1, [r1]\n"
- "\tstr r1, [sp, 0x28]\n"
- "\tmovs r1, 0\n"
- "\tcmp r1, r0\n"
- "\tbcc _08044FF8\n"
- "\tb _0804517A\n"
- "_08044FF8:\n"
- "\tmovs r0, 0x20\n"
- "\tldr r2, [sp, 0x28]\n"
- "\tsubs r0, r2\n"
- "\tlsls r0, 1\n"
- "\tstr r0, [sp, 0x2C]\n"
- "_08045002:\n"
- "\tmovs r2, 0\n"
- "\tadds r1, 0x1\n"
- "\tstr r1, [sp, 0x34]\n"
- "\tldr r3, [sp, 0x28]\n"
- "\tcmp r2, r3\n"
- "\tbcc _08045010\n"
- "\tb _08045168\n"
- "_08045010:\n"
- "\tldr r0, _08045050 @ =0x040000d4\n"
- "\tmov r8, r0\n"
- "_08045014:\n"
- "\tldrh r1, [r4]\n"
- "\tldr r0, _08045054 @ =0x000003ff\n"
- "\tands r0, r1\n"
- "\tlsls r0, 5\n"
- "\tmov r12, r0\n"
- "\tmovs r0, 0xC0\n"
- "\tlsls r0, 4\n"
- "\tands r0, r1\n"
- "\tmov r3, sp\n"
- "\tstrh r1, [r3, 0x38]\n"
- "\tcmp r0, 0\n"
- "\tbne _0804505C\n"
- "\tldr r0, [sp, 0x20]\n"
- "\tadd r0, r12\n"
- "\tmov r1, r8\n"
- "\tstr r0, [r1]\n"
- "\tstr r7, [r1, 0x4]\n"
- "\tldr r3, _08045058 @ =0x84000008\n"
- "\tstr r3, [r1, 0x8]\n"
- "\tldr r0, [r1, 0x8]\n"
- "\tadds r4, 0x2\n"
- "\tstr r4, [sp, 0x30]\n"
- "\tadds r7, 0x20\n"
- "\tmov r10, r7\n"
- "\tadds r2, 0x1\n"
- "\tmov r9, r2\n"
- "\tb _08045156\n"
- "\t.align 2, 0\n"
- "_0804504C: .4byte sSpriteDimensions\n"
- "_08045050: .4byte 0x040000d4\n"
- "_08045054: .4byte 0x000003ff\n"
- "_08045058: .4byte 0x84000008\n"
- "_0804505C:\n"
- "\tmovs r1, 0x80\n"
- "\tlsls r1, 4\n"
- "\tcmp r0, r1\n"
- "\tbne _080450AC\n"
- "\tmovs r3, 0\n"
- "\tadds r4, 0x2\n"
- "\tstr r4, [sp, 0x30]\n"
- "\tmovs r0, 0x20\n"
- "\tadds r0, r7\n"
- "\tmov r10, r0\n"
- "\tadds r2, 0x1\n"
- "\tmov r9, r2\n"
- "\tldr r4, _080450A4 @ =0x040000d4\n"
- "\tldr r6, _080450A8 @ =0x84000001\n"
- "\tmovs r5, 0x7\n"
- "_0804507A:\n"
- "\tlsls r2, r3, 24\n"
- "\tasrs r2, 24\n"
- "\tsubs r0, r5, r2\n"
- "\tlsls r0, 2\n"
- "\tadd r0, r12\n"
- "\tldr r1, [sp, 0x20]\n"
- "\tadds r0, r1, r0\n"
- "\tlsls r1, r2, 2\n"
- "\tadds r1, r7, r1\n"
- "\tstr r0, [r4]\n"
- "\tstr r1, [r4, 0x4]\n"
- "\tstr r6, [r4, 0x8]\n"
- "\tldr r0, [r4, 0x8]\n"
- "\tadds r2, 0x1\n"
- "\tlsls r2, 24\n"
- "\tlsrs r3, r2, 24\n"
- "\tasrs r2, 24\n"
- "\tcmp r2, 0x7\n"
- "\tble _0804507A\n"
- "\tb _08045156\n"
- "\t.align 2, 0\n"
- "_080450A4: .4byte 0x040000d4\n"
- "_080450A8: .4byte 0x84000001\n"
- "_080450AC:\n"
- "\tmovs r3, 0\n"
- "\tadds r4, 0x2\n"
- "\tstr r4, [sp, 0x30]\n"
- "\tmovs r0, 0x20\n"
- "\tadds r0, r7\n"
- "\tmov r10, r0\n"
- "\tadds r2, 0x1\n"
- "\tmov r9, r2\n"
- "_080450BC:\n"
- "\tmovs r2, 0\n"
- "\tlsls r4, r3, 24\n"
- "\tlsls r0, r4, 2\n"
- "\tlsrs r0, 24\n"
- "\tadds r6, r0, 0x3\n"
- "\tmov r1, r12\n"
- "\tadds r5, r1, r0\n"
- "_080450CA:\n"
- "\tlsls r1, r2, 24\n"
- "\tasrs r1, 24\n"
- "\tsubs r0, r6, r1\n"
- "\tmov r2, sp\n"
- "\tadds r3, r2, r0\n"
- "\tadds r0, r5, r1\n"
- "\tldr r2, [sp, 0x20]\n"
- "\tadds r0, r2, r0\n"
- "\tldrb r2, [r0]\n"
- "\tmovs r0, 0xF\n"
- "\tands r0, r2\n"
- "\tlsls r0, 4\n"
- "\tlsrs r2, 4\n"
- "\torrs r0, r2\n"
- "\tstrb r0, [r3]\n"
- "\tadds r1, 0x1\n"
- "\tlsls r1, 24\n"
- "\tlsrs r2, r1, 24\n"
- "\tasrs r1, 24\n"
- "\tcmp r1, 0x3\n"
- "\tble _080450CA\n"
- "\tmovs r3, 0x80\n"
- "\tlsls r3, 17\n"
- "\tadds r0, r4, r3\n"
- "\tlsrs r3, r0, 24\n"
- "\tasrs r0, 24\n"
- "\tcmp r0, 0x7\n"
- "\tble _080450BC\n"
- "\tmovs r0, 0x80\n"
- "\tlsls r0, 4\n"
- "\tmov r1, sp\n"
- "\tldrh r1, [r1, 0x38]\n"
- "\tands r0, r1\n"
- "\tcmp r0, 0\n"
- "\tbeq _08045148\n"
- "\tmovs r3, 0\n"
- "\tldr r4, _08045140 @ =0x040000d4\n"
- "\tldr r6, _08045144 @ =0x84000001\n"
- "\tmovs r5, 0x7\n"
- "_08045118:\n"
- "\tlsls r1, r3, 24\n"
- "\tasrs r1, 24\n"
- "\tsubs r0, r5, r1\n"
- "\tlsls r0, 2\n"
- "\tmov r3, sp\n"
- "\tadds r2, r3, r0\n"
- "\tlsls r0, r1, 2\n"
- "\tadds r0, r7, r0\n"
- "\tstr r2, [r4]\n"
- "\tstr r0, [r4, 0x4]\n"
- "\tstr r6, [r4, 0x8]\n"
- "\tldr r0, [r4, 0x8]\n"
- "\tadds r1, 0x1\n"
- "\tlsls r1, 24\n"
- "\tlsrs r3, r1, 24\n"
- "\tasrs r1, 24\n"
- "\tcmp r1, 0x7\n"
- "\tble _08045118\n"
- "\tb _08045156\n"
- "\t.align 2, 0\n"
- "_08045140: .4byte 0x040000d4\n"
- "_08045144: .4byte 0x84000001\n"
- "_08045148:\n"
- "\tmov r0, sp\n"
- "\tmov r1, r8\n"
- "\tstr r0, [r1]\n"
- "\tstr r7, [r1, 0x4]\n"
- "\tldr r2, _0804518C @ =0x84000008\n"
- "\tstr r2, [r1, 0x8]\n"
- "\tldr r0, [r1, 0x8]\n"
- "_08045156:\n"
- "\tldr r4, [sp, 0x30]\n"
- "\tmov r7, r10\n"
- "\tmov r3, r9\n"
- "\tlsls r0, r3, 24\n"
- "\tlsrs r2, r0, 24\n"
- "\tldr r0, [sp, 0x28]\n"
- "\tcmp r2, r0\n"
- "\tbcs _08045168\n"
- "\tb _08045014\n"
- "_08045168:\n"
- "\tldr r1, [sp, 0x2C]\n"
- "\tadds r4, r1\n"
- "\tldr r2, [sp, 0x34]\n"
- "\tlsls r0, r2, 24\n"
- "\tlsrs r1, r0, 24\n"
- "\tldr r3, [sp, 0x24]\n"
- "\tcmp r1, r3\n"
- "\tbcs _0804517A\n"
- "\tb _08045002\n"
- "_0804517A:\n"
- "\tadd sp, 0x3C\n"
- "\tpop {r3-r5}\n"
- "\tmov r8, r3\n"
- "\tmov r9, r4\n"
- "\tmov r10, r5\n"
- "\tpop {r4-r7}\n"
- "\tpop {r0}\n"
- "\tbx r0\n"
- "\t.align 2, 0\n"
- "_0804518C: .4byte 0x84000008");
-}
-#endif // NONMATCHING
int CountTrailingZeroBits(u32 value)
{