diff options
-rw-r--r-- | asm/list_menu.s | 4 | ||||
-rw-r--r-- | asm/pokedex_screen.s | 6 | ||||
-rw-r--r-- | asm/window.s | 2039 | ||||
-rw-r--r-- | asm/window_8bpp.s | 6 | ||||
-rw-r--r-- | data/data.s | 3 | ||||
-rw-r--r-- | include/gba/macro.h | 2 | ||||
-rw-r--r-- | ld_script.txt | 3 | ||||
-rw-r--r-- | src/window.c | 1152 | ||||
-rw-r--r-- | sym_common.txt | 4 | ||||
-rw-r--r-- | sym_ewram.txt | 4 |
10 files changed, 1167 insertions, 2056 deletions
diff --git a/asm/list_menu.s b/asm/list_menu.s index b5eca733f..f72f1d81a 100644 --- a/asm/list_menu.s +++ b/asm/list_menu.s @@ -470,11 +470,11 @@ sub_8107208: @ 8107208 ldrb r0, [r4, 0x10] movs r1, 0x1 adds r2, r3, 0 - bl sub_80048BC + bl SetWindowAttribute ldrb r0, [r4, 0x10] movs r1, 0x2 adds r2, r5, 0 - bl sub_80048BC + bl SetWindowAttribute pop {r4,r5} pop {r0} bx r0 diff --git a/asm/pokedex_screen.s b/asm/pokedex_screen.s index 0e9da693a..347f7cd9c 100644 --- a/asm/pokedex_screen.s +++ b/asm/pokedex_screen.s @@ -7458,7 +7458,7 @@ _081061F0: add r2, r9 adds r0, r4, 0 movs r1, 0x2 - bl sub_80048BC + bl SetWindowAttribute ldr r0, [r5] adds r0, 0x4A ldrb r0, [r0] @@ -7508,7 +7508,7 @@ _08106246: add r2, r9 adds r0, r4, 0 movs r1, 0x2 - bl sub_80048BC + bl SetWindowAttribute ldr r0, [r5] adds r0, 0x4A adds r0, r6 @@ -7656,7 +7656,7 @@ _081062B4: add r2, r9 adds r0, r4, 0 movs r1, 0x2 - bl sub_80048BC + bl SetWindowAttribute ldr r0, [r7] adds r0, 0x54 ldrb r0, [r0] diff --git a/asm/window.s b/asm/window.s deleted file mode 100644 index 8a457d4f5..000000000 --- a/asm/window.s +++ /dev/null @@ -1,2039 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start nullsub_6 -nullsub_6: @ 8003B20 - bx lr - thumb_func_end nullsub_6 - - thumb_func_start InitWindows -InitWindows: @ 8003B24 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x8 - adds r5, r0, 0 - movs r0, 0 - mov r8, r0 - ldr r4, _08003BB8 @ =gUnknown_3003E40 -_08003B38: - mov r1, r8 - lsls r0, r1, 24 - lsrs r0, 24 - bl GetBgTilemapBuffer - cmp r0, 0 - beq _08003B48 - ldr r0, _08003BBC @ =nullsub_6 -_08003B48: - str r0, [r4] - adds r4, 0x4 - movs r2, 0x1 - add r8, r2 - mov r0, r8 - cmp r0, 0x3 - ble _08003B38 - ldr r0, _08003BC0 @ =gUnknown_81EA144 - ldr r2, [r0] - ldr r3, [r0, 0x4] - ldr r1, _08003BC4 @ =gWindows - movs r0, 0 - movs r4, 0x1F - mov r8, r4 -_08003B64: - str r2, [r1] - str r3, [r1, 0x4] - str r0, [r1, 0x8] - adds r1, 0xC - movs r4, 0x1 - negs r4, r4 - add r8, r4 - mov r4, r8 - cmp r4, 0 - bge _08003B64 - movs r0, 0 - mov r8, r0 - movs r1, 0 - str r1, [sp] - ldrb r7, [r5] - cmp r7, 0xFF - bne _08003B88 - b _08003CC0 -_08003B88: - adds r6, r5, 0 - movs r2, 0 - str r2, [sp, 0x4] -_08003B8E: - ldr r0, _08003BC8 @ =gUnneededFireRedVariable - ldr r0, [r0] - cmp r0, 0x1 - bne _08003BCC - ldrb r1, [r6, 0x3] - ldrb r0, [r6, 0x4] - adds r2, r1, 0 - muls r2, r0 - adds r0, r7, 0 - movs r1, 0 - movs r3, 0 - bl DummiedOutFireRedLeafGreenTileAllocFunc - str r0, [sp] - movs r0, 0x1 - negs r0, r0 - ldr r4, [sp] - cmp r4, r0 - bne _08003BCC -_08003BB4: - movs r0, 0 - b _08003CC8 - .align 2, 0 -_08003BB8: .4byte gUnknown_3003E40 -_08003BBC: .4byte nullsub_6 -_08003BC0: .4byte gUnknown_81EA144 -_08003BC4: .4byte gWindows -_08003BC8: .4byte gUnneededFireRedVariable -_08003BCC: - ldr r0, _08003C04 @ =gUnknown_3003E40 - mov r9, r0 - lsls r0, r7, 2 - mov r2, r9 - adds r1, r0, r2 - ldr r1, [r1] - mov r10, r0 - cmp r1, 0 - bne _08003C2E - adds r0, r7, 0 - movs r1, 0x8 - bl GetBgAttribute - lsls r0, 16 - lsrs r5, r0, 16 - ldr r0, _08003C08 @ =0x0000ffff - cmp r5, r0 - beq _08003C2E - adds r0, r5, 0 - bl Alloc - adds r4, r0, 0 - cmp r4, 0 - bne _08003C0C - bl FreeAllWindowBuffers - b _08003BB4 - .align 2, 0 -_08003C04: .4byte gUnknown_3003E40 -_08003C08: .4byte 0x0000ffff -_08003C0C: - movs r1, 0 - mov r3, r9 - cmp r1, r5 - bge _08003C20 - movs r2, 0 -_08003C16: - adds r0, r4, r1 - strb r2, [r0] - adds r1, 0x1 - cmp r1, r5 - blt _08003C16 -_08003C20: - mov r1, r10 - adds r0, r1, r3 - str r4, [r0] - adds r0, r7, 0 - adds r1, r4, 0 - bl SetBgTilemapBuffer -_08003C2E: - ldrb r1, [r6, 0x3] - ldrb r0, [r6, 0x4] - muls r0, r1 - lsls r0, 21 - lsrs r0, 16 - bl Alloc - adds r4, r0, 0 - cmp r4, 0 - bne _08003C70 - adds r0, r7, 0 - bl GetNumActiveWindowsOnBg - lsls r0, 24 - cmp r0, 0 - bne _08003BB4 - ldr r0, _08003C68 @ =gUnknown_3003E40 - mov r2, r10 - adds r5, r2, r0 - ldr r1, [r5] - ldr r0, _08003C6C @ =nullsub_6 - cmp r1, r0 - beq _08003BB4 - adds r0, r1, 0 - bl Free - str r4, [r5] - b _08003BB4 - .align 2, 0 -_08003C68: .4byte gUnknown_3003E40 -_08003C6C: .4byte nullsub_6 -_08003C70: - ldr r1, _08003CD8 @ =gWindows - adds r0, r1, 0 - adds r0, 0x8 - ldr r2, [sp, 0x4] - adds r0, r2, r0 - str r4, [r0] - adds r2, r1 - ldr r0, [r6] - ldr r1, [r6, 0x4] - str r0, [r2] - str r1, [r2, 0x4] - ldr r0, _08003CDC @ =gUnneededFireRedVariable - ldr r0, [r0] - cmp r0, 0x1 - bne _08003CA6 - mov r4, sp - ldrh r4, [r4] - strh r4, [r2, 0x6] - ldrb r0, [r6, 0x3] - ldrb r1, [r6, 0x4] - adds r2, r0, 0 - muls r2, r1 - adds r0, r7, 0 - ldr r1, [sp] - movs r3, 0x1 - bl DummiedOutFireRedLeafGreenTileAllocFunc -_08003CA6: - adds r6, 0x8 - ldr r0, [sp, 0x4] - adds r0, 0xC - str r0, [sp, 0x4] - movs r1, 0x1 - add r8, r1 - ldrb r7, [r6] - cmp r7, 0xFF - beq _08003CC0 - mov r2, r8 - cmp r2, 0x1F - bgt _08003CC0 - b _08003B8E -_08003CC0: - ldr r1, _08003CE0 @ =gUnknown_3003E30 - movs r0, 0 - strb r0, [r1] - movs r0, 0x1 -_08003CC8: - add sp, 0x8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_08003CD8: .4byte gWindows -_08003CDC: .4byte gUnneededFireRedVariable -_08003CE0: .4byte gUnknown_3003E30 - thumb_func_end InitWindows - - thumb_func_start AddWindow -AddWindow: @ 8003CE4 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - mov r8, r0 - movs r6, 0 - ldr r1, _08003DD4 @ =gWindows - ldrb r0, [r1] - cmp r0, 0xFF - beq _08003D14 -_08003CFC: - adds r0, r6, 0x1 - lsls r0, 16 - lsrs r6, r0, 16 - cmp r6, 0x1F - bhi _08003D14 - lsls r0, r6, 1 - adds r0, r6 - lsls r0, 2 - adds r0, r1 - ldrb r0, [r0] - cmp r0, 0xFF - bne _08003CFC -_08003D14: - cmp r6, 0x20 - beq _08003DCE - mov r0, r8 - ldrb r7, [r0] - movs r1, 0 - mov r9, r1 - ldr r0, _08003DD8 @ =gUnneededFireRedVariable - ldr r0, [r0] - cmp r0, 0x1 - bne _08003D46 - mov r2, r8 - ldrb r1, [r2, 0x3] - ldrb r0, [r2, 0x4] - adds r2, r1, 0 - muls r2, r0 - adds r0, r7, 0 - movs r1, 0 - movs r3, 0 - bl DummiedOutFireRedLeafGreenTileAllocFunc - mov r9, r0 - movs r0, 0x1 - negs r0, r0 - cmp r9, r0 - beq _08003DCE -_08003D46: - ldr r3, _08003DDC @ =gUnknown_3003E40 - mov r10, r3 - lsls r0, r7, 2 - adds r1, r0, r3 - ldr r1, [r1] - str r0, [sp] - cmp r1, 0 - bne _08003D96 - adds r0, r7, 0 - movs r1, 0x8 - bl GetBgAttribute - lsls r0, 16 - lsrs r5, r0, 16 - ldr r0, _08003DE0 @ =0x0000ffff - cmp r5, r0 - beq _08003D96 - adds r0, r5, 0 - bl Alloc - adds r4, r0, 0 - cmp r4, 0 - beq _08003DCE - movs r1, 0 - mov r3, r10 - cmp r1, r5 - bge _08003D88 - movs r2, 0 -_08003D7E: - adds r0, r4, r1 - strb r2, [r0] - adds r1, 0x1 - cmp r1, r5 - blt _08003D7E -_08003D88: - ldr r1, [sp] - adds r0, r1, r3 - str r4, [r0] - adds r0, r7, 0 - adds r1, r4, 0 - bl SetBgTilemapBuffer -_08003D96: - mov r2, r8 - ldrb r1, [r2, 0x3] - ldrb r0, [r2, 0x4] - muls r0, r1 - lsls r0, 21 - lsrs r0, 16 - bl Alloc - adds r4, r0, 0 - cmp r4, 0 - bne _08003DE8 - adds r0, r7, 0 - bl GetNumActiveWindowsOnBg - lsls r0, 24 - cmp r0, 0 - bne _08003DCE - ldr r0, _08003DDC @ =gUnknown_3003E40 - ldr r3, [sp] - adds r5, r3, r0 - ldr r1, [r5] - ldr r0, _08003DE4 @ =nullsub_6 - cmp r1, r0 - beq _08003DCE - adds r0, r1, 0 - bl Free - str r4, [r5] -_08003DCE: - movs r0, 0xFF - b _08003E24 - .align 2, 0 -_08003DD4: .4byte gWindows -_08003DD8: .4byte gUnneededFireRedVariable -_08003DDC: .4byte gUnknown_3003E40 -_08003DE0: .4byte 0x0000ffff -_08003DE4: .4byte nullsub_6 -_08003DE8: - ldr r2, _08003E34 @ =gWindows - lsls r1, r6, 1 - adds r1, r6 - lsls r1, 2 - adds r0, r2, 0 - adds r0, 0x8 - adds r0, r1, r0 - str r4, [r0] - adds r2, r1, r2 - mov r3, r8 - ldr r0, [r3] - ldr r1, [r3, 0x4] - str r0, [r2] - str r1, [r2, 0x4] - ldr r0, _08003E38 @ =gUnneededFireRedVariable - ldr r0, [r0] - cmp r0, 0x1 - bne _08003E22 - mov r0, r9 - strh r0, [r2, 0x6] - ldrb r0, [r2, 0x3] - ldrb r1, [r2, 0x4] - adds r2, r0, 0 - muls r2, r1 - adds r0, r7, 0 - mov r1, r9 - movs r3, 0x1 - bl DummiedOutFireRedLeafGreenTileAllocFunc -_08003E22: - adds r0, r6, 0 -_08003E24: - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_08003E34: .4byte gWindows -_08003E38: .4byte gUnneededFireRedVariable - thumb_func_end AddWindow - - thumb_func_start RemoveWindow -RemoveWindow: @ 8003E3C - push {r4-r7,lr} - lsls r0, 24 - lsrs r6, r0, 24 - ldr r1, _08003EB8 @ =gWindows - lsls r0, r6, 1 - adds r0, r6 - lsls r0, 2 - adds r4, r0, r1 - ldrb r3, [r4] - adds r7, r3, 0 - ldr r0, _08003EBC @ =gUnneededFireRedVariable - ldr r0, [r0] - cmp r0, 0x1 - bne _08003E68 - ldrh r1, [r4, 0x6] - ldrb r2, [r4, 0x3] - ldrb r0, [r4, 0x4] - muls r2, r0 - adds r0, r3, 0 - movs r3, 0x2 - bl DummiedOutFireRedLeafGreenTileAllocFunc -_08003E68: - ldr r0, _08003EC0 @ =gUnknown_81EA144 - ldr r1, [r0, 0x4] - ldr r0, [r0] - str r0, [r4] - str r1, [r4, 0x4] - adds r0, r7, 0 - bl GetNumActiveWindowsOnBg - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0 - bne _08003E96 - ldr r0, _08003EC4 @ =gUnknown_3003E40 - lsls r1, r7, 2 - adds r4, r1, r0 - ldr r1, [r4] - ldr r0, _08003EC8 @ =nullsub_6 - cmp r1, r0 - beq _08003E96 - adds r0, r1, 0 - bl Free - str r5, [r4] -_08003E96: - ldr r1, _08003EB8 @ =gWindows - lsls r0, r6, 1 - adds r0, r6 - lsls r0, 2 - adds r1, 0x8 - adds r4, r0, r1 - ldr r0, [r4] - cmp r0, 0 - beq _08003EB0 - bl Free - movs r0, 0 - str r0, [r4] -_08003EB0: - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08003EB8: .4byte gWindows -_08003EBC: .4byte gUnneededFireRedVariable -_08003EC0: .4byte gUnknown_81EA144 -_08003EC4: .4byte gUnknown_3003E40 -_08003EC8: .4byte nullsub_6 - thumb_func_end RemoveWindow - - thumb_func_start FreeAllWindowBuffers -FreeAllWindowBuffers: @ 8003ECC - push {r4-r6,lr} - ldr r4, _08003F14 @ =gUnknown_3003E40 - movs r5, 0x3 -_08003ED2: - ldr r1, [r4] - cmp r1, 0 - beq _08003EE8 - ldr r0, _08003F18 @ =nullsub_6 - cmp r1, r0 - beq _08003EE8 - adds r0, r1, 0 - bl Free - movs r0, 0 - str r0, [r4] -_08003EE8: - adds r4, 0x4 - subs r5, 0x1 - cmp r5, 0 - bge _08003ED2 - ldr r0, _08003F1C @ =gWindows - adds r4, r0, 0 - adds r4, 0x8 - movs r6, 0 - movs r5, 0x1F -_08003EFA: - ldr r0, [r4] - cmp r0, 0 - beq _08003F06 - bl Free - str r6, [r4] -_08003F06: - adds r4, 0xC - subs r5, 0x1 - cmp r5, 0 - bge _08003EFA - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08003F14: .4byte gUnknown_3003E40 -_08003F18: .4byte nullsub_6 -_08003F1C: .4byte gWindows - thumb_func_end FreeAllWindowBuffers - - thumb_func_start CopyWindowToVram -CopyWindowToVram: @ 8003F20 - push {r4-r6,lr} - sub sp, 0xC - lsls r0, 24 - lsrs r0, 24 - lsls r1, 24 - lsrs r3, r1, 24 - adds r5, r3, 0 - ldr r2, _08003F58 @ =gWindows - lsls r1, r0, 1 - adds r1, r0 - lsls r1, 2 - mov r0, sp - adds r1, r2 - ldm r1!, {r2,r4,r6} - stm r0!, {r2,r4,r6} - mov r0, sp - ldrb r1, [r0, 0x3] - ldrb r0, [r0, 0x4] - muls r0, r1 - lsls r0, 21 - lsrs r4, r0, 16 - cmp r3, 0x2 - beq _08003F6C - cmp r3, 0x2 - bgt _08003F5C - cmp r3, 0x1 - beq _08003F62 - b _08003F96 - .align 2, 0 -_08003F58: .4byte gWindows -_08003F5C: - cmp r5, 0x3 - beq _08003F7E - b _08003F96 -_08003F62: - mov r0, sp - ldrb r0, [r0] - bl CopyBgTilemapBufferToVram - b _08003F96 -_08003F6C: - mov r0, sp - ldrb r0, [r0] - ldr r1, [sp, 0x8] - mov r2, sp - ldrh r3, [r2, 0x6] - adds r2, r4, 0 - bl LoadBgTiles - b _08003F96 -_08003F7E: - mov r0, sp - ldrb r0, [r0] - ldr r1, [sp, 0x8] - mov r2, sp - ldrh r3, [r2, 0x6] - adds r2, r4, 0 - bl LoadBgTiles - mov r0, sp - ldrb r0, [r0] - bl CopyBgTilemapBufferToVram -_08003F96: - add sp, 0xC - pop {r4-r6} - pop {r0} - bx r0 - thumb_func_end CopyWindowToVram - - thumb_func_start PutWindowTilemap -PutWindowTilemap: @ 8003FA0 - push {r4,lr} - sub sp, 0x1C - lsls r0, 24 - lsrs r0, 24 - ldr r2, _08003FFC @ =gWindows - lsls r1, r0, 1 - adds r1, r0 - lsls r1, 2 - add r0, sp, 0x10 - adds r1, r2 - ldm r1!, {r2-r4} - stm r0!, {r2-r4} - add r0, sp, 0x10 - ldrb r0, [r0] - movs r1, 0xA - bl GetBgAttribute - adds r1, r0, 0 - add r0, sp, 0x10 - ldrh r0, [r0, 0x6] - adds r1, r0 - lsls r1, 16 - lsrs r1, 16 - add r0, sp, 0x10 - ldrb r0, [r0] - add r2, sp, 0x10 - ldrb r2, [r2, 0x1] - add r3, sp, 0x10 - ldrb r3, [r3, 0x2] - add r4, sp, 0x10 - ldrb r4, [r4, 0x3] - str r4, [sp] - add r4, sp, 0x10 - ldrb r4, [r4, 0x4] - str r4, [sp, 0x4] - add r4, sp, 0x10 - ldrb r4, [r4, 0x5] - str r4, [sp, 0x8] - movs r4, 0x1 - str r4, [sp, 0xC] - bl WriteSequenceToBgTilemapBuffer - add sp, 0x1C - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08003FFC: .4byte gWindows - thumb_func_end PutWindowTilemap - - thumb_func_start PutWindowRectTilemapOverridePalette -PutWindowRectTilemapOverridePalette: @ 8004000 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x24 - ldr r4, [sp, 0x44] - ldr r5, [sp, 0x48] - lsls r0, 24 - lsrs r0, 24 - lsls r1, 24 - lsrs r1, 24 - mov r10, r1 - lsls r2, 24 - lsrs r2, 24 - mov r9, r2 - lsls r3, 24 - lsrs r3, 24 - str r3, [sp, 0x1C] - lsls r4, 24 - lsrs r4, 24 - mov r8, r4 - lsls r5, 24 - lsrs r5, 24 - str r5, [sp, 0x20] - ldr r2, _080040B4 @ =gWindows - lsls r1, r0, 1 - adds r1, r0 - lsls r1, 2 - add r0, sp, 0x10 - adds r1, r2 - ldm r1!, {r2-r4} - stm r0!, {r2-r4} - add r0, sp, 0x10 - ldrb r0, [r0] - movs r1, 0xA - bl GetBgAttribute - add r2, sp, 0x10 - adds r1, r2, 0 - ldrb r1, [r1, 0x3] - mov r3, r9 - muls r3, r1 - adds r1, r3, 0 - ldrh r2, [r2, 0x6] - adds r1, r2 - add r1, r10 - adds r0, r1 - lsls r0, 16 - lsrs r6, r0, 16 - movs r5, 0 - cmp r5, r8 - bge _080040A2 - add r4, sp, 0x10 - movs r7, 0x1 -_0800406E: - ldrb r0, [r4] - ldrb r2, [r4, 0x1] - add r2, r10 - lsls r2, 24 - lsrs r2, 24 - ldrb r3, [r4, 0x2] - add r3, r9 - adds r3, r5 - lsls r3, 24 - lsrs r3, 24 - ldr r1, [sp, 0x1C] - str r1, [sp] - str r7, [sp, 0x4] - ldr r1, [sp, 0x20] - str r1, [sp, 0x8] - str r7, [sp, 0xC] - adds r1, r6, 0 - bl WriteSequenceToBgTilemapBuffer - ldrb r0, [r4, 0x3] - adds r0, r6, r0 - lsls r0, 16 - lsrs r6, r0, 16 - adds r5, 0x1 - cmp r5, r8 - blt _0800406E -_080040A2: - add sp, 0x24 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080040B4: .4byte gWindows - thumb_func_end PutWindowRectTilemapOverridePalette - - thumb_func_start ClearWindowTilemap -ClearWindowTilemap: @ 80040B8 - push {r4,lr} - sub sp, 0x18 - lsls r0, 24 - lsrs r0, 24 - ldr r2, _08004100 @ =gWindows - lsls r1, r0, 1 - adds r1, r0 - lsls r1, 2 - add r0, sp, 0xC - adds r1, r2 - ldm r1!, {r2-r4} - stm r0!, {r2-r4} - add r0, sp, 0xC - ldrb r0, [r0] - ldr r1, _08004104 @ =gUnknown_3003E30 - ldrb r1, [r1] - add r2, sp, 0xC - ldrb r2, [r2, 0x1] - add r3, sp, 0xC - ldrb r3, [r3, 0x2] - add r4, sp, 0xC - ldrb r4, [r4, 0x3] - str r4, [sp] - add r4, sp, 0xC - ldrb r4, [r4, 0x4] - str r4, [sp, 0x4] - add r4, sp, 0xC - ldrb r4, [r4, 0x5] - str r4, [sp, 0x8] - bl FillBgTilemapBufferRect - add sp, 0x18 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08004100: .4byte gWindows -_08004104: .4byte gUnknown_3003E30 - thumb_func_end ClearWindowTilemap - - thumb_func_start PutWindowRectTilemap -PutWindowRectTilemap: @ 8004108 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x20 - ldr r4, [sp, 0x40] - lsls r0, 24 - lsrs r0, 24 - lsls r1, 24 - lsrs r1, 24 - mov r10, r1 - lsls r2, 24 - lsrs r2, 24 - mov r9, r2 - lsls r3, 24 - lsrs r3, 24 - str r3, [sp, 0x1C] - lsls r4, 24 - lsrs r4, 24 - mov r8, r4 - ldr r2, _080041B4 @ =gWindows - lsls r1, r0, 1 - adds r1, r0 - lsls r1, 2 - add r0, sp, 0x10 - adds r1, r2 - ldm r1!, {r2-r4} - stm r0!, {r2-r4} - add r0, sp, 0x10 - ldrb r0, [r0] - movs r1, 0xA - bl GetBgAttribute - add r2, sp, 0x10 - adds r1, r2, 0 - ldrb r1, [r1, 0x3] - mov r3, r9 - muls r3, r1 - adds r1, r3, 0 - ldrh r2, [r2, 0x6] - adds r1, r2 - add r1, r10 - adds r0, r1 - lsls r0, 16 - lsrs r6, r0, 16 - movs r5, 0 - cmp r5, r8 - bge _080041A2 - add r4, sp, 0x10 - movs r7, 0x1 -_0800416E: - ldrb r0, [r4] - ldrb r2, [r4, 0x1] - add r2, r10 - lsls r2, 24 - lsrs r2, 24 - ldrb r3, [r4, 0x2] - add r3, r9 - adds r3, r5 - lsls r3, 24 - lsrs r3, 24 - ldr r1, [sp, 0x1C] - str r1, [sp] - str r7, [sp, 0x4] - ldrb r1, [r4, 0x5] - str r1, [sp, 0x8] - str r7, [sp, 0xC] - adds r1, r6, 0 - bl WriteSequenceToBgTilemapBuffer - ldrb r0, [r4, 0x3] - adds r0, r6, r0 - lsls r0, 16 - lsrs r6, r0, 16 - adds r5, 0x1 - cmp r5, r8 - blt _0800416E -_080041A2: - add sp, 0x20 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080041B4: .4byte gWindows - thumb_func_end PutWindowRectTilemap - - thumb_func_start BlitBitmapToWindow -BlitBitmapToWindow: @ 80041B8 - push {r4,r5,lr} - sub sp, 0x18 - ldr r4, [sp, 0x24] - ldr r5, [sp, 0x28] - lsls r0, 24 - lsrs r0, 24 - lsls r2, 16 - lsrs r2, 16 - lsls r3, 16 - lsrs r3, 16 - lsls r4, 16 - lsrs r4, 16 - lsls r5, 16 - lsrs r5, 16 - str r4, [sp] - str r5, [sp, 0x4] - str r2, [sp, 0x8] - str r3, [sp, 0xC] - str r4, [sp, 0x10] - str r5, [sp, 0x14] - movs r2, 0 - movs r3, 0 - bl BlitBitmapRectToWindow - add sp, 0x18 - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end BlitBitmapToWindow - - thumb_func_start BlitBitmapRectToWindow -BlitBitmapRectToWindow: @ 80041F0 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x24 - ldr r4, [sp, 0x44] - ldr r5, [sp, 0x48] - ldr r6, [sp, 0x4C] - mov r8, r6 - ldr r6, [sp, 0x50] - mov r9, r6 - ldr r6, [sp, 0x54] - mov r10, r6 - ldr r6, [sp, 0x58] - mov r12, r6 - lsls r0, 24 - lsrs r0, 24 - lsls r2, 16 - lsrs r2, 16 - lsls r3, 16 - lsrs r3, 16 - lsls r4, 16 - mov r6, r8 - lsls r6, 16 - lsrs r6, 16 - mov r8, r6 - mov r6, r9 - lsls r6, 16 - lsrs r6, 16 - mov r9, r6 - mov r6, r10 - lsls r6, 16 - lsrs r6, 16 - mov r10, r6 - mov r6, r12 - lsls r6, 16 - lsrs r6, 16 - mov r12, r6 - str r1, [sp, 0x14] - ldr r7, _080042A4 @ =0xffff0000 - lsls r5, 16 - ldr r6, _080042A8 @ =0x0000ffff - lsrs r4, 16 - orrs r4, r5 - str r4, [sp, 0x18] - ldr r1, _080042AC @ =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, 0x1C] - adds r5, r1 - ldrb r0, [r5, 0x3] - lsls r0, 3 - add r1, sp, 0x1C - ldr r4, [r1, 0x4] - 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 r0, r10 - str r0, [sp, 0x8] - mov r6, r12 - str r6, [sp, 0xC] - movs r0, 0 - str r0, [sp, 0x10] - add r0, sp, 0x14 - bl BlitBitmapRect4Bit - add sp, 0x24 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080042A4: .4byte 0xffff0000 -_080042A8: .4byte 0x0000ffff -_080042AC: .4byte gWindows - thumb_func_end BlitBitmapRectToWindow - - thumb_func_start BlitBitmapRectToWindowWithColorKey -BlitBitmapRectToWindowWithColorKey: @ 80042B0 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x28 - ldr r4, [sp, 0x48] - ldr r5, [sp, 0x4C] - ldr r6, [sp, 0x50] - mov r8, r6 - ldr r7, [sp, 0x54] - mov r9, r7 - ldr r6, [sp, 0x58] - mov r10, r6 - ldr r7, [sp, 0x5C] - mov r12, r7 - ldr r6, [sp, 0x60] - 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, 0x24] - str r1, [sp, 0x14] - lsls r5, 16 - ldr r6, _0800436C @ =0x0000ffff - lsrs r4, 16 - orrs r4, r5 - str r4, [sp, 0x18] - ldr r1, _08004370 @ =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, 0x1C] - adds r5, r1 - ldrb r0, [r5, 0x3] - lsls r0, 3 - add r1, sp, 0x1C - ldr r4, [r1, 0x4] - ldr r7, _08004374 @ =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] - ldr r6, [sp, 0x24] - str r6, [sp, 0x10] - add r0, sp, 0x14 - bl BlitBitmapRect4Bit - add sp, 0x28 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0800436C: .4byte 0x0000ffff -_08004370: .4byte gWindows -_08004374: .4byte 0xffff0000 - thumb_func_end BlitBitmapRectToWindowWithColorKey - - thumb_func_start FillWindowPixelRect -FillWindowPixelRect: @ 8004378 - 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, _080043F8 @ =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, _080043FC @ =0xffff0000 - ldr r5, [sp, 0xC] - ands r5, r6 - orrs r5, r0 - str r5, [sp, 0xC] - ldrb r4, [r4, 0x4] - lsls r4, 19 - ldr r0, _08004400 @ =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 FillBitmapRect4Bit - add sp, 0x10 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080043F8: .4byte gWindows -_080043FC: .4byte 0xffff0000 -_08004400: .4byte 0x0000ffff - thumb_func_end FillWindowPixelRect - - thumb_func_start CopyToWindowPixelBuffer -CopyToWindowPixelBuffer: @ 8004404 - push {r4-r6,lr} - adds r6, r1, 0 - lsls r0, 24 - lsrs r4, r0, 24 - lsls r5, r2, 16 - lsls r3, 16 - lsrs r2, r3, 16 - cmp r5, 0 - beq _08004438 - ldr r1, _08004434 @ =gWindows - lsls r0, r4, 1 - adds r0, r4 - lsls r0, 2 - adds r1, 0x8 - adds r0, r1 - lsls r2, 5 - ldr r1, [r0] - adds r1, r2 - lsrs r2, r5, 17 - adds r0, r6, 0 - bl CpuSet - b _08004450 - .align 2, 0 -_08004434: .4byte gWindows -_08004438: - ldr r1, _08004458 @ =gWindows - lsls r0, r4, 1 - adds r0, r4 - lsls r0, 2 - adds r1, 0x8 - adds r0, r1 - lsls r2, 5 - ldr r1, [r0] - adds r1, r2 - adds r0, r6, 0 - bl LZ77UnCompWram -_08004450: - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08004458: .4byte gWindows - thumb_func_end CopyToWindowPixelBuffer - - thumb_func_start FillWindowPixelBuffer -FillWindowPixelBuffer: @ 800445C - push {r4,r5,lr} - sub sp, 0x4 - lsls r0, 24 - lsrs r0, 24 - lsls r1, 24 - lsrs r1, 24 - ldr r5, _080044A4 @ =gWindows - lsls r4, r0, 1 - adds r4, r0 - lsls r4, 2 - adds r0, r4, r5 - ldrb r2, [r0, 0x3] - ldrb r0, [r0, 0x4] - muls r2, r0 - lsls r0, r1, 24 - lsls r3, r1, 16 - orrs r0, r3 - lsls r3, r1, 8 - orrs r0, r3 - orrs r0, r1 - str r0, [sp] - adds r5, 0x8 - adds r4, r5 - ldr r1, [r4] - lsls r2, 3 - movs r0, 0x80 - lsls r0, 17 - orrs r2, r0 - mov r0, sp - bl CpuFastSet - add sp, 0x4 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080044A4: .4byte gWindows - thumb_func_end FillWindowPixelBuffer - - thumb_func_start ScrollWindow -ScrollWindow: @ 80044A8 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x8 - lsls r0, 24 - lsrs r0, 24 - lsls r1, 24 - lsrs r1, 24 - mov r8, r1 - lsls r2, 24 - lsrs r2, 24 - str r2, [sp] - lsls r3, 24 - lsrs r3, 24 - ldr r2, _08004544 @ =gWindows - lsls r1, r0, 1 - adds r1, r0 - lsls r1, 2 - adds r4, r1, r2 - adds r2, 0x8 - adds r1, r2 - ldr r5, [r1] - lsls r7, r3, 24 - lsls r0, r3, 16 - orrs r7, r0 - lsls r0, r3, 8 - orrs r7, r0 - orrs r7, r3 - ldr r1, [r4] - ldr r2, [r4, 0x4] - ldrb r3, [r4, 0x4] - lsrs r0, r1, 24 - muls r0, r3 - lsls r6, r0, 5 - lsrs r1, 24 - mov r12, r1 - mov r0, r8 - cmp r0, 0x1 - bne _080044FC - b _080046B2 -_080044FC: - cmp r0, 0x1 - ble _08004502 - b _0800485A -_08004502: - cmp r0, 0 - beq _08004508 - b _0800485A -_08004508: - movs r4, 0 - cmp r4, r6 - blt _08004510 - b _0800485A -_08004510: - movs r1, 0x8 - negs r1, r1 - mov r9, r1 - movs r2, 0x7 - mov r8, r2 - mov r10, r5 -_0800451C: - ldr r3, [sp] - adds r0, r3, 0 - mov r1, r9 - ands r0, r1 - mov r1, r12 - muls r1, r0 - adds r0, r3, 0 - mov r2, r8 - ands r0, r2 - orrs r1, r0 - lsls r1, 2 - adds r1, r4, r1 - cmp r1, r6 - bge _08004548 - adds r0, r5, r1 - ldr r0, [r0] - mov r1, r10 - str r0, [r1] - b _0800454C - .align 2, 0 -_08004544: .4byte gWindows -_08004548: - mov r2, r10 - str r7, [r2] -_0800454C: - adds r3, 0x1 - adds r2, r4, 0x4 - adds r0, r3, 0 - mov r1, r9 - ands r0, r1 - mov r1, r12 - muls r1, r0 - str r1, [sp, 0x4] - adds r0, r3, 0 - mov r1, r8 - ands r0, r1 - ldr r1, [sp, 0x4] - orrs r1, r0 - lsls r1, 2 - adds r1, r4, r1 - cmp r1, r6 - bge _08004578 - adds r0, r5, r2 - adds r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _0800457C -_08004578: - adds r0, r5, r2 - str r7, [r0] -_0800457C: - adds r3, 0x1 - adds r2, r4, 0 - adds r2, 0x8 - adds r0, r3, 0 - mov r1, r9 - ands r0, r1 - mov r1, r12 - muls r1, r0 - str r1, [sp, 0x4] - adds r0, r3, 0 - mov r1, r8 - ands r0, r1 - ldr r1, [sp, 0x4] - orrs r1, r0 - lsls r1, 2 - adds r1, r4, r1 - cmp r1, r6 - bge _080045AA - adds r0, r5, r2 - adds r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _080045AE -_080045AA: - adds r0, r5, r2 - str r7, [r0] -_080045AE: - adds r3, 0x1 - adds r2, r4, 0 - adds r2, 0xC - adds r0, r3, 0 - mov r1, r9 - ands r0, r1 - mov r1, r12 - muls r1, r0 - str r1, [sp, 0x4] - adds r0, r3, 0 - mov r1, r8 - ands r0, r1 - ldr r1, [sp, 0x4] - orrs r1, r0 - lsls r1, 2 - adds r1, r4, r1 - cmp r1, r6 - bge _080045DC - adds r0, r5, r2 - adds r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _080045E0 -_080045DC: - adds r0, r5, r2 - str r7, [r0] -_080045E0: - adds r3, 0x1 - adds r2, r4, 0 - adds r2, 0x10 - adds r0, r3, 0 - mov r1, r9 - ands r0, r1 - mov r1, r12 - muls r1, r0 - str r1, [sp, 0x4] - adds r0, r3, 0 - mov r1, r8 - ands r0, r1 - ldr r1, [sp, 0x4] - orrs r1, r0 - lsls r1, 2 - adds r1, r4, r1 - cmp r1, r6 - bge _0800460E - adds r0, r5, r2 - adds r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _08004612 -_0800460E: - adds r0, r5, r2 - str r7, [r0] -_08004612: - adds r3, 0x1 - adds r2, r4, 0 - adds r2, 0x14 - adds r0, r3, 0 - mov r1, r9 - ands r0, r1 - mov r1, r12 - muls r1, r0 - str r1, [sp, 0x4] - adds r0, r3, 0 - mov r1, r8 - ands r0, r1 - ldr r1, [sp, 0x4] - orrs r1, r0 - lsls r1, 2 - adds r1, r4, r1 - cmp r1, r6 - bge _08004640 - adds r0, r5, r2 - adds r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _08004644 -_08004640: - adds r0, r5, r2 - str r7, [r0] -_08004644: - adds r3, 0x1 - adds r2, r4, 0 - adds r2, 0x18 - adds r0, r3, 0 - mov r1, r9 - ands r0, r1 - mov r1, r12 - muls r1, r0 - str r1, [sp, 0x4] - adds r0, r3, 0 - mov r1, r8 - ands r0, r1 - ldr r1, [sp, 0x4] - orrs r1, r0 - lsls r1, 2 - adds r1, r4, r1 - cmp r1, r6 - bge _08004672 - adds r0, r5, r2 - adds r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _08004676 -_08004672: - adds r0, r5, r2 - str r7, [r0] -_08004676: - adds r3, 0x1 - adds r2, r4, 0 - adds r2, 0x1C - adds r0, r3, 0 - mov r1, r9 - ands r0, r1 - mov r1, r12 - muls r1, r0 - adds r0, r1, 0 - mov r1, r8 - ands r3, r1 - orrs r0, r3 - lsls r0, 2 - adds r1, r4, r0 - cmp r1, r6 - bge _080046A0 - adds r0, r5, r2 - adds r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _080046A4 -_080046A0: - adds r0, r5, r2 - str r7, [r0] -_080046A4: - movs r2, 0x20 - add r10, r2 - adds r4, 0x20 - cmp r4, r6 - bge _080046B0 - b _0800451C -_080046B0: - b _0800485A -_080046B2: - subs r0, r6, 0x4 - adds r5, r0 - movs r4, 0 - cmp r4, r6 - blt _080046BE - b _0800485A -_080046BE: - movs r0, 0x8 - negs r0, r0 - mov r9, r0 - movs r1, 0x7 - mov r8, r1 - mov r10, r5 -_080046CA: - ldr r3, [sp] - adds r0, r3, 0 - mov r2, r9 - ands r0, r2 - mov r1, r12 - muls r1, r0 - adds r0, r3, 0 - mov r2, r8 - ands r0, r2 - orrs r1, r0 - lsls r1, 2 - adds r1, r4, r1 - cmp r1, r6 - bge _080046F0 - subs r0, r5, r1 - ldr r0, [r0] - mov r1, r10 - str r0, [r1] - b _080046F4 -_080046F0: - mov r2, r10 - str r7, [r2] -_080046F4: - adds r3, 0x1 - adds r2, r4, 0x4 - adds r0, r3, 0 - mov r1, r9 - ands r0, r1 - mov r1, r12 - muls r1, r0 - str r1, [sp, 0x4] - adds r0, r3, 0 - mov r1, r8 - ands r0, r1 - ldr r1, [sp, 0x4] - orrs r1, r0 - lsls r1, 2 - adds r1, r4, r1 - cmp r1, r6 - bge _08004720 - subs r0, r5, r2 - subs r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _08004724 -_08004720: - subs r0, r5, r2 - str r7, [r0] -_08004724: - adds r3, 0x1 - adds r2, r4, 0 - adds r2, 0x8 - adds r0, r3, 0 - mov r1, r9 - ands r0, r1 - mov r1, r12 - muls r1, r0 - str r1, [sp, 0x4] - adds r0, r3, 0 - mov r1, r8 - ands r0, r1 - ldr r1, [sp, 0x4] - orrs r1, r0 - lsls r1, 2 - adds r1, r4, r1 - cmp r1, r6 - bge _08004752 - subs r0, r5, r2 - subs r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _08004756 -_08004752: - subs r0, r5, r2 - str r7, [r0] -_08004756: - adds r3, 0x1 - adds r2, r4, 0 - adds r2, 0xC - adds r0, r3, 0 - mov r1, r9 - ands r0, r1 - mov r1, r12 - muls r1, r0 - str r1, [sp, 0x4] - adds r0, r3, 0 - mov r1, r8 - ands r0, r1 - ldr r1, [sp, 0x4] - orrs r1, r0 - lsls r1, 2 - adds r1, r4, r1 - cmp r1, r6 - bge _08004784 - subs r0, r5, r2 - subs r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _08004788 -_08004784: - subs r0, r5, r2 - str r7, [r0] -_08004788: - adds r3, 0x1 - adds r2, r4, 0 - adds r2, 0x10 - adds r0, r3, 0 - mov r1, r9 - ands r0, r1 - mov r1, r12 - muls r1, r0 - str r1, [sp, 0x4] - adds r0, r3, 0 - mov r1, r8 - ands r0, r1 - ldr r1, [sp, 0x4] - orrs r1, r0 - lsls r1, 2 - adds r1, r4, r1 - cmp r1, r6 - bge _080047B6 - subs r0, r5, r2 - subs r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _080047BA -_080047B6: - subs r0, r5, r2 - str r7, [r0] -_080047BA: - adds r3, 0x1 - adds r2, r4, 0 - adds r2, 0x14 - adds r0, r3, 0 - mov r1, r9 - ands r0, r1 - mov r1, r12 - muls r1, r0 - str r1, [sp, 0x4] - adds r0, r3, 0 - mov r1, r8 - ands r0, r1 - ldr r1, [sp, 0x4] - orrs r1, r0 - lsls r1, 2 - adds r1, r4, r1 - cmp r1, r6 - bge _080047E8 - subs r0, r5, r2 - subs r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _080047EC -_080047E8: - subs r0, r5, r2 - str r7, [r0] -_080047EC: - adds r3, 0x1 - adds r2, r4, 0 - adds r2, 0x18 - adds r0, r3, 0 - mov r1, r9 - ands r0, r1 - mov r1, r12 - muls r1, r0 - str r1, [sp, 0x4] - adds r0, r3, 0 - mov r1, r8 - ands r0, r1 - ldr r1, [sp, 0x4] - orrs r1, r0 - lsls r1, 2 - adds r1, r4, r1 - cmp r1, r6 - bge _0800481A - subs r0, r5, r2 - subs r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _0800481E -_0800481A: - subs r0, r5, r2 - str r7, [r0] -_0800481E: - adds r3, 0x1 - adds r2, r4, 0 - adds r2, 0x1C - adds r0, r3, 0 - mov r1, r9 - ands r0, r1 - mov r1, r12 - muls r1, r0 - adds r0, r1, 0 - mov r1, r8 - ands r3, r1 - orrs r0, r3 - lsls r0, 2 - adds r1, r4, r0 - cmp r1, r6 - bge _08004848 - subs r0, r5, r2 - subs r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _0800484C -_08004848: - subs r0, r5, r2 - str r7, [r0] -_0800484C: - movs r2, 0x20 - negs r2, r2 - add r10, r2 - adds r4, 0x20 - cmp r4, r6 - bge _0800485A - b _080046CA -_0800485A: - add sp, 0x8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end ScrollWindow - - thumb_func_start CallWindowFunction -CallWindowFunction: @ 800486C - push {r4-r6,lr} - mov r6, r8 - push {r6} - sub sp, 0x8 - mov r8, r1 - lsls r0, 24 - lsrs r0, 24 - ldr r2, _080048B8 @ =gWindows - lsls r1, r0, 1 - adds r1, r0 - lsls r1, 2 - adds r1, r2 - ldr r5, [r1] - ldr r6, [r1, 0x4] - ldrb r0, [r1] - lsrs r1, r5, 8 - lsls r1, 24 - lsrs r1, 24 - lsrs r2, r5, 16 - lsls r2, 24 - lsrs r2, 24 - lsrs r3, r5, 24 - lsls r4, r6, 24 - lsrs r4, 24 - str r4, [sp] - lsrs r4, r6, 8 - lsls r4, 24 - lsrs r4, 24 - str r4, [sp, 0x4] - bl _call_via_r8 - add sp, 0x8 - pop {r3} - mov r8, r3 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080048B8: .4byte gWindows - thumb_func_end CallWindowFunction - - thumb_func_start sub_80048BC -sub_80048BC: @ 80048BC - push {lr} - lsls r0, 24 - lsrs r3, r0, 24 - lsls r1, 24 - lsrs r0, r1, 24 - cmp r0, 0x7 - bhi _08004948 - lsls r0, 2 - ldr r1, _080048D4 @ =_080048D8 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_080048D4: .4byte _080048D8 - .align 2, 0 -_080048D8: - .4byte _08004948 - .4byte _080048F8 - .4byte _0800490C - .4byte _08004948 - .4byte _08004948 - .4byte _08004920 - .4byte _08004934 - .4byte _08004948 -_080048F8: - ldr r1, _08004908 @ =gWindows - lsls r0, r3, 1 - adds r0, r3 - lsls r0, 2 - adds r0, r1 - strb r2, [r0, 0x1] - movs r0, 0 - b _0800494A - .align 2, 0 -_08004908: .4byte gWindows -_0800490C: - ldr r1, _0800491C @ =gWindows - lsls r0, r3, 1 - adds r0, r3 - lsls r0, 2 - adds r0, r1 - strb r2, [r0, 0x2] - movs r0, 0 - b _0800494A - .align 2, 0 -_0800491C: .4byte gWindows -_08004920: - ldr r1, _08004930 @ =gWindows - lsls r0, r3, 1 - adds r0, r3 - lsls r0, 2 - adds r0, r1 - strb r2, [r0, 0x5] - movs r0, 0 - b _0800494A - .align 2, 0 -_08004930: .4byte gWindows -_08004934: - ldr r1, _08004944 @ =gWindows - lsls r0, r3, 1 - adds r0, r3 - lsls r0, 2 - adds r0, r1 - strh r2, [r0, 0x6] - movs r0, 0 - b _0800494A - .align 2, 0 -_08004944: .4byte gWindows -_08004948: - movs r0, 0x1 -_0800494A: - pop {r1} - bx r1 - thumb_func_end sub_80048BC - - thumb_func_start GetWindowAttribute -GetWindowAttribute: @ 8004950 - push {lr} - lsls r0, 24 - lsrs r2, r0, 24 - lsls r1, 24 - lsrs r0, r1, 24 - cmp r0, 0x7 - bhi _08004A2C - lsls r0, 2 - ldr r1, _08004968 @ =_0800496C - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_08004968: .4byte _0800496C - .align 2, 0 -_0800496C: - .4byte _0800498C - .4byte _080049A0 - .4byte _080049B4 - .4byte _080049C8 - .4byte _080049DC - .4byte _080049F0 - .4byte _08004A04 - .4byte _08004A18 -_0800498C: - ldr r0, _0800499C @ =gWindows - lsls r1, r2, 1 - adds r1, r2 - lsls r1, 2 - adds r1, r0 - ldrb r0, [r1] - b _08004A2E - .align 2, 0 -_0800499C: .4byte gWindows -_080049A0: - ldr r0, _080049B0 @ =gWindows - lsls r1, r2, 1 - adds r1, r2 - lsls r1, 2 - adds r1, r0 - ldrb r0, [r1, 0x1] - b _08004A2E - .align 2, 0 -_080049B0: .4byte gWindows -_080049B4: - ldr r0, _080049C4 @ =gWindows - lsls r1, r2, 1 - adds r1, r2 - lsls r1, 2 - adds r1, r0 - ldrb r0, [r1, 0x2] - b _08004A2E - .align 2, 0 -_080049C4: .4byte gWindows -_080049C8: - ldr r0, _080049D8 @ =gWindows - lsls r1, r2, 1 - adds r1, r2 - lsls r1, 2 - adds r1, r0 - ldrb r0, [r1, 0x3] - b _08004A2E - .align 2, 0 -_080049D8: .4byte gWindows -_080049DC: - ldr r0, _080049EC @ =gWindows - lsls r1, r2, 1 - adds r1, r2 - lsls r1, 2 - adds r1, r0 - ldrb r0, [r1, 0x4] - b _08004A2E - .align 2, 0 -_080049EC: .4byte gWindows -_080049F0: - ldr r0, _08004A00 @ =gWindows - lsls r1, r2, 1 - adds r1, r2 - lsls r1, 2 - adds r1, r0 - ldrb r0, [r1, 0x5] - b _08004A2E - .align 2, 0 -_08004A00: .4byte gWindows -_08004A04: - ldr r0, _08004A14 @ =gWindows - lsls r1, r2, 1 - adds r1, r2 - lsls r1, 2 - adds r1, r0 - ldrh r0, [r1, 0x6] - b _08004A2E - .align 2, 0 -_08004A14: .4byte gWindows -_08004A18: - ldr r0, _08004A28 @ =gWindows - lsls r1, r2, 1 - adds r1, r2 - lsls r1, 2 - adds r0, 0x8 - adds r1, r0 - ldr r0, [r1] - b _08004A2E - .align 2, 0 -_08004A28: .4byte gWindows -_08004A2C: - movs r0, 0 -_08004A2E: - pop {r1} - bx r1 - thumb_func_end GetWindowAttribute - - thumb_func_start GetNumActiveWindowsOnBg -GetNumActiveWindowsOnBg: @ 8004A34 - push {r4,lr} - lsls r0, 24 - lsrs r4, r0, 24 - movs r3, 0 - ldr r2, _08004A5C @ =gWindows - movs r1, 0x1F -_08004A40: - ldrb r0, [r2] - cmp r0, r4 - bne _08004A4C - adds r0, r3, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 -_08004A4C: - adds r2, 0xC - subs r1, 0x1 - cmp r1, 0 - bge _08004A40 - adds r0, r3, 0 - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_08004A5C: .4byte gWindows - thumb_func_end GetNumActiveWindowsOnBg - - .align 2, 0 @ Don't pad with nop. diff --git a/asm/window_8bpp.s b/asm/window_8bpp.s index 9c2ed93ae..cb16c72e8 100644 --- a/asm/window_8bpp.s +++ b/asm/window_8bpp.s @@ -41,7 +41,7 @@ _08005066: beq _080050FA mov r0, r9 ldrb r7, [r0] - ldr r1, _08005104 @ =gUnknown_3003E40 + ldr r1, _08005104 @ =gWindowBgTilemapBuffers mov r10, r1 lsls r2, r7, 2 mov r8, r2 @@ -98,7 +98,7 @@ _080050C2: lsls r0, 24 cmp r0, 0 bne _080050FA - ldr r0, _08005104 @ =gUnknown_3003E40 + ldr r0, _08005104 @ =gWindowBgTilemapBuffers lsls r1, r7, 2 adds r5, r1, r0 ldr r1, [r5] @@ -113,7 +113,7 @@ _080050FA: b _0800512E .align 2, 0 _08005100: .4byte gWindows -_08005104: .4byte gUnknown_3003E40 +_08005104: .4byte gWindowBgTilemapBuffers _08005108: .4byte 0x0000ffff _0800510C: .4byte nullsub_7 _08005110: diff --git a/data/data.s b/data/data.s index 12eedb8d0..24528437f 100644 --- a/data/data.s +++ b/data/data.s @@ -1,8 +1,5 @@ .section .rodata -gUnknown_81EA144:: @ 81EA144 - .incbin "baserom.gba", 0x1EA144, 0x8 - gUnknown_81EA14C:: @ 81EA14C .incbin "baserom.gba", 0x1EA14C, 0x100 diff --git a/include/gba/macro.h b/include/gba/macro.h index a0edf2a49..462d3589d 100644 --- a/include/gba/macro.h +++ b/include/gba/macro.h @@ -27,6 +27,8 @@ #define CpuFastFill16(value, dest, size) CpuFastFill(((value) << 16) | (value), (dest), (size)) +#define CpuFastFill8(value, dest, size) CpuFastFill(((value) << 24) | ((value) << 16) | ((value) << 8) | (value), (dest), (size)) + #define CpuFastCopy(src, dest, size) CpuFastSet(src, dest, ((size)/(32/8) & 0x1FFFFF)) #define DmaSet(dmaNum, src, dest, control) \ diff --git a/ld_script.txt b/ld_script.txt index 1877cf472..47d9a2388 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -89,7 +89,7 @@ SECTIONS { src/malloc.o(.text); src/text_printer.o(.text); asm/text_printer.o(.text); - asm/window.o(.text); + src/window.o(.text); asm/blit.o(.text); asm/window_8bpp.o(.text); asm/text.o(.text); @@ -396,6 +396,7 @@ SECTIONS { src/bg.o(.rodata); src/malloc.o(.rodata); src/text_printer.o(.rodata); + src/window.o(.rodata); data/data.o(.rodata); src/m4a_tables.o(.rodata); data/sound_data.o(.rodata); diff --git a/src/window.c b/src/window.c new file mode 100644 index 000000000..7666fc91f --- /dev/null +++ b/src/window.c @@ -0,0 +1,1152 @@ +#include "global.h" +#include "window.h" +#include "malloc.h" + +extern u8 gWindowClearTile; +extern void* gWindowBgTilemapBuffers[]; +extern u32 gUnneededFireRedVariable; + +#define WINDOWS_MAX 32 + +EWRAM_DATA struct Window gWindows[WINDOWS_MAX] = {0}; + +extern void* GetBgTilemapBuffer(u8 bg); +extern int DummiedOutFireRedLeafGreenTileAllocFunc(int, int, int, int); +extern u16 GetBgAttribute(u8 bg, u8 attributeId); +extern void SetBgTilemapBuffer(u8 bg, void *tilemap); +extern void CopyBgTilemapBufferToVram(u8 bg); +extern u8 LoadBgTiles(u8 bg, void *src, u16 size, u16 destOffset); +extern void WriteSequenceToBgTilemapBuffer(u8 bg, u16 firstTileNum, u8 x, u8 y, u8 width, u8 height, u8 paletteSlot, u16 tileNumDelta); +extern void FillBgTilemapBufferRect(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height, u8 palette); +extern void BlitBitmapRect4Bit(struct Bitmap *src, struct Bitmap *dest, u16 srcX, u16 srcY, u16 destX, u16 destY, u16 width, u16 height, u8 colorKey); +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 FillBitmapRect4Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue); +extern void FillBitmapRect8Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue); + +static u8 GetNumActiveWindowsOnBg(u8 bgId); + +static const struct WindowTemplate sDummyWindowTemplate = {0xFF, 0, 0, 0, 0, 0, 0}; + +static void nullsub_8(void) +{ + +} + +bool16 InitWindows(const struct WindowTemplate *templates) +{ + int i; + void *bgTilemapBuffer; + int j; + u8 bgLayer; + u16 attrib; + u8* allocatedTilemapBuffer; + int allocatedBaseBlock; + + for (i = 0; i < 0x4; ++i) + { + bgTilemapBuffer = GetBgTilemapBuffer(i); + if (bgTilemapBuffer != NULL) + gWindowBgTilemapBuffers[i] = nullsub_8; + else + gWindowBgTilemapBuffers[i] = bgTilemapBuffer; + } + + for (i = 0; i < 0x20; ++i) + { + gWindows[i].window = sDummyWindowTemplate; + gWindows[i].tileData = NULL; + } + + for (i = 0, allocatedBaseBlock = 0, bgLayer = templates[i].priority; bgLayer != 0xFF && i < 0x20; ++i, bgLayer = templates[i].priority) + { + if (gUnneededFireRedVariable == 1) + { + allocatedBaseBlock = DummiedOutFireRedLeafGreenTileAllocFunc(bgLayer, 0, templates[i].width * templates[i].height, 0); + if (allocatedBaseBlock == -1) + return FALSE; + } + + if (gWindowBgTilemapBuffers[bgLayer] == NULL) + { + attrib = GetBgAttribute(bgLayer, 0x8); + + if (attrib != 0xFFFF) + { + allocatedTilemapBuffer = Alloc(attrib); + + if (allocatedTilemapBuffer == NULL) + { + FreeAllWindowBuffers(); + return FALSE; + } + + for (j = 0; j < attrib; ++j) + allocatedTilemapBuffer[j] = 0; + + gWindowBgTilemapBuffers[bgLayer] = allocatedTilemapBuffer; + SetBgTilemapBuffer(bgLayer, allocatedTilemapBuffer); + } + } + + allocatedTilemapBuffer = Alloc((u16)(0x20 * (templates[i].width * templates[i].height))); + + if (allocatedTilemapBuffer == NULL) + { + if ((GetNumActiveWindowsOnBg(bgLayer) == 0) && (gWindowBgTilemapBuffers[bgLayer] != nullsub_8)) + { + Free(gWindowBgTilemapBuffers[bgLayer]); + gWindowBgTilemapBuffers[bgLayer] = allocatedTilemapBuffer; + } + + return FALSE; + } + + gWindows[i].tileData = allocatedTilemapBuffer; + gWindows[i].window = templates[i]; + + if (gUnneededFireRedVariable == 1) + { + gWindows[i].window.baseBlock = allocatedBaseBlock; + DummiedOutFireRedLeafGreenTileAllocFunc(bgLayer, allocatedBaseBlock, templates[i].width * templates[i].height, 1); + } + } + + gWindowClearTile = 0; + return TRUE; +} + +u16 AddWindow(const struct WindowTemplate *template) +{ + u16 win; + u8 bgLayer; + int allocatedBaseBlock; + u16 attrib; + u8 *allocatedTilemapBuffer; + int i; + + for (win = 0; win < 0x20; ++win) + { + if ((bgLayer = gWindows[win].window.priority) == 0xFF) + break; + } + + if (win == 0x20) + return 0xFF; + + bgLayer = template->priority; + allocatedBaseBlock = 0; + + if (gUnneededFireRedVariable == 1) + { + allocatedBaseBlock = DummiedOutFireRedLeafGreenTileAllocFunc(bgLayer, 0, template->width * template->height, 0); + + if (allocatedBaseBlock == -1) + return 0xFF; + } + + if (gWindowBgTilemapBuffers[bgLayer] == NULL) + { + attrib = GetBgAttribute(bgLayer, 0x8); + + if (attrib != 0xFFFF) + { + allocatedTilemapBuffer = Alloc(attrib); + + if (allocatedTilemapBuffer == NULL) + return 0xFF; + + for (i = 0; i < attrib; ++i) + allocatedTilemapBuffer[i] = 0; + + gWindowBgTilemapBuffers[bgLayer] = allocatedTilemapBuffer; + SetBgTilemapBuffer(bgLayer, allocatedTilemapBuffer); + } + } + + allocatedTilemapBuffer = Alloc((u16)(0x20 * (template->width * template->height))); + + if (allocatedTilemapBuffer == NULL) + { + if ((GetNumActiveWindowsOnBg(bgLayer) == 0) && (gWindowBgTilemapBuffers[bgLayer] != nullsub_8)) + { + Free(gWindowBgTilemapBuffers[bgLayer]); + gWindowBgTilemapBuffers[bgLayer] = allocatedTilemapBuffer; + } + return 0xFF; + } + + gWindows[win].tileData = allocatedTilemapBuffer; + gWindows[win].window = *template; + + if (gUnneededFireRedVariable == 1) + { + gWindows[win].window.baseBlock = allocatedBaseBlock; + DummiedOutFireRedLeafGreenTileAllocFunc(bgLayer, allocatedBaseBlock, gWindows[win].window.width * gWindows[win].window.height, 1); + } + + return win; +} + +void RemoveWindow(u8 windowId) +{ + u8 bgLayer = gWindows[windowId].window.priority; + + if (gUnneededFireRedVariable == 1) + { + DummiedOutFireRedLeafGreenTileAllocFunc(bgLayer, gWindows[windowId].window.baseBlock, gWindows[windowId].window.width * gWindows[windowId].window.height, 2); + } + + gWindows[windowId].window = sDummyWindowTemplate; + + if (GetNumActiveWindowsOnBg(bgLayer) == 0) + { + if (gWindowBgTilemapBuffers[bgLayer] != nullsub_8) + { + Free(gWindowBgTilemapBuffers[bgLayer]); + gWindowBgTilemapBuffers[bgLayer] = 0; + } + } + + if (gWindows[windowId].tileData != NULL) + { + Free(gWindows[windowId].tileData); + gWindows[windowId].tileData = NULL; + } +} + +void FreeAllWindowBuffers(void) +{ + int i; + + for (i = 0; i < 4; ++i) + { + if (gWindowBgTilemapBuffers[i] != NULL && gWindowBgTilemapBuffers[i] != nullsub_8) + { + Free(gWindowBgTilemapBuffers[i]); + gWindowBgTilemapBuffers[i] = NULL; + } + } + + for (i = 0; i < 0x20; ++i) + { + if (gWindows[i].tileData != NULL) + { + Free(gWindows[i].tileData); + gWindows[i].tileData = NULL; + } + } +} + +void CopyWindowToVram(u8 windowId, u8 mode) +{ + struct Window windowLocal = gWindows[windowId]; + u16 windowSize = 32 * (windowLocal.window.width * windowLocal.window.height); + + switch (mode) + { + case 1: + CopyBgTilemapBufferToVram(windowLocal.window.priority); + break; + case 2: + LoadBgTiles(windowLocal.window.priority, windowLocal.tileData, windowSize, windowLocal.window.baseBlock); + break; + case 3: + LoadBgTiles(windowLocal.window.priority, windowLocal.tileData, windowSize, windowLocal.window.baseBlock); + CopyBgTilemapBufferToVram(windowLocal.window.priority); + break; + } +} + +void PutWindowTilemap(u8 windowId) +{ + struct Window windowLocal = gWindows[windowId]; + + WriteSequenceToBgTilemapBuffer( + windowLocal.window.priority, + GetBgAttribute(windowLocal.window.priority, 0xA) + windowLocal.window.baseBlock, + windowLocal.window.tilemapLeft, + windowLocal.window.tilemapTop, + windowLocal.window.width, + windowLocal.window.height, + windowLocal.window.paletteNum, + 1); +} + +void PutWindowRectTilemapOverridePalette(u8 windowId, u8 x, u8 y, u8 width, u8 height, u8 palette) +{ + struct Window windowLocal = gWindows[windowId]; + u16 currentRow = windowLocal.window.baseBlock + (y * windowLocal.window.width) + x + GetBgAttribute(windowLocal.window.priority, 0xA); + int i; + + for (i = 0; i < height; ++i) + { + WriteSequenceToBgTilemapBuffer( + windowLocal.window.priority, + currentRow, + windowLocal.window.tilemapLeft + x, + windowLocal.window.tilemapTop + y + i, + width, + 1, + palette, + 1); + + currentRow += windowLocal.window.width; + } +} + +void ClearWindowTilemap(u8 windowId) +{ + struct Window windowLocal = gWindows[windowId]; + + FillBgTilemapBufferRect( + windowLocal.window.priority, + gWindowClearTile, + windowLocal.window.tilemapLeft, + windowLocal.window.tilemapTop, + windowLocal.window.width, + windowLocal.window.height, + windowLocal.window.paletteNum); +} + +void PutWindowRectTilemap(u8 windowId, u8 x, u8 y, u8 width, u8 height) +{ + struct Window windowLocal = gWindows[windowId]; + u16 currentRow = windowLocal.window.baseBlock + (y * windowLocal.window.width) + x + GetBgAttribute(windowLocal.window.priority, 0xA); + int i; + + for (i = 0; i < height; ++i) + { + WriteSequenceToBgTilemapBuffer( + windowLocal.window.priority, + currentRow, + windowLocal.window.tilemapLeft + x, + windowLocal.window.tilemapTop + y + i, + width, + 1, + windowLocal.window.paletteNum, + 1); + + currentRow += windowLocal.window.width; + } +} + +void BlitBitmapToWindow(u8 windowId, u8 *pixels, u16 x, u16 y, u16 width, u16 height) +{ + BlitBitmapRectToWindow(windowId, pixels, 0, 0, width, height, x, y, width, height); +} + +void BlitBitmapRectToWindow(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight) +{ + 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; + + BlitBitmapRect4Bit(&sourceRect, &destRect, srcX, srcY, destX, destY, rectWidth, rectHeight, 0); +} + +void BlitBitmapRectToWindowWithColorKey(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight, u8 colorKey) +{ + 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; + + BlitBitmapRect4Bit(&sourceRect, &destRect, srcX, srcY, destX, destY, rectWidth, rectHeight, colorKey); +} + +void FillWindowPixelRect(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; + + FillBitmapRect4Bit(&pixelRect, x, y, width, height, fillValue); +} + +void CopyToWindowPixelBuffer(u8 windowId, const u8 *src, u16 size, u16 tileOffset) +{ + if (size != 0) + CpuCopy16(src, gWindows[windowId].tileData + (0x20 * tileOffset), size); + else + LZ77UnCompWram(src, gWindows[windowId].tileData + (0x20 * tileOffset)); +} + +void FillWindowPixelBuffer(u8 windowId, u8 fillValue) +{ + int fillSize = gWindows[windowId].window.width * gWindows[windowId].window.height; + CpuFastFill8(fillValue, gWindows[windowId].tileData, 0x20 * fillSize); +} + +// functionally equivalent, its fucking hard to match +#ifdef NONMATCHING +void ScrollWindow(u8 windowId, u8 direction, u8 distance, u8 fillValue) +{ + s32 i, id1, id2, size; + u32 distanceLoop, toFill, width; + u8 *tileData; + struct WindowTemplate window; + + tileData = gWindows[windowId].tileData; + toFill = (fillValue << 0x18) | (fillValue << 0x10) | (fillValue << 8) | fillValue; + window = gWindows[windowId].window; + size = 0x20 * (window.height * window.width); + width = window.width; + if (direction != 1) + { + s32 signedDirection = direction; + if (signedDirection <= 1) + { + if (signedDirection == 0) + { + for (i = 0; i < size; i += 0x20) + { + distanceLoop = distance; + id1 = i + 0; + id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); + if (id2 < size) + *(u32*)(tileData + id1) = *(u32*)(tileData + id2); + else + *(u32*)(tileData + id1) = toFill; + + distanceLoop++; + id1 = i + 4; + id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); + if (id2 < size) + *(u32*)(tileData + id1) = *(u32*)(tileData + id2); + else + *(u32*)(tileData + id1) = toFill; + + distanceLoop++; + id1 = i + 8; + id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); + if (id2 < size) + *(u32*)(tileData + id1) = *(u32*)(tileData + id2); + else + *(u32*)(tileData + id1) = toFill; + + distanceLoop++; + id1 = i + 12; + id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); + if (id2 < size) + *(u32*)(tileData + id1) = *(u32*)(tileData + id2); + else + *(u32*)(tileData + id1) = toFill; + + distanceLoop++; + id1 = i + 16; + id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); + if (id2 < size) + *(u32*)(tileData + id1) = *(u32*)(tileData + id2); + else + *(u32*)(tileData + id1) = toFill; + + distanceLoop++; + id1 = i + 20; + id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); + if (id2 < size) + *(u32*)(tileData + id1) = *(u32*)(tileData + id2); + else + *(u32*)(tileData + id1) = toFill; + + distanceLoop++; + id1 = i + 24; + id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); + if (id2 < size) + *(u32*)(tileData + id1) = *(u32*)(tileData + id2); + else + *(u32*)(tileData + id1) = toFill; + + distanceLoop++; + id1 = i + 28; + id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); + if (id2 < size) + *(u32*)(tileData + id1) = *(u32*)(tileData + id2); + else + *(u32*)(tileData + id1) = toFill; + } + } + } + } + else + { + tileData += size - 4; + for (i = 0; i < size; i += 0x20) + { + distanceLoop = distance; + id1 = i + 0; + id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); + if (id2 < size) + *(u32*)(tileData - id1) = *(u32*)(tileData - id2); + else + *(u32*)(tileData - id1) = toFill; + + distanceLoop++; + id1 = i + 4; + id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); + if (id2 < size) + *(u32*)(tileData - id1) = *(u32*)(tileData - id2); + else + *(u32*)(tileData - id1) = toFill; + + distanceLoop++; + id1 = i + 8; + id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); + if (id2 < size) + *(u32*)(tileData - id1) = *(u32*)(tileData - id2); + else + *(u32*)(tileData - id1) = toFill; + + distanceLoop++; + id1 = i + 12; + id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); + if (id2 < size) + *(u32*)(tileData - id1) = *(u32*)(tileData - id2); + else + *(u32*)(tileData - id1) = toFill; + + distanceLoop++; + id1 = i + 16; + id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); + if (id2 < size) + *(u32*)(tileData - id1) = *(u32*)(tileData - id2); + else + *(u32*)(tileData - id1) = toFill; + + distanceLoop++; + id1 = i + 20; + id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); + if (id2 < size) + *(u32*)(tileData - id1) = *(u32*)(tileData - id2); + else + *(u32*)(tileData - id1) = toFill; + + distanceLoop++; + id1 = i + 24; + id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); + if (id2 < size) + *(u32*)(tileData - id1) = *(u32*)(tileData - id2); + else + *(u32*)(tileData - id1) = toFill; + + distanceLoop++; + id1 = i + 28; + id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); + if (id2 < size) + *(u32*)(tileData - id1) = *(u32*)(tileData - id2); + else + *(u32*)(tileData - id1) = toFill; + } + } +} +#else +__attribute__((naked)) +void ScrollWindow(u8 windowId, u8 direction, u8 distance, u8 fillValue) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x8\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + mov r8, r1\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + str r2, [sp]\n\ + lsls r3, 24\n\ + lsrs r3, 24\n\ + ldr r2, =gWindows\n\ + lsls r1, r0, 1\n\ + adds r1, r0\n\ + lsls r1, 2\n\ + adds r4, r1, r2\n\ + adds r2, 0x8\n\ + adds r1, r2\n\ + ldr r5, [r1]\n\ + lsls r7, r3, 24\n\ + lsls r0, r3, 16\n\ + orrs r7, r0\n\ + lsls r0, r3, 8\n\ + orrs r7, r0\n\ + orrs r7, r3\n\ + ldr r1, [r4]\n\ + ldr r2, [r4, 0x4]\n\ + ldrb r3, [r4, 0x4]\n\ + lsrs r0, r1, 24\n\ + muls r0, r3\n\ + lsls r6, r0, 5\n\ + lsrs r1, 24\n\ + mov r12, r1\n\ + mov r0, r8\n\ + cmp r0, 0x1\n\ + bne _08003CE8\n\ + b _08003E9E\n\ +_08003CE8:\n\ + cmp r0, 0x1\n\ + ble _08003CEE\n\ + b _08004046\n\ +_08003CEE:\n\ + cmp r0, 0\n\ + beq _08003CF4\n\ + b _08004046\n\ +_08003CF4:\n\ + movs r4, 0\n\ + cmp r4, r6\n\ + blt _08003CFC\n\ + b _08004046\n\ +_08003CFC:\n\ + movs r1, 0x8\n\ + negs r1, r1\n\ + mov r9, r1\n\ + movs r2, 0x7\n\ + mov r8, r2\n\ + mov r10, r5\n\ +_08003D08:\n\ + ldr r3, [sp]\n\ + adds r0, r3, 0\n\ + mov r1, r9\n\ + ands r0, r1\n\ + mov r1, r12\n\ + muls r1, r0\n\ + adds r0, r3, 0\n\ + mov r2, r8\n\ + ands r0, r2\n\ + orrs r1, r0\n\ + lsls r1, 2\n\ + adds r1, r4, r1\n\ + cmp r1, r6\n\ + bge _08003D34\n\ + adds r0, r5, r1\n\ + ldr r0, [r0]\n\ + mov r1, r10\n\ + str r0, [r1]\n\ + b _08003D38\n\ + .pool\n\ +_08003D34:\n\ + mov r2, r10\n\ + str r7, [r2]\n\ +_08003D38:\n\ + adds r3, 0x1\n\ + adds r2, r4, 0x4\n\ + adds r0, r3, 0\n\ + mov r1, r9\n\ + ands r0, r1\n\ + mov r1, r12\n\ + muls r1, r0\n\ + str r1, [sp, 0x4]\n\ + adds r0, r3, 0\n\ + mov r1, r8\n\ + ands r0, r1\n\ + ldr r1, [sp, 0x4]\n\ + orrs r1, r0\n\ + lsls r1, 2\n\ + adds r1, r4, r1\n\ + cmp r1, r6\n\ + bge _08003D64\n\ + adds r0, r5, r2\n\ + adds r1, r5, r1\n\ + ldr r1, [r1]\n\ + str r1, [r0]\n\ + b _08003D68\n\ +_08003D64:\n\ + adds r0, r5, r2\n\ + str r7, [r0]\n\ +_08003D68:\n\ + adds r3, 0x1\n\ + adds r2, r4, 0\n\ + adds r2, 0x8\n\ + adds r0, r3, 0\n\ + mov r1, r9\n\ + ands r0, r1\n\ + mov r1, r12\n\ + muls r1, r0\n\ + str r1, [sp, 0x4]\n\ + adds r0, r3, 0\n\ + mov r1, r8\n\ + ands r0, r1\n\ + ldr r1, [sp, 0x4]\n\ + orrs r1, r0\n\ + lsls r1, 2\n\ + adds r1, r4, r1\n\ + cmp r1, r6\n\ + bge _08003D96\n\ + adds r0, r5, r2\n\ + adds r1, r5, r1\n\ + ldr r1, [r1]\n\ + str r1, [r0]\n\ + b _08003D9A\n\ +_08003D96:\n\ + adds r0, r5, r2\n\ + str r7, [r0]\n\ +_08003D9A:\n\ + adds r3, 0x1\n\ + adds r2, r4, 0\n\ + adds r2, 0xC\n\ + adds r0, r3, 0\n\ + mov r1, r9\n\ + ands r0, r1\n\ + mov r1, r12\n\ + muls r1, r0\n\ + str r1, [sp, 0x4]\n\ + adds r0, r3, 0\n\ + mov r1, r8\n\ + ands r0, r1\n\ + ldr r1, [sp, 0x4]\n\ + orrs r1, r0\n\ + lsls r1, 2\n\ + adds r1, r4, r1\n\ + cmp r1, r6\n\ + bge _08003DC8\n\ + adds r0, r5, r2\n\ + adds r1, r5, r1\n\ + ldr r1, [r1]\n\ + str r1, [r0]\n\ + b _08003DCC\n\ +_08003DC8:\n\ + adds r0, r5, r2\n\ + str r7, [r0]\n\ +_08003DCC:\n\ + adds r3, 0x1\n\ + adds r2, r4, 0\n\ + adds r2, 0x10\n\ + adds r0, r3, 0\n\ + mov r1, r9\n\ + ands r0, r1\n\ + mov r1, r12\n\ + muls r1, r0\n\ + str r1, [sp, 0x4]\n\ + adds r0, r3, 0\n\ + mov r1, r8\n\ + ands r0, r1\n\ + ldr r1, [sp, 0x4]\n\ + orrs r1, r0\n\ + lsls r1, 2\n\ + adds r1, r4, r1\n\ + cmp r1, r6\n\ + bge _08003DFA\n\ + adds r0, r5, r2\n\ + adds r1, r5, r1\n\ + ldr r1, [r1]\n\ + str r1, [r0]\n\ + b _08003DFE\n\ +_08003DFA:\n\ + adds r0, r5, r2\n\ + str r7, [r0]\n\ +_08003DFE:\n\ + adds r3, 0x1\n\ + adds r2, r4, 0\n\ + adds r2, 0x14\n\ + adds r0, r3, 0\n\ + mov r1, r9\n\ + ands r0, r1\n\ + mov r1, r12\n\ + muls r1, r0\n\ + str r1, [sp, 0x4]\n\ + adds r0, r3, 0\n\ + mov r1, r8\n\ + ands r0, r1\n\ + ldr r1, [sp, 0x4]\n\ + orrs r1, r0\n\ + lsls r1, 2\n\ + adds r1, r4, r1\n\ + cmp r1, r6\n\ + bge _08003E2C\n\ + adds r0, r5, r2\n\ + adds r1, r5, r1\n\ + ldr r1, [r1]\n\ + str r1, [r0]\n\ + b _08003E30\n\ +_08003E2C:\n\ + adds r0, r5, r2\n\ + str r7, [r0]\n\ +_08003E30:\n\ + adds r3, 0x1\n\ + adds r2, r4, 0\n\ + adds r2, 0x18\n\ + adds r0, r3, 0\n\ + mov r1, r9\n\ + ands r0, r1\n\ + mov r1, r12\n\ + muls r1, r0\n\ + str r1, [sp, 0x4]\n\ + adds r0, r3, 0\n\ + mov r1, r8\n\ + ands r0, r1\n\ + ldr r1, [sp, 0x4]\n\ + orrs r1, r0\n\ + lsls r1, 2\n\ + adds r1, r4, r1\n\ + cmp r1, r6\n\ + bge _08003E5E\n\ + adds r0, r5, r2\n\ + adds r1, r5, r1\n\ + ldr r1, [r1]\n\ + str r1, [r0]\n\ + b _08003E62\n\ +_08003E5E:\n\ + adds r0, r5, r2\n\ + str r7, [r0]\n\ +_08003E62:\n\ + adds r3, 0x1\n\ + adds r2, r4, 0\n\ + adds r2, 0x1C\n\ + adds r0, r3, 0\n\ + mov r1, r9\n\ + ands r0, r1\n\ + mov r1, r12\n\ + muls r1, r0\n\ + adds r0, r1, 0\n\ + mov r1, r8\n\ + ands r3, r1\n\ + orrs r0, r3\n\ + lsls r0, 2\n\ + adds r1, r4, r0\n\ + cmp r1, r6\n\ + bge _08003E8C\n\ + adds r0, r5, r2\n\ + adds r1, r5, r1\n\ + ldr r1, [r1]\n\ + str r1, [r0]\n\ + b _08003E90\n\ +_08003E8C:\n\ + adds r0, r5, r2\n\ + str r7, [r0]\n\ +_08003E90:\n\ + movs r2, 0x20\n\ + add r10, r2\n\ + adds r4, 0x20\n\ + cmp r4, r6\n\ + bge _08003E9C\n\ + b _08003D08\n\ +_08003E9C:\n\ + b _08004046\n\ +_08003E9E:\n\ + subs r0, r6, 0x4\n\ + adds r5, r0\n\ + movs r4, 0\n\ + cmp r4, r6\n\ + blt _08003EAA\n\ + b _08004046\n\ +_08003EAA:\n\ + movs r0, 0x8\n\ + negs r0, r0\n\ + mov r9, r0\n\ + movs r1, 0x7\n\ + mov r8, r1\n\ + mov r10, r5\n\ +_08003EB6:\n\ + ldr r3, [sp]\n\ + adds r0, r3, 0\n\ + mov r2, r9\n\ + ands r0, r2\n\ + mov r1, r12\n\ + muls r1, r0\n\ + adds r0, r3, 0\n\ + mov r2, r8\n\ + ands r0, r2\n\ + orrs r1, r0\n\ + lsls r1, 2\n\ + adds r1, r4, r1\n\ + cmp r1, r6\n\ + bge _08003EDC\n\ + subs r0, r5, r1\n\ + ldr r0, [r0]\n\ + mov r1, r10\n\ + str r0, [r1]\n\ + b _08003EE0\n\ +_08003EDC:\n\ + mov r2, r10\n\ + str r7, [r2]\n\ +_08003EE0:\n\ + adds r3, 0x1\n\ + adds r2, r4, 0x4\n\ + adds r0, r3, 0\n\ + mov r1, r9\n\ + ands r0, r1\n\ + mov r1, r12\n\ + muls r1, r0\n\ + str r1, [sp, 0x4]\n\ + adds r0, r3, 0\n\ + mov r1, r8\n\ + ands r0, r1\n\ + ldr r1, [sp, 0x4]\n\ + orrs r1, r0\n\ + lsls r1, 2\n\ + adds r1, r4, r1\n\ + cmp r1, r6\n\ + bge _08003F0C\n\ + subs r0, r5, r2\n\ + subs r1, r5, r1\n\ + ldr r1, [r1]\n\ + str r1, [r0]\n\ + b _08003F10\n\ +_08003F0C:\n\ + subs r0, r5, r2\n\ + str r7, [r0]\n\ +_08003F10:\n\ + adds r3, 0x1\n\ + adds r2, r4, 0\n\ + adds r2, 0x8\n\ + adds r0, r3, 0\n\ + mov r1, r9\n\ + ands r0, r1\n\ + mov r1, r12\n\ + muls r1, r0\n\ + str r1, [sp, 0x4]\n\ + adds r0, r3, 0\n\ + mov r1, r8\n\ + ands r0, r1\n\ + ldr r1, [sp, 0x4]\n\ + orrs r1, r0\n\ + lsls r1, 2\n\ + adds r1, r4, r1\n\ + cmp r1, r6\n\ + bge _08003F3E\n\ + subs r0, r5, r2\n\ + subs r1, r5, r1\n\ + ldr r1, [r1]\n\ + str r1, [r0]\n\ + b _08003F42\n\ +_08003F3E:\n\ + subs r0, r5, r2\n\ + str r7, [r0]\n\ +_08003F42:\n\ + adds r3, 0x1\n\ + adds r2, r4, 0\n\ + adds r2, 0xC\n\ + adds r0, r3, 0\n\ + mov r1, r9\n\ + ands r0, r1\n\ + mov r1, r12\n\ + muls r1, r0\n\ + str r1, [sp, 0x4]\n\ + adds r0, r3, 0\n\ + mov r1, r8\n\ + ands r0, r1\n\ + ldr r1, [sp, 0x4]\n\ + orrs r1, r0\n\ + lsls r1, 2\n\ + adds r1, r4, r1\n\ + cmp r1, r6\n\ + bge _08003F70\n\ + subs r0, r5, r2\n\ + subs r1, r5, r1\n\ + ldr r1, [r1]\n\ + str r1, [r0]\n\ + b _08003F74\n\ +_08003F70:\n\ + subs r0, r5, r2\n\ + str r7, [r0]\n\ +_08003F74:\n\ + adds r3, 0x1\n\ + adds r2, r4, 0\n\ + adds r2, 0x10\n\ + adds r0, r3, 0\n\ + mov r1, r9\n\ + ands r0, r1\n\ + mov r1, r12\n\ + muls r1, r0\n\ + str r1, [sp, 0x4]\n\ + adds r0, r3, 0\n\ + mov r1, r8\n\ + ands r0, r1\n\ + ldr r1, [sp, 0x4]\n\ + orrs r1, r0\n\ + lsls r1, 2\n\ + adds r1, r4, r1\n\ + cmp r1, r6\n\ + bge _08003FA2\n\ + subs r0, r5, r2\n\ + subs r1, r5, r1\n\ + ldr r1, [r1]\n\ + str r1, [r0]\n\ + b _08003FA6\n\ +_08003FA2:\n\ + subs r0, r5, r2\n\ + str r7, [r0]\n\ +_08003FA6:\n\ + adds r3, 0x1\n\ + adds r2, r4, 0\n\ + adds r2, 0x14\n\ + adds r0, r3, 0\n\ + mov r1, r9\n\ + ands r0, r1\n\ + mov r1, r12\n\ + muls r1, r0\n\ + str r1, [sp, 0x4]\n\ + adds r0, r3, 0\n\ + mov r1, r8\n\ + ands r0, r1\n\ + ldr r1, [sp, 0x4]\n\ + orrs r1, r0\n\ + lsls r1, 2\n\ + adds r1, r4, r1\n\ + cmp r1, r6\n\ + bge _08003FD4\n\ + subs r0, r5, r2\n\ + subs r1, r5, r1\n\ + ldr r1, [r1]\n\ + str r1, [r0]\n\ + b _08003FD8\n\ +_08003FD4:\n\ + subs r0, r5, r2\n\ + str r7, [r0]\n\ +_08003FD8:\n\ + adds r3, 0x1\n\ + adds r2, r4, 0\n\ + adds r2, 0x18\n\ + adds r0, r3, 0\n\ + mov r1, r9\n\ + ands r0, r1\n\ + mov r1, r12\n\ + muls r1, r0\n\ + str r1, [sp, 0x4]\n\ + adds r0, r3, 0\n\ + mov r1, r8\n\ + ands r0, r1\n\ + ldr r1, [sp, 0x4]\n\ + orrs r1, r0\n\ + lsls r1, 2\n\ + adds r1, r4, r1\n\ + cmp r1, r6\n\ + bge _08004006\n\ + subs r0, r5, r2\n\ + subs r1, r5, r1\n\ + ldr r1, [r1]\n\ + str r1, [r0]\n\ + b _0800400A\n\ +_08004006:\n\ + subs r0, r5, r2\n\ + str r7, [r0]\n\ +_0800400A:\n\ + adds r3, 0x1\n\ + adds r2, r4, 0\n\ + adds r2, 0x1C\n\ + adds r0, r3, 0\n\ + mov r1, r9\n\ + ands r0, r1\n\ + mov r1, r12\n\ + muls r1, r0\n\ + adds r0, r1, 0\n\ + mov r1, r8\n\ + ands r3, r1\n\ + orrs r0, r3\n\ + lsls r0, 2\n\ + adds r1, r4, r0\n\ + cmp r1, r6\n\ + bge _08004034\n\ + subs r0, r5, r2\n\ + subs r1, r5, r1\n\ + ldr r1, [r1]\n\ + str r1, [r0]\n\ + b _08004038\n\ +_08004034:\n\ + subs r0, r5, r2\n\ + str r7, [r0]\n\ +_08004038:\n\ + movs r2, 0x20\n\ + negs r2, r2\n\ + add r10, r2\n\ + adds r4, 0x20\n\ + cmp r4, r6\n\ + bge _08004046\n\ + b _08003EB6\n\ +_08004046:\n\ + add sp, 0x8\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\ + .syntax divided"); +} +#endif // NONMATCHING + +void CallWindowFunction(u8 windowId, void ( *func)(u8, u8, u8, u8, u8, u8)) +{ + struct WindowTemplate window = gWindows[windowId].window; + func(window.priority, window.tilemapLeft, window.tilemapTop, window.width, window.height, window.paletteNum); +} + +bool8 SetWindowAttribute(u8 windowId, u8 attributeId, u32 value) +{ + switch (attributeId) + { + case WINDOW_TILEMAP_LEFT: + gWindows[windowId].window.tilemapLeft = value; + return FALSE; + case WINDOW_TILEMAP_TOP: + gWindows[windowId].window.tilemapTop = value; + return FALSE; + case WINDOW_PALETTE_NUM: + gWindows[windowId].window.paletteNum = value; + return FALSE; + case WINDOW_BASE_BLOCK: + gWindows[windowId].window.baseBlock = value; + return FALSE; + case WINDOW_TILE_DATA: + case WINDOW_PRIORITY: + case WINDOW_WIDTH: + case WINDOW_HEIGHT: + default: + return TRUE; + } +} + +u32 GetWindowAttribute(u8 windowId, u8 attributeId) +{ + switch (attributeId) + { + case WINDOW_PRIORITY: + return gWindows[windowId].window.priority; + case WINDOW_TILEMAP_LEFT: + return gWindows[windowId].window.tilemapLeft; + case WINDOW_TILEMAP_TOP: + return gWindows[windowId].window.tilemapTop; + case WINDOW_WIDTH: + return gWindows[windowId].window.width; + case WINDOW_HEIGHT: + return gWindows[windowId].window.height; + case WINDOW_PALETTE_NUM: + return gWindows[windowId].window.paletteNum; + case WINDOW_BASE_BLOCK: + return gWindows[windowId].window.baseBlock; + case WINDOW_TILE_DATA: + return (u32)(gWindows[windowId].tileData); + default: + return 0; + } +} + +static u8 GetNumActiveWindowsOnBg(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_common.txt b/sym_common.txt index 86c90b518..338afb5b4 100644 --- a/sym_common.txt +++ b/sym_common.txt @@ -5,10 +5,10 @@ gUnknown_3003E20: @ 3003E20 .space 0x10 -gUnknown_3003E30: @ 3003E30 +gWindowClearTile: @ 3003E30 .space 0x10 -gUnknown_3003E40: @ 3003E40 +gWindowBgTilemapBuffers: @ 3003E40 .space 0x10 gUnknown_3003E50: @ 3003E50 diff --git a/sym_ewram.txt b/sym_ewram.txt index e6812246a..0ddc34521 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -30,9 +30,7 @@ gTrainerId: @ 2020000 .include "src/malloc.o" .include "src/text_printer.o" - -gWindows: @ 20204B4 - .space 0x180 + .include "src/window.o" gUnknown_2020634: @ 2020634 .space 0x4 |