diff options
author | sceptillion <33798691+sceptillion@users.noreply.github.com> | 2017-12-18 16:20:58 -0800 |
---|---|---|
committer | sceptillion <33798691+sceptillion@users.noreply.github.com> | 2017-12-18 16:20:58 -0800 |
commit | d116b7660834da4006dccd3559d1ba0e0f8acf1c (patch) | |
tree | 5b838cd447e4562f1385ed6bbc1780773f38cb19 | |
parent | cbeb32fae45e58cabd8c97104033b6d672602ffb (diff) |
decompile window_8bpp
-rw-r--r-- | asm/window_8bpp.s | 447 | ||||
-rw-r--r-- | include/window.h | 2 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/window.c | 2 | ||||
-rw-r--r-- | src/window_8bpp.c | 134 | ||||
-rw-r--r-- | sym_ewram.txt | 8 |
6 files changed, 139 insertions, 456 deletions
diff --git a/asm/window_8bpp.s b/asm/window_8bpp.s deleted file mode 100644 index cb16c72e8..000000000 --- a/asm/window_8bpp.s +++ /dev/null @@ -1,447 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start nullsub_7 -nullsub_7: @ 8005034 - bx lr - thumb_func_end nullsub_7 - - thumb_func_start AddWindow8Bit -AddWindow8Bit: @ 8005038 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - mov r9, r0 - movs r6, 0 - ldr r1, _08005100 @ =gWindows - ldrb r0, [r1] - cmp r0, 0xFF - beq _08005066 -_0800504E: - adds r0, r6, 0x1 - lsls r0, 16 - lsrs r6, r0, 16 - cmp r6, 0x1F - bhi _08005066 - lsls r0, r6, 1 - adds r0, r6 - lsls r0, 2 - adds r0, r1 - ldrb r0, [r0] - cmp r0, 0xFF - bne _0800504E -_08005066: - cmp r6, 0x20 - beq _080050FA - mov r0, r9 - ldrb r7, [r0] - ldr r1, _08005104 @ =gWindowBgTilemapBuffers - mov r10, r1 - lsls r2, r7, 2 - mov r8, r2 - mov r0, r8 - add r0, r10 - ldr r0, [r0] - cmp r0, 0 - bne _080050C2 - adds r0, r7, 0 - movs r1, 0x8 - bl GetBgAttribute - lsls r0, 16 - lsrs r5, r0, 16 - ldr r0, _08005108 @ =0x0000ffff - cmp r5, r0 - beq _080050C2 - adds r0, r5, 0 - bl Alloc - adds r4, r0, 0 - cmp r4, 0 - beq _080050FA - movs r1, 0 - mov r12, r10 - mov r3, r8 - cmp r1, r5 - bge _080050B4 - movs r2, 0 -_080050AA: - adds r0, r4, r1 - strb r2, [r0] - adds r1, 0x1 - cmp r1, r5 - blt _080050AA -_080050B4: - mov r1, r12 - adds r0, r3, r1 - str r4, [r0] - adds r0, r7, 0 - adds r1, r4, 0 - bl SetBgTilemapBuffer -_080050C2: - mov r2, r9 - ldrb r1, [r2, 0x3] - ldrb r0, [r2, 0x4] - muls r0, r1 - lsls r0, 22 - lsrs r0, 16 - bl Alloc - adds r4, r0, 0 - cmp r4, 0 - bne _08005110 - adds r0, r7, 0 - bl GetNumActiveWindowsOnBg8Bit - lsls r0, 24 - cmp r0, 0 - bne _080050FA - ldr r0, _08005104 @ =gWindowBgTilemapBuffers - lsls r1, r7, 2 - adds r5, r1, r0 - ldr r1, [r5] - ldr r0, _0800510C @ =nullsub_7 - cmp r1, r0 - beq _080050FA - adds r0, r1, 0 - bl Free - str r4, [r5] -_080050FA: - movs r0, 0xFF - b _0800512E - .align 2, 0 -_08005100: .4byte gWindows -_08005104: .4byte gWindowBgTilemapBuffers -_08005108: .4byte 0x0000ffff -_0800510C: .4byte nullsub_7 -_08005110: - ldr r1, _0800513C @ =gWindows - lsls r2, r6, 1 - adds r2, r6 - lsls r2, 2 - adds r0, r1, 0 - adds r0, 0x8 - adds r0, r2, r0 - str r4, [r0] - adds r2, r1 - mov r3, r9 - ldr r0, [r3] - ldr r1, [r3, 0x4] - str r0, [r2] - str r1, [r2, 0x4] - adds r0, r6, 0 -_0800512E: - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_0800513C: .4byte gWindows - thumb_func_end AddWindow8Bit - - thumb_func_start FillWindowPixelBuffer8Bit -FillWindowPixelBuffer8Bit: @ 8005140 - push {r4-r6,lr} - lsls r0, 24 - lsrs r0, 24 - lsls r1, 24 - lsrs r5, r1, 24 - ldr r6, _0800517C @ =gWindows - lsls r1, r0, 1 - adds r1, r0 - lsls r4, r1, 2 - adds r0, r4, r6 - ldrb r1, [r0, 0x3] - ldrb r0, [r0, 0x4] - muls r0, r1 - lsls r0, 22 - lsrs r3, r0, 16 - movs r2, 0 - cmp r2, r3 - bge _08005176 - adds r0, r6, 0 - adds r0, 0x8 - adds r1, r4, r0 -_0800516A: - ldr r0, [r1] - adds r0, r2 - strb r5, [r0] - adds r2, 0x1 - cmp r2, r3 - blt _0800516A -_08005176: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_0800517C: .4byte gWindows - thumb_func_end FillWindowPixelBuffer8Bit - - thumb_func_start FillWindowPixelRect8Bit -FillWindowPixelRect8Bit: @ 8005180 - push {r4-r6,lr} - mov r6, r9 - mov r5, r8 - push {r5,r6} - sub sp, 0x10 - mov r9, r3 - ldr r3, [sp, 0x28] - ldr r4, [sp, 0x2C] - mov r8, r4 - lsls r0, 24 - lsrs r0, 24 - lsls r1, 24 - lsrs r1, 24 - lsls r2, 16 - lsrs r2, 16 - mov r4, r9 - lsls r4, 16 - lsrs r4, 16 - mov r9, r4 - lsls r3, 16 - lsrs r3, 16 - mov r4, r8 - lsls r4, 16 - lsrs r4, 16 - mov r8, r4 - ldr r5, _08005200 @ =gWindows - lsls r4, r0, 1 - adds r4, r0 - lsls r4, 2 - adds r0, r5, 0 - adds r0, 0x8 - adds r0, r4, r0 - ldr r0, [r0] - str r0, [sp, 0x8] - adds r4, r5 - ldrb r0, [r4, 0x3] - lsls r0, 3 - ldr r6, _08005204 @ =0xffff0000 - ldr r5, [sp, 0xC] - ands r5, r6 - orrs r5, r0 - str r5, [sp, 0xC] - ldrb r4, [r4, 0x4] - lsls r4, 19 - ldr r0, _08005208 @ =0x0000ffff - ands r0, r5 - orrs r0, r4 - str r0, [sp, 0xC] - mov r0, r8 - str r0, [sp] - str r1, [sp, 0x4] - add r0, sp, 0x8 - adds r1, r2, 0 - mov r2, r9 - bl FillBitmapRect8Bit - add sp, 0x10 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08005200: .4byte gWindows -_08005204: .4byte 0xffff0000 -_08005208: .4byte 0x0000ffff - thumb_func_end FillWindowPixelRect8Bit - - thumb_func_start BlitBitmapRectToWindow4BitTo8Bit -BlitBitmapRectToWindow4BitTo8Bit: @ 800520C - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x2C - ldr r4, [sp, 0x4C] - ldr r5, [sp, 0x50] - ldr r6, [sp, 0x54] - mov r8, r6 - ldr r7, [sp, 0x58] - mov r9, r7 - ldr r6, [sp, 0x5C] - mov r10, r6 - ldr r7, [sp, 0x60] - mov r12, r7 - ldr r6, [sp, 0x64] - lsls r0, 24 - lsrs r0, 24 - lsls r2, 16 - lsrs r2, 16 - lsls r3, 16 - lsrs r3, 16 - lsls r4, 16 - mov r7, r8 - lsls r7, 16 - lsrs r7, 16 - mov r8, r7 - mov r7, r9 - lsls r7, 16 - lsrs r7, 16 - mov r9, r7 - mov r7, r10 - lsls r7, 16 - lsrs r7, 16 - mov r10, r7 - mov r7, r12 - lsls r7, 16 - lsrs r7, 16 - mov r12, r7 - lsls r6, 24 - lsrs r6, 24 - str r6, [sp, 0x28] - str r1, [sp, 0x18] - lsls r5, 16 - ldr r6, _080052CC @ =0x0000ffff - lsrs r4, 16 - orrs r4, r5 - str r4, [sp, 0x1C] - ldr r1, _080052D0 @ =gWindows - lsls r5, r0, 1 - adds r5, r0 - lsls r5, 2 - adds r0, r1, 0 - adds r0, 0x8 - adds r0, r5, r0 - ldr r0, [r0] - str r0, [sp, 0x20] - adds r5, r1 - ldrb r0, [r5, 0x3] - lsls r0, 3 - add r1, sp, 0x20 - ldr r4, [r1, 0x4] - ldr r7, _080052D4 @ =0xffff0000 - ands r4, r7 - orrs r4, r0 - str r4, [r1, 0x4] - ldrb r0, [r5, 0x4] - lsls r0, 19 - ands r6, r4 - orrs r6, r0 - str r6, [r1, 0x4] - mov r0, r8 - str r0, [sp] - mov r6, r9 - str r6, [sp, 0x4] - mov r7, r10 - str r7, [sp, 0x8] - mov r0, r12 - str r0, [sp, 0xC] - movs r0, 0 - str r0, [sp, 0x10] - ldr r6, [sp, 0x28] - str r6, [sp, 0x14] - add r0, sp, 0x18 - bl BlitBitmapRect4BitTo8Bit - add sp, 0x2C - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080052CC: .4byte 0x0000ffff -_080052D0: .4byte gWindows -_080052D4: .4byte 0xffff0000 - thumb_func_end BlitBitmapRectToWindow4BitTo8Bit - - thumb_func_start CopyWindowToVram8Bit -CopyWindowToVram8Bit: @ 80052D8 - push {r4-r6,lr} - lsls r0, 24 - lsrs r0, 24 - lsls r1, 24 - lsrs r2, r1, 24 - adds r5, r2, 0 - ldr r6, _0800530C @ =gUnknown_2020634 - lsls r1, r0, 1 - adds r1, r0 - lsls r1, 2 - ldr r0, _08005310 @ =gWindows - adds r3, r1, r0 - str r3, [r6] - ldr r4, _08005314 @ =gUnknown_2020638 - ldrb r1, [r3, 0x3] - ldrb r0, [r3, 0x4] - muls r0, r1 - lsls r0, 6 - strh r0, [r4] - cmp r2, 0x2 - beq _08005326 - cmp r2, 0x2 - bgt _08005318 - cmp r2, 0x1 - beq _0800531E - b _08005348 - .align 2, 0 -_0800530C: .4byte gUnknown_2020634 -_08005310: .4byte gWindows -_08005314: .4byte gUnknown_2020638 -_08005318: - cmp r5, 0x3 - beq _08005334 - b _08005348 -_0800531E: - ldrb r0, [r3] - bl CopyBgTilemapBufferToVram - b _08005348 -_08005326: - ldrb r0, [r3] - ldr r1, [r3, 0x8] - ldrh r2, [r4] - ldrh r3, [r3, 0x6] - bl LoadBgTiles - b _08005348 -_08005334: - ldrb r0, [r3] - ldr r1, [r3, 0x8] - ldrh r2, [r4] - ldrh r3, [r3, 0x6] - bl LoadBgTiles - ldr r0, [r6] - ldrb r0, [r0] - bl CopyBgTilemapBufferToVram -_08005348: - pop {r4-r6} - pop {r0} - bx r0 - thumb_func_end CopyWindowToVram8Bit - - thumb_func_start GetNumActiveWindowsOnBg8Bit -GetNumActiveWindowsOnBg8Bit: @ 8005350 - push {r4,lr} - lsls r0, 24 - lsrs r4, r0, 24 - movs r3, 0 - ldr r2, _08005378 @ =gWindows - movs r1, 0x1F -_0800535C: - ldrb r0, [r2] - cmp r0, r4 - bne _08005368 - adds r0, r3, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 -_08005368: - adds r2, 0xC - subs r1, 0x1 - cmp r1, 0 - bge _0800535C - adds r0, r3, 0 - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_08005378: .4byte gWindows - thumb_func_end GetNumActiveWindowsOnBg8Bit - - .align 2, 0 @ Don't pad with nop. diff --git a/include/window.h b/include/window.h index b630cd316..09fd00b6d 100644 --- a/include/window.h +++ b/include/window.h @@ -24,6 +24,8 @@ struct WindowTemplate u16 baseBlock; }; +#define WINDOWS_MAX 32 + #define DUMMY_WIN_TEMPLATE \ { \ 0xFF, \ diff --git a/ld_script.txt b/ld_script.txt index 47d9a2388..9fb8ca43c 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -91,7 +91,7 @@ SECTIONS { asm/text_printer.o(.text); src/window.o(.text); asm/blit.o(.text); - asm/window_8bpp.o(.text); + src/window_8bpp.o(.text); asm/text.o(.text); asm/sprite.o(.text); asm/string_util.o(.text); diff --git a/src/window.c b/src/window.c index 62879bd6c..4f922084a 100644 --- a/src/window.c +++ b/src/window.c @@ -7,8 +7,6 @@ extern u8 gWindowClearTile; extern void* gWindowBgTilemapBuffers[]; extern u32 gWindowTileAutoAllocEnabled; -#define WINDOWS_MAX 32 - EWRAM_DATA struct Window gWindows[WINDOWS_MAX] = {0}; extern void BlitBitmapRect4Bit(struct Bitmap *src, struct Bitmap *dest, u16 srcX, u16 srcY, u16 destX, u16 destY, u16 width, u16 height, u8 colorKey); diff --git a/src/window_8bpp.c b/src/window_8bpp.c new file mode 100644 index 000000000..a1c19314c --- /dev/null +++ b/src/window_8bpp.c @@ -0,0 +1,134 @@ +#include "global.h" +#include "window.h" +#include "malloc.h" +#include "bg.h" + +extern void* gWindowBgTilemapBuffers[]; + +EWRAM_DATA static struct Window* sWindowPtr = NULL; +EWRAM_DATA static u16 sWindowSize = 0; + +extern void BlitBitmapRect4BitTo8Bit(struct Bitmap *src, struct Bitmap *dest, u16 srcX, u16 srcY, u16 destX, u16 destY, u16 width, u16 height, u8 colorKey, u8 paletteNum); +extern void FillBitmapRect8Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue); + +static u8 GetNumActiveWindowsOnBg8Bit(u8 bgId); + +static void nullsub_9(void) +{ +} + +u16 AddWindow8Bit(struct WindowTemplate *template) +{ + u16 windowId; + u8* memAddress; + u8 bgLayer; + + for (windowId = 0; windowId < 32; windowId++) + { + if (gWindows[windowId].window.priority == 0xFF) + break; + } + if (windowId == WINDOWS_MAX) + return 0xFF; + bgLayer = template->priority; + if (gWindowBgTilemapBuffers[bgLayer] == 0) + { + u16 attribute = GetBgAttribute(bgLayer, 8); + if (attribute != 0xFFFF) + { + s32 i; + memAddress = Alloc(attribute); + if (memAddress == NULL) + return 0xFF; + for (i = 0; i < attribute; i++) // if we're going to zero out the memory anyway, why not call AllocZeroed? + memAddress[i] = 0; + gWindowBgTilemapBuffers[bgLayer] = memAddress; + SetBgTilemapBuffer(bgLayer, memAddress); + } + } + memAddress = Alloc((u16)(0x40 * (template->width * template->height))); + if (memAddress == NULL) + { + if (GetNumActiveWindowsOnBg8Bit(bgLayer) == 0 && gWindowBgTilemapBuffers[bgLayer] != nullsub_9) + { + Free(gWindowBgTilemapBuffers[bgLayer]); + gWindowBgTilemapBuffers[bgLayer] = NULL; + } + return 0xFF; + } + else + { + gWindows[windowId].tileData = memAddress; + gWindows[windowId].window = *template; + return windowId; + } +} + +void FillWindowPixelBuffer8Bit(u8 windowId, u8 fillValue) +{ + s32 i; + s32 size; + + size = (u16)(0x40 * (gWindows[windowId].window.width * gWindows[windowId].window.height)); + for (i = 0; i < size; i++) + gWindows[windowId].tileData[i] = fillValue; +} + +void FillWindowPixelRect8Bit(u8 windowId, u8 fillValue, u16 x, u16 y, u16 width, u16 height) +{ + struct Bitmap pixelRect; + + pixelRect.pixels = gWindows[windowId].tileData; + pixelRect.width = 8 * gWindows[windowId].window.width; + pixelRect.height = 8 * gWindows[windowId].window.height; + + FillBitmapRect8Bit(&pixelRect, x, y, width, height, fillValue); +} + +void BlitBitmapRectToWindow4BitTo8Bit(u8 windowId, u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight, u8 paletteNum) +{ + struct Bitmap sourceRect; + struct Bitmap destRect; + + sourceRect.pixels = (u8*)pixels; + sourceRect.width = srcWidth; + sourceRect.height = srcHeight; + + destRect.pixels = gWindows[windowId].tileData; + destRect.width = 8 * gWindows[windowId].window.width; + destRect.height = 8 * gWindows[windowId].window.height; + + BlitBitmapRect4BitTo8Bit(&sourceRect, &destRect, srcX, srcY, destX, destY, rectWidth, rectHeight, 0, paletteNum); +} + +void CopyWindowToVram8Bit(u8 windowId, u8 mode) +{ + sWindowPtr = &gWindows[windowId]; + sWindowSize = 0x40 * (sWindowPtr->window.width * sWindowPtr->window.height); + + switch (mode) + { + case 1: + CopyBgTilemapBufferToVram(sWindowPtr->window.priority); + break; + case 2: + LoadBgTiles(sWindowPtr->window.priority, sWindowPtr->tileData, sWindowSize, sWindowPtr->window.baseBlock); + break; + case 3: + LoadBgTiles(sWindowPtr->window.priority, sWindowPtr->tileData, sWindowSize, sWindowPtr->window.baseBlock); + CopyBgTilemapBufferToVram(sWindowPtr->window.priority); + break; + } +} + +static u8 GetNumActiveWindowsOnBg8Bit(u8 bgId) +{ + u8 windowsNum = 0; + s32 i; + for (i = 0; i < WINDOWS_MAX; i++) + { + if (gWindows[i].window.priority == bgId) + windowsNum++; + } + return windowsNum; +} diff --git a/sym_ewram.txt b/sym_ewram.txt index 0ddc34521..0cdb7ef95 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -31,13 +31,9 @@ gTrainerId: @ 2020000 .include "src/malloc.o" .include "src/text_printer.o" .include "src/window.o" + .include "src/window_8bpp.o" -gUnknown_2020634: @ 2020634 - .space 0x4 - -gUnknown_2020638: @ 2020638 - .space 0x4 - + .align 2 gUnknown_202063C: @ 202063C .space 0x1C |