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