summaryrefslogtreecommitdiff
path: root/asm/src
diff options
context:
space:
mode:
Diffstat (limited to 'asm/src')
-rw-r--r--asm/src/code_08000E44.s91
-rw-r--r--asm/src/code_08000F10.s51
-rw-r--r--asm/src/code_08001A7C.s1254
-rw-r--r--asm/src/code_08003FC4.s677
-rw-r--r--asm/src/code_080043E8.s408
-rw-r--r--asm/src/code_08007CAC.s52
-rw-r--r--asm/src/crt0.s49
-rw-r--r--asm/src/enemy.s250
-rw-r--r--asm/src/intr.s1947
-rw-r--r--asm/src/player.s786
-rw-r--r--asm/src/projectileUpdate.s44
-rw-r--r--asm/src/script.s144
-rw-r--r--asm/src/veneer.s475
13 files changed, 6228 insertions, 0 deletions
diff --git a/asm/src/code_08000E44.s b/asm/src/code_08000E44.s
new file mode 100644
index 00000000..cfaf1f47
--- /dev/null
+++ b/asm/src/code_08000E44.s
@@ -0,0 +1,91 @@
+ .include "asm/macros.inc"
+ .include "constants/constants.inc"
+
+ .syntax unified
+
+ .text
+
+ thumb_func_start sub_08000E44
+sub_08000E44: @ 0x08000E44
+ cmp r0, #0
+ beq _08000E4E
+ asrs r0, r0, #0x1f
+ bmi _08000E4E
+ movs r0, #1
+_08000E4E:
+ bx lr
+
+ thumb_func_start Random
+Random: @ 0x08000E50
+ ldr r2, _08000EBC @ =gRand
+ ldr r0, [r2]
+ lsls r1, r0, #1
+ adds r0, r0, r1
+ movs r1, #0xd
+ rors r0, r1
+ str r0, [r2]
+ lsrs r0, r0, #1
+ bx lr
+
+ non_word_aligned_thumb_func_start sub_08000E62
+sub_08000E62: @ 0x08000E62
+ lsrs r1, r0, #1
+ ldr r2, _08000EC0 @ =0x55555555
+ ands r0, r2
+ ands r1, r2
+ adds r0, r0, r1
+ lsrs r1, r0, #2
+ ldr r2, _08000EC4 @ =0x33333333
+ ands r0, r2
+ ands r1, r2
+ adds r0, r0, r1
+ lsrs r1, r0, #4
+ ldr r2, _08000EC8 @ =0x0F0F0F0F
+ ands r0, r2
+ ands r1, r2
+ adds r0, r0, r1
+ lsrs r1, r0, #8
+ ldr r2, _08000ECC @ =0x00FF00FF
+ ands r0, r2
+ ands r1, r2
+ adds r0, r0, r1
+ lsls r1, r0, #0x10
+ adds r0, r0, r1
+ lsrs r0, r0, #0x10
+ bx lr
+
+ non_word_aligned_thumb_func_start sub_08000E92
+sub_08000E92: @ 0x08000E92
+ movs r3, #1
+ b _08000E98
+
+ non_word_aligned_thumb_func_start LoadResourceAsync
+LoadResourceAsync: @ 0x08000E96
+ movs r3, #0
+_08000E98:
+ push {r4, r5}
+ ldr r5, _08000ED0 @ =gUnk_03003DE0
+ ldrb r4, [r5]
+ cmp r4, #0x28
+ bhs _08000EB6
+ adds r4, #1
+ strb r4, [r5]
+ movs r5, #0xc
+ muls r4, r5, r4
+ ldr r5, _08000ED4 @ =gUnk_03000C24
+ adds r4, r4, r5
+ strb r3, [r4]
+ strh r2, [r4, #2]
+ str r0, [r4, #4]
+ str r1, [r4, #8]
+_08000EB6:
+ pop {r4, r5}
+ bx lr
+ .align 2, 0
+_08000EBC: .4byte gRand
+_08000EC0: .4byte 0x55555555
+_08000EC4: .4byte 0x33333333
+_08000EC8: .4byte 0x0F0F0F0F
+_08000ECC: .4byte 0x00FF00FF
+_08000ED0: .4byte gUnk_03003DE0
+_08000ED4: .4byte gUnk_03000C24
diff --git a/asm/src/code_08000F10.s b/asm/src/code_08000F10.s
new file mode 100644
index 00000000..e7ce35aa
--- /dev/null
+++ b/asm/src/code_08000F10.s
@@ -0,0 +1,51 @@
+ .include "asm/macros.inc"
+ .include "constants/constants.inc"
+
+ .syntax unified
+
+ .text
+
+ thumb_func_start CheckBits
+CheckBits: @ 0x08000F10
+ ldr r3, _08000F50 @ =ram_CheckBits
+ bx r3
+
+ thumb_func_start sub_08000F14
+sub_08000F14: @ 0x08000F14
+ push {r4, r5, r6}
+ movs r4, #0x1e
+_08000F18:
+ ldrsh r5, [r1, r4]
+ ldrsh r6, [r2, r4]
+ adds r5, r5, r6
+ ldrsh r6, [r3, r4]
+ adds r5, r5, r6
+ strh r5, [r0, r4]
+ subs r4, #2
+ bpl _08000F18
+ pop {r4, r5, r6}
+ bx lr
+
+ thumb_func_start sub_08000F2C
+sub_08000F2C: @ 0x08000F2C
+ push {r4, r5, r6, r7}
+ movs r4, #0x1e
+ movs r7, #0
+_08000F32:
+ ldrsh r5, [r1, r4]
+ ldrsh r6, [r2, r4]
+ adds r5, r5, r6
+ ldrsh r6, [r3, r4]
+ adds r5, r5, r6
+ bpl _08000F40
+ movs r5, #0
+_08000F40:
+ strh r5, [r0, r4]
+ adds r7, r7, r5
+ subs r4, #2
+ bpl _08000F32
+ adds r0, r7, #0
+ pop {r4, r5, r6, r7}
+ bx lr
+ .align 2, 0
+_08000F50: .4byte ram_CheckBits
diff --git a/asm/src/code_08001A7C.s b/asm/src/code_08001A7C.s
new file mode 100644
index 00000000..6e0d3a95
--- /dev/null
+++ b/asm/src/code_08001A7C.s
@@ -0,0 +1,1254 @@
+ .include "asm/macros.inc"
+ .include "constants/constants.inc"
+
+ .syntax unified
+
+ .text
+
+gUnk_08001A7C:: @ 08001A7C
+ .4byte gUnk_08001C5C
+ .4byte gUnk_08001C62
+ .4byte gUnk_08001C68
+ .4byte gUnk_08001C6E
+ .4byte gUnk_08001C74
+ .4byte gUnk_08001C6E
+ .4byte gUnk_08001C7A
+ .4byte gUnk_08001C7A
+ .4byte gUnk_08001C7A
+ .4byte gUnk_08001C80
+ .4byte gUnk_08001C86
+ .4byte gUnk_08001C8C
+ .4byte gUnk_08001C92
+ .4byte gUnk_08001C92
+ .4byte gUnk_08001C92
+ .4byte gUnk_08001C92
+ .4byte gUnk_08001C92
+ .4byte gUnk_08001C92
+ .4byte gUnk_08001C98
+ .4byte gUnk_08001C9E
+ .4byte gUnk_08001C86
+ .4byte gUnk_08001C9E
+ .4byte gUnk_08001C86
+ .4byte gUnk_08001CA4
+ .4byte gUnk_08001C9E
+ .4byte gUnk_08001C9E
+ .4byte gUnk_08001CAA
+ .4byte gUnk_08001CB0
+ .4byte gUnk_08001CB6
+ .4byte gUnk_08001C92
+ .4byte gUnk_08001C92
+ .4byte gUnk_08001C92
+ .4byte gUnk_08001CBC
+ .4byte gUnk_08001CC2
+ .4byte gUnk_08001CC2
+ .4byte gUnk_08001CC2
+ .4byte gUnk_08001CC2
+ .4byte gUnk_08001C9E
+ .4byte gUnk_08001C86
+ .4byte gUnk_08001C86
+ .4byte gUnk_08001C9E
+ .4byte gUnk_08001C86
+ .4byte gUnk_08001C86
+ .4byte gUnk_08001C86
+ .4byte gUnk_08001DAC
+ .4byte gUnk_08001C6E
+ .4byte gUnk_08001C6E
+ .4byte gUnk_08001CA4
+ .4byte gUnk_08001C9E
+ .4byte gUnk_08001C86
+ .4byte gUnk_08001C86
+ .4byte gUnk_08001C92
+ .4byte gUnk_08001CA4
+ .4byte gUnk_08001CC8
+ .4byte gUnk_08001C6E
+ .4byte gUnk_08001CCE
+ .4byte gUnk_08001CD4
+ .4byte gUnk_08001CDA
+ .4byte gUnk_08001CE0
+ .4byte gUnk_08001CE6
+ .4byte gUnk_08001CEC
+ .4byte gUnk_08001CF2
+ .4byte gUnk_08001CF8
+ .4byte gUnk_08001CFE
+ .4byte gUnk_08001D04
+ .4byte gUnk_08001D0A
+ .4byte gUnk_08001D16
+ .4byte gUnk_08001D1C
+ .4byte gUnk_08001D22
+ .4byte gUnk_08001D28
+ .4byte gUnk_08001D2E
+ .4byte gUnk_08001D34
+ .4byte gUnk_08001D3A
+ .4byte gUnk_08001D40
+ .4byte gUnk_08001D40
+ .4byte gUnk_08001D40
+ .4byte gUnk_08001D40
+ .4byte gUnk_08001D40
+ .4byte gUnk_08001D46
+ .4byte gUnk_08001D4C
+ .4byte gUnk_08001D4C
+ .4byte gUnk_08001D4C
+ .4byte gUnk_08001D4C
+ .4byte gUnk_08001D52
+ .4byte gUnk_08001D58
+ .4byte gUnk_08001D5E
+ .4byte gUnk_08001D64
+ .4byte gUnk_08001D40
+ .4byte gUnk_08001D40
+ .4byte gUnk_08001D40
+ .4byte gUnk_08001D6A
+ .4byte gUnk_08001DB8
+ .4byte gUnk_08001D40
+ .4byte gUnk_08001DBE
+ .4byte gUnk_08001D70
+ .4byte gUnk_08001D40
+ .4byte gUnk_08001D40
+ .4byte gUnk_08001D40
+ .4byte gUnk_08001D40
+ .4byte gUnk_08001D40
+ .4byte gUnk_08001D76
+ .4byte gUnk_08001DC4
+ .4byte gUnk_08001D7C
+ .4byte gUnk_08001D7C
+ .4byte gUnk_08001D7C
+ .4byte gUnk_08001D7C
+ .4byte gUnk_08001D7C
+ .4byte gUnk_08001D82
+ .4byte gUnk_08001D82
+ .4byte gUnk_08001D88
+ .4byte gUnk_08001D88
+ .4byte gUnk_08001D88
+ .4byte gUnk_08001D8E
+ .4byte gUnk_08001D8E
+ .4byte gUnk_08001D8E
+ .4byte gUnk_08001D94
+ .4byte gUnk_08001D94
+ .4byte gUnk_08001D9A
+ .4byte gUnk_08001DA0
+ .4byte gUnk_08001DA6
+
+gUnk_08001C5C:: @ 08001C5C
+ .incbin "code_080011C4/gUnk_08001C5C.bin"
+
+gUnk_08001C62:: @ 08001C62
+ .incbin "code_080011C4/gUnk_08001C62.bin"
+
+gUnk_08001C68:: @ 08001C68
+ .incbin "code_080011C4/gUnk_08001C68.bin"
+
+gUnk_08001C6E:: @ 08001C6E
+ .incbin "code_080011C4/gUnk_08001C6E.bin"
+
+gUnk_08001C74:: @ 08001C74
+ .incbin "code_080011C4/gUnk_08001C74.bin"
+
+gUnk_08001C7A:: @ 08001C7A
+ .incbin "code_080011C4/gUnk_08001C7A.bin"
+
+gUnk_08001C80:: @ 08001C80
+ .incbin "code_080011C4/gUnk_08001C80.bin"
+
+gUnk_08001C86:: @ 08001C86
+ .incbin "code_080011C4/gUnk_08001C86.bin"
+
+gUnk_08001C8C:: @ 08001C8C
+ .incbin "code_080011C4/gUnk_08001C8C.bin"
+
+gUnk_08001C92:: @ 08001C92
+ .incbin "code_080011C4/gUnk_08001C92.bin"
+
+gUnk_08001C98:: @ 08001C98
+ .incbin "code_080011C4/gUnk_08001C98.bin"
+
+gUnk_08001C9E:: @ 08001C9E
+ .incbin "code_080011C4/gUnk_08001C9E.bin"
+
+gUnk_08001CA4:: @ 08001CA4
+ .incbin "code_080011C4/gUnk_08001CA4.bin"
+
+gUnk_08001CAA:: @ 08001CAA
+ .incbin "code_080011C4/gUnk_08001CAA.bin"
+
+gUnk_08001CB0:: @ 08001CB0
+ .incbin "code_080011C4/gUnk_08001CB0.bin"
+
+gUnk_08001CB6:: @ 08001CB6
+ .incbin "code_080011C4/gUnk_08001CB6.bin"
+
+gUnk_08001CBC:: @ 08001CBC
+ .incbin "code_080011C4/gUnk_08001CBC.bin"
+
+gUnk_08001CC2:: @ 08001CC2
+ .incbin "code_080011C4/gUnk_08001CC2.bin"
+
+gUnk_08001CC8:: @ 08001CC8
+ .incbin "code_080011C4/gUnk_08001CC8.bin"
+
+gUnk_08001CCE:: @ 08001CCE
+ .incbin "code_080011C4/gUnk_08001CCE.bin"
+
+gUnk_08001CD4:: @ 08001CD4
+ .incbin "code_080011C4/gUnk_08001CD4.bin"
+
+gUnk_08001CDA:: @ 08001CDA
+ .incbin "code_080011C4/gUnk_08001CDA.bin"
+
+gUnk_08001CE0:: @ 08001CE0
+ .incbin "code_080011C4/gUnk_08001CE0.bin"
+
+gUnk_08001CE6:: @ 08001CE6
+ .incbin "code_080011C4/gUnk_08001CE6.bin"
+
+gUnk_08001CEC:: @ 08001CEC
+ .incbin "code_080011C4/gUnk_08001CEC.bin"
+
+gUnk_08001CF2:: @ 08001CF2
+ .incbin "code_080011C4/gUnk_08001CF2.bin"
+
+gUnk_08001CF8:: @ 08001CF8
+ .incbin "code_080011C4/gUnk_08001CF8.bin"
+
+gUnk_08001CFE:: @ 08001CFE
+ .incbin "code_080011C4/gUnk_08001CFE.bin"
+
+gUnk_08001D04:: @ 08001D04
+ .incbin "code_080011C4/gUnk_08001D04.bin"
+
+gUnk_08001D0A:: @ 08001D0A
+ .incbin "code_080011C4/gUnk_08001D0A.bin"
+
+gUnk_08001D16:: @ 08001D16
+ .incbin "code_080011C4/gUnk_08001D16.bin"
+
+gUnk_08001D1C:: @ 08001D1C
+ .incbin "code_080011C4/gUnk_08001D1C.bin"
+
+gUnk_08001D22:: @ 08001D22
+ .incbin "code_080011C4/gUnk_08001D22.bin"
+
+gUnk_08001D28:: @ 08001D28
+ .incbin "code_080011C4/gUnk_08001D28.bin"
+
+gUnk_08001D2E:: @ 08001D2E
+ .incbin "code_080011C4/gUnk_08001D2E.bin"
+
+gUnk_08001D34:: @ 08001D34
+ .incbin "code_080011C4/gUnk_08001D34.bin"
+
+gUnk_08001D3A:: @ 08001D3A
+ .incbin "code_080011C4/gUnk_08001D3A.bin"
+
+gUnk_08001D40:: @ 08001D40
+ .incbin "code_080011C4/gUnk_08001D40.bin"
+
+gUnk_08001D46:: @ 08001D46
+ .incbin "code_080011C4/gUnk_08001D46.bin"
+
+gUnk_08001D4C:: @ 08001D4C
+ .incbin "code_080011C4/gUnk_08001D4C.bin"
+
+gUnk_08001D52:: @ 08001D52
+ .incbin "code_080011C4/gUnk_08001D52.bin"
+
+gUnk_08001D58:: @ 08001D58
+ .incbin "code_080011C4/gUnk_08001D58.bin"
+
+gUnk_08001D5E:: @ 08001D5E
+ .incbin "code_080011C4/gUnk_08001D5E.bin"
+
+gUnk_08001D64:: @ 08001D64
+ .incbin "code_080011C4/gUnk_08001D64.bin"
+
+gUnk_08001D6A:: @ 08001D6A
+ .incbin "code_080011C4/gUnk_08001D6A.bin"
+
+gUnk_08001D70:: @ 08001D70
+ .incbin "code_080011C4/gUnk_08001D70.bin"
+
+gUnk_08001D76:: @ 08001D76
+ .incbin "code_080011C4/gUnk_08001D76.bin"
+
+gUnk_08001D7C:: @ 08001D7C
+ .incbin "code_080011C4/gUnk_08001D7C.bin"
+
+gUnk_08001D82:: @ 08001D82
+ .incbin "code_080011C4/gUnk_08001D82.bin"
+
+gUnk_08001D88:: @ 08001D88
+ .incbin "code_080011C4/gUnk_08001D88.bin"
+
+gUnk_08001D8E:: @ 08001D8E
+ .incbin "code_080011C4/gUnk_08001D8E.bin"
+
+gUnk_08001D94:: @ 08001D94
+ .incbin "code_080011C4/gUnk_08001D94.bin"
+
+gUnk_08001D9A:: @ 08001D9A
+ .incbin "code_080011C4/gUnk_08001D9A.bin"
+
+gUnk_08001DA0:: @ 08001DA0
+ .incbin "code_080011C4/gUnk_08001DA0.bin"
+
+gUnk_08001DA6:: @ 08001DA6
+ .incbin "code_080011C4/gUnk_08001DA6.bin"
+
+gUnk_08001DAC:: @ 08001DAC
+ .incbin "code_080011C4/gUnk_08001DAC.bin"
+
+gUnk_08001DB8:: @ 08001DB8
+ .incbin "code_080011C4/gUnk_08001DB8.bin"
+
+gUnk_08001DBE:: @ 08001DBE
+ .incbin "code_080011C4/gUnk_08001DBE.bin"
+
+gUnk_08001DC4:: @ 08001DC4
+ .incbin "code_080011C4/gUnk_08001DC4.bin"
+
+gUnk_08001DCC:: @ 08001DCC
+ .4byte gUnk_08001FAC
+ .4byte gUnk_08001FB4
+ .4byte gUnk_08001FBC
+ .4byte gUnk_08001FC3
+ .4byte gUnk_08001FCA
+ .4byte gUnk_08001FD1
+ .4byte gUnk_08001FD8
+ .4byte gUnk_08001FDF
+ .4byte gUnk_08001FE6
+ .4byte gUnk_08001FED
+ .4byte gUnk_08001FF8
+ .4byte gUnk_08001FFF
+ .4byte gUnk_08002006
+ .4byte gUnk_0800200D
+ .4byte gUnk_08002014
+ .4byte gUnk_0800201B
+ .4byte gUnk_08002022
+ .4byte gUnk_08002029
+ .4byte gUnk_08002030
+ .4byte gUnk_08002037
+ .4byte gUnk_0800203E
+ .4byte gUnk_08002045
+ .4byte gUnk_0800204C
+ .4byte gUnk_08002053
+ .4byte gUnk_0800205A
+ .4byte gUnk_08002061
+ .4byte gUnk_08002068
+ .4byte gUnk_08002071
+ .4byte gUnk_0800207A
+ .4byte gUnk_08002081
+ .4byte gUnk_0800208A
+ .4byte gUnk_08002091
+ .4byte gUnk_08002098
+ .4byte gUnk_0800209F
+ .4byte gUnk_080020A6
+ .4byte gUnk_080020AD
+ .4byte gUnk_080020B4
+ .4byte gUnk_080020BB
+ .4byte gUnk_080020C2
+ .4byte gUnk_080020C9
+ .4byte gUnk_080020D0
+ .4byte gUnk_080020D7
+ .4byte gUnk_080020DE
+ .4byte gUnk_080020E5
+ .4byte gUnk_080020EC
+ .4byte gUnk_080020F4
+ .4byte gUnk_080020FB
+ .4byte gUnk_08002102
+ .4byte gUnk_08002109
+ .4byte gUnk_08002110
+ .4byte gUnk_08002117
+ .4byte gUnk_0800211E
+ .4byte gUnk_08002125
+ .4byte gUnk_0800212D
+ .4byte gUnk_08002135
+ .4byte gUnk_0800213D
+ .4byte gUnk_08002144
+ .4byte gUnk_0800214B
+ .4byte gUnk_08002152
+ .4byte gUnk_0800215A
+ .4byte gUnk_08002162
+ .4byte gUnk_08002169
+ .4byte gUnk_08002170
+ .4byte gUnk_08002178
+ .4byte gUnk_08002184
+ .4byte gUnk_0800218B
+ .4byte gUnk_08002193
+ .4byte gUnk_0800219B
+ .4byte gUnk_080021A3
+ .4byte gUnk_080021AB
+ .4byte gUnk_080021B3
+ .4byte gUnk_080021BC
+ .4byte gUnk_080021C3
+ .4byte gUnk_080021CA
+ .4byte gUnk_080021D1
+ .4byte gUnk_080021D8
+ .4byte gUnk_080021E1
+ .4byte gUnk_080021E8
+ .4byte gUnk_080021F1
+ .4byte gUnk_080021F8
+ .4byte gUnk_080021FF
+ .4byte gUnk_08002206
+ .4byte gUnk_0800220D
+ .4byte gUnk_08002214
+ .4byte gUnk_0800221B
+ .4byte gUnk_08002222
+ .4byte gUnk_08002229
+ .4byte gUnk_08002230
+ .4byte gUnk_08002239
+ .4byte gUnk_08002240
+ .4byte gUnk_08002247
+ .4byte gUnk_0800224E
+ .4byte gUnk_08002255
+ .4byte gUnk_0800225C
+ .4byte gUnk_08002263
+ .4byte gUnk_0800226A
+ .4byte gUnk_08002271
+ .4byte gUnk_08002278
+ .4byte gUnk_0800227F
+ .4byte gUnk_08002286
+ .4byte gUnk_0800228D
+ .4byte gUnk_08002294
+ .4byte gUnk_0800229B
+ .4byte gUnk_080022A7
+ .4byte gUnk_080022B3
+ .4byte gUnk_080022BF
+ .4byte gUnk_080022CB
+ .4byte gUnk_080022D7
+ .4byte gUnk_080022DE
+ .4byte gUnk_080022E5
+ .4byte gUnk_080022EC
+ .4byte gUnk_080022F3
+ .4byte gUnk_080022FB
+ .4byte gUnk_08002302
+ .4byte gUnk_08002309
+ .4byte gUnk_08002310
+ .4byte gUnk_08002317
+ .4byte gUnk_0800231E
+ .4byte gUnk_08002325
+ .4byte gUnk_0800232C
+
+gUnk_08001FAC:: @ 08001FAC
+ .incbin "code_080011C4/gUnk_08001FAC.bin"
+
+gUnk_08001FB4:: @ 08001FB4
+ .incbin "code_080011C4/gUnk_08001FB4.bin"
+
+gUnk_08001FBC:: @ 08001FBC
+ .incbin "code_080011C4/gUnk_08001FBC.bin"
+
+gUnk_08001FC3:: @ 08001FC3
+ .incbin "code_080011C4/gUnk_08001FC3.bin"
+
+gUnk_08001FCA:: @ 08001FCA
+ .incbin "code_080011C4/gUnk_08001FCA.bin"
+
+gUnk_08001FD1:: @ 08001FD1
+ .incbin "code_080011C4/gUnk_08001FD1.bin"
+
+gUnk_08001FD8:: @ 08001FD8
+ .incbin "code_080011C4/gUnk_08001FD8.bin"
+
+gUnk_08001FDF:: @ 08001FDF
+ .incbin "code_080011C4/gUnk_08001FDF.bin"
+
+gUnk_08001FE6:: @ 08001FE6
+ .incbin "code_080011C4/gUnk_08001FE6.bin"
+
+gUnk_08001FED:: @ 08001FED
+ .incbin "code_080011C4/gUnk_08001FED.bin"
+
+gUnk_08001FF8:: @ 08001FF8
+ .incbin "code_080011C4/gUnk_08001FF8.bin"
+
+gUnk_08001FFF:: @ 08001FFF
+ .incbin "code_080011C4/gUnk_08001FFF.bin"
+
+gUnk_08002006:: @ 08002006
+ .incbin "code_080011C4/gUnk_08002006.bin"
+
+gUnk_0800200D:: @ 0800200D
+ .incbin "code_080011C4/gUnk_0800200D.bin"
+
+gUnk_08002014:: @ 08002014
+ .incbin "code_080011C4/gUnk_08002014.bin"
+
+gUnk_0800201B:: @ 0800201B
+ .incbin "code_080011C4/gUnk_0800201B.bin"
+
+gUnk_08002022:: @ 08002022
+ .incbin "code_080011C4/gUnk_08002022.bin"
+
+gUnk_08002029:: @ 08002029
+ .incbin "code_080011C4/gUnk_08002029.bin"
+
+gUnk_08002030:: @ 08002030
+ .incbin "code_080011C4/gUnk_08002030.bin"
+
+gUnk_08002037:: @ 08002037
+ .incbin "code_080011C4/gUnk_08002037.bin"
+
+gUnk_0800203E:: @ 0800203E
+ .incbin "code_080011C4/gUnk_0800203E.bin"
+
+gUnk_08002045:: @ 08002045
+ .incbin "code_080011C4/gUnk_08002045.bin"
+
+gUnk_0800204C:: @ 0800204C
+ .incbin "code_080011C4/gUnk_0800204C.bin"
+
+gUnk_08002053:: @ 08002053
+ .incbin "code_080011C4/gUnk_08002053.bin"
+
+gUnk_0800205A:: @ 0800205A
+ .incbin "code_080011C4/gUnk_0800205A.bin"
+
+gUnk_08002061:: @ 08002061
+ .incbin "code_080011C4/gUnk_08002061.bin"
+
+gUnk_08002068:: @ 08002068
+ .incbin "code_080011C4/gUnk_08002068.bin"
+
+gUnk_08002071:: @ 08002071
+ .incbin "code_080011C4/gUnk_08002071.bin"
+
+gUnk_0800207A:: @ 0800207A
+ .incbin "code_080011C4/gUnk_0800207A.bin"
+
+gUnk_08002081:: @ 08002081
+ .incbin "code_080011C4/gUnk_08002081.bin"
+
+gUnk_0800208A:: @ 0800208A
+ .incbin "code_080011C4/gUnk_0800208A.bin"
+
+gUnk_08002091:: @ 08002091
+ .incbin "code_080011C4/gUnk_08002091.bin"
+
+gUnk_08002098:: @ 08002098
+ .incbin "code_080011C4/gUnk_08002098.bin"
+
+gUnk_0800209F:: @ 0800209F
+ .incbin "code_080011C4/gUnk_0800209F.bin"
+
+gUnk_080020A6:: @ 080020A6
+ .incbin "code_080011C4/gUnk_080020A6.bin"
+
+gUnk_080020AD:: @ 080020AD
+ .incbin "code_080011C4/gUnk_080020AD.bin"
+
+gUnk_080020B4:: @ 080020B4
+ .incbin "code_080011C4/gUnk_080020B4.bin"
+
+gUnk_080020BB:: @ 080020BB
+ .incbin "code_080011C4/gUnk_080020BB.bin"
+
+gUnk_080020C2:: @ 080020C2
+ .incbin "code_080011C4/gUnk_080020C2.bin"
+
+gUnk_080020C9:: @ 080020C9
+ .incbin "code_080011C4/gUnk_080020C9.bin"
+
+gUnk_080020D0:: @ 080020D0
+ .incbin "code_080011C4/gUnk_080020D0.bin"
+
+gUnk_080020D7:: @ 080020D7
+ .incbin "code_080011C4/gUnk_080020D7.bin"
+
+gUnk_080020DE:: @ 080020DE
+ .incbin "code_080011C4/gUnk_080020DE.bin"
+
+gUnk_080020E5:: @ 080020E5
+ .incbin "code_080011C4/gUnk_080020E5.bin"
+
+gUnk_080020EC:: @ 080020EC
+ .incbin "code_080011C4/gUnk_080020EC.bin"
+
+gUnk_080020F4:: @ 080020F4
+ .incbin "code_080011C4/gUnk_080020F4.bin"
+
+gUnk_080020FB:: @ 080020FB
+ .incbin "code_080011C4/gUnk_080020FB.bin"
+
+gUnk_08002102:: @ 08002102
+ .incbin "code_080011C4/gUnk_08002102.bin"
+
+gUnk_08002109:: @ 08002109
+ .incbin "code_080011C4/gUnk_08002109.bin"
+
+gUnk_08002110:: @ 08002110
+ .incbin "code_080011C4/gUnk_08002110.bin"
+
+gUnk_08002117:: @ 08002117
+ .incbin "code_080011C4/gUnk_08002117.bin"
+
+gUnk_0800211E:: @ 0800211E
+ .incbin "code_080011C4/gUnk_0800211E.bin"
+
+gUnk_08002125:: @ 08002125
+ .incbin "code_080011C4/gUnk_08002125.bin"
+
+gUnk_0800212D:: @ 0800212D
+ .incbin "code_080011C4/gUnk_0800212D.bin"
+
+gUnk_08002135:: @ 08002135
+ .incbin "code_080011C4/gUnk_08002135.bin"
+
+gUnk_0800213D:: @ 0800213D
+ .incbin "code_080011C4/gUnk_0800213D.bin"
+
+gUnk_08002144:: @ 08002144
+ .incbin "code_080011C4/gUnk_08002144.bin"
+
+gUnk_0800214B:: @ 0800214B
+ .incbin "code_080011C4/gUnk_0800214B.bin"
+
+gUnk_08002152:: @ 08002152
+ .incbin "code_080011C4/gUnk_08002152.bin"
+
+gUnk_0800215A:: @ 0800215A
+ .incbin "code_080011C4/gUnk_0800215A.bin"
+
+gUnk_08002162:: @ 08002162
+ .incbin "code_080011C4/gUnk_08002162.bin"
+
+gUnk_08002169:: @ 08002169
+ .incbin "code_080011C4/gUnk_08002169.bin"
+
+gUnk_08002170:: @ 08002170
+ .incbin "code_080011C4/gUnk_08002170.bin"
+
+gUnk_08002178:: @ 08002178
+ .incbin "code_080011C4/gUnk_08002178.bin"
+
+gUnk_08002184:: @ 08002184
+ .incbin "code_080011C4/gUnk_08002184.bin"
+
+gUnk_0800218B:: @ 0800218B
+ .incbin "code_080011C4/gUnk_0800218B.bin"
+
+gUnk_08002193:: @ 08002193
+ .incbin "code_080011C4/gUnk_08002193.bin"
+
+gUnk_0800219B:: @ 0800219B
+ .incbin "code_080011C4/gUnk_0800219B.bin"
+
+gUnk_080021A3:: @ 080021A3
+ .incbin "code_080011C4/gUnk_080021A3.bin"
+
+gUnk_080021AB:: @ 080021AB
+ .incbin "code_080011C4/gUnk_080021AB.bin"
+
+gUnk_080021B3:: @ 080021B3
+ .incbin "code_080011C4/gUnk_080021B3.bin"
+
+gUnk_080021BC:: @ 080021BC
+ .incbin "code_080011C4/gUnk_080021BC.bin"
+
+gUnk_080021C3:: @ 080021C3
+ .incbin "code_080011C4/gUnk_080021C3.bin"
+
+gUnk_080021CA:: @ 080021CA
+ .incbin "code_080011C4/gUnk_080021CA.bin"
+
+gUnk_080021D1:: @ 080021D1
+ .incbin "code_080011C4/gUnk_080021D1.bin"
+
+gUnk_080021D8:: @ 080021D8
+ .incbin "code_080011C4/gUnk_080021D8.bin"
+
+gUnk_080021E1:: @ 080021E1
+ .incbin "code_080011C4/gUnk_080021E1.bin"
+
+gUnk_080021E8:: @ 080021E8
+ .incbin "code_080011C4/gUnk_080021E8.bin"
+
+gUnk_080021F1:: @ 080021F1
+ .incbin "code_080011C4/gUnk_080021F1.bin"
+
+gUnk_080021F8:: @ 080021F8
+ .incbin "code_080011C4/gUnk_080021F8.bin"
+
+gUnk_080021FF:: @ 080021FF
+ .incbin "code_080011C4/gUnk_080021FF.bin"
+
+gUnk_08002206:: @ 08002206
+ .incbin "code_080011C4/gUnk_08002206.bin"
+
+gUnk_0800220D:: @ 0800220D
+ .incbin "code_080011C4/gUnk_0800220D.bin"
+
+gUnk_08002214:: @ 08002214
+ .incbin "code_080011C4/gUnk_08002214.bin"
+
+gUnk_0800221B:: @ 0800221B
+ .incbin "code_080011C4/gUnk_0800221B.bin"
+
+gUnk_08002222:: @ 08002222
+ .incbin "code_080011C4/gUnk_08002222.bin"
+
+gUnk_08002229:: @ 08002229
+ .incbin "code_080011C4/gUnk_08002229.bin"
+
+gUnk_08002230:: @ 08002230
+ .incbin "code_080011C4/gUnk_08002230.bin"
+
+gUnk_08002239:: @ 08002239
+ .incbin "code_080011C4/gUnk_08002239.bin"
+
+gUnk_08002240:: @ 08002240
+ .incbin "code_080011C4/gUnk_08002240.bin"
+
+gUnk_08002247:: @ 08002247
+ .incbin "code_080011C4/gUnk_08002247.bin"
+
+gUnk_0800224E:: @ 0800224E
+ .incbin "code_080011C4/gUnk_0800224E.bin"
+
+gUnk_08002255:: @ 08002255
+ .incbin "code_080011C4/gUnk_08002255.bin"
+
+gUnk_0800225C:: @ 0800225C
+ .incbin "code_080011C4/gUnk_0800225C.bin"
+
+gUnk_08002263:: @ 08002263
+ .incbin "code_080011C4/gUnk_08002263.bin"
+
+gUnk_0800226A:: @ 0800226A
+ .incbin "code_080011C4/gUnk_0800226A.bin"
+
+gUnk_08002271:: @ 08002271
+ .incbin "code_080011C4/gUnk_08002271.bin"
+
+gUnk_08002278:: @ 08002278
+ .incbin "code_080011C4/gUnk_08002278.bin"
+
+gUnk_0800227F:: @ 0800227F
+ .incbin "code_080011C4/gUnk_0800227F.bin"
+
+gUnk_08002286:: @ 08002286
+ .incbin "code_080011C4/gUnk_08002286.bin"
+
+gUnk_0800228D:: @ 0800228D
+ .incbin "code_080011C4/gUnk_0800228D.bin"
+
+gUnk_08002294:: @ 08002294
+ .incbin "code_080011C4/gUnk_08002294.bin"
+
+gUnk_0800229B:: @ 0800229B
+ .incbin "code_080011C4/gUnk_0800229B.bin"
+
+gUnk_080022A7:: @ 080022A7
+ .incbin "code_080011C4/gUnk_080022A7.bin"
+
+gUnk_080022B3:: @ 080022B3
+ .incbin "code_080011C4/gUnk_080022B3.bin"
+
+gUnk_080022BF:: @ 080022BF
+ .incbin "code_080011C4/gUnk_080022BF.bin"
+
+gUnk_080022CB:: @ 080022CB
+ .incbin "code_080011C4/gUnk_080022CB.bin"
+
+gUnk_080022D7:: @ 080022D7
+ .incbin "code_080011C4/gUnk_080022D7.bin"
+
+gUnk_080022DE:: @ 080022DE
+ .incbin "code_080011C4/gUnk_080022DE.bin"
+
+gUnk_080022E5:: @ 080022E5
+ .incbin "code_080011C4/gUnk_080022E5.bin"
+
+gUnk_080022EC:: @ 080022EC
+ .incbin "code_080011C4/gUnk_080022EC.bin"
+
+gUnk_080022F3:: @ 080022F3
+ .incbin "code_080011C4/gUnk_080022F3.bin"
+
+gUnk_080022FB:: @ 080022FB
+ .incbin "code_080011C4/gUnk_080022FB.bin"
+
+gUnk_08002302:: @ 08002302
+ .incbin "code_080011C4/gUnk_08002302.bin"
+
+gUnk_08002309:: @ 08002309
+ .incbin "code_080011C4/gUnk_08002309.bin"
+
+gUnk_08002310:: @ 08002310
+ .incbin "code_080011C4/gUnk_08002310.bin"
+
+gUnk_08002317:: @ 08002317
+ .incbin "code_080011C4/gUnk_08002317.bin"
+
+gUnk_0800231E:: @ 0800231E
+ .incbin "code_080011C4/gUnk_0800231E.bin"
+
+gUnk_08002325:: @ 08002325
+ .incbin "code_080011C4/gUnk_08002325.bin"
+
+gUnk_0800232C:: @ 0800232C
+ .incbin "code_080011C4/gUnk_0800232C.bin"
+
+gUnk_0800232E:: @ 0800232E
+ .incbin "code_080011C4/gUnk_0800232E.bin"
+
+gUnk_08002342:: @ 08002342
+ .incbin "code_080011C4/gUnk_08002342.bin"
+
+ non_word_aligned_thumb_func_start sub_08002632
+sub_08002632: @ 0x08002632
+ push {r4, r5, r6, r7, lr}
+ ldr r4, _0800269C @ =gUnk_0800232E
+ ldrb r3, [r0, #8]
+ cmp r3, #3
+ beq _08002642
+ cmp r3, #7
+ bne _08002684
+ ldr r4, _080026A0 @ =gUnk_08002342
+_08002642:
+ ldrb r3, [r0, #9]
+ lsls r1, r3, #0x10
+ ldrb r3, [r0, #0xa]
+ lsls r3, r3, #8
+ orrs r1, r3
+ ldrb r3, [r0, #0xb]
+ orrs r1, r3
+ add r6, pc, #0x38
+_08002652:
+ adds r4, #6
+ ldrb r3, [r4]
+ lsls r2, r3, #0x10
+ beq _08002684
+ movs r5, #0
+ ldrb r3, [r4, #1]
+ cmp r3, #0xff
+ bne _08002664
+ movs r5, #8
+_08002664:
+ lsls r3, r3, #8
+ orrs r2, r3
+ ldrb r3, [r4, #2]
+ cmp r3, #0xff
+ bne _08002670
+ adds r5, #4
+_08002670:
+ orrs r2, r3
+ ldr r5, [r6, r5]
+ adds r3, r1, #0
+ ands r3, r5
+ ands r2, r5
+ cmp r3, r2
+ bne _08002652
+ ldrb r0, [r4, #3]
+ ldrh r1, [r4, #4]
+ pop {r4, r5, r6, r7, pc}
+_08002684:
+ movs r0, #0
+ movs r1, #0
+ pop {r4, r5, r6, r7, pc}
+ .align 2, 0
+_0800268C:
+ .byte 0xFF, 0xFF, 0xFF, 0x00
+ .byte 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00
+_0800269C: .4byte gUnk_0800232E
+_080026A0: .4byte gUnk_08002342
+
+gUnk_080026A4::
+@ normal entities
+ .4byte gUnk_020000B0 @ enemy target? (player)
+ .4byte gEntityLists - 8 @ first linked list
+ .4byte gEntityLists + 64 @ last linked list
+ .4byte ram_sub_080B2248 @ entity table
+@ managers
+ .4byte gUnk_020000B0
+ .4byte gEntityLists + 56
+ .4byte gCollidableCount
+ .4byte ram_sub_080B2248
+
+ thumb_func_start sub_080026C4
+sub_080026C4: @ 0x080026C4
+ push {r4, r5, r6, lr}
+ lsrs r4, r3, #3
+ lsls r4, r4, #6
+ adds r1, r1, r4
+ movs r6, #0xf0
+ lsls r4, r3, #0x1d
+ lsrs r4, r4, #0x1e
+ blo _080026D8
+ movs r6, #0xf
+ adds r2, #0x10
+_080026D8:
+ adds r1, r1, r4
+ movs r3, #0x10
+_080026DC:
+ ldrb r4, [r0]
+ ldrb r4, [r2, r4]
+ ldrb r5, [r1]
+ ands r5, r6
+ orrs r5, r4
+ strb r5, [r1]
+ adds r1, #4
+ adds r0, #8
+ subs r3, #1
+ bne _080026DC
+ pop {r4, r5, r6, pc}
+
+ non_word_aligned_thumb_func_start sub_080026F2
+sub_080026F2: @ 0x080026F2
+ push {r4, r5, r6, lr}
+ lsrs r4, r3, #3
+ lsls r4, r4, #6
+ adds r1, r1, r4
+ movs r6, #0xf0
+ lsls r4, r3, #0x1d
+ lsrs r4, r4, #0x1e
+ blo _08002706
+ movs r6, #0xf
+ adds r2, #0x10
+_08002706:
+ adds r1, r1, r4
+ movs r3, #0x10
+_0800270A:
+ ldrb r4, [r0]
+ ldrb r4, [r2, r4]
+ cmp r4, #0
+ beq _0800271A
+ ldrb r5, [r1]
+ ands r5, r6
+ orrs r5, r4
+ strb r5, [r1]
+_0800271A:
+ adds r1, #4
+ adds r0, #8
+ subs r3, #1
+ bne _0800270A
+ pop {r4, r5, r6, pc}
+
+ thumb_func_start sub_08002724
+sub_08002724: @ 0x08002724
+ push {r4, r5, lr}
+ movs r2, #0x10
+ movs r3, #0xf
+_0800272A:
+ ldrb r4, [r0]
+ lsrs r5, r4, #4
+ ands r4, r3
+ strb r4, [r1]
+ strb r5, [r1, #1]
+ ldrb r4, [r0, #1]
+ lsrs r5, r4, #4
+ ands r4, r3
+ strb r4, [r1, #2]
+ strb r5, [r1, #3]
+ ldrb r4, [r0, #2]
+ lsrs r5, r4, #4
+ ands r4, r3
+ strb r4, [r1, #4]
+ strb r5, [r1, #5]
+ ldrb r4, [r0, #3]
+ lsrs r5, r4, #4
+ ands r4, r3
+ strb r4, [r1, #6]
+ strb r5, [r1, #7]
+ adds r0, #4
+ adds r1, #8
+ subs r2, #1
+ bne _0800272A
+ pop {r4, r5, pc}
+
+gUnk_0800275C::
+ .byte 0x06, 0x00, 0x06, 0x60
+ .byte 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x00, 0x60, 0x60, 0x60
+ .byte 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x60, 0x06
+ .byte 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x00, 0x06, 0x06, 0x06
+ .byte 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06
+
+ thumb_func_start GetNextFunction
+GetNextFunction: @ 0x0800279C
+ movs r1, #0x3a
+ ldrb r3, [r0, r1]
+ movs r2, #4
+ ands r2, r3
+ bne _080027AE
+ movs r1, #0x41
+ ldrb r2, [r0, r1]
+ lsrs r2, r2, #7
+ bne _080027CE
+_080027AE:
+ movs r1, #0x42
+ ldrb r2, [r0, r1]
+ cmp r2, #0
+ bne _080027D2
+ movs r1, #0x45
+ ldrb r2, [r0, r1]
+ cmp r2, #0
+ beq _080027D6
+ lsrs r2, r3, #3
+ bhs _080027E2
+ movs r1, #0x43
+ ldrb r2, [r0, r1]
+ cmp r2, #0
+ bne _080027E6
+_080027CA:
+ movs r0, #0
+ bx lr
+_080027CE:
+ movs r0, #1
+ bx lr
+_080027D2:
+ movs r0, #2
+ bx lr
+_080027D6:
+ ldrb r2, [r0, #0xc]
+ ldrb r0, [r0, #0xd]
+ orrs r0, r2
+ beq _080027CA
+ movs r0, #3
+ bx lr
+_080027E2:
+ movs r0, #5
+ bx lr
+_080027E6:
+ movs r0, #4
+ bx lr
+
+ non_word_aligned_thumb_func_start sub_080027EA
+sub_080027EA: @ 0x080027EA
+ push {r4, r5, r6, r7, lr}
+ movs r3, #0x80
+ tst r2, r3
+ bne _08002860
+ movs r4, #0x2a
+ ldrh r3, [r0, r4]
+ movs r4, #7
+ tst r2, r4
+ bne _08002812
+ push {r0, r1, r2, r3}
+ adds r0, r2, #0
+ adds r1, r3, #0
+ bl sub_08002864
+ adds r4, r0, #0
+ pop {r0, r1, r2, r3}
+ cmp r2, r4
+ beq _08002812
+ adds r2, r4, #0
+ ldr r1, _0800296C @ =0x00000100
+_08002812:
+ ldr r4, _08002970 @ =gUnk_0800275C
+ lsls r2, r2, #1
+ ldrh r4, [r4, r2]
+ lsls r2, r2, #3
+ ands r3, r4
+ ldr r4, _08002974 @ =0x0000EE00
+ tst r3, r4
+ bne _0800283E
+ push {r0, r1, r2, r3}
+ ldr r4, _08002978 @ =gSineTable
+ ldrh r0, [r4, r2]
+ cmp r0, #0
+ beq _08002834
+ adds r6, #1
+ bl FixedMul
+ lsls r0, r0, #8
+_08002834:
+ adds r4, r0, #0
+ pop {r0, r1, r2, r3}
+ ldr r5, [r0, #0x2c]
+ adds r5, r5, r4
+ str r5, [r0, #0x2c]
+_0800283E:
+ movs r4, #0xee
+ tst r3, r4
+ bne _08002860
+ push {r0, r1, r2, r3}
+ ldr r4, _0800297C @ =gCosineTable
+ ldrh r0, [r4, r2]
+ cmp r0, #0
+ beq _08002856
+ adds r6, #2
+ bl FixedMul
+ lsls r0, r0, #8
+_08002856:
+ adds r4, r0, #0
+ pop {r0, r1, r2, r3}
+ ldr r5, [r0, #0x30]
+ subs r5, r5, r4
+ str r5, [r0, #0x30]
+_08002860:
+ adds r1, r6, #0
+ pop {r4, r5, r6, r7, pc}
+
+ thumb_func_start sub_08002864
+sub_08002864: @ 0x08002864
+ adds r2, r0, #0
+ lsrs r2, r2, #3
+ cmp r2, #0
+ beq _080028A8
+ subs r2, #1
+ beq _0800288E
+ subs r2, #1
+ beq _080028C2
+ ldr r3, _08002980 @ =0x00000E00
+ ands r3, r1
+ bne _0800287C
+ bx lr
+_0800287C:
+ movs r2, #0
+ ldr r3, _08002984 @ =0x0000020E
+ tst r3, r1
+ beq _080028DC
+ movs r2, #0x10
+ ldr r3, _08002988 @ =0x000004E0
+ tst r3, r1
+ beq _080028DC
+ bx lr
+_0800288E:
+ ldr r3, _0800298C @ =0x0000E000
+ ands r3, r1
+ bne _08002896
+ bx lr
+_08002896:
+ movs r2, #0
+ ldr r3, _08002990 @ =0x0000200E
+ tst r3, r1
+ beq _080028DC
+ movs r2, #0x10
+ ldr r3, _08002994 @ =0x000040E0
+ tst r3, r1
+ beq _080028DC
+ bx lr
+_080028A8:
+ movs r3, #0xe
+ ands r3, r1
+ bne _080028B0
+ bx lr
+_080028B0:
+ movs r2, #8
+ ldr r3, _08002998 @ =0x0000E004
+ tst r3, r1
+ beq _080028DC
+ movs r2, #0x18
+ ldr r3, _0800299C @ =0x00000E02
+ tst r3, r1
+ beq _080028DC
+ bx lr
+_080028C2:
+ movs r3, #0xe0
+ ands r3, r1
+ bne _080028CA
+ bx lr
+_080028CA:
+ movs r2, #8
+ ldr r3, _080029A0 @ =0x0000E040
+ tst r3, r1
+ beq _080028DC
+ movs r2, #0x18
+ ldr r3, _080029A4 @ =0x00000E20
+ tst r3, r1
+ beq _080028DC
+ bx lr
+_080028DC:
+ adds r0, r2, #0
+ bx lr
+
+ thumb_func_start sub_080028E0
+sub_080028E0: @ 0x080028E0
+ movs r1, #0x3d
+ movs r3, #1
+ ldrsb r2, [r0, r1]
+ cmp r2, #0
+ beq _080028F2
+ bmi _080028EE
+ rsbs r3, r3, #0
+_080028EE:
+ adds r2, r2, r3
+ strb r2, [r0, r1]
+_080028F2:
+ bx lr
+
+ thumb_func_start GetRandomByWeight
+GetRandomByWeight: @ 0x080028F4
+ push {r4, lr}
+ adds r4, r0, #0
+ bl Random
+ lsls r0, r0, #0x18
+ lsrs r0, r0, #0x18
+ movs r1, #0
+_08002902:
+ ldrb r2, [r4, r1]
+ adds r1, #1
+ subs r0, r0, r2
+ bpl _08002902
+ subs r0, r1, #1
+ pop {r4, pc}
+
+ non_word_aligned_thumb_func_start CheckRectOnScreen
+CheckRectOnScreen: @ 0x0800290E
+ push {r4, r5, r6, lr}
+ ldr r4, _080029A8 @ =gRoomControls
+ ldrh r5, [r4, #0xa]
+ ldrh r6, [r4, #6]
+ subs r5, r5, r6
+ subs r5, r5, r2
+ subs r0, r0, r5
+ lsls r2, r2, #1
+ adds r2, #0xf0
+ cmp r0, r2
+ bhs _0800293A
+ ldrh r5, [r4, #0xc]
+ ldrh r6, [r4, #8]
+ subs r5, r5, r6
+ subs r5, r5, r3
+ subs r1, r1, r5
+ lsls r3, r3, #1
+ adds r3, #0xa0
+ cmp r1, r3
+ bhs _0800293A
+ movs r0, #1
+ pop {r4, r5, r6, pc}
+_0800293A:
+ movs r0, #0
+ pop {r4, r5, r6, pc}
+
+ non_word_aligned_thumb_func_start CheckPlayerInRegion
+CheckPlayerInRegion: @ 0x0800293E
+ push {r4, r5, r6, r7, lr}
+ ldr r4, _080029AC @ =gRoomControls
+ ldr r7, _080029B0 @ =gPlayerEntity
+ ldrh r6, [r4, #6]
+ ldrh r5, [r7, #0x2e]
+ subs r5, r5, r6
+ subs r5, r5, r2
+ subs r0, r0, r5
+ lsls r2, r2, #1
+ cmp r0, r2
+ bhs _08002968
+ ldrh r6, [r4, #8]
+ ldrh r5, [r7, #0x32]
+ subs r5, r5, r6
+ subs r5, r5, r3
+ subs r1, r1, r5
+ lsls r3, r3, #1
+ cmp r1, r3
+ bhs _08002968
+ movs r0, #1
+ pop {r4, r5, r6, r7, pc}
+_08002968:
+ movs r0, #0
+ pop {r4, r5, r6, r7, pc}
+ .align 2, 0
+_0800296C: .4byte 0x00000100
+_08002970: .4byte gUnk_0800275C
+_08002974: .4byte 0x0000EE00
+_08002978: .4byte gSineTable
+_0800297C: .4byte gCosineTable
+_08002980: .4byte 0x00000E00
+_08002984: .4byte 0x0000020E
+_08002988: .4byte 0x000004E0
+_0800298C: .4byte 0x0000E000
+_08002990: .4byte 0x0000200E
+_08002994: .4byte 0x000040E0
+_08002998: .4byte 0x0000E004
+_0800299C: .4byte 0x00000E02
+_080029A0: .4byte 0x0000E040
+_080029A4: .4byte 0x00000E20
+_080029A8: .4byte gRoomControls
+_080029AC: .4byte gRoomControls
+_080029B0: .4byte gPlayerEntity
diff --git a/asm/src/code_08003FC4.s b/asm/src/code_08003FC4.s
new file mode 100644
index 00000000..718c0306
--- /dev/null
+++ b/asm/src/code_08003FC4.s
@@ -0,0 +1,677 @@
+ .include "asm/macros.inc"
+ .include "constants/constants.inc"
+
+ .syntax unified
+
+ .text
+
+ thumb_func_start GravityUpdate
+GravityUpdate: @ 0x08003FC4
+ @ r0 = Entity*
+ @ r1 = Gravity strength
+ @ returns z pos
+
+ adds r3, r0, #0
+ ldr r0, [r3, #0x34]
+ ldr r2, [r3, #0x20]
+ subs r0, r0, r2
+ bpl _08003FD6
+ subs r2, r2, r1
+ str r0, [r3, #0x34]
+ str r2, [r3, #0x20]
+ bx lr
+_08003FD6:
+ movs r0, #0
+ str r0, [r3, #0x34]
+ str r0, [r3, #0x20]
+ bx lr
+
+ non_word_aligned_thumb_func_start sub_08003FDE
+sub_08003FDE: @ 0x08003FDE
+ push {r0, lr}
+ bl sub_08003FF2
+ cmp r0, #0
+ pop {r2}
+ beq _08003FF0
+ adds r0, r2, #0
+ bl sub_0806F58C
+_08003FF0:
+ pop {pc}
+
+ non_word_aligned_thumb_func_start sub_08003FF2
+sub_08003FF2: @ 0x08003FF2
+ push {r4, r5, r6, r7, lr}
+ ldr r4, [r1, #0x48]
+ ldrb r5, [r4, #6]
+ ldrb r6, [r4, #7]
+ adds r2, r2, r5
+ adds r3, r3, r6
+ ldrh r5, [r1, #0x2e]
+ movs r7, #0
+ ldrsb r7, [r4, r7]
+ ldrb r6, [r1, #0x18]
+ lsrs r6, r6, #3
+ blo _0800400C
+ rsbs r7, r7, #0
+_0800400C:
+ adds r5, r5, r7
+ ldrh r6, [r1, #0x32]
+ movs r7, #1
+ ldrsb r7, [r4, r7]
+ adds r6, r6, r7
+ movs r4, #0x38
+ ldrb r7, [r0, r4]
+ ldrb r4, [r1, r4]
+ ands r7, r4
+ movs r4, #3
+ cmp r7, r4
+ beq _08004048
+ cmp r2, #0
+ beq _08004034
+ ldrh r4, [r0, #0x2e]
+ subs r4, r4, r5
+ adds r4, r4, r2
+ lsls r2, r2, #1
+ cmp r2, r4
+ blo _08004048
+_08004034:
+ cmp r3, #0
+ beq _08004044
+ ldrh r4, [r0, #0x32]
+ subs r4, r4, r6
+ adds r4, r4, r3
+ lsls r3, r3, #1
+ cmp r3, r4
+ blo _08004048
+_08004044:
+ movs r0, #1
+ pop {r4, r5, r6, r7, pc}
+_08004048:
+ movs r0, #0
+ pop {r4, r5, r6, r7, pc}
+
+ thumb_func_start DrawEntity
+DrawEntity: @ 0x0800404C
+ push {r4, r5, lr}
+ adds r4, r0, #0
+ ldrb r1, [r0, #0x18]
+ movs r2, #3
+ ands r1, r2
+ beq _0800409A
+ cmp r1, #3
+ beq _08004064
+ bl sub_080040A2
+ cmp r0, #0
+ beq _0800409A
+_08004064:
+ ldrb r1, [r4, #0x19]
+ movs r2, #0xc0
+ ands r1, r2
+ lsrs r1, r1, #4
+ ldr r2, _08004358 @ =gUnk_081326EC
+ ldr r1, [r2, r1]
+ ldrb r2, [r1]
+ cmp r2, #0x40
+ bhs _0800407E
+ adds r2, #1
+ strb r2, [r1]
+ lsls r2, r2, #2
+ str r4, [r1, r2]
+_0800407E:
+ movs r2, #0
+ ldr r1, _0800435C @ =gUnk_02024048
+ ldrb r5, [r1]
+ strb r2, [r1]
+ cmp r5, #0
+ beq _080040A0
+ ldr r4, _08004360 @ =gUnk_02021F20
+_0800408C:
+ ldrh r0, [r4]
+ bl SoundReq
+ adds r4, #2
+ subs r5, #1
+ bne _0800408C
+ pop {r4, r5, pc}
+_0800409A:
+ ldr r1, _08004364 @ =gUnk_02024048
+ movs r2, #0
+ strb r2, [r1]
+_080040A0:
+ pop {r4, r5, pc}
+
+ non_word_aligned_thumb_func_start sub_080040A2
+sub_080040A2: @ 0x080040A2
+ ldrb r1, [r0, #0x18]
+ lsrs r1, r1, #2
+ bhs _080040D0
+
+ thumb_func_start CheckOnScreen
+CheckOnScreen: @ 0x080040A8
+ ldr r1, _08004368 @ =gRoomControls
+ movs r2, #0x2e
+ ldrsh r2, [r0, r2]
+ ldrh r3, [r1, #0xa]
+ subs r2, r2, r3
+ adds r2, #0x3f
+ ldr r3, _0800436C @ =0x0000016E
+ cmp r2, r3
+ bhs _080040D4
+ movs r2, #0x32
+ ldrsh r2, [r0, r2]
+ ldrh r3, [r1, #0xc]
+ subs r2, r2, r3
+ movs r3, #0x36
+ ldrsh r3, [r0, r3]
+ adds r2, r2, r3
+ adds r2, #0x3f
+ ldr r3, _08004370 @ =0x0000011E
+ cmp r2, r3
+ bhs _080040D4
+_080040D0:
+ movs r0, #1
+ bx lr
+_080040D4:
+ movs r0, #0
+ bx lr
+
+ thumb_func_start sub_080040D8
+sub_080040D8: @ 0x080040D8
+ push {lr}
+ bl _080040F2
+ adds r0, r2, #0
+ pop {pc}
+
+ non_word_aligned_thumb_func_start sub_080040E2
+sub_080040E2: @ 0x080040E2
+ push {lr}
+ bl sub_080040EC
+ adds r0, r2, #0
+ pop {pc}
+
+ thumb_func_start sub_080040EC
+sub_080040EC: @ 0x080040EC
+ ldrh r2, [r0, #0x2e]
+ ldrh r3, [r0, #0x32]
+ b _080040F2
+_080040F2:
+ push {r2, r3, r4, lr}
+ ldr r4, _08004374 @ =gRoomControls + 6
+ ldrh r4, [r4]
+ subs r2, r2, r4
+ ldr r4, _08004378 @ =gRoomControls + 8
+ ldrh r4, [r4]
+ subs r3, r3, r4
+ ldr r4, _0800437C @ =0x000003F0
+ ands r2, r4
+ ands r3, r4
+ lsrs r2, r2, #4
+ lsls r3, r3, #2
+ adds r2, r2, r3
+ movs r3, #0x38
+ ldrb r3, [r0, r3]
+ lsls r3, r3, #2
+ ldr r4, _08004380 @ =gUnk_08000248
+ ldr r3, [r4, r3]
+ ldrb r4, [r3, r2]
+ pop {r2, r3}
+ cmp r4, #0x10
+ bhs _0800412C
+ lsrs r3, r3, #4
+ bhs _08004124
+ lsrs r4, r4, #2
+_08004124:
+ lsrs r2, r2, #4
+ bhs _08004162
+ lsrs r4, r4, #1
+ b _08004162
+_0800412C:
+ cmp r4, #0xff
+ beq _08004162
+ subs r4, #0x10
+ lsls r4, r4, #1
+ ldrh r4, [r1, r4]
+ movs r1, #0xf
+ ands r1, r2
+ cmp r1, #4
+ blo _0800414C
+ lsrs r4, r4, #1
+ cmp r1, #8
+ blo _0800414C
+ lsrs r4, r4, #1
+ cmp r1, #0xc
+ blo _0800414C
+ lsrs r4, r4, #1
+_0800414C:
+ movs r1, #0xf
+ ands r1, r3
+ cmp r1, #4
+ blo _08004162
+ lsrs r4, r4, #4
+ cmp r1, #8
+ blo _08004162
+ lsrs r4, r4, #4
+ cmp r1, #0xc
+ blo _08004162
+ lsrs r4, r4, #4
+_08004162:
+ movs r2, #1
+ ands r2, r4
+ pop {r4, pc}
+
+ thumb_func_start sub_08004168
+sub_08004168: @ 0x08004168
+ ldr r3, _08004384 @ =0x000FFFFF
+ ldr r1, _08004388 @ =0x00080000
+ ldr r2, [r0, #0x2c]
+ bics r2, r3
+ adds r2, r2, r1
+ str r2, [r0, #0x2c]
+ ldr r2, [r0, #0x30]
+ bics r2, r3
+ adds r2, r2, r1
+ str r2, [r0, #0x30]
+ bx lr
+
+ non_word_aligned_thumb_func_start sub_0800417E
+sub_0800417E: @ 0x0800417E
+ ldrb r2, [r0, #0x15]
+ ldr r3, _0800438C @ =0x0000EE00
+ tst r1, r3
+ beq _0800418A
+ movs r3, #0x20
+ subs r2, r3, r2
+_0800418A:
+ movs r3, #0xee
+ tst r1, r3
+ beq _08004194
+ movs r3, #0x10
+ subs r2, r3, r2
+_08004194:
+ movs r3, #0x1f
+ ands r2, r3
+ strb r2, [r0, #0x15]
+ bx lr
+
+ thumb_func_start sub_0800419C
+sub_0800419C: @ 0x0800419C
+ push {r5, r6, lr}
+ b _080041B0
+
+ thumb_func_start EntityInRectRadius
+EntityInRectRadius: @ 0x080041A0
+ push {r5, r6, lr}
+ movs r6, #0x38
+ ldrb r5, [r0, r6]
+ ldrb r6, [r1, r6]
+ ands r5, r6
+ movs r6, #3
+ tst r5, r6
+ beq _080041D8
+_080041B0:
+ cmp r2, #0
+ beq _080041C2
+ ldrh r5, [r0, #0x2e]
+ ldrh r6, [r1, #0x2e]
+ subs r5, r5, r6
+ adds r5, r5, r2
+ lsls r2, r2, #1
+ cmp r2, r5
+ blo _080041D8
+_080041C2:
+ cmp r3, #0
+ beq _080041D4
+ ldrh r5, [r0, #0x32]
+ ldrh r6, [r1, #0x32]
+ subs r5, r5, r6
+ adds r5, r5, r3
+ lsls r3, r3, #1
+ cmp r3, r5
+ blo _080041D8
+_080041D4:
+ movs r0, #1
+ pop {r5, r6, pc}
+_080041D8:
+ movs r0, #0
+ pop {r5, r6, pc}
+
+ thumb_func_start sub_080041DC
+sub_080041DC: @ 0x080041DC
+ push {r1, r2}
+ movs r2, #0x32
+ ldrsh r1, [r0, r2]
+ movs r3, #0x2e
+ ldrsh r0, [r0, r3]
+ pop {r2, r3}
+
+ thumb_func_start sub_080041E8
+sub_080041E8: @ 0x080041E8
+ subs r0, r0, r2
+ subs r1, r1, r3
+
+ thumb_func_start sub_080041EC
+sub_080041EC: @ 0x080041EC
+ adds r2, r0, #0
+ muls r0, r2, r0
+ adds r3, r1, #0
+ muls r1, r3, r1
+ push {lr}
+ adds r0, r0, r1
+ lsls r0, r0, #8
+ bl Sqrt
+ pop {r3}
+ bx r3
+
+ non_word_aligned_thumb_func_start sub_08004202
+sub_08004202: @ 0x08004202
+ push {r1, lr}
+ ldrb r1, [r0, #0x14]
+ bl sub_08004212
+ pop {r0}
+ str r1, [r0]
+ adds r0, r2, #0
+ pop {pc}
+
+ non_word_aligned_thumb_func_start sub_08004212
+sub_08004212: @ 0x08004212
+ push {r4}
+ adds r4, r1, #0
+ movs r3, #3
+ tst r4, r3
+ beq _08004226
+ movs r3, #2
+ lsrs r4, r4, #3
+ blo _08004224
+ rsbs r3, r3, #0
+_08004224:
+ adds r2, r2, r3
+_08004226:
+ adds r4, r1, #0
+ movs r3, #3
+ ands r4, r3
+ cmp r4, #2
+ beq _0800423C
+ movs r3, #0x80
+ adds r1, #1
+ lsrs r1, r1, #3
+ bhs _0800423A
+ rsbs r3, r3, #0
+_0800423A:
+ adds r2, r2, r3
+_0800423C:
+ ldr r3, _08004390 @ =0x00001FFF
+ ands r2, r3
+ movs r4, #0x38
+ ldrb r4, [r0, r4]
+ lsls r4, r4, #3
+ ldr r3, _08004394 @ =gUnk_08000228
+ adds r3, r3, r4
+ ldr r4, [r3]
+ ldrh r1, [r4, r2]
+ ldr r4, _08004398 @ =0x00004000
+ tst r1, r4
+ bne _0800425C
+ lsls r1, r1, #0x11
+ lsrs r1, r1, #0x10
+ ldr r4, [r3, #4]
+ ldrh r1, [r4, r1]
+_0800425C:
+ pop {r4}
+ bx lr
+
+ thumb_func_start InitializeAnimation @ r0 = Entity*, r1 = Frame*
+InitializeAnimation: @ 0x08004260
+ movs r2, #0x58 @ anim idx
+ strb r1, [r0, r2]
+
+ ldrh r3, [r0, #0x12] @ Sprite idx
+ lsls r3, r3, #4 @ *= 16
+
+ ldr r2, _0800439C @ =gSpritePtrs
+
+ ldr r2, [r2, r3] @ Load AnimData
+ lsls r1, r1, #2 @ *= 4
+
+ ldr r1, [r2, r1] @ AnimData->???
+ str r1, [r0, #0x5c]
+ b FrameZero
+
+ thumb_func_start GetNextFrame
+GetNextFrame: @ 0x08004274
+ movs r1, #1
+
+ non_word_aligned_thumb_func_start UpdateAnimationVariableFrames
+UpdateAnimationVariableFrames: @ 0x08004276
+ movs r3, #0x59
+ ldrb r2, [r0, r3] @ Decrease frame timer
+ subs r2, r2, r1
+
+ beq FrameZero @ Frame timer is 0
+ ble FrameNeg @ Frame timer is below 0
+
+ strb r2, [r0, r3]
+
+ bx lr
+
+FrameNeg:
+ ldr r1, [r0, #0x5c] @ Load frame data
+
+_08004286:
+ ldrb r3, [r1, #1]
+ adds r2, r2, r3
+
+ bgt _0800429C @ Frame idx greater (?)
+
+ ldrb r3, [r1, #3]
+ adds r1, #4
+ lsrs r3, r3, #8 @ Branch if != 0xFF
+
+ blo _08004286
+
+ ldrb r3, [r1]
+ lsls r3, r3, #2
+ subs r1, r1, r3
+ b _08004286
+
+_0800429C:
+ str r1, [r0, #0x5c]
+
+ push {r2, lr}
+ bl FrameZero
+ pop {r2, r3}
+
+ movs r1, #0x59
+ strb r2, [r0, r1]
+ bx r3
+
+ thumb_func_start InitAnimationForceUpdate
+InitAnimationForceUpdate: @ 0x080042AC
+ push {lr}
+ bl InitializeAnimation
+ movs r2, #0xff
+ strb r2, [r0, #0x1f]
+ b _080042C0
+
+ thumb_func_start UpdateAnimationSingleFrame
+UpdateAnimationSingleFrame: @ 0x080042B8
+ movs r1, #1
+
+ non_word_aligned_thumb_func_start sub_080042BA
+sub_080042BA: @ 0x080042BA
+ push {lr}
+ bl UpdateAnimationVariableFrames
+
+_080042C0:
+ pop {r1}
+ mov lr, r1
+
+ ldrb r1, [r0, #0x1e]
+ ldrb r3, [r0, #0x1f]
+ strb r1, [r0, #0x1f]
+
+ cmp r1, r3
+ beq _08004328
+
+ ldrh r2, [r0, #0x12]
+
+ thumb_func_start sub_080042D0
+sub_080042D0: @ 0x080042D0
+ cmp r1, #0xff
+ beq _08004328
+
+ lsls r2, r2, #4
+ lsls r3, r1, #2
+ ldr r1, _080043A0 @ =gSpritePtrs
+ adds r1, r1, r2
+ ldr r2, [r1, #4]
+
+ cmp r2, #0
+ beq _08004328
+
+ ldr r1, [r1, #8]
+ adds r2, r2, r3
+ ldrb r3, [r2]
+ cmp r3, #0
+ beq _08004328
+ push {r4, r5}
+ movs r3, #0x26
+ ldrb r3, [r0, r3]
+ movs r4, #0xc
+ muls r3, r4, r3
+ ldr r4, _080043A4 @ =gUnk_02024494
+ adds r4, r4, r3
+ ldrb r3, [r4]
+ movs r5, #0xf
+ ands r3, r5
+ cmp r3, #5
+ blo _08004326
+ ldrb r5, [r4, #6]
+ ldrb r3, [r2]
+ strb r3, [r4, #6]
+ subs r5, r5, r3
+ ldrh r3, [r2, #2]
+ lsls r3, r3, #5
+ adds r1, r1, r3
+ ldr r2, [r4, #8]
+ str r1, [r4, #8]
+ subs r2, r2, r1
+ orrs r5, r2
+ beq _08004326
+ movs r2, #0xf0
+ ldrb r1, [r4]
+ bics r1, r2
+ adds r1, #0x30
+ strb r1, [r4]
+_08004326:
+ pop {r4, r5}
+_08004328:
+ bx lr
+
+FrameZero: @ r0 = Entity*
+ ldrb r3, [r0, #0x1e] @ Get frame idx
+ strb r3, [r0, #0x1f] @ Set it to last frame idx
+
+ ldr r1, [r0, #0x5c]
+ ldrb r3, [r1] @ Store new frame idx
+ strb r3, [r0, #0x1e]
+
+ ldrb r3, [r1, #1]
+ movs r2, #0x59
+ strb r3, [r0, r2]
+
+ ldrb r3, [r1, #2]
+ movs r2, #0x5b
+ strb r3, [r0, r2]
+
+ ldrb r3, [r1, #3]
+ movs r2, #0x5a
+ strb r3, [r0, r2]
+
+ adds r1, #4
+ lsrs r3, r3, #8
+
+ blo _08004352
+
+ ldrb r3, [r1]
+ lsls r3, r3, #2
+ subs r1, r1, r3
+
+_08004352:
+ str r1, [r0, #0x5c]
+ bx lr
+ .align 2, 0
+
+_08004358: .4byte gUnk_081326EC
+_0800435C: .4byte gUnk_02024048
+_08004360: .4byte gUnk_02021F20
+_08004364: .4byte gUnk_02024048
+_08004368: .4byte gRoomControls
+_0800436C: .4byte 0x0000016E
+_08004370: .4byte 0x0000011E
+_08004374: .4byte gRoomControls + 6
+_08004378: .4byte gRoomControls + 8
+_0800437C: .4byte 0x000003F0
+_08004380: .4byte gUnk_08000248
+_08004384: .4byte 0x000FFFFF
+_08004388: .4byte 0x00080000
+_0800438C: .4byte 0x0000EE00
+_08004390: .4byte 0x00001FFF
+_08004394: .4byte gUnk_08000228
+_08004398: .4byte 0x00004000
+_0800439C: .4byte gSpritePtrs
+_080043A0: .4byte gSpritePtrs
+_080043A4: .4byte gUnk_02024494
+
+ thumb_func_start sub_080043A8
+sub_080043A8: @ 0x080043A8
+ movs r1, #0xb
+ b _080043B6
+
+ thumb_func_start CreateChestSpawner
+CreateChestSpawner: @ 0x080043AC
+ movs r1, #0xc
+ b _080043B6
+
+ thumb_func_start sub_080043B0
+sub_080043B0: @ 0x080043AC
+ movs r1, #0x52
+ b _080043B6
+
+ thumb_func_start CreateItemOnGround
+CreateItemOnGround: @ 0x080043B4
+ movs r1, #0
+
+_080043B6:
+ push {r4, lr}
+ adds r4, r0, #0
+ movs r0, #0xf
+ movs r2, #0
+ bl CreateObject
+
+ cmp r0, #0
+ beq _080043E0 @ Branch if entity could not be created
+
+ movs r1, #0x48
+ ldr r1, [r4, r1] @ Unused?
+
+ ldrh r3, [r4, #0x2e]
+ strh r3, [r0, #0x2e]
+
+ ldrh r3, [r4, #0x32]
+ strh r3, [r0, #0x32]
+
+ ldrh r3, [r4, #0x36]
+ strh r3, [r0, #0x36]
+
+ ldrb r3, [r4, #8]
+
+ cmp r3, #3 @ Is the spawner an enemy?
+ bne _080043E0
+
+ movs r1, #1
+ strb r1, [r0, #0xb] @ Set base parameter
+
+_080043E0:
+ adds r0, r4, #0
+ bl DeleteEntity
+
+ pop {r4, pc}
diff --git a/asm/src/code_080043E8.s b/asm/src/code_080043E8.s
new file mode 100644
index 00000000..8ce6abb5
--- /dev/null
+++ b/asm/src/code_080043E8.s
@@ -0,0 +1,408 @@
+ .include "asm/macros.inc"
+ .include "constants/constants.inc"
+
+ .syntax unified
+
+ .text
+
+ thumb_func_start sub_080043E8
+sub_080043E8: @ 0x080043E8
+ push {r4, lr}
+ ldrb r1, [r0, #0xc]
+ cmp r1, #0
+ beq _08004414
+ adds r4, r0, #0
+ bl sub_08016AD2
+ movs r3, #0x36
+ ldrsh r2, [r4, r3]
+ cmp r2, #0
+ bmi _08004414
+ cmp r0, #0
+ beq _08004414
+ add r3, pc, #0x10
+_08004404:
+ adds r3, #4
+ ldrh r1, [r3]
+ cmp r1, #0
+ beq _08004414
+ cmp r0, r1
+ bne _08004404
+ ldrh r0, [r3, #2]
+ pop {r4, pc}
+_08004414:
+ movs r0, #0
+ pop {r4, pc}
+_08004418:
+ .byte 0x0D, 0x00, 0x01, 0x00, 0x10, 0x00, 0x02, 0x00
+ .byte 0x11, 0x00, 0x02, 0x00, 0x5A, 0x00, 0x03, 0x00, 0x13, 0x00, 0x04, 0x00, 0x00, 0x00
+
+ non_word_aligned_thumb_func_start sub_0800442E
+sub_0800442E: @ 0x0800442E
+ push {r0, lr}
+ bl sub_080043E8
+ cmp r0, #0
+ beq _08004448
+ lsls r0, r0, #2
+ add r1, pc, #0xC
+ ldr r1, [r1, r0]
+ pop {r0}
+ bl _call_via_r1
+ movs r0, #1
+ pop {pc}
+_08004448:
+ movs r0, #0
+ pop {r1, pc}
+_0800444C: .4byte CreateItemOnGround
+_08004450: .4byte sub_080043A8
+_08004454: .4byte CreateChestSpawner
+_08004458: .4byte sub_080043B0
+
+ thumb_func_start sub_0800445C
+sub_0800445C: @ 0x0800445C
+ push {r4, r5, lr}
+ adds r4, r0, #0
+ bl sub_08079F8C
+ cmp r0, #0
+ beq _08004482
+ ldr r5, _080044D8 @ =gPlayerEntity
+ adds r0, r4, #0
+ adds r1, r5, #0
+ bl sub_08004484
+ cmp r0, #0
+ beq _08004482
+ ldrb r0, [r5, #0xc]
+ cmp r0, #2
+ bne _08004480
+ movs r0, #3
+ strb r0, [r5, #0xd]
+_08004480:
+ movs r0, #1
+_08004482:
+ pop {r4, r5, pc}
+
+ thumb_func_start sub_08004484
+sub_08004484: @ 0x08004484
+ ldr r2, _080044DC @ =ram_sub_080B227C
+ bx r2
+
+ thumb_func_start EnqueueSFX
+EnqueueSFX: @ 0x08004488
+ ldr r1, _080044E0 @ =gUnk_02024048
+ ldrb r2, [r1]
+ cmp r2, #8
+ bhs _0800449A
+ adds r3, r2, #1
+ strb r3, [r1]
+ ldr r1, _080044E4 @ =gUnk_02021F20
+ lsls r2, r2, #1
+ strh r0, [r1, r2]
+_0800449A:
+ bx lr
+
+ thumb_func_start SoundReqClipped
+SoundReqClipped: @ 0x0800449C
+ push {r1, lr}
+ bl CheckOnScreen
+ cmp r0, #0
+ pop {r0}
+ beq _080044AC
+ bl SoundReq
+_080044AC:
+ pop {pc}
+
+ non_word_aligned_thumb_func_start sub_080044AE
+sub_080044AE: @ 0x080044AE
+ push {lr}
+ ldr r3, _080044E8 @ =gPlayerEntity
+ cmp r0, r3
+ beq _080044CC
+ push {r0, r1, r2}
+ adds r1, r2, #0
+ movs r2, #2
+ bl CalculateEntityTileCollisions
+ pop {r0, r1, r2}
+ movs r3, #2
+ bl ProcessMovementInternal
+_080044C8:
+ pop {r3}
+ bx r3
+_080044CC:
+ adds r0, r1, #0
+ adds r1, r2, #0
+ bl sub_08079E58
+ b _080044C8
+ .align 2, 0
+_080044D8: .4byte gPlayerEntity
+_080044DC: .4byte ram_sub_080B227C
+_080044E0: .4byte gUnk_02024048
+_080044E4: .4byte gUnk_02021F20
+_080044E8: .4byte gPlayerEntity
+
+ thumb_func_start sub_080044EC
+sub_080044EC: @ 0x080044EC
+ ldr r2, [r0, #0x34]
+ ldr r3, [r0, #0x20]
+ subs r2, r2, r3
+ bpl _080044FE
+ str r2, [r0, #0x34]
+ subs r3, r3, r1
+ str r3, [r0, #0x20]
+ movs r0, #2
+ bx lr
+_080044FE:
+ movs r2, #1
+ str r2, [r0, #0x34]
+ subs r3, r3, r1
+ rsbs r3, r3, #0
+ lsrs r3, r3, #1
+ lsrs r1, r3, #2
+ adds r3, r3, r1
+ lsrs r1, r3, #0xc
+ cmp r1, #0xc
+ bhs _08004516
+ movs r2, #0
+ movs r3, #0
+_08004516:
+ str r3, [r0, #0x20]
+ adds r0, r2, #0
+ bx lr
+
+ thumb_func_start sub_0800451C
+sub_0800451C: @ 0x0800451C
+ push {r0, lr}
+ bl sub_080B1AA8
+ adds r1, r0, #0
+ pop {r0, r3}
+ mov lr, r3
+ cmp r1, #0xc
+ beq sub_08004542
+ cmp r1, #0xb
+ beq sub_08004542
+ cmp r1, #0xa
+ beq ResetCollisionLayer
+ cmp r1, #9
+ beq ResetCollisionLayer
+ cmp r1, #0x26
+ beq _0800457A
+ cmp r1, #0x27
+ beq _0800457A
+ bx lr
+
+ non_word_aligned_thumb_func_start sub_08004542
+sub_08004542: @ 0x08004542
+ movs r1, #0x38
+ movs r2, #2
+ strb r2, [r0, r1]
+ movs r2, #0xc0
+ ldrb r1, [r0, #0x1b]
+ bics r1, r2
+ adds r1, #0x40
+ strb r1, [r0, #0x1b]
+ movs r2, #0xc0
+ ldrb r1, [r0, #0x19]
+ bics r1, r2
+ adds r1, #0x40
+ strb r1, [r0, #0x19]
+ bx lr
+
+ non_word_aligned_thumb_func_start ResetCollisionLayer
+ResetCollisionLayer: @ 0x0800455E
+ movs r1, #0x38
+ movs r2, #1
+ strb r2, [r0, r1]
+ movs r2, #0xc0
+ ldrb r1, [r0, #0x1b]
+ bics r1, r2
+ adds r1, #0x80
+ strb r1, [r0, #0x1b]
+ movs r2, #0xc0
+ ldrb r1, [r0, #0x19]
+ bics r1, r2
+ adds r1, #0x80
+ strb r1, [r0, #0x19]
+ bx lr
+_0800457A:
+ movs r1, #0x38
+ movs r2, #3
+ strb r2, [r0, r1]
+ movs r2, #0xc0
+ ldrb r1, [r0, #0x1b]
+ bics r1, r2
+ adds r1, #0x40
+ strb r1, [r0, #0x1b]
+ movs r2, #0xc0
+ ldrb r1, [r0, #0x19]
+ bics r1, r2
+ adds r1, #0x40
+ strb r1, [r0, #0x19]
+ bx lr
+
+ non_word_aligned_thumb_func_start sub_08004596
+sub_08004596: @ 0x08004596
+ movs r2, #0x1f
+ ldrb r3, [r0, #0x15]
+ cmp r3, #0x20
+ bhs _080045AE
+ subs r1, r1, r3
+ beq _080045B2
+ ands r1, r2
+ cmp r1, #0x10
+ movs r1, #1
+ blo _080045AC
+ rsbs r1, r1, #0
+_080045AC:
+ adds r1, r3, r1
+_080045AE:
+ ands r1, r2
+ strb r1, [r0, #0x15]
+_080045B2:
+ bx lr
+
+ thumb_func_start sub_080045B4
+sub_080045B4: @ 0x080045B4
+ mov ip, r2
+ adds r2, r1, #0
+ movs r3, #0x32
+ ldrsh r1, [r0, r3]
+ movs r3, #0x2e
+ ldrsh r0, [r0, r3]
+ ldr r3, _08004690 @ =ram_CalcCollisionDirection
+ bx r3
+
+ thumb_func_start GetFacingDirection
+GetFacingDirection: @ 0x080045C4
+ push {r4, r5}
+ movs r4, #0x32
+ movs r5, #0x2e
+ ldrsh r3, [r1, r4]
+ ldrsh r2, [r1, r5]
+ ldrsh r1, [r0, r4]
+ ldrsh r0, [r0, r5]
+ pop {r4, r5}
+
+ thumb_func_start CalculateDirectionTo
+CalculateDirectionTo: @ 0x080045D4
+ mov ip, r3
+ ldr r3, _08004694 @ =ram_CalcCollisionDirection
+ bx r3
+
+ non_word_aligned_thumb_func_start sub_080045DA
+sub_080045DA: @ 0x080045DA
+ push {r0, r1, r4, r5, r6, lr}
+ movs r6, #0x40
+ cmp r0, #0
+ beq _08004632
+ ldr r5, _08004698 @ =gUnk_080C93E0
+ lsls r2, r1, #8
+ adds r1, r0, #0
+ adds r0, r2, #0
+ bl Div
+ ldr r1, _0800469C @ =0x00000106
+ cmp r3, r1
+ bhs _08004608
+ movs r1, #0x6e
+ cmp r3, r1
+ bhs _08004602
+ movs r6, #0
+ movs r1, #0
+ movs r2, #0x20
+ b _08004618
+_08004602:
+ movs r1, #0x20
+ movs r2, #0x40
+ b _08004618
+_08004608:
+ ldr r1, _080046A0 @ =0x00000280
+ cmp r3, r1
+ bhs _08004614
+ movs r1, #0x40
+ movs r2, #0x60
+ b _08004618
+_08004614:
+ movs r1, #0x60
+ movs r2, #0x7e
+_08004618:
+ adds r0, r1, r5
+ ldrh r4, [r0]
+ cmp r3, r4
+ blo _0800462C
+ ldrh r4, [r0, #2]
+ cmp r3, r4
+ bhs _0800462C
+ lsrs r6, r1, #1
+ adds r6, #1
+ b _08004632
+_0800462C:
+ adds r1, #2
+ cmp r1, r2
+ blo _08004618
+_08004632:
+ adds r2, r6, #0
+ pop {r0, r1, r4, r5, r6}
+ cmp r0, #0
+ bmi _08004644
+ movs r0, #0x40
+ cmp r1, #0
+ bmi _0800464A
+_08004640:
+ adds r0, r0, r2
+ pop {pc}
+_08004644:
+ movs r0, #0xc0
+ cmp r1, #0
+ bmi _08004640
+_0800464A:
+ subs r0, r0, r2
+ pop {pc}
+
+gUnk_0800464E::
+ .byte 0x00, 0x01
+ .byte 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x08, 0x07, 0x06, 0x05, 0x04, 0x00, 0x00, 0x00, 0x10, 0x0F
+ .byte 0x0E, 0x0D, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x1F
+ .byte 0x1E, 0x1D, 0x1C, 0x00, 0x00, 0x00, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x00, 0x00, 0x00, 0x10, 0x11
+ .byte 0x12, 0x13, 0x14, 0x00, 0x00, 0x00, 0x18, 0x17, 0x16, 0x15, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00
+
+_08004690: .4byte ram_CalcCollisionDirection
+_08004694: .4byte ram_CalcCollisionDirection
+_08004698: .4byte gUnk_080C93E0
+_0800469C: .4byte 0x00000106
+_080046A0: .4byte 0x00000280
+
+gUnk_080046A4:: @ 080046A4
+ .incbin "code_080043E8/gUnk_080046A4.bin"
+
+gUnk_080047F6:: @ 080047F6
+ .incbin "code_080043E8/gUnk_080047F6.bin"
+
+gUnk_080049D6:: @ 080049D6
+ .incbin "code_080043E8/gUnk_080049D6.bin"
+
+gUnk_080049F6:: @ 080049F6
+ .incbin "code_080043E8/gUnk_080049F6.bin"
+
+gUnk_080049FE:: @ gUnk_080049FE
+ .incbin "code_080043E8/gUnk_080049FE.bin"
+
+gUnk_08004A0C:: @ 08004A0C
+ .incbin "code_080043E8/gUnk_08004A0C.bin"
+
+gUnk_08004A16:: @ 08004A16
+ .incbin "code_080043E8/gUnk_08004A16.bin"
+
+gUnk_08004A24:: @ 08004A24
+ .incbin "code_080043E8/gUnk_08004A24.bin"
+
+gUnk_08004A32:: @ 08004A32
+ .incbin "code_080043E8/gUnk_08004A32.bin"
+
+gUnk_08004A48:: @ 08004A48
+ .incbin "code_080043E8/gUnk_08004A48.bin"
+
+gUnk_08004A72:: @ 08004A72
+ .incbin "code_080043E8/gUnk_08004A72.bin"
+
+gUnk_08004A8C:: @ 08004A8C
+ .incbin "code_080043E8/gUnk_08004A8C.bin"
+
+gUnk_08004AA6:: @ 08004AA6
+ .incbin "code_080043E8/gUnk_08004AA6.bin"
diff --git a/asm/src/code_08007CAC.s b/asm/src/code_08007CAC.s
new file mode 100644
index 00000000..c457c0a2
--- /dev/null
+++ b/asm/src/code_08007CAC.s
@@ -0,0 +1,52 @@
+ .include "asm/macros.inc"
+ .include "constants/constants.inc"
+
+ .syntax unified
+
+ .text
+
+gUnk_08007CAC:: @ 08007CAC
+ .incbin "code_080043E8/gUnk_08007CAC.bin"
+.ifdef DEMO_JP
+@ TODO only one byte differs
+ .incbin "code_080043E8/gUnk_08007CAC_1_DEMO_JP.bin"
+.else
+.ifdef DEMO_USA
+@ TODO only one byte differs
+ .incbin "code_080043E8/gUnk_08007CAC_2_DEMO_USA.bin"
+.else
+.ifdef JP
+@ TODO only one byte differs
+ .incbin "code_080043E8/gUnk_08007CAC_3_JP.bin"
+.else
+.ifdef EU
+@ TODO only two bytes differ
+ .incbin "code_080043E8/gUnk_08007CAC_4_EU.bin"
+.else
+ .incbin "code_080043E8/gUnk_08007CAC_5_USA.bin"
+.endif
+.endif
+.endif
+.endif
+
+ non_word_aligned_thumb_func_start sub_08007DD6
+sub_08007DD6: @ 0x08007DD6
+ push {lr}
+ bl sub_08007DE0
+ adds r0, r3, #0
+ pop {pc}
+
+ thumb_func_start sub_08007DE0
+sub_08007DE0: @ 0x08007DE0
+ subs r1, #4
+_08007DE2:
+ adds r1, #4
+ ldrh r3, [r1]
+ cmp r3, #0
+ beq _08007DF2
+ cmp r0, r3
+ bne _08007DE2
+ ldrh r3, [r1, #2]
+ movs r2, #1
+_08007DF2:
+ bx lr
diff --git a/asm/src/crt0.s b/asm/src/crt0.s
new file mode 100644
index 00000000..2e3609b4
--- /dev/null
+++ b/asm/src/crt0.s
@@ -0,0 +1,49 @@
+ .include "asm/macros.inc"
+ .include "constants/constants.inc"
+ .syntax unified
+ .text
+
+ arm_func_start __start
+__start:
+ b start_vector
+
+header:
+ .include "asm/rom_header.inc"
+
+start_vector:
+ mov r0, #0x12
+ msr cpsr_fc, r0
+ ldr sp, sp_irq
+ mov r0, #0x1f
+ msr cpsr_fc, r0
+ ldr sp, sp_usr
+ ldr r1, INTR_VECTOR_BUF
+ ldr r0, intr_main
+ str r0, [r1]
+.ifdef EU
+ ldr r1, unk_function
+ mov lr, pc
+ bx r1
+.else
+.ifdef DEMO_JP
+ ldr r1, unk_function
+ mov lr, pc
+ bx r1
+.endif
+.endif
+ ldr r1, =AgbMain
+ mov lr, pc
+ bx r1
+_080000F0:
+ b start_vector
+sp_irq: .4byte irq_stack_begin
+sp_usr: .4byte usr_stack_begin
+INTR_VECTOR_BUF: .4byte 0x03007FFC
+intr_main: .4byte ram_IntrMain
+.ifdef EU
+unk_function: .4byte fill_rq_stack
+.else
+.ifdef DEMO_JP
+unk_function: .4byte fill_rq_stack
+.endif
+.endif
diff --git a/asm/src/enemy.s b/asm/src/enemy.s
new file mode 100644
index 00000000..4bada3c6
--- /dev/null
+++ b/asm/src/enemy.s
@@ -0,0 +1,250 @@
+ .include "asm/macros.inc"
+ .include "constants/constants.inc"
+
+ .syntax unified
+
+ .text
+
+ thumb_func_start EnemyUpdate
+EnemyUpdate: @ 0x080011C4
+ mov r3, lr
+ push {r3, r4}
+ adds r4, r0, #0
+ ldrb r2, [r0, #0xc]
+ cmp r2, #0
+ bne _080011DC
+ bl EnemyInit
+ cmp r0, #0
+ bne _080011EA
+ bl DeleteThisEntity
+_080011DC:
+ bl EntityIsDeleted
+ cmp r0, #0
+ bne _0800120A
+ adds r0, r4, #0
+ bl sub_080028E0
+_080011EA:
+ adds r0, r4, #0
+ movs r1, #0x6d
+ ldrb r1, [r0, r1]
+ lsrs r1, r1, #5
+ bhs _0800120A
+ ldrb r1, [r0, #9]
+ lsls r1, r1, #2
+ ldr r2, _08001358 @ =gEnemyFunctions
+ ldr r1, [r2, r1]
+ bl _call_via_r1
+ movs r1, #0x41
+ movs r3, #0x7f
+ ldrb r2, [r4, r1]
+ ands r2, r3
+ strb r2, [r4, r1]
+_0800120A:
+ adds r0, r4, #0
+ bl DrawEntity
+ pop {r3, r4}
+ bx r3
+
+ thumb_func_start sub_08001214
+sub_08001214: @ 0x08001214
+ movs r3, #0x3a
+ ldrb r1, [r0, r3]
+ movs r2, #1
+ tst r1, r2
+ bne _08001230
+ orrs r1, r2
+ strb r2, [r0, r3]
+ movs r1, #1
+ movs r2, #0x5a
+ ldrb r2, [r0, r2]
+ lsrs r2, r2, #7
+ blo _0800122E
+ movs r1, #0x20
+_0800122E:
+ strb r1, [r0, #0xe]
+_08001230:
+ ldrb r1, [r0, #0xe]
+ subs r1, #1
+ beq _0800123E
+ strb r1, [r0, #0xe]
+ movs r1, #4
+ ldr r3, _0800135C @ =UpdateAnimationVariableFrames
+ bx r3
+_0800123E:
+ ldr r3, _08001360 @ =CreateItemOnGround
+ bx r3
+
+ non_word_aligned_thumb_func_start GenericConfused
+GenericConfused: @ 0x08001242
+ push {lr}
+ movs r1, #0x43
+ ldrb r2, [r0, r1]
+ subs r2, #1
+ strb r2, [r0, r1]
+ cmp r2, #0x3c
+ bhs _08001282
+ movs r3, #3
+ ands r3, r2
+ add r1, pc, #0x34
+ ldrsb r1, [r1, r3]
+ movs r3, #0x62
+ strb r1, [r0, r3]
+ cmp r2, #0
+ bne _08001282
+ movs r1, #0x68
+ ldr r1, [r0, r1]
+ cmp r1, #0
+ beq _08001282
+ ldrb r2, [r1, #8]
+ cmp r2, #6
+ bne _08001282
+ ldrb r2, [r1, #9]
+ cmp r2, #0xf
+ bne _08001282
+ ldrb r2, [r1, #0xa]
+ cmp r2, #0x1c
+ bne _08001282
+ push {r0}
+ bl sub_0804AA1C
+ pop {r0}
+_08001282:
+ ldr r1, _08001364 @ =0x00001800
+ bl GravityUpdate
+ pop {pc}
+ .align 2, 0
+_0800128C:
+ .byte 0x00, 0x01, 0x00, 0xFF
+
+ thumb_func_start sub_08001290
+sub_08001290: @ 0x08001290
+ cmp r1, #0
+ beq _0800129C
+ ldr r2, _08001368 @ =gUnk_080012C8
+ lsls r1, r1, #2
+ ldr r1, [r2, r1]
+ bx r1
+_0800129C:
+ bx lr
+
+ @ r0: Entity*
+ @ r1: Function* array
+ non_word_aligned_thumb_func_start EnemyFunctionHandler
+EnemyFunctionHandler: @ 0x0800129E
+ mov r3, lr
+ push {r3, r4, r5}
+ adds r4, r0, #0
+ adds r5, r1, #0
+ bl sub_080012DC
+ cmp r0, #0
+ beq _080012B2
+ ldr r1, _0800136C @ =gUnk_080012C8
+ b _080012BA
+_080012B2:
+ adds r0, r4, #0
+ bl GetNextFunction
+ adds r1, r5, #0
+_080012BA:
+ lsls r0, r0, #2
+ ldr r1, [r1, r0]
+ adds r0, r4, #0
+ pop {r3, r4, r5}
+ mov lr, r3
+ bx r1
+ .align 2, 0
+
+gUnk_080012C8::
+ .4byte 0x00000000
+_080012CC: .4byte sub_08001214
+_080012D0: .4byte sub_080043A8
+_080012D4: .4byte CreateChestSpawner
+_080012D8: .4byte sub_080043B0
+
+ thumb_func_start sub_080012DC
+sub_080012DC: @ 0x080012DC
+ push {r4, r5, lr}
+ adds r4, r0, #0
+ movs r5, #0x3a
+ ldrb r1, [r4, r5]
+ lsrs r1, r1, #3
+ bhs _08001302
+ bl sub_080043E8
+ cmp r0, #4
+ beq _08001302
+ cmp r0, #0
+ bne _08001306
+ ldrb r1, [r4, r5]
+ lsrs r1, r1, #1
+ blo _08001302
+ ldrb r1, [r4, #0x10]
+ movs r2, #0x80
+ orrs r1, r2
+ strb r1, [r4, #0x10]
+_08001302:
+ movs r0, #0
+ pop {r4, r5, pc}
+_08001306:
+ cmp r0, #1
+ beq _08001316
+ movs r1, #1
+ strb r1, [r4, #0xe]
+ ldrb r2, [r4, r5]
+ movs r1, #1
+ orrs r1, r2
+ strb r1, [r4, r5]
+_08001316:
+ pop {r4, r5, pc}
+
+ thumb_func_start sub_08001318
+sub_08001318: @ 0x08001318
+ movs r1, #0x36
+ ldrsh r1, [r0, r1]
+ cmp r1, #0
+ bpl GenericKnockback
+ movs r2, #0xff
+ strb r2, [r0, #0x15]
+
+ thumb_func_start GenericKnockback
+GenericKnockback: @ 0x08001324
+ ldr r3, _08001370 @ =Knockback1
+ bx r3
+
+ thumb_func_start GenericKnockback2
+GenericKnockback2: @ 0x08001328
+ ldr r3, _08001374 @ =Knockback2
+ bx r3
+
+ thumb_func_start sub_0800132C
+sub_0800132C: @ 0x0800132C
+ movs r2, #0x38
+ ldrb r3, [r1, r2]
+ ldrb r2, [r0, r2]
+ ands r2, r3
+ beq _08001352
+ ldrh r2, [r0, #0x2e]
+ ldrh r3, [r1, #0x2e]
+ subs r2, r2, r3
+ adds r2, #8
+ cmp r2, #0x11
+ bhs _0800134E
+ ldrh r2, [r0, #0x32]
+ ldrh r3, [r1, #0x32]
+ subs r2, r2, r3
+ adds r2, #8
+ cmp r2, #0x11
+ blo _08001352
+_0800134E:
+ ldr r3, _08001378 @ =GetFacingDirection
+ bx r3
+_08001352:
+ movs r0, #0xff
+ bx lr
+ .align 2, 0
+_08001358: .4byte gEnemyFunctions
+_0800135C: .4byte UpdateAnimationVariableFrames
+_08001360: .4byte CreateItemOnGround
+_08001364: .4byte 0x00001800
+_08001368: .4byte gUnk_080012C8
+_0800136C: .4byte gUnk_080012C8
+_08001370: .4byte Knockback1
+_08001374: .4byte Knockback2
+_08001378: .4byte GetFacingDirection
diff --git a/asm/src/intr.s b/asm/src/intr.s
new file mode 100644
index 00000000..4aea95fc
--- /dev/null
+++ b/asm/src/intr.s
@@ -0,0 +1,1947 @@
+ .include "asm/macros.inc"
+ .include "constants/constants.inc"
+
+ .syntax unified
+
+ .text
+
+ .code 16
+
+.global RAMFUNCS_BASE
+RAMFUNCS_BASE::
+
+sub_080B197C:: @ 0x080B197C
+ push {r4, r5, r6}
+ ldr r2, _080B19C0 @ =gRoomControls
+ ldrh r3, [r2, #0xa]
+ ldrh r4, [r2, #6]
+ subs r3, r3, r4
+ ldrh r4, [r2, #0xc]
+ ldrh r2, [r2, #8]
+ subs r4, r4, r2
+ adds r5, r4, #0
+ lsrs r3, r3, #4
+ lsrs r4, r4, #4
+ lsls r4, r4, #7
+ adds r3, r3, r4
+ lsls r3, r3, #2
+ adds r0, r0, r3
+ subs r1, #0x40
+ ldr r2, _080B19C4 @ =0x80000020
+ ldr r3, _080B19C8 @ =0x040000D4
+ movs r4, #1
+ lsls r4, r4, #8
+ movs r6, #0x17
+ cmp r5, #8
+ bhs _080B19AE
+ stm r3!, {r0, r1, r2}
+ b _080B19B4
+_080B19AE:
+ subs r0, r0, r4
+_080B19B0:
+ stm r3!, {r0, r1, r2}
+ adds r0, r0, r4
+_080B19B4:
+ subs r3, #0xc
+ adds r1, #0x40
+ subs r6, #1
+ bne _080B19B0
+ pop {r4, r5, r6}
+ bx lr
+ .align 2, 0
+_080B19C0: .4byte gRoomControls
+_080B19C4: .4byte 0x80000020
+_080B19C8: .4byte 0x040000D4
+
+@ r0 = entity*
+ arm_func_start arm_GetTileAtEntityPos
+arm_GetTileAtEntityPos: @ 0x080B19CC
+ ldrb r2, [r0, #0x38] @ obj layer
+ ldrh r1, [r0, #0x32] @ obj y
+ ldrh r0, [r0, #0x2e] @ obj x
+ ldr ip, _080B1C10 @ =gRoomControls
+arm_sub_080B19D8:
+ ldrh r3, [ip, #6]
+ sub r0, r0, r3 @ obj x - room x
+ ldrh r3, [ip, #8]
+ sub r1, r1, r3 @ obj y - room y
+arm_sub_080B19EC:
+ lsl r0, r0, #0x16
+ lsr r0, r0, #0x1a
+ lsl r1, r1, #0x16
+ lsr r1, r1, #0x1a
+arm_sub_080B19FC:
+ add r0, r0, r1, lsl #6
+ mov r1, r2
+arm_sub_080B1A04:
+ ldr r2, _080B1C14 @ =gUnk_08000258
+ b _080B1A64
+
+ arm_func_start arm_sub_080B1A0C
+arm_sub_080B1A0C: @ 0x080B1A0C
+ ldrh r3, [r0, #0x2e]
+ add r3, r3, r1
+ ldrh r1, [r0, #0x32]
+ add r1, r1, r2
+ ldrb r2, [r0, #0x38]
+ mov r0, r3
+ b arm_GetTileTypeByPos
+arm_GetTileTypeByEntity:
+ ldrb r2, [r0, #0x38]
+ ldrh r1, [r0, #0x32]
+ ldrh r0, [r0, #0x2e]
+arm_GetTileTypeByPos:
+ ldr ip, _080B1C18 @ =gRoomControls
+ ldrh r3, [ip, #6]
+ sub r0, r0, r3
+ ldrh r3, [ip, #8]
+ sub r1, r1, r3
+arm_sub_080B1A48:
+ lsl r0, r0, #0x16
+ lsr r0, r0, #0x1a
+ lsl r1, r1, #0x16
+ lsr r1, r1, #0x1a
+arm_sub_080B1A58:
+ add r0, r0, r1, lsl #6
+ mov r1, r2
+
+ arm_func_start arm_GetTileType
+arm_GetTileType: @ 0x080B1A60
+ ldr r2, _080B1C1C @ =gUnk_08000228
+_080B1A64:
+ add r2, r2, r1, lsl #3
+ ldr r1, [r2]
+ lsl r0, r0, #1
+ ldrh r0, [r1, r0]
+ cmp r0, #0x4000 @ return tile index is OOB
+ bxhs lr
+ ldr r1, [r2, #4]
+ lsl r0, r0, #1
+ ldrh r0, [r1, r0]
+ bx lr
+
+ arm_func_start arm_sub_080B1A8C
+arm_sub_080B1A8C: @ 0x080B1A8C
+ ldrh r3, [r0, #0x2e]
+ add r3, r3, r1
+ ldrh r1, [r0, #0x32]
+ add r1, r1, r2
+ ldrb r2, [r0, #0x38]
+ mov r0, r3
+ b arm_sub_080B1AB4
+arm_sub_080B1AA8:
+ ldrb r2, [r0, #0x38]
+ ldrh r1, [r0, #0x32]
+ ldrh r0, [r0, #0x2e]
+arm_sub_080B1AB4:
+ ldr ip, _080B1C20 @ =gRoomControls
+ ldrh r3, [ip, #6]
+ sub r0, r0, r3
+ ldrh r3, [ip, #8]
+ sub r1, r1, r3
+arm_sub_080B1AC8:
+ lsl r0, r0, #0x16
+ lsr r0, r0, #0x1a
+ lsl r1, r1, #0x16
+ lsr r1, r1, #0x1a
+arm_sub_080B1AD8:
+ add r0, r0, r1, lsl #6
+ mov r1, r2
+arm_sub_080B1AE0:
+ ldr r2, _080B1C24 @ =gUnk_08000278
+ ldr r2, [r2, r1, lsl #2]
+ ldrb r0, [r2, r0]
+ bx lr
+
+ arm_func_start arm_sub_080B1AF0
+arm_sub_080B1AF0: @ 0x080B1AF0
+ ldrh r3, [r0, #0x2e]
+ add r3, r3, r1
+ ldrh r1, [r0, #0x32]
+ add r1, r1, r2
+ ldrb r2, [r0, #0x38]
+ mov r0, r3
+ b arm_sub_080B1B18
+arm_sub_080B1B0C:
+ ldrb r2, [r0, #0x38]
+ ldrh r1, [r0, #0x32]
+ ldrh r0, [r0, #0x2e]
+arm_sub_080B1B18:
+ ldr ip, _080B1C28 @ =gRoomControls
+ ldrh r3, [ip, #6]
+ sub r0, r0, r3
+ ldrh r3, [ip, #8]
+ sub r1, r1, r3
+arm_sub_080B1B2C:
+ lsl r0, r0, #0x16
+ lsr r0, r0, #0x1a
+ lsl r1, r1, #0x16
+ lsr r1, r1, #0x1a
+arm_sub_080B1B3C:
+ add r0, r0, r1, lsl #6
+ mov r1, r2
+arm_sub_080B1B44:
+ ldr r2, _080B1C2C @ =gUnk_08000248
+ ldr r1, [r2, r1, lsl #2]
+ ldrb r0, [r1, r0]
+ bx lr
+
+ arm_func_start arm_sub_080B1B54
+arm_sub_080B1B54: @ 0x080B1B54
+ lsls r0, r0, #0x12
+ ldrlo r1, _080B1C30 @ =gUnk_080B37A0
+ ldrhs r1, _080B1C34 @ =gUnk_080B7910
+ ldrb r0, [r1, r0, lsr #18]
+ bx lr
+
+ arm_func_start arm_sub_080B1B68
+arm_sub_080B1B68: @ 0x080B1B68
+ lsrs r2, r0, #0xe
+ bxne lr
+ ldr r2, _080B1C38 @ =gUnk_0800022C
+ ldr r1, [r2, r1, lsl #3]
+ lsl r0, r0, #1
+ ldrh r0, [r1, r0]
+ bx lr
+
+ arm_func_start arm_sub_080B1B84
+arm_sub_080B1B84: @ 0x080B1B84
+ mov ip, lr
+ bl arm_GetTileType
+ lsls r0, r0, #0x12
+ ldrlo r1, _080B1C3C @ =gUnk_08000360
+ ldrhs r1, _080B1C40 @ =gUnk_080B7A3E
+ lsr r0, r0, #0x11
+ ldrh r0, [r1, r0]
+ bx ip
+
+ arm_func_start arm_sub_080B1BA4
+arm_sub_080B1BA4: @ 0x080B1BA4
+ mov ip, lr
+ mov r3, r2
+ bl arm_GetTileType
+ lsls r0, r0, #0x12
+ ldrlo r1, _080B1C44 @ =gUnk_08000360
+ ldrhs r1, _080B1C48 @ =gUnk_080B7A3E
+ lsr r0, r0, #0x11
+ ldrh r0, [r1, r0]
+ and r0, r0, r3
+ bx ip
+
+ arm_func_start sub_080B1BCC
+sub_080B1BCC: @ 0x080B1BCC
+ ldrh r3, [r0, #0x2e]
+ add r1, r1, r3
+ ldrh r3, [r0, #0x32]
+ add r2, r2, r3
+ ldr ip, _080B1C4C @ =gRoomControls
+ ldrh r3, [ip, #6]
+ sub r1, r1, r3
+ ldrh r3, [ip, #8]
+ sub r2, r2, r3
+ and r1, r1, #0x3f0
+ and r2, r2, #0x3f0
+ add r1, r1, r2, lsl #6
+ ldr r2, _080B1C50 @ =gUnk_08000278
+ ldrb r3, [r0, #0x38]
+ ldr r2, [r2, r3, lsl #2]
+ ldrb r0, [r2, r1, lsr #4]
+ bx lr
+ .align 2, 0
+_080B1C10: .4byte gRoomControls
+_080B1C14: .4byte gUnk_08000258
+_080B1C18: .4byte gRoomControls
+_080B1C1C: .4byte gUnk_08000228
+_080B1C20: .4byte gRoomControls
+_080B1C24: .4byte gUnk_08000278
+_080B1C28: .4byte gRoomControls
+_080B1C2C: .4byte gUnk_08000248
+_080B1C30: .4byte gUnk_080B37A0
+_080B1C34: .4byte gUnk_080B7910
+_080B1C38: .4byte gUnk_0800022C
+_080B1C3C: .4byte gUnk_08000360
+_080B1C40: .4byte gUnk_080B7A3E
+_080B1C44: .4byte gUnk_08000360
+_080B1C48: .4byte gUnk_080B7A3E
+_080B1C4C: .4byte gRoomControls
+_080B1C50: .4byte gUnk_08000278
+
+ arm_func_start UpdateCollision
+UpdateCollision: @ 0x080B1C54
+ @ r0 : Entity* this
+ ldrb r1, [r0, #0x10]
+ ands r1, r1, #0x80 @ disable collision flag
+ bxeq lr
+ ldr r2, _080B200C @ =gCollidableList
+ ldr r3, _080B2010 @ =gCollidableCount
+ ldrb r1, [r3]
+ str r0, [r2, r1, lsl #2]
+ add r1, r1, #1
+ strb r1, [r3]
+ bx lr
+
+ arm_func_start arm_CollideAll
+arm_CollideAll: @ 0x080B1C7C
+ push {r4, r5, r6, r7, r8, sb, sl, lr}
+ add r0, pc, #0x104 @ =_080B1D8C
+ ldm r0, {r8, sb, sl}
+ ldrb sl, [sl]
+ cmp sl, #0
+ beq _080B1D84
+ ldr r8, [r8]
+ mov r7, r8
+_080B1C9C:
+ ldr r4, [r8, #8]
+ ldrb r0, [r4, #0x10]
+ ands r0, r0, #0x80
+ beq _080B1D78
+ ldrb r0, [r4, #0x3c]
+ and r0, r0, #7
+ mov r1, #1
+ lsl r6, r1, r0
+ ldrb r3, [r4, #0x3c]
+ ldrb r2, [r4, #0x3d]
+ mov ip, sl
+_080B1CC8:
+ subs ip, ip, #1
+ bmi _080B1D78
+ ldr r5, [sb, ip, lsl #2]
+ cmp r4, r5
+ beq _080B1CC8
+ ldr r0, [r5, #0x3b]
+ ands r0, r0, r6
+ beq _080B1CC8
+ ldrb r0, [r5, #0x10]
+ ands r0, r0, #0x80
+ beq _080B1CC8
+ ldrb r0, [r4, #0x38]
+ ldrb r1, [r5, #0x38]
+ ands r0, r0, r1
+ beq _080B1CC8
+ ldrb r0, [r5, #0x3c]
+ orr r0, r0, r3
+ lsrs r0, r0, #7
+ bhs _080B1D20
+ ldrb r0, [r5, #0x3d]
+ orrs r0, r0, r2
+ bne _080B1CC8
+_080B1D20:
+ bl arm_CalcCollision
+ cmp r0, #0
+ beq _080B1CC8
+ ldrb r3, [r4, #0x3c]
+ ldrb r0, [r4, #0x3d]
+ ldrb r1, [r4, #0x43]
+ orr r2, r0, r1
+ ldrb r0, [r5, #0x41]
+ ands r0, r0, #0x80
+ bne _080B1D58
+ str r4, [r5, #0x4c]
+ ldrb r0, [r4, #0x40]
+ orr r0, r0, #0x80
+ strb r0, [r5, #0x41]
+_080B1D58:
+ ldrb r0, [r4, #0x41]
+ ands r0, r0, #0x80
+ bne _080B1CC8
+ str r5, [r4, #0x4c]
+ ldrb r0, [r5, #0x40]
+ orr r0, r0, #0x80
+ strb r0, [r4, #0x41]
+ b _080B1CC8
+_080B1D78:
+ ldr r8, [r8, #4]
+ cmp r8, r7
+ bne _080B1C9C
+_080B1D84:
+ pop {r4, r5, r6, r7, r8, sb, sl, lr}
+ bx lr
+_080B1D8C: .4byte gUnk_02018EA0
+_080B1D90: .4byte gCollidableList
+_080B1D94: .4byte gCollidableCount
+
+ arm_func_start arm_CalcCollision
+arm_CalcCollision: @ 0x080B1D98
+ @ r6 = this, r7 = other
+
+ push {r2, r3, r6, r7, r8, sb, ip, lr}
+ ldr r6, [r4, #0x48]
+ ldr r7, [r5, #0x48]
+ ldrh r0, [r4, #0x2e]
+ ldrh r1, [r5, #0x2e]
+ sub r0, r0, r1
+ ldrsb r1, [r6]
+ add r0, r0, r1
+ ldrsb r1, [r7]
+ sub r0, r0, r1
+ ldrb r1, [r6, #6]
+ ldrb r2, [r7, #6]
+ add r1, r1, r2
+ add r2, r0, r1
+ cmp r2, r1, lsl #1
+ bhi _080B1F28
+ ldrh r1, [r4, #0x32]
+ ldrh r2, [r5, #0x32]
+ sub r1, r1, r2
+ ldrsb r2, [r6, #1]
+ add r1, r1, r2
+ ldrsb r2, [r7, #1]
+ sub r1, r1, r2
+ ldrb r2, [r6, #7]
+ ldrb r3, [r7, #7]
+ add r2, r2, r3
+ add r3, r1, r2
+ cmp r3, r2, lsl #1
+ bhi _080B1F28
+ mov r2, #5
+ mov r3, #5
+ ldr r8, [r4, #0x3c]
+ ands r8, r8, #0x10
+ ldrbne r2, [r6, #8]
+ ldr r8, [r5, #0x3c]
+ ands r8, r8, #0x10
+ ldrbne r3, [r7, #8]
+ add r2, r2, r3
+ ldrsh r8, [r4, #0x36]
+ ldrsh sb, [r5, #0x36]
+ sub r8, r8, sb
+ add r8, r2, r8
+ cmp r8, r2, lsl #1
+ bhi _080B1F28
+ ldrb r2, [r4, #0x3c]
+ and r2, r2, #0x20
+ lsr r2, r2, #3
+ ldrb r3, [r5, #0x3c]
+ and r3, r3, #0x20
+ adds r2, r2, r3, lsr #2
+ beq _080B1E74
+ add r3, pc, #0x180 @ =_080B1FEC
+ ldr r2, [r3, r2]
+ mov lr, pc
+ bx r2
+_080B1E74:
+ mov r2, #0
+ mov ip, #0
+ bl arm_CalcCollisionDirection
+ mov r6, r0
+ ldrb r1, [r5, #0x3f]
+ mov r0, #0x22
+ mul r1, r0, r1
+ ldrb r0, [r4, #0x40]
+ add r0, r0, r1
+ mov r1, #0xc
+ mul r2, r0, r1
+ ldr r1, _080B2014 @ =gCollisionMtx
+ add r3, r2, r1
+ mov r1, #0
+ ldrb r0, [r3]
+ cmp r0, #0xff
+ ldrheq r1, [r3, #2]
+ ldr r0, _080B2018 @ =gUnk_080B3744
+ ldr r7, [r0, r1, lsl #2]
+ mov r0, r4
+ mov r1, r5
+ mov r2, r6
+ mov lr, pc
+ bx r7
+_080B1ED4:
+ cmp r0, #0
+ beq _080B1F20
+ cmp r0, #2
+ beq _080B1F1C
+ ldrb r0, [r4, #0x3c]
+ and r0, r0, #0x80
+ lsr r0, r0, #5
+ ldrb r1, [r5, #0x3c]
+ and r1, r1, #0x80
+ lsr r1, r1, #4
+ add r0, r0, r1
+ add r1, pc, #0xF4 @ =_080B1FFC
+ ldr r0, [r1, r0]
+ mov lr, pc
+ bx r0
+_080B1F10:
+ strb r6, [r5, #0x3e]
+ eor r6, r6, #0x10
+ strb r6, [r4, #0x3e]
+_080B1F1C:
+ mov r0, #1
+_080B1F20:
+ pop {r2, r3, r6, r7, r8, sb, ip, lr}
+ bx lr
+_080B1F28:
+ mov r0, #0
+ b _080B1F20
+
+ arm_func_start arm_sub_080B1F30
+arm_sub_080B1F30: @ 0x080B1F30
+ ldrh r0, [r4, #0x2e]
+ ldrh r1, [r5, #0x2e]
+ sub r0, r0, r1
+ ldrsb r1, [r7]
+ sub r0, r0, r1
+ ldrh r1, [r4, #0x32]
+ ldrh r2, [r5, #0x32]
+ sub r1, r1, r2
+ ldrsb r2, [r7, #1]
+ sub r1, r1, r2
+ bx lr
+
+ arm_func_start arm_sub_080B1F5C
+arm_sub_080B1F5C: @ 0x080B1F5C
+ ldrh r0, [r4, #0x2e]
+ ldrh r1, [r5, #0x2e]
+ sub r0, r0, r1
+ ldrsb r1, [r6]
+ add r0, r0, r1
+ ldrh r1, [r4, #0x32]
+ ldrh r2, [r5, #0x32]
+ sub r1, r1, r2
+ ldrsb r2, [r6, #1]
+ add r1, r1, r2
+ bx lr
+
+ arm_func_start arm_sub_080B1F88
+arm_sub_080B1F88: @ 0x080B1F88
+ ldrh r0, [r4, #0x2e]
+ ldrh r1, [r5, #0x2e]
+ sub r0, r0, r1
+ ldrh r1, [r4, #0x32]
+ ldrh r2, [r5, #0x32]
+ sub r1, r1, r2
+ bx lr
+
+ arm_func_start arm_sub_080B1FA4
+arm_sub_080B1FA4: @ 0x080B1FA4
+ ldrb r0, [r5, #0x15]
+ eor r0, r0, #0x10
+ b _080B1FB4
+_080B1FB0:
+ ldrb r0, [r4, #0x15]
+_080B1FB4:
+ sub r1, r0, #8
+ and r1, r1, #0x1f
+ sub r1, r6, r1
+ and r1, r1, #0x1f
+ cmp r1, #0x11
+ bxlo lr
+ sub r0, r6, r0
+ sub r0, r0, #8
+ and r0, r0, #0x1f
+ sub r6, r6, r0, lsl #1
+ and r6, r6, #0x1f
+ bx lr
+
+ arm_func_start arm_sub_080B1FE4
+arm_sub_080B1FE4: @ 0x080B1FE4
+ ldrb r6, [r4, #0x15]
+_080B1FE8:
+ bx lr
+_080B1FEC: .4byte ram_sub_080B1FE8
+_080B1FF0: .4byte ram_sub_080B1F30
+_080B1FF4: .4byte ram_sub_080B1F5C
+_080B1FF8: .4byte ram_sub_080B1F88
+_080B1FFC: .4byte ram_sub_080B1FE8
+_080B2000: .4byte ram_sub_080B1FB0
+_080B2004: .4byte ram_sub_080B1FA4
+_080B2008: .4byte ram_sub_080B1FE4
+_080B200C: .4byte gCollidableList
+_080B2010: .4byte gCollidableCount
+_080B2014: .4byte gCollisionMtx
+_080B2018: .4byte gUnk_080B3744
+
+ arm_func_start IntrMain
+IntrMain:
+ mov r3, #0x4000000
+ add r3, r3, #0x200
+ ldr r2, [r3] @ lo 16: interrupt_enable, hi 16: interrupt_request
+ ldrh r1, [r3, #8] @ interrupt master enable
+ mrs r0, spsr
+ push {r0, r1, r2, r3, lr}
+ and r1, r2, r2, lsr #16
+ ands r0, r1, #0x2000 @ external irq
+ bne _080B20D4
+ mov ip, #4
+ ands r0, r1, #0x80 @ serial comm
+ bne _080B2074
+ mov ip, #0xc
+ ands r0, r1, #4 @ vcount
+ bne _080B2074
+ mov ip, #0x10
+ ands r0, r1, #1 @ vblank
+ bne _080B2074
+ mov ip, #0x14
+ ands r0, r1, #0x40 @ timer 3 overflow
+ bne _080B2074
+ mov ip, #0
+_080B2074:
+ strh r0, [r3, #2]
+ bic r2, r2, r0
+ ldr r1, _080B20E4 @ =0x0000208C
+ and r1, r1, r2
+ strh r1, [r3]
+ mrs r3, apsr
+ bic r3, r3, #0xdf
+ orr r3, r3, #0x1f
+ msr cpsr_fc, r3
+ ldr r1, _080B20E8 @ =ram_gUnk_080B2A70
+ ldr r0, [r1, ip]
+ stmdb sp!, {lr}
+ mov lr, pc
+ bx r0
+
+ arm_func_start sub_080B20AC
+sub_080B20AC: @ 0x080B20AC
+ ldm sp!, {lr}
+ mrs r3, apsr
+ bic r3, r3, #0xdf
+ orr r3, r3, #0x92
+ msr cpsr_fc, r3
+ pop {r0, r1, r2, r3, lr}
+ strh r2, [r3]
+ strh r1, [r3, #8]
+ msr spsr_fc, r0
+ bx lr
+_080B20D4:
+ mov r0, #0
+ strh r0, [r3, #8]
+ strb r0, [r3, #-0x17c]
+_080B20E0:
+ b _080B20E0
+ .align 2, 0
+_080B20E4: .4byte 0x0000208C
+_080B20E8: .4byte ram_gUnk_080B2A70
+
+ arm_func_start arm_CheckBits
+arm_CheckBits: @ 0x080B20EC
+ add r3, r0, r1, lsr #3
+ and r1, r1, #7
+ ldr r0, _080B21A4 @ =0x01010101
+ lsl r1, r0, r1
+_080B20FC:
+ ldrb r0, [r3]
+ ands r0, r0, r1
+ bxeq lr
+ lsls r1, r1, #1
+ addhs r1, r1, #1
+ addhs r3, r3, #1
+ subs r2, r2, #1
+ bne _080B20FC
+ mov r0, #1
+ bx lr
+
+ arm_func_start arm_MakeFadeBuff256
+arm_MakeFadeBuff256: @ 0x080B2124
+ push {r4, r5, r6, r7, r8, sb, sl, fp}
+ mul r3, r2, r3
+ mov r4, #0x400
+ sub r2, r4, r2, lsl #2
+ ldr r7, _080B21A8 @ =0x02000006
+ ldrb r7, [r7]
+ ldr ip, _080B21AC @ =gUnk_08000F54
+ add ip, ip, r7, lsl #4
+ ldm ip, {r8, sb, sl}
+ mov r7, #0x3e
+ mov ip, #0x10
+_080B2150:
+ ldrh r6, [r0], #2
+ lsl r6, r6, #1
+ and r4, r7, r6
+ mla r4, r2, r4, r3
+ and r5, r7, r6, lsr #5
+ mla r5, r2, r5, r3
+ and r6, r7, r6, lsr #10
+ mla r6, r2, r6, r3
+ and r4, r7, r4, lsr #10
+ and r5, r7, r5, lsr #10
+ and r6, r7, r6, lsr #10
+ ldrh r4, [r8, r4]
+ ldrh r5, [sb, r5]
+ ldrh r6, [sl, r6]
+ orr r4, r4, r5
+ orr r4, r4, r6
+ strh r4, [r1], #2
+ subs ip, ip, #1
+ bne _080B2150
+ pop {r4, r5, r6, r7, r8, sb, sl, fp}
+ bx lr
+ .align 2, 0
+_080B21A4: .4byte 0x01010101
+_080B21A8: .4byte 0x02000000 + 6 @ brightness preference
+_080B21AC: .4byte gUnk_08000F54
+
+arm_ClearAndUpdateEntities:
+ ldr r11, _080B2270 @ =gUpdateContext
+ ldr r1, [r11]
+ ldm r1, {r7, r8, r9, r10}
+ ldr sp, [r11, #0xc]
+ ldr r8, [r11, #4]
+ ldr r0, [r11, #8]
+ add pc, pc, #0x60 @ =_080B2230
+
+@ gUpdateContext {
+@ void* chosen_table;
+@ void* linked_list_top;
+@ void* curr_entity;
+@ void* restore_sp;
+@ }
+
+ arm_func_start arm_UpdateEntities
+arm_UpdateEntities: @ 0x080B21B0 @
+@ UpdateEntities starts here
+ @ arg0 (r0) : 0 = entities, 1 = managers
+ ldr r1, _080B2274 @ =gUnk_080026A4
+ add r1, r1, r0, lsl #4
+ push {r4 - r11, lr}
+ ldr r11, _080B2278 @ =gUpdateContext
+ str r1, [r11, #0x0]
+ str sp, [r11, #0xc]
+ ldm r1, {r7, r8, r9, r10}
+next_list: @ traverse entity linked list
+ add r8, r8, #8
+ str r8, [r11, #4]
+ cmp r8, r9
+ bhs lists_complete
+ ldr r4, [r8, #4] @ entity -> next
+next_entity:
+ cmp r4, r8
+ beq next_list
+ mov r0, #0
+ str r0, [r7]
+ str r4, [r11, #8]
+ ldrb r1, [r4, #8] @ entity -> kind
+ ldr r1, [r10, r1, lsl #2]
+ mov r0, r4
+ mov lr, pc
+ bx r1 @ call entity kind update function
+ ldr r0, [r11, #8]
+ cmp r0, r4 @ update collision if entity is still alive
+ bleq UpdateCollision
+_080B2230: @ jumped here if ClearAndUpdateEntities
+ ldr r4, [r0, #4]
+ b next_entity
+lists_complete:
+ mov r0, #0
+ str r0, [r11, #8]
+ pop {r4 - r11, lr}
+ bx lr
+
+_080B2248::
+_080B2248: .4byte DeleteThisEntity @ 0x3005fbc
+_080B224C: .4byte PlayerUpdate
+_080B2250: .4byte DeleteThisEntity
+_080B2254: .4byte EnemyUpdate
+_080B2258: .4byte ProjectileUpdate
+_080B225C: .4byte DeleteThisEntity
+_080B2260: .4byte ObjectUpdate
+_080B2264: .4byte NPCUpdate
+_080B2268: .4byte ItemUpdate
+_080B226C: .4byte ManagerUpdate
+
+_080B2270: .4byte gUpdateContext
+_080B2274: .4byte gUnk_080026A4
+_080B2278: .4byte gUpdateContext
+
+ arm_func_start arm_sub_080B227C
+arm_sub_080B227C: @ 0x080B227C
+ push {r4, r5, r6, r7, r8, lr}
+ ldr r2, [r0, #0x48]
+ cmp r2, #0
+ beq _080B236C
+ ldr r3, [r1, #0x48]
+ cmp r3, #0
+ beq _080B236C
+ ldrh r4, [r1, #0x2e]
+ ldrsb r5, [r3]
+ add r4, r4, r5
+ ldrh r5, [r0, #0x2e]
+ sub r4, r4, r5
+ ldrsb r5, [r2]
+ sub r4, r4, r5
+ ldrb r5, [r2, #6]
+ ldrb r6, [r3, #6]
+ add r5, r5, r6
+ add r6, r4, r5
+ lsl r7, r5, #1
+ cmp r7, r6
+ blo _080B236C
+ cmp r4, #0
+ movpl ip, #8
+ movmi ip, #0x18
+ rsbmi r4, r4, #0
+ sub r8, r5, r4
+ ldrh r4, [r1, #0x32]
+ ldrsb r5, [r3, #1]
+ add r4, r4, r5
+ ldrh r5, [r0, #0x32]
+ sub r4, r4, r5
+ ldrsb r5, [r2, #1]
+ sub r4, r4, r5
+ ldrb r2, [r2, #7]
+ ldrb r3, [r3, #7]
+ add r3, r2, r3
+ add r5, r4, r3
+ lsl r6, r3, #1
+ cmp r6, r5
+ blo _080B236C
+ cmp r4, #0
+ movpl r2, #0x10
+ movmi r2, #0
+ rsbmi r4, r4, #0
+ sub r7, r3, r4
+ cmp r7, r8
+ movhs r7, r8
+ movhs r2, ip
+ cmp r7, #0
+ beq _080B236C
+ cmp r7, #5
+ movhs r7, #4
+ mov r0, r1
+ lsl r1, r7, #8
+ ldr r3, _080B2378 @ =sub_080044AE
+ mov lr, pc
+ bx r3
+_080B2360:
+ pop {r4, r5, r6, r7, r8, lr}
+ mov r0, #1
+ bx lr
+_080B236C:
+ pop {r4, r5, r6, r7, r8, lr}
+ mov r0, #0
+ bx lr
+ .align 2, 0
+_080B2378: .4byte sub_080044AE
+
+ arm_func_start arm_CalcCollisionDirection
+arm_CalcCollisionDirection: @ 0x080B237C
+ subs r2, r2, r0
+ movpl r0, #0
+ movmi r0, #0x20
+ rsbmi r2, r2, #0
+ subs r3, r1, ip
+ rsbmi r3, r3, #0
+ addmi r0, r0, #0x10
+ cmp r2, r3
+ movhs r1, r3
+ movhs r3, r2
+ movhs r2, r1
+ addhs r0, r0, #8
+ lsl r2, r2, #3
+ lsl r1, r3, #1
+ cmp r2, r3
+ addhs r0, r0, #1
+ addhs r3, r3, r1
+ cmp r2, r3
+ addhs r0, r0, #1
+ addhs r3, r3, r1
+ cmp r2, r3
+ addhs r0, r0, #1
+ addhs r3, r3, r1
+ cmp r2, r3
+ addhs r0, r0, #1
+ ldr r1, _080B23EC @ =gUnk_0800464E
+ ldrb r0, [r1, r0]
+ bx lr
+ .align 2, 0
+_080B23EC: .4byte gUnk_0800464E
+
+ arm_func_start arm_DrawEntities
+arm_DrawEntities: @ 0x080B23F0
+.ifdef EU
+ push {r4, r5, r6, r7, r8, sb, sl, fp, lr}
+ ldr fp, _080B2A30 @ =gOAMControls
+ ldrb r2, [fp, #3]
+ cmp r2, #0x80
+ bhs _080B19C0EU
+ add r0, pc, #0x54 @ =_080B19C0
+ str r0, [fp, #0x18]
+ str sp, [fp, #0x14]
+ ldrb r0, [fp, #0xf]
+ cmp r0, #0xff
+ bne _080B1984
+ bl _080B1FBC
+_080B1980:
+ mov r0, #0x0
+_080B1984:
+ ldr r1, _080B2154 @ =0x03006958
+ ldr r1, [r1, r0, lsl #2]
+ str r1, [fp, #0x1c]
+ ldr r0, _080B2A34 @ =gUnk_081326EC
+ ldr r0, [r0]
+ bl sub_080B19C8
+ ldr r0, _080B2A38 @ =gUnk_081326EC
+ ldr r0, [r0, #4]
+ bl sub_080B19C8
+ ldr r0, _080B2A3C @ =gUnk_081326EC
+ ldr r0, [r0, #8]
+ bl sub_080B19C8
+ ldr r0, _080B2A40 @ =gUnk_081326EC
+ ldr r0, [r0, #0xc]
+ bl sub_080B19C8
+_080B19C0EU:
+ pop {r4, r5, r6, r7, r8, sb, sl, fp, lr}
+ bx lr
+
+ arm_func_start sub_080B19C8
+sub_080B19C8: @ 0x080B19C8
+ ldrb r2, [r0]
+ cmp r2, #0
+ bxeq lr
+ ldr r1, _080B2A44 @ =0x08131D3C
+ ldr r1, [r1, #0x10]
+ mov r2, #0
+ strb r2, [r1]
+ stmdb sp!, {lr}
+ bl ResolveOamDrawPriority
+ bl sub_080B2534
+ ldm sp!, {lr}
+ b _080B1C40EU
+.else
+.ifdef DEMO_JP @ TODO deduplicate same as EU
+ push {r4, r5, r6, r7, r8, sb, sl, fp, lr}
+ ldr fp, _080B2A30 @ =gOAMControls
+ ldrb r2, [fp, #3]
+ cmp r2, #0x80
+ bhs _080B19C0EU
+ add r0, pc, #0x54 @ =_080B19C0
+ str r0, [fp, #0x18]
+ str sp, [fp, #0x14]
+ ldrb r0, [fp, #0xf]
+ cmp r0, #0xff
+ bne _080B1984
+ bl _080B1FBC
+_080B1980:
+ mov r0, #0x0
+_080B1984:
+ ldr r1, _080B2154 @ =0x03006958
+ ldr r1, [r1, r0, lsl #2]
+ str r1, [fp, #0x1c]
+ ldr r0, _080B2A34 @ =gUnk_081326EC
+ ldr r0, [r0]
+ bl sub_080B19C8
+ ldr r0, _080B2A38 @ =gUnk_081326EC
+ ldr r0, [r0, #4]
+ bl sub_080B19C8
+ ldr r0, _080B2A3C @ =gUnk_081326EC
+ ldr r0, [r0, #8]
+ bl sub_080B19C8
+ ldr r0, _080B2A40 @ =gUnk_081326EC
+ ldr r0, [r0, #0xc]
+ bl sub_080B19C8
+_080B19C0EU:
+ pop {r4, r5, r6, r7, r8, sb, sl, fp, lr}
+ bx lr
+
+ arm_func_start sub_080B19C8
+sub_080B19C8: @ 0x080B19C8
+ ldrb r2, [r0]
+ cmp r2, #0
+ bxeq lr
+ ldr r1, _080B2A44 @ =0x08131D3C
+ ldr r1, [r1, #0x10]
+ mov r2, #0
+ strb r2, [r1]
+ stmdb sp!, {lr}
+ bl ResolveOamDrawPriority
+ bl sub_080B2534
+ ldm sp!, {lr}
+ b _080B1C40EU
+.else
+ push {r4, r5, r6, r7, r8, sb, sl, fp, lr}
+ ldr fp, _080B2A30 @ =gOAMControls
+ ldrb r2, [fp, #3]
+ cmp r2, #0x80
+ bhs _080B2440
+ add r0, pc, #0x34 @ =_080B2440
+ str r0, [fp, #0x18]
+ str sp, [fp, #0x14]
+ ldr r0, _080B2A34 @ =gUnk_081326EC
+ ldr r0, [r0]
+ bl sub_080B2448
+ ldr r0, _080B2A38 @ =gUnk_081326EC
+ ldr r0, [r0, #4]
+ bl sub_080B2448
+ ldr r0, _080B2A3C @ =gUnk_081326EC
+ ldr r0, [r0, #8]
+ bl sub_080B2448
+ ldr r0, _080B2A40 @ =gUnk_081326EC
+ ldr r0, [r0, #0xc]
+ bl sub_080B2448
+_080B2440:
+ pop {r4, r5, r6, r7, r8, sb, sl, fp, lr}
+ bx lr
+
+ arm_func_start sub_080B2448
+sub_080B2448: @ 0x080B2448
+ ldrb r2, [r0]
+ cmp r2, #0
+ bxeq lr
+ ldr r1, _080B2A44 @ =gUnk_081326EC
+ ldr r1, [r1, #0x10]
+ mov r2, #0
+ strb r2, [r1]
+ stmdb sp!, {lr}
+ bl ResolveOamDrawPriority
+ bl sub_080B2534
+ ldm sp!, {lr}
+ b _080B26B4
+.endif
+.endif
+
+ arm_func_start ResolveOamDrawPriority
+ResolveOamDrawPriority: @ 0x080B2478
+ prio_a .req r8
+ prio_b .req r5
+
+ mov sb, r0
+ mov r1, r0
+ ldrb r2, [r1], #4
+ mov ip, r1
+ sub sl, r2, #1
+ add r2, r1, sl, lsl #2
+ cmp sl, #0
+ beq no_objs
+_080B2498:
+ lsl r3, sl, #2
+ mov r6, #0
+_080B24A0:
+ cmp r6, sl
+ bhs _080B2524
+ sub r1, r2, r3
+ sub r1, r1, r6, lsl #2
+_080B24B0:
+ cmp r1, ip
+ blo _080B251C
+# sprite A
+ ldr r4, [r1]
+# pos
+ ldr r8, [r4, #0x30]
+ add r8, #0x80000000
+ lsr r8, #3
+# load priority bits, NOT so 0 = highest priority
+ ldrb r0, [r4, #0x29]
+ mvn r0, r0
+ orr prio_a, r8, r0, lsl #29
+ add r7, r1, r3
+next_sprite:
+ cmp r2, r7
+ blo a_priority
+# sprite B
+ ldr r5, [r7]
+ ldr r0, [r5, #0x30]
+ add r0, #0x80000000
+ lsr r0, #3
+ ldrb r5, [r5, #0x29]
+ mvn r5, r5
+ orr prio_b, r0, r5, lsl #29
+ cmp prio_a, prio_b
+ bhs a_priority
+ ldr r5, [r7], -r3
+ str r5, [r7], r3, lsl #1
+ b next_sprite
+a_priority:
+ str r4, [r7, -r3]!
+ sub r1, r1, r3
+ b _080B24B0
+_080B251C:
+ add r6, #1
+ b _080B24A0
+_080B2524:
+ lsrs sl, #1
+ bne _080B2498
+no_objs:
+ mov r0, sb
+ bx lr
+
+ arm_func_start sub_080B2534
+sub_080B2534: @ 0x080B2534
+ stmdb sp!, {lr}
+ mov r4, r0
+ ldrb r5, [r4], #4
+_080B2540:
+ ldr r0, [r4], #4
+ push {r4, r5}
+ bl sub_080B255C
+ pop {r4, r5}
+ subs r5, r5, #1
+ bgt _080B2540
+ ldm sp!, {pc}
+
+ arm_func_start sub_080B255C
+sub_080B255C: @ 0x080B255C
+.ifdef EU
+ stmdb sp!, {lr}
+ mov r4, r0
+ bl sub_080B299C
+ ldr r3, [fp, #0x1c]
+ mov lr, pc
+.ifdef DEMO_JP
+ bx r3
+.else
+ bxne r3
+.endif
+ mov r5, #0
+ strb r5, [fp, #0x12]
+ ldrsb r2, [r4, #0x29]
+ ands r2, r2, #8
+ beq _080B1BB8
+ ldrsh r3, [r4, #0x36]
+ cmp r3, #0
+ bmi _080B1BA4
+ mov r1, #0
+ mov r2, #0
+ bl sub_080B1BCC
+ ldrb r1, [r4, #0x18]
+ and r1, r1, #0x30
+ mov r1, r1
+ cmp r0, #0x19
+ beq _080B1B98
+ cmp r0, #0x2f
+ beq _080B1B64
+ cmp r0, #0xf
+ bne _080B1BA4
+ mov r5, #2
+ strb r5, [fp, #0x12]
+ add r7, r7, r5
+ ldrb r2, [fp, #1]
+ and r2, r2, #0x18
+ add r2, r2, #0x80
+ lsr r2, r2, #2
+ b _080B1B74
+_080B1B64:
+ ldrb r2, [r4, #0x2e]
+ ldrb r3, [r4, #0x32]
+ eor r2, r2, r3
+ and r2, r2, #6
+_080B1B74:
+ ldr r3, _080B2A48 @ =ram_0x80b2b58
+ add r2, r1, r2, lsl #1
+ ldr sl, [r3, r2]
+ push {r4, r8, sb}
+ mov r8, #0
+ and sb, sb, #0xc00
+ bl sub_080B2874
+ pop {r4, r8, sb, lr}
+ b _080B2718
+_080B1B98:
+ mov r5, #2
+ strb r5, [fp, #0x12]
+ add r7, r7, r5
+_080B1BA4:
+ stmdb sp!, {r4}
+ mov r0, r4
+ bl _080B2718
+ pop {r4, lr}
+ b _080B1BC0
+_080B1BB8:
+ ldm sp!, {lr}
+ b _080B2718
+_080B1BC0:
+ ldrsh r1, [r4, #0x36]
+ ldrb r0, [r4, #0x29]
+ tst r0, #0x10
+ beq _080B1BD8
+ cmp r1, #0
+ bxpl lr
+_080B1BD8:
+ tst r0, #0x20
+ beq _080B1BEC
+ ldrb r0, [fp, #1]
+ tst r0, #1
+ bxne lr
+_080B1BEC:
+ mov r2, r7
+ cmp r1, #0
+ submi r2, r2, r1
+ ldr r3, _080B2A4C @ =gUnk_081326EC
+ ldr r3, [r3, #0x10]
+ ldrb r0, [r3]
+ cmp r0, #0x40
+ bxhs lr
+ add r0, r0, #1
+ strb r0, [r3]
+ add r3, r3, r0, lsl #2
+ lsr r0, sb, #0xa
+ and r0, r0, #3
+ orr r0, r0, r2, lsl #6
+ strh r0, [r3, #2]
+ ldrb r0, [r4, #0x18]
+ and r0, r0, #0x30
+ lsr r0, r0, #4
+ orr r0, r0, r6, lsl #6
+ strh r0, [r3]
+ bx lr
+_080B1C40EU:
+ ldr r4, _080B2A50 @ =gUnk_081326EC
+ ldr r4, [r4, #0x10]
+ ldrb r5, [r4]
+ cmp r5, #0
+ bxeq lr
+ stmdb sp!, {lr}
+ add r4, r4, #4
+_080B1C5C:
+ ldrsh r0, [r4]
+ asr r6, r0, #6
+ and r1, r0, #7
+ ldr sl, _080B2A54 @ =ram_0x80b2bd8
+ ldr sl, [sl, r1, lsl #2]
+ ldrsh r0, [r4, #2]
+ asr r7, r0, #6
+ and r1, r0, #3
+ lsl sb, r1, #0xa
+ mov r8, #0
+ push {r4, r5}
+ bl sub_080B2874
+ pop {r4, r5}
+ add r4, r4, #4
+ subs r5, r5, #1
+ bgt _080B1C5C
+ ldm sp!, {lr}
+ bx lr
+
+.else
+.ifdef DEMO_JP @ TODO deduplicate nearly same as EU
+ stmdb sp!, {lr}
+ mov r4, r0
+ bl sub_080B299C
+ ldr r3, [fp, #0x1c]
+ mov lr, pc
+.ifdef DEMO_JP
+ bx r3
+.else
+ bxne r3
+.endif
+ mov r5, #0
+ strb r5, [fp, #0x12]
+ ldrsb r2, [r4, #0x29]
+ ands r2, r2, #8
+ beq _080B1BB8
+ ldrsh r3, [r4, #0x36]
+ cmp r3, #0
+ bmi _080B1BA4
+ mov r1, #0
+ mov r2, #0
+ bl sub_080B1BCC
+ ldrb r1, [r4, #0x18]
+ and r1, r1, #0x30
+ mov r1, r1
+ cmp r0, #0x19
+ beq _080B1B98
+ cmp r0, #0x2f
+ beq _080B1B64
+ cmp r0, #0xf
+ bne _080B1BA4
+ mov r5, #2
+ strb r5, [fp, #0x12]
+ add r7, r7, r5
+ ldrb r2, [fp, #1]
+ and r2, r2, #0x18
+ add r2, r2, #0x80
+ lsr r2, r2, #2
+ b _080B1B74
+_080B1B64:
+ ldrb r2, [r4, #0x2e]
+ ldrb r3, [r4, #0x32]
+ eor r2, r2, r3
+ and r2, r2, #6
+_080B1B74:
+ ldr r3, _080B2A48 @ =ram_0x80b2b58
+ add r2, r1, r2, lsl #1
+ ldr sl, [r3, r2]
+ push {r4, r8, sb}
+ mov r8, #0
+ and sb, sb, #0xc00
+ bl sub_080B2874
+ pop {r4, r8, sb, lr}
+ b _080B2718
+_080B1B98:
+ mov r5, #2
+ strb r5, [fp, #0x12]
+ add r7, r7, r5
+_080B1BA4:
+ stmdb sp!, {r4}
+ mov r0, r4
+ bl _080B2718
+ pop {r4, lr}
+ b _080B1BC0
+_080B1BB8:
+ ldm sp!, {lr}
+ b _080B2718
+_080B1BC0:
+ ldrsh r1, [r4, #0x36]
+ ldrb r0, [r4, #0x29]
+ tst r0, #0x10
+ beq _080B1BD8
+ cmp r1, #0
+ bxpl lr
+_080B1BD8:
+ tst r0, #0x20
+ beq _080B1BEC
+ ldrb r0, [fp, #1]
+ tst r0, #1
+ bxne lr
+_080B1BEC:
+ mov r2, r7
+ cmp r1, #0
+ submi r2, r2, r1
+ ldr r3, _080B2A4C @ =gUnk_081326EC
+ ldr r3, [r3, #0x10]
+ ldrb r0, [r3]
+ cmp r0, #0x40
+ bxhs lr
+ add r0, r0, #1
+ strb r0, [r3]
+ add r3, r3, r0, lsl #2
+ lsr r0, sb, #0xa
+ and r0, r0, #3
+ orr r0, r0, r2, lsl #6
+ strh r0, [r3, #2]
+ ldrb r0, [r4, #0x18]
+ and r0, r0, #0x30
+ lsr r0, r0, #4
+ orr r0, r0, r6, lsl #6
+ strh r0, [r3]
+ bx lr
+_080B1C40EU:
+ ldr r4, _080B2A50 @ =gUnk_081326EC
+ ldr r4, [r4, #0x10]
+ ldrb r5, [r4]
+ cmp r5, #0
+ bxeq lr
+ stmdb sp!, {lr}
+ add r4, r4, #4
+_080B1C5C:
+ ldrsh r0, [r4]
+ asr r6, r0, #6
+ and r1, r0, #7
+ ldr sl, _080B2A54 @ =ram_0x80b2bd8
+ ldr sl, [sl, r1, lsl #2]
+ ldrsh r0, [r4, #2]
+ asr r7, r0, #6
+ and r1, r0, #3
+ lsl sb, r1, #0xa
+ mov r8, #0
+ push {r4, r5}
+ bl sub_080B2874
+ pop {r4, r5}
+ add r4, r4, #4
+ subs r5, r5, #1
+ bgt _080B1C5C
+ ldm sp!, {lr}
+ bx lr
+
+.else
+ stmdb sp!, {lr}
+ mov r4, r0
+ bl sub_080B299C
+ mov r5, #0
+ strb r5, [fp, #0x12]
+ ldrsb r2, [r4, #0x29]
+ ands r2, r2, #8
+ beq _080B262C
+ ldrsh r3, [r4, #0x36]
+ cmp r3, #0
+ bmi _080B2618
+ mov r1, #0
+ mov r2, #0
+ bl sub_080B1BCC
+ ldrb r1, [r4, #0x18]
+ and r1, r1, #0x30
+ mov r1, r1
+ cmp r0, #0x19
+ beq _080B260C
+ cmp r0, #0x2f
+ beq _080B25D8
+ cmp r0, #0xf
+ bne _080B2618
+ mov r5, #2
+ strb r5, [fp, #0x12]
+ add r7, r7, r5
+ ldrb r2, [fp, #1]
+ and r2, r2, #0x18
+ add r2, r2, #0x80
+ lsr r2, r2, #2
+ b _080B25E8
+_080B25D8:
+ ldrb r2, [r4, #0x2e]
+ ldrb r3, [r4, #0x32]
+ eor r2, r2, r3
+ and r2, r2, #6
+_080B25E8:
+ ldr r3, _080B2A48 @ =ram_0x80b2b58
+ add r2, r1, r2, lsl #1
+ ldr sl, [r3, r2]
+ push {r4, r8, sb}
+ mov r8, #0
+ and sb, sb, #0xc00
+ bl sub_080B2874
+ pop {r4, r8, sb, lr}
+ b _080B2718
+_080B260C:
+ mov r5, #2
+ strb r5, [fp, #0x12]
+ add r7, r7, r5
+_080B2618:
+ stmdb sp!, {r4}
+ mov r0, r4
+ bl _080B2718
+ pop {r4, lr}
+ b _080B2634
+_080B262C:
+ ldm sp!, {lr}
+ b _080B2718
+_080B2634:
+ ldrsh r1, [r4, #0x36]
+ ldrb r0, [r4, #0x29]
+ tst r0, #0x10
+ beq _080B264C
+ cmp r1, #0
+ bxpl lr
+_080B264C:
+ tst r0, #0x20
+ beq _080B2660
+ ldrb r0, [fp, #1]
+ tst r0, #1
+ bxne lr
+_080B2660:
+ mov r2, r7
+ cmp r1, #0
+ submi r2, r2, r1
+ ldr r3, _080B2A4C @ =gUnk_081326EC
+ ldr r3, [r3, #0x10]
+ ldrb r0, [r3]
+ cmp r0, #0x40
+ bxhs lr
+ add r0, r0, #1
+ strb r0, [r3]
+ add r3, r3, r0, lsl #2
+ lsr r0, sb, #0xa
+ and r0, r0, #3
+ orr r0, r0, r2, lsl #6
+ strh r0, [r3, #2]
+ ldrb r0, [r4, #0x18]
+ and r0, r0, #0x30
+ lsr r0, r0, #4
+ orr r0, r0, r6, lsl #6
+ strh r0, [r3]
+ bx lr
+_080B26B4:
+ ldr r4, _080B2A50 @ =gUnk_081326EC
+ ldr r4, [r4, #0x10]
+ ldrb r5, [r4]
+ cmp r5, #0
+ bxeq lr
+ stmdb sp!, {lr}
+ add r4, r4, #4
+_080B26D0:
+ ldrsh r0, [r4]
+ asr r6, r0, #6
+ and r1, r0, #7
+ ldr sl, _080B2A54 @ =ram_0x80b2bd8
+ ldr sl, [sl, r1, lsl #2]
+ ldrsh r0, [r4, #2]
+ asr r7, r0, #6
+ and r1, r0, #3
+ lsl sb, r1, #0xa
+ mov r8, #0
+ push {r4, r5}
+ bl sub_080B2874
+ pop {r4, r5}
+ add r4, r4, #4
+ subs r5, r5, #1
+ bgt _080B26D0
+ ldm sp!, {lr}
+ bx lr
+
+.endif
+.endif
+
+
+_080B2718:
+ ldrsb r0, [r4, #0x28]
+ cmp r0, #0
+ beq _080B27E4
+ bpl _080B2730
+ ldr sl, [r4, #0x64]
+ b sub_080B2874
+_080B2730:
+ ldr r4, _080B2A58 @ =gUnk_020000C0
+ add r4, r4, r0, lsl #6
+ mov r5, #4
+ bic sb, sb, #0xf000
+_080B2740:
+ ldrb r0, [r4]
+ tst r0, #1
+ bxeq lr
+ tst r0, #2
+ bne _080B27B8
+ ldrb r0, [r4, #1]
+ cmp r0, #0xff
+ beq _080B27A8
+ push {r4, r5, r6, r7, r8, sb, lr}
+ ldrb r2, [r4, #4]
+ eor r8, r8, r2, lsl #28
+ ldrsb r2, [r4, #6]
+ tst r8, #0x10000000
+ addeq r6, r6, r2
+ subne r6, r6, r2
+ ldrsb r2, [r4, #7]
+ tst r8, #0x20000000
+ addeq r7, r7, r2
+ addne r7, r7, r2
+ ldrb r2, [r4, #5]
+ orr sb, sb, r2, lsl #12
+ ldrb r2, [r4, #8]
+ add sb, sb, r2
+ ldrh r1, [r4, #2]
+ bl sub_080B27F4
+ pop {r4, r5, r6, r7, r8, sb, lr}
+_080B27A8:
+ add r4, r4, #0x10
+ subs r5, r5, #1
+ bne _080B2740
+ bx lr
+_080B27B8:
+ ldr r0, [r4, #0xc]
+ cmp r0, #0
+ beq _080B27A8
+ push {r4, r5, lr}
+ bl sub_080B299C
+ mov r4, r0
+ ldrb r5, [fp, #0x12]
+ add r7, r7, r5
+ bl _080B27E4
+ pop {r4, r5, lr}
+ b _080B27A8
+_080B27E4:
+ ldrb r0, [r4, #0x1e]
+ cmp r0, #0xff
+ bxeq lr
+ ldrh r1, [r4, #0x12]
+
+ arm_func_start sub_080B27F4
+sub_080B27F4: @ 0x080B27F4
+ ldr sl, _080B2A5C @ =gFrameObjLists
+ ldr r2, [sl, r1, lsl #2]
+ add r2, r2, sl
+ ldr r0, [r2, r0, lsl #2]
+ add sl, sl, r0
+ b sub_080B2874
+
+ arm_func_start arm_DrawDirect
+arm_DrawDirect: @ 0x080B280C
+ cmp r2, #0xff
+ bxeq lr
+ ldr r3, _080B2A60 @ =gFrameObjLists
+ ldr r1, [r3, r1, lsl #2]
+ add r1, r1, r2, lsl #2
+ ldr r1, [r3, r1]
+ add r1, r1, r3
+arm_sub_080ADA04:
+ ldrb r2, [r1]
+ cmp r2, #0
+ bxeq lr
+ push {r4, r5, r6, r7, r8, sb, sl, fp, lr}
+ ldr fp, _080B2A64 @ =gOAMControls
+ ldrb r3, [fp, #3]
+ cmp r3, #0x80
+ bhs _080B286C
+ mov sl, r1
+ ldrsh r6, [r0]
+ ldrsh r7, [r0, #2]
+ ldr r8, [r0, #4]
+ ldrh sb, [r0, #8]
+ add r3, pc, #0x8 @ =_080B286C
+ str r3, [fp, #0x18]
+ str sp, [fp, #0x14]
+ bl sub_080B2874
+_080B286C:
+ pop {r4, r5, r6, r7, r8, sb, sl, fp, lr}
+ bx lr
+
+ arm_func_start sub_080B2874
+sub_080B2874: @ 0x080B2874
+ ldrb r0, [sl], #1
+ lsls r0, r0, #0x18
+ bxeq lr
+ lsl sb, sb, #0x10
+ orr sb, r0, sb, lsr #16
+ ands r0, r8, #0x300
+ beq _080B289C
+ subs r0, r0, #0x100
+ movne r0, #0xc0
+ b _080B28A8
+_080B289C:
+ and r0, r8, #0x30000000
+ lsr r0, r0, #0x18
+ add r0, r0, r0, lsl #1
+_080B28A8:
+ ldr r5, _080B2A68 @ =ram_0x80b2be8
+ add r5, r5, r0
+ ldrb r0, [fp, #3]
+ orr sb, sb, r0, lsl #16
+ add ip, fp, #0x20
+ add ip, ip, r0, lsl #3
+_080B28C0:
+ sub sb, sb, #0x1000000
+ ldrsb r2, [sl], #5
+ ldrsb r1, [sl, #-4]
+ tst r8, #0x300
+ bne _080B28E4
+ tst r8, #0x20000000
+ rsbne r1, r1, #0
+ tst r8, #0x10000000
+ rsbne r2, r2, #0
+_080B28E4:
+ ldrb r3, [sl, #-3]
+ and r0, r3, #0xf0
+ add r4, r5, r0, lsr #2
+ add r1, r1, r7
+ ldrb r0, [r4, #1]
+ sub r1, r1, r0
+ cmp r1, #0xa0
+ bge _080B2974
+ ldrb r0, [r4, #3]
+ cmn r1, r0
+ ble _080B2974
+ add r2, r2, r6
+ ldrb r0, [r4]
+ sub r2, r2, r0
+ cmp r2, #0xf0
+ bge _080B2974
+ ldrb r0, [r4, #2]
+ cmn r2, r0
+ ble _080B2974
+ and r0, r1, #0xff
+ lsl r2, r2, #0x17
+ orr r0, r0, r2, lsr #7
+ orr r0, r0, r8
+ and r1, r3, #0xc0
+ orr r0, r0, r1, lsl #8
+ and r1, r3, #0x3c
+ eor r0, r0, r1, lsl #26
+ str r0, [ip], #4
+ ldrb r0, [sl, #-2]
+ add r0, r0, sb
+ tst r3, #1
+ bicne r0, r0, #0xf000
+ ldrb r1, [sl, #-1]
+ add r0, r0, r1, lsl #8
+ strh r0, [ip], #4
+ add sb, sb, #0x10000
+_080B2974:
+ lsrs r0, sb, #0x18
+ bhs _080B298C
+ bne _080B28C0
+ lsr r0, sb, #0x10
+ strb r0, [fp, #3]
+ bx lr
+_080B298C:
+ mov r0, #0x80
+ strb r0, [fp, #3]
+ ldr sp, [fp, #0x14]
+ ldr pc, [fp, #0x18]
+
+ arm_func_start sub_080B299C
+sub_080B299C: @ 0x080B299C
+ ldrsb r6, [r0, #0x3d]
+ cmp r6, #0
+ ldrbgt r6, [fp, #0xe]
+ movle r6, #0
+ ldr ip, [r0, #0x18]
+ ldrh sb, [r0, #0x60]
+ ldrb r5, [r0, #0x1a]
+ orr r5, r5, r6
+ and r5, r5, #0xf
+ orr sb, sb, r5, lsl #12
+ ldrb r5, [r0, #0x1b]
+ and r5, r5, #0xc0
+ orr sb, sb, r5, lsl #4
+ ldrsh r6, [r0, #0x2e]
+ ldrsb r5, [r0, #0x62]
+ add r6, r6, r5
+ ldrsh r7, [r0, #0x32]
+ ldrsh r5, [r0, #0x36]
+ add r7, r7, r5
+ ldrsb r5, [r0, #0x63]
+ add r7, r7, r5
+ and r5, ip, #3
+ cmp r5, #2
+ beq _080B2A0C
+ ldrsh r5, [fp, #4]
+ sub r6, r6, r5
+ ldrsh r5, [fp, #6]
+ sub r7, r7, r5
+_080B2A0C:
+ ldr r8, _080B2A6C @ =0x3E003F00
+ and r8, r8, ip
+ ldrb r5, [fp, #2]
+ orr r8, r8, r5, lsl #12
+ ldrb r5, [r0, #0x5b]
+ eor r5, r5, ip
+ and r5, r5, #0xc0
+ orr r8, r8, r5, lsl #22
+ bx lr
+ .align 2, 0
+
+.ifdef EU
+_080B1FBC:
+ mov sl, lr
+ ldrsh r0, [fp, #0x1c]
+ ldrsh r1, [fp, #0x1e]
+ ldrsh r2, [fp, #4]
+ sub r0, r0, r2
+ ldrsh r3, [fp, #6]
+ sub r1, r1, r3
+ mov r2, #0
+ mov r3, #0
+ bl arm_CheckBitsEU
+ mov r5, #0
+ ldr r4, _080B2194 @ =0x03003DF8
+_080B1FECEU:
+ ldr r0, [r4, #8]
+ cmp r0, #0
+ beq _080B2074EU
+ ldrsh r6, [r0, #0x2e]
+ ldrsh r7, [r0, #0x32]
+ ldr r3, [r4, #4]
+ cmp r3, #0
+ beq _080B2024
+ ldrsb r0, [r3]
+ add r6, r6, r0
+ ldrsb r0, [r3, #1]
+ add r7, r7, r0
+ add r3, r3, #2
+ b _080B202C
+_080B2024:
+ ldr r3, [r0, #0x48]
+ add r3, r3, #6
+_080B202C:
+ ldrsh r0, [fp, #4]
+ sub r6, r6, r0
+ ldrsh r0, [fp, #6]
+ sub r7, r7, r0
+ ldrb r0, [r3]
+ ldrb r1, [r3, #1]
+ ldr r2, [fp, #1]
+ and r2, r2, #3
+ lsl r3, r2, #0x1c
+ lsrs r2, r2, #1
+ rsblo r0, r0, #0
+ subhs r0, r0, #8
+ rsbeq r1, r1, #0
+ subne r1, r1, #8
+ add r0, r0, r6
+ add r1, r1, r7
+ mov r2, #0
+ bl arm_CheckBitsEU
+_080B2074EU:
+ add r4, r4, #0xc
+ add r5, r5, #1
+ cmp r5, #0x1f
+ bls _080B1FECEU
+ bx sl
+
+ arm_func_start arm_sub_080B2088
+arm_sub_080B2088: @ 0x080B2088
+ ldr r5, [r4, #0x48]
+ cmp r5, #0
+ bxeq lr
+ ldrb r0, [r5, #6]
+ ldrb r1, [r5, #7]
+ ldr r2, [fp, #1]
+ and r2, r2, #3
+ lsl r3, r2, #0x1c
+ lsrs r2, r2, #1
+ rsblo r0, r0, #0
+ subhs r0, r0, #8
+ rsbeq r1, r1, #0
+ subne r1, r1, #8
+ ldrsb r2, [r5]
+ add r0, r6, r0
+ add r0, r0, r2
+ ldrsb r2, [r5, #1]
+ add r1, r7, r1
+ add r1, r1, r2
+ mov r2, sb
+ b arm_CheckBitsEU
+_080B20DC:
+ mov r0, r6
+ mov r1, r7
+ mov r2, r9
+ mov r3, #0x0
+
+ arm_func_start arm_CheckBitsEU
+arm_CheckBitsEU: @ 0x080B20EC
+ add ip, r1, #7
+ cmp ip, #0xa8
+ bxhs lr
+ add ip, r0, #7
+ cmp ip, #0xf8
+ bxhs lr
+ and r1, r1, #0xff
+ lsl r0, r0, #0x17
+ orr r0, r1, r0, lsr #7
+ eor r0, r0, r3
+ and r1, r2, #0xc00
+ add r1, r1, #0xff
+ ldrb r3, [fp, #3]
+ add ip, fp, #0x20
+ add ip, ip, r3, lsl #3
+ str r0, [ip]
+ strh r1, [ip, #4]
+ add r3, r3, #1
+ cmp r3, #0x80
+ bhs _080B298C
+ strb r3, [fp, #3]
+ bx lr
+_080B2144:
+ .4byte ram_sub_080B2140
+ .4byte ram_sub_080B20DC
+ .4byte ram_sub_080B2088
+.endif
+.ifdef DEMO_JP @ TODO deduplicate same as EU
+_080B1FBC:
+ mov sl, lr
+ ldrsh r0, [fp, #0x1c]
+ ldrsh r1, [fp, #0x1e]
+ ldrsh r2, [fp, #4]
+ sub r0, r0, r2
+ ldrsh r3, [fp, #6]
+ sub r1, r1, r3
+ mov r2, #0
+ mov r3, #0
+ bl arm_CheckBitsEU
+ mov r5, #0
+ ldr r4, _080B2194 @ =0x03003DF8
+_080B1FECEU:
+ ldr r0, [r4, #8]
+ cmp r0, #0
+ beq _080B2074EU
+ ldrsh r6, [r0, #0x2e]
+ ldrsh r7, [r0, #0x32]
+ ldr r3, [r4, #4]
+ cmp r3, #0
+ beq _080B2024
+ ldrsb r0, [r3]
+ add r6, r6, r0
+ ldrsb r0, [r3, #1]
+ add r7, r7, r0
+ add r3, r3, #2
+ b _080B202C
+_080B2024:
+ ldr r3, [r0, #0x48]
+ add r3, r3, #6
+_080B202C:
+ ldrsh r0, [fp, #4]
+ sub r6, r6, r0
+ ldrsh r0, [fp, #6]
+ sub r7, r7, r0
+ ldrb r0, [r3]
+ ldrb r1, [r3, #1]
+ ldr r2, [fp, #1]
+ and r2, r2, #3
+ lsl r3, r2, #0x1c
+ lsrs r2, r2, #1
+ rsblo r0, r0, #0
+ subhs r0, r0, #8
+ rsbeq r1, r1, #0
+ subne r1, r1, #8
+ add r0, r0, r6
+ add r1, r1, r7
+ mov r2, #0
+ bl arm_CheckBitsEU
+_080B2074EU:
+ add r4, r4, #0xc
+ add r5, r5, #1
+ cmp r5, #0x1f
+ bls _080B1FECEU
+ bx sl
+
+ arm_func_start sub_080B2088
+sub_080B2088: @ 0x080B2088
+ ldr r5, [r4, #0x48]
+ cmp r5, #0
+ bxeq lr
+ ldrb r0, [r5, #6]
+ ldrb r1, [r5, #7]
+ ldr r2, [fp, #1]
+ and r2, r2, #3
+ lsl r3, r2, #0x1c
+ lsrs r2, r2, #1
+ rsblo r0, r0, #0
+ subhs r0, r0, #8
+ rsbeq r1, r1, #0
+ subne r1, r1, #8
+ ldrsb r2, [r5]
+ add r0, r6, r0
+ add r0, r0, r2
+ ldrsb r2, [r5, #1]
+ add r1, r7, r1
+ add r1, r1, r2
+ mov r2, sb
+ b arm_CheckBitsEU
+_080B20DC:
+ mov r0, r6
+ mov r1, r7
+ mov r2, r9
+ mov r3, #0x0
+
+ arm_func_start arm_CheckBitsEU
+arm_CheckBitsEU: @ 0x080B20EC
+ add ip, r1, #7
+ cmp ip, #0xa8
+ bxhs lr
+ add ip, r0, #7
+ cmp ip, #0xf8
+ bxhs lr
+ and r1, r1, #0xff
+ lsl r0, r0, #0x17
+ orr r0, r1, r0, lsr #7
+ eor r0, r0, r3
+ and r1, r2, #0xc00
+ add r1, r1, #0xff
+ ldrb r3, [fp, #3]
+ add ip, fp, #0x20
+ add ip, ip, r3, lsl #3
+ str r0, [ip]
+ strh r1, [ip, #4]
+ add r3, r3, #1
+ cmp r3, #0x80
+ bhs _080B298C
+ strb r3, [fp, #3]
+ bx lr
+_080B2144:
+ .4byte ram_sub_080B2140
+ .4byte ram_sub_080B20DC
+ .4byte ram_sub_080B2088
+.endif
+
+_080B2A30: .4byte gOAMControls
+.ifdef EU
+_080B2154: .4byte 0x03006958 @TODO make pointer?
+.endif
+.ifdef DEMO_JP @ TODO deduplicate same as EU
+_080B2154: .4byte 0x03006958 @TODO make pointer?
+.endif
+_080B2A34: .4byte gUnk_081326EC
+_080B2A38: .4byte gUnk_081326EC
+_080B2A3C: .4byte gUnk_081326EC
+_080B2A40: .4byte gUnk_081326EC
+_080B2A44: .4byte gUnk_081326EC
+_080B2A48: .4byte ram_0x80b2b58
+_080B2A4C: .4byte gUnk_081326EC
+_080B2A50: .4byte gUnk_081326EC
+_080B2A54: .4byte ram_0x80b2bd8
+_080B2A58: .4byte gUnk_020000C0
+_080B2A5C: .4byte gFrameObjLists
+_080B2A60: .4byte gFrameObjLists
+_080B2A64: .4byte gOAMControls
+_080B2A68: .4byte ram_0x80b2be8
+_080B2A6C: .4byte 0x3E003F00
+.ifdef EU
+_080B2194: .4byte 0x03003DF8 @TODO pointer?
+.endif
+.ifdef DEMO_JP @ TODO deduplicate same as EU
+_080B2194: .4byte 0x03003DF8 @TODO pointer?
+.endif
diff --git a/asm/src/player.s b/asm/src/player.s
new file mode 100644
index 00000000..3bc4edf3
--- /dev/null
+++ b/asm/src/player.s
@@ -0,0 +1,786 @@
+ .include "asm/macros.inc"
+ .include "constants/constants.inc"
+
+ .syntax unified
+
+ .text
+
+ thumb_func_start sub_0800857C
+sub_0800857C: @ 0x0800857C
+ push {r4, r5, r6, r7, lr}
+ mov r4, r8
+ mov r5, sb
+ mov r6, sl
+ mov r7, fp
+ push {r4, r5, r6, r7}
+ ldrb r1, [r0, #0xb]
+ lsrs r1, r1, #8
+ bhs _0800859C
+ ldr r1, _08008888 @ =gPlayerState
+ ldrb r1, [r1, #2]
+ movs r2, #0x80
+ ands r1, r2
+ bne _0800859C
+ bl sub_080085CC
+_0800859C:
+ ldrh r1, [r0, #0x24]
+ ldrb r2, [r0, #0x15]
+ bl sub_080027EA
+ pop {r4, r5, r6, r7}
+ mov r8, r4
+ mov sb, r5
+ mov sl, r6
+ mov fp, r7
+ pop {r4, r5, r6, r7, pc}
+
+ thumb_func_start sub_080085B0
+sub_080085B0: @ 0x080085B0
+ push {r3, r4, r5, r6, r7, lr}
+ mov r4, r8
+ mov r5, sb
+ mov r6, sl
+ mov r7, fp
+ push {r4, r5, r6, r7}
+ bl sub_080085CC
+ pop {r4, r5, r6, r7}
+ mov r8, r4
+ mov sb, r5
+ mov sl, r6
+ mov fp, r7
+ pop {r3, r4, r5, r6, r7, pc}
+
+ thumb_func_start sub_080085CC
+sub_080085CC: @ 0x080085CC
+ push {lr}
+ ldr r2, _0800888C @ =gPlayerState
+ ldr r1, _08008890 @ =gUnk_080083FC
+ movs r3, #0x26
+ ldrb r3, [r2, r3]
+ orrs r3, r3
+ beq _080085E6
+ ldr r2, [r2, #0x30]
+ movs r3, #0x80
+ ands r2, r3
+ beq _0800861A
+ ldr r1, _08008894 @ =gUnk_0800839C
+ b _0800861A
+_080085E6:
+ ldr r1, _08008898 @ =gUnk_0800845C
+ ldrb r3, [r2, #2]
+ orrs r3, r3
+ bne _0800861A
+ ldr r2, [r2, #0x30]
+ ldr r3, _0800889C @ =0x01000000
+ tst r2, r3
+ bne _0800861A
+ movs r3, #0x80
+ ldr r1, _080088A0 @ =gUnk_0800833C
+ ands r2, r3
+ bne _0800861A
+ ldr r1, _080088A4 @ =gUnk_080084BC
+ ldr r3, _080088A8 @ =gPlayerState
+ ldrb r2, [r3, #0x1c]
+ orrs r2, r2
+ bne _0800861A
+ ldrb r2, [r3, #5]
+ orrs r2, r2
+ bne _0800861A
+ ldr r1, _080088AC @ =gUnk_0800851C
+ movs r2, #0xaa
+ ldrb r2, [r3, r2]
+ orrs r2, r2
+ bne _0800861A
+ ldr r1, _080088B0 @ =gUnk_080082DC
+_0800861A:
+ mov fp, r1
+ movs r7, #0
+ mov r8, r0
+ movs r2, #0x2e
+ ldrh r3, [r0, r2]
+ movs r2, #0x32
+ ldrh r4, [r0, r2]
+ movs r2, #0x48
+ ldr r5, [r0, r2]
+ ldr r1, _080088B4 @ =gRoomControls + 6
+ ldrh r1, [r1]
+ subs r3, r3, r1
+ ldr r1, _080088B8 @ =gRoomControls + 8
+ ldrh r1, [r1]
+ subs r4, r4, r1
+ eors r2, r2
+ ldrsb r0, [r5, r2]
+ adds r0, r0, r3
+ movs r2, #1
+ ldrsb r1, [r5, r2]
+ adds r1, r1, r4
+ push {r0, r1}
+ ldrb r2, [r5, #2]
+ adds r0, r0, r2
+ ldrb r4, [r5, #3]
+ movs r6, #2
+ mov sl, r1
+_08008650:
+ lsls r7, r7, #1
+ lsls r7, r7, #1
+ adds r1, r1, r4
+ bl sub_080086D8
+ orrs r7, r2
+ lsls r7, r7, #1
+ mov r1, sl
+ subs r1, r1, r4
+ bl sub_080086D8
+ orrs r7, r2
+ lsls r7, r7, #1
+ subs r6, #1
+ beq _08008678
+ mov r1, sl
+ ldrb r3, [r5, #2]
+ subs r0, r0, r3
+ subs r0, r0, r3
+ b _08008650
+_08008678:
+ pop {r0, r1}
+ ldrb r2, [r5, #5]
+ adds r1, r1, r2
+ ldrb r4, [r5, #4]
+ movs r6, #2
+ mov sb, r0
+_08008684:
+ lsls r7, r7, #1
+ lsls r7, r7, #1
+ adds r0, r0, r4
+ bl sub_080086D8
+ orrs r7, r2
+ lsls r7, r7, #1
+ mov r0, sb
+ subs r0, r0, r4
+ bl sub_080086D8
+ orrs r7, r2
+ lsls r7, r7, #1
+ subs r6, #1
+ beq _080086AC
+ mov r0, sb
+ ldrb r3, [r5, #5]
+ subs r1, r1, r3
+ subs r1, r1, r3
+ b _08008684
+_080086AC:
+ mov r0, r8
+ movs r2, #0x2a
+ strh r7, [r0, r2]
+ pop {pc}
+
+ thumb_func_start sub_080086B4
+sub_080086B4: @ 0x080086B4
+ push {r3, r4, r5, r6, r7, lr}
+ mov r4, r8
+ mov r5, sb
+ mov r6, sl
+ mov r7, fp
+ push {r4, r5, r6, r7}
+ mov fp, r2
+ ldr r2, _080088BC @ =gPlayerEntity
+ mov r8, r2
+ bl sub_080086D8
+ pop {r4, r5, r6, r7}
+ mov r8, r4
+ mov sb, r5
+ mov sl, r6
+ mov fp, r7
+ adds r0, r2, #0
+ pop {r3, r4, r5, r6, r7, pc}
+
+ thumb_func_start sub_080086D8
+sub_080086D8: @ 0x080086D8
+ push {r0, r1, lr}
+ ldr r2, _080088C0 @ =0x000003F0
+ ands r0, r2
+ ands r1, r2
+ lsrs r0, r0, #4
+ lsls r1, r1, #2
+ adds r0, r0, r1
+ mov r2, r8
+ movs r3, #0x38
+ ldrb r3, [r2, r3]
+ lsls r3, r3, #2
+ ldr r1, _080088C4 @ =gUnk_08000248
+ ldr r1, [r1, r3]
+ ldrb r2, [r0, r1]
+ push {r2}
+ mov r0, r8
+ ldr r1, _080088C8 @ =gPlayerState
+ movs r2, #0x26
+ ldrb r2, [r1, r2]
+ cmp r2, #0
+ beq _08008716
+ movs r2, #0x12
+ ldrb r2, [r1, r2]
+ cmp r2, #0x18
+ beq _08008716
+ pop {r2}
+ pop {r0, r1}
+ cmp r2, #0x10
+ bhs _0800872E
+ movs r2, #0xf
+ b _0800871E
+_08008716:
+ pop {r2}
+ pop {r0, r1}
+ cmp r2, #0x10
+ bhs _0800872E
+_0800871E:
+ movs r3, #8
+ tst r1, r3
+ bne _08008726
+ lsrs r2, r2, #2
+_08008726:
+ tst r0, r3
+ bne _08008754
+ lsrs r2, r2, #1
+ b _08008754
+_0800872E:
+ cmp r2, #0xff
+ beq _08008754
+ push {r4}
+ subs r2, #0x10
+ mov r3, fp
+ ldrb r2, [r2, r3]
+ lsls r2, r2, #2
+ ldr r3, _080088CC @ =gUnk_0800823C
+ ldr r3, [r3, r2]
+ movs r4, #0xf
+ ands r4, r1
+ lsls r4, r4, #1
+ ldrh r2, [r3, r4]
+ movs r3, #0xf
+ adds r4, r3, #0
+ ands r3, r0
+ eors r4, r3
+ lsrs r2, r4
+ pop {r4}
+_08008754:
+ movs r3, #1
+ ands r2, r3
+ pop {pc}
+
+ non_word_aligned_thumb_func_start sub_0800875A
+sub_0800875A: @ 0x0800875A
+ push {r2, r4, lr}
+ ldrb r3, [r0, #0x14]
+ movs r2, #6
+ ands r3, r2
+ ldr r4, _080088D0 @ =gUnk_08007DF4
+ ldrsb r2, [r4, r3]
+ adds r3, #1
+ ldrsb r3, [r4, r3]
+ bl sub_08008782
+ pop {r2, r4}
+ cmp r0, #0
+ beq _08008780
+ ldrb r1, [r0, #2]
+ strb r1, [r2, #3]
+ ldrb r1, [r0, #3]
+ strb r1, [r2, #7]
+ ldrb r1, [r0, #5]
+ strb r1, [r2, #8]
+_08008780:
+ pop {pc}
+
+ non_word_aligned_thumb_func_start sub_08008782
+sub_08008782: @ 0x08008782
+ push {r4}
+ ldrh r4, [r0, #0x2e]
+ adds r2, r2, r4
+ ldrh r4, [r0, #0x32]
+ adds r3, r3, r4
+ pop {r4}
+ b sub_08008796
+
+ thumb_func_start sub_08008790
+sub_08008790: @ 0x08008790
+ ldrh r2, [r0, #0x2e]
+ ldrh r3, [r0, #0x32]
+ b sub_08008796
+
+ non_word_aligned_thumb_func_start sub_08008796
+sub_08008796: @ 0x08008796
+ push {r4, r5, r6, r7, lr}
+ push {r2, r3}
+ ldr r2, _080088D4 @ =gRoomControls
+ ldrh r3, [r2]
+ movs r2, #1
+ cmp r2, r3
+ pop {r2, r3}
+ beq _080087CE
+ push {r0, r1, r2, r3}
+ pop {r4, r5, r6, r7}
+ adds r0, r6, #0
+ adds r1, r7, #0
+ movs r2, #0x38
+ ldrb r2, [r4, r2]
+ bl GetTileTypeByPos
+ ldr r1, _080088D8 @ =gUnk_080046A4
+ bl sub_08007DE0
+ beq _080087CE
+ lsls r1, r3, #3
+ adds r3, r5, #0
+ ldr r0, _080088DC @ =gUnk_080047F6
+ adds r5, r0, r1
+ ldrh r0, [r5]
+ lsrs r0, r3
+ lsrs r0, r0, #1
+ bhs _080087D2
+_080087CE:
+ movs r0, #0
+ pop {r4, r5, r6, r7, pc}
+_080087D2:
+ ldrb r0, [r5, #2]
+ ldrb r1, [r5, #3]
+ cmp r0, #0xff
+ beq _0800883A
+ cmp r3, #6
+ beq _0800883A
+ cmp r3, #0xe
+ beq _0800883A
+ cmp r3, #0xa
+ beq _0800883A
+ cmp r3, #0xb
+ beq _0800883A
+ cmp r3, #0xd
+ bne _080087F6
+ cmp r0, #0xf
+ bne _0800883A
+ cmp r1, #0x17
+ bne _0800883A
+_080087F6:
+ movs r2, #0
+ cmp r0, #0xf
+ bne _080087FE
+ movs r2, #0x80
+_080087FE:
+ bl CreateObject
+ cmp r0, #0
+ beq _0800883A
+ ldrb r1, [r5, #2]
+ cmp r1, #0
+ beq _08008820
+ movs r2, #0xf
+ adds r1, r6, #0
+ bics r1, r2
+ adds r1, #8
+ strh r1, [r0, #0x2e]
+ adds r1, r7, #0
+ bics r1, r2
+ adds r1, #8
+ strh r1, [r0, #0x32]
+ b _0800882C
+_08008820:
+ ldrh r1, [r4, #0x2e]
+ strh r1, [r0, #0x2e]
+ ldrh r1, [r4, #0x32]
+ strh r1, [r0, #0x32]
+ ldrh r1, [r4, #0x36]
+ strh r1, [r1, #0x36]
+_0800882C:
+ movs r3, #0x50
+ str r4, [r1, r3]
+ movs r3, #0x38
+ ldrb r1, [r4, r3]
+ strb r1, [r0, r3]
+ bl UpdateSpriteForCollisionLayer
+_0800883A:
+ ldr r1, _080088E0 @ =gRoomControls
+ ldrh r0, [r1, #6]
+ subs r2, r6, r0
+ lsrs r2, r2, #4
+ ldrh r0, [r1, #8]
+ subs r3, r7, r0
+ lsrs r3, r3, #4
+ lsls r3, r3, #6
+ adds r1, r2, r3
+ movs r3, #0x38
+ ldrb r2, [r4, r3]
+ ldrh r0, [r5, #6]
+ ldr r3, _080088E4 @ =0x00004000
+ tst r0, r3
+ beq _08008870
+ ldr r3, _080088E8 @ =0x0000FFFF
+ cmp r0, r3
+ beq _08008876
+ push {r0, r1}
+ adds r0, r2, #0
+ bl GetLayerByIndex
+ adds r3, r0, #4
+ pop {r0, r1}
+ lsls r1, r1, #1
+ strh r0, [r3, r1]
+ b _0800887E
+_08008870:
+ bl sub_0807B7D8
+ b _0800887E
+_08008876:
+ adds r0, r1, #0
+ adds r1, r2, #0
+ bl sub_0807BA8C
+_0800887E:
+ ldrb r1, [r5, #2]
+ ldrb r2, [r5, #3]
+ adds r0, r5, #0
+ pop {r4, r5, r6, r7, pc}
+ .align 2, 0
+_08008888: .4byte gPlayerState
+_0800888C: .4byte gPlayerState
+_08008890: .4byte gUnk_080083FC
+_08008894: .4byte gUnk_0800839C
+_08008898: .4byte gUnk_0800845C
+_0800889C: .4byte 0x01000000
+_080088A0: .4byte gUnk_0800833C
+_080088A4: .4byte gUnk_080084BC
+_080088A8: .4byte gPlayerState
+_080088AC: .4byte gUnk_0800851C
+_080088B0: .4byte gUnk_080082DC
+_080088B4: .4byte gRoomControls + 6
+_080088B8: .4byte gRoomControls + 8
+_080088BC: .4byte gPlayerEntity
+_080088C0: .4byte 0x000003F0
+_080088C4: .4byte gUnk_08000248
+_080088C8: .4byte gPlayerState
+_080088CC: .4byte gUnk_0800823C
+_080088D0: .4byte gUnk_08007DF4
+_080088D4: .4byte gRoomControls
+_080088D8: .4byte gUnk_080046A4
+_080088DC: .4byte gUnk_080047F6
+_080088E0: .4byte gRoomControls
+_080088E4: .4byte 0x00004000
+_080088E8: .4byte 0x0000FFFF
+_080088EC:
+ .byte 0x00, 0xFD, 0x03, 0xFD
+ .byte 0x03, 0x00, 0x03, 0x03, 0x00, 0x03, 0xFD, 0x03, 0xFD, 0x00, 0xFD, 0xFD
+_080088FC:
+ .byte 0x00, 0xF6, 0x0A, 0xF6
+ .byte 0x0A, 0x00, 0x0A, 0x0A, 0x00, 0x0A, 0xF6, 0x0A, 0xF6, 0x00, 0xF6, 0xF6
+_0800890C:
+ .byte 0x00, 0x06, 0xFA, 0x00
+ .byte 0x00, 0xFA, 0x06, 0x00, 0x13, 0x12, 0x12, 0x10, 0x10, 0x11, 0x11, 0x13
+_0800891C:
+ push {r0}
+ bl ResetPlayerVelocity
+ pop {r0}
+_08008924:
+ pop {pc}
+
+ non_word_aligned_thumb_func_start sub_08008926
+sub_08008926: @ 0x08008926
+ push {r4, r5, r6, lr}
+ bl sub_08008942
+ pop {r4, r5, r6, pc}
+
+ non_word_aligned_thumb_func_start sub_0800892E
+sub_0800892E: @ 0x0800892E
+ push {r4, r5, r6, lr}
+ bl sub_08008936
+ pop {r4, r5, r6, pc}
+
+ non_word_aligned_thumb_func_start sub_08008936
+sub_08008936: @ 0x08008936
+ push {lr}
+ ldrb r2, [r0, #0x14]
+ lsrs r2, r2, #1
+ lsls r2, r2, #3
+ ldr r1, _08008A68 @ =gPlayerState
+ b _08008960
+
+ non_word_aligned_thumb_func_start sub_08008942
+sub_08008942: @ 0x08008942
+ push {lr}
+ ldr r1, _08008A6C @ =gPlayerState
+ ldrb r2, [r1, #7]
+ ldrb r3, [r1, #0xa]
+ orrs r2, r3
+ bne _08008924
+ ldrb r2, [r1, #0xd]
+ b _08008956
+_08008952:
+ push {lr}
+ ldr r1, _08008A70 @ =gPlayerState
+_08008956:
+ movs r3, #0x15
+ strb r2, [r0, r3]
+ movs r3, #0x80
+ tst r2, r3
+ bne _080089C0
+_08008960:
+ ldrb r3, [r1, #5]
+ cmp r3, #2
+ beq _0800891C
+ cmp r3, #1
+ beq _0800891C
+ ldr r4, _08008A74 @ =_080088FC
+ ldrb r3, [r1, #2]
+ adds r1, r2, #0
+ orrs r3, r3
+ beq _08008992
+ push {r2}
+ movs r3, #0x14
+ ldrb r1, [r0, r3]
+ lsrs r1, r1, #1
+ lsls r1, r1, #1
+ lsrs r2, r2, #2
+ subs r2, r2, r1
+ pop {r1}
+ adds r2, #2
+ movs r4, #7
+ ands r2, r4
+ ldr r4, _08008A78 @ =_080088EC
+ cmp r2, #4
+ beq _08008992
+ bhs _080089A8
+_08008992:
+ adds r3, r1, #0
+ lsrs r3, r3, #2
+ lsls r3, r3, #1
+ adds r4, r4, r3
+ movs r3, #0
+ ldrsb r2, [r4, r3]
+ adds r3, #1
+ ldrsb r3, [r4, r3]
+ bl sub_08008A46
+ b _080089C0
+_080089A8:
+ movs r3, #0x14
+ ldrb r3, [r0, r3]
+ lsrs r3, r3, #1
+ lsls r3, r3, #1
+ ldr r4, _08008A7C @ =_0800890C
+ adds r4, r4, r3
+ movs r3, #0
+ ldrsb r2, [r4, r3]
+ adds r3, #1
+ ldrsb r3, [r4, r3]
+ bl sub_08008A46
+_080089C0:
+ ldr r1, _08008A80 @ =gPlayerState
+ movs r4, #0x8c
+ movs r2, #8
+ ldrsh r3, [r1, r4]
+ orrs r3, r3
+ beq _080089E4
+ bpl _080089D2
+ movs r2, #0x18
+ rsbs r3, r3, #0
+_080089D2:
+ push {r0, r1}
+ adds r1, r3, #0
+ push {r2}
+ bl sub_080027EA
+ pop {r0}
+ bl sub_0807A5B8
+ pop {r0, r1}
+_080089E4:
+ movs r4, #0x8e
+ movs r2, #0x10
+ ldrsh r3, [r1, r4]
+ orrs r3, r3
+ beq _08008A06
+ bpl _080089F4
+ movs r2, #0
+ rsbs r3, r3, #0
+_080089F4:
+ push {r0, r1}
+ adds r1, r3, #0
+ push {r2}
+ bl sub_080027EA
+ pop {r0}
+ bl sub_0807A5B8
+ pop {r0, r1}
+_08008A06:
+ ldrb r2, [r1, #2]
+ orrs r2, r2
+ bne _08008A18
+ movs r2, #0x8c
+ bl sub_08008A1A
+ movs r2, #0x8e
+ bl sub_08008A1A
+_08008A18:
+ pop {pc}
+
+ non_word_aligned_thumb_func_start sub_08008A1A
+sub_08008A1A: @ 0x08008A1A
+ ldrb r3, [r1, #2]
+ movs r4, #3
+ orrs r3, r3
+ bne _08008A2C
+ movs r3, #0x26
+ ldrb r3, [r1, r3]
+ orrs r3, r3
+ bne _08008A2C
+ movs r4, #3
+_08008A2C:
+ ldrsh r3, [r1, r2]
+ orrs r3, r3
+ bmi _08008A3E
+ subs r3, r3, r4
+ bpl _08008A3A
+ beq _08008A3A
+_08008A38:
+ eors r3, r3
+_08008A3A:
+ strh r3, [r1, r2]
+ mov pc, lr
+_08008A3E:
+ adds r3, r3, r4
+ bmi _08008A3A
+ beq _08008A3A
+ b _08008A38
+
+ non_word_aligned_thumb_func_start sub_08008A46
+sub_08008A46: @ 0x08008A46
+ push {lr}
+ ldr r1, _08008A84 @ =gPlayerState
+ movs r4, #0x8c
+ ldrsh r5, [r1, r4]
+ adds r5, r5, r2
+ bl sub_08008A88
+ movs r4, #0x8e
+ ldrsh r5, [r1, r4]
+ adds r5, r5, r3
+ bl sub_08008A88
+ pop {pc}
+_08008A60:
+ eors r3, r3
+ strh r3, [r1]
+ pop {pc}
+ .align 2, 0
+_08008A68: .4byte gPlayerState
+_08008A6C: .4byte gPlayerState
+_08008A70: .4byte gPlayerState
+_08008A74: .4byte _080088FC
+_08008A78: .4byte _080088EC
+_08008A7C: .4byte _0800890C
+_08008A80: .4byte gPlayerState
+_08008A84: .4byte gPlayerState
+
+ thumb_func_start sub_08008A88
+sub_08008A88: @ 0x08008A88
+ orrs r5, r5
+ bmi _08008A94
+ ldr r6, _08008B38 @ =0x00000180
+ cmp r5, r6
+ blo _08008A9C
+ b _08008A9A
+_08008A94:
+ ldr r6, _08008B3C @ =0xFFFFFE80
+ cmp r5, r6
+ bhs _08008A9C
+_08008A9A:
+ adds r5, r6, #0
+_08008A9C:
+ strh r5, [r1, r4]
+ mov pc, lr
+
+ thumb_func_start sub_08008AA0
+sub_08008AA0: @ 0x08008AA0
+ push {r4, r5, lr}
+ ldr r1, _08008B40 @ =gPlayerState
+ ldrb r2, [r1, #0x12]
+ cmp r2, #1
+ beq _08008AC4
+ ldrb r2, [r1, #0xd]
+ cmp r2, #0xff
+ beq _08008AC4
+ lsls r2, r2, #4
+ ldr r3, _08008B44 @ =gSineTable
+ ldrsh r4, [r3, r2]
+ adds r3, #0x80
+ ldrsh r5, [r3, r2]
+ rsbs r5, r5, #0
+ movs r2, #0x8c
+ strh r4, [r1, r2]
+ movs r2, #0x8e
+ strh r5, [r1, r2]
+_08008AC4:
+ pop {r4, r5, pc}
+
+ non_word_aligned_thumb_func_start sub_08008AC6
+sub_08008AC6: @ 0x08008AC6
+ push {r0, lr}
+ ldr r1, _08008B48 @ =gPlayerState
+ movs r3, #0x26
+ ldrb r2, [r1, r3]
+ movs r3, #0xf
+ ands r2, r3
+ bne _08008AEC
+ ldr r2, [r1, #0x30]
+ ldr r3, _08008B4C @ =gUnk_02000020
+ ands r2, r3
+ bne _08008AEC
+ bl sub_08008AEE
+ beq _08008AEC
+ movs r3, #0xe2
+ movs r2, #0x3d
+ strb r3, [r0, r2]
+ bl RespawnPlayer
+_08008AEC:
+ pop {r0, pc}
+
+ non_word_aligned_thumb_func_start sub_08008AEE
+sub_08008AEE: @ 0x08008AEE
+ ldrh r2, [r0, #0x2a]
+ movs r3, #0xe
+ movs r1, #4
+_08008AF4:
+ tst r2, r3
+ beq _08008B00
+ lsrs r2, r2, #4
+ subs r1, #1
+ bne _08008AF4
+ movs r2, #1
+_08008B00:
+ bx lr
+
+ non_word_aligned_thumb_func_start sub_08008B02
+sub_08008B02: @ 0x08008B02
+ push {r0, r1, lr}
+ movs r1, #0
+ movs r2, #0
+ bl sub_080B1A8C
+ ldr r1, _08008B50 @ =0x00004000
+ tst r0, r1
+ bne _08008B1E
+ ldr r1, _08008B54 @ =gUnk_08007CAC
+ bl sub_08007DE0
+ movs r2, #1
+ cmp r3, #1
+ beq _08008B20
+_08008B1E:
+ movs r2, #0
+_08008B20:
+ pop {r0, r1, pc}
+
+ non_word_aligned_thumb_func_start sub_08008B22
+sub_08008B22: @ 0x08008B22
+ push {lr}
+ ldr r0, _08008B58 @ =gPlayerEntity
+ bl sub_08008B02
+ adds r0, r2, #0
+ pop {pc}
+
+ non_word_aligned_thumb_func_start sub_08008B2E
+sub_08008B2E: @ 0x08008B2E
+ push {r0, lr}
+ adds r0, r2, #0
+ bl EnqueueSFX
+ pop {r0, pc}
+ .align 2, 0
+_08008B38: .4byte 0x00000180
+_08008B3C: .4byte 0xFFFFFE80
+_08008B40: .4byte gPlayerState
+_08008B44: .4byte gSineTable
+_08008B48: .4byte gPlayerState
+_08008B4C: .4byte gUnk_02000020
+_08008B50: .4byte 0x00004000
+_08008B54: .4byte gUnk_08007CAC
+_08008B58: .4byte gPlayerEntity
+
+
+
diff --git a/asm/src/projectileUpdate.s b/asm/src/projectileUpdate.s
new file mode 100644
index 00000000..590744ce
--- /dev/null
+++ b/asm/src/projectileUpdate.s
@@ -0,0 +1,44 @@
+ .include "asm/macros.inc"
+ .include "constants/constants.inc"
+
+ .syntax unified
+
+ .text
+
+ thumb_func_start ProjectileUpdate
+ProjectileUpdate: @ 0x08016AE4
+ mov r3, lr
+ push {r3, r4}
+ adds r4, r0, #0
+ ldrb r2, [r0, #0xc]
+ cmp r2, #0
+ bne _08016AFC
+ bl ProjectileInit
+ cmp r0, #0
+ bne _08016B0A
+ bl DeleteThisEntity
+_08016AFC:
+ bl EntityIsDeleted
+ cmp r0, #0
+ bne _08016B22
+ adds r0, r4, #0
+ bl sub_080028E0
+_08016B0A:
+ adds r0, r4, #0
+ ldrb r1, [r0, #9]
+ lsls r1, r1, #2
+ ldr r2, _08016B2C @ =gProjectileFunctions
+ ldr r1, [r2, r1]
+ bl _call_via_r1
+ movs r1, #0x41
+ movs r3, #0x7f
+ ldrb r2, [r4, r1]
+ ands r2, r3
+ strb r2, [r4, r1]
+_08016B22:
+ adds r0, r4, #0
+ bl DrawEntity
+ pop {r3, r4}
+ bx r3
+ .align 2, 0
+_08016B2C: .4byte gProjectileFunctions
diff --git a/asm/src/script.s b/asm/src/script.s
new file mode 100644
index 00000000..71de3364
--- /dev/null
+++ b/asm/src/script.s
@@ -0,0 +1,144 @@
+ .include "asm/macros.inc"
+ .include "constants/constants.inc"
+
+ .syntax unified
+
+ .text
+
+gUnk_08016984:: @ 08016984
+ .incbin "code_08016984/gUnk_08016984.bin"
+
+ .text
+
+ non_word_aligned_thumb_func_start GetNextScriptCommandHalfword
+GetNextScriptCommandHalfword: @ 0x08016986
+ ldrh r0, [r0]
+ bx lr
+
+ non_word_aligned_thumb_func_start GetNextScriptCommandHalfwordAfterCommandMetadata
+GetNextScriptCommandHalfwordAfterCommandMetadata: @ 0x0801698A
+ ldrh r0, [r0, #2]
+ bx lr
+
+ non_word_aligned_thumb_func_start GetNextScriptCommandWord
+GetNextScriptCommandWord: @ 0x0801698E
+ ldrh r1, [r0]
+ ldrh r0, [r0, #2]
+ lsls r0, r0, #0x10
+ orrs r0, r1
+ bx lr
+
+ thumb_func_start GetNextScriptCommandWordAfterCommandMetadata
+GetNextScriptCommandWordAfterCommandMetadata: @ 0x08016998
+ ldrh r1, [r0, #2]
+ ldrh r0, [r0, #4]
+ lsls r0, r0, #0x10
+ orrs r0, r1
+ bx lr
+ .align 2, 0
+
+gUnk_080169A4::
+ .byte 0x01, 0xFF, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0x01, 0x00
+ .byte 0xFF, 0x01, 0x00, 0x00, 0x02, 0xFF, 0x01, 0xFE, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x01, 0xFF, 0x02
+ .byte 0x00, 0x00, 0x01, 0x01, 0x02, 0xFF, 0x02, 0xFE, 0xFE, 0x02, 0xFF, 0x03, 0xFD, 0xFF, 0xFE, 0x01
+ .byte 0x01, 0xFD, 0xFF, 0xFF, 0x03, 0xFE, 0x02, 0x00, 0x00, 0xFF, 0xFE, 0x03, 0xFD, 0x02, 0xFF, 0x00
+ .byte 0x00, 0xFD, 0x02, 0x00, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02
+ .byte 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00
+ .byte 0x00, 0x00, 0x01, 0x00
+
+ thumb_func_start UpdateSpriteForCollisionLayer
+UpdateSpriteForCollisionLayer: @ 0x08016A04
+ movs r1, #0x38
+ ldrb r1, [r0, r1]
+ lsls r1, r1, #1
+ add r3, pc, #0x1C
+ adds r1, r1, r3
+ movs r3, #0xc0
+ ldrb r2, [r0, #0x19]
+ bics r2, r3
+ ldrb r3, [r1]
+ orrs r2, r3
+ strb r2, [r0, #0x19]
+ movs r3, #0xc0
+ ldrb r2, [r0, #0x1b]
+ bics r2, r3
+ ldrb r3, [r1, #1]
+ orrs r2, r3
+ strb r2, [r0, #0x1b]
+ bx lr
+_08016A28:
+ .byte 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40
+
+ thumb_func_start ResolveCollisionLayer
+ResolveCollisionLayer: @ 0x08016A30
+ push {r4, r5, lr}
+ adds r4, r0, #0
+ movs r5, #0x38
+ ldrb r0, [r4, r5]
+ cmp r0, #0
+ bne _08016A64
+ ldrh r0, [r4, #0x2e]
+ ldrh r1, [r4, #0x32]
+ movs r2, #2
+ bl GetTileTypeByPos
+ movs r3, #1
+ cmp r0, #0
+ beq _08016A62
+ bl sub_080B1B54
+ movs r3, #2
+ add r1, pc, #0x40
+_08016A54:
+ adds r1, #4
+ ldrh r2, [r1]
+ cmp r2, #0
+ beq _08016A62
+ cmp r0, r2
+ bne _08016A54
+ ldrb r3, [r1, #3]
+_08016A62:
+ strb r3, [r4, r5]
+_08016A64:
+ adds r0, r4, #0
+ bl UpdateSpriteForCollisionLayer
+ pop {r4, r5, pc}
+
+ thumb_func_start sub_08016A6C
+sub_08016A6C: @ 0x08016A6C
+ push {r4, r5, lr}
+ adds r4, r0, #0
+ bl sub_080B1AA8
+ add r1, pc, #0x38
+_08016A76:
+ adds r1, #4
+ ldrh r2, [r1]
+ cmp r2, #0
+ beq _08016A90
+ cmp r2, r0
+ bne _08016A76
+ movs r2, #0x38
+ ldrb r3, [r4, r2]
+ ldrb r5, [r1, #2]
+ cmp r3, r5
+ beq _08016A90
+ ldrb r5, [r1, #3]
+ strb r5, [r4, r2]
+_08016A90:
+ pop {r4, r5, pc}
+ .align 2, 0
+_08016A94:
+ .byte 0x2A, 0x00, 0x03, 0x03, 0x2D, 0x00, 0x03, 0x03, 0x2B, 0x00, 0x03, 0x03
+ .byte 0x2C, 0x00, 0x03, 0x03, 0x4C, 0x00, 0x03, 0x03, 0x4E, 0x00, 0x03, 0x03, 0x4D, 0x00, 0x03, 0x03
+ .byte 0x4F, 0x00, 0x03, 0x03, 0x0A, 0x00, 0x02, 0x01, 0x09, 0x00, 0x02, 0x01, 0x0C, 0x00, 0x01, 0x02
+ .byte 0x0B, 0x00, 0x01, 0x02, 0x52, 0x00, 0x03, 0x03, 0x27, 0x00, 0x03, 0x03, 0x26, 0x00, 0x03, 0x03
+ .byte 0x00, 0x00
+
+ non_word_aligned_thumb_func_start sub_08016AD2
+sub_08016AD2: @ 0x08016AD2
+ push {r4, lr}
+ adds r4, r0, #0
+ bl sub_08016A6C
+ push {r0}
+ adds r0, r4, #0
+ bl UpdateSpriteForCollisionLayer
+ pop {r0, r4, pc}
+
diff --git a/asm/src/veneer.s b/asm/src/veneer.s
new file mode 100644
index 00000000..3cb55e81
--- /dev/null
+++ b/asm/src/veneer.s
@@ -0,0 +1,475 @@
+ .include "asm/macros.inc"
+ .include "constants/constants.inc"
+
+ .syntax unified
+
+ .text
+
+.ifndef USA
+.ifndef DEMO_USA
+.ifndef JP
+ thumb_func_start fill_rq_stack
+fill_rq_stack: // fill iqr and user stack with 'MCZ3'
+ adr r0, 1f
+ ldm r0!, {r1, r2, r3}
+0:
+ subs r2, #4
+ str r1, [r2]
+ cmp r2, r3
+ bgt 0b
+ bx lr
+
+// unused
+// returns the maximum values reached by irq stack (r0) and usr stack (r1)
+check_stack_threshold:
+ adr r0, 1f
+ ldm r0!, {r1, r2, r3}
+0:
+ ldr r0, [r3]
+ adds r3, #4
+ cmp r0, r1 // cmp against magic
+ beq 0b
+
+ subs r2, #0xa0
+0:
+ ldr r0, [r2]
+ adds r2, #4
+ cmp r0, r1 // cmp against magic
+ beq 0b
+
+ subs r1, r2, #4
+ subs r0, r3, #4
+ bx lr
+
+ .align 2, 0
+1:
+ .byte '3, 'Z, 'C, 'M // r1
+ .4byte irq_stack_begin // r2
+ .4byte usr_stack_top // r3
+.endif
+.endif
+.endif
+
+ thumb_func_start UpdateScrollVram
+UpdateScrollVram: @ 0x08000108
+ push {r4, lr}
+ ldr r0, _080001E8 @ =gUpdateVisibleTiles
+ ldrb r1, [r0]
+ lsls r1, r1, #2
+ beq _08000136
+ add r4, pc, #0x20
+ ldr r4, [r4, r1]
+ ldr r0, _080001EC @ =gMapBottom
+ ldr r0, [r0]
+ cmp r0, #0
+ beq _08000126
+ ldr r0, _080001F0 @ =gMapDataBottomSpecial
+ ldr r1, _080001F4 @ =gUnk_02021F70
+ bl _call_via_r4
+_08000126:
+ ldr r0, _080001F8 @ =gMapTop
+ ldr r0, [r0]
+ cmp r0, #0
+ beq _08000136
+ ldr r0, _080001FC @ =gMapDataTopSpecial
+ ldr r1, _08000200 @ =gUnk_020344F0
+ bl _call_via_r4
+_08000136:
+ pop {r4, pc}
+_08000138:
+_08000138: .4byte ram_sub_080B197C + 1
+_0800013C: .4byte sub_0807D280 @ layer 1, 2, 3?
+_08000140: .4byte sub_0807D46C
+_08000144: .4byte sub_0807D6D8
+
+ thumb_func_start sub_08000148
+sub_08000148: @ 0x08000148
+ lsls r2, r2, #2
+ ldr r3, _08000204 @ =gUnk_08000248
+ ldr r2, [r3, r2]
+ strb r0, [r2, r1]
+ bx lr
+
+ non_word_aligned_thumb_func_start sub_08000152
+sub_08000152: @ 0x08000152
+ lsls r2, r2, #2
+ add r3, pc, #0x68
+ ldr r3, [r3, r2]
+ lsls r0, r0, #1
+ ldrh r0, [r3, r0]
+ lsrs r2, r2, #2
+
+ non_word_aligned_thumb_func_start SetTile
+SetTile: @ r0 = tile type, r1, = tile position, r2 = layer
+ push {r4-r7, lr}
+ lsls r3, r2, #3
+ ldr r4, _08000208 @ =gUnk_08000228
+ ldr r5, [r4, r3]
+ lsls r6, r1, #1
+ ldrh r7, [r5, r6]
+ strh r0, [r5, r6]
+ ldr r6, _0800020C @ =0x00004000
+ cmp r0, r6
+ blo _0800019A
+ push {r1, r2}
+ subs r4, r0, r6
+ ldr r3, _08000210 @ =gUnk_080B7910
+ ldrb r0, [r3, r4]
+ bl sub_080001D0
+ ldr r3, _08000214 @ =gUnk_080B79A7
+ ldrb r0, [r3, r4]
+ lsrs r2, r2, #2
+ bl sub_08000148
+ pop {r0, r1} @ tilepos, layer
+ push {r0, r1}
+ bl DeleteLoadedTileEntity
+ adds r0, r7, #0
+ pop {r1, r2}
+ bl sub_0801AF48
+ pop {r4, r5, r6, r7, pc}
+_0800019A:
+ adds r3, #4
+ ldr r4, [r4, r3]
+ lsls r0, r0, #1
+ ldrh r4, [r4, r0]
+ push {r1, r2}
+ ldr r3, _08000218 @ =gUnk_080B37A0
+ ldrb r0, [r3, r4]
+ bl sub_080001D0
+ ldr r3, _0800021C @ =gUnk_080B3E80
+ ldrb r0, [r3, r4]
+ lsrs r2, r2, #2
+ bl sub_08000148
+ pop {r0, r1}
+ bl DeleteLoadedTileEntity
+ pop {r4, r5, r6, r7, pc}
+ .align 2, 0
+_080001C0: .4byte gUnk_0202BEB4
+_080001C4: .4byte gUnk_0202BEB4
+_080001C8: .4byte gUnk_02011654
+_080001CC: .4byte gUnk_0202BEB4
+
+ thumb_func_start sub_080001D0
+sub_080001D0: @ 0x080001D0
+ lsls r2, r2, #2
+ ldr r3, _08000220 @ =gUnk_08000278
+ ldr r3, [r3, r2]
+ strb r0, [r3, r1]
+ bx lr
+
+ non_word_aligned_thumb_func_start GetTileIndex
+GetTileIndex: @ 0x080001DA
+ lsls r1, r1, #3
+ ldr r2, _08000224 @ =gUnk_08000228
+ ldr r1, [r2, r1]
+ lsls r0, r0, #1
+ ldrh r0, [r1, r0]
+ bx lr
+ .align 2, 0
+_080001E8: .4byte gUpdateVisibleTiles
+_080001EC: .4byte gMapBottom
+_080001F0: .4byte gMapDataBottomSpecial
+_080001F4: .4byte gUnk_02021F70
+_080001F8: .4byte gMapTop
+_080001FC: .4byte gMapDataTopSpecial
+_08000200: .4byte gUnk_020344F0
+_08000204: .4byte gUnk_08000248
+_08000208: .4byte gUnk_08000228
+_0800020C: .4byte 0x00004000
+_08000210: .4byte gUnk_080B7910
+_08000214: .4byte gUnk_080B79A7
+_08000218: .4byte gUnk_080B37A0
+_0800021C: .4byte gUnk_080B3E80
+_08000220: .4byte gUnk_08000278
+_08000224: .4byte gUnk_08000228
+gUnk_08000228::
+ .4byte gMapDataBottom
+gUnk_0800022C::
+ .4byte gMetatileTypesBottom
+ .4byte gMapDataBottom
+ .4byte gMetatileTypesBottom
+ .4byte gMapDataTop
+ .4byte gMetatileTypesTop
+ .4byte gMapDataBottom
+ .4byte gMetatileTypesBottom
+gUnk_08000248::
+ .4byte gUnk_02027EB4
+ .4byte gUnk_02027EB4
+ .4byte gUnk_0200D654
+ .4byte gUnk_02027EB4
+gUnk_08000258::
+ .4byte gUnk_02028EB4
+ .4byte gMetatileTypesBottom
+ .4byte gUnk_02028EB4
+ .4byte gMetatileTypesBottom
+ .4byte gUnk_0200E654
+ .4byte gMetatileTypesTop
+ .4byte gUnk_02028EB4
+ .4byte gMetatileTypesBottom
+gUnk_08000278::
+ .4byte gUnk_02030EB4
+ .4byte gUnk_02030EB4
+ .4byte gUnk_02016654
+ .4byte gUnk_02030EB4
+
+@ call 0x80B19CC
+@ ========
+@ Unused? Doesn't seem to be called by anything in Ghidra.
+ thumb_func_start GetTileAtEntityPos
+GetTileAtEntityPos: @ 0x08000288
+ ldr r3, _080002F4 @ =ram_GetTileAtEntityPos
+ bx r3
+
+@ call 0x80B19D8
+@ ========
+@ Unused? Doesn't seem to be called by anything in Ghidra.
+ thumb_func_start sub_080B19D8
+sub_080B19D8: @ 0x0800028C
+ ldr r3, _080002F8 @ =ram_sub_080B19D8
+ bx r3
+
+@ call 0x80B19EC
+@ ========
+@ Unused? Doesn't seem to be called by anything in Ghidra.
+ thumb_func_start sub_080B19EC
+sub_080B19EC: @ 0x08000290
+ ldr r3, _080002FC @ =ram_sub_080B19EC
+ bx r3
+
+@ call 0x80B19FC
+@ ========
+@ Unused? Doesn't seem to be called by anything in Ghidra.
+ thumb_func_start sub_080B19FC
+sub_080B19FC: @ 0x08000294
+ ldr r3, _08000300 @ =ram_sub_080B19FC
+ bx r3
+
+@ call 0x80B1A04
+@ ========
+@ Unused? Doesn't seem to be called by anything in Ghidra.
+ thumb_func_start sub_080B1A04
+sub_080B1A04: @ 0x08000298
+ ldr r3, _08000304 @ =ram_sub_080B1A04
+ bx r3
+
+@ call 0x80B1A0C
+@ r0: entity*
+@ r1: s32
+@ r2: s32
+ thumb_func_start sub_080B1A0C
+sub_080B1A0C: @ 0x0800029C
+ ldr r3, _08000308 @ =ram_sub_080B1A0C
+ bx r3
+
+@ call 0x080B1A28
+@ r0: entity
+@ return: u32 (tileType)
+ thumb_func_start GetTileTypeByEntity
+GetTileTypeByEntity: @ 0x080002A0
+ ldr r3, _0800030C @ =ram_GetTileTypeByEntity
+ bx r3
+
+@ call 0x080B1A34
+@ r0: s32 (xPos)
+@ r1: s32 (yPos)
+@ r2: u32 (layer)
+@ return: u32 (tileType)
+ thumb_func_start GetTileTypeByPos
+GetTileTypeByPos: @ 0x080002A4
+ ldr r3, _08000310 @ =ram_GetTileTypeByPos
+ bx r3
+
+@ call 0x080B1A48
+@ r0: s32 (xPos)
+@ r1: s32 (yPos)
+@ r2: u32 (layer)
+ thumb_func_start sub_080B1A48
+sub_080B1A48: @ 0x080002A8
+ ldr r3, _08000314 @ =ram_sub_080B1A48
+ bx r3
+
+@ call 0x080B1A58
+@ r0: s32 (xPos)
+@ r1: s32 (yPos)
+@ r2: u32 (layer)
+ thumb_func_start sub_080B1A58
+sub_080B1A58: @ 0x080002AC
+ ldr r3, _08000318 @ =ram_sub_080B1A58
+ bx r3
+
+@ call 0x080B1A60
+@ r0: u32 (tileIndex)
+@ r1: u32 (layer)
+@ return: u32 (tileType)
+ thumb_func_start GetTileType
+GetTileType: @ 0x080002B0
+ ldr r3, _0800031C @ =ram_GetTileType
+ bx r3
+
+@ call 0x080B1A8C
+@ r0: Entity*
+@ r1: u32
+@ r2: u32
+ thumb_func_start sub_080B1A8C
+sub_080B1A8C: @ 0x080002B4
+ ldr r3, _08000320 @ =ram_sub_080B1A8C
+ bx r3
+
+@ call 0x080B1AA8
+@ r0:
+@ r1:
+@ r2:
+@ return:
+@ ========
+@ Called every frame a pot is thrown, every frame the screen is sliding in a transition, and once when entering stairs.
+ thumb_func_start sub_080B1AA8
+sub_080B1AA8: @ 0x080002B8
+ ldr r3, _08000324 @ =ram_sub_080B1AA8
+ bx r3
+
+@ call 0x080B1AB4
+@ r0: s32 (xPos)
+@ r1: s32 (yPos)
+@ r2: u32 (layer)
+ thumb_func_start sub_080B1AB4
+sub_080B1AB4: @ 0x080002BC
+ ldr r3, _08000328 @ =ram_sub_080B1AB4
+ bx r3
+
+@ call 0x080B1AC8
+@ r0: u32
+@ r1: u32
+@ r2: u32
+@ return: ???
+ thumb_func_start sub_080B1AC8
+sub_080B1AC8: @ 0x080002C0
+ ldr r3, _0800032C @ =ram_sub_080B1AC8
+ bx r3
+
+@ call 0x080B1AD8
+@ r0: Entity*
+@ r1: s32 (xOffset)
+@ r2: s32 (yOffset)
+@ ========
+@ Unused? Doesn't seem to be called by anything in Ghidra.
+ thumb_func_start sub_080B1AD8
+sub_080B1AD8: @ 0x080002C4
+ ldr r3, _08000330 @ =ram_sub_080B1AD8
+ bx r3
+
+@ call 0x080B1AE0
+@ r0: u32 (tileIndex)
+@ r1: u32 (layer)
+ thumb_func_start sub_080B1AE0
+sub_080B1AE0: @ 0x080002C8
+ ldr r3, _08000334 @ =ram_sub_080B1AE0
+ bx r3
+
+@ call 0x080B1AF0
+@ r0: Entity*
+@ r1: ???
+@ r2: ???
+ thumb_func_start sub_080B1AF0
+sub_080B1AF0: @ 0x080002CC
+ ldr r3, _08000338 @ =ram_sub_080B1AF0
+ bx r3
+
+@ call 0x080B1B0C
+@ r0: Entity*
+ thumb_func_start sub_080B1B0C
+sub_080B1B0C: @ 0x080002D0
+ ldr r3, _0800033C @ =ram_sub_080B1B0C
+ bx r3
+
+@ call 0x080B1B18
+@ r0: s32 (xPos)
+@ r1: s32 (yPos)
+@ r2: u32 (layer)
+ thumb_func_start sub_080B1B18
+sub_080B1B18: @ 0x080002D4
+ ldr r3, _08000340 @ =ram_sub_080B1B18
+ bx r3
+
+@ call 0x080B1B2C
+@ ========
+@ Unused? Doesn't seem to be called by anything in Ghidra.
+ thumb_func_start sub_080B1B2C
+sub_080B1B2C: @ 0x080002D8
+ ldr r3, _08000344 @ =ram_sub_080B1B2C
+ bx r3
+
+@ call 0x080B1B3C
+@ ========
+@ Unused? Doesn't seem to be called by anything in Ghidra.
+ thumb_func_start sub_080B1B3C
+sub_080B1B3C: @ 0x080002DC
+ ldr r3, _08000348 @ =ram_sub_080B1B3C
+ bx r3
+
+@ call 0x080B1B44
+@ ========
+@ Unused? Doesn't seem to be called by anything in Ghidra.
+ thumb_func_start sub_080B1B44
+sub_080B1B44: @ 0x080002E0
+ ldr r3, _0800034C @ =ram_sub_080B1B44
+ bx r3
+
+@ call 0x080B1B54
+@ r0: u32 (tileIndex)
+ thumb_func_start sub_080B1B54
+sub_080B1B54: @ 0x080002E4
+ ldr r3, _08000350 @ =ram_sub_080B1B54
+ bx r3
+
+@ call 0x080B1B68
+@ ========
+@ Unused? Doesn't seem to be called by anything in Ghidra.
+ thumb_func_start sub_080B1B68
+sub_080B1B68: @ 0x080002E8
+ ldr r3, _08000354 @ =ram_sub_080B1B68
+ bx r3
+
+@ call 0x080B1B84
+@ r0: u32 (tileIndex)
+@ r1: u32 (layer)
+ thumb_func_start sub_080B1B84
+sub_080B1B84: @ 0x080002EC
+ ldr r3, _08000358 @ =ram_sub_080B1B84
+ bx r3
+
+@ call 0x080B1BA4
+@ r0: u32 (tileIndex)
+@ r1: u32 (layer)
+@ r2: ???
+ thumb_func_start sub_080B1BA4
+sub_080B1BA4: @ 0x080002F0
+ ldr r3, _0800035C @ =ram_sub_080B1BA4
+ bx r3
+
+_080002F4: .4byte ram_GetTileAtEntityPos
+_080002F8: .4byte ram_sub_080B19D8
+_080002FC: .4byte ram_sub_080B19EC
+_08000300: .4byte ram_sub_080B19FC
+_08000304: .4byte ram_sub_080B1A04
+_08000308: .4byte ram_sub_080B1A0C
+_0800030C: .4byte ram_GetTileTypeByEntity
+_08000310: .4byte ram_GetTileTypeByPos
+_08000314: .4byte ram_sub_080B1A48
+_08000318: .4byte ram_sub_080B1A58
+_0800031C: .4byte ram_GetTileType
+_08000320: .4byte ram_sub_080B1A8C
+_08000324: .4byte ram_sub_080B1AA8
+_08000328: .4byte ram_sub_080B1AB4
+_0800032C: .4byte ram_sub_080B1AC8
+_08000330: .4byte ram_sub_080B1AD8
+_08000334: .4byte ram_sub_080B1AE0
+_08000338: .4byte ram_sub_080B1AF0
+_0800033C: .4byte ram_sub_080B1B0C
+_08000340: .4byte ram_sub_080B1B18
+_08000344: .4byte ram_sub_080B1B2C
+_08000348: .4byte ram_sub_080B1B3C
+_0800034C: .4byte ram_sub_080B1B44
+_08000350: .4byte ram_sub_080B1B54
+_08000354: .4byte ram_sub_080B1B68
+_08000358: .4byte ram_sub_080B1B84
+_0800035C: .4byte ram_sub_080B1BA4