diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle_transition.c | 7 | ||||
-rw-r--r-- | src/bg.c | 395 | ||||
-rw-r--r-- | src/tileset_anims.c | 248 | ||||
-rw-r--r-- | src/util.c | 256 |
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) @@ -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) { |