diff options
-rw-r--r-- | asm/window.s | 1221 | ||||
-rw-r--r-- | include/malloc.h | 8 | ||||
-rw-r--r-- | include/window.h | 16 | ||||
-rw-r--r-- | ld_script.txt | 1 | ||||
-rw-r--r-- | src/window.c | 1003 | ||||
-rw-r--r-- | sym_ewram.txt | 12 |
6 files changed, 972 insertions, 1289 deletions
diff --git a/asm/window.s b/asm/window.s deleted file mode 100644 index 6bb76d594..000000000 --- a/asm/window.s +++ /dev/null @@ -1,1221 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start ScrollWindow -@ void ScrollWindow(u8 windowId, u8 direction, u8 distance, u8 fillValue) -ScrollWindow: @ 8003C94 - 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, =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 _08003CE8 - b _08003E9E -_08003CE8: - cmp r0, 0x1 - ble _08003CEE - b _08004046 -_08003CEE: - cmp r0, 0 - beq _08003CF4 - b _08004046 -_08003CF4: - movs r4, 0 - cmp r4, r6 - blt _08003CFC - b _08004046 -_08003CFC: - movs r1, 0x8 - negs r1, r1 - mov r9, r1 - movs r2, 0x7 - mov r8, r2 - mov r10, r5 -_08003D08: - 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 _08003D34 - adds r0, r5, r1 - ldr r0, [r0] - mov r1, r10 - str r0, [r1] - b _08003D38 - .pool -_08003D34: - mov r2, r10 - str r7, [r2] -_08003D38: - 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 _08003D64 - adds r0, r5, r2 - adds r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _08003D68 -_08003D64: - adds r0, r5, r2 - str r7, [r0] -_08003D68: - 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 _08003D96 - adds r0, r5, r2 - adds r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _08003D9A -_08003D96: - adds r0, r5, r2 - str r7, [r0] -_08003D9A: - 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 _08003DC8 - adds r0, r5, r2 - adds r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _08003DCC -_08003DC8: - adds r0, r5, r2 - str r7, [r0] -_08003DCC: - 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 _08003DFA - adds r0, r5, r2 - adds r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _08003DFE -_08003DFA: - adds r0, r5, r2 - str r7, [r0] -_08003DFE: - 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 _08003E2C - adds r0, r5, r2 - adds r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _08003E30 -_08003E2C: - adds r0, r5, r2 - str r7, [r0] -_08003E30: - 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 _08003E5E - adds r0, r5, r2 - adds r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _08003E62 -_08003E5E: - adds r0, r5, r2 - str r7, [r0] -_08003E62: - 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 _08003E8C - adds r0, r5, r2 - adds r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _08003E90 -_08003E8C: - adds r0, r5, r2 - str r7, [r0] -_08003E90: - movs r2, 0x20 - add r10, r2 - adds r4, 0x20 - cmp r4, r6 - bge _08003E9C - b _08003D08 -_08003E9C: - b _08004046 -_08003E9E: - subs r0, r6, 0x4 - adds r5, r0 - movs r4, 0 - cmp r4, r6 - blt _08003EAA - b _08004046 -_08003EAA: - movs r0, 0x8 - negs r0, r0 - mov r9, r0 - movs r1, 0x7 - mov r8, r1 - mov r10, r5 -_08003EB6: - 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 _08003EDC - subs r0, r5, r1 - ldr r0, [r0] - mov r1, r10 - str r0, [r1] - b _08003EE0 -_08003EDC: - mov r2, r10 - str r7, [r2] -_08003EE0: - 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 _08003F0C - subs r0, r5, r2 - subs r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _08003F10 -_08003F0C: - subs r0, r5, r2 - str r7, [r0] -_08003F10: - 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 _08003F3E - subs r0, r5, r2 - subs r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _08003F42 -_08003F3E: - subs r0, r5, r2 - str r7, [r0] -_08003F42: - 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 _08003F70 - subs r0, r5, r2 - subs r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _08003F74 -_08003F70: - subs r0, r5, r2 - str r7, [r0] -_08003F74: - 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 _08003FA2 - subs r0, r5, r2 - subs r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _08003FA6 -_08003FA2: - subs r0, r5, r2 - str r7, [r0] -_08003FA6: - 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 _08003FD4 - subs r0, r5, r2 - subs r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _08003FD8 -_08003FD4: - subs r0, r5, r2 - str r7, [r0] -_08003FD8: - 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 _08004006 - subs r0, r5, r2 - subs r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _0800400A -_08004006: - subs r0, r5, r2 - str r7, [r0] -_0800400A: - 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 _08004034 - subs r0, r5, r2 - subs r1, r5, r1 - ldr r1, [r1] - str r1, [r0] - b _08004038 -_08004034: - subs r0, r5, r2 - str r7, [r0] -_08004038: - movs r2, 0x20 - negs r2, r2 - add r10, r2 - adds r4, 0x20 - cmp r4, r6 - bge _08004046 - b _08003EB6 -_08004046: - 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 -@ void CallWindowFunction(u8 windowId, void ( *func)(u8, u8, u8, u8, u8, u8)) -CallWindowFunction: @ 8004058 - push {r4-r6,lr} - mov r6, r8 - push {r6} - sub sp, 0x8 - mov r8, r1 - lsls r0, 24 - lsrs r0, 24 - ldr r2, =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 - .pool - thumb_func_end CallWindowFunction - - thumb_func_start SetWindowAttribute -@ bool8 SetWindowAttribute(u8 windowId, u8 attributeId, u32 value) -SetWindowAttribute: @ 80040A8 - push {lr} - lsls r0, 24 - lsrs r3, r0, 24 - lsls r1, 24 - lsrs r0, r1, 24 - cmp r0, 0x7 - bhi _08004142 - lsls r0, 2 - ldr r1, =_080040C4 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .pool - .align 2, 0 -_080040C4: - .4byte _08004142 - .4byte _080040E4 - .4byte _080040F8 - .4byte _08004142 - .4byte _08004142 - .4byte _0800410C - .4byte _08004120 - .4byte _08004134 -_080040E4: - ldr r1, =gWindows - lsls r0, r3, 1 - adds r0, r3 - lsls r0, 2 - adds r0, r1 - strb r2, [r0, 0x1] - movs r0, 0 - b _08004144 - .pool -_080040F8: - ldr r1, =gWindows - lsls r0, r3, 1 - adds r0, r3 - lsls r0, 2 - adds r0, r1 - strb r2, [r0, 0x2] - movs r0, 0 - b _08004144 - .pool -_0800410C: - ldr r1, =gWindows - lsls r0, r3, 1 - adds r0, r3 - lsls r0, 2 - adds r0, r1 - strb r2, [r0, 0x5] - movs r0, 0 - b _08004144 - .pool -_08004120: - ldr r1, =gWindows - lsls r0, r3, 1 - adds r0, r3 - lsls r0, 2 - adds r0, r1 - strh r2, [r0, 0x6] - movs r0, 0 - b _08004144 - .pool -_08004134: - ldr r1, =gWindows - lsls r0, r3, 1 - adds r0, r3 - lsls r0, 2 - adds r1, 0x8 - adds r0, r1 - str r2, [r0] -_08004142: - movs r0, 0x1 -_08004144: - pop {r1} - bx r1 - .pool - thumb_func_end SetWindowAttribute - - thumb_func_start GetWindowAttribute -@ u32 GetWindowAttribute(u8 windowId, u8 attributeId) -GetWindowAttribute: @ 800414C - push {lr} - lsls r0, 24 - lsrs r2, r0, 24 - lsls r1, 24 - lsrs r0, r1, 24 - cmp r0, 0x7 - bhi _08004228 - lsls r0, 2 - ldr r1, =_08004168 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .pool - .align 2, 0 -_08004168: - .4byte _08004188 - .4byte _0800419C - .4byte _080041B0 - .4byte _080041C4 - .4byte _080041D8 - .4byte _080041EC - .4byte _08004200 - .4byte _08004214 -_08004188: - ldr r0, =gWindows - lsls r1, r2, 1 - adds r1, r2 - lsls r1, 2 - adds r1, r0 - ldrb r0, [r1] - b _0800422A - .pool -_0800419C: - ldr r0, =gWindows - lsls r1, r2, 1 - adds r1, r2 - lsls r1, 2 - adds r1, r0 - ldrb r0, [r1, 0x1] - b _0800422A - .pool -_080041B0: - ldr r0, =gWindows - lsls r1, r2, 1 - adds r1, r2 - lsls r1, 2 - adds r1, r0 - ldrb r0, [r1, 0x2] - b _0800422A - .pool -_080041C4: - ldr r0, =gWindows - lsls r1, r2, 1 - adds r1, r2 - lsls r1, 2 - adds r1, r0 - ldrb r0, [r1, 0x3] - b _0800422A - .pool -_080041D8: - ldr r0, =gWindows - lsls r1, r2, 1 - adds r1, r2 - lsls r1, 2 - adds r1, r0 - ldrb r0, [r1, 0x4] - b _0800422A - .pool -_080041EC: - ldr r0, =gWindows - lsls r1, r2, 1 - adds r1, r2 - lsls r1, 2 - adds r1, r0 - ldrb r0, [r1, 0x5] - b _0800422A - .pool -_08004200: - ldr r0, =gWindows - lsls r1, r2, 1 - adds r1, r2 - lsls r1, 2 - adds r1, r0 - ldrh r0, [r1, 0x6] - b _0800422A - .pool -_08004214: - ldr r0, =gWindows - lsls r1, r2, 1 - adds r1, r2 - lsls r1, 2 - adds r0, 0x8 - adds r1, r0 - ldr r0, [r1] - b _0800422A - .pool -_08004228: - movs r0, 0 -_0800422A: - pop {r1} - bx r1 - thumb_func_end GetWindowAttribute - - thumb_func_start GetNumActiveWindowsOnBg -@ u8 GetNumActiveWindowsOnBg(u8 bgId) -GetNumActiveWindowsOnBg: @ 8004230 - push {r4,lr} - lsls r0, 24 - lsrs r4, r0, 24 - movs r3, 0 - ldr r2, =gWindows - movs r1, 0x1F -_0800423C: - ldrb r0, [r2] - cmp r0, r4 - bne _08004248 - adds r0, r3, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 -_08004248: - adds r2, 0xC - subs r1, 0x1 - cmp r1, 0 - bge _0800423C - adds r0, r3, 0 - pop {r4} - pop {r1} - bx r1 - .pool - thumb_func_end GetNumActiveWindowsOnBg - - thumb_func_start nullsub_9 -nullsub_9: @ 800425C - bx lr - thumb_func_end nullsub_9 - - thumb_func_start AddWindow8Bit -@ u16 AddWindow8Bit(struct WindowTemplate *template) -AddWindow8Bit: @ 8004260 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - mov r9, r0 - movs r6, 0 - ldr r1, =gWindows - ldrb r0, [r1] - cmp r0, 0xFF - beq _0800428E -_08004276: - adds r0, r6, 0x1 - lsls r0, 16 - lsrs r6, r0, 16 - cmp r6, 0x1F - bhi _0800428E - lsls r0, r6, 1 - adds r0, r6 - lsls r0, 2 - adds r0, r1 - ldrb r0, [r0] - cmp r0, 0xFF - bne _08004276 -_0800428E: - cmp r6, 0x20 - beq _08004322 - mov r0, r9 - ldrb r7, [r0] - ldr r1, =gUnknown_03002F70 - mov r10, r1 - lsls r2, r7, 2 - mov r8, r2 - mov r0, r8 - add r0, r10 - ldr r0, [r0] - cmp r0, 0 - bne _080042EA - adds r0, r7, 0 - movs r1, 0x8 - bl GetBgAttribute - lsls r0, 16 - lsrs r5, r0, 16 - ldr r0, =0x0000ffff - cmp r5, r0 - beq _080042EA - adds r0, r5, 0 - bl Alloc - adds r4, r0, 0 - cmp r4, 0 - beq _08004322 - movs r1, 0 - mov r12, r10 - mov r3, r8 - cmp r1, r5 - bge _080042DC - movs r2, 0 -_080042D2: - adds r0, r4, r1 - strb r2, [r0] - adds r1, 0x1 - cmp r1, r5 - blt _080042D2 -_080042DC: - mov r1, r12 - adds r0, r3, r1 - str r4, [r0] - adds r0, r7, 0 - adds r1, r4, 0 - bl SetBgTilemapBuffer -_080042EA: - 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 _08004338 - adds r0, r7, 0 - bl GetNumActiveWindowsOnBg8Bit - lsls r0, 24 - cmp r0, 0 - bne _08004322 - ldr r0, =gUnknown_03002F70 - lsls r1, r7, 2 - adds r5, r1, r0 - ldr r1, [r5] - ldr r0, =nullsub_9 - cmp r1, r0 - beq _08004322 - adds r0, r1, 0 - bl Free - str r4, [r5] -_08004322: - movs r0, 0xFF - b _08004356 - .pool -_08004338: - ldr r1, =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 -_08004356: - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .pool - thumb_func_end AddWindow8Bit - - thumb_func_start FillWindowPixelBuffer8Bit -@ void FillWindowPixelBuffer8Bit(u8 windowId, u8 fillValue) -FillWindowPixelBuffer8Bit: @ 8004368 - push {r4-r6,lr} - lsls r0, 24 - lsrs r0, 24 - lsls r1, 24 - lsrs r5, r1, 24 - ldr r6, =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 _0800439E - adds r0, r6, 0 - adds r0, 0x8 - adds r1, r4, r0 -_08004392: - ldr r0, [r1] - adds r0, r2 - strb r5, [r0] - adds r2, 0x1 - cmp r2, r3 - blt _08004392 -_0800439E: - pop {r4-r6} - pop {r0} - bx r0 - .pool - thumb_func_end FillWindowPixelBuffer8Bit - - thumb_func_start FillWindowPixelRect8Bit -@ void FillWindowPixelRect8Bit(u8 windowId, u8 fillValue, u16 x, u16 y, u16 width, u16 height) -FillWindowPixelRect8Bit: @ 80043A8 - 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, =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, =0xffff0000 - ldr r5, [sp, 0xC] - ands r5, r6 - orrs r5, r0 - str r5, [sp, 0xC] - ldrb r4, [r4, 0x4] - lsls r4, 19 - ldr r0, =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 - .pool - thumb_func_end FillWindowPixelRect8Bit - - thumb_func_start BlitBitmapRectToWindow4BitTo8Bit -@ void BlitBitmapRectToWindow4BitTo8Bit(u8 rbox_id, u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight, u8 paletteOffset) -BlitBitmapRectToWindow4BitTo8Bit: @ 8004434 - 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, =0x0000ffff - lsrs r4, 16 - orrs r4, r5 - str r4, [sp, 0x1C] - ldr r1, =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, =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 - .pool - thumb_func_end BlitBitmapRectToWindow4BitTo8Bit - - thumb_func_start CopyWindowToVram8Bit -@ void CopyWindowToVram8Bit(u8 windowId, u8 mode) -CopyWindowToVram8Bit: @ 8004500 - push {r4-r6,lr} - lsls r0, 24 - lsrs r0, 24 - lsls r1, 24 - lsrs r2, r1, 24 - adds r5, r2, 0 - ldr r6, =gUnknown_02020184 - lsls r1, r0, 1 - adds r1, r0 - lsls r1, 2 - ldr r0, =gWindows - adds r3, r1, r0 - str r3, [r6] - ldr r4, =gUnknown_02020188 - ldrb r1, [r3, 0x3] - ldrb r0, [r3, 0x4] - muls r0, r1 - lsls r0, 6 - strh r0, [r4] - cmp r2, 0x2 - beq _0800454E - cmp r2, 0x2 - bgt _08004540 - cmp r2, 0x1 - beq _08004546 - b _08004570 - .pool -_08004540: - cmp r5, 0x3 - beq _0800455C - b _08004570 -_08004546: - ldrb r0, [r3] - bl CopyBgTilemapBufferToVram - b _08004570 -_0800454E: - ldrb r0, [r3] - ldr r1, [r3, 0x8] - ldrh r2, [r4] - ldrh r3, [r3, 0x6] - bl LoadBgTiles - b _08004570 -_0800455C: - ldrb r0, [r3] - ldr r1, [r3, 0x8] - ldrh r2, [r4] - ldrh r3, [r3, 0x6] - bl LoadBgTiles - ldr r0, [r6] - ldrb r0, [r0] - bl CopyBgTilemapBufferToVram -_08004570: - pop {r4-r6} - pop {r0} - bx r0 - thumb_func_end CopyWindowToVram8Bit - - thumb_func_start GetNumActiveWindowsOnBg8Bit -@ int GetNumActiveWindowsOnBg8Bit(int bg_id) -GetNumActiveWindowsOnBg8Bit: @ 8004578 - push {r4,lr} - lsls r0, 24 - lsrs r4, r0, 24 - movs r3, 0 - ldr r2, =gWindows - movs r1, 0x1F -_08004584: - ldrb r0, [r2] - cmp r0, r4 - bne _08004590 - adds r0, r3, 0x1 - lsls r0, 24 - lsrs r3, r0, 24 -_08004590: - adds r2, 0xC - subs r1, 0x1 - cmp r1, 0 - bge _08004584 - adds r0, r3, 0 - pop {r4} - pop {r1} - bx r1 - .pool - thumb_func_end GetNumActiveWindowsOnBg8Bit - - .align 2, 0 @ Don't pad with nop. diff --git a/include/malloc.h b/include/malloc.h new file mode 100644 index 000000000..bd870ede3 --- /dev/null +++ b/include/malloc.h @@ -0,0 +1,8 @@ +#ifndef GUARD_MALLOC_H +#define GUARD_MALLOC_H + +void *Alloc(u32 size); +void *AllocZeroed(u32 size); +void Free(void *pointer); + +#endif // GUARD_MALLOC_H diff --git a/include/window.h b/include/window.h index ca0520d41..fb446fecf 100644 --- a/include/window.h +++ b/include/window.h @@ -1,6 +1,20 @@ #ifndef GUARD_WINDOW_H #define GUARD_WINDOW_H +#define WINDOWS_MAX 32 + +enum +{ + WINDOW_PRIORITY, + WINDOW_TILEMAP_LEFT, + WINDOW_TILEMAP_TOP, + WINDOW_WIDTH, + WINDOW_HEIGHT, + WINDOW_PALETTE_NUM, + WINDOW_BASE_BLOCK, + WINDOW_TILE_DATA +}; + struct WindowTemplate { u8 priority; @@ -18,4 +32,6 @@ struct Window u8 *tileData; }; +extern struct Window gWindows[WINDOWS_MAX]; + #endif // GUARD_WINDOW_H diff --git a/ld_script.txt b/ld_script.txt index 17bb67db2..43e3535cc 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -48,7 +48,6 @@ SECTIONS { asm/bg.o(.text); asm/blit.o(.text); src/window.o(.text); - asm/window.o(.text); src/text.o(.text); asm/sprite.o(.text); src/string_util.o(.text); diff --git a/src/window.c b/src/window.c index aeae9e1ed..e011d60be 100644 --- a/src/window.c +++ b/src/window.c @@ -1,33 +1,38 @@ #include "global.h" #include "window.h" +#include "malloc.h" extern u8 gUnknown_03002F60; extern void* gUnknown_03002F70[]; extern u32 gUnneededFireRedVariable; -EWRAM_DATA struct Window gWindows[20]; + +EWRAM_DATA struct Window gWindows[WINDOWS_MAX] = {0}; +EWRAM_DATA static struct Window* sWindowPtr = NULL; +EWRAM_DATA static u16 sWindowSize = 0; extern void* GetBgTilemapBuffer(u8 bg); extern int DummiedOutFireRedLeafGreenTileAllocFunc(int, int, int, int); extern u16 GetBgAttribute(u8 bg, u8 attributeId); -extern void *AllocZeroed(u16 size); extern void FreeAllWindowBuffers(void); extern void SetBgTilemapBuffer(u8 bg, void *tilemap); extern u8 GetNumActiveWindowsOnBg(u8 bgId); -extern void Free(void *pointer); 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); void BlitBitmapRectToWindow(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight); +u8 GetNumActiveWindowsOnBg8Bit(u8 bgId); extern const struct WindowTemplate gDummyWindowTemplate; void nullsub_8(void) { - + } bool16 InitWindows(struct WindowTemplate *templates) @@ -39,7 +44,7 @@ bool16 InitWindows(struct WindowTemplate *templates) u16 attrib; u8* allocatedTilemapBuffer; int allocatedBaseBlock; - + for (i = 0; i < 0x4; ++i) { bgTilemapBuffer = GetBgTilemapBuffer(i); @@ -48,13 +53,13 @@ bool16 InitWindows(struct WindowTemplate *templates) else gUnknown_03002F70[i] = bgTilemapBuffer; } - + for (i = 0; i < 0x20; ++i) { gWindows[i].window = gDummyWindowTemplate; 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) @@ -63,31 +68,31 @@ bool16 InitWindows(struct WindowTemplate *templates) if (allocatedBaseBlock == -1) return FALSE; } - + if (gUnknown_03002F70[bgLayer] == NULL) { attrib = GetBgAttribute(bgLayer, 0x8); - + if (attrib != 0xFFFF) { allocatedTilemapBuffer = AllocZeroed(attrib); - + if (allocatedTilemapBuffer == NULL) { FreeAllWindowBuffers(); return FALSE; } - + for (j = 0; j < attrib; ++j) allocatedTilemapBuffer[j] = 0; - + gUnknown_03002F70[bgLayer] = allocatedTilemapBuffer; SetBgTilemapBuffer(bgLayer, allocatedTilemapBuffer); } } - - allocatedTilemapBuffer = AllocZeroed(0x20 * (templates[i].width * templates[i].height)); - + + allocatedTilemapBuffer = AllocZeroed((u16)(0x20 * (templates[i].width * templates[i].height))); + if (allocatedTilemapBuffer == NULL) { if ((GetNumActiveWindowsOnBg(bgLayer) == 0) && (gUnknown_03002F70[bgLayer] != nullsub_8)) @@ -95,20 +100,20 @@ bool16 InitWindows(struct WindowTemplate *templates) Free(gUnknown_03002F70[bgLayer]); gUnknown_03002F70[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); } } - + gUnknown_03002F60 = 0; return TRUE; } @@ -127,42 +132,42 @@ u16 AddWindow(struct WindowTemplate *template) 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 (gUnknown_03002F70[bgLayer] == NULL) { attrib = GetBgAttribute(bgLayer, 0x8); - + if (attrib != 0xFFFF) { allocatedTilemapBuffer = AllocZeroed(attrib); - + if (allocatedTilemapBuffer == NULL) return 0xFF; - + for (i = 0; i < attrib; ++i) allocatedTilemapBuffer[i] = 0; - + gUnknown_03002F70[bgLayer] = allocatedTilemapBuffer; SetBgTilemapBuffer(bgLayer, allocatedTilemapBuffer); } } - - allocatedTilemapBuffer = AllocZeroed(0x20 * (template->width * template->height)); - + + allocatedTilemapBuffer = AllocZeroed((u16)(0x20 * (template->width * template->height))); + if (allocatedTilemapBuffer == NULL) { if ((GetNumActiveWindowsOnBg(bgLayer) == 0) && (gUnknown_03002F70[bgLayer] != nullsub_8)) @@ -172,10 +177,10 @@ u16 AddWindow(struct WindowTemplate *template) } return 0xFF; } - + gWindows[win].tileData = allocatedTilemapBuffer; gWindows[win].window = *template; - + if (gUnneededFireRedVariable == 1) { gWindows[win].window.baseBlock = allocatedBaseBlock; @@ -190,29 +195,29 @@ int AddWindowWithoutTileMap(struct WindowTemplate *template) u16 win; u8 bgLayer; int allocatedBaseBlock; - + for (win = 0; win < 0x20; ++win) { if (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; } - + gWindows[win].window = *template; - + if (gUnneededFireRedVariable == 1) { gWindows[win].window.baseBlock = allocatedBaseBlock; @@ -225,14 +230,14 @@ int AddWindowWithoutTileMap(struct WindowTemplate *template) 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 = gDummyWindowTemplate; - + if (GetNumActiveWindowsOnBg(bgLayer) == 0) { if (gUnknown_03002F70[bgLayer] != nullsub_8) @@ -241,7 +246,7 @@ void RemoveWindow(u8 windowId) gUnknown_03002F70[bgLayer] = 0; } } - + if (gWindows[windowId].tileData != NULL) { Free(gWindows[windowId].tileData); @@ -252,7 +257,7 @@ void RemoveWindow(u8 windowId) void FreeAllWindowBuffers(void) { int i; - + for (i = 0; i < 4; ++i) { if (gUnknown_03002F70[i] != NULL && gUnknown_03002F70[i] != nullsub_8) @@ -261,7 +266,7 @@ void FreeAllWindowBuffers(void) gUnknown_03002F70[i] = NULL; } } - + for (i = 0; i < 0x20; ++i) { if (gWindows[i].tileData != NULL) @@ -301,14 +306,14 @@ void CopyWindowRectToVram(u32 windowId, u32 mode, u32 x, u32 y, u32 w, u32 h) if (w != 0 && h != 0) { windowLocal = gWindows[windowId]; - + rectSize = ((h - 1) * windowLocal.window.width); rectSize += (windowLocal.window.width - x); rectSize -= (windowLocal.window.width - (x + w)); rectSize *= 32; - + rectPos = (y * windowLocal.window.width) + x; - + switch (mode) { case 1: @@ -328,7 +333,7 @@ void CopyWindowRectToVram(u32 windowId, u32 mode, u32 x, u32 y, u32 w, u32 h) void PutWindowTilemap(u8 windowId) { struct Window windowLocal = gWindows[windowId]; - + WriteSequenceToBgTilemapBuffer( windowLocal.window.priority, GetBgAttribute(windowLocal.window.priority, 0xA) + windowLocal.window.baseBlock, @@ -345,7 +350,7 @@ void PutWindowRectTilemapOverridePalette(u8 windowId, u8 x, u8 y, u8 width, u8 h 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( @@ -357,7 +362,7 @@ void PutWindowRectTilemapOverridePalette(u8 windowId, u8 x, u8 y, u8 width, u8 h 1, palette, 1); - + currentRow += windowLocal.window.width; } } @@ -365,7 +370,7 @@ void PutWindowRectTilemapOverridePalette(u8 windowId, u8 x, u8 y, u8 width, u8 h void ClearWindowTilemap(u8 windowId) { struct Window windowLocal = gWindows[windowId]; - + FillBgTilemapBufferRect( windowLocal.window.priority, gUnknown_03002F60, @@ -381,7 +386,7 @@ 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( @@ -393,7 +398,7 @@ void PutWindowRectTilemap(u8 windowId, u8 x, u8 y, u8 width, u8 height) 1, windowLocal.window.paletteNum, 1); - + currentRow += windowLocal.window.width; } } @@ -415,7 +420,7 @@ void BlitBitmapRectToWindow(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u 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); } @@ -431,7 +436,7 @@ void BlitBitmapRectToWindowWithColorKey(u8 windowId, const u8 *pixels, u16 srcX, 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); } @@ -442,7 +447,7 @@ void FillWindowPixelRect(u8 windowId, u8 fillValue, u16 x, u16 y, u16 width, u16 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); } @@ -459,3 +464,885 @@ 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: + gWindows[windowId].tileData = (u8*)(value); + return TRUE; + 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; + } +} + +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; +} + +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 (gUnknown_03002F70[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; + gUnknown_03002F70[bgLayer] = memAddress; + SetBgTilemapBuffer(bgLayer, memAddress); + } + } + memAddress = Alloc((u16)(0x40 * (template->width * template->height))); + if (memAddress == NULL) + { + if (GetNumActiveWindowsOnBg8Bit(bgLayer) == 0 && gUnknown_03002F70[bgLayer] != nullsub_9) + { + Free(gUnknown_03002F70[bgLayer]); + gUnknown_03002F70[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; + } +} + +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 4db652d0c..b3c0f0d6e 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -1,15 +1,9 @@ gTrainerId: @ 2020000 .space 0x4 -gWindows: @ 2020004 - .space 0x180 - -gUnknown_02020184: @ 2020184 - .space 0x4 - -gUnknown_02020188: @ 2020188 - .space 0x4 - + .include "src/window.o" + .align 2 + gTempTextPrinter: @ 202018C .space 0x24 |