summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/window.s1221
-rw-r--r--include/malloc.h8
-rw-r--r--include/window.h16
-rw-r--r--ld_script.txt1
-rw-r--r--src/window.c1003
-rw-r--r--sym_ewram.txt12
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