From ea33650dc16367edd89143c2c02e4b6757709a5b Mon Sep 17 00:00:00 2001 From: Diegoisawesome Date: Mon, 4 Sep 2017 21:18:52 -0500 Subject: Begin disassembling bg.s --- src/bg.c | 533 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 533 insertions(+) create mode 100644 src/bg.c (limited to 'src') diff --git a/src/bg.c b/src/bg.c new file mode 100644 index 000000000..4130e4bab --- /dev/null +++ b/src/bg.c @@ -0,0 +1,533 @@ +#include "global.h" +#include "dma3.h" + +#define DISPCNT_ALL_BG_AND_MODE_BITS 0x0F07 +#define SECONDARY_TILESET_BASE_TILE 0x4000 +#define SECONDARY_TILESET_BASE_BLOCK 0x800 + +struct BgControl { + struct BgConfig { + u16 visible:1; + u16 unknown_1:1; + u16 screenSize:2; + u16 priority:2; + u16 mosaic:1; + u16 wraparound:1; + + u16 tilesBaseBlock:2; + u16 tileMapBaseBlock:5; + u16 paletteMode:1; + + u8 unknown_2; + u8 unknown_3; + } configs[4]; + + u16 bgVisibilityAndMode; +}; + +struct BgTemplate { + u32 bg:2; + u32 tilesBaseBlock:2; + u32 tileMapBaseBlock:5; + u32 screenSize:2; + u32 paletteMode:1; + u32 priority:2; + u32 unk_1:10; +}; + +struct BgConfig2 { + u32 unk_1:10; + u32 unk_2:4; + u32 unk_3:18; + + u32 unk_4; + u32 unk_5; + u32 unk_6; +}; + +extern struct BgControl gUnknown_030008E0; // gGpuBgConfigs +extern struct BgConfig2 gUnknown_030008F8[4]; // gGpuBgConfigs2 +extern u32 gUnknown_03000938[4]; +extern u32 gUnneededFireRedVariable; +extern struct BgConfig gZeroedBgControlStruct; +extern bool32 IsInvalidBgDuplicate(u8 bg); + +void ResetBgControlStructs(); + +extern void SetTextModeAndHideBgs(); +extern bool8 IsInvalidBg(u8 bg); +extern void SetGpuReg(u8 regOffset, u16 value); +extern u16 GetGpuReg(u8 regOffset); + +void ResetBgs(void) +{ + ResetBgControlStructs(); + gUnknown_030008E0.bgVisibilityAndMode = 0; + SetTextModeAndHideBgs(); +} + +void SetBgModeInternal(u8 bgMode) +{ + gUnknown_030008E0.bgVisibilityAndMode &= 0xFFF8; + gUnknown_030008E0.bgVisibilityAndMode |= bgMode; +} + +u8 GetBgMode(void) +{ + return gUnknown_030008E0.bgVisibilityAndMode & 0x7; +} + +void ResetBgControlStructs(void) +{ + struct BgConfig* bgConfigs = &gUnknown_030008E0.configs[0]; + struct BgConfig zeroedConfig = gZeroedBgControlStruct; + int i; + + for (i = 0; i < 4; i++) + { + bgConfigs[i] = zeroedConfig; + } +} + +void Unused_ResetBgControlStruct(u8 bg) +{ + if (IsInvalidBg(bg) == FALSE) + { + gUnknown_030008E0.configs[bg] = gZeroedBgControlStruct; + } +} + +void SetBgControlAttributes(u8 bg, u8 tilesBaseBlock, u8 tileMapBaseBlock, u8 screenSize, u8 paletteMode, u8 priority, u8 mosaic, u8 wraparound) +{ + if (IsInvalidBg(bg) == FALSE) + { + if (tilesBaseBlock != 0xFF) + { + gUnknown_030008E0.configs[bg].tilesBaseBlock = tilesBaseBlock & 0x3; + } + + if (tileMapBaseBlock != 0xFF) + { + gUnknown_030008E0.configs[bg].tileMapBaseBlock = tileMapBaseBlock & 0x1F; + } + + if (screenSize != 0xFF) + { + gUnknown_030008E0.configs[bg].screenSize = screenSize & 0x3; + } + + if (paletteMode != 0xFF) + { + gUnknown_030008E0.configs[bg].paletteMode = paletteMode; + } + + if (priority != 0xFF) + { + gUnknown_030008E0.configs[bg].priority = priority & 0x3; + } + + if (mosaic != 0xFF) + { + gUnknown_030008E0.configs[bg].mosaic = mosaic & 0x1; + } + + if (wraparound != 0xFF) + { + gUnknown_030008E0.configs[bg].wraparound = wraparound; + } + + gUnknown_030008E0.configs[bg].unknown_2 = 0; + gUnknown_030008E0.configs[bg].unknown_3 = 0; + + gUnknown_030008E0.configs[bg].visible = 1; + } +} + +u16 GetBgControlAttribute(u8 bg, u8 attributeId) +{ + if (IsInvalidBg(bg) == FALSE && gUnknown_030008E0.configs[bg].visible != FALSE) + { + switch (attributeId) + { + case 1: + return gUnknown_030008E0.configs[bg].visible; + case 2: + return gUnknown_030008E0.configs[bg].tilesBaseBlock; + case 3: + return gUnknown_030008E0.configs[bg].tileMapBaseBlock; + case 4: + return gUnknown_030008E0.configs[bg].screenSize; + case 5: + return gUnknown_030008E0.configs[bg].paletteMode; + case 6: + return gUnknown_030008E0.configs[bg].priority; + case 7: + return gUnknown_030008E0.configs[bg].mosaic; + case 8: + return gUnknown_030008E0.configs[bg].wraparound; + } + } + + return 0xFF; +} + +u8 LoadBgVram(u8 bg, void *src, u16 size, u16 destOffset, u8 mode) +{ + u16 offset; + s8 cursor; + + if (IsInvalidBg(bg) == FALSE && gUnknown_030008E0.configs[bg].visible != FALSE) + { + switch (mode) + { + case 0x1: + offset = gUnknown_030008E0.configs[bg].tilesBaseBlock * SECONDARY_TILESET_BASE_TILE; + break; + case 0x2: + offset = gUnknown_030008E0.configs[bg].tileMapBaseBlock * SECONDARY_TILESET_BASE_BLOCK; + break; + default: + cursor = -1; + goto end; + } + + offset = destOffset + offset; + + cursor = RequestDma3Copy(src, (void*)(offset + BG_VRAM), size, 0); + + if (cursor == -1) + { + return -1; + } + } + else + { + return -1; + } + +end: + return cursor; +} + +void ShowBgInternal(u8 bg) +{ + u16 value; + if (IsInvalidBg(bg) == FALSE && gUnknown_030008E0.configs[bg].visible != FALSE) + { + value = gUnknown_030008E0.configs[bg].priority | + (gUnknown_030008E0.configs[bg].tilesBaseBlock << 2) | + (gUnknown_030008E0.configs[bg].mosaic << 6) | + (gUnknown_030008E0.configs[bg].paletteMode << 7) | + (gUnknown_030008E0.configs[bg].tileMapBaseBlock << 8) | + (gUnknown_030008E0.configs[bg].wraparound << 13) | + (gUnknown_030008E0.configs[bg].screenSize << 14); + + SetGpuReg((bg << 1) + 0x8, value); + + gUnknown_030008E0.bgVisibilityAndMode |= 1 << (bg + 8); + gUnknown_030008E0.bgVisibilityAndMode &= DISPCNT_ALL_BG_AND_MODE_BITS; + } +} + +void HideBgInternal(u8 bg) +{ + if (IsInvalidBg(bg) == FALSE) + { + gUnknown_030008E0.bgVisibilityAndMode &= ~(1 << (bg + 8)); + gUnknown_030008E0.bgVisibilityAndMode &= DISPCNT_ALL_BG_AND_MODE_BITS; + } +} + +void SyncBgVisibilityAndMode() +{ + SetGpuReg(0, (GetGpuReg(0) & ~DISPCNT_ALL_BG_AND_MODE_BITS) | gUnknown_030008E0.bgVisibilityAndMode); +} + +void SetTextModeAndHideBgs() +{ + SetGpuReg(0, GetGpuReg(0) & ~DISPCNT_ALL_BG_AND_MODE_BITS); +} + +void SetBgAffineInternal(u8 bg, u32 srcCenterX, u32 srcCenterY, u16 dispCenterX, u16 dispCenterY, u16 scaleX, u16 scaleY, u16 rotationAngle) +{ + struct BgAffineSrcData src; + struct BgAffineDstData dest; + + switch (gUnknown_030008E0.bgVisibilityAndMode & 0x7) + { + case 1: + if (bg != 2) + return; + break; + case 2: + if (bg < 2 || bg > 3) + return; + break; + case 0: + default: + return; + } + + src.texX = srcCenterX; + src.texY = srcCenterY; + src.scrX = dispCenterX; + src.scrY = dispCenterY; + src.sx = scaleX; + src.sy = scaleY; + src.alpha = rotationAngle; + + BgAffineSet(&src, &dest, 1); + + SetGpuReg(REG_OFFSET_BG2PA, dest.pa); + SetGpuReg(REG_OFFSET_BG2PB, dest.pb); + SetGpuReg(REG_OFFSET_BG2PC, dest.pc); + SetGpuReg(REG_OFFSET_BG2PD, dest.pd); + SetGpuReg(REG_OFFSET_BG2PA, dest.pa); + SetGpuReg(REG_OFFSET_BG2X_L, (s16)(dest.dx)); + SetGpuReg(REG_OFFSET_BG2X_H, (s16)(dest.dx >> 16)); + SetGpuReg(REG_OFFSET_BG2Y_L, (s16)(dest.dy)); + SetGpuReg(REG_OFFSET_BG2Y_H, (s16)(dest.dy >> 16)); +} + +bool8 IsInvalidBg(u8 bg) +{ + if (bg > 3) + return TRUE; + return FALSE; +} + +int DummiedOutFireRedLeafGreenTileAllocFunc(int a1, int a2, int a3, int a4) +{ + return 0; +} + +void ResetBgsAndClearDma3BusyFlags(u32 leftoverFireRedLeafGreenVariable) +{ + int i; + ResetBgs(); + + for (i = 0; i < 4; i++) + { + gUnknown_03000938[i] = 0; + } + + gUnneededFireRedVariable = leftoverFireRedLeafGreenVariable; +} + +void InitBgsFromTemplates(u8 bgMode, struct BgTemplate *templates, u8 numTemplates) +{ + int i; + u8 bg; + + SetBgModeInternal(bgMode); + ResetBgControlStructs(); + + for (i = 0; i < numTemplates; i++) + { + bg = templates[i].bg; + if (bg < 4) { + SetBgControlAttributes(bg, + templates[i].tilesBaseBlock, + templates[i].tileMapBaseBlock, + templates[i].screenSize, + templates[i].paletteMode, + templates[i].priority, + 0, + 0); + + gUnknown_030008F8[bg].unk_1 = templates[i].unk_1; + gUnknown_030008F8[bg].unk_2 = 0; + gUnknown_030008F8[bg].unk_3 = 0; + + gUnknown_030008F8[bg].unk_4 = 0; + gUnknown_030008F8[bg].unk_5 = 0; + gUnknown_030008F8[bg].unk_6 = 0; + } + } +} + +void InitBgFromTemplate(struct BgTemplate *template) +{ + u8 bg = template->bg; + + if (bg < 4) + { + SetBgControlAttributes(bg, + template->tilesBaseBlock, + template->tileMapBaseBlock, + template->screenSize, + template->paletteMode, + template->priority, + 0, + 0); + + gUnknown_030008F8[bg].unk_1 = template->unk_1; + gUnknown_030008F8[bg].unk_2 = 0; + gUnknown_030008F8[bg].unk_3 = 0; + + gUnknown_030008F8[bg].unk_4 = 0; + gUnknown_030008F8[bg].unk_5 = 0; + gUnknown_030008F8[bg].unk_6 = 0; + } +} + +void SetBgMode(u8 bgMode) +{ + SetBgModeInternal(bgMode); +} + +u16 LoadBgTiles(u8 bg, void *src, u16 size, u16 destOffset) +{ + u16 unk; + u8 cursor; + + if (GetBgControlAttribute(bg, 5) == 0) + { + unk = (gUnknown_030008F8[bg].unk_1 + destOffset) * 0x20; + } + else + { + unk = (gUnknown_030008F8[bg].unk_1 + destOffset) * 0x40; + } + + cursor = LoadBgVram(bg, src, size, unk, DISPCNT_MODE_1); + + if (cursor == 0xFF) + { + return -1; + } + + gUnknown_03000938[cursor >> 5] |= (1 << (cursor & 0x1F)); + + if (gUnneededFireRedVariable == 1) + { + DummiedOutFireRedLeafGreenTileAllocFunc(bg, unk >> 5, size >> 5, 1); + } + + return cursor; +} + +u16 LoadBgTilemap(u8 bg, void *src, u16 size, u16 destOffset) +{ + u8 cursor; + + cursor = LoadBgVram(bg, src, size, destOffset * 2, DISPCNT_MODE_2); + + if (cursor == 0xFF) + { + return -1; + } + + gUnknown_03000938[cursor >> 5] |= (1 << (cursor & 0x1F)); + + return cursor; +} + +#ifdef NONMATCHING +u16 Unused_LoadBgPalette(u8 bg, void *src, u16 size, u16 destOffset) +{ + u16 unk_1; + s8 cursor; + int cursor2; + u32* ptr; + + if (IsInvalidBgDuplicate(bg) == FALSE) + { + unk_1 = (gUnknown_030008F8[bg].unk_2 * 0x20) + (destOffset * 2); + cursor = RequestDma3Copy(src, (void*)(unk_1 + BG_PLTT), size, 0); + cursor2 = cursor; + } + else + { + return -1; + } + + if (cursor == -1) + { + return -1; + } + + ptr = gUnknown_03000938; + + if (cursor < 0) + { + cursor2 += 0x1F; + } + + cursor2 >>= 5; + + ptr[cursor2] |= (1 << (s8)(cursor - (cursor2 << 5))); + + return (u8)cursor; +} +#else +__attribute__((naked)) +u8 Unused_LoadBgPalette(u8 bg, void *src, u16 size, u16 destOffset) +{ + asm("push {r4-r7,lr}\n\ + add r7, r1, #0\n\ + lsl r0, #24\n\ + lsr r4, r0, #24\n\ + lsl r2, #16\n\ + lsr r6, r2, #16\n\ + lsl r3, #16\n\ + lsr r5, r3, #16\n\ + add r0, r4, #0\n\ + bl IsInvalidBgDuplicate\n\ + cmp r0, #0\n\ + bne _08001A98\n\ + ldr r1, =gUnknown_030008F8\n\ + lsl r0, r4, #4\n\ + add r0, r1\n\ + ldrb r1, [r0, #0x1]\n\ + lsl r1, #26\n\ + lsr r1, #28\n\ + lsl r1, #5\n\ + lsl r0, r5, #1\n\ + add r1, r0\n\ + lsl r1, #16\n\ + lsr r1, #16\n\ + mov r0, #0xA0\n\ + lsl r0, #19\n\ + add r1, r0\n\ + add r0, r7, #0\n\ + add r2, r6, #0\n\ + mov r3, #0\n\ + bl RequestDma3Copy\n\ + lsl r3, r0, #24\n\ + asr r1, r3, #24\n\ + mov r0, #0x1\n\ + neg r0, r0\n\ + cmp r1, r0\n\ + bne _08001AA4\n\ +_08001A98:\n\ + ldr r0, =0x0000ffff\n\ + b _08001AC8\n\ + .pool\n\ +_08001AA4:\n\ + ldr r4, =gUnknown_03000938\n\ + add r0, r1, #0\n\ + cmp r1, #0\n\ + bge _08001AAE\n\ + add r0, #0x1F\n\ +_08001AAE:\n\ + asr r0, #5\n\ + lsl r2, r0, #2\n\ + add r2, r4\n\ + lsl r0, #5\n\ + sub r0, r1, r0\n\ + lsl r0, #24\n\ + asr r0, #24\n\ + mov r1, #0x1\n\ + lsl r1, r0\n\ + ldr r0, [r2]\n\ + orr r0, r1\n\ + str r0, [r2]\n\ + lsr r0, r3, #24\n\ +_08001AC8:\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .pool"); +} +#endif // NONMATCHING -- cgit v1.2.3 From afa3bf20c623b2e9bc263e2e0729f31c918cf9cd Mon Sep 17 00:00:00 2001 From: Diegoisawesome Date: Tue, 5 Sep 2017 01:02:31 -0500 Subject: Continue work on bg.s --- src/bg.c | 124 +++++++++++++++++---------------------------------------------- 1 file changed, 33 insertions(+), 91 deletions(-) (limited to 'src') diff --git a/src/bg.c b/src/bg.c index 4130e4bab..37336c7f1 100644 --- a/src/bg.c +++ b/src/bg.c @@ -58,6 +58,7 @@ extern void SetTextModeAndHideBgs(); extern bool8 IsInvalidBg(u8 bg); extern void SetGpuReg(u8 regOffset, u16 value); extern u16 GetGpuReg(u8 regOffset); +extern s8 CheckForSpaceForDma3Request(s16 index); void ResetBgs(void) { @@ -397,11 +398,11 @@ u16 LoadBgTiles(u8 bg, void *src, u16 size, u16 destOffset) return -1; } - gUnknown_03000938[cursor >> 5] |= (1 << (cursor & 0x1F)); + gUnknown_03000938[cursor / 0x20] |= (1 << (cursor % 0x20)); if (gUnneededFireRedVariable == 1) { - DummiedOutFireRedLeafGreenTileAllocFunc(bg, unk >> 5, size >> 5, 1); + DummiedOutFireRedLeafGreenTileAllocFunc(bg, unk / 0x20, size / 0x20, 1); } return cursor; @@ -418,116 +419,57 @@ u16 LoadBgTilemap(u8 bg, void *src, u16 size, u16 destOffset) return -1; } - gUnknown_03000938[cursor >> 5] |= (1 << (cursor & 0x1F)); + gUnknown_03000938[cursor / 0x20] |= (1 << (cursor % 0x20)); return cursor; } -#ifdef NONMATCHING u16 Unused_LoadBgPalette(u8 bg, void *src, u16 size, u16 destOffset) { u16 unk_1; s8 cursor; - int cursor2; - u32* ptr; if (IsInvalidBgDuplicate(bg) == FALSE) { unk_1 = (gUnknown_030008F8[bg].unk_2 * 0x20) + (destOffset * 2); cursor = RequestDma3Copy(src, (void*)(unk_1 + BG_PLTT), size, 0); - cursor2 = cursor; + + if (cursor == -1) + { + return -1; + } } else { return -1; } - - if (cursor == -1) - { - return -1; - } - ptr = gUnknown_03000938; - - if (cursor < 0) - { - cursor2 += 0x1F; - } - - cursor2 >>= 5; - - ptr[cursor2] |= (1 << (s8)(cursor - (cursor2 << 5))); + gUnknown_03000938[cursor / 0x20] |= (1 << (cursor % 0x20)); return (u8)cursor; } -#else -__attribute__((naked)) -u8 Unused_LoadBgPalette(u8 bg, void *src, u16 size, u16 destOffset) + +bool8 IsDma3ManagerBusyWithBgCopy(void) { - asm("push {r4-r7,lr}\n\ - add r7, r1, #0\n\ - lsl r0, #24\n\ - lsr r4, r0, #24\n\ - lsl r2, #16\n\ - lsr r6, r2, #16\n\ - lsl r3, #16\n\ - lsr r5, r3, #16\n\ - add r0, r4, #0\n\ - bl IsInvalidBgDuplicate\n\ - cmp r0, #0\n\ - bne _08001A98\n\ - ldr r1, =gUnknown_030008F8\n\ - lsl r0, r4, #4\n\ - add r0, r1\n\ - ldrb r1, [r0, #0x1]\n\ - lsl r1, #26\n\ - lsr r1, #28\n\ - lsl r1, #5\n\ - lsl r0, r5, #1\n\ - add r1, r0\n\ - lsl r1, #16\n\ - lsr r1, #16\n\ - mov r0, #0xA0\n\ - lsl r0, #19\n\ - add r1, r0\n\ - add r0, r7, #0\n\ - add r2, r6, #0\n\ - mov r3, #0\n\ - bl RequestDma3Copy\n\ - lsl r3, r0, #24\n\ - asr r1, r3, #24\n\ - mov r0, #0x1\n\ - neg r0, r0\n\ - cmp r1, r0\n\ - bne _08001AA4\n\ -_08001A98:\n\ - ldr r0, =0x0000ffff\n\ - b _08001AC8\n\ - .pool\n\ -_08001AA4:\n\ - ldr r4, =gUnknown_03000938\n\ - add r0, r1, #0\n\ - cmp r1, #0\n\ - bge _08001AAE\n\ - add r0, #0x1F\n\ -_08001AAE:\n\ - asr r0, #5\n\ - lsl r2, r0, #2\n\ - add r2, r4\n\ - lsl r0, #5\n\ - sub r0, r1, r0\n\ - lsl r0, #24\n\ - asr r0, #24\n\ - mov r1, #0x1\n\ - lsl r1, r0\n\ - ldr r0, [r2]\n\ - orr r0, r1\n\ - str r0, [r2]\n\ - lsr r0, r3, #24\n\ -_08001AC8:\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .pool"); + int i; + u8 div; + u8 mod; + + for (i = 0; i < 0x80; i++) + { + div = i / 0x20; + mod = i % 0x20; + + if ((gUnknown_03000938[div] & (1 << mod)) != FALSE) + { + if (CheckForSpaceForDma3Request(i) == -1) + { + return TRUE; + } + + gUnknown_03000938[div] &= ~(1 << mod); + } + } + + return FALSE; } -#endif // NONMATCHING -- cgit v1.2.3 From 3f61c01afa39b5902a94ceaecb62360ba88bae87 Mon Sep 17 00:00:00 2001 From: Diegoisawesome Date: Wed, 6 Sep 2017 21:59:34 -0500 Subject: Stuck on CopyToBgTilemapBufferRect --- src/bg.c | 1137 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 1121 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/bg.c b/src/bg.c index 37336c7f1..902579b57 100644 --- a/src/bg.c +++ b/src/bg.c @@ -40,9 +40,9 @@ struct BgConfig2 { u32 unk_2:4; u32 unk_3:18; - u32 unk_4; - u32 unk_5; - u32 unk_6; + void* tilemap; + u32 bg_x; + u32 bg_y; }; extern struct BgControl gUnknown_030008E0; // gGpuBgConfigs @@ -53,12 +53,17 @@ extern struct BgConfig gZeroedBgControlStruct; extern bool32 IsInvalidBgDuplicate(u8 bg); void ResetBgControlStructs(); +u16 GetBgMetricTextMode(u8 bg, u8 whichMetric); +u16 GetBgMetricAffineMode(u8 bg, u8 whichMetric); +u32 GetBgType(u8 bg); +void SetTextModeAndHideBgs(); +bool8 IsInvalidBg(u8 bg); +bool32 IsTileMapOutsideWram(u8 bg); -extern void SetTextModeAndHideBgs(); -extern bool8 IsInvalidBg(u8 bg); extern void SetGpuReg(u8 regOffset, u16 value); +extern void SetGpuReg_ForcedBlank(u8 regOffset, u16 value); extern u16 GetGpuReg(u8 regOffset); -extern s8 CheckForSpaceForDma3Request(s16 index); +extern int CheckForSpaceForDma3Request(s16 index); void ResetBgs(void) { @@ -249,7 +254,7 @@ void SetTextModeAndHideBgs() SetGpuReg(0, GetGpuReg(0) & ~DISPCNT_ALL_BG_AND_MODE_BITS); } -void SetBgAffineInternal(u8 bg, u32 srcCenterX, u32 srcCenterY, u16 dispCenterX, u16 dispCenterY, u16 scaleX, u16 scaleY, u16 rotationAngle) +void SetBgAffineInternal(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispCenterX, s16 dispCenterY, s16 scaleX, s16 scaleY, u16 rotationAngle) { struct BgAffineSrcData src; struct BgAffineDstData dest; @@ -340,9 +345,9 @@ void InitBgsFromTemplates(u8 bgMode, struct BgTemplate *templates, u8 numTemplat gUnknown_030008F8[bg].unk_2 = 0; gUnknown_030008F8[bg].unk_3 = 0; - gUnknown_030008F8[bg].unk_4 = 0; - gUnknown_030008F8[bg].unk_5 = 0; - gUnknown_030008F8[bg].unk_6 = 0; + gUnknown_030008F8[bg].tilemap = NULL; + gUnknown_030008F8[bg].bg_x = 0; + gUnknown_030008F8[bg].bg_y = 0; } } } @@ -366,9 +371,9 @@ void InitBgFromTemplate(struct BgTemplate *template) gUnknown_030008F8[bg].unk_2 = 0; gUnknown_030008F8[bg].unk_3 = 0; - gUnknown_030008F8[bg].unk_4 = 0; - gUnknown_030008F8[bg].unk_5 = 0; - gUnknown_030008F8[bg].unk_6 = 0; + gUnknown_030008F8[bg].tilemap = NULL; + gUnknown_030008F8[bg].bg_x = 0; + gUnknown_030008F8[bg].bg_y = 0; } } @@ -449,11 +454,14 @@ u16 Unused_LoadBgPalette(u8 bg, void *src, u16 size, u16 destOffset) return (u8)cursor; } +#ifdef NONMATCHING // Matches everything but r5 and r6 are flipped, rrr bool8 IsDma3ManagerBusyWithBgCopy(void) { - int i; - u8 div; u8 mod; + u8 div; + s8 reqSpace; + + int i; for (i = 0; i < 0x80; i++) { @@ -462,7 +470,8 @@ bool8 IsDma3ManagerBusyWithBgCopy(void) if ((gUnknown_03000938[div] & (1 << mod)) != FALSE) { - if (CheckForSpaceForDma3Request(i) == -1) + reqSpace = CheckForSpaceForDma3Request(i); + if (reqSpace == -1) { return TRUE; } @@ -473,3 +482,1099 @@ bool8 IsDma3ManagerBusyWithBgCopy(void) return FALSE; } +#else +__attribute__((naked)) +bool8 IsDma3ManagerBusyWithBgCopy(void) +{ + asm("push {r4-r7,lr}\n\ + mov r5, #0\n\ + mov r7, #0x1\n\ + neg r7, r7\n\ +_08001ADC:\n\ + add r0, r5, #0\n\ + cmp r5, #0\n\ + bge _08001AE4\n\ + add r0, #0x1F\n\ +_08001AE4:\n\ + asr r0, #5\n\ + lsl r2, r0, #24\n\ + lsl r0, #5\n\ + sub r0, r5, r0\n\ + lsl r0, #24\n\ + lsr r0, #24\n\ + ldr r1, =gUnknown_03000938\n\ + lsr r2, #22\n\ + add r4, r2, r1\n\ + mov r6, #0x1\n\ + lsl r6, r0\n\ + ldr r0, [r4]\n\ + and r0, r6\n\ + cmp r0, #0\n\ + beq _08001B22\n\ + lsl r0, r5, #16\n\ + asr r0, #16\n\ + bl CheckForSpaceForDma3Request\n\ + lsl r0, #24\n\ + asr r0, #24\n\ + cmp r0, r7\n\ + bne _08001B1C\n\ + mov r0, #0x1\n\ + b _08001B2A\n\ + .pool\n\ +_08001B1C:\n\ + ldr r0, [r4]\n\ + bic r0, r6\n\ + str r0, [r4]\n\ +_08001B22:\n\ + add r5, #0x1\n\ + cmp r5, #0x7F\n\ + ble _08001ADC\n\ + mov r0, #0\n\ +_08001B2A:\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n"); +} +#endif // NONMATCHING + +void ShowBg(u8 bg) +{ + ShowBgInternal(bg); + SyncBgVisibilityAndMode(); +} + +void HideBg(u8 bg) +{ + HideBgInternal(bg); + SyncBgVisibilityAndMode(); +} + +void SetBgAttribute(u8 bg, u8 attributeId, u8 value) +{ + switch (attributeId) + { + case 1: + SetBgControlAttributes(bg, value, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF); + break; + case 2: + SetBgControlAttributes(bg, 0xFF, value, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF); + break; + case 3: + SetBgControlAttributes(bg, 0xFF, 0xFF, value, 0xFF, 0xFF, 0xFF, 0xFF); + break; + case 4: + SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, value, 0xFF, 0xFF, 0xFF); + break; + case 7: + SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, 0xFF, value, 0xFF, 0xFF); + break; + case 5: + SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, value, 0xFF); + break; + case 6: + SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, value); + break; + } +} + +u16 GetBgAttribute(u8 bg, u8 attributeId) +{ + switch (attributeId) + { + case 1: + return GetBgControlAttribute(bg, 2); + case 2: + return GetBgControlAttribute(bg, 3); + case 3: + return GetBgControlAttribute(bg, 4); + case 4: + return GetBgControlAttribute(bg, 5); + case 7: + return GetBgControlAttribute(bg, 6); + case 5: + return GetBgControlAttribute(bg, 7); + case 6: + return GetBgControlAttribute(bg, 8); + case 8: + switch (GetBgType(bg)) + { + case 0: + return GetBgMetricTextMode(bg, 0) * 0x800; + case 1: + return GetBgMetricAffineMode(bg, 0) * 0x100; + default: + return 0; + } + case 9: + return GetBgType(bg); + case 10: + return gUnknown_030008F8[bg].unk_1; + default: + return -1; + } +} + +#ifdef NONMATCHING // Everything that uses temp1 doesn't match +u32 ChangeBgX(u8 bg, u32 value, u8 op) +{ + u8 mode; + u32 temp1; + + if (IsInvalidBgDuplicate(bg) != FALSE || GetBgControlAttribute(bg, 1) == 0) + { + return -1; + } + + switch (op) + { + case 0: + default: + gUnknown_030008F8[bg].bg_x = value; + break; + case 1: + gUnknown_030008F8[bg].bg_x += value; + break; + case 2: + gUnknown_030008F8[bg].bg_x -= value; + break; + } + + mode = GetBgMode(); + + switch (bg) + { + case 0: + SetGpuReg(REG_OFFSET_BG0HOFS, gUnknown_030008F8[0].bg_x >> 0x8); + break; + case 1: + SetGpuReg(REG_OFFSET_BG1HOFS, gUnknown_030008F8[1].bg_x >> 0x8); + break; + case 2: + if (mode == 0) + { + SetGpuReg(REG_OFFSET_BG2HOFS, gUnknown_030008F8[2].bg_x >> 0x8); + } + else + { + temp1 = gUnknown_030008F8[2].bg_x; + SetGpuReg(REG_OFFSET_BG2X_H, (u16)(temp1 >> 0x10)); + SetGpuReg(REG_OFFSET_BG2X_L, (u16)(temp1)); + } + break; + case 3: + if (mode == 0) + { + SetGpuReg(REG_OFFSET_BG3HOFS, gUnknown_030008F8[3].bg_x >> 0x8); + } + else if (mode == 2) + { + temp1 = gUnknown_030008F8[3].bg_x; + SetGpuReg(REG_OFFSET_BG2X_H, (u16)(temp1 >> 0x10)); + SetGpuReg(REG_OFFSET_BG2X_L, (u16)(temp1)); + } + break; + } + + return gUnknown_030008F8[bg].bg_x; +} +#else +__attribute__((naked)) +u32 ChangeBgX(u8 bg, u32 value, u8 op) +{ + asm("push {r4-r6,lr}\n\ + add r6, r1, #0\n\ + lsl r0, #24\n\ + lsr r4, r0, #24\n\ + lsl r2, #24\n\ + lsr r5, r2, #24\n\ + add r0, r4, #0\n\ + bl IsInvalidBgDuplicate\n\ + cmp r0, #0\n\ + bne _08001D28\n\ + add r0, r4, #0\n\ + mov r1, #0x1\n\ + bl GetBgControlAttribute\n\ + lsl r0, #16\n\ + cmp r0, #0\n\ + bne _08001D2E\n\ +_08001D28:\n\ + mov r0, #0x1\n\ + neg r0, r0\n\ + b _08001E34\n\ +_08001D2E:\n\ + cmp r5, #0x1\n\ + beq _08001D4C\n\ + cmp r5, #0x1\n\ + ble _08001D3A\n\ + cmp r5, #0x2\n\ + beq _08001D60\n\ +_08001D3A:\n\ + ldr r0, =gUnknown_030008F8\n\ + lsl r1, r4, #4\n\ + add r0, #0x8\n\ + add r0, r1, r0\n\ + str r6, [r0]\n\ + add r5, r1, #0\n\ + b _08001D70\n\ + .pool\n\ +_08001D4C:\n\ + ldr r0, =gUnknown_030008F8\n\ + lsl r2, r4, #4\n\ + add r0, #0x8\n\ + add r0, r2, r0\n\ + ldr r1, [r0]\n\ + add r1, r6\n\ + b _08001D6C\n\ + .pool\n\ +_08001D60:\n\ + ldr r0, =gUnknown_030008F8\n\ + lsl r2, r4, #4\n\ + add r0, #0x8\n\ + add r0, r2, r0\n\ + ldr r1, [r0]\n\ + sub r1, r6\n\ +_08001D6C:\n\ + str r1, [r0]\n\ + add r5, r2, #0\n\ +_08001D70:\n\ + bl GetBgMode\n\ + lsl r0, #24\n\ + lsr r0, #24\n\ + cmp r4, #0x1\n\ + beq _08001DAC\n\ + cmp r4, #0x1\n\ + bgt _08001D8C\n\ + cmp r4, #0\n\ + beq _08001D96\n\ + b _08001E2C\n\ + .pool\n\ +_08001D8C:\n\ + cmp r4, #0x2\n\ + beq _08001DC0\n\ + cmp r4, #0x3\n\ + beq _08001DF8\n\ + b _08001E2C\n\ +_08001D96:\n\ + ldr r0, =gUnknown_030008F8\n\ + ldr r0, [r0, #0x8]\n\ + lsl r0, #8\n\ + lsr r1, r0, #16\n\ + mov r0, #0x10\n\ + bl SetGpuReg\n\ + b _08001E2C\n\ + .pool\n\ +_08001DAC:\n\ + ldr r0, =gUnknown_030008F8\n\ + ldr r0, [r0, #0x18]\n\ + lsl r0, #8\n\ + lsr r1, r0, #16\n\ + mov r0, #0x14\n\ + bl SetGpuReg\n\ + b _08001E2C\n\ + .pool\n\ +_08001DC0:\n\ + cmp r0, #0\n\ + bne _08001DD8\n\ + ldr r0, =gUnknown_030008F8\n\ + ldr r0, [r0, #0x28]\n\ + lsl r0, #8\n\ + lsr r1, r0, #16\n\ + mov r0, #0x18\n\ + bl SetGpuReg\n\ + b _08001E2C\n\ + .pool\n\ +_08001DD8:\n\ + ldr r0, =gUnknown_030008F8\n\ + ldr r0, [r0, #0x28]\n\ + lsr r1, r0, #16\n\ + lsl r0, #16\n\ + lsr r4, r0, #16\n\ + mov r0, #0x2A\n\ + bl SetGpuReg\n\ + mov r0, #0x28\n\ + add r1, r4, #0\n\ + bl SetGpuReg\n\ + b _08001E2C\n\ + .pool\n\ +_08001DF8:\n\ + cmp r0, #0\n\ + bne _08001E10\n\ + ldr r0, =gUnknown_030008F8\n\ + ldr r0, [r0, #0x38]\n\ + lsl r0, #8\n\ + lsr r1, r0, #16\n\ + mov r0, #0x1C\n\ + bl SetGpuReg\n\ + b _08001E2C\n\ + .pool\n\ +_08001E10:\n\ + cmp r0, #0x2\n\ + bne _08001E2C\n\ + ldr r0, =gUnknown_030008F8\n\ + ldr r0, [r0, #0x38]\n\ + lsr r1, r0, #16\n\ + lsl r0, #16\n\ + lsr r4, r0, #16\n\ + mov r0, #0x3A\n\ + bl SetGpuReg\n\ + mov r0, #0x38\n\ + add r1, r4, #0\n\ + bl SetGpuReg\n\ +_08001E2C:\n\ + ldr r0, =gUnknown_030008F8\n\ + add r0, #0x8\n\ + add r0, r5, r0\n\ + ldr r0, [r0]\n\ +_08001E34:\n\ + pop {r4-r6}\n\ + pop {r1}\n\ + bx r1\n\ + .pool\n"); +} +#endif // NONMATCHING + +#ifdef NONMATCHING // Probably the stupidest nonmatching ever +u32 GetBgX(u8 bg) +{ + if (IsInvalidBgDuplicate(bg) == FALSE && GetBgControlAttribute(bg, 0x1) != 0) + { + return gUnknown_030008F8[bg].bg_x; + } + else + { + return -1; + } +} +#else +__attribute__((naked)) +u32 GetBgX(u8 bg) +{ + asm("push {r4,lr}\n\ + lsl r0, #24\n\ + lsr r0, #24\n\ + add r4, r0, #0\n\ + bl IsInvalidBgDuplicate\n\ + cmp r0, #0\n\ + bne _08001E70\n\ + add r0, r4, #0\n\ + mov r1, #0x1\n\ + bl GetBgControlAttribute\n\ + lsl r0, #16\n\ + cmp r0, #0\n\ + beq _08001E70\n\ + ldr r0, =gUnknown_030008F8\n\ + lsl r1, r4, #4\n\ + add r0, #0x8\n\ + add r1, r0\n\ + ldr r0, [r1]\n\ + b _08001E74\n\ + .pool\n\ +_08001E70:\n\ + mov r0, #0x1\n\ + neg r0, r0\n\ +_08001E74:\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1\n"); +} +#endif // NONMATCHING + +#ifdef NONMATCHING // Everything that uses temp1 doesn't match +u32 ChangeBgY(u8 bg, u32 value, u8 op) +{ + u8 mode; + u32 temp1; + + if (IsInvalidBgDuplicate(bg) != FALSE || GetBgControlAttribute(bg, 1) == 0) + { + return -1; + } + + switch (op) + { + case 0: + default: + gUnknown_030008F8[bg].bg_y = value; + break; + case 1: + gUnknown_030008F8[bg].bg_y += value; + break; + case 2: + gUnknown_030008F8[bg].bg_y -= value; + break; + } + + mode = GetBgMode(); + + switch (bg) + { + case 0: + SetGpuReg(REG_OFFSET_BG0VOFS, gUnknown_030008F8[0].bg_y >> 0x8); + break; + case 1: + SetGpuReg(REG_OFFSET_BG1VOFS, gUnknown_030008F8[1].bg_y >> 0x8); + break; + case 2: + if (mode == 0) + { + SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_030008F8[2].bg_y >> 0x8); + } + else + { + temp1 = gUnknown_030008F8[2].bg_y; + + SetGpuReg(REG_OFFSET_BG2Y_H, (u16)(temp1 >> 0x10)); + SetGpuReg(REG_OFFSET_BG2Y_L, (u16)(temp1)); + } + break; + case 3: + if (mode == 0) + { + SetGpuReg(REG_OFFSET_BG3VOFS, gUnknown_030008F8[3].bg_y >> 0x8); + } + else if (mode == 2) + { + temp1 = gUnknown_030008F8[3].bg_y; + + SetGpuReg(REG_OFFSET_BG3Y_H, (u16)(temp1 >> 0x10)); + SetGpuReg(REG_OFFSET_BG3Y_L, (u16)(temp1)); + } + break; + } + + return gUnknown_030008F8[bg].bg_y; +} +#else +__attribute__((naked)) +u32 ChangeBgY(u8 bg, u32 value, u8 op) +{ + asm("push {r4-r6,lr}\n\ + add r6, r1, #0\n\ + lsl r0, #24\n\ + lsr r4, r0, #24\n\ + lsl r2, #24\n\ + lsr r5, r2, #24\n\ + add r0, r4, #0\n\ + bl IsInvalidBgDuplicate\n\ + cmp r0, #0\n\ + bne _08001EA0\n\ + add r0, r4, #0\n\ + mov r1, #0x1\n\ + bl GetBgControlAttribute\n\ + lsl r0, #16\n\ + cmp r0, #0\n\ + bne _08001EA6\n\ +_08001EA0:\n\ + mov r0, #0x1\n\ + neg r0, r0\n\ + b _08001FAC\n\ +_08001EA6:\n\ + cmp r5, #0x1\n\ + beq _08001EC4\n\ + cmp r5, #0x1\n\ + ble _08001EB2\n\ + cmp r5, #0x2\n\ + beq _08001ED8\n\ +_08001EB2:\n\ + ldr r0, =gUnknown_030008F8\n\ + lsl r1, r4, #4\n\ + add r0, #0xC\n\ + add r0, r1, r0\n\ + str r6, [r0]\n\ + add r5, r1, #0\n\ + b _08001EE8\n\ + .pool\n\ +_08001EC4:\n\ + ldr r0, =gUnknown_030008F8\n\ + lsl r2, r4, #4\n\ + add r0, #0xC\n\ + add r0, r2, r0\n\ + ldr r1, [r0]\n\ + add r1, r6\n\ + b _08001EE4\n\ + .pool\n\ +_08001ED8:\n\ + ldr r0, =gUnknown_030008F8\n\ + lsl r2, r4, #4\n\ + add r0, #0xC\n\ + add r0, r2, r0\n\ + ldr r1, [r0]\n\ + sub r1, r6\n\ +_08001EE4:\n\ + str r1, [r0]\n\ + add r5, r2, #0\n\ +_08001EE8:\n\ + bl GetBgMode\n\ + lsl r0, #24\n\ + lsr r0, #24\n\ + cmp r4, #0x1\n\ + beq _08001F24\n\ + cmp r4, #0x1\n\ + bgt _08001F04\n\ + cmp r4, #0\n\ + beq _08001F0E\n\ + b _08001FA4\n\ + .pool\n\ +_08001F04:\n\ + cmp r4, #0x2\n\ + beq _08001F38\n\ + cmp r4, #0x3\n\ + beq _08001F70\n\ + b _08001FA4\n\ +_08001F0E:\n\ + ldr r0, =gUnknown_030008F8\n\ + ldr r0, [r0, #0xC]\n\ + lsl r0, #8\n\ + lsr r1, r0, #16\n\ + mov r0, #0x12\n\ + bl SetGpuReg\n\ + b _08001FA4\n\ + .pool\n\ +_08001F24:\n\ + ldr r0, =gUnknown_030008F8\n\ + ldr r0, [r0, #0x1C]\n\ + lsl r0, #8\n\ + lsr r1, r0, #16\n\ + mov r0, #0x16\n\ + bl SetGpuReg\n\ + b _08001FA4\n\ + .pool\n\ +_08001F38:\n\ + cmp r0, #0\n\ + bne _08001F50\n\ + ldr r0, =gUnknown_030008F8\n\ + ldr r0, [r0, #0x2C]\n\ + lsl r0, #8\n\ + lsr r1, r0, #16\n\ + mov r0, #0x1A\n\ + bl SetGpuReg\n\ + b _08001FA4\n\ + .pool\n\ +_08001F50:\n\ + ldr r0, =gUnknown_030008F8\n\ + ldr r0, [r0, #0x2C]\n\ + lsr r1, r0, #16\n\ + lsl r0, #16\n\ + lsr r4, r0, #16\n\ + mov r0, #0x2E\n\ + bl SetGpuReg\n\ + mov r0, #0x2C\n\ + add r1, r4, #0\n\ + bl SetGpuReg\n\ + b _08001FA4\n\ + .pool\n\ +_08001F70:\n\ + cmp r0, #0\n\ + bne _08001F88\n\ + ldr r0, =gUnknown_030008F8\n\ + ldr r0, [r0, #0x3C]\n\ + lsl r0, #8\n\ + lsr r1, r0, #16\n\ + mov r0, #0x1E\n\ + bl SetGpuReg\n\ + b _08001FA4\n\ + .pool\n\ +_08001F88:\n\ + cmp r0, #0x2\n\ + bne _08001FA4\n\ + ldr r0, =gUnknown_030008F8\n\ + ldr r0, [r0, #0x3C]\n\ + lsr r1, r0, #16\n\ + lsl r0, #16\n\ + lsr r4, r0, #16\n\ + mov r0, #0x3E\n\ + bl SetGpuReg\n\ + mov r0, #0x3C\n\ + add r1, r4, #0\n\ + bl SetGpuReg\n\ +_08001FA4:\n\ + ldr r0, =gUnknown_030008F8\n\ + add r0, #0xC\n\ + add r0, r5, r0\n\ + ldr r0, [r0]\n\ +_08001FAC:\n\ + pop {r4-r6}\n\ + pop {r1}\n\ + bx r1\n\ + .pool\n"); +} +#endif // NONMATCHING + +#ifdef NONMATCHING // Same issue as ChangeBgX and ChangeBgY +u32 ChangeBgY_ScreenOff(u8 bg, u32 value, u8 op) +{ + u8 mode; + u16 temp1; + + if (IsInvalidBgDuplicate(bg) != FALSE || GetBgControlAttribute(bg, 1) == 0) + { + return -1; + } + + switch (op) + { + case 0: + default: + gUnknown_030008F8[bg].bg_y = value; + break; + case 1: + gUnknown_030008F8[bg].bg_y += value; + break; + case 2: + gUnknown_030008F8[bg].bg_y -= value; + break; + } + + mode = GetBgMode(); + + switch (bg) + { + case 0: + SetGpuReg_ForcedBlank(REG_OFFSET_BG0VOFS, gUnknown_030008F8[0].bg_y >> 0x8); + break; + case 1: + SetGpuReg_ForcedBlank(REG_OFFSET_BG1VOFS, gUnknown_030008F8[1].bg_y >> 0x8); + break; + case 2: + if (mode == 0) + { + SetGpuReg_ForcedBlank(REG_OFFSET_BG2VOFS, gUnknown_030008F8[2].bg_y >> 0x8); + + } + else + { + temp1 = gUnknown_030008F8[2].bg_y; + + SetGpuReg_ForcedBlank(REG_OFFSET_BG2Y_H, (gUnknown_030008F8[2].bg_y >> 0x10)); + SetGpuReg_ForcedBlank(REG_OFFSET_BG2Y_L, (temp1)); + } + break; + case 3: + if (mode == 0) + { + SetGpuReg_ForcedBlank(REG_OFFSET_BG3VOFS, gUnknown_030008F8[3].bg_y >> 0x8); + } + else if (mode == 2) + { + temp1 = gUnknown_030008F8[3].bg_y; + + SetGpuReg_ForcedBlank(REG_OFFSET_BG3Y_H, (gUnknown_030008F8[3].bg_y >> 0x10)); + SetGpuReg_ForcedBlank(REG_OFFSET_BG3Y_L, (temp1)); + } + break; + } + + return gUnknown_030008F8[bg].bg_y; +} +#else +__attribute__((naked)) +u32 ChangeBgY_ScreenOff(u8 bg, u32 value, u8 op) +{ + asm("push {r4-r6,lr}\n\ + add r6, r1, #0\n\ + lsl r0, #24\n\ + lsr r4, r0, #24\n\ + lsl r2, #24\n\ + lsr r5, r2, #24\n\ + add r0, r4, #0\n\ + bl IsInvalidBgDuplicate\n\ + cmp r0, #0\n\ + bne _08001FDC\n\ + add r0, r4, #0\n\ + mov r1, #0x1\n\ + bl GetBgControlAttribute\n\ + lsl r0, #16\n\ + cmp r0, #0\n\ + bne _08001FE2\n\ +_08001FDC:\n\ + mov r0, #0x1\n\ + neg r0, r0\n\ + b _080020E8\n\ +_08001FE2:\n\ + cmp r5, #0x1\n\ + beq _08002000\n\ + cmp r5, #0x1\n\ + ble _08001FEE\n\ + cmp r5, #0x2\n\ + beq _08002014\n\ +_08001FEE:\n\ + ldr r0, =gUnknown_030008F8\n\ + lsl r1, r4, #4\n\ + add r0, #0xC\n\ + add r0, r1, r0\n\ + str r6, [r0]\n\ + add r5, r1, #0\n\ + b _08002024\n\ + .pool\n\ +_08002000:\n\ + ldr r0, =gUnknown_030008F8\n\ + lsl r2, r4, #4\n\ + add r0, #0xC\n\ + add r0, r2, r0\n\ + ldr r1, [r0]\n\ + add r1, r6\n\ + b _08002020\n\ + .pool\n\ +_08002014:\n\ + ldr r0, =gUnknown_030008F8\n\ + lsl r2, r4, #4\n\ + add r0, #0xC\n\ + add r0, r2, r0\n\ + ldr r1, [r0]\n\ + sub r1, r6\n\ +_08002020:\n\ + str r1, [r0]\n\ + add r5, r2, #0\n\ +_08002024:\n\ + bl GetBgMode\n\ + lsl r0, #24\n\ + lsr r0, #24\n\ + cmp r4, #0x1\n\ + beq _08002060\n\ + cmp r4, #0x1\n\ + bgt _08002040\n\ + cmp r4, #0\n\ + beq _0800204A\n\ + b _080020E0\n\ + .pool\n\ +_08002040:\n\ + cmp r4, #0x2\n\ + beq _08002074\n\ + cmp r4, #0x3\n\ + beq _080020AC\n\ + b _080020E0\n\ +_0800204A:\n\ + ldr r0, =gUnknown_030008F8\n\ + ldr r0, [r0, #0xC]\n\ + lsl r0, #8\n\ + lsr r1, r0, #16\n\ + mov r0, #0x12\n\ + bl SetGpuReg_ForcedBlank\n\ + b _080020E0\n\ + .pool\n\ +_08002060:\n\ + ldr r0, =gUnknown_030008F8\n\ + ldr r0, [r0, #0x1C]\n\ + lsl r0, #8\n\ + lsr r1, r0, #16\n\ + mov r0, #0x16\n\ + bl SetGpuReg_ForcedBlank\n\ + b _080020E0\n\ + .pool\n\ +_08002074:\n\ + cmp r0, #0\n\ + bne _0800208C\n\ + ldr r0, =gUnknown_030008F8\n\ + ldr r0, [r0, #0x2C]\n\ + lsl r0, #8\n\ + lsr r1, r0, #16\n\ + mov r0, #0x1A\n\ + bl SetGpuReg_ForcedBlank\n\ + b _080020E0\n\ + .pool\n\ +_0800208C:\n\ + ldr r0, =gUnknown_030008F8\n\ + ldr r0, [r0, #0x2C]\n\ + lsr r1, r0, #16\n\ + lsl r0, #16\n\ + lsr r4, r0, #16\n\ + mov r0, #0x2E\n\ + bl SetGpuReg_ForcedBlank\n\ + mov r0, #0x2C\n\ + add r1, r4, #0\n\ + bl SetGpuReg_ForcedBlank\n\ + b _080020E0\n\ + .pool\n\ +_080020AC:\n\ + cmp r0, #0\n\ + bne _080020C4\n\ + ldr r0, =gUnknown_030008F8\n\ + ldr r0, [r0, #0x3C]\n\ + lsl r0, #8\n\ + lsr r1, r0, #16\n\ + mov r0, #0x1E\n\ + bl SetGpuReg_ForcedBlank\n\ + b _080020E0\n\ + .pool\n\ +_080020C4:\n\ + cmp r0, #0x2\n\ + bne _080020E0\n\ + ldr r0, =gUnknown_030008F8\n\ + ldr r0, [r0, #0x3C]\n\ + lsr r1, r0, #16\n\ + lsl r0, #16\n\ + lsr r4, r0, #16\n\ + mov r0, #0x3E\n\ + bl SetGpuReg_ForcedBlank\n\ + mov r0, #0x3C\n\ + add r1, r4, #0\n\ + bl SetGpuReg_ForcedBlank\n\ +_080020E0:\n\ + ldr r0, =gUnknown_030008F8\n\ + add r0, #0xC\n\ + add r0, r5, r0\n\ + ldr r0, [r0]\n\ +_080020E8:\n\ + pop {r4-r6}\n\ + pop {r1}\n\ + bx r1\n\ + .pool\n"); +} +#endif // NONMATCHING + +#ifdef NONMATCHING // Probably the stupidest nonmatching ever, electric boogaloo +u32 GetBgY(u8 bg) +{ + if (IsInvalidBgDuplicate(bg) != FALSE || GetBgControlAttribute(bg, 0x1) == 0) + { + return gUnknown_030008F8[bg].bg_y; + } + else + { + return -1; + } +} +#else +__attribute__((naked)) +u32 GetBgY(u8 bg) +{ + asm("push {r4,lr}\n\ + lsl r0, #24\n\ + lsr r0, #24\n\ + add r4, r0, #0\n\ + bl IsInvalidBgDuplicate\n\ + cmp r0, #0\n\ + bne _08002124\n\ + add r0, r4, #0\n\ + mov r1, #0x1\n\ + bl GetBgControlAttribute\n\ + lsl r0, #16\n\ + cmp r0, #0\n\ + beq _08002124\n\ + ldr r0, =gUnknown_030008F8\n\ + lsl r1, r4, #4\n\ + add r0, #0xC\n\ + add r1, r0\n\ + ldr r0, [r1]\n\ + b _08002128\n\ + .pool\n\ +_08002124:\n\ + mov r0, #0x1\n\ + neg r0, r0\n\ +_08002128:\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1\n"); +} +#endif // NONMATCHING + +void SetBgAffine(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispCenterX, s16 dispCenterY, s16 scaleX, s16 scaleY, u16 rotationAngle) +{ + SetBgAffineInternal(bg, srcCenterX, srcCenterY, dispCenterX, dispCenterY, scaleX, scaleY, rotationAngle); +} + +u8 Unused_AdjustBgMosaic(u8 a1, u8 a2) +{ + u16 result; + s16 test1; + s16 test2; + + result = GetGpuReg(REG_OFFSET_MOSAIC); + + test1 = result & 0xF; + test2 = (result >> 4) & 0xF; + result &= 0xFF00; + + switch (a2) + { + case 0: + default: + test1 = a1 & 0xF; + test2 = a1 >> 0x4; + break; + case 1: + test1 = a1 & 0xF; + break; + case 2: + if ((test1 + a1) > 0xF) + { + test1 = 0xF; + } + else + { + test1 += a1; + } + break; + case 3: + if ((test1 - a1) < 0) + { + test1 = 0x0; + } + else + { + test1 -= a1; + } + break; + case 4: + test2 = a1 & 0xF; + break; + case 5: + if ((test2 + a1) > 0xF) + { + test2 = 0xF; + } + else + { + test2 += a1; + } + break; + case 6: + if ((test2 - a1) < 0) + { + test2 = 0x0; + } + else + { + test2 -= a1; + } + break; + } + + result |= ((test2 << 0x4) & 0xF0); + result |= (test1 & 0xF); + + SetGpuReg(REG_OFFSET_MOSAIC, result); + + return result; +} + +void SetBgTilemapBuffer(u8 bg, void *tilemap) +{ + if (IsInvalidBgDuplicate(bg) == FALSE && GetBgControlAttribute(bg, 0x1) != 0x0) + { + gUnknown_030008F8[bg].tilemap = tilemap; + } +} + +void UnsetBgTilemapBuffer(u8 bg) +{ + if (IsInvalidBgDuplicate(bg) == FALSE && GetBgControlAttribute(bg, 0x1) != 0x0) + { + gUnknown_030008F8[bg].tilemap = NULL; + } +} + +#ifdef NONMATCHING // Probably the stupidest nonmatching ever pt 3 +void* GetBgTilemapBuffer(u8 bg) +{ + if (IsInvalidBgDuplicate(bg) == FALSE && GetBgControlAttribute(bg, 0x1) != 0) + { + return gUnknown_030008F8[bg].tilemap; + } + else + { + return NULL; + } +} +#else +__attribute__((naked)) +void* GetBgTilemapBuffer(u8 bg) +{ + asm("push {r4,lr}\n\ + lsl r0, #24\n\ + lsr r0, #24\n\ + add r4, r0, #0\n\ + bl IsInvalidBgDuplicate\n\ + cmp r0, #0\n\ + bne _080022E8\n\ + add r0, r4, #0\n\ + mov r1, #0x1\n\ + bl GetBgControlAttribute\n\ + lsl r0, #16\n\ + cmp r0, #0\n\ + beq _080022E8\n\ + ldr r0, =gUnknown_030008F8\n\ + lsl r1, r4, #4\n\ + add r0, #0x4\n\ + add r1, r0\n\ + ldr r0, [r1]\n\ + b _080022EA\n\ + .pool\n\ +_080022E8:\n\ + mov r0, #0\n\ +_080022EA:\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1\n"); +} +#endif // NONMATCHING + +void CopyToBgTilemapBuffer(u8 bg, void *src, u16 mode, u16 destOffset) +{ + if (IsInvalidBgDuplicate(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) + { + if (mode != 0) + { + CpuCopy16(src, (void *)(gUnknown_030008F8[bg].tilemap + (destOffset * 2)), mode); + } + else + { + LZ77UnCompWram(src, (void *)(gUnknown_030008F8[bg].tilemap + (destOffset * 2))); + } + } +} + +void CopyBgTilemapBufferToVram(u8 bg) +{ + u16 sizeToLoad; + + if (IsInvalidBgDuplicate(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) + { + switch (GetBgType(bg)) + { + case 0: + sizeToLoad = GetBgMetricTextMode(bg, 0) * 0x800; + break; + case 1: + sizeToLoad = GetBgMetricAffineMode(bg, 0) * 0x100; + break; + default: + sizeToLoad = 0; + break; + } + LoadBgVram(bg, gUnknown_030008F8[bg].tilemap, sizeToLoad, 0, 2); + } +} + +void CopyToBgTilemapBufferRect(u8 bg, void* src, u8 destX, u8 destY, u8 width, u8 height) +{ + s16 finalX; + s16 finalY; + u16 test; + + if (IsInvalidBgDuplicate(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) + { + switch (GetBgType(bg)) + { + case 0: + for (finalY = destY + height; destY < finalY; destY++) + { + for (finalX = destX + width; destX < finalX; destX++) + { + ((u16*)gUnknown_030008F8[bg].tilemap)[((destY * 0x20) + destX)] = *((u16*)src)++; + } + } + break; + case 1: + test = GetBgMetricAffineMode(bg, 0x1); + for (finalY = destY + height; destY < finalY; destY++) + { + for (finalX = destX + width; destX < finalX; destX++) + { + ((u8*)gUnknown_030008F8[bg].tilemap)[((destY * test) + destX)] = *((u8*)src)++; + } + } + break; + } + } +} -- cgit v1.2.3 From a2d37efb6792025d8f3753bff782774ba57d10b9 Mon Sep 17 00:00:00 2001 From: Diegoisawesome Date: Wed, 6 Sep 2017 23:53:13 -0500 Subject: Almost perfect now but r8 and r12 are flipped --- src/bg.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/bg.c b/src/bg.c index 902579b57..eec73390e 100644 --- a/src/bg.c +++ b/src/bg.c @@ -1551,27 +1551,36 @@ void CopyToBgTilemapBufferRect(u8 bg, void* src, u8 destX, u8 destY, u8 width, u s16 finalX; s16 finalY; u16 test; + u8 destXCopy; + u8 destYCopy; + void* srcBackup; if (IsInvalidBgDuplicate(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) { switch (GetBgType(bg)) { case 0: - for (finalY = destY + height; destY < finalY; destY++) + srcBackup = src; + destYCopy = destY; + for (finalY = destYCopy + height; destYCopy < finalY; destYCopy++) { - for (finalX = destX + width; destX < finalX; destX++) + destXCopy = destX; + for (finalX = destXCopy + width; destXCopy < finalX; destXCopy++) { - ((u16*)gUnknown_030008F8[bg].tilemap)[((destY * 0x20) + destX)] = *((u16*)src)++; + ((u16*)gUnknown_030008F8[bg].tilemap)[((destYCopy * 0x20) + destXCopy)] = *((u16*)srcBackup)++; } } break; case 1: + srcBackup = src; test = GetBgMetricAffineMode(bg, 0x1); - for (finalY = destY + height; destY < finalY; destY++) + destYCopy = destY; + for (finalY = destYCopy + height; destYCopy < finalY; destYCopy++) { - for (finalX = destX + width; destX < finalX; destX++) + destXCopy = destX; + for (finalX = destXCopy + width; destXCopy < finalX; destXCopy++) { - ((u8*)gUnknown_030008F8[bg].tilemap)[((destY * test) + destX)] = *((u8*)src)++; + ((u8*)gUnknown_030008F8[bg].tilemap)[((destYCopy * test) + destXCopy)] = *((u8*)srcBackup)++; } } break; -- cgit v1.2.3 From 6c6ebd9268e3905e5df719e6abfa00261c517fa3 Mon Sep 17 00:00:00 2001 From: Diegoisawesome Date: Fri, 8 Sep 2017 01:02:35 -0500 Subject: Fix nonmatchings, stuck on CopyRectToBgTilemapBufferRect --- src/bg.c | 216 ++++++++++++++++++++++----------------------------------------- 1 file changed, 75 insertions(+), 141 deletions(-) (limited to 'src') diff --git a/src/bg.c b/src/bg.c index eec73390e..430c9599e 100644 --- a/src/bg.c +++ b/src/bg.c @@ -59,6 +59,9 @@ u32 GetBgType(u8 bg); void SetTextModeAndHideBgs(); bool8 IsInvalidBg(u8 bg); bool32 IsTileMapOutsideWram(u8 bg); +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); +void CopyTileMapEntry(u16 *src, u16 *dest, s32 palette1, u16 tileOffset, u32 palette2); +u32 GetTileMapIndexFromCoords(u32 x, u32 y, u32 screenSize, u32 screenWidth, u32 screenHeight); extern void SetGpuReg(u8 regOffset, u16 value); extern void SetGpuReg_ForcedBlank(u8 regOffset, u16 value); @@ -833,51 +836,14 @@ _08001E34:\n\ } #endif // NONMATCHING -#ifdef NONMATCHING // Probably the stupidest nonmatching ever u32 GetBgX(u8 bg) { - if (IsInvalidBgDuplicate(bg) == FALSE && GetBgControlAttribute(bg, 0x1) != 0) - { - return gUnknown_030008F8[bg].bg_x; - } - else - { + if (IsInvalidBgDuplicate(bg) != FALSE) return -1; - } -} -#else -__attribute__((naked)) -u32 GetBgX(u8 bg) -{ - asm("push {r4,lr}\n\ - lsl r0, #24\n\ - lsr r0, #24\n\ - add r4, r0, #0\n\ - bl IsInvalidBgDuplicate\n\ - cmp r0, #0\n\ - bne _08001E70\n\ - add r0, r4, #0\n\ - mov r1, #0x1\n\ - bl GetBgControlAttribute\n\ - lsl r0, #16\n\ - cmp r0, #0\n\ - beq _08001E70\n\ - ldr r0, =gUnknown_030008F8\n\ - lsl r1, r4, #4\n\ - add r0, #0x8\n\ - add r1, r0\n\ - ldr r0, [r1]\n\ - b _08001E74\n\ - .pool\n\ -_08001E70:\n\ - mov r0, #0x1\n\ - neg r0, r0\n\ -_08001E74:\n\ - pop {r4}\n\ - pop {r1}\n\ - bx r1\n"); + if (GetBgControlAttribute(bg, 0x1) == 0) + return -1; + return gUnknown_030008F8[bg].bg_x; } -#endif // NONMATCHING #ifdef NONMATCHING // Everything that uses temp1 doesn't match u32 ChangeBgY(u8 bg, u32 value, u8 op) @@ -1322,51 +1288,14 @@ _080020E8:\n\ } #endif // NONMATCHING -#ifdef NONMATCHING // Probably the stupidest nonmatching ever, electric boogaloo u32 GetBgY(u8 bg) { - if (IsInvalidBgDuplicate(bg) != FALSE || GetBgControlAttribute(bg, 0x1) == 0) - { - return gUnknown_030008F8[bg].bg_y; - } - else - { + if (IsInvalidBgDuplicate(bg) != FALSE) return -1; - } -} -#else -__attribute__((naked)) -u32 GetBgY(u8 bg) -{ - asm("push {r4,lr}\n\ - lsl r0, #24\n\ - lsr r0, #24\n\ - add r4, r0, #0\n\ - bl IsInvalidBgDuplicate\n\ - cmp r0, #0\n\ - bne _08002124\n\ - add r0, r4, #0\n\ - mov r1, #0x1\n\ - bl GetBgControlAttribute\n\ - lsl r0, #16\n\ - cmp r0, #0\n\ - beq _08002124\n\ - ldr r0, =gUnknown_030008F8\n\ - lsl r1, r4, #4\n\ - add r0, #0xC\n\ - add r1, r0\n\ - ldr r0, [r1]\n\ - b _08002128\n\ - .pool\n\ -_08002124:\n\ - mov r0, #0x1\n\ - neg r0, r0\n\ -_08002128:\n\ - pop {r4}\n\ - pop {r1}\n\ - bx r1\n"); + if (GetBgControlAttribute(bg, 0x1) == 0) + return -1; + return gUnknown_030008F8[bg].bg_y; } -#endif // NONMATCHING void SetBgAffine(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispCenterX, s16 dispCenterY, s16 scaleX, s16 scaleY, u16 rotationAngle) { @@ -1464,50 +1393,14 @@ void UnsetBgTilemapBuffer(u8 bg) } } -#ifdef NONMATCHING // Probably the stupidest nonmatching ever pt 3 void* GetBgTilemapBuffer(u8 bg) { - if (IsInvalidBgDuplicate(bg) == FALSE && GetBgControlAttribute(bg, 0x1) != 0) - { - return gUnknown_030008F8[bg].tilemap; - } - else - { + if (IsInvalidBgDuplicate(bg) != FALSE) return NULL; - } -} -#else -__attribute__((naked)) -void* GetBgTilemapBuffer(u8 bg) -{ - asm("push {r4,lr}\n\ - lsl r0, #24\n\ - lsr r0, #24\n\ - add r4, r0, #0\n\ - bl IsInvalidBgDuplicate\n\ - cmp r0, #0\n\ - bne _080022E8\n\ - add r0, r4, #0\n\ - mov r1, #0x1\n\ - bl GetBgControlAttribute\n\ - lsl r0, #16\n\ - cmp r0, #0\n\ - beq _080022E8\n\ - ldr r0, =gUnknown_030008F8\n\ - lsl r1, r4, #4\n\ - add r0, #0x4\n\ - add r1, r0\n\ - ldr r0, [r1]\n\ - b _080022EA\n\ - .pool\n\ -_080022E8:\n\ - mov r0, #0\n\ -_080022EA:\n\ - pop {r4}\n\ - pop {r1}\n\ - bx r1\n"); + if (GetBgControlAttribute(bg, 0x1) == 0) + return NULL; + return gUnknown_030008F8[bg].tilemap; } -#endif // NONMATCHING void CopyToBgTilemapBuffer(u8 bg, void *src, u16 mode, u16 destOffset) { @@ -1548,42 +1441,83 @@ void CopyBgTilemapBufferToVram(u8 bg) void CopyToBgTilemapBufferRect(u8 bg, void* src, u8 destX, u8 destY, u8 width, u8 height) { - s16 finalX; - s16 finalY; - u16 test; - u8 destXCopy; - u8 destYCopy; - void* srcBackup; + void* srcCopy; + u16 destX16; + u16 destY16; + u16 mode; if (IsInvalidBgDuplicate(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) { switch (GetBgType(bg)) { case 0: - srcBackup = src; - destYCopy = destY; - for (finalY = destYCopy + height; destYCopy < finalY; destYCopy++) + srcCopy = src; + for (destY16 = destY; destY16 < (destY + height); destY16++) { - destXCopy = destX; - for (finalX = destXCopy + width; destXCopy < finalX; destXCopy++) + for (destX16 = destX; destX16 < (destX + width); destX16++) { - ((u16*)gUnknown_030008F8[bg].tilemap)[((destYCopy * 0x20) + destXCopy)] = *((u16*)srcBackup)++; + ((u16*)gUnknown_030008F8[bg].tilemap)[((destY16 * 0x20) + destX16)] = *((u16*)srcCopy)++; } } break; case 1: - srcBackup = src; - test = GetBgMetricAffineMode(bg, 0x1); - destYCopy = destY; - for (finalY = destYCopy + height; destYCopy < finalY; destYCopy++) + srcCopy = src; + mode = GetBgMetricAffineMode(bg, 0x1); + for (destY16 = destY; destY16 < (destY + height); destY16++) { - destXCopy = destX; - for (finalX = destXCopy + width; destXCopy < finalX; destXCopy++) + for (destX16 = destX; destX16 < (destX + width); destX16++) { - ((u8*)gUnknown_030008F8[bg].tilemap)[((destYCopy * test) + destXCopy)] = *((u8*)srcBackup)++; + ((u8*)gUnknown_030008F8[bg].tilemap)[((destY16 * mode) + destX16)] = *((u8*)srcCopy)++; } } break; } } } + +void CopyToBgTilemapBufferRect_ChangePalette(u8 bg, void *src, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette) +{ + CopyRectToBgTilemapBufferRect(bg, src, 0, 0, rectWidth, rectHeight, destX, destY, rectWidth, rectHeight, palette, 0, 0); +} +/* +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; + + if (IsInvalidBgDuplicate(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) + { + attribute = GetBgControlAttribute(bg, 0x4); + mode = GetBgMetricTextMode(bg, 0x1) * 0x20; + mode2 = GetBgMetricTextMode(bg, 0x2) * 0x20; + switch (GetBgType(bg)) + { + case 0: + srcCopy = src; + for (destY16 = destY; destY16 < (destY + rectHeight); destY16++) + { + for (destX16 = destX; destX16 < (destX + rectWidth); destX16++) + { + CopyTileMapEntry(&((u16*)srcCopy)[(srcY * rectWidth) + srcX], &((u16*)gUnknown_030008F8[bg].tilemap)[GetTileMapIndexFromCoords(destX16, destY16, attribute, mode, mode2)], palette1, tileOffset, palette2); + } + } + break; + case 1: + srcCopy = src; + mode = GetBgMetricAffineMode(bg, 0x1); + for (destY16 = destY; destY16 < (destY + rectHeight); destY16++) + { + for (destX16 = destX; destX16 < (destX + rectWidth); destX16++) + { + CopyTileMapEntry(&((u16*)srcCopy)[(srcY * rectWidth) + srcX], &((u16*)gUnknown_030008F8[bg].tilemap)[GetTileMapIndexFromCoords(destX16, destY16, attribute, mode, mode2)], palette1, tileOffset, palette2); + } + } + break; + } + } +}*/ -- cgit v1.2.3 From 001d1027e38059654480707e90927ce0245faf29 Mon Sep 17 00:00:00 2001 From: Diegoisawesome Date: Sat, 9 Sep 2017 19:46:19 -0500 Subject: Finish bg.s, 6 nonmatching --- src/bg.c | 599 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 579 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/bg.c b/src/bg.c index 430c9599e..e4083fbcf 100644 --- a/src/bg.c +++ b/src/bg.c @@ -50,18 +50,19 @@ extern struct BgConfig2 gUnknown_030008F8[4]; // gGpuBgConfigs2 extern u32 gUnknown_03000938[4]; extern u32 gUnneededFireRedVariable; extern struct BgConfig gZeroedBgControlStruct; -extern bool32 IsInvalidBgDuplicate(u8 bg); +extern bool32 IsInvalidBg32(u8 bg); void ResetBgControlStructs(); u16 GetBgMetricTextMode(u8 bg, u8 whichMetric); -u16 GetBgMetricAffineMode(u8 bg, u8 whichMetric); +u32 GetBgMetricAffineMode(u8 bg, u8 whichMetric); u32 GetBgType(u8 bg); void SetTextModeAndHideBgs(); bool8 IsInvalidBg(u8 bg); bool32 IsTileMapOutsideWram(u8 bg); 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); -void CopyTileMapEntry(u16 *src, u16 *dest, s32 palette1, u16 tileOffset, u32 palette2); -u32 GetTileMapIndexFromCoords(u32 x, u32 y, u32 screenSize, u32 screenWidth, u32 screenHeight); +void CopyTileMapEntry(u16 *src, u16 *dest, s32 palette1, u32 tileOffset, u32 palette2); +u32 GetTileMapIndexFromCoords(s32 x, s32 y, s32 screenSize, u32 screenWidth, u32 screenHeight); +void WriteSequenceToBgTilemapBuffer(u8 bg, u16 firstTileNum, u8 x, u8 y, u8 width, u8 height, u8 paletteSlot, s16 tileNumDelta); extern void SetGpuReg(u8 regOffset, u16 value); extern void SetGpuReg_ForcedBlank(u8 regOffset, u16 value); @@ -437,7 +438,7 @@ u16 Unused_LoadBgPalette(u8 bg, void *src, u16 size, u16 destOffset) u16 unk_1; s8 cursor; - if (IsInvalidBgDuplicate(bg) == FALSE) + if (IsInvalidBg32(bg) == FALSE) { unk_1 = (gUnknown_030008F8[bg].unk_2 * 0x20) + (destOffset * 2); cursor = RequestDma3Copy(src, (void*)(unk_1 + BG_PLTT), size, 0); @@ -623,7 +624,7 @@ u32 ChangeBgX(u8 bg, u32 value, u8 op) u8 mode; u32 temp1; - if (IsInvalidBgDuplicate(bg) != FALSE || GetBgControlAttribute(bg, 1) == 0) + if (IsInvalidBg32(bg) != FALSE || GetBgControlAttribute(bg, 1) == 0) { return -1; } @@ -691,7 +692,7 @@ u32 ChangeBgX(u8 bg, u32 value, u8 op) lsl r2, #24\n\ lsr r5, r2, #24\n\ add r0, r4, #0\n\ - bl IsInvalidBgDuplicate\n\ + bl IsInvalidBg32\n\ cmp r0, #0\n\ bne _08001D28\n\ add r0, r4, #0\n\ @@ -838,7 +839,7 @@ _08001E34:\n\ u32 GetBgX(u8 bg) { - if (IsInvalidBgDuplicate(bg) != FALSE) + if (IsInvalidBg32(bg) != FALSE) return -1; if (GetBgControlAttribute(bg, 0x1) == 0) return -1; @@ -851,7 +852,7 @@ u32 ChangeBgY(u8 bg, u32 value, u8 op) u8 mode; u32 temp1; - if (IsInvalidBgDuplicate(bg) != FALSE || GetBgControlAttribute(bg, 1) == 0) + if (IsInvalidBg32(bg) != FALSE || GetBgControlAttribute(bg, 1) == 0) { return -1; } @@ -921,7 +922,7 @@ u32 ChangeBgY(u8 bg, u32 value, u8 op) lsl r2, #24\n\ lsr r5, r2, #24\n\ add r0, r4, #0\n\ - bl IsInvalidBgDuplicate\n\ + bl IsInvalidBg32\n\ cmp r0, #0\n\ bne _08001EA0\n\ add r0, r4, #0\n\ @@ -1072,7 +1073,7 @@ u32 ChangeBgY_ScreenOff(u8 bg, u32 value, u8 op) u8 mode; u16 temp1; - if (IsInvalidBgDuplicate(bg) != FALSE || GetBgControlAttribute(bg, 1) == 0) + if (IsInvalidBg32(bg) != FALSE || GetBgControlAttribute(bg, 1) == 0) { return -1; } @@ -1143,7 +1144,7 @@ u32 ChangeBgY_ScreenOff(u8 bg, u32 value, u8 op) lsl r2, #24\n\ lsr r5, r2, #24\n\ add r0, r4, #0\n\ - bl IsInvalidBgDuplicate\n\ + bl IsInvalidBg32\n\ cmp r0, #0\n\ bne _08001FDC\n\ add r0, r4, #0\n\ @@ -1290,7 +1291,7 @@ _080020E8:\n\ u32 GetBgY(u8 bg) { - if (IsInvalidBgDuplicate(bg) != FALSE) + if (IsInvalidBg32(bg) != FALSE) return -1; if (GetBgControlAttribute(bg, 0x1) == 0) return -1; @@ -1379,7 +1380,7 @@ u8 Unused_AdjustBgMosaic(u8 a1, u8 a2) void SetBgTilemapBuffer(u8 bg, void *tilemap) { - if (IsInvalidBgDuplicate(bg) == FALSE && GetBgControlAttribute(bg, 0x1) != 0x0) + if (IsInvalidBg32(bg) == FALSE && GetBgControlAttribute(bg, 0x1) != 0x0) { gUnknown_030008F8[bg].tilemap = tilemap; } @@ -1387,7 +1388,7 @@ void SetBgTilemapBuffer(u8 bg, void *tilemap) void UnsetBgTilemapBuffer(u8 bg) { - if (IsInvalidBgDuplicate(bg) == FALSE && GetBgControlAttribute(bg, 0x1) != 0x0) + if (IsInvalidBg32(bg) == FALSE && GetBgControlAttribute(bg, 0x1) != 0x0) { gUnknown_030008F8[bg].tilemap = NULL; } @@ -1395,7 +1396,7 @@ void UnsetBgTilemapBuffer(u8 bg) void* GetBgTilemapBuffer(u8 bg) { - if (IsInvalidBgDuplicate(bg) != FALSE) + if (IsInvalidBg32(bg) != FALSE) return NULL; if (GetBgControlAttribute(bg, 0x1) == 0) return NULL; @@ -1404,7 +1405,7 @@ void* GetBgTilemapBuffer(u8 bg) void CopyToBgTilemapBuffer(u8 bg, void *src, u16 mode, u16 destOffset) { - if (IsInvalidBgDuplicate(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) + if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) { if (mode != 0) { @@ -1421,7 +1422,7 @@ void CopyBgTilemapBufferToVram(u8 bg) { u16 sizeToLoad; - if (IsInvalidBgDuplicate(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) + if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) { switch (GetBgType(bg)) { @@ -1446,7 +1447,7 @@ void CopyToBgTilemapBufferRect(u8 bg, void* src, u8 destX, u8 destY, u8 width, u u16 destY16; u16 mode; - if (IsInvalidBgDuplicate(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) + if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) { switch (GetBgType(bg)) { @@ -1479,6 +1480,7 @@ void CopyToBgTilemapBufferRect_ChangePalette(u8 bg, void *src, u8 destX, u8 dest { 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) { @@ -1490,7 +1492,7 @@ void CopyRectToBgTilemapBufferRect(u8 bg, void* src, u8 srcX, u8 srcY, u8 srcWid u16 destX16; u16 destY16; - if (IsInvalidBgDuplicate(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) + if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) { attribute = GetBgControlAttribute(bg, 0x4); mode = GetBgMetricTextMode(bg, 0x1) * 0x20; @@ -1521,3 +1523,560 @@ void CopyRectToBgTilemapBufferRect(u8 bg, void* src, u8 srcX, u8 srcY, u8 srcWid } } }*/ +__attribute__((naked)) +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) +{ + 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, =gUnknown_030008FC\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, =gUnknown_030008FC\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) +{ + u16 x16; + u16 y16; + u16 mode; + + if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) + { + switch (GetBgType(bg)) + { + case 0: + for (y16 = y; y16 < (y + height); y16++) + { + for (x16 = x; x16 < (x + width); x16++) + { + ((u16*)gUnknown_030008F8[bg].tilemap)[((y16 * 0x20) + x16)] = tileNum; + } + } + break; + case 1: + mode = GetBgMetricAffineMode(bg, 0x1); + for (y16 = y; y16 < (y + height); y16++) + { + for (x16 = x; x16 < (x + width); x16++) + { + ((u8*)gUnknown_030008F8[bg].tilemap)[((y16 * mode) + x16)] = tileNum; + } + } + break; + } + } +} + +void FillBgTilemapBufferRect(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height, u8 palette) +{ + WriteSequenceToBgTilemapBuffer(bg, tileNum, x, y, width, height, palette, 0); +} + +void WriteSequenceToBgTilemapBuffer(u8 bg, u16 firstTileNum, u8 x, u8 y, u8 width, u8 height, u8 paletteSlot, s16 tileNumDelta) +{ + u16 mode; + u16 mode2; + u16 attribute; + u16 mode3; + + u16 x16; + u16 y16; + + if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) + { + attribute = GetBgControlAttribute(bg, 0x4); + mode = GetBgMetricTextMode(bg, 0x1) * 0x20; + mode2 = GetBgMetricTextMode(bg, 0x2) * 0x20; + switch (GetBgType(bg)) + { + case 0: + for (y16 = y; y16 < (y + height); y16++) + { + for (x16 = x; x16 < (x + width); x16++) + { + CopyTileMapEntry(&firstTileNum, &((u16*)gUnknown_030008F8[bg].tilemap)[(u16)GetTileMapIndexFromCoords(x16, y16, attribute, mode, mode2)], paletteSlot, 0, 0); + firstTileNum = (firstTileNum & 0xFC00) + ((firstTileNum + tileNumDelta) & 0x3FF); + } + } + break; + case 1: + mode3 = GetBgMetricAffineMode(bg, 0x1); + for (y16 = y; y16 < (y + height); y16++) + { + for (x16 = x; x16 < (x + width); x16++) + { + ((u8*)gUnknown_030008F8[bg].tilemap)[(y16 * mode3) + x16] = firstTileNum; + firstTileNum = (firstTileNum & 0xFC00) + ((firstTileNum + tileNumDelta) & 0x3FF); + } + } + break; + } + } +} + +u16 GetBgMetricTextMode(u8 bg, u8 whichMetric) +{ + u8 attribute; + + attribute = GetBgControlAttribute(bg, 0x4); + + switch (whichMetric) + { + case 0: + switch (attribute) + { + case 0: + return 1; + case 1: + case 2: + return 2; + case 3: + return 4; + } + break; + case 1: + switch (attribute) + { + case 0: + return 1; + case 1: + return 2; + case 2: + return 1; + case 3: + return 2; + } + break; + case 2: + switch (attribute) + { + case 0: + case 1: + return 1; + case 2: + case 3: + return 2; + } + break; + } + return 0; +} + +u32 GetBgMetricAffineMode(u8 bg, u8 whichMetric) +{ + u8 attribute; + + attribute = GetBgControlAttribute(bg, 0x4); + + switch (whichMetric) + { + case 0: + switch (attribute) + { + case 0: + return 0x1; + case 1: + return 0x4; + case 2: + return 0x10; + case 3: + return 0x40; + } + break; + case 1: + case 2: + return 0x10 << attribute; + } + return 0; +} + +u32 GetTileMapIndexFromCoords(s32 x, s32 y, s32 screenSize, u32 screenWidth, u32 screenHeight) +{ + x = x & (screenWidth - 1); + y = y & (screenHeight - 1); + + switch (screenSize) + { + case 0: + case 2: + break; + case 3: + if (y >= 0x20) + y += 0x20; + case 1: + if (x >= 0x20) + { + x -= 0x20; + y += 0x20; + } + } + 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) +{ + u16 test; + switch (palette1) + { + case 0x0 ... 0x10: + if (palette1 != 0x10) + test = ((*src + tileOffset) & 0xFFF) + ((palette1 + palette2) << 12); + else + test = ((*dest & 0xFC00) + (palette2 << 12)) | ((*src + tileOffset) & 0x3FF); + break; + default: + test = *src + tileOffset + (palette2 << 12); + break; + } + + *dest = test; +} +#else +__attribute__((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) +{ + u8 mode; + + mode = GetBgMode(); + + + switch (bg) + { + case 0: + case 1: + switch (mode) + { + case 0: + case 1: + return 0; + } + break; + case 2: + switch (mode) + { + case 0: + return 0; + case 1: + case 2: + return 1; + } + break; + case 3: + switch (mode) + { + case 0: + return 0; + case 2: + return 1; + } + break; + } + + return 0xFFFF; +} + +bool32 IsInvalidBg32(u8 bg) +{ + if (bg > 3) + return TRUE; + return FALSE; +} + +bool32 IsTileMapOutsideWram(u8 bg) +{ + if (gUnknown_030008F8[bg].tilemap > (void*)IWRAM_END) + return TRUE; + if (gUnknown_030008F8[bg].tilemap == 0x0) + return TRUE; + return FALSE; +} -- cgit v1.2.3 From f29fc55796cc5500f954b396264edc863f96f486 Mon Sep 17 00:00:00 2001 From: Diegoisawesome Date: Sat, 9 Sep 2017 20:52:33 -0500 Subject: Cleanup bg.c --- src/bg.c | 440 ++++++++++++++++++++++++++++----------------------------------- 1 file changed, 194 insertions(+), 246 deletions(-) (limited to 'src') diff --git a/src/bg.c b/src/bg.c index e4083fbcf..d3c366659 100644 --- a/src/bg.c +++ b/src/bg.c @@ -1,68 +1,16 @@ #include "global.h" +#include "bg.h" #include "dma3.h" #define DISPCNT_ALL_BG_AND_MODE_BITS 0x0F07 -#define SECONDARY_TILESET_BASE_TILE 0x4000 -#define SECONDARY_TILESET_BASE_BLOCK 0x800 -struct BgControl { - struct BgConfig { - u16 visible:1; - u16 unknown_1:1; - u16 screenSize:2; - u16 priority:2; - u16 mosaic:1; - u16 wraparound:1; - - u16 tilesBaseBlock:2; - u16 tileMapBaseBlock:5; - u16 paletteMode:1; - - u8 unknown_2; - u8 unknown_3; - } configs[4]; - - u16 bgVisibilityAndMode; -}; +static struct BgControl gGpuBgConfigs; +static struct BgConfig2 gGpuBgConfigs2[4]; +static u32 gDmaBusyBitfield[4]; -struct BgTemplate { - u32 bg:2; - u32 tilesBaseBlock:2; - u32 tileMapBaseBlock:5; - u32 screenSize:2; - u32 paletteMode:1; - u32 priority:2; - u32 unk_1:10; -}; +u32 gUnneededFireRedVariable; -struct BgConfig2 { - u32 unk_1:10; - u32 unk_2:4; - u32 unk_3:18; - - void* tilemap; - u32 bg_x; - u32 bg_y; -}; - -extern struct BgControl gUnknown_030008E0; // gGpuBgConfigs -extern struct BgConfig2 gUnknown_030008F8[4]; // gGpuBgConfigs2 -extern u32 gUnknown_03000938[4]; -extern u32 gUnneededFireRedVariable; -extern struct BgConfig gZeroedBgControlStruct; -extern bool32 IsInvalidBg32(u8 bg); - -void ResetBgControlStructs(); -u16 GetBgMetricTextMode(u8 bg, u8 whichMetric); -u32 GetBgMetricAffineMode(u8 bg, u8 whichMetric); -u32 GetBgType(u8 bg); -void SetTextModeAndHideBgs(); -bool8 IsInvalidBg(u8 bg); -bool32 IsTileMapOutsideWram(u8 bg); -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); -void CopyTileMapEntry(u16 *src, u16 *dest, s32 palette1, u32 tileOffset, u32 palette2); -u32 GetTileMapIndexFromCoords(s32 x, s32 y, s32 screenSize, u32 screenWidth, u32 screenHeight); -void WriteSequenceToBgTilemapBuffer(u8 bg, u16 firstTileNum, u8 x, u8 y, u8 width, u8 height, u8 paletteSlot, s16 tileNumDelta); +static const struct BgConfig gZeroedBgControlStruct = { 0 }; extern void SetGpuReg(u8 regOffset, u16 value); extern void SetGpuReg_ForcedBlank(u8 regOffset, u16 value); @@ -72,24 +20,24 @@ extern int CheckForSpaceForDma3Request(s16 index); void ResetBgs(void) { ResetBgControlStructs(); - gUnknown_030008E0.bgVisibilityAndMode = 0; + gGpuBgConfigs.bgVisibilityAndMode = 0; SetTextModeAndHideBgs(); } void SetBgModeInternal(u8 bgMode) { - gUnknown_030008E0.bgVisibilityAndMode &= 0xFFF8; - gUnknown_030008E0.bgVisibilityAndMode |= bgMode; + gGpuBgConfigs.bgVisibilityAndMode &= 0xFFF8; + gGpuBgConfigs.bgVisibilityAndMode |= bgMode; } u8 GetBgMode(void) { - return gUnknown_030008E0.bgVisibilityAndMode & 0x7; + return gGpuBgConfigs.bgVisibilityAndMode & 0x7; } void ResetBgControlStructs(void) { - struct BgConfig* bgConfigs = &gUnknown_030008E0.configs[0]; + struct BgConfig* bgConfigs = &gGpuBgConfigs.configs[0]; struct BgConfig zeroedConfig = gZeroedBgControlStruct; int i; @@ -103,78 +51,78 @@ void Unused_ResetBgControlStruct(u8 bg) { if (IsInvalidBg(bg) == FALSE) { - gUnknown_030008E0.configs[bg] = gZeroedBgControlStruct; + gGpuBgConfigs.configs[bg] = gZeroedBgControlStruct; } } -void SetBgControlAttributes(u8 bg, u8 tilesBaseBlock, u8 tileMapBaseBlock, u8 screenSize, u8 paletteMode, u8 priority, u8 mosaic, u8 wraparound) +void SetBgControlAttributes(u8 bg, u8 charBaseIndex, u8 mapBaseIndex, u8 screenSize, u8 paletteMode, u8 priority, u8 mosaic, u8 wraparound) { if (IsInvalidBg(bg) == FALSE) { - if (tilesBaseBlock != 0xFF) + if (charBaseIndex != 0xFF) { - gUnknown_030008E0.configs[bg].tilesBaseBlock = tilesBaseBlock & 0x3; + gGpuBgConfigs.configs[bg].charBaseIndex = charBaseIndex & 0x3; } - if (tileMapBaseBlock != 0xFF) + if (mapBaseIndex != 0xFF) { - gUnknown_030008E0.configs[bg].tileMapBaseBlock = tileMapBaseBlock & 0x1F; + gGpuBgConfigs.configs[bg].mapBaseIndex = mapBaseIndex & 0x1F; } if (screenSize != 0xFF) { - gUnknown_030008E0.configs[bg].screenSize = screenSize & 0x3; + gGpuBgConfigs.configs[bg].screenSize = screenSize & 0x3; } if (paletteMode != 0xFF) { - gUnknown_030008E0.configs[bg].paletteMode = paletteMode; + gGpuBgConfigs.configs[bg].paletteMode = paletteMode; } if (priority != 0xFF) { - gUnknown_030008E0.configs[bg].priority = priority & 0x3; + gGpuBgConfigs.configs[bg].priority = priority & 0x3; } if (mosaic != 0xFF) { - gUnknown_030008E0.configs[bg].mosaic = mosaic & 0x1; + gGpuBgConfigs.configs[bg].mosaic = mosaic & 0x1; } if (wraparound != 0xFF) { - gUnknown_030008E0.configs[bg].wraparound = wraparound; + gGpuBgConfigs.configs[bg].wraparound = wraparound; } - gUnknown_030008E0.configs[bg].unknown_2 = 0; - gUnknown_030008E0.configs[bg].unknown_3 = 0; + gGpuBgConfigs.configs[bg].unknown_2 = 0; + gGpuBgConfigs.configs[bg].unknown_3 = 0; - gUnknown_030008E0.configs[bg].visible = 1; + gGpuBgConfigs.configs[bg].visible = 1; } } u16 GetBgControlAttribute(u8 bg, u8 attributeId) { - if (IsInvalidBg(bg) == FALSE && gUnknown_030008E0.configs[bg].visible != FALSE) + if (IsInvalidBg(bg) == FALSE && gGpuBgConfigs.configs[bg].visible != FALSE) { switch (attributeId) { - case 1: - return gUnknown_030008E0.configs[bg].visible; - case 2: - return gUnknown_030008E0.configs[bg].tilesBaseBlock; - case 3: - return gUnknown_030008E0.configs[bg].tileMapBaseBlock; - case 4: - return gUnknown_030008E0.configs[bg].screenSize; - case 5: - return gUnknown_030008E0.configs[bg].paletteMode; - case 6: - return gUnknown_030008E0.configs[bg].priority; - case 7: - return gUnknown_030008E0.configs[bg].mosaic; - case 8: - return gUnknown_030008E0.configs[bg].wraparound; + case BG_CTRL_ATTR_VISIBLE: + return gGpuBgConfigs.configs[bg].visible; + case BG_CTRL_ATTR_CHARBASEINDEX: + return gGpuBgConfigs.configs[bg].charBaseIndex; + case BG_CTRL_ATTR_MAPBASEINDEX: + return gGpuBgConfigs.configs[bg].mapBaseIndex; + case BG_CTRL_ATTR_SCREENSIZE: + return gGpuBgConfigs.configs[bg].screenSize; + case BG_CTRL_ATTR_PALETTEMODE: + return gGpuBgConfigs.configs[bg].paletteMode; + case BG_CTRL_ATTR_PRIORITY: + return gGpuBgConfigs.configs[bg].priority; + case BG_CTRL_ATTR_MOSAIC: + return gGpuBgConfigs.configs[bg].mosaic; + case BG_CTRL_ATTR_WRAPAROUND: + return gGpuBgConfigs.configs[bg].wraparound; } } @@ -186,15 +134,15 @@ u8 LoadBgVram(u8 bg, void *src, u16 size, u16 destOffset, u8 mode) u16 offset; s8 cursor; - if (IsInvalidBg(bg) == FALSE && gUnknown_030008E0.configs[bg].visible != FALSE) + if (IsInvalidBg(bg) == FALSE && gGpuBgConfigs.configs[bg].visible != FALSE) { switch (mode) { case 0x1: - offset = gUnknown_030008E0.configs[bg].tilesBaseBlock * SECONDARY_TILESET_BASE_TILE; + offset = gGpuBgConfigs.configs[bg].charBaseIndex * BG_CHAR_SIZE; break; case 0x2: - offset = gUnknown_030008E0.configs[bg].tileMapBaseBlock * SECONDARY_TILESET_BASE_BLOCK; + offset = gGpuBgConfigs.configs[bg].mapBaseIndex * BG_SCREEN_SIZE; break; default: cursor = -1; @@ -222,20 +170,20 @@ end: void ShowBgInternal(u8 bg) { u16 value; - if (IsInvalidBg(bg) == FALSE && gUnknown_030008E0.configs[bg].visible != FALSE) + if (IsInvalidBg(bg) == FALSE && gGpuBgConfigs.configs[bg].visible != FALSE) { - value = gUnknown_030008E0.configs[bg].priority | - (gUnknown_030008E0.configs[bg].tilesBaseBlock << 2) | - (gUnknown_030008E0.configs[bg].mosaic << 6) | - (gUnknown_030008E0.configs[bg].paletteMode << 7) | - (gUnknown_030008E0.configs[bg].tileMapBaseBlock << 8) | - (gUnknown_030008E0.configs[bg].wraparound << 13) | - (gUnknown_030008E0.configs[bg].screenSize << 14); + value = gGpuBgConfigs.configs[bg].priority | + (gGpuBgConfigs.configs[bg].charBaseIndex << 2) | + (gGpuBgConfigs.configs[bg].mosaic << 6) | + (gGpuBgConfigs.configs[bg].paletteMode << 7) | + (gGpuBgConfigs.configs[bg].mapBaseIndex << 8) | + (gGpuBgConfigs.configs[bg].wraparound << 13) | + (gGpuBgConfigs.configs[bg].screenSize << 14); SetGpuReg((bg << 1) + 0x8, value); - gUnknown_030008E0.bgVisibilityAndMode |= 1 << (bg + 8); - gUnknown_030008E0.bgVisibilityAndMode &= DISPCNT_ALL_BG_AND_MODE_BITS; + gGpuBgConfigs.bgVisibilityAndMode |= 1 << (bg + 8); + gGpuBgConfigs.bgVisibilityAndMode &= DISPCNT_ALL_BG_AND_MODE_BITS; } } @@ -243,14 +191,14 @@ void HideBgInternal(u8 bg) { if (IsInvalidBg(bg) == FALSE) { - gUnknown_030008E0.bgVisibilityAndMode &= ~(1 << (bg + 8)); - gUnknown_030008E0.bgVisibilityAndMode &= DISPCNT_ALL_BG_AND_MODE_BITS; + gGpuBgConfigs.bgVisibilityAndMode &= ~(1 << (bg + 8)); + gGpuBgConfigs.bgVisibilityAndMode &= DISPCNT_ALL_BG_AND_MODE_BITS; } } void SyncBgVisibilityAndMode() { - SetGpuReg(0, (GetGpuReg(0) & ~DISPCNT_ALL_BG_AND_MODE_BITS) | gUnknown_030008E0.bgVisibilityAndMode); + SetGpuReg(0, (GetGpuReg(0) & ~DISPCNT_ALL_BG_AND_MODE_BITS) | gGpuBgConfigs.bgVisibilityAndMode); } void SetTextModeAndHideBgs() @@ -263,7 +211,7 @@ void SetBgAffineInternal(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispCenterX, struct BgAffineSrcData src; struct BgAffineDstData dest; - switch (gUnknown_030008E0.bgVisibilityAndMode & 0x7) + switch (gGpuBgConfigs.bgVisibilityAndMode & 0x7) { case 1: if (bg != 2) @@ -318,7 +266,7 @@ void ResetBgsAndClearDma3BusyFlags(u32 leftoverFireRedLeafGreenVariable) for (i = 0; i < 4; i++) { - gUnknown_03000938[i] = 0; + gDmaBusyBitfield[i] = 0; } gUnneededFireRedVariable = leftoverFireRedLeafGreenVariable; @@ -337,21 +285,21 @@ void InitBgsFromTemplates(u8 bgMode, struct BgTemplate *templates, u8 numTemplat bg = templates[i].bg; if (bg < 4) { SetBgControlAttributes(bg, - templates[i].tilesBaseBlock, - templates[i].tileMapBaseBlock, + templates[i].charBaseIndex, + templates[i].mapBaseIndex, templates[i].screenSize, templates[i].paletteMode, templates[i].priority, 0, 0); - gUnknown_030008F8[bg].unk_1 = templates[i].unk_1; - gUnknown_030008F8[bg].unk_2 = 0; - gUnknown_030008F8[bg].unk_3 = 0; + gGpuBgConfigs2[bg].baseTile = templates[i].baseTile; + gGpuBgConfigs2[bg].basePalette = 0; + gGpuBgConfigs2[bg].unk_3 = 0; - gUnknown_030008F8[bg].tilemap = NULL; - gUnknown_030008F8[bg].bg_x = 0; - gUnknown_030008F8[bg].bg_y = 0; + gGpuBgConfigs2[bg].tilemap = NULL; + gGpuBgConfigs2[bg].bg_x = 0; + gGpuBgConfigs2[bg].bg_y = 0; } } } @@ -363,21 +311,21 @@ void InitBgFromTemplate(struct BgTemplate *template) if (bg < 4) { SetBgControlAttributes(bg, - template->tilesBaseBlock, - template->tileMapBaseBlock, + template->charBaseIndex, + template->mapBaseIndex, template->screenSize, template->paletteMode, template->priority, 0, 0); - gUnknown_030008F8[bg].unk_1 = template->unk_1; - gUnknown_030008F8[bg].unk_2 = 0; - gUnknown_030008F8[bg].unk_3 = 0; + gGpuBgConfigs2[bg].baseTile = template->baseTile; + gGpuBgConfigs2[bg].basePalette = 0; + gGpuBgConfigs2[bg].unk_3 = 0; - gUnknown_030008F8[bg].tilemap = NULL; - gUnknown_030008F8[bg].bg_x = 0; - gUnknown_030008F8[bg].bg_y = 0; + gGpuBgConfigs2[bg].tilemap = NULL; + gGpuBgConfigs2[bg].bg_x = 0; + gGpuBgConfigs2[bg].bg_y = 0; } } @@ -386,32 +334,32 @@ void SetBgMode(u8 bgMode) SetBgModeInternal(bgMode); } -u16 LoadBgTiles(u8 bg, void *src, u16 size, u16 destOffset) +u16 LoadBgTiles(u8 bg, void* src, u16 size, u16 destOffset) { - u16 unk; + u16 tileOffset; u8 cursor; - if (GetBgControlAttribute(bg, 5) == 0) + if (GetBgControlAttribute(bg, BG_CTRL_ATTR_PALETTEMODE) == 0) { - unk = (gUnknown_030008F8[bg].unk_1 + destOffset) * 0x20; + tileOffset = (gGpuBgConfigs2[bg].baseTile + destOffset) * 0x20; } else { - unk = (gUnknown_030008F8[bg].unk_1 + destOffset) * 0x40; + tileOffset = (gGpuBgConfigs2[bg].baseTile + destOffset) * 0x40; } - cursor = LoadBgVram(bg, src, size, unk, DISPCNT_MODE_1); + cursor = LoadBgVram(bg, src, size, tileOffset, DISPCNT_MODE_1); if (cursor == 0xFF) { return -1; } - gUnknown_03000938[cursor / 0x20] |= (1 << (cursor % 0x20)); + gDmaBusyBitfield[cursor / 0x20] |= (1 << (cursor % 0x20)); if (gUnneededFireRedVariable == 1) { - DummiedOutFireRedLeafGreenTileAllocFunc(bg, unk / 0x20, size / 0x20, 1); + DummiedOutFireRedLeafGreenTileAllocFunc(bg, tileOffset / 0x20, size / 0x20, 1); } return cursor; @@ -428,20 +376,20 @@ u16 LoadBgTilemap(u8 bg, void *src, u16 size, u16 destOffset) return -1; } - gUnknown_03000938[cursor / 0x20] |= (1 << (cursor % 0x20)); + gDmaBusyBitfield[cursor / 0x20] |= (1 << (cursor % 0x20)); return cursor; } u16 Unused_LoadBgPalette(u8 bg, void *src, u16 size, u16 destOffset) { - u16 unk_1; + u16 paletteOffset; s8 cursor; if (IsInvalidBg32(bg) == FALSE) { - unk_1 = (gUnknown_030008F8[bg].unk_2 * 0x20) + (destOffset * 2); - cursor = RequestDma3Copy(src, (void*)(unk_1 + BG_PLTT), size, 0); + paletteOffset = (gGpuBgConfigs2[bg].basePalette * 0x20) + (destOffset * 2); + cursor = RequestDma3Copy(src, (void*)(paletteOffset + BG_PLTT), size, 0); if (cursor == -1) { @@ -453,7 +401,7 @@ u16 Unused_LoadBgPalette(u8 bg, void *src, u16 size, u16 destOffset) return -1; } - gUnknown_03000938[cursor / 0x20] |= (1 << (cursor % 0x20)); + gDmaBusyBitfield[cursor / 0x20] |= (1 << (cursor % 0x20)); return (u8)cursor; } @@ -472,7 +420,7 @@ bool8 IsDma3ManagerBusyWithBgCopy(void) div = i / 0x20; mod = i % 0x20; - if ((gUnknown_03000938[div] & (1 << mod)) != FALSE) + if ((gDmaBusyBitfield[div] & (1 << mod)) != FALSE) { reqSpace = CheckForSpaceForDma3Request(i); if (reqSpace == -1) @@ -480,7 +428,7 @@ bool8 IsDma3ManagerBusyWithBgCopy(void) return TRUE; } - gUnknown_03000938[div] &= ~(1 << mod); + gDmaBusyBitfield[div] &= ~(1 << mod); } } @@ -506,7 +454,7 @@ _08001AE4:\n\ sub r0, r5, r0\n\ lsl r0, #24\n\ lsr r0, #24\n\ - ldr r1, =gUnknown_03000938\n\ + ldr r1, =gDmaBusyBitfield\n\ lsr r2, #22\n\ add r4, r2, r1\n\ mov r6, #0x1\n\ @@ -586,19 +534,19 @@ u16 GetBgAttribute(u8 bg, u8 attributeId) switch (attributeId) { case 1: - return GetBgControlAttribute(bg, 2); + return GetBgControlAttribute(bg, BG_CTRL_ATTR_CHARBASEINDEX); case 2: - return GetBgControlAttribute(bg, 3); + return GetBgControlAttribute(bg, BG_CTRL_ATTR_MAPBASEINDEX); case 3: - return GetBgControlAttribute(bg, 4); + return GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE); case 4: - return GetBgControlAttribute(bg, 5); + return GetBgControlAttribute(bg, BG_CTRL_ATTR_PALETTEMODE); case 7: - return GetBgControlAttribute(bg, 6); + return GetBgControlAttribute(bg, BG_CTRL_ATTR_PRIORITY); case 5: - return GetBgControlAttribute(bg, 7); + return GetBgControlAttribute(bg, BG_CTRL_ATTR_MOSAIC); case 6: - return GetBgControlAttribute(bg, 8); + return GetBgControlAttribute(bg, BG_CTRL_ATTR_WRAPAROUND); case 8: switch (GetBgType(bg)) { @@ -612,7 +560,7 @@ u16 GetBgAttribute(u8 bg, u8 attributeId) case 9: return GetBgType(bg); case 10: - return gUnknown_030008F8[bg].unk_1; + return gGpuBgConfigs2[bg].baseTile; default: return -1; } @@ -624,7 +572,7 @@ u32 ChangeBgX(u8 bg, u32 value, u8 op) u8 mode; u32 temp1; - if (IsInvalidBg32(bg) != FALSE || GetBgControlAttribute(bg, 1) == 0) + if (IsInvalidBg32(bg) != FALSE || GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0) { return -1; } @@ -633,13 +581,13 @@ u32 ChangeBgX(u8 bg, u32 value, u8 op) { case 0: default: - gUnknown_030008F8[bg].bg_x = value; + gGpuBgConfigs2[bg].bg_x = value; break; case 1: - gUnknown_030008F8[bg].bg_x += value; + gGpuBgConfigs2[bg].bg_x += value; break; case 2: - gUnknown_030008F8[bg].bg_x -= value; + gGpuBgConfigs2[bg].bg_x -= value; break; } @@ -648,19 +596,19 @@ u32 ChangeBgX(u8 bg, u32 value, u8 op) switch (bg) { case 0: - SetGpuReg(REG_OFFSET_BG0HOFS, gUnknown_030008F8[0].bg_x >> 0x8); + SetGpuReg(REG_OFFSET_BG0HOFS, gGpuBgConfigs2[0].bg_x >> 0x8); break; case 1: - SetGpuReg(REG_OFFSET_BG1HOFS, gUnknown_030008F8[1].bg_x >> 0x8); + SetGpuReg(REG_OFFSET_BG1HOFS, gGpuBgConfigs2[1].bg_x >> 0x8); break; case 2: if (mode == 0) { - SetGpuReg(REG_OFFSET_BG2HOFS, gUnknown_030008F8[2].bg_x >> 0x8); + SetGpuReg(REG_OFFSET_BG2HOFS, gGpuBgConfigs2[2].bg_x >> 0x8); } else { - temp1 = gUnknown_030008F8[2].bg_x; + temp1 = gGpuBgConfigs2[2].bg_x; SetGpuReg(REG_OFFSET_BG2X_H, (u16)(temp1 >> 0x10)); SetGpuReg(REG_OFFSET_BG2X_L, (u16)(temp1)); } @@ -668,18 +616,18 @@ u32 ChangeBgX(u8 bg, u32 value, u8 op) case 3: if (mode == 0) { - SetGpuReg(REG_OFFSET_BG3HOFS, gUnknown_030008F8[3].bg_x >> 0x8); + SetGpuReg(REG_OFFSET_BG3HOFS, gGpuBgConfigs2[3].bg_x >> 0x8); } else if (mode == 2) { - temp1 = gUnknown_030008F8[3].bg_x; + temp1 = gGpuBgConfigs2[3].bg_x; SetGpuReg(REG_OFFSET_BG2X_H, (u16)(temp1 >> 0x10)); SetGpuReg(REG_OFFSET_BG2X_L, (u16)(temp1)); } break; } - return gUnknown_030008F8[bg].bg_x; + return gGpuBgConfigs2[bg].bg_x; } #else __attribute__((naked)) @@ -713,7 +661,7 @@ _08001D2E:\n\ cmp r5, #0x2\n\ beq _08001D60\n\ _08001D3A:\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ lsl r1, r4, #4\n\ add r0, #0x8\n\ add r0, r1, r0\n\ @@ -722,7 +670,7 @@ _08001D3A:\n\ b _08001D70\n\ .pool\n\ _08001D4C:\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ lsl r2, r4, #4\n\ add r0, #0x8\n\ add r0, r2, r0\n\ @@ -731,7 +679,7 @@ _08001D4C:\n\ b _08001D6C\n\ .pool\n\ _08001D60:\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ lsl r2, r4, #4\n\ add r0, #0x8\n\ add r0, r2, r0\n\ @@ -759,7 +707,7 @@ _08001D8C:\n\ beq _08001DF8\n\ b _08001E2C\n\ _08001D96:\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ ldr r0, [r0, #0x8]\n\ lsl r0, #8\n\ lsr r1, r0, #16\n\ @@ -768,7 +716,7 @@ _08001D96:\n\ b _08001E2C\n\ .pool\n\ _08001DAC:\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ ldr r0, [r0, #0x18]\n\ lsl r0, #8\n\ lsr r1, r0, #16\n\ @@ -779,7 +727,7 @@ _08001DAC:\n\ _08001DC0:\n\ cmp r0, #0\n\ bne _08001DD8\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ ldr r0, [r0, #0x28]\n\ lsl r0, #8\n\ lsr r1, r0, #16\n\ @@ -788,7 +736,7 @@ _08001DC0:\n\ b _08001E2C\n\ .pool\n\ _08001DD8:\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ ldr r0, [r0, #0x28]\n\ lsr r1, r0, #16\n\ lsl r0, #16\n\ @@ -803,7 +751,7 @@ _08001DD8:\n\ _08001DF8:\n\ cmp r0, #0\n\ bne _08001E10\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ ldr r0, [r0, #0x38]\n\ lsl r0, #8\n\ lsr r1, r0, #16\n\ @@ -814,7 +762,7 @@ _08001DF8:\n\ _08001E10:\n\ cmp r0, #0x2\n\ bne _08001E2C\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ ldr r0, [r0, #0x38]\n\ lsr r1, r0, #16\n\ lsl r0, #16\n\ @@ -825,7 +773,7 @@ _08001E10:\n\ add r1, r4, #0\n\ bl SetGpuReg\n\ _08001E2C:\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ add r0, #0x8\n\ add r0, r5, r0\n\ ldr r0, [r0]\n\ @@ -841,9 +789,9 @@ u32 GetBgX(u8 bg) { if (IsInvalidBg32(bg) != FALSE) return -1; - if (GetBgControlAttribute(bg, 0x1) == 0) + if (GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0) return -1; - return gUnknown_030008F8[bg].bg_x; + return gGpuBgConfigs2[bg].bg_x; } #ifdef NONMATCHING // Everything that uses temp1 doesn't match @@ -852,7 +800,7 @@ u32 ChangeBgY(u8 bg, u32 value, u8 op) u8 mode; u32 temp1; - if (IsInvalidBg32(bg) != FALSE || GetBgControlAttribute(bg, 1) == 0) + if (IsInvalidBg32(bg) != FALSE || GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0) { return -1; } @@ -861,13 +809,13 @@ u32 ChangeBgY(u8 bg, u32 value, u8 op) { case 0: default: - gUnknown_030008F8[bg].bg_y = value; + gGpuBgConfigs2[bg].bg_y = value; break; case 1: - gUnknown_030008F8[bg].bg_y += value; + gGpuBgConfigs2[bg].bg_y += value; break; case 2: - gUnknown_030008F8[bg].bg_y -= value; + gGpuBgConfigs2[bg].bg_y -= value; break; } @@ -876,19 +824,19 @@ u32 ChangeBgY(u8 bg, u32 value, u8 op) switch (bg) { case 0: - SetGpuReg(REG_OFFSET_BG0VOFS, gUnknown_030008F8[0].bg_y >> 0x8); + SetGpuReg(REG_OFFSET_BG0VOFS, gGpuBgConfigs2[0].bg_y >> 0x8); break; case 1: - SetGpuReg(REG_OFFSET_BG1VOFS, gUnknown_030008F8[1].bg_y >> 0x8); + SetGpuReg(REG_OFFSET_BG1VOFS, gGpuBgConfigs2[1].bg_y >> 0x8); break; case 2: if (mode == 0) { - SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_030008F8[2].bg_y >> 0x8); + SetGpuReg(REG_OFFSET_BG2VOFS, gGpuBgConfigs2[2].bg_y >> 0x8); } else { - temp1 = gUnknown_030008F8[2].bg_y; + temp1 = gGpuBgConfigs2[2].bg_y; SetGpuReg(REG_OFFSET_BG2Y_H, (u16)(temp1 >> 0x10)); SetGpuReg(REG_OFFSET_BG2Y_L, (u16)(temp1)); @@ -897,11 +845,11 @@ u32 ChangeBgY(u8 bg, u32 value, u8 op) case 3: if (mode == 0) { - SetGpuReg(REG_OFFSET_BG3VOFS, gUnknown_030008F8[3].bg_y >> 0x8); + SetGpuReg(REG_OFFSET_BG3VOFS, gGpuBgConfigs2[3].bg_y >> 0x8); } else if (mode == 2) { - temp1 = gUnknown_030008F8[3].bg_y; + temp1 = gGpuBgConfigs2[3].bg_y; SetGpuReg(REG_OFFSET_BG3Y_H, (u16)(temp1 >> 0x10)); SetGpuReg(REG_OFFSET_BG3Y_L, (u16)(temp1)); @@ -909,7 +857,7 @@ u32 ChangeBgY(u8 bg, u32 value, u8 op) break; } - return gUnknown_030008F8[bg].bg_y; + return gGpuBgConfigs2[bg].bg_y; } #else __attribute__((naked)) @@ -943,7 +891,7 @@ _08001EA6:\n\ cmp r5, #0x2\n\ beq _08001ED8\n\ _08001EB2:\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ lsl r1, r4, #4\n\ add r0, #0xC\n\ add r0, r1, r0\n\ @@ -952,7 +900,7 @@ _08001EB2:\n\ b _08001EE8\n\ .pool\n\ _08001EC4:\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ lsl r2, r4, #4\n\ add r0, #0xC\n\ add r0, r2, r0\n\ @@ -961,7 +909,7 @@ _08001EC4:\n\ b _08001EE4\n\ .pool\n\ _08001ED8:\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ lsl r2, r4, #4\n\ add r0, #0xC\n\ add r0, r2, r0\n\ @@ -989,7 +937,7 @@ _08001F04:\n\ beq _08001F70\n\ b _08001FA4\n\ _08001F0E:\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ ldr r0, [r0, #0xC]\n\ lsl r0, #8\n\ lsr r1, r0, #16\n\ @@ -998,7 +946,7 @@ _08001F0E:\n\ b _08001FA4\n\ .pool\n\ _08001F24:\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ ldr r0, [r0, #0x1C]\n\ lsl r0, #8\n\ lsr r1, r0, #16\n\ @@ -1009,7 +957,7 @@ _08001F24:\n\ _08001F38:\n\ cmp r0, #0\n\ bne _08001F50\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ ldr r0, [r0, #0x2C]\n\ lsl r0, #8\n\ lsr r1, r0, #16\n\ @@ -1018,7 +966,7 @@ _08001F38:\n\ b _08001FA4\n\ .pool\n\ _08001F50:\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ ldr r0, [r0, #0x2C]\n\ lsr r1, r0, #16\n\ lsl r0, #16\n\ @@ -1033,7 +981,7 @@ _08001F50:\n\ _08001F70:\n\ cmp r0, #0\n\ bne _08001F88\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ ldr r0, [r0, #0x3C]\n\ lsl r0, #8\n\ lsr r1, r0, #16\n\ @@ -1044,7 +992,7 @@ _08001F70:\n\ _08001F88:\n\ cmp r0, #0x2\n\ bne _08001FA4\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ ldr r0, [r0, #0x3C]\n\ lsr r1, r0, #16\n\ lsl r0, #16\n\ @@ -1055,7 +1003,7 @@ _08001F88:\n\ add r1, r4, #0\n\ bl SetGpuReg\n\ _08001FA4:\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ add r0, #0xC\n\ add r0, r5, r0\n\ ldr r0, [r0]\n\ @@ -1073,7 +1021,7 @@ u32 ChangeBgY_ScreenOff(u8 bg, u32 value, u8 op) u8 mode; u16 temp1; - if (IsInvalidBg32(bg) != FALSE || GetBgControlAttribute(bg, 1) == 0) + if (IsInvalidBg32(bg) != FALSE || GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0) { return -1; } @@ -1082,13 +1030,13 @@ u32 ChangeBgY_ScreenOff(u8 bg, u32 value, u8 op) { case 0: default: - gUnknown_030008F8[bg].bg_y = value; + gGpuBgConfigs2[bg].bg_y = value; break; case 1: - gUnknown_030008F8[bg].bg_y += value; + gGpuBgConfigs2[bg].bg_y += value; break; case 2: - gUnknown_030008F8[bg].bg_y -= value; + gGpuBgConfigs2[bg].bg_y -= value; break; } @@ -1097,41 +1045,41 @@ u32 ChangeBgY_ScreenOff(u8 bg, u32 value, u8 op) switch (bg) { case 0: - SetGpuReg_ForcedBlank(REG_OFFSET_BG0VOFS, gUnknown_030008F8[0].bg_y >> 0x8); + SetGpuReg_ForcedBlank(REG_OFFSET_BG0VOFS, gGpuBgConfigs2[0].bg_y >> 0x8); break; case 1: - SetGpuReg_ForcedBlank(REG_OFFSET_BG1VOFS, gUnknown_030008F8[1].bg_y >> 0x8); + SetGpuReg_ForcedBlank(REG_OFFSET_BG1VOFS, gGpuBgConfigs2[1].bg_y >> 0x8); break; case 2: if (mode == 0) { - SetGpuReg_ForcedBlank(REG_OFFSET_BG2VOFS, gUnknown_030008F8[2].bg_y >> 0x8); + SetGpuReg_ForcedBlank(REG_OFFSET_BG2VOFS, gGpuBgConfigs2[2].bg_y >> 0x8); } else { - temp1 = gUnknown_030008F8[2].bg_y; + temp1 = gGpuBgConfigs2[2].bg_y; - SetGpuReg_ForcedBlank(REG_OFFSET_BG2Y_H, (gUnknown_030008F8[2].bg_y >> 0x10)); + SetGpuReg_ForcedBlank(REG_OFFSET_BG2Y_H, (gGpuBgConfigs2[2].bg_y >> 0x10)); SetGpuReg_ForcedBlank(REG_OFFSET_BG2Y_L, (temp1)); } break; case 3: if (mode == 0) { - SetGpuReg_ForcedBlank(REG_OFFSET_BG3VOFS, gUnknown_030008F8[3].bg_y >> 0x8); + SetGpuReg_ForcedBlank(REG_OFFSET_BG3VOFS, gGpuBgConfigs2[3].bg_y >> 0x8); } else if (mode == 2) { - temp1 = gUnknown_030008F8[3].bg_y; + temp1 = gGpuBgConfigs2[3].bg_y; - SetGpuReg_ForcedBlank(REG_OFFSET_BG3Y_H, (gUnknown_030008F8[3].bg_y >> 0x10)); + SetGpuReg_ForcedBlank(REG_OFFSET_BG3Y_H, (gGpuBgConfigs2[3].bg_y >> 0x10)); SetGpuReg_ForcedBlank(REG_OFFSET_BG3Y_L, (temp1)); } break; } - return gUnknown_030008F8[bg].bg_y; + return gGpuBgConfigs2[bg].bg_y; } #else __attribute__((naked)) @@ -1165,7 +1113,7 @@ _08001FE2:\n\ cmp r5, #0x2\n\ beq _08002014\n\ _08001FEE:\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ lsl r1, r4, #4\n\ add r0, #0xC\n\ add r0, r1, r0\n\ @@ -1174,7 +1122,7 @@ _08001FEE:\n\ b _08002024\n\ .pool\n\ _08002000:\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ lsl r2, r4, #4\n\ add r0, #0xC\n\ add r0, r2, r0\n\ @@ -1183,7 +1131,7 @@ _08002000:\n\ b _08002020\n\ .pool\n\ _08002014:\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ lsl r2, r4, #4\n\ add r0, #0xC\n\ add r0, r2, r0\n\ @@ -1211,7 +1159,7 @@ _08002040:\n\ beq _080020AC\n\ b _080020E0\n\ _0800204A:\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ ldr r0, [r0, #0xC]\n\ lsl r0, #8\n\ lsr r1, r0, #16\n\ @@ -1220,7 +1168,7 @@ _0800204A:\n\ b _080020E0\n\ .pool\n\ _08002060:\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ ldr r0, [r0, #0x1C]\n\ lsl r0, #8\n\ lsr r1, r0, #16\n\ @@ -1231,7 +1179,7 @@ _08002060:\n\ _08002074:\n\ cmp r0, #0\n\ bne _0800208C\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ ldr r0, [r0, #0x2C]\n\ lsl r0, #8\n\ lsr r1, r0, #16\n\ @@ -1240,7 +1188,7 @@ _08002074:\n\ b _080020E0\n\ .pool\n\ _0800208C:\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ ldr r0, [r0, #0x2C]\n\ lsr r1, r0, #16\n\ lsl r0, #16\n\ @@ -1255,7 +1203,7 @@ _0800208C:\n\ _080020AC:\n\ cmp r0, #0\n\ bne _080020C4\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ ldr r0, [r0, #0x3C]\n\ lsl r0, #8\n\ lsr r1, r0, #16\n\ @@ -1266,7 +1214,7 @@ _080020AC:\n\ _080020C4:\n\ cmp r0, #0x2\n\ bne _080020E0\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ ldr r0, [r0, #0x3C]\n\ lsr r1, r0, #16\n\ lsl r0, #16\n\ @@ -1277,7 +1225,7 @@ _080020C4:\n\ add r1, r4, #0\n\ bl SetGpuReg_ForcedBlank\n\ _080020E0:\n\ - ldr r0, =gUnknown_030008F8\n\ + ldr r0, =gGpuBgConfigs2\n\ add r0, #0xC\n\ add r0, r5, r0\n\ ldr r0, [r0]\n\ @@ -1293,9 +1241,9 @@ u32 GetBgY(u8 bg) { if (IsInvalidBg32(bg) != FALSE) return -1; - if (GetBgControlAttribute(bg, 0x1) == 0) + if (GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0) return -1; - return gUnknown_030008F8[bg].bg_y; + return gGpuBgConfigs2[bg].bg_y; } void SetBgAffine(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispCenterX, s16 dispCenterY, s16 scaleX, s16 scaleY, u16 rotationAngle) @@ -1380,17 +1328,17 @@ u8 Unused_AdjustBgMosaic(u8 a1, u8 a2) void SetBgTilemapBuffer(u8 bg, void *tilemap) { - if (IsInvalidBg32(bg) == FALSE && GetBgControlAttribute(bg, 0x1) != 0x0) + if (IsInvalidBg32(bg) == FALSE && GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) != 0x0) { - gUnknown_030008F8[bg].tilemap = tilemap; + gGpuBgConfigs2[bg].tilemap = tilemap; } } void UnsetBgTilemapBuffer(u8 bg) { - if (IsInvalidBg32(bg) == FALSE && GetBgControlAttribute(bg, 0x1) != 0x0) + if (IsInvalidBg32(bg) == FALSE && GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) != 0x0) { - gUnknown_030008F8[bg].tilemap = NULL; + gGpuBgConfigs2[bg].tilemap = NULL; } } @@ -1398,9 +1346,9 @@ void* GetBgTilemapBuffer(u8 bg) { if (IsInvalidBg32(bg) != FALSE) return NULL; - if (GetBgControlAttribute(bg, 0x1) == 0) + if (GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0) return NULL; - return gUnknown_030008F8[bg].tilemap; + return gGpuBgConfigs2[bg].tilemap; } void CopyToBgTilemapBuffer(u8 bg, void *src, u16 mode, u16 destOffset) @@ -1409,11 +1357,11 @@ void CopyToBgTilemapBuffer(u8 bg, void *src, u16 mode, u16 destOffset) { if (mode != 0) { - CpuCopy16(src, (void *)(gUnknown_030008F8[bg].tilemap + (destOffset * 2)), mode); + CpuCopy16(src, (void *)(gGpuBgConfigs2[bg].tilemap + (destOffset * 2)), mode); } else { - LZ77UnCompWram(src, (void *)(gUnknown_030008F8[bg].tilemap + (destOffset * 2))); + LZ77UnCompWram(src, (void *)(gGpuBgConfigs2[bg].tilemap + (destOffset * 2))); } } } @@ -1436,7 +1384,7 @@ void CopyBgTilemapBufferToVram(u8 bg) sizeToLoad = 0; break; } - LoadBgVram(bg, gUnknown_030008F8[bg].tilemap, sizeToLoad, 0, 2); + LoadBgVram(bg, gGpuBgConfigs2[bg].tilemap, sizeToLoad, 0, 2); } } @@ -1457,7 +1405,7 @@ void CopyToBgTilemapBufferRect(u8 bg, void* src, u8 destX, u8 destY, u8 width, u { for (destX16 = destX; destX16 < (destX + width); destX16++) { - ((u16*)gUnknown_030008F8[bg].tilemap)[((destY16 * 0x20) + destX16)] = *((u16*)srcCopy)++; + ((u16*)gGpuBgConfigs2[bg].tilemap)[((destY16 * 0x20) + destX16)] = *((u16*)srcCopy)++; } } break; @@ -1468,7 +1416,7 @@ void CopyToBgTilemapBufferRect(u8 bg, void* src, u8 destX, u8 destY, u8 width, u { for (destX16 = destX; destX16 < (destX + width); destX16++) { - ((u8*)gUnknown_030008F8[bg].tilemap)[((destY16 * mode) + destX16)] = *((u8*)srcCopy)++; + ((u8*)gGpuBgConfigs2[bg].tilemap)[((destY16 * mode) + destX16)] = *((u8*)srcCopy)++; } } break; @@ -1494,7 +1442,7 @@ void CopyRectToBgTilemapBufferRect(u8 bg, void* src, u8 srcX, u8 srcY, u8 srcWid if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) { - attribute = GetBgControlAttribute(bg, 0x4); + attribute = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE); mode = GetBgMetricTextMode(bg, 0x1) * 0x20; mode2 = GetBgMetricTextMode(bg, 0x2) * 0x20; switch (GetBgType(bg)) @@ -1505,7 +1453,7 @@ void CopyRectToBgTilemapBufferRect(u8 bg, void* src, u8 srcX, u8 srcY, u8 srcWid { for (destX16 = destX; destX16 < (destX + rectWidth); destX16++) { - CopyTileMapEntry(&((u16*)srcCopy)[(srcY * rectWidth) + srcX], &((u16*)gUnknown_030008F8[bg].tilemap)[GetTileMapIndexFromCoords(destX16, destY16, attribute, mode, mode2)], palette1, tileOffset, palette2); + CopyTileMapEntry(&((u16*)srcCopy)[(srcY * rectWidth) + srcX], &((u16*)gGpuBgConfigs2[bg].tilemap)[GetTileMapIndexFromCoords(destX16, destY16, attribute, mode, mode2)], palette1, tileOffset, palette2); } } break; @@ -1516,7 +1464,7 @@ void CopyRectToBgTilemapBufferRect(u8 bg, void* src, u8 srcX, u8 srcY, u8 srcWid { for (destX16 = destX; destX16 < (destX + rectWidth); destX16++) { - CopyTileMapEntry(&((u16*)srcCopy)[(srcY * rectWidth) + srcX], &((u16*)gUnknown_030008F8[bg].tilemap)[GetTileMapIndexFromCoords(destX16, destY16, attribute, mode, mode2)], palette1, tileOffset, palette2); + CopyTileMapEntry(&((u16*)srcCopy)[(srcY * rectWidth) + srcX], &((u16*)gGpuBgConfigs2[bg].tilemap)[GetTileMapIndexFromCoords(destX16, destY16, attribute, mode, mode2)], palette1, tileOffset, palette2); } } break; @@ -1644,7 +1592,7 @@ _080025F8:\n\ bge _0800265A\n\ ldr r2, [sp, #0x4]\n\ lsl r0, r2, #4\n\ - ldr r1, =gUnknown_030008FC\n\ + ldr r1, =gGpuBgConfigs2+4\n\ add r0, r1\n\ mov r10, r0\n\ ldr r7, [sp, #0x20]\n\ @@ -1716,7 +1664,7 @@ _08002674:\n\ sub r2, r7, r2\n\ str r2, [sp, #0x34]\n\ str r0, [sp, #0x38]\n\ - ldr r7, =gUnknown_030008FC\n\ + ldr r7, =gGpuBgConfigs2+4\n\ mov r10, r7\n\ ldr r0, [sp, #0x4]\n\ lsl r0, #4\n\ @@ -1786,7 +1734,7 @@ void FillBgTilemapBufferRect_Palette0(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, { for (x16 = x; x16 < (x + width); x16++) { - ((u16*)gUnknown_030008F8[bg].tilemap)[((y16 * 0x20) + x16)] = tileNum; + ((u16*)gGpuBgConfigs2[bg].tilemap)[((y16 * 0x20) + x16)] = tileNum; } } break; @@ -1796,7 +1744,7 @@ void FillBgTilemapBufferRect_Palette0(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, { for (x16 = x; x16 < (x + width); x16++) { - ((u8*)gUnknown_030008F8[bg].tilemap)[((y16 * mode) + x16)] = tileNum; + ((u8*)gGpuBgConfigs2[bg].tilemap)[((y16 * mode) + x16)] = tileNum; } } break; @@ -1821,7 +1769,7 @@ void WriteSequenceToBgTilemapBuffer(u8 bg, u16 firstTileNum, u8 x, u8 y, u8 widt if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE) { - attribute = GetBgControlAttribute(bg, 0x4); + attribute = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE); mode = GetBgMetricTextMode(bg, 0x1) * 0x20; mode2 = GetBgMetricTextMode(bg, 0x2) * 0x20; switch (GetBgType(bg)) @@ -1831,7 +1779,7 @@ void WriteSequenceToBgTilemapBuffer(u8 bg, u16 firstTileNum, u8 x, u8 y, u8 widt { for (x16 = x; x16 < (x + width); x16++) { - CopyTileMapEntry(&firstTileNum, &((u16*)gUnknown_030008F8[bg].tilemap)[(u16)GetTileMapIndexFromCoords(x16, y16, attribute, mode, mode2)], paletteSlot, 0, 0); + CopyTileMapEntry(&firstTileNum, &((u16*)gGpuBgConfigs2[bg].tilemap)[(u16)GetTileMapIndexFromCoords(x16, y16, attribute, mode, mode2)], paletteSlot, 0, 0); firstTileNum = (firstTileNum & 0xFC00) + ((firstTileNum + tileNumDelta) & 0x3FF); } } @@ -1842,7 +1790,7 @@ void WriteSequenceToBgTilemapBuffer(u8 bg, u16 firstTileNum, u8 x, u8 y, u8 widt { for (x16 = x; x16 < (x + width); x16++) { - ((u8*)gUnknown_030008F8[bg].tilemap)[(y16 * mode3) + x16] = firstTileNum; + ((u8*)gGpuBgConfigs2[bg].tilemap)[(y16 * mode3) + x16] = firstTileNum; firstTileNum = (firstTileNum & 0xFC00) + ((firstTileNum + tileNumDelta) & 0x3FF); } } @@ -1855,7 +1803,7 @@ u16 GetBgMetricTextMode(u8 bg, u8 whichMetric) { u8 attribute; - attribute = GetBgControlAttribute(bg, 0x4); + attribute = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE); switch (whichMetric) { @@ -1903,7 +1851,7 @@ u32 GetBgMetricAffineMode(u8 bg, u8 whichMetric) { u8 attribute; - attribute = GetBgControlAttribute(bg, 0x4); + attribute = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE); switch (whichMetric) { @@ -2074,9 +2022,9 @@ bool32 IsInvalidBg32(u8 bg) bool32 IsTileMapOutsideWram(u8 bg) { - if (gUnknown_030008F8[bg].tilemap > (void*)IWRAM_END) + if (gGpuBgConfigs2[bg].tilemap > (void*)IWRAM_END) return TRUE; - if (gUnknown_030008F8[bg].tilemap == 0x0) + if (gGpuBgConfigs2[bg].tilemap == 0x0) return TRUE; return FALSE; } -- cgit v1.2.3 From bdb6c775d94d1e57aeacba074b460d3a1b6cdd59 Mon Sep 17 00:00:00 2001 From: Diegoisawesome Date: Sat, 9 Sep 2017 21:48:33 -0500 Subject: Remove bg.h --- src/bg.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/bg.c b/src/bg.c index d3c366659..ee26aaa89 100644 --- a/src/bg.c +++ b/src/bg.c @@ -1,9 +1,59 @@ #include "global.h" -#include "bg.h" #include "dma3.h" #define DISPCNT_ALL_BG_AND_MODE_BITS 0x0F07 +enum { + BG_CTRL_ATTR_VISIBLE = 1, + BG_CTRL_ATTR_CHARBASEINDEX = 2, + BG_CTRL_ATTR_MAPBASEINDEX = 3, + BG_CTRL_ATTR_SCREENSIZE = 4, + BG_CTRL_ATTR_PALETTEMODE = 5, + BG_CTRL_ATTR_PRIORITY = 6, + BG_CTRL_ATTR_MOSAIC = 7, + BG_CTRL_ATTR_WRAPAROUND = 8, +}; + +struct BgControl { + struct BgConfig { + u16 visible:1; + u16 unknown_1:1; + u16 screenSize:2; + u16 priority:2; + u16 mosaic:1; + u16 wraparound:1; + + u16 charBaseIndex:2; + u16 mapBaseIndex:5; + u16 paletteMode:1; + + u8 unknown_2; + u8 unknown_3; + } configs[4]; + + u16 bgVisibilityAndMode; +}; + +struct BgTemplate { + u32 bg:2; + u32 charBaseIndex:2; + u32 mapBaseIndex:5; + u32 screenSize:2; + u32 paletteMode:1; + u32 priority:2; + u32 baseTile:10; +}; + +struct BgConfig2 { + u32 baseTile:10; + u32 basePalette:4; + u32 unk_3:18; + + void* tilemap; + u32 bg_x; + u32 bg_y; +}; + static struct BgControl gGpuBgConfigs; static struct BgConfig2 gGpuBgConfigs2[4]; static u32 gDmaBusyBitfield[4]; @@ -17,6 +67,19 @@ extern void SetGpuReg_ForcedBlank(u8 regOffset, u16 value); extern u16 GetGpuReg(u8 regOffset); extern int CheckForSpaceForDma3Request(s16 index); +bool32 IsInvalidBg32(u8); +void ResetBgControlStructs(); +u16 GetBgMetricTextMode(u8, u8); +u32 GetBgMetricAffineMode(u8, u8); +u32 GetBgType(u8); +void SetTextModeAndHideBgs(); +bool8 IsInvalidBg(u8); +bool32 IsTileMapOutsideWram(u8); +void CopyRectToBgTilemapBufferRect(u8, void*, u8, u8, u8, u8, u8, u8, u8, u8, u8, u16, u16); +void CopyTileMapEntry(u16*, u16*, s32, u32, u32); +u32 GetTileMapIndexFromCoords(s32, s32, s32, u32, u32); +void WriteSequenceToBgTilemapBuffer(u8, u16, u8, u8, u8, u8, u8, s16); + void ResetBgs(void) { ResetBgControlStructs(); -- cgit v1.2.3 From 1b220ed2ed367011aa3437b384b2159c0a0130c9 Mon Sep 17 00:00:00 2001 From: Diegoisawesome Date: Sun, 10 Sep 2017 01:02:23 -0500 Subject: Resolve some nonmatchings in bg.c --- src/bg.c | 569 +++++++-------------------------------------------------------- 1 file changed, 59 insertions(+), 510 deletions(-) (limited to 'src') diff --git a/src/bg.c b/src/bg.c index ee26aaa89..8979eaecd 100644 --- a/src/bg.c +++ b/src/bg.c @@ -629,11 +629,11 @@ u16 GetBgAttribute(u8 bg, u8 attributeId) } } -#ifdef NONMATCHING // Everything that uses temp1 doesn't match u32 ChangeBgX(u8 bg, u32 value, u8 op) { u8 mode; - u32 temp1; + u16 temp1; + u16 temp2; if (IsInvalidBg32(bg) != FALSE || GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0) { @@ -659,194 +659,45 @@ u32 ChangeBgX(u8 bg, u32 value, u8 op) switch (bg) { case 0: - SetGpuReg(REG_OFFSET_BG0HOFS, gGpuBgConfigs2[0].bg_x >> 0x8); + temp1 = gGpuBgConfigs2[0].bg_x >> 0x8; + SetGpuReg(REG_OFFSET_BG0HOFS, temp1); break; case 1: - SetGpuReg(REG_OFFSET_BG1HOFS, gGpuBgConfigs2[1].bg_x >> 0x8); + temp1 = gGpuBgConfigs2[1].bg_x >> 0x8; + SetGpuReg(REG_OFFSET_BG1HOFS, temp1); break; case 2: if (mode == 0) { - SetGpuReg(REG_OFFSET_BG2HOFS, gGpuBgConfigs2[2].bg_x >> 0x8); + temp1 = gGpuBgConfigs2[2].bg_x >> 0x8; + SetGpuReg(REG_OFFSET_BG2HOFS, temp1); } else { - temp1 = gGpuBgConfigs2[2].bg_x; - SetGpuReg(REG_OFFSET_BG2X_H, (u16)(temp1 >> 0x10)); - SetGpuReg(REG_OFFSET_BG2X_L, (u16)(temp1)); + temp1 = gGpuBgConfigs2[2].bg_x >> 0x10; + temp2 = gGpuBgConfigs2[2].bg_x & 0xFFFF; + SetGpuReg(REG_OFFSET_BG2X_H, temp1); + SetGpuReg(REG_OFFSET_BG2X_L, temp2); } break; case 3: if (mode == 0) { - SetGpuReg(REG_OFFSET_BG3HOFS, gGpuBgConfigs2[3].bg_x >> 0x8); + temp1 = gGpuBgConfigs2[3].bg_x >> 0x8; + SetGpuReg(REG_OFFSET_BG3HOFS, temp1); } else if (mode == 2) { - temp1 = gGpuBgConfigs2[3].bg_x; - SetGpuReg(REG_OFFSET_BG2X_H, (u16)(temp1 >> 0x10)); - SetGpuReg(REG_OFFSET_BG2X_L, (u16)(temp1)); + temp1 = gGpuBgConfigs2[3].bg_x >> 0x10; + temp2 = gGpuBgConfigs2[3].bg_x & 0xFFFF; + SetGpuReg(REG_OFFSET_BG3X_H, temp1); + SetGpuReg(REG_OFFSET_BG3X_L, temp2); } break; } return gGpuBgConfigs2[bg].bg_x; } -#else -__attribute__((naked)) -u32 ChangeBgX(u8 bg, u32 value, u8 op) -{ - asm("push {r4-r6,lr}\n\ - add r6, r1, #0\n\ - lsl r0, #24\n\ - lsr r4, r0, #24\n\ - lsl r2, #24\n\ - lsr r5, r2, #24\n\ - add r0, r4, #0\n\ - bl IsInvalidBg32\n\ - cmp r0, #0\n\ - bne _08001D28\n\ - add r0, r4, #0\n\ - mov r1, #0x1\n\ - bl GetBgControlAttribute\n\ - lsl r0, #16\n\ - cmp r0, #0\n\ - bne _08001D2E\n\ -_08001D28:\n\ - mov r0, #0x1\n\ - neg r0, r0\n\ - b _08001E34\n\ -_08001D2E:\n\ - cmp r5, #0x1\n\ - beq _08001D4C\n\ - cmp r5, #0x1\n\ - ble _08001D3A\n\ - cmp r5, #0x2\n\ - beq _08001D60\n\ -_08001D3A:\n\ - ldr r0, =gGpuBgConfigs2\n\ - lsl r1, r4, #4\n\ - add r0, #0x8\n\ - add r0, r1, r0\n\ - str r6, [r0]\n\ - add r5, r1, #0\n\ - b _08001D70\n\ - .pool\n\ -_08001D4C:\n\ - ldr r0, =gGpuBgConfigs2\n\ - lsl r2, r4, #4\n\ - add r0, #0x8\n\ - add r0, r2, r0\n\ - ldr r1, [r0]\n\ - add r1, r6\n\ - b _08001D6C\n\ - .pool\n\ -_08001D60:\n\ - ldr r0, =gGpuBgConfigs2\n\ - lsl r2, r4, #4\n\ - add r0, #0x8\n\ - add r0, r2, r0\n\ - ldr r1, [r0]\n\ - sub r1, r6\n\ -_08001D6C:\n\ - str r1, [r0]\n\ - add r5, r2, #0\n\ -_08001D70:\n\ - bl GetBgMode\n\ - lsl r0, #24\n\ - lsr r0, #24\n\ - cmp r4, #0x1\n\ - beq _08001DAC\n\ - cmp r4, #0x1\n\ - bgt _08001D8C\n\ - cmp r4, #0\n\ - beq _08001D96\n\ - b _08001E2C\n\ - .pool\n\ -_08001D8C:\n\ - cmp r4, #0x2\n\ - beq _08001DC0\n\ - cmp r4, #0x3\n\ - beq _08001DF8\n\ - b _08001E2C\n\ -_08001D96:\n\ - ldr r0, =gGpuBgConfigs2\n\ - ldr r0, [r0, #0x8]\n\ - lsl r0, #8\n\ - lsr r1, r0, #16\n\ - mov r0, #0x10\n\ - bl SetGpuReg\n\ - b _08001E2C\n\ - .pool\n\ -_08001DAC:\n\ - ldr r0, =gGpuBgConfigs2\n\ - ldr r0, [r0, #0x18]\n\ - lsl r0, #8\n\ - lsr r1, r0, #16\n\ - mov r0, #0x14\n\ - bl SetGpuReg\n\ - b _08001E2C\n\ - .pool\n\ -_08001DC0:\n\ - cmp r0, #0\n\ - bne _08001DD8\n\ - ldr r0, =gGpuBgConfigs2\n\ - ldr r0, [r0, #0x28]\n\ - lsl r0, #8\n\ - lsr r1, r0, #16\n\ - mov r0, #0x18\n\ - bl SetGpuReg\n\ - b _08001E2C\n\ - .pool\n\ -_08001DD8:\n\ - ldr r0, =gGpuBgConfigs2\n\ - ldr r0, [r0, #0x28]\n\ - lsr r1, r0, #16\n\ - lsl r0, #16\n\ - lsr r4, r0, #16\n\ - mov r0, #0x2A\n\ - bl SetGpuReg\n\ - mov r0, #0x28\n\ - add r1, r4, #0\n\ - bl SetGpuReg\n\ - b _08001E2C\n\ - .pool\n\ -_08001DF8:\n\ - cmp r0, #0\n\ - bne _08001E10\n\ - ldr r0, =gGpuBgConfigs2\n\ - ldr r0, [r0, #0x38]\n\ - lsl r0, #8\n\ - lsr r1, r0, #16\n\ - mov r0, #0x1C\n\ - bl SetGpuReg\n\ - b _08001E2C\n\ - .pool\n\ -_08001E10:\n\ - cmp r0, #0x2\n\ - bne _08001E2C\n\ - ldr r0, =gGpuBgConfigs2\n\ - ldr r0, [r0, #0x38]\n\ - lsr r1, r0, #16\n\ - lsl r0, #16\n\ - lsr r4, r0, #16\n\ - mov r0, #0x3A\n\ - bl SetGpuReg\n\ - mov r0, #0x38\n\ - add r1, r4, #0\n\ - bl SetGpuReg\n\ -_08001E2C:\n\ - ldr r0, =gGpuBgConfigs2\n\ - add r0, #0x8\n\ - add r0, r5, r0\n\ - ldr r0, [r0]\n\ -_08001E34:\n\ - pop {r4-r6}\n\ - pop {r1}\n\ - bx r1\n\ - .pool\n"); -} -#endif // NONMATCHING u32 GetBgX(u8 bg) { @@ -857,11 +708,11 @@ u32 GetBgX(u8 bg) return gGpuBgConfigs2[bg].bg_x; } -#ifdef NONMATCHING // Everything that uses temp1 doesn't match u32 ChangeBgY(u8 bg, u32 value, u8 op) { u8 mode; - u32 temp1; + u16 temp1; + u16 temp2; if (IsInvalidBg32(bg) != FALSE || GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0) { @@ -887,202 +738,51 @@ u32 ChangeBgY(u8 bg, u32 value, u8 op) switch (bg) { case 0: - SetGpuReg(REG_OFFSET_BG0VOFS, gGpuBgConfigs2[0].bg_y >> 0x8); + temp1 = gGpuBgConfigs2[0].bg_y >> 0x8; + SetGpuReg(REG_OFFSET_BG0VOFS, temp1); break; case 1: - SetGpuReg(REG_OFFSET_BG1VOFS, gGpuBgConfigs2[1].bg_y >> 0x8); + temp1 = gGpuBgConfigs2[1].bg_y >> 0x8; + SetGpuReg(REG_OFFSET_BG1VOFS, temp1); break; case 2: if (mode == 0) { - SetGpuReg(REG_OFFSET_BG2VOFS, gGpuBgConfigs2[2].bg_y >> 0x8); + temp1 = gGpuBgConfigs2[2].bg_y >> 0x8; + SetGpuReg(REG_OFFSET_BG2VOFS, temp1); } else { - temp1 = gGpuBgConfigs2[2].bg_y; - - SetGpuReg(REG_OFFSET_BG2Y_H, (u16)(temp1 >> 0x10)); - SetGpuReg(REG_OFFSET_BG2Y_L, (u16)(temp1)); + temp1 = gGpuBgConfigs2[2].bg_y >> 0x10; + temp2 = gGpuBgConfigs2[2].bg_y & 0xFFFF; + SetGpuReg(REG_OFFSET_BG2Y_H, temp1); + SetGpuReg(REG_OFFSET_BG2Y_L, temp2); } break; case 3: if (mode == 0) { - SetGpuReg(REG_OFFSET_BG3VOFS, gGpuBgConfigs2[3].bg_y >> 0x8); + temp1 = gGpuBgConfigs2[3].bg_y >> 0x8; + SetGpuReg(REG_OFFSET_BG3VOFS, temp1); } else if (mode == 2) { - temp1 = gGpuBgConfigs2[3].bg_y; - - SetGpuReg(REG_OFFSET_BG3Y_H, (u16)(temp1 >> 0x10)); - SetGpuReg(REG_OFFSET_BG3Y_L, (u16)(temp1)); + temp1 = gGpuBgConfigs2[3].bg_y >> 0x10; + temp2 = gGpuBgConfigs2[3].bg_y & 0xFFFF; + SetGpuReg(REG_OFFSET_BG3Y_H, temp1); + SetGpuReg(REG_OFFSET_BG3Y_L, temp2); } break; } return gGpuBgConfigs2[bg].bg_y; } -#else -__attribute__((naked)) -u32 ChangeBgY(u8 bg, u32 value, u8 op) -{ - asm("push {r4-r6,lr}\n\ - add r6, r1, #0\n\ - lsl r0, #24\n\ - lsr r4, r0, #24\n\ - lsl r2, #24\n\ - lsr r5, r2, #24\n\ - add r0, r4, #0\n\ - bl IsInvalidBg32\n\ - cmp r0, #0\n\ - bne _08001EA0\n\ - add r0, r4, #0\n\ - mov r1, #0x1\n\ - bl GetBgControlAttribute\n\ - lsl r0, #16\n\ - cmp r0, #0\n\ - bne _08001EA6\n\ -_08001EA0:\n\ - mov r0, #0x1\n\ - neg r0, r0\n\ - b _08001FAC\n\ -_08001EA6:\n\ - cmp r5, #0x1\n\ - beq _08001EC4\n\ - cmp r5, #0x1\n\ - ble _08001EB2\n\ - cmp r5, #0x2\n\ - beq _08001ED8\n\ -_08001EB2:\n\ - ldr r0, =gGpuBgConfigs2\n\ - lsl r1, r4, #4\n\ - add r0, #0xC\n\ - add r0, r1, r0\n\ - str r6, [r0]\n\ - add r5, r1, #0\n\ - b _08001EE8\n\ - .pool\n\ -_08001EC4:\n\ - ldr r0, =gGpuBgConfigs2\n\ - lsl r2, r4, #4\n\ - add r0, #0xC\n\ - add r0, r2, r0\n\ - ldr r1, [r0]\n\ - add r1, r6\n\ - b _08001EE4\n\ - .pool\n\ -_08001ED8:\n\ - ldr r0, =gGpuBgConfigs2\n\ - lsl r2, r4, #4\n\ - add r0, #0xC\n\ - add r0, r2, r0\n\ - ldr r1, [r0]\n\ - sub r1, r6\n\ -_08001EE4:\n\ - str r1, [r0]\n\ - add r5, r2, #0\n\ -_08001EE8:\n\ - bl GetBgMode\n\ - lsl r0, #24\n\ - lsr r0, #24\n\ - cmp r4, #0x1\n\ - beq _08001F24\n\ - cmp r4, #0x1\n\ - bgt _08001F04\n\ - cmp r4, #0\n\ - beq _08001F0E\n\ - b _08001FA4\n\ - .pool\n\ -_08001F04:\n\ - cmp r4, #0x2\n\ - beq _08001F38\n\ - cmp r4, #0x3\n\ - beq _08001F70\n\ - b _08001FA4\n\ -_08001F0E:\n\ - ldr r0, =gGpuBgConfigs2\n\ - ldr r0, [r0, #0xC]\n\ - lsl r0, #8\n\ - lsr r1, r0, #16\n\ - mov r0, #0x12\n\ - bl SetGpuReg\n\ - b _08001FA4\n\ - .pool\n\ -_08001F24:\n\ - ldr r0, =gGpuBgConfigs2\n\ - ldr r0, [r0, #0x1C]\n\ - lsl r0, #8\n\ - lsr r1, r0, #16\n\ - mov r0, #0x16\n\ - bl SetGpuReg\n\ - b _08001FA4\n\ - .pool\n\ -_08001F38:\n\ - cmp r0, #0\n\ - bne _08001F50\n\ - ldr r0, =gGpuBgConfigs2\n\ - ldr r0, [r0, #0x2C]\n\ - lsl r0, #8\n\ - lsr r1, r0, #16\n\ - mov r0, #0x1A\n\ - bl SetGpuReg\n\ - b _08001FA4\n\ - .pool\n\ -_08001F50:\n\ - ldr r0, =gGpuBgConfigs2\n\ - ldr r0, [r0, #0x2C]\n\ - lsr r1, r0, #16\n\ - lsl r0, #16\n\ - lsr r4, r0, #16\n\ - mov r0, #0x2E\n\ - bl SetGpuReg\n\ - mov r0, #0x2C\n\ - add r1, r4, #0\n\ - bl SetGpuReg\n\ - b _08001FA4\n\ - .pool\n\ -_08001F70:\n\ - cmp r0, #0\n\ - bne _08001F88\n\ - ldr r0, =gGpuBgConfigs2\n\ - ldr r0, [r0, #0x3C]\n\ - lsl r0, #8\n\ - lsr r1, r0, #16\n\ - mov r0, #0x1E\n\ - bl SetGpuReg\n\ - b _08001FA4\n\ - .pool\n\ -_08001F88:\n\ - cmp r0, #0x2\n\ - bne _08001FA4\n\ - ldr r0, =gGpuBgConfigs2\n\ - ldr r0, [r0, #0x3C]\n\ - lsr r1, r0, #16\n\ - lsl r0, #16\n\ - lsr r4, r0, #16\n\ - mov r0, #0x3E\n\ - bl SetGpuReg\n\ - mov r0, #0x3C\n\ - add r1, r4, #0\n\ - bl SetGpuReg\n\ -_08001FA4:\n\ - ldr r0, =gGpuBgConfigs2\n\ - add r0, #0xC\n\ - add r0, r5, r0\n\ - ldr r0, [r0]\n\ -_08001FAC:\n\ - pop {r4-r6}\n\ - pop {r1}\n\ - bx r1\n\ - .pool\n"); -} -#endif // NONMATCHING -#ifdef NONMATCHING // Same issue as ChangeBgX and ChangeBgY u32 ChangeBgY_ScreenOff(u8 bg, u32 value, u8 op) { u8 mode; u16 temp1; + u16 temp2; if (IsInvalidBg32(bg) != FALSE || GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0) { @@ -1108,197 +808,46 @@ u32 ChangeBgY_ScreenOff(u8 bg, u32 value, u8 op) switch (bg) { case 0: - SetGpuReg_ForcedBlank(REG_OFFSET_BG0VOFS, gGpuBgConfigs2[0].bg_y >> 0x8); + temp1 = gGpuBgConfigs2[0].bg_y >> 0x8; + SetGpuReg_ForcedBlank(REG_OFFSET_BG0VOFS, temp1); break; case 1: - SetGpuReg_ForcedBlank(REG_OFFSET_BG1VOFS, gGpuBgConfigs2[1].bg_y >> 0x8); + temp1 = gGpuBgConfigs2[1].bg_y >> 0x8; + SetGpuReg_ForcedBlank(REG_OFFSET_BG1VOFS, temp1); break; case 2: if (mode == 0) { - SetGpuReg_ForcedBlank(REG_OFFSET_BG2VOFS, gGpuBgConfigs2[2].bg_y >> 0x8); + temp1 = gGpuBgConfigs2[2].bg_y >> 0x8; + SetGpuReg_ForcedBlank(REG_OFFSET_BG2VOFS, temp1); } else { - temp1 = gGpuBgConfigs2[2].bg_y; - - SetGpuReg_ForcedBlank(REG_OFFSET_BG2Y_H, (gGpuBgConfigs2[2].bg_y >> 0x10)); - SetGpuReg_ForcedBlank(REG_OFFSET_BG2Y_L, (temp1)); + temp1 = gGpuBgConfigs2[2].bg_y >> 0x10; + temp2 = gGpuBgConfigs2[2].bg_y & 0xFFFF; + SetGpuReg_ForcedBlank(REG_OFFSET_BG2Y_H, temp1); + SetGpuReg_ForcedBlank(REG_OFFSET_BG2Y_L, temp2); } break; case 3: if (mode == 0) { - SetGpuReg_ForcedBlank(REG_OFFSET_BG3VOFS, gGpuBgConfigs2[3].bg_y >> 0x8); + temp1 = gGpuBgConfigs2[3].bg_y >> 0x8; + SetGpuReg_ForcedBlank(REG_OFFSET_BG3VOFS, temp1); } else if (mode == 2) { - temp1 = gGpuBgConfigs2[3].bg_y; - - SetGpuReg_ForcedBlank(REG_OFFSET_BG3Y_H, (gGpuBgConfigs2[3].bg_y >> 0x10)); - SetGpuReg_ForcedBlank(REG_OFFSET_BG3Y_L, (temp1)); + temp1 = gGpuBgConfigs2[3].bg_y >> 0x10; + temp2 = gGpuBgConfigs2[3].bg_y & 0xFFFF; + SetGpuReg_ForcedBlank(REG_OFFSET_BG3Y_H, temp1); + SetGpuReg_ForcedBlank(REG_OFFSET_BG3Y_L, temp2); } break; } return gGpuBgConfigs2[bg].bg_y; } -#else -__attribute__((naked)) -u32 ChangeBgY_ScreenOff(u8 bg, u32 value, u8 op) -{ - asm("push {r4-r6,lr}\n\ - add r6, r1, #0\n\ - lsl r0, #24\n\ - lsr r4, r0, #24\n\ - lsl r2, #24\n\ - lsr r5, r2, #24\n\ - add r0, r4, #0\n\ - bl IsInvalidBg32\n\ - cmp r0, #0\n\ - bne _08001FDC\n\ - add r0, r4, #0\n\ - mov r1, #0x1\n\ - bl GetBgControlAttribute\n\ - lsl r0, #16\n\ - cmp r0, #0\n\ - bne _08001FE2\n\ -_08001FDC:\n\ - mov r0, #0x1\n\ - neg r0, r0\n\ - b _080020E8\n\ -_08001FE2:\n\ - cmp r5, #0x1\n\ - beq _08002000\n\ - cmp r5, #0x1\n\ - ble _08001FEE\n\ - cmp r5, #0x2\n\ - beq _08002014\n\ -_08001FEE:\n\ - ldr r0, =gGpuBgConfigs2\n\ - lsl r1, r4, #4\n\ - add r0, #0xC\n\ - add r0, r1, r0\n\ - str r6, [r0]\n\ - add r5, r1, #0\n\ - b _08002024\n\ - .pool\n\ -_08002000:\n\ - ldr r0, =gGpuBgConfigs2\n\ - lsl r2, r4, #4\n\ - add r0, #0xC\n\ - add r0, r2, r0\n\ - ldr r1, [r0]\n\ - add r1, r6\n\ - b _08002020\n\ - .pool\n\ -_08002014:\n\ - ldr r0, =gGpuBgConfigs2\n\ - lsl r2, r4, #4\n\ - add r0, #0xC\n\ - add r0, r2, r0\n\ - ldr r1, [r0]\n\ - sub r1, r6\n\ -_08002020:\n\ - str r1, [r0]\n\ - add r5, r2, #0\n\ -_08002024:\n\ - bl GetBgMode\n\ - lsl r0, #24\n\ - lsr r0, #24\n\ - cmp r4, #0x1\n\ - beq _08002060\n\ - cmp r4, #0x1\n\ - bgt _08002040\n\ - cmp r4, #0\n\ - beq _0800204A\n\ - b _080020E0\n\ - .pool\n\ -_08002040:\n\ - cmp r4, #0x2\n\ - beq _08002074\n\ - cmp r4, #0x3\n\ - beq _080020AC\n\ - b _080020E0\n\ -_0800204A:\n\ - ldr r0, =gGpuBgConfigs2\n\ - ldr r0, [r0, #0xC]\n\ - lsl r0, #8\n\ - lsr r1, r0, #16\n\ - mov r0, #0x12\n\ - bl SetGpuReg_ForcedBlank\n\ - b _080020E0\n\ - .pool\n\ -_08002060:\n\ - ldr r0, =gGpuBgConfigs2\n\ - ldr r0, [r0, #0x1C]\n\ - lsl r0, #8\n\ - lsr r1, r0, #16\n\ - mov r0, #0x16\n\ - bl SetGpuReg_ForcedBlank\n\ - b _080020E0\n\ - .pool\n\ -_08002074:\n\ - cmp r0, #0\n\ - bne _0800208C\n\ - ldr r0, =gGpuBgConfigs2\n\ - ldr r0, [r0, #0x2C]\n\ - lsl r0, #8\n\ - lsr r1, r0, #16\n\ - mov r0, #0x1A\n\ - bl SetGpuReg_ForcedBlank\n\ - b _080020E0\n\ - .pool\n\ -_0800208C:\n\ - ldr r0, =gGpuBgConfigs2\n\ - ldr r0, [r0, #0x2C]\n\ - lsr r1, r0, #16\n\ - lsl r0, #16\n\ - lsr r4, r0, #16\n\ - mov r0, #0x2E\n\ - bl SetGpuReg_ForcedBlank\n\ - mov r0, #0x2C\n\ - add r1, r4, #0\n\ - bl SetGpuReg_ForcedBlank\n\ - b _080020E0\n\ - .pool\n\ -_080020AC:\n\ - cmp r0, #0\n\ - bne _080020C4\n\ - ldr r0, =gGpuBgConfigs2\n\ - ldr r0, [r0, #0x3C]\n\ - lsl r0, #8\n\ - lsr r1, r0, #16\n\ - mov r0, #0x1E\n\ - bl SetGpuReg_ForcedBlank\n\ - b _080020E0\n\ - .pool\n\ -_080020C4:\n\ - cmp r0, #0x2\n\ - bne _080020E0\n\ - ldr r0, =gGpuBgConfigs2\n\ - ldr r0, [r0, #0x3C]\n\ - lsr r1, r0, #16\n\ - lsl r0, #16\n\ - lsr r4, r0, #16\n\ - mov r0, #0x3E\n\ - bl SetGpuReg_ForcedBlank\n\ - mov r0, #0x3C\n\ - add r1, r4, #0\n\ - bl SetGpuReg_ForcedBlank\n\ -_080020E0:\n\ - ldr r0, =gGpuBgConfigs2\n\ - add r0, #0xC\n\ - add r0, r5, r0\n\ - ldr r0, [r0]\n\ -_080020E8:\n\ - pop {r4-r6}\n\ - pop {r1}\n\ - bx r1\n\ - .pool\n"); -} -#endif // NONMATCHING u32 GetBgY(u8 bg) { @@ -1967,14 +1516,14 @@ void CopyTileMapEntry(u16 *src, u16 *dest, s32 palette1, u32 tileOffset, u32 pal u16 test; switch (palette1) { - case 0x0 ... 0x10: - if (palette1 != 0x10) - test = ((*src + tileOffset) & 0xFFF) + ((palette1 + palette2) << 12); + default: + if (palette1 > 0x10 || palette1 < 0) + test = *src + tileOffset + (palette2 << 12); else - test = ((*dest & 0xFC00) + (palette2 << 12)) | ((*src + tileOffset) & 0x3FF); + test = ((*src + tileOffset) & 0xFFF) + ((palette1 + palette2) << 12); break; - default: - test = *src + tileOffset + (palette2 << 12); + case 0x10: + test = ((*dest & 0xFC00) + (palette2 << 12)) | ((*src + tileOffset) & 0x3FF); break; } -- cgit v1.2.3