summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsceptillion <33798691+sceptillion@users.noreply.github.com>2017-12-17 23:53:55 -0800
committersceptillion <33798691+sceptillion@users.noreply.github.com>2017-12-17 23:53:55 -0800
commit4265e3617426639577df510c6d659e6a9cd13b19 (patch)
treeca8f1c9d337935c62fb15d85e3939dd9ae706c7d
parent91b847440c34b6e977c86ffdf201f6a461cecb41 (diff)
decompile bg
-rw-r--r--asm/battle_1.s4
-rw-r--r--asm/battle_records.s4
-rw-r--r--asm/berry_pouch.s4
-rw-r--r--asm/bg.s3421
-rw-r--r--asm/clear_save_data_screen.s4
-rw-r--r--asm/credits.s8
-rw-r--r--asm/diploma.s4
-rw-r--r--asm/egg_hatch.s4
-rw-r--r--asm/fame_checker.s4
-rw-r--r--asm/hall_of_fame.s8
-rw-r--r--asm/hof_pc.s2
-rw-r--r--asm/intro.s10
-rw-r--r--asm/item_menu.s4
-rw-r--r--asm/item_pc.s4
-rw-r--r--asm/learn_move.s4
-rw-r--r--asm/link.s4
-rw-r--r--asm/link_rfu.s4
-rw-r--r--asm/link_rfu_3.s4
-rw-r--r--asm/mail.s4
-rw-r--r--asm/main_menu.s4
-rw-r--r--asm/map_preview_screen.s2
-rw-r--r--asm/mystery_gift_menu.s4
-rw-r--r--asm/naming_screen.s4
-rw-r--r--asm/oak_speech.s8
-rw-r--r--asm/option_menu.s4
-rw-r--r--asm/overworld.s8
-rw-r--r--asm/party_menu.s4
-rw-r--r--asm/pokedex_screen.s4
-rw-r--r--asm/pokemon_special_anim.s4
-rw-r--r--asm/pokemon_storage_system.s2
-rw-r--r--asm/pokemon_summary_screen.s4
-rw-r--r--asm/region_map.s4
-rw-r--r--asm/seagallop.s4
-rw-r--r--asm/shop.s4
-rw-r--r--asm/slot_machine.s4
-rw-r--r--asm/start_menu.s4
-rw-r--r--asm/teachy_tv.s4
-rw-r--r--asm/title_screen.s4
-rw-r--r--asm/tm_case.s4
-rw-r--r--asm/trade.s8
-rw-r--r--asm/trainer_card.s4
-rw-r--r--asm/union_room_chat.s4
-rw-r--r--asm/unk_8147AA8.s4
-rw-r--r--asm/unk_814D5C8.s4
-rw-r--r--asm/unk_81507FC.s4
-rw-r--r--asm/window.s30
-rw-r--r--asm/wireless_communication_status_screen.s4
-rw-r--r--common_syms/bg.txt1
-rw-r--r--data/data.s3
-rw-r--r--include/bg.h2
-rw-r--r--include/gba/defines.h15
-rw-r--r--ld_script.txt3
-rw-r--r--src/bg.c1707
-rw-r--r--sym_bss.txt20
-rw-r--r--sym_common.txt4
55 files changed, 1841 insertions, 3565 deletions
diff --git a/asm/battle_1.s b/asm/battle_1.s
index e25330776..c31187f21 100644
--- a/asm/battle_1.s
+++ b/asm/battle_1.s
@@ -178,11 +178,11 @@ _0800F320: .4byte gUnknown_824EE34
sub_800F324: @ 800F324
push {lr}
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _0800F344 @ =gUnknown_8248320
movs r0, 0
movs r2, 0x4
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r0, _0800F348 @ =gUnknown_8248330
bl InitWindows
bl DeactivateAllTextPrinters
diff --git a/asm/battle_records.s b/asm/battle_records.s
index 4f7ed298b..239b59dd4 100644
--- a/asm/battle_records.s
+++ b/asm/battle_records.s
@@ -64,11 +64,11 @@ _080CD29A:
bl AllocZeroed
str r0, [r4]
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _080CD2C8 @ =gUnknown_83F6C7C
movs r0, 0
movs r2, 0x2
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r1, [r4]
movs r0, 0x3
bl SetBgTilemapBuffer
diff --git a/asm/berry_pouch.s b/asm/berry_pouch.s
index feb1333b0..02abba1df 100644
--- a/asm/berry_pouch.s
+++ b/asm/berry_pouch.s
@@ -395,11 +395,11 @@ sub_813D07C: @ 813D07C
movs r1, 0
bl memset
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _0813D0E0 @ =gUnknown_846434C
movs r0, 0
movs r2, 0x3
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r1, [r4]
adds r1, 0xC
movs r0, 0x1
diff --git a/asm/bg.s b/asm/bg.s
deleted file mode 100644
index 93bb880e2..000000000
--- a/asm/bg.s
+++ /dev/null
@@ -1,3421 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start ResetBgs
-ResetBgs: @ 8001028
- push {lr}
- bl ResetBgControlStructs
- ldr r1, _0800103C @ =gUnknown_30008D0
- movs r0, 0
- strh r0, [r1, 0x10]
- bl SetTextModeAndHideBgs
- pop {r0}
- bx r0
- .align 2, 0
-_0800103C: .4byte gUnknown_30008D0
- thumb_func_end ResetBgs
-
- thumb_func_start SetBgModeInternal
-SetBgModeInternal: @ 8001040
- lsls r0, 24
- lsrs r0, 24
- ldr r3, _08001054 @ =gUnknown_30008D0
- ldrh r2, [r3, 0x10]
- ldr r1, _08001058 @ =0x0000fff8
- ands r1, r2
- orrs r1, r0
- strh r1, [r3, 0x10]
- bx lr
- .align 2, 0
-_08001054: .4byte gUnknown_30008D0
-_08001058: .4byte 0x0000fff8
- thumb_func_end SetBgModeInternal
-
- thumb_func_start GetBgMode
-GetBgMode: @ 800105C
- ldr r0, _08001068 @ =gUnknown_30008D0
- ldrb r1, [r0, 0x10]
- movs r0, 0x7
- ands r0, r1
- bx lr
- .align 2, 0
-_08001068: .4byte gUnknown_30008D0
- thumb_func_end GetBgMode
-
- thumb_func_start ResetBgControlStructs
-ResetBgControlStructs: @ 800106C
- push {lr}
- ldr r2, _08001084 @ =gUnknown_30008D0
- ldr r0, _08001088 @ =gUnknown_81E9F64
- ldr r0, [r0]
- adds r1, r2, 0
- adds r1, 0xC
-_08001078:
- str r0, [r1]
- subs r1, 0x4
- cmp r1, r2
- bge _08001078
- pop {r0}
- bx r0
- .align 2, 0
-_08001084: .4byte gUnknown_30008D0
-_08001088: .4byte gUnknown_81E9F64
- thumb_func_end ResetBgControlStructs
-
- thumb_func_start Unused_ResetBgControlStruct
-Unused_ResetBgControlStruct: @ 800108C
- push {r4,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- adds r0, r4, 0
- bl IsInvalidBg
- lsls r0, 24
- cmp r0, 0
- bne _080010AA
- ldr r1, _080010B0 @ =gUnknown_30008D0
- lsls r0, r4, 2
- adds r0, r1
- ldr r1, _080010B4 @ =gUnknown_81E9F64
- ldr r1, [r1]
- str r1, [r0]
-_080010AA:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080010B0: .4byte gUnknown_30008D0
-_080010B4: .4byte gUnknown_81E9F64
- thumb_func_end Unused_ResetBgControlStruct
-
- thumb_func_start SetBgControlAttributes
-SetBgControlAttributes: @ 80010B8
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x10
- ldr r4, [sp, 0x30]
- ldr r5, [sp, 0x34]
- ldr r6, [sp, 0x38]
- mov r12, r6
- ldr r6, [sp, 0x3C]
- mov r8, r6
- lsls r0, 24
- lsrs r7, r0, 24
- str r7, [sp]
- lsls r1, 24
- lsrs r1, 24
- mov r10, r1
- lsls r2, 24
- lsrs r6, r2, 24
- lsls r3, 24
- lsrs r3, 24
- mov r9, r3
- lsls r4, 24
- lsrs r4, 24
- str r4, [sp, 0x4]
- lsls r5, 24
- lsrs r5, 24
- mov r0, r12
- lsls r0, 24
- lsrs r4, r0, 24
- mov r1, r8
- lsls r1, 24
- lsrs r1, 24
- str r1, [sp, 0xC]
- adds r0, r7, 0
- bl IsInvalidBg
- lsls r0, 24
- lsrs r0, 24
- mov r12, r0
- cmp r0, 0
- bne _080011D0
- ldr r2, _080011E0 @ =gUnknown_30008D0
- mov r8, r2
- mov r0, r10
- cmp r0, 0xFF
- beq _0800112C
- lsls r2, r7, 2
- add r2, r8
- movs r1, 0x3
- ands r1, r0
- ldrb r3, [r2, 0x1]
- movs r0, 0x4
- negs r0, r0
- ands r0, r3
- orrs r0, r1
- strb r0, [r2, 0x1]
-_0800112C:
- cmp r6, 0xFF
- beq _08001144
- lsls r1, r7, 2
- add r1, r8
- movs r0, 0x1F
- ands r6, r0
- lsls r3, r6, 2
- ldrb r2, [r1, 0x1]
- subs r0, 0x9C
- ands r0, r2
- orrs r0, r3
- strb r0, [r1, 0x1]
-_08001144:
- mov r1, r9
- cmp r1, 0xFF
- beq _08001160
- lsls r1, r7, 2
- add r1, r8
- movs r0, 0x3
- mov r2, r9
- ands r2, r0
- lsls r3, r2, 2
- ldrb r2, [r1]
- subs r0, 0x10
- ands r0, r2
- orrs r0, r3
- strb r0, [r1]
-_08001160:
- ldr r6, [sp, 0x4]
- cmp r6, 0xFF
- beq _08001176
- lsls r1, r7, 2
- add r1, r8
- lsls r3, r6, 7
- ldrb r2, [r1, 0x1]
- movs r0, 0x7F
- ands r0, r2
- orrs r0, r3
- strb r0, [r1, 0x1]
-_08001176:
- cmp r5, 0xFF
- beq _0800118E
- lsls r1, r7, 2
- add r1, r8
- movs r0, 0x3
- ands r5, r0
- lsls r3, r5, 4
- ldrb r2, [r1]
- subs r0, 0x34
- ands r0, r2
- orrs r0, r3
- strb r0, [r1]
-_0800118E:
- cmp r4, 0xFF
- beq _080011A6
- lsls r1, r7, 2
- add r1, r8
- movs r0, 0x1
- ands r4, r0
- lsls r3, r4, 6
- ldrb r2, [r1]
- subs r0, 0x42
- ands r0, r2
- orrs r0, r3
- strb r0, [r1]
-_080011A6:
- ldr r0, [sp, 0xC]
- cmp r0, 0xFF
- beq _080011BC
- lsls r1, r7, 2
- add r1, r8
- lsls r3, r0, 7
- ldrb r2, [r1]
- movs r0, 0x7F
- ands r0, r2
- orrs r0, r3
- strb r0, [r1]
-_080011BC:
- ldr r1, [sp]
- lsls r0, r1, 2
- add r0, r8
- mov r2, r12
- strb r2, [r0, 0x2]
- strb r2, [r0, 0x3]
- ldrb r1, [r0]
- movs r2, 0x1
- orrs r1, r2
- strb r1, [r0]
-_080011D0:
- add sp, 0x10
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080011E0: .4byte gUnknown_30008D0
- thumb_func_end SetBgControlAttributes
-
- thumb_func_start GetBgControlAttribute
-GetBgControlAttribute: @ 80011E4
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- lsls r1, 24
- lsrs r5, r1, 24
- adds r0, r4, 0
- bl IsInvalidBg
- lsls r0, 24
- cmp r0, 0
- bne _08001290
- ldr r1, _0800121C @ =gUnknown_30008D0
- lsls r2, r4, 2
- adds r0, r2, r1
- ldrb r0, [r0]
- lsls r0, 31
- adds r3, r1, 0
- cmp r0, 0
- beq _08001290
- subs r0, r5, 0x1
- cmp r0, 0x7
- bhi _08001290
- lsls r0, 2
- ldr r1, _08001220 @ =_08001224
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_0800121C: .4byte gUnknown_30008D0
-_08001220: .4byte _08001224
- .align 2, 0
-_08001224:
- .4byte _08001244
- .4byte _0800124E
- .4byte _08001258
- .4byte _08001262
- .4byte _0800126C
- .4byte _08001274
- .4byte _0800127E
- .4byte _08001288
-_08001244:
- adds r0, r2, r3
- ldrb r0, [r0]
- lsls r0, 31
- lsrs r0, 31
- b _08001292
-_0800124E:
- adds r0, r2, r3
- ldrb r0, [r0, 0x1]
- lsls r0, 30
- lsrs r0, 30
- b _08001292
-_08001258:
- adds r0, r2, r3
- ldrb r0, [r0, 0x1]
- lsls r0, 25
- lsrs r0, 27
- b _08001292
-_08001262:
- adds r0, r2, r3
- ldrb r0, [r0]
- lsls r0, 28
- lsrs r0, 30
- b _08001292
-_0800126C:
- adds r0, r2, r3
- ldrb r0, [r0, 0x1]
- lsrs r0, 7
- b _08001292
-_08001274:
- adds r0, r2, r3
- ldrb r0, [r0]
- lsls r0, 26
- lsrs r0, 30
- b _08001292
-_0800127E:
- adds r0, r2, r3
- ldrb r0, [r0]
- lsls r0, 25
- lsrs r0, 31
- b _08001292
-_08001288:
- adds r0, r2, r3
- ldrb r0, [r0]
- lsrs r0, 7
- b _08001292
-_08001290:
- movs r0, 0xFF
-_08001292:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end GetBgControlAttribute
-
- thumb_func_start LoadBgVram
-LoadBgVram: @ 8001298
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- mov r8, r1
- ldr r1, [sp, 0x18]
- lsls r0, 24
- lsrs r4, r0, 24
- lsls r2, 16
- lsrs r7, r2, 16
- lsls r3, 16
- lsrs r6, r3, 16
- lsls r1, 24
- lsrs r5, r1, 24
- adds r0, r4, 0
- bl IsInvalidBg
- lsls r0, 24
- cmp r0, 0
- bne _08001310
- ldr r1, _080012D8 @ =gUnknown_30008D0
- lsls r0, r4, 2
- adds r1, r0, r1
- ldrb r0, [r1]
- lsls r0, 31
- cmp r0, 0
- beq _08001310
- cmp r5, 0x1
- beq _080012DC
- cmp r5, 0x2
- beq _080012E4
- movs r2, 0xFF
- b _08001314
- .align 2, 0
-_080012D8: .4byte gUnknown_30008D0
-_080012DC:
- ldrb r0, [r1, 0x1]
- lsls r0, 30
- lsrs r0, 16
- b _080012EC
-_080012E4:
- ldrb r0, [r1, 0x1]
- lsls r0, 25
- lsrs r0, 27
- lsls r0, 11
-_080012EC:
- adds r0, r6, r0
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0xC0
- lsls r1, 19
- adds r1, r0, r1
- mov r0, r8
- adds r2, r7, 0
- movs r3, 0
- bl RequestDma3Copy
- lsls r0, 24
- lsrs r2, r0, 24
- asrs r0, 24
- movs r1, 0x1
- negs r1, r1
- cmp r0, r1
- bne _08001314
-_08001310:
- movs r0, 0xFF
- b _08001316
-_08001314:
- adds r0, r2, 0
-_08001316:
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end LoadBgVram
-
- thumb_func_start ShowBgInternal
-ShowBgInternal: @ 8001320
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- adds r0, r4, 0
- bl IsInvalidBg
- lsls r0, 24
- cmp r0, 0
- bne _0800138E
- ldr r5, _08001394 @ =gUnknown_30008D0
- lsls r0, r4, 2
- adds r2, r0, r5
- ldrb r3, [r2]
- lsls r0, r3, 31
- cmp r0, 0
- beq _0800138E
- lsls r1, r3, 26
- lsrs r1, 30
- ldrb r2, [r2, 0x1]
- lsls r0, r2, 30
- lsrs r0, 28
- orrs r1, r0
- movs r0, 0x40
- ands r0, r3
- orrs r1, r0
- lsrs r0, r2, 7
- lsls r0, 7
- orrs r1, r0
- lsls r2, 25
- lsrs r2, 27
- lsls r2, 8
- orrs r1, r2
- lsrs r0, r3, 7
- lsls r0, 13
- orrs r1, r0
- lsls r0, r3, 28
- lsrs r0, 30
- lsls r0, 14
- orrs r1, r0
- lsls r0, r4, 25
- movs r2, 0x80
- lsls r2, 20
- adds r0, r2
- lsrs r0, 24
- bl SetGpuReg
- adds r1, r4, 0
- adds r1, 0x8
- movs r0, 0x1
- lsls r0, r1
- ldrh r1, [r5, 0x10]
- orrs r0, r1
- ldr r1, _08001398 @ =0x00000f07
- ands r0, r1
- strh r0, [r5, 0x10]
-_0800138E:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08001394: .4byte gUnknown_30008D0
-_08001398: .4byte 0x00000f07
- thumb_func_end ShowBgInternal
-
- thumb_func_start HideBgInternal
-HideBgInternal: @ 800139C
- push {r4,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- adds r0, r4, 0
- bl IsInvalidBg
- lsls r0, 24
- cmp r0, 0
- bne _080013C2
- ldr r2, _080013C8 @ =gUnknown_30008D0
- adds r0, r4, 0
- adds r0, 0x8
- movs r1, 0x1
- lsls r1, r0
- ldrh r0, [r2, 0x10]
- bics r0, r1
- ldr r1, _080013CC @ =0x00000f07
- ands r0, r1
- strh r0, [r2, 0x10]
-_080013C2:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080013C8: .4byte gUnknown_30008D0
-_080013CC: .4byte 0x00000f07
- thumb_func_end HideBgInternal
-
- thumb_func_start SyncBgVisibilityAndMode
-SyncBgVisibilityAndMode: @ 80013D0
- push {lr}
- movs r0, 0
- bl GetGpuReg
- ldr r1, _080013EC @ =0x0000f0f8
- ands r1, r0
- ldr r0, _080013F0 @ =gUnknown_30008D0
- ldrh r0, [r0, 0x10]
- orrs r1, r0
- movs r0, 0
- bl SetGpuReg
- pop {r0}
- bx r0
- .align 2, 0
-_080013EC: .4byte 0x0000f0f8
-_080013F0: .4byte gUnknown_30008D0
- thumb_func_end SyncBgVisibilityAndMode
-
- thumb_func_start SetTextModeAndHideBgs
-SetTextModeAndHideBgs: @ 80013F4
- push {lr}
- movs r0, 0
- bl GetGpuReg
- ldr r1, _0800140C @ =0x0000f0f8
- ands r1, r0
- movs r0, 0
- bl SetGpuReg
- pop {r0}
- bx r0
- .align 2, 0
-_0800140C: .4byte 0x0000f0f8
- thumb_func_end SetTextModeAndHideBgs
-
- thumb_func_start SetBgAffineInternal
-SetBgAffineInternal: @ 8001410
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- sub sp, 0x24
- mov r12, r1
- mov r8, r2
- ldr r1, [sp, 0x3C]
- ldr r2, [sp, 0x40]
- ldr r4, [sp, 0x44]
- ldr r5, [sp, 0x48]
- lsls r0, 24
- lsrs r6, r0, 24
- lsls r3, 16
- lsrs r3, 16
- lsls r1, 16
- lsrs r7, r1, 16
- lsls r2, 16
- lsrs r2, 16
- lsls r4, 16
- lsrs r4, 16
- lsls r5, 16
- lsrs r5, 16
- ldr r0, _08001454 @ =gUnknown_30008D0
- ldrh r0, [r0, 0x10]
- movs r1, 0x7
- ands r1, r0
- cmp r1, 0x1
- beq _08001458
- cmp r1, 0x1
- ble _080014CE
- cmp r1, 0x2
- beq _0800145E
- b _080014CE
- .align 2, 0
-_08001454: .4byte gUnknown_30008D0
-_08001458:
- cmp r6, 0x2
- bne _080014CE
- b _08001468
-_0800145E:
- subs r0, r6, 0x2
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bhi _080014CE
-_08001468:
- mov r0, r12
- str r0, [sp]
- mov r0, r8
- str r0, [sp, 0x4]
- mov r0, sp
- strh r3, [r0, 0x8]
- strh r7, [r0, 0xA]
- strh r2, [r0, 0xC]
- strh r4, [r0, 0xE]
- strh r5, [r0, 0x10]
- add r4, sp, 0x14
- adds r1, r4, 0
- movs r2, 0x1
- bl BgAffineSet
- ldrh r1, [r4]
- movs r0, 0x20
- bl SetGpuReg
- ldrh r1, [r4, 0x2]
- movs r0, 0x22
- bl SetGpuReg
- ldrh r1, [r4, 0x4]
- movs r0, 0x24
- bl SetGpuReg
- ldrh r1, [r4, 0x6]
- movs r0, 0x26
- bl SetGpuReg
- ldrh r1, [r4]
- movs r0, 0x20
- bl SetGpuReg
- ldrh r1, [r4, 0x8]
- movs r0, 0x28
- bl SetGpuReg
- ldrh r1, [r4, 0xA]
- movs r0, 0x2A
- bl SetGpuReg
- ldrh r1, [r4, 0xC]
- movs r0, 0x2C
- bl SetGpuReg
- ldrh r1, [r4, 0xE]
- movs r0, 0x2E
- bl SetGpuReg
-_080014CE:
- add sp, 0x24
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end SetBgAffineInternal
-
- thumb_func_start IsInvalidBg
-IsInvalidBg: @ 80014DC
- push {lr}
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x3
- bhi _080014EA
- movs r0, 0
- b _080014EC
-_080014EA:
- movs r0, 0x1
-_080014EC:
- pop {r1}
- bx r1
- thumb_func_end IsInvalidBg
-
- thumb_func_start sub_80014F0
-sub_80014F0: @ 80014F0
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- adds r5, r1, 0
- mov r8, r2
- cmp r3, 0x1
- beq _08001582
- cmp r3, 0x1
- bgt _08001508
- cmp r3, 0
- beq _0800150E
- b _08001606
-_08001508:
- cmp r3, 0x2
- beq _080015C8
- b _08001606
-_0800150E:
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0x2
- bl GetBgControlAttribute
- lsls r0, 16
- lsrs r0, 7
- movs r1, 0x80
- lsls r1, 3
- adds r4, r0, r1
- movs r1, 0x80
- lsls r1, 4
- cmp r4, r1
- ble _0800152C
- adds r4, r1, 0
-_0800152C:
- movs r2, 0
- movs r6, 0
- adds r3, r0, 0
- movs r5, 0
- cmp r3, r4
- bge _0800157C
- ldr r7, _08001568 @ =gUnknown_3000938
- mov r12, r7
-_0800153C:
- adds r0, r3, 0
- cmp r3, 0
- bge _08001544
- adds r0, r3, 0x7
-_08001544:
- asrs r0, 3
- mov r7, r12
- adds r1, r0, r7
- ldrb r1, [r1]
- lsls r0, 3
- subs r0, r3, r0
- asrs r1, r0
- movs r0, 0x1
- ands r1, r0
- cmp r1, 0
- bne _08001572
- cmp r2, 0
- beq _0800156C
- adds r2, 0x1
- cmp r2, r8
- bne _08001574
- adds r0, r6, 0
- b _08001608
- .align 2, 0
-_08001568: .4byte gUnknown_3000938
-_0800156C:
- adds r6, r5, 0
- movs r2, 0x1
- b _08001574
-_08001572:
- movs r2, 0
-_08001574:
- adds r3, 0x1
- adds r5, 0x1
- cmp r3, r4
- blt _0800153C
-_0800157C:
- movs r0, 0x1
- negs r0, r0
- b _08001608
-_08001582:
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0x2
- bl GetBgControlAttribute
- lsls r0, 16
- lsrs r0, 7
- adds r0, r5
- mov r1, r8
- adds r4, r0, r1
- adds r3, r0, 0
- cmp r3, r4
- bge _08001606
- ldr r5, _080015C4 @ =gUnknown_3000938
- movs r6, 0x1
-_080015A0:
- adds r1, r3, 0
- cmp r3, 0
- bge _080015A8
- adds r1, r3, 0x7
-_080015A8:
- asrs r1, 3
- adds r2, r1, r5
- lsls r1, 3
- subs r1, r3, r1
- adds r0, r6, 0
- lsls r0, r1
- ldrb r1, [r2]
- orrs r0, r1
- strb r0, [r2]
- adds r3, 0x1
- cmp r3, r4
- blt _080015A0
- b _08001606
- .align 2, 0
-_080015C4: .4byte gUnknown_3000938
-_080015C8:
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0x2
- bl GetBgControlAttribute
- lsls r0, 16
- lsrs r0, 7
- adds r0, r5
- mov r7, r8
- adds r4, r0, r7
- adds r3, r0, 0
- cmp r3, r4
- bge _08001606
- ldr r5, _08001614 @ =gUnknown_3000938
- movs r6, 0x1
-_080015E6:
- adds r0, r3, 0
- cmp r3, 0
- bge _080015EE
- adds r0, r3, 0x7
-_080015EE:
- asrs r0, 3
- adds r2, r0, r5
- lsls r0, 3
- subs r0, r3, r0
- adds r1, r6, 0
- lsls r1, r0
- ldrb r0, [r2]
- bics r0, r1
- strb r0, [r2]
- adds r3, 0x1
- cmp r3, r4
- blt _080015E6
-_08001606:
- movs r0, 0
-_08001608:
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_08001614: .4byte gUnknown_3000938
- thumb_func_end sub_80014F0
-
- thumb_func_start sub_8001618
-sub_8001618: @ 8001618
- push {r4,lr}
- adds r4, r0, 0
- bl ResetBgs
- ldr r1, _0800164C @ =gUnknown_3000928
- movs r2, 0
- adds r0, r1, 0
- adds r0, 0xC
-_08001628:
- str r2, [r0]
- subs r0, 0x4
- cmp r0, r1
- bge _08001628
- ldr r0, _08001650 @ =gUnknown_3003D8C
- str r4, [r0]
- ldr r1, _08001654 @ =gUnknown_3000938
- movs r2, 0
- adds r0, r1, 0
- adds r0, 0xFF
-_0800163C:
- strb r2, [r0]
- subs r0, 0x1
- cmp r0, r1
- bge _0800163C
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0800164C: .4byte gUnknown_3000928
-_08001650: .4byte gUnknown_3003D8C
-_08001654: .4byte gUnknown_3000938
- thumb_func_end sub_8001618
-
- thumb_func_start sub_8001658
-sub_8001658: @ 8001658
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x10
- adds r5, r1, 0
- lsls r0, 24
- lsrs r0, 24
- lsls r2, 24
- lsrs r4, r2, 24
- bl SetBgModeInternal
- bl ResetBgControlStructs
- cmp r4, 0
- beq _08001712
- movs r7, 0
- ldr r0, _08001724 @ =gUnknown_30008E8
- mov r9, r0
- adds r6, r5, 0
- ldr r2, _08001728 @ =gUnknown_3000938
- mov r10, r2
- mov r8, r4
-_08001688:
- ldr r4, [r6]
- lsls r0, r4, 30
- lsrs r5, r0, 30
- cmp r5, 0x3
- bhi _08001704
- lsls r1, r4, 28
- lsrs r1, 30
- lsls r2, r4, 23
- lsrs r2, 27
- lsls r3, r4, 21
- lsrs r3, 30
- lsls r0, r4, 20
- lsrs r0, 31
- str r0, [sp]
- lsls r0, r4, 18
- lsrs r0, 30
- str r0, [sp, 0x4]
- str r7, [sp, 0x8]
- str r7, [sp, 0xC]
- adds r0, r5, 0
- bl SetBgControlAttributes
- lsls r4, r5, 4
- mov r5, r9
- adds r3, r4, r5
- ldr r2, [r6]
- lsls r2, 8
- lsrs r2, 22
- ldrh r0, [r3]
- ldr r5, _0800172C @ =0xfffffc00
- adds r1, r5, 0
- ands r0, r1
- orrs r0, r2
- strh r0, [r3]
- ldrb r0, [r3, 0x1]
- movs r2, 0x3D
- negs r2, r2
- adds r1, r2, 0
- ands r0, r1
- strb r0, [r3, 0x1]
- ldr r0, [r3]
- ldr r1, _08001730 @ =0x00003fff
- ands r0, r1
- str r0, [r3]
- mov r0, r9
- adds r0, 0x4
- adds r0, r4, r0
- str r7, [r0]
- mov r0, r9
- adds r0, 0x8
- adds r0, r4, r0
- str r7, [r0]
- ldr r5, _08001734 @ =gUnknown_30008F4
- adds r4, r5
- str r7, [r4]
- ldr r0, [r6]
- lsls r0, 28
- lsrs r0, 30
- lsls r0, 6
- add r0, r10
- movs r1, 0x1
- strb r1, [r0]
-_08001704:
- adds r6, 0x4
- movs r0, 0x1
- negs r0, r0
- add r8, r0
- mov r2, r8
- cmp r2, 0
- bne _08001688
-_08001712:
- add sp, 0x10
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08001724: .4byte gUnknown_30008E8
-_08001728: .4byte gUnknown_3000938
-_0800172C: .4byte 0xfffffc00
-_08001730: .4byte 0x00003fff
-_08001734: .4byte gUnknown_30008F4
- thumb_func_end sub_8001658
-
- thumb_func_start sub_8001738
-sub_8001738: @ 8001738
- push {r4-r7,lr}
- sub sp, 0x10
- adds r7, r0, 0
- ldr r4, [r7]
- lsls r0, r4, 30
- lsrs r5, r0, 30
- cmp r5, 0x3
- bhi _080017B8
- lsls r1, r4, 28
- lsrs r1, 30
- lsls r2, r4, 23
- lsrs r2, 27
- lsls r3, r4, 21
- lsrs r3, 30
- lsls r0, r4, 20
- lsrs r0, 31
- str r0, [sp]
- lsls r0, r4, 18
- lsrs r0, 30
- str r0, [sp, 0x4]
- movs r6, 0
- str r6, [sp, 0x8]
- str r6, [sp, 0xC]
- adds r0, r5, 0
- bl SetBgControlAttributes
- ldr r4, _080017C0 @ =gUnknown_30008E8
- lsls r5, 4
- adds r3, r5, r4
- ldr r1, [r7]
- lsls r1, 8
- lsrs r1, 22
- ldrh r2, [r3]
- ldr r0, _080017C4 @ =0xfffffc00
- ands r0, r2
- orrs r0, r1
- strh r0, [r3]
- ldrb r1, [r3, 0x1]
- movs r0, 0x3D
- negs r0, r0
- ands r0, r1
- strb r0, [r3, 0x1]
- ldr r0, [r3]
- ldr r1, _080017C8 @ =0x00003fff
- ands r0, r1
- str r0, [r3]
- adds r0, r4, 0x4
- adds r0, r5, r0
- str r6, [r0]
- adds r0, r4, 0
- adds r0, 0x8
- adds r0, r5, r0
- str r6, [r0]
- adds r4, 0xC
- adds r5, r4
- str r6, [r5]
- ldr r1, _080017CC @ =gUnknown_3000938
- ldr r0, [r7]
- lsls r0, 28
- lsrs r0, 30
- lsls r0, 6
- adds r0, r1
- movs r1, 0x1
- strb r1, [r0]
-_080017B8:
- add sp, 0x10
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080017C0: .4byte gUnknown_30008E8
-_080017C4: .4byte 0xfffffc00
-_080017C8: .4byte 0x00003fff
-_080017CC: .4byte gUnknown_3000938
- thumb_func_end sub_8001738
-
- thumb_func_start LoadBgTiles
-LoadBgTiles: @ 80017D0
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- sub sp, 0x4
- adds r7, r1, 0
- lsls r0, 24
- lsrs r5, r0, 24
- lsls r2, 16
- lsrs r2, 16
- mov r8, r2
- lsls r3, 16
- lsrs r4, r3, 16
- adds r0, r5, 0
- movs r1, 0x5
- bl GetBgControlAttribute
- lsls r0, 16
- cmp r0, 0
- bne _0800180C
- ldr r1, _08001808 @ =gUnknown_30008E8
- lsls r0, r5, 4
- adds r0, r1
- ldrh r0, [r0]
- lsls r0, 22
- lsrs r0, 22
- adds r0, r4
- lsls r0, 21
- b _0800181C
- .align 2, 0
-_08001808: .4byte gUnknown_30008E8
-_0800180C:
- ldr r1, _0800183C @ =gUnknown_30008E8
- lsls r0, r5, 4
- adds r0, r1
- ldrh r0, [r0]
- lsls r0, 22
- lsrs r0, 22
- adds r0, r4
- lsls r0, 22
-_0800181C:
- lsrs r4, r0, 16
- movs r6, 0x1
- str r6, [sp]
- adds r0, r5, 0
- adds r1, r7, 0
- mov r2, r8
- adds r3, r4, 0
- bl LoadBgVram
- lsls r2, r0, 24
- lsrs r1, r2, 24
- adds r7, r1, 0
- cmp r1, 0xFF
- bne _08001844
- ldr r0, _08001840 @ =0x0000ffff
- b _08001872
- .align 2, 0
-_0800183C: .4byte gUnknown_30008E8
-_08001840: .4byte 0x0000ffff
-_08001844:
- ldr r0, _08001880 @ =gUnknown_3000928
- lsrs r2, 29
- lsls r2, 2
- adds r2, r0
- movs r0, 0x1F
- ands r0, r1
- adds r1, r6, 0
- lsls r1, r0
- ldr r0, [r2]
- orrs r0, r1
- str r0, [r2]
- ldr r0, _08001884 @ =gUnknown_3003D8C
- ldr r0, [r0]
- cmp r0, 0x1
- bne _08001870
- lsrs r1, r4, 5
- mov r0, r8
- lsrs r2, r0, 5
- adds r0, r5, 0
- movs r3, 0x1
- bl sub_80014F0
-_08001870:
- adds r0, r7, 0
-_08001872:
- add sp, 0x4
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_08001880: .4byte gUnknown_3000928
-_08001884: .4byte gUnknown_3003D8C
- thumb_func_end LoadBgTiles
-
- thumb_func_start LoadBgTilemap
-LoadBgTilemap: @ 8001888
- push {r4,lr}
- sub sp, 0x4
- lsls r0, 24
- lsrs r0, 24
- lsls r2, 16
- lsrs r2, 16
- lsls r3, 21
- lsrs r3, 16
- movs r4, 0x2
- str r4, [sp]
- bl LoadBgVram
- lsls r2, r0, 24
- lsrs r3, r2, 24
- cmp r3, 0xFF
- beq _080018C8
- ldr r0, _080018C4 @ =gUnknown_3000928
- lsrs r2, 29
- lsls r2, 2
- adds r2, r0
- movs r0, 0x1F
- ands r0, r3
- movs r1, 0x1
- lsls r1, r0
- ldr r0, [r2]
- orrs r0, r1
- str r0, [r2]
- adds r0, r3, 0
- b _080018CA
- .align 2, 0
-_080018C4: .4byte gUnknown_3000928
-_080018C8:
- ldr r0, _080018D4 @ =0x0000ffff
-_080018CA:
- add sp, 0x4
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_080018D4: .4byte 0x0000ffff
- thumb_func_end LoadBgTilemap
-
- thumb_func_start Unused_LoadBgPalette
-Unused_LoadBgPalette: @ 80018D8
- push {r4-r7,lr}
- adds r7, r1, 0
- lsls r0, 24
- lsrs r4, r0, 24
- lsls r2, 16
- lsrs r6, r2, 16
- lsls r3, 16
- lsrs r5, r3, 16
- adds r0, r4, 0
- bl IsInvalidBg32
- cmp r0, 0
- bne _08001924
- ldr r1, _08001928 @ =gUnknown_30008E8
- lsls r0, r4, 4
- adds r0, r1
- ldrb r1, [r0, 0x1]
- lsls r1, 26
- lsrs r1, 28
- lsls r1, 5
- lsls r0, r5, 1
- adds r1, r0
- lsls r1, 16
- lsrs r1, 16
- movs r0, 0xA0
- lsls r0, 19
- adds r1, r0
- adds r0, r7, 0
- adds r2, r6, 0
- movs r3, 0
- bl RequestDma3Copy
- lsls r3, r0, 24
- asrs r1, r3, 24
- movs r0, 0x1
- negs r0, r0
- cmp r1, r0
- bne _08001930
-_08001924:
- ldr r0, _0800192C @ =0x0000ffff
- b _08001954
- .align 2, 0
-_08001928: .4byte gUnknown_30008E8
-_0800192C: .4byte 0x0000ffff
-_08001930:
- ldr r4, _0800195C @ =gUnknown_3000928
- adds r0, r1, 0
- cmp r1, 0
- bge _0800193A
- adds r0, 0x1F
-_0800193A:
- asrs r0, 5
- lsls r2, r0, 2
- adds r2, r4
- lsls r0, 5
- subs r0, r1, r0
- lsls r0, 24
- asrs r0, 24
- movs r1, 0x1
- lsls r1, r0
- ldr r0, [r2]
- orrs r0, r1
- str r0, [r2]
- lsrs r0, r3, 24
-_08001954:
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_0800195C: .4byte gUnknown_3000928
- thumb_func_end Unused_LoadBgPalette
-
- thumb_func_start IsDma3ManagerBusyWithBgCopy
-IsDma3ManagerBusyWithBgCopy: @ 8001960
- push {r4-r7,lr}
- movs r5, 0
- movs r7, 0x1
- negs r7, r7
-_08001968:
- adds r0, r5, 0
- cmp r5, 0
- bge _08001970
- adds r0, 0x1F
-_08001970:
- asrs r0, 5
- lsls r2, r0, 24
- lsls r0, 5
- subs r0, r5, r0
- lsls r0, 24
- lsrs r0, 24
- ldr r1, _080019A4 @ =gUnknown_3000928
- lsrs r2, 22
- adds r4, r2, r1
- movs r6, 0x1
- lsls r6, r0
- ldr r0, [r4]
- ands r0, r6
- cmp r0, 0
- beq _080019AE
- lsls r0, r5, 16
- asrs r0, 16
- bl CheckForSpaceForDma3Request
- lsls r0, 24
- asrs r0, 24
- cmp r0, r7
- bne _080019A8
- movs r0, 0x1
- b _080019B6
- .align 2, 0
-_080019A4: .4byte gUnknown_3000928
-_080019A8:
- ldr r0, [r4]
- bics r0, r6
- str r0, [r4]
-_080019AE:
- adds r5, 0x1
- cmp r5, 0x7F
- ble _08001968
- movs r0, 0
-_080019B6:
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end IsDma3ManagerBusyWithBgCopy
-
- thumb_func_start ShowBg
-ShowBg: @ 80019BC
- push {lr}
- lsls r0, 24
- lsrs r0, 24
- bl ShowBgInternal
- bl SyncBgVisibilityAndMode
- pop {r0}
- bx r0
- thumb_func_end ShowBg
-
- thumb_func_start HideBg
-HideBg: @ 80019D0
- push {lr}
- lsls r0, 24
- lsrs r0, 24
- bl HideBgInternal
- bl SyncBgVisibilityAndMode
- pop {r0}
- bx r0
- thumb_func_end HideBg
-
- thumb_func_start SetBgAttribute
-SetBgAttribute: @ 80019E4
- push {r4,lr}
- sub sp, 0x10
- lsls r0, 24
- lsrs r4, r0, 24
- lsls r1, 24
- lsrs r1, 24
- lsls r2, 24
- lsrs r3, r2, 24
- subs r0, r1, 0x1
- cmp r0, 0x6
- bhi _08001A9E
- lsls r0, 2
- ldr r1, _08001A04 @ =_08001A08
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_08001A04: .4byte _08001A08
- .align 2, 0
-_08001A08:
- .4byte _08001A24
- .4byte _08001A34
- .4byte _08001A46
- .4byte _08001A5C
- .4byte _08001A70
- .4byte _08001A88
- .4byte _08001A66
-_08001A24:
- movs r0, 0xFF
- str r0, [sp]
- str r0, [sp, 0x4]
- str r0, [sp, 0x8]
- str r0, [sp, 0xC]
- adds r0, r4, 0
- adds r1, r3, 0
- b _08001A7E
-_08001A34:
- movs r0, 0xFF
- str r0, [sp]
- str r0, [sp, 0x4]
- str r0, [sp, 0x8]
- str r0, [sp, 0xC]
- adds r0, r4, 0
- movs r1, 0xFF
- adds r2, r3, 0
- b _08001A80
-_08001A46:
- movs r0, 0xFF
- str r0, [sp]
- str r0, [sp, 0x4]
- str r0, [sp, 0x8]
- str r0, [sp, 0xC]
- adds r0, r4, 0
- movs r1, 0xFF
- movs r2, 0xFF
- bl SetBgControlAttributes
- b _08001A9E
-_08001A5C:
- str r3, [sp]
- movs r0, 0xFF
- str r0, [sp, 0x4]
- str r0, [sp, 0x8]
- b _08001A78
-_08001A66:
- movs r0, 0xFF
- str r0, [sp]
- str r3, [sp, 0x4]
- str r0, [sp, 0x8]
- b _08001A78
-_08001A70:
- movs r0, 0xFF
- str r0, [sp]
- str r0, [sp, 0x4]
- str r3, [sp, 0x8]
-_08001A78:
- str r0, [sp, 0xC]
- adds r0, r4, 0
- movs r1, 0xFF
-_08001A7E:
- movs r2, 0xFF
-_08001A80:
- movs r3, 0xFF
- bl SetBgControlAttributes
- b _08001A9E
-_08001A88:
- movs r0, 0xFF
- str r0, [sp]
- str r0, [sp, 0x4]
- str r0, [sp, 0x8]
- str r3, [sp, 0xC]
- adds r0, r4, 0
- movs r1, 0xFF
- movs r2, 0xFF
- movs r3, 0xFF
- bl SetBgControlAttributes
-_08001A9E:
- add sp, 0x10
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end SetBgAttribute
-
- thumb_func_start GetBgAttribute
-GetBgAttribute: @ 8001AA8
- push {r4,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- lsls r1, 24
- lsrs r1, 24
- subs r0, r1, 0x1
- cmp r0, 0x9
- bhi _08001B84
- lsls r0, 2
- ldr r1, _08001AC4 @ =_08001AC8
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_08001AC4: .4byte _08001AC8
- .align 2, 0
-_08001AC8:
- .4byte _08001AF0
- .4byte _08001AFA
- .4byte _08001B04
- .4byte _08001B0E
- .4byte _08001B22
- .4byte _08001B2C
- .4byte _08001B18
- .4byte _08001B36
- .4byte _08001B64
- .4byte _08001B70
-_08001AF0:
- adds r0, r4, 0
- movs r1, 0x2
- bl GetBgControlAttribute
- b _08001B6A
-_08001AFA:
- adds r0, r4, 0
- movs r1, 0x3
- bl GetBgControlAttribute
- b _08001B6A
-_08001B04:
- adds r0, r4, 0
- movs r1, 0x4
- bl GetBgControlAttribute
- b _08001B6A
-_08001B0E:
- adds r0, r4, 0
- movs r1, 0x5
- bl GetBgControlAttribute
- b _08001B6A
-_08001B18:
- adds r0, r4, 0
- movs r1, 0x6
- bl GetBgControlAttribute
- b _08001B6A
-_08001B22:
- adds r0, r4, 0
- movs r1, 0x7
- bl GetBgControlAttribute
- b _08001B6A
-_08001B2C:
- adds r0, r4, 0
- movs r1, 0x8
- bl GetBgControlAttribute
- b _08001B6A
-_08001B36:
- adds r0, r4, 0
- bl GetBgType
- cmp r0, 0
- beq _08001B48
- cmp r0, 0x1
- beq _08001B56
- movs r0, 0
- b _08001B86
-_08001B48:
- adds r0, r4, 0
- movs r1, 0
- bl GetBgMetricTextMode
- lsls r0, 27
- lsrs r0, 16
- b _08001B86
-_08001B56:
- adds r0, r4, 0
- movs r1, 0
- bl GetBgMetricAffineMode
- lsls r0, 24
- lsrs r0, 16
- b _08001B86
-_08001B64:
- adds r0, r4, 0
- bl GetBgType
-_08001B6A:
- lsls r0, 16
- lsrs r0, 16
- b _08001B86
-_08001B70:
- ldr r0, _08001B80 @ =gUnknown_30008E8
- lsls r1, r4, 4
- adds r1, r0
- ldrh r0, [r1]
- lsls r0, 22
- lsrs r0, 22
- b _08001B86
- .align 2, 0
-_08001B80: .4byte gUnknown_30008E8
-_08001B84:
- ldr r0, _08001B8C @ =0x0000ffff
-_08001B86:
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_08001B8C: .4byte 0x0000ffff
- thumb_func_end GetBgAttribute
-
- thumb_func_start ChangeBgX
-ChangeBgX: @ 8001B90
- push {r4-r6,lr}
- adds r6, r1, 0
- lsls r0, 24
- lsrs r4, r0, 24
- lsls r2, 24
- lsrs r5, r2, 24
- adds r0, r4, 0
- bl IsInvalidBg32
- cmp r0, 0
- bne _08001BB4
- adds r0, r4, 0
- movs r1, 0x1
- bl GetBgControlAttribute
- lsls r0, 16
- cmp r0, 0
- bne _08001BBA
-_08001BB4:
- movs r0, 0x1
- negs r0, r0
- b _08001CC0
-_08001BBA:
- cmp r5, 0x1
- beq _08001BD8
- cmp r5, 0x1
- ble _08001BC6
- cmp r5, 0x2
- beq _08001BEC
-_08001BC6:
- ldr r0, _08001BD4 @ =gUnknown_30008E8
- lsls r1, r4, 4
- adds r0, 0x8
- adds r0, r1, r0
- str r6, [r0]
- adds r5, r1, 0
- b _08001BFC
- .align 2, 0
-_08001BD4: .4byte gUnknown_30008E8
-_08001BD8:
- ldr r0, _08001BE8 @ =gUnknown_30008E8
- lsls r2, r4, 4
- adds r0, 0x8
- adds r0, r2, r0
- ldr r1, [r0]
- adds r1, r6
- b _08001BF8
- .align 2, 0
-_08001BE8: .4byte gUnknown_30008E8
-_08001BEC:
- ldr r0, _08001C14 @ =gUnknown_30008E8
- lsls r2, r4, 4
- adds r0, 0x8
- adds r0, r2, r0
- ldr r1, [r0]
- subs r1, r6
-_08001BF8:
- str r1, [r0]
- adds r5, r2, 0
-_08001BFC:
- bl GetBgMode
- lsls r0, 24
- lsrs r0, 24
- cmp r4, 0x1
- beq _08001C38
- cmp r4, 0x1
- bgt _08001C18
- cmp r4, 0
- beq _08001C22
- b _08001CB8
- .align 2, 0
-_08001C14: .4byte gUnknown_30008E8
-_08001C18:
- cmp r4, 0x2
- beq _08001C4C
- cmp r4, 0x3
- beq _08001C84
- b _08001CB8
-_08001C22:
- ldr r0, _08001C34 @ =gUnknown_30008E8
- ldr r0, [r0, 0x8]
- lsls r0, 8
- lsrs r1, r0, 16
- movs r0, 0x10
- bl SetGpuReg
- b _08001CB8
- .align 2, 0
-_08001C34: .4byte gUnknown_30008E8
-_08001C38:
- ldr r0, _08001C48 @ =gUnknown_30008E8
- ldr r0, [r0, 0x18]
- lsls r0, 8
- lsrs r1, r0, 16
- movs r0, 0x14
- bl SetGpuReg
- b _08001CB8
- .align 2, 0
-_08001C48: .4byte gUnknown_30008E8
-_08001C4C:
- cmp r0, 0
- bne _08001C64
- ldr r0, _08001C60 @ =gUnknown_30008E8
- ldr r0, [r0, 0x28]
- lsls r0, 8
- lsrs r1, r0, 16
- movs r0, 0x18
- bl SetGpuReg
- b _08001CB8
- .align 2, 0
-_08001C60: .4byte gUnknown_30008E8
-_08001C64:
- ldr r0, _08001C80 @ =gUnknown_30008E8
- ldr r0, [r0, 0x28]
- lsrs r1, r0, 16
- lsls r0, 16
- lsrs r4, r0, 16
- movs r0, 0x2A
- bl SetGpuReg
- movs r0, 0x28
- adds r1, r4, 0
- bl SetGpuReg
- b _08001CB8
- .align 2, 0
-_08001C80: .4byte gUnknown_30008E8
-_08001C84:
- cmp r0, 0
- bne _08001C9C
- ldr r0, _08001C98 @ =gUnknown_30008E8
- ldr r0, [r0, 0x38]
- lsls r0, 8
- lsrs r1, r0, 16
- movs r0, 0x1C
- bl SetGpuReg
- b _08001CB8
- .align 2, 0
-_08001C98: .4byte gUnknown_30008E8
-_08001C9C:
- cmp r0, 0x2
- bne _08001CB8
- ldr r0, _08001CC8 @ =gUnknown_30008E8
- ldr r0, [r0, 0x38]
- lsrs r1, r0, 16
- lsls r0, 16
- lsrs r4, r0, 16
- movs r0, 0x3A
- bl SetGpuReg
- movs r0, 0x38
- adds r1, r4, 0
- bl SetGpuReg
-_08001CB8:
- ldr r0, _08001CC8 @ =gUnknown_30008E8
- adds r0, 0x8
- adds r0, r5, r0
- ldr r0, [r0]
-_08001CC0:
- pop {r4-r6}
- pop {r1}
- bx r1
- .align 2, 0
-_08001CC8: .4byte gUnknown_30008E8
- thumb_func_end ChangeBgX
-
- thumb_func_start GetBgX
-GetBgX: @ 8001CCC
- push {r4,lr}
- lsls r0, 24
- lsrs r0, 24
- adds r4, r0, 0
- bl IsInvalidBg32
- cmp r0, 0
- bne _08001CFC
- adds r0, r4, 0
- movs r1, 0x1
- bl GetBgControlAttribute
- lsls r0, 16
- cmp r0, 0
- beq _08001CFC
- ldr r0, _08001CF8 @ =gUnknown_30008E8
- lsls r1, r4, 4
- adds r0, 0x8
- adds r1, r0
- ldr r0, [r1]
- b _08001D00
- .align 2, 0
-_08001CF8: .4byte gUnknown_30008E8
-_08001CFC:
- movs r0, 0x1
- negs r0, r0
-_08001D00:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end GetBgX
-
- thumb_func_start ChangeBgY
-ChangeBgY: @ 8001D08
- push {r4-r6,lr}
- adds r6, r1, 0
- lsls r0, 24
- lsrs r4, r0, 24
- lsls r2, 24
- lsrs r5, r2, 24
- adds r0, r4, 0
- bl IsInvalidBg32
- cmp r0, 0
- bne _08001D2C
- adds r0, r4, 0
- movs r1, 0x1
- bl GetBgControlAttribute
- lsls r0, 16
- cmp r0, 0
- bne _08001D32
-_08001D2C:
- movs r0, 0x1
- negs r0, r0
- b _08001E38
-_08001D32:
- cmp r5, 0x1
- beq _08001D50
- cmp r5, 0x1
- ble _08001D3E
- cmp r5, 0x2
- beq _08001D64
-_08001D3E:
- ldr r0, _08001D4C @ =gUnknown_30008E8
- lsls r1, r4, 4
- adds r0, 0xC
- adds r0, r1, r0
- str r6, [r0]
- adds r5, r1, 0
- b _08001D74
- .align 2, 0
-_08001D4C: .4byte gUnknown_30008E8
-_08001D50:
- ldr r0, _08001D60 @ =gUnknown_30008E8
- lsls r2, r4, 4
- adds r0, 0xC
- adds r0, r2, r0
- ldr r1, [r0]
- adds r1, r6
- b _08001D70
- .align 2, 0
-_08001D60: .4byte gUnknown_30008E8
-_08001D64:
- ldr r0, _08001D8C @ =gUnknown_30008E8
- lsls r2, r4, 4
- adds r0, 0xC
- adds r0, r2, r0
- ldr r1, [r0]
- subs r1, r6
-_08001D70:
- str r1, [r0]
- adds r5, r2, 0
-_08001D74:
- bl GetBgMode
- lsls r0, 24
- lsrs r0, 24
- cmp r4, 0x1
- beq _08001DB0
- cmp r4, 0x1
- bgt _08001D90
- cmp r4, 0
- beq _08001D9A
- b _08001E30
- .align 2, 0
-_08001D8C: .4byte gUnknown_30008E8
-_08001D90:
- cmp r4, 0x2
- beq _08001DC4
- cmp r4, 0x3
- beq _08001DFC
- b _08001E30
-_08001D9A:
- ldr r0, _08001DAC @ =gUnknown_30008E8
- ldr r0, [r0, 0xC]
- lsls r0, 8
- lsrs r1, r0, 16
- movs r0, 0x12
- bl SetGpuReg
- b _08001E30
- .align 2, 0
-_08001DAC: .4byte gUnknown_30008E8
-_08001DB0:
- ldr r0, _08001DC0 @ =gUnknown_30008E8
- ldr r0, [r0, 0x1C]
- lsls r0, 8
- lsrs r1, r0, 16
- movs r0, 0x16
- bl SetGpuReg
- b _08001E30
- .align 2, 0
-_08001DC0: .4byte gUnknown_30008E8
-_08001DC4:
- cmp r0, 0
- bne _08001DDC
- ldr r0, _08001DD8 @ =gUnknown_30008E8
- ldr r0, [r0, 0x2C]
- lsls r0, 8
- lsrs r1, r0, 16
- movs r0, 0x1A
- bl SetGpuReg
- b _08001E30
- .align 2, 0
-_08001DD8: .4byte gUnknown_30008E8
-_08001DDC:
- ldr r0, _08001DF8 @ =gUnknown_30008E8
- ldr r0, [r0, 0x2C]
- lsrs r1, r0, 16
- lsls r0, 16
- lsrs r4, r0, 16
- movs r0, 0x2E
- bl SetGpuReg
- movs r0, 0x2C
- adds r1, r4, 0
- bl SetGpuReg
- b _08001E30
- .align 2, 0
-_08001DF8: .4byte gUnknown_30008E8
-_08001DFC:
- cmp r0, 0
- bne _08001E14
- ldr r0, _08001E10 @ =gUnknown_30008E8
- ldr r0, [r0, 0x3C]
- lsls r0, 8
- lsrs r1, r0, 16
- movs r0, 0x1E
- bl SetGpuReg
- b _08001E30
- .align 2, 0
-_08001E10: .4byte gUnknown_30008E8
-_08001E14:
- cmp r0, 0x2
- bne _08001E30
- ldr r0, _08001E40 @ =gUnknown_30008E8
- ldr r0, [r0, 0x3C]
- lsrs r1, r0, 16
- lsls r0, 16
- lsrs r4, r0, 16
- movs r0, 0x3E
- bl SetGpuReg
- movs r0, 0x3C
- adds r1, r4, 0
- bl SetGpuReg
-_08001E30:
- ldr r0, _08001E40 @ =gUnknown_30008E8
- adds r0, 0xC
- adds r0, r5, r0
- ldr r0, [r0]
-_08001E38:
- pop {r4-r6}
- pop {r1}
- bx r1
- .align 2, 0
-_08001E40: .4byte gUnknown_30008E8
- thumb_func_end ChangeBgY
-
- thumb_func_start GetBgY
-GetBgY: @ 8001E44
- push {r4,lr}
- lsls r0, 24
- lsrs r0, 24
- adds r4, r0, 0
- bl IsInvalidBg32
- cmp r0, 0
- bne _08001E74
- adds r0, r4, 0
- movs r1, 0x1
- bl GetBgControlAttribute
- lsls r0, 16
- cmp r0, 0
- beq _08001E74
- ldr r0, _08001E70 @ =gUnknown_30008E8
- lsls r1, r4, 4
- adds r0, 0xC
- adds r1, r0
- ldr r0, [r1]
- b _08001E78
- .align 2, 0
-_08001E70: .4byte gUnknown_30008E8
-_08001E74:
- movs r0, 0x1
- negs r0, r0
-_08001E78:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end GetBgY
-
- thumb_func_start SetBgAffine
-SetBgAffine: @ 8001E80
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- sub sp, 0x10
- ldr r4, [sp, 0x28]
- ldr r5, [sp, 0x2C]
- ldr r6, [sp, 0x30]
- ldr r7, [sp, 0x34]
- lsls r0, 24
- lsrs r0, 24
- lsls r7, 16
- lsrs r7, 16
- lsls r3, 16
- asrs r3, 16
- lsls r4, 16
- asrs r4, 16
- str r4, [sp]
- lsls r5, 16
- asrs r5, 16
- str r5, [sp, 0x4]
- lsls r6, 16
- asrs r6, 16
- str r6, [sp, 0x8]
- str r7, [sp, 0xC]
- bl SetBgAffineInternal
- add sp, 0x10
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end SetBgAffine
-
- thumb_func_start Unused_AdjustBgMosaic
-Unused_AdjustBgMosaic: @ 8001EC0
- push {r4-r6,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- lsls r1, 24
- lsrs r6, r1, 24
- movs r0, 0x4C
- bl GetGpuReg
- lsls r0, 16
- lsrs r5, r0, 16
- movs r1, 0xF
- movs r3, 0xF
- ands r3, r5
- lsrs r2, r0, 20
- ands r2, r1
- movs r0, 0xFF
- lsls r0, 8
- ands r5, r0
- cmp r6, 0x6
- bhi _08001F14
- lsls r0, r6, 2
- ldr r1, _08001EF4 @ =_08001EF8
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_08001EF4: .4byte _08001EF8
- .align 2, 0
-_08001EF8:
- .4byte _08001F14
- .4byte _08001F1C
- .4byte _08001F22
- .4byte _08001F34
- .4byte _08001F4A
- .4byte _08001F50
- .4byte _08001F62
-_08001F14:
- movs r3, 0xF
- ands r3, r4
- lsrs r2, r4, 4
- b _08001F76
-_08001F1C:
- movs r3, 0xF
- ands r3, r4
- b _08001F76
-_08001F22:
- lsls r0, r3, 16
- asrs r0, 16
- adds r0, r4
- cmp r0, 0xF
- ble _08001F30
- movs r3, 0xF
- b _08001F76
-_08001F30:
- adds r0, r3, r4
- b _08001F44
-_08001F34:
- lsls r0, r3, 16
- asrs r0, 16
- subs r0, r4
- cmp r0, 0
- bge _08001F42
- movs r3, 0
- b _08001F76
-_08001F42:
- subs r0, r3, r4
-_08001F44:
- lsls r0, 16
- lsrs r3, r0, 16
- b _08001F76
-_08001F4A:
- movs r2, 0xF
- ands r2, r4
- b _08001F76
-_08001F50:
- lsls r0, r2, 16
- asrs r0, 16
- adds r0, r4
- cmp r0, 0xF
- ble _08001F5E
- movs r2, 0xF
- b _08001F76
-_08001F5E:
- adds r0, r2, r4
- b _08001F72
-_08001F62:
- lsls r0, r2, 16
- asrs r0, 16
- subs r0, r4
- cmp r0, 0
- bge _08001F70
- movs r2, 0
- b _08001F76
-_08001F70:
- subs r0, r2, r4
-_08001F72:
- lsls r0, 16
- lsrs r2, r0, 16
-_08001F76:
- lsls r0, r2, 16
- asrs r0, 12
- movs r1, 0xF0
- ands r0, r1
- orrs r5, r0
- lsls r0, r3, 16
- asrs r0, 16
- movs r1, 0xF
- ands r0, r1
- orrs r5, r0
- lsls r0, r5, 16
- lsrs r5, r0, 16
- movs r0, 0x4C
- adds r1, r5, 0
- bl SetGpuReg
- lsls r0, r5, 24
- lsrs r0, 24
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end Unused_AdjustBgMosaic
-
- thumb_func_start SetBgTilemapBuffer
-SetBgTilemapBuffer: @ 8001FA0
- push {r4,r5,lr}
- adds r5, r1, 0
- lsls r0, 24
- lsrs r4, r0, 24
- adds r0, r4, 0
- bl IsInvalidBg32
- cmp r0, 0
- bne _08001FCA
- adds r0, r4, 0
- movs r1, 0x1
- bl GetBgControlAttribute
- lsls r0, 16
- cmp r0, 0
- beq _08001FCA
- ldr r0, _08001FD0 @ =gUnknown_30008E8
- lsls r1, r4, 4
- adds r0, 0x4
- adds r1, r0
- str r5, [r1]
-_08001FCA:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08001FD0: .4byte gUnknown_30008E8
- thumb_func_end SetBgTilemapBuffer
-
- thumb_func_start UnsetBgTilemapBuffer
-UnsetBgTilemapBuffer: @ 8001FD4
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- adds r0, r4, 0
- bl IsInvalidBg32
- adds r5, r0, 0
- cmp r5, 0
- bne _08001FFE
- adds r0, r4, 0
- movs r1, 0x1
- bl GetBgControlAttribute
- lsls r0, 16
- cmp r0, 0
- beq _08001FFE
- ldr r0, _08002004 @ =gUnknown_30008E8
- lsls r1, r4, 4
- adds r0, 0x4
- adds r1, r0
- str r5, [r1]
-_08001FFE:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08002004: .4byte gUnknown_30008E8
- thumb_func_end UnsetBgTilemapBuffer
-
- thumb_func_start GetBgTilemapBuffer
-GetBgTilemapBuffer: @ 8002008
- push {r4,lr}
- lsls r0, 24
- lsrs r0, 24
- adds r4, r0, 0
- bl IsInvalidBg32
- cmp r0, 0
- bne _08002038
- adds r0, r4, 0
- movs r1, 0x1
- bl GetBgControlAttribute
- lsls r0, 16
- cmp r0, 0
- beq _08002038
- ldr r0, _08002034 @ =gUnknown_30008E8
- lsls r1, r4, 4
- adds r0, 0x4
- adds r1, r0
- ldr r0, [r1]
- b _0800203A
- .align 2, 0
-_08002034: .4byte gUnknown_30008E8
-_08002038:
- movs r0, 0
-_0800203A:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end GetBgTilemapBuffer
-
- thumb_func_start CopyToBgTilemapBuffer
-CopyToBgTilemapBuffer: @ 8002040
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- mov r10, r1
- lsls r0, 24
- lsrs r4, r0, 24
- mov r9, r4
- lsls r7, r2, 16
- lsrs r6, r7, 16
- lsls r3, 16
- lsrs r5, r3, 16
- mov r8, r5
- adds r0, r4, 0
- bl IsInvalidBg32
- cmp r0, 0
- bne _080020A8
- adds r0, r4, 0
- bl IsTileMapOutsideWram
- cmp r0, 0
- bne _080020A8
- cmp r6, 0
- beq _08002090
- ldr r0, _0800208C @ =gUnknown_30008E8
- lsls r1, r4, 4
- adds r0, 0x4
- adds r1, r0
- lsls r0, r5, 5
- ldr r1, [r1]
- adds r1, r0
- lsrs r2, r7, 17
- mov r0, r10
- bl CpuSet
- b _080020A8
- .align 2, 0
-_0800208C: .4byte gUnknown_30008E8
-_08002090:
- ldr r0, _080020B8 @ =gUnknown_30008E8
- mov r2, r9
- lsls r1, r2, 4
- adds r0, 0x4
- adds r1, r0
- mov r2, r8
- lsls r0, r2, 5
- ldr r1, [r1]
- adds r1, r0
- mov r0, r10
- bl LZ77UnCompWram
-_080020A8:
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080020B8: .4byte gUnknown_30008E8
- thumb_func_end CopyToBgTilemapBuffer
-
- thumb_func_start CopyBgTilemapBufferToVram
-CopyBgTilemapBufferToVram: @ 80020BC
- push {r4,lr}
- sub sp, 0x4
- lsls r0, 24
- lsrs r4, r0, 24
- adds r0, r4, 0
- bl IsInvalidBg32
- cmp r0, 0
- bne _08002118
- adds r0, r4, 0
- bl IsTileMapOutsideWram
- cmp r0, 0
- bne _08002118
- adds r0, r4, 0
- bl GetBgType
- cmp r0, 0
- beq _080020EA
- cmp r0, 0x1
- beq _080020F6
- movs r2, 0
- b _08002102
-_080020EA:
- adds r0, r4, 0
- movs r1, 0
- bl GetBgMetricTextMode
- lsls r0, 27
- b _08002100
-_080020F6:
- adds r0, r4, 0
- movs r1, 0
- bl GetBgMetricAffineMode
- lsls r0, 24
-_08002100:
- lsrs r2, r0, 16
-_08002102:
- ldr r0, _08002120 @ =gUnknown_30008E8
- lsls r1, r4, 4
- adds r0, 0x4
- adds r1, r0
- ldr r1, [r1]
- movs r0, 0x2
- str r0, [sp]
- adds r0, r4, 0
- movs r3, 0
- bl LoadBgVram
-_08002118:
- add sp, 0x4
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08002120: .4byte gUnknown_30008E8
- thumb_func_end CopyBgTilemapBufferToVram
-
- thumb_func_start CopyToBgTilemapBufferRect
-CopyToBgTilemapBufferRect: @ 8002124
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x4
- mov r8, r1
- ldr r1, [sp, 0x24]
- ldr r4, [sp, 0x28]
- lsls r0, 24
- lsrs r5, r0, 24
- lsls r2, 24
- lsrs r2, 24
- mov r10, r2
- lsls r3, 24
- lsrs r7, r3, 24
- lsls r1, 24
- lsrs r1, 24
- mov r9, r1
- lsls r4, 24
- lsrs r6, r4, 24
- adds r0, r5, 0
- bl IsInvalidBg32
- cmp r0, 0
- bne _08002214
- adds r0, r5, 0
- bl IsTileMapOutsideWram
- cmp r0, 0
- bne _08002214
- adds r0, r5, 0
- bl GetBgType
- cmp r0, 0
- beq _08002172
- cmp r0, 0x1
- beq _080021C0
- b _08002214
-_08002172:
- mov r4, r8
- adds r3, r7, 0
- adds r0, r3, r6
- cmp r3, r0
- bge _08002214
- mov r12, r0
- lsls r1, r5, 4
- ldr r0, _080021BC @ =gUnknown_30008EC
- adds r1, r0
- mov r8, r1
-_08002186:
- mov r2, r10
- mov r1, r9
- adds r0, r2, r1
- adds r7, r3, 0x1
- cmp r2, r0
- bge _080021B0
- mov r1, r8
- ldr r6, [r1]
- lsls r5, r3, 5
- adds r3, r0, 0
-_0800219A:
- adds r0, r5, r2
- lsls r0, 1
- adds r0, r6
- ldrh r1, [r4]
- strh r1, [r0]
- adds r4, 0x2
- adds r0, r2, 0x1
- lsls r0, 16
- lsrs r2, r0, 16
- cmp r2, r3
- blt _0800219A
-_080021B0:
- lsls r0, r7, 16
- lsrs r3, r0, 16
- cmp r3, r12
- blt _08002186
- b _08002214
- .align 2, 0
-_080021BC: .4byte gUnknown_30008EC
-_080021C0:
- mov r4, r8
- adds r0, r5, 0
- movs r1, 0x1
- bl GetBgMetricAffineMode
- lsls r0, 16
- lsrs r0, 16
- str r0, [sp]
- adds r3, r7, 0
- adds r0, r3, r6
- cmp r3, r0
- bge _08002214
- mov r12, r0
- lsls r5, 4
- mov r8, r5
-_080021DE:
- mov r2, r10
- mov r1, r9
- adds r0, r2, r1
- adds r7, r3, 0x1
- cmp r2, r0
- bge _0800220C
- ldr r6, _08002224 @ =gUnknown_30008EC
- add r6, r8
- ldr r1, [sp]
- adds r5, r3, 0
- muls r5, r1
- adds r3, r0, 0
-_080021F6:
- ldr r1, [r6]
- adds r0, r5, r2
- adds r1, r0
- ldrb r0, [r4]
- strb r0, [r1]
- adds r4, 0x1
- adds r0, r2, 0x1
- lsls r0, 16
- lsrs r2, r0, 16
- cmp r2, r3
- blt _080021F6
-_0800220C:
- lsls r0, r7, 16
- lsrs r3, r0, 16
- cmp r3, r12
- blt _080021DE
-_08002214:
- add sp, 0x4
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08002224: .4byte gUnknown_30008EC
- thumb_func_end CopyToBgTilemapBufferRect
-
- thumb_func_start CopyToBgTilemapBufferRect_ChangePalette
-CopyToBgTilemapBufferRect_ChangePalette: @ 8002228
- push {r4-r6,lr}
- sub sp, 0x24
- ldr r4, [sp, 0x34]
- ldr r5, [sp, 0x38]
- ldr r6, [sp, 0x3C]
- lsls r0, 24
- lsrs r0, 24
- lsls r2, 24
- lsrs r2, 24
- lsls r3, 24
- lsrs r3, 24
- lsls r4, 24
- lsrs r4, 24
- lsls r5, 24
- lsrs r5, 24
- lsls r6, 24
- lsrs r6, 24
- str r4, [sp]
- str r5, [sp, 0x4]
- str r2, [sp, 0x8]
- str r3, [sp, 0xC]
- str r4, [sp, 0x10]
- str r5, [sp, 0x14]
- str r6, [sp, 0x18]
- movs r2, 0
- str r2, [sp, 0x1C]
- str r2, [sp, 0x20]
- movs r3, 0
- bl CopyRectToBgTilemapBufferRect
- add sp, 0x24
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end CopyToBgTilemapBufferRect_ChangePalette
-
- thumb_func_start CopyRectToBgTilemapBufferRect
-CopyRectToBgTilemapBufferRect: @ 800226C
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x40
- str r1, [sp, 0x8]
- ldr r1, [sp, 0x60]
- ldr r4, [sp, 0x68]
- ldr r5, [sp, 0x6C]
- ldr r6, [sp, 0x70]
- ldr r7, [sp, 0x74]
- mov r8, r7
- ldr r7, [sp, 0x78]
- mov r9, r7
- ldr r7, [sp, 0x7C]
- mov r10, r7
- ldr r7, [sp, 0x80]
- mov r12, r7
- lsls r0, 24
- lsrs r0, 24
- str r0, [sp, 0x4]
- lsls r2, 24
- lsrs r2, 24
- str r2, [sp, 0xC]
- lsls r3, 24
- lsrs r3, 24
- str r3, [sp, 0x10]
- lsls r1, 24
- lsrs r7, r1, 24
- lsls r4, 24
- lsrs r4, 24
- str r4, [sp, 0x14]
- lsls r5, 24
- lsrs r5, 24
- lsls r6, 24
- lsrs r6, 24
- str r6, [sp, 0x18]
- mov r0, r8
- lsls r0, 24
- lsrs r4, r0, 24
- mov r1, r9
- lsls r1, 24
- lsrs r1, 24
- str r1, [sp, 0x1C]
- mov r2, r10
- lsls r2, 16
- lsrs r2, 16
- str r2, [sp, 0x20]
- mov r0, r12
- lsls r0, 16
- lsrs r0, 16
- str r0, [sp, 0x24]
- ldr r0, [sp, 0x4]
- bl IsInvalidBg32
- cmp r0, 0
- beq _080022E2
- b _0800243E
-_080022E2:
- ldr r0, [sp, 0x4]
- bl IsTileMapOutsideWram
- cmp r0, 0
- beq _080022EE
- b _0800243E
-_080022EE:
- ldr r0, [sp, 0x4]
- movs r1, 0x4
- bl GetBgControlAttribute
- lsls r0, 16
- lsrs r0, 16
- str r0, [sp, 0x30]
- ldr r0, [sp, 0x4]
- movs r1, 0x1
- bl GetBgMetricTextMode
- lsls r0, 21
- lsrs r0, 16
- str r0, [sp, 0x28]
- ldr r0, [sp, 0x4]
- movs r1, 0x2
- bl GetBgMetricTextMode
- lsls r0, 21
- lsrs r0, 16
- str r0, [sp, 0x2C]
- ldr r0, [sp, 0x4]
- bl GetBgType
- cmp r0, 0
- beq _08002328
- cmp r0, 0x1
- beq _080023C4
- b _0800243E
-_08002328:
- ldr r1, [sp, 0x10]
- adds r0, r1, 0
- muls r0, r7
- ldr r2, [sp, 0xC]
- adds r0, r2
- lsls r0, 1
- ldr r1, [sp, 0x8]
- adds r6, r1, r0
- adds r0, r5, r4
- cmp r5, r0
- blt _08002340
- b _0800243E
-_08002340:
- ldr r2, [sp, 0x18]
- subs r2, r7, r2
- str r2, [sp, 0x34]
- str r0, [sp, 0x38]
-_08002348:
- ldr r4, [sp, 0x14]
- ldr r7, [sp, 0x18]
- adds r0, r4, r7
- adds r1, r5, 0x1
- str r1, [sp, 0x3C]
- cmp r4, r0
- bge _080023AA
- ldr r2, [sp, 0x4]
- lsls r0, r2, 4
- ldr r1, _080023C0 @ =gUnknown_30008EC
- adds r0, r1
- mov r10, r0
- ldr r7, [sp, 0x20]
- lsls r7, 16
- mov r9, r7
- ldr r1, [sp, 0x24]
- lsls r0, r1, 16
- asrs r0, 16
- mov r8, r0
-_0800236E:
- ldr r2, [sp, 0x2C]
- str r2, [sp]
- adds r0, r4, 0
- adds r1, r5, 0
- ldr r2, [sp, 0x30]
- ldr r3, [sp, 0x28]
- bl GetTileMapIndexFromCoords
- lsls r0, 16
- lsrs r0, 15
- mov r7, r10
- ldr r1, [r7]
- adds r1, r0
- mov r0, r8
- str r0, [sp]
- adds r0, r6, 0
- ldr r2, [sp, 0x1C]
- mov r7, r9
- asrs r3, r7, 16
- bl CopyTileMapEntry
- adds r6, 0x2
- adds r0, r4, 0x1
- lsls r0, 16
- lsrs r4, r0, 16
- ldr r1, [sp, 0x14]
- ldr r2, [sp, 0x18]
- adds r0, r1, r2
- cmp r4, r0
- blt _0800236E
-_080023AA:
- ldr r5, [sp, 0x34]
- lsls r0, r5, 1
- adds r6, r0
- ldr r7, [sp, 0x3C]
- lsls r0, r7, 16
- lsrs r5, r0, 16
- ldr r0, [sp, 0x38]
- cmp r5, r0
- blt _08002348
- b _0800243E
- .align 2, 0
-_080023C0: .4byte gUnknown_30008EC
-_080023C4:
- ldr r1, [sp, 0x10]
- adds r0, r1, 0
- muls r0, r7
- ldr r2, [sp, 0xC]
- adds r0, r2
- ldr r1, [sp, 0x8]
- adds r6, r1, r0
- ldr r0, [sp, 0x4]
- movs r1, 0x1
- bl GetBgMetricAffineMode
- lsls r0, 16
- lsrs r0, 16
- mov r9, r0
- adds r0, r5, r4
- cmp r5, r0
- bge _0800243E
- ldr r2, [sp, 0x18]
- subs r2, r7, r2
- str r2, [sp, 0x34]
- str r0, [sp, 0x38]
- ldr r7, _08002450 @ =gUnknown_30008EC
- mov r10, r7
- ldr r0, [sp, 0x4]
- lsls r0, 4
- mov r8, r0
-_080023F8:
- ldr r4, [sp, 0x14]
- ldr r1, [sp, 0x18]
- adds r0, r4, r1
- adds r2, r5, 0x1
- str r2, [sp, 0x3C]
- cmp r4, r0
- bge _0800242E
- mov r3, r8
- add r3, r10
- mov r7, r9
- muls r7, r5
- mov r12, r7
- adds r2, r0, 0
-_08002412:
- ldr r1, [r3]
- mov r5, r12
- adds r0, r5, r4
- adds r1, r0
- ldrb r0, [r6]
- ldr r7, [sp, 0x20]
- adds r0, r7
- strb r0, [r1]
- adds r6, 0x1
- adds r0, r4, 0x1
- lsls r0, 16
- lsrs r4, r0, 16
- cmp r4, r2
- blt _08002412
-_0800242E:
- ldr r0, [sp, 0x34]
- adds r6, r0
- ldr r1, [sp, 0x3C]
- lsls r0, r1, 16
- lsrs r5, r0, 16
- ldr r2, [sp, 0x38]
- cmp r5, r2
- blt _080023F8
-_0800243E:
- add sp, 0x40
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08002450: .4byte gUnknown_30008EC
- thumb_func_end CopyRectToBgTilemapBufferRect
-
- thumb_func_start FillBgTilemapBufferRect_Palette0
-FillBgTilemapBufferRect_Palette0: @ 8002454
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x4
- ldr r4, [sp, 0x24]
- ldr r5, [sp, 0x28]
- lsls r0, 24
- lsrs r6, r0, 24
- lsls r1, 16
- lsrs r1, 16
- mov r8, r1
- lsls r2, 24
- lsrs r2, 24
- mov r10, r2
- lsls r3, 24
- lsrs r7, r3, 24
- lsls r4, 24
- lsrs r4, 24
- mov r9, r4
- lsls r5, 24
- lsrs r5, 24
- adds r0, r6, 0
- bl IsInvalidBg32
- cmp r0, 0
- bne _08002540
- adds r0, r6, 0
- bl IsTileMapOutsideWram
- cmp r0, 0
- bne _08002540
- adds r0, r6, 0
- bl GetBgType
- cmp r0, 0
- beq _080024A6
- cmp r0, 0x1
- beq _080024F0
- b _08002540
-_080024A6:
- adds r3, r7, 0
- adds r5, r3, r5
- cmp r3, r5
- bge _08002540
- adds r7, r5, 0
- lsls r1, r6, 4
- ldr r0, _080024EC @ =gUnknown_30008EC
- adds r1, r0
- mov r12, r1
-_080024B8:
- mov r2, r10
- mov r1, r9
- adds r0, r2, r1
- adds r6, r3, 0x1
- cmp r2, r0
- bge _080024E0
- mov r5, r12
- ldr r4, [r5]
- lsls r3, 5
- adds r1, r0, 0
-_080024CC:
- adds r0, r3, r2
- lsls r0, 1
- adds r0, r4
- mov r5, r8
- strh r5, [r0]
- adds r0, r2, 0x1
- lsls r0, 16
- lsrs r2, r0, 16
- cmp r2, r1
- blt _080024CC
-_080024E0:
- lsls r0, r6, 16
- lsrs r3, r0, 16
- cmp r3, r7
- blt _080024B8
- b _08002540
- .align 2, 0
-_080024EC: .4byte gUnknown_30008EC
-_080024F0:
- adds r0, r6, 0
- movs r1, 0x1
- bl GetBgMetricAffineMode
- lsls r0, 16
- lsrs r0, 16
- str r0, [sp]
- adds r3, r7, 0
- adds r5, r3, r5
- cmp r3, r5
- bge _08002540
- adds r7, r5, 0
- lsls r6, 4
- mov r12, r6
-_0800250C:
- mov r2, r10
- mov r1, r9
- adds r0, r2, r1
- adds r6, r3, 0x1
- cmp r2, r0
- bge _08002538
- ldr r5, _08002550 @ =gUnknown_30008EC
- add r5, r12
- ldr r1, [sp]
- adds r4, r3, 0
- muls r4, r1
- adds r3, r0, 0
-_08002524:
- ldr r0, [r5]
- adds r1, r4, r2
- adds r0, r1
- mov r1, r8
- strb r1, [r0]
- adds r0, r2, 0x1
- lsls r0, 16
- lsrs r2, r0, 16
- cmp r2, r3
- blt _08002524
-_08002538:
- lsls r0, r6, 16
- lsrs r3, r0, 16
- cmp r3, r7
- blt _0800250C
-_08002540:
- add sp, 0x4
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08002550: .4byte gUnknown_30008EC
- thumb_func_end FillBgTilemapBufferRect_Palette0
-
- thumb_func_start FillBgTilemapBufferRect
-FillBgTilemapBufferRect: @ 8002554
- push {r4-r6,lr}
- sub sp, 0x10
- ldr r4, [sp, 0x20]
- ldr r5, [sp, 0x24]
- ldr r6, [sp, 0x28]
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 16
- lsrs r1, 16
- lsls r2, 24
- lsrs r2, 24
- lsls r3, 24
- lsrs r3, 24
- lsls r4, 24
- lsrs r4, 24
- lsls r5, 24
- lsrs r5, 24
- lsls r6, 24
- lsrs r6, 24
- str r4, [sp]
- str r5, [sp, 0x4]
- str r6, [sp, 0x8]
- movs r4, 0
- str r4, [sp, 0xC]
- bl WriteSequenceToBgTilemapBuffer
- add sp, 0x10
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end FillBgTilemapBufferRect
-
- thumb_func_start WriteSequenceToBgTilemapBuffer
-WriteSequenceToBgTilemapBuffer: @ 8002590
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x2C
- ldr r4, [sp, 0x4C]
- ldr r5, [sp, 0x50]
- ldr r6, [sp, 0x54]
- ldr r7, [sp, 0x58]
- mov r8, r7
- lsls r0, 24
- lsrs r0, 24
- mov r9, r0
- add r0, sp, 0x4
- strh r1, [r0]
- lsls r2, 24
- lsrs r2, 24
- str r2, [sp, 0x8]
- lsls r3, 24
- lsrs r7, r3, 24
- lsls r4, 24
- lsrs r4, 24
- mov r10, r4
- lsls r5, 24
- lsrs r4, r5, 24
- lsls r6, 24
- lsrs r6, 24
- str r6, [sp, 0xC]
- mov r0, r8
- lsls r0, 16
- lsrs r0, 16
- str r0, [sp, 0x10]
- mov r0, r9
- bl IsInvalidBg32
- cmp r0, 0
- beq _080025DE
- b _08002724
-_080025DE:
- mov r0, r9
- bl IsTileMapOutsideWram
- cmp r0, 0
- beq _080025EA
- b _08002724
-_080025EA:
- mov r0, r9
- movs r1, 0x4
- bl GetBgControlAttribute
- lsls r0, 16
- lsrs r0, 16
- str r0, [sp, 0x1C]
- mov r0, r9
- movs r1, 0x1
- bl GetBgMetricTextMode
- lsls r0, 21
- lsrs r0, 16
- str r0, [sp, 0x14]
- mov r0, r9
- movs r1, 0x2
- bl GetBgMetricTextMode
- lsls r0, 21
- lsrs r0, 16
- str r0, [sp, 0x18]
- mov r0, r9
- bl GetBgType
- cmp r0, 0
- beq _08002624
- cmp r0, 0x1
- beq _080026AC
- b _08002724
-_08002624:
- adds r5, r7, 0
- adds r0, r5, r4
- cmp r5, r0
- bge _08002724
- str r0, [sp, 0x24]
- add r7, sp, 0x4
-_08002630:
- ldr r4, [sp, 0x8]
- mov r1, r10
- adds r0, r4, r1
- adds r2, r5, 0x1
- mov r8, r2
- cmp r4, r0
- bge _08002694
- mov r3, r9
- lsls r1, r3, 4
- ldr r0, _080026A4 @ =gUnknown_30008EC
- adds r6, r1, r0
-_08002646:
- ldr r0, [sp, 0x18]
- str r0, [sp]
- adds r0, r4, 0
- adds r1, r5, 0
- ldr r2, [sp, 0x1C]
- ldr r3, [sp, 0x14]
- bl GetTileMapIndexFromCoords
- lsls r0, 16
- lsrs r0, 15
- ldr r1, [r6]
- adds r1, r0
- movs r0, 0
- str r0, [sp]
- add r0, sp, 0x4
- ldr r2, [sp, 0xC]
- movs r3, 0
- bl CopyTileMapEntry
- ldrh r0, [r7]
- movs r2, 0xFC
- lsls r2, 8
- adds r1, r2, 0
- adds r2, r0, 0
- ands r2, r1
- ldr r3, [sp, 0x10]
- adds r0, r3
- ldr r3, _080026A8 @ =0x000003ff
- adds r1, r3, 0
- ands r0, r1
- adds r2, r0
- strh r2, [r7]
- adds r0, r4, 0x1
- lsls r0, 16
- lsrs r4, r0, 16
- ldr r0, [sp, 0x8]
- add r0, r10
- cmp r4, r0
- blt _08002646
-_08002694:
- mov r1, r8
- lsls r0, r1, 16
- lsrs r5, r0, 16
- ldr r2, [sp, 0x24]
- cmp r5, r2
- blt _08002630
- b _08002724
- .align 2, 0
-_080026A4: .4byte gUnknown_30008EC
-_080026A8: .4byte 0x000003ff
-_080026AC:
- mov r0, r9
- movs r1, 0x1
- bl GetBgMetricAffineMode
- lsls r0, 16
- lsrs r0, 16
- str r0, [sp, 0x20]
- adds r5, r7, 0
- adds r0, r5, r4
- cmp r5, r0
- bge _08002724
- str r0, [sp, 0x24]
- mov r3, r9
- lsls r3, 4
- mov r12, r3
-_080026CA:
- ldr r4, [sp, 0x8]
- mov r7, r10
- adds r0, r4, r7
- adds r1, r5, 0x1
- mov r8, r1
- cmp r4, r0
- bge _08002718
- ldr r2, _08002734 @ =gUnknown_30008EC
- add r2, r12
- str r2, [sp, 0x28]
- ldr r7, [sp, 0x20]
- adds r3, r5, 0
- muls r3, r7
- add r2, sp, 0x4
- movs r1, 0xFC
- lsls r1, 8
- mov r9, r1
- ldr r7, _08002738 @ =0x000003ff
- adds r5, r7, 0
- adds r6, r0, 0
-_080026F2:
- ldr r0, [sp, 0x28]
- ldr r1, [r0]
- adds r0, r3, r4
- adds r1, r0
- ldrh r0, [r2]
- strb r0, [r1]
- ldrh r0, [r2]
- mov r1, r9
- ands r1, r0
- ldr r7, [sp, 0x10]
- adds r0, r7
- ands r0, r5
- adds r1, r0
- strh r1, [r2]
- adds r0, r4, 0x1
- lsls r0, 16
- lsrs r4, r0, 16
- cmp r4, r6
- blt _080026F2
-_08002718:
- mov r1, r8
- lsls r0, r1, 16
- lsrs r5, r0, 16
- ldr r2, [sp, 0x24]
- cmp r5, r2
- blt _080026CA
-_08002724:
- add sp, 0x2C
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08002734: .4byte gUnknown_30008EC
-_08002738: .4byte 0x000003ff
- thumb_func_end WriteSequenceToBgTilemapBuffer
-
- thumb_func_start GetBgMetricTextMode
-GetBgMetricTextMode: @ 800273C
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- lsrs r4, r1, 24
- adds r5, r4, 0
- movs r1, 0x4
- bl GetBgControlAttribute
- lsls r0, 24
- lsrs r0, 24
- cmp r4, 0x1
- beq _0800277C
- cmp r4, 0x1
- bgt _08002760
- cmp r4, 0
- beq _08002766
- b _080027A2
-_08002760:
- cmp r5, 0x2
- beq _0800278E
- b _080027A2
-_08002766:
- cmp r0, 0x2
- bgt _08002774
- cmp r0, 0x1
- bge _0800279E
-_0800276E:
- cmp r0, 0
- beq _08002796
- b _080027A2
-_08002774:
- cmp r0, 0x3
- bne _080027A2
- movs r0, 0x4
- b _080027A4
-_0800277C:
- cmp r0, 0x1
- beq _0800279E
- cmp r0, 0x1
- ble _0800276E
- cmp r0, 0x2
- beq _08002796
- cmp r0, 0x3
- bne _080027A2
- b _0800279E
-_0800278E:
- cmp r0, 0
- blt _080027A2
- cmp r0, 0x1
- bgt _0800279A
-_08002796:
- movs r0, 0x1
- b _080027A4
-_0800279A:
- cmp r0, 0x3
- bgt _080027A2
-_0800279E:
- movs r0, 0x2
- b _080027A4
-_080027A2:
- movs r0, 0
-_080027A4:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end GetBgMetricTextMode
-
- thumb_func_start GetBgMetricAffineMode
-GetBgMetricAffineMode: @ 80027AC
- push {r4,lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- lsrs r4, r1, 24
- movs r1, 0x4
- bl GetBgControlAttribute
- lsls r0, 24
- lsrs r1, r0, 24
- adds r0, r1, 0
- cmp r4, 0
- beq _080027D4
- cmp r4, 0
- blt _080027FC
- cmp r4, 0x2
- bgt _080027FC
- movs r0, 0x10
- lsls r0, r1
- b _080027FE
-_080027D4:
- cmp r1, 0x1
- beq _080027F0
- cmp r1, 0x1
- bgt _080027E2
- cmp r1, 0
- beq _080027EC
- b _080027FC
-_080027E2:
- cmp r0, 0x2
- beq _080027F4
- cmp r0, 0x3
- beq _080027F8
- b _080027FC
-_080027EC:
- movs r0, 0x1
- b _080027FE
-_080027F0:
- movs r0, 0x4
- b _080027FE
-_080027F4:
- movs r0, 0x10
- b _080027FE
-_080027F8:
- movs r0, 0x40
- b _080027FE
-_080027FC:
- movs r0, 0
-_080027FE:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end GetBgMetricAffineMode
-
- thumb_func_start GetTileMapIndexFromCoords
-GetTileMapIndexFromCoords: @ 8002804
- push {r4,lr}
- adds r4, r0, 0
- ldr r0, [sp, 0x8]
- subs r3, 0x1
- ands r4, r3
- subs r0, 0x1
- ands r1, r0
- cmp r2, 0x1
- beq _08002828
- cmp r2, 0x1
- ble _08002830
- cmp r2, 0x2
- beq _08002830
- cmp r2, 0x3
- bne _08002830
- cmp r1, 0x1F
- ble _08002828
- adds r1, 0x20
-_08002828:
- cmp r4, 0x1F
- ble _08002830
- subs r4, 0x20
- adds r1, 0x20
-_08002830:
- lsls r0, r1, 5
- adds r0, r4
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end GetTileMapIndexFromCoords
-
- thumb_func_start CopyTileMapEntry
-CopyTileMapEntry: @ 800283C
- push {r4-r6,lr}
- adds r4, r0, 0
- adds r6, r1, 0
- ldr r5, [sp, 0x10]
- cmp r2, 0x10
- beq _08002864
- cmp r2, 0x10
- bgt _08002884
- cmp r2, 0
- blt _08002884
- ldrh r0, [r4]
- adds r0, r3
- ldr r3, _08002860 @ =0x00000fff
- adds r1, r3, 0
- ands r0, r1
- adds r1, r2, r5
- lsls r1, 12
- b _0800288A
- .align 2, 0
-_08002860: .4byte 0x00000fff
-_08002864:
- ldrh r1, [r6]
- movs r0, 0xFC
- lsls r0, 8
- ands r1, r0
- lsls r2, r5, 12
- adds r2, r1, r2
- ldrh r0, [r4]
- adds r0, r3
- ldr r3, _08002880 @ =0x000003ff
- adds r1, r3, 0
- ands r0, r1
- orrs r0, r2
- b _0800288C
- .align 2, 0
-_08002880: .4byte 0x000003ff
-_08002884:
- ldrh r0, [r4]
- adds r0, r3
- lsls r1, r5, 12
-_0800288A:
- adds r0, r1
-_0800288C:
- lsls r0, 16
- lsrs r1, r0, 16
- strh r1, [r6]
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end CopyTileMapEntry
-
- thumb_func_start GetBgType
-GetBgType: @ 8002898
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- adds r5, r4, 0
- bl GetBgMode
- lsls r0, 24
- lsrs r0, 24
- cmp r4, 0x2
- beq _080028C6
- cmp r4, 0x2
- ble _080028B6
- cmp r4, 0x3
- beq _080028D6
- b _080028DE
-_080028B6:
- cmp r5, 0
- blt _080028DE
- cmp r0, 0x1
- bgt _080028DE
- cmp r0, 0
- blt _080028DE
-_080028C2:
- movs r0, 0
- b _080028E0
-_080028C6:
- cmp r0, 0
- beq _080028C2
- cmp r0, 0
- blt _080028DE
- cmp r0, 0x2
- bgt _080028DE
-_080028D2:
- movs r0, 0x1
- b _080028E0
-_080028D6:
- cmp r0, 0
- beq _080028C2
- cmp r0, 0x2
- beq _080028D2
-_080028DE:
- ldr r0, _080028E8 @ =0x0000ffff
-_080028E0:
- pop {r4,r5}
- pop {r1}
- bx r1
- .align 2, 0
-_080028E8: .4byte 0x0000ffff
- thumb_func_end GetBgType
-
- thumb_func_start IsInvalidBg32
-IsInvalidBg32: @ 80028EC
- push {lr}
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x3
- bhi _080028FA
- movs r0, 0
- b _080028FC
-_080028FA:
- movs r0, 0x1
-_080028FC:
- pop {r1}
- bx r1
- thumb_func_end IsInvalidBg32
-
- thumb_func_start IsTileMapOutsideWram
-IsTileMapOutsideWram: @ 8002900
- push {lr}
- lsls r0, 24
- ldr r1, _0800291C @ =gUnknown_30008E8
- lsrs r0, 20
- adds r1, 0x4
- adds r0, r1
- ldr r1, [r0]
- ldr r0, _08002920 @ =0x03008000
- cmp r1, r0
- bhi _08002924
- cmp r1, 0
- beq _08002924
- movs r0, 0
- b _08002926
- .align 2, 0
-_0800291C: .4byte gUnknown_30008E8
-_08002920: .4byte 0x03008000
-_08002924:
- movs r0, 0x1
-_08002926:
- pop {r1}
- bx r1
- thumb_func_end IsTileMapOutsideWram
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/asm/clear_save_data_screen.s b/asm/clear_save_data_screen.s
index 33e7e386b..132d88a25 100644
--- a/asm/clear_save_data_screen.s
+++ b/asm/clear_save_data_screen.s
@@ -407,11 +407,11 @@ _080F5846:
movs r1, 0
bl SetGpuReg
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _080F5944 @ =gUnknown_841EE64
movs r0, 0
movs r2, 0x1
- bl sub_8001658
+ bl InitBgsFromTemplates
movs r0, 0
movs r1, 0
movs r2, 0
diff --git a/asm/credits.s b/asm/credits.s
index 5a7cbd9c0..a2c55239a 100644
--- a/asm/credits.s
+++ b/asm/credits.s
@@ -1225,11 +1225,11 @@ _080F4374:
bl ResetSpriteData
bl ResetTasks
movs r0, 0x1
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _080F44A8 @ =gUnknown_840C5A4
movs r0, 0x1
movs r2, 0x3
- bl sub_8001658
+ bl InitBgsFromTemplates
movs r0, 0x80
lsls r0, 4
bl Alloc
@@ -1594,11 +1594,11 @@ _080F46A0:
bl ResetSpriteData
bl ResetTasks
movs r0, 0x1
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _080F4778 @ =gUnknown_840C5A4
movs r0, 0
movs r2, 0x1
- bl sub_8001658
+ bl InitBgsFromTemplates
movs r0, 0
movs r1, 0
movs r2, 0
diff --git a/asm/diploma.s b/asm/diploma.s
index 3994b228d..f2dfa0785 100644
--- a/asm/diploma.s
+++ b/asm/diploma.s
@@ -357,11 +357,11 @@ _080F4E66:
movs r1, 0
bl SetGpuReg
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _080F4F90 @ =gUnknown_8415A08
movs r0, 0
movs r2, 0x2
- bl sub_8001658
+ bl InitBgsFromTemplates
movs r0, 0
movs r1, 0
movs r2, 0
diff --git a/asm/egg_hatch.s b/asm/egg_hatch.s
index 94e977b3a..f39bc39de 100644
--- a/asm/egg_hatch.s
+++ b/asm/egg_hatch.s
@@ -579,11 +579,11 @@ _08047090:
strh r0, [r1]
bl reset_temp_tile_data_buffers
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _08047158 @ =gUnknown_826019C
movs r0, 0
movs r2, 0x2
- bl sub_8001658
+ bl InitBgsFromTemplates
movs r0, 0x1
movs r1, 0
movs r2, 0
diff --git a/asm/fame_checker.s b/asm/fame_checker.s
index e3559bcc1..68e2e1c49 100644
--- a/asm/fame_checker.s
+++ b/asm/fame_checker.s
@@ -122,11 +122,11 @@ _0812C456:
bl AllocZeroed
str r0, [r5]
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _0812C4BC @ =gUnknown_845FBF4
movs r0, 0
movs r2, 0x4
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r1, [r6]
movs r0, 0x3
bl SetBgTilemapBuffer
diff --git a/asm/hall_of_fame.s b/asm/hall_of_fame.s
index fc58fc678..0a9fbf98a 100644
--- a/asm/hall_of_fame.s
+++ b/asm/hall_of_fame.s
@@ -1407,7 +1407,7 @@ _080F28B6:
movs r0, 0x3
bl UnsetBgTilemapBuffer
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
adds r0, r6, 0
bl DestroyTask
ldr r4, _080F292C @ =gUnknown_203AB3C
@@ -2305,7 +2305,7 @@ sub_80F3030: @ 80F3030
movs r0, 0x3
bl UnsetBgTilemapBuffer
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
adds r0, r5, 0
bl DestroyTask
ldr r5, _080F309C @ =gUnknown_203AB3C
@@ -3095,11 +3095,11 @@ _080F36F4: .4byte gUnknown_840C258
sub_80F36F8: @ 80F36F8
push {r4,lr}
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _080F3764 @ =gUnknown_840C228
movs r0, 0
movs r2, 0x3
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r4, _080F3768 @ =gUnknown_203AB3C
ldr r1, [r4]
adds r1, 0x6
diff --git a/asm/hof_pc.s b/asm/hof_pc.s
index 554db8992..48085bbd8 100644
--- a/asm/hof_pc.s
+++ b/asm/hof_pc.s
@@ -18,7 +18,7 @@ sub_80CA53C: @ 80CA53C
bne _080CA564
bl FreeAllWindowBuffers
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
adds r0, r4, 0
bl DestroyTask
ldr r0, _080CA570 @ =sub_80F2978
diff --git a/asm/intro.s b/asm/intro.s
index 11e6128f0..cc3f1559d 100644
--- a/asm/intro.s
+++ b/asm/intro.s
@@ -420,11 +420,11 @@ _080EC8A0:
movs r1, 0
bl FillPalette
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _080EC940 @ =gUnknown_840BB80
movs r0, 0
movs r2, 0x2
- bl sub_8001658
+ bl InitBgsFromTemplates
b _080EC9B8
.align 2, 0
_080EC928: .4byte gMain
@@ -1137,7 +1137,7 @@ _080ECED8:
ldr r1, _080ECF54 @ =gUnknown_840BB88
movs r0, 0
movs r2, 0x2
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r1, _080ECF58 @ =gUnknown_84048EC
movs r0, 0
str r0, [sp]
@@ -1469,7 +1469,7 @@ _080ED1C4:
ldr r1, _080ED208 @ =gUnknown_840BB90
movs r0, 0
movs r2, 0x4
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r1, _080ED20C @ =gUnknown_8405414
movs r0, 0
str r0, [sp]
@@ -1841,7 +1841,7 @@ _080ED4E4:
ldr r1, _080ED590 @ =gUnknown_840BBA0
movs r0, 0
movs r2, 0x2
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r1, _080ED594 @ =gUnknown_8407470
str r4, [sp]
movs r0, 0x1
diff --git a/asm/item_menu.s b/asm/item_menu.s
index 241805a06..ce700b255 100644
--- a/asm/item_menu.s
+++ b/asm/item_menu.s
@@ -533,11 +533,11 @@ sub_81081D0: @ 81081D0
adds r2, r4, 0
bl memset
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _08108234 @ =gUnknown_8452CF4
movs r0, 0
movs r2, 0x2
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r1, [r5]
movs r0, 0x1
bl SetBgTilemapBuffer
diff --git a/asm/item_pc.s b/asm/item_pc.s
index e0c626933..3d02d0d69 100644
--- a/asm/item_pc.s
+++ b/asm/item_pc.s
@@ -402,11 +402,11 @@ sub_810D71C: @ 810D71C
adds r2, r4, 0
bl memset
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _0810D780 @ =gUnknown_8453F6C
movs r0, 0
movs r2, 0x2
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r1, [r5]
movs r0, 0x1
bl SetBgTilemapBuffer
diff --git a/asm/learn_move.s b/asm/learn_move.s
index 9f2629f6b..d726b3bf0 100644
--- a/asm/learn_move.s
+++ b/asm/learn_move.s
@@ -71,11 +71,11 @@ sub_80E469C: @ 80E469C
push {r4,r5,lr}
sub sp, 0xC
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _080E4774 @ =gUnknown_83FFA3C
movs r0, 0
movs r2, 0x2
- bl sub_8001658
+ bl InitBgsFromTemplates
bl reset_temp_tile_data_buffers
ldr r0, _080E4778 @ =gUnknown_83FFA44
bl InitWindows
diff --git a/asm/link.s b/asm/link.s
index 9d975387d..0dd52991a 100644
--- a/asm/link.s
+++ b/asm/link.s
@@ -3269,11 +3269,11 @@ _0800AD30:
ldr r0, _0800ADF8 @ =sub_800978C
bl SetVBlankCallback
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _0800ADFC @ =gUnknown_82345E8
movs r0, 0
movs r2, 0x2
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r4, _0800AE00 @ =gUnknown_2022860
movs r0, 0x80
lsls r0, 4
diff --git a/asm/link_rfu.s b/asm/link_rfu.s
index 3bb3ca1bd..0cf9e7529 100644
--- a/asm/link_rfu.s
+++ b/asm/link_rfu.s
@@ -6036,11 +6036,11 @@ _080FFFBC:
.4byte _081000B8
_080FFFD4:
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _08100028 @ =gUnknown_843F8A0
movs r0, 0
movs r2, 0x4
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r4, _0810002C @ =gUnknown_203ACEC
ldr r1, [r4]
movs r0, 0xB0
diff --git a/asm/link_rfu_3.s b/asm/link_rfu_3.s
index d194ed0dd..05e84a1cb 100644
--- a/asm/link_rfu_3.s
+++ b/asm/link_rfu_3.s
@@ -12930,11 +12930,11 @@ _0811C2C0:
bl FreeAllSpritePalettes
bl ResetTasks
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _0811C354 @ =gUnknown_8457194
movs r0, 0
movs r2, 0x1
- bl sub_8001658
+ bl InitBgsFromTemplates
bl reset_temp_tile_data_buffers
ldr r0, _0811C358 @ =gUnknown_8457198
bl InitWindows
diff --git a/asm/mail.s b/asm/mail.s
index 34fb68748..e00947a9b 100644
--- a/asm/mail.s
+++ b/asm/mail.s
@@ -274,11 +274,11 @@ _080BEDE6:
b _080BF0F4
_080BEE40:
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _080BEE6C @ =gUnknown_83EE998
movs r0, 0
movs r2, 0x3
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r4, _080BEE70 @ =gUnknown_20399C4
ldr r1, [r4]
adds r1, 0xFC
diff --git a/asm/main_menu.s b/asm/main_menu.s
index 32563db7e..cd3a008f9 100644
--- a/asm/main_menu.s
+++ b/asm/main_menu.s
@@ -119,11 +119,11 @@ sub_800C318: @ 800C318
bl FreeAllSpritePalettes
bl ResetPaletteFade
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _0800C4B4 @ =gUnknown_8234690
movs r0, 0
movs r2, 0x1
- bl sub_8001658
+ bl InitBgsFromTemplates
movs r0, 0
movs r1, 0
movs r2, 0
diff --git a/asm/map_preview_screen.s b/asm/map_preview_screen.s
index 3b493fb66..345118304 100644
--- a/asm/map_preview_screen.s
+++ b/asm/map_preview_screen.s
@@ -103,7 +103,7 @@ sub_80F8180: @ 80F8180
ldr r1, _080F8198 @ =gUnknown_843EBB0
movs r0, 0
movs r2, 0x1
- bl sub_8001658
+ bl InitBgsFromTemplates
movs r0, 0
bl ShowBg
pop {r0}
diff --git a/asm/mystery_gift_menu.s b/asm/mystery_gift_menu.s
index bfeea8b5a..34b6ed87d 100644
--- a/asm/mystery_gift_menu.s
+++ b/asm/mystery_gift_menu.s
@@ -66,11 +66,11 @@ _081420D6:
bl ResetTasks
bl remove_some_task
movs r0, 0x1
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _081421E0 @ =gUnknown_8466D60
movs r0, 0
movs r2, 0x4
- bl sub_8001658
+ bl InitBgsFromTemplates
movs r0, 0
movs r1, 0
movs r2, 0
diff --git a/asm/naming_screen.s b/asm/naming_screen.s
index 2457798b4..60c81ba86 100644
--- a/asm/naming_screen.s
+++ b/asm/naming_screen.s
@@ -364,11 +364,11 @@ _0809DBD6:
movs r1, 0
bl SetGpuReg
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _0809DD4C @ =gUnknown_83E2290
movs r0, 0
movs r2, 0x4
- bl sub_8001658
+ bl InitBgsFromTemplates
movs r0, 0
movs r1, 0
movs r2, 0
diff --git a/asm/oak_speech.s b/asm/oak_speech.s
index 97726705d..ef204e879 100644
--- a/asm/oak_speech.s
+++ b/asm/oak_speech.s
@@ -416,11 +416,11 @@ _0812EC44:
b _0812EE94
_0812EC8E:
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _0812ECF0 @ =gUnknown_8462E58
movs r0, 0x1
movs r2, 0x3
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r4, _0812ECF4 @ =gUnknown_203B108
ldr r1, [r4]
movs r0, 0xE1
@@ -4391,11 +4391,11 @@ _08130D10: .4byte 0x05000002
_08130D14: .4byte 0x810001ff
_08130D18:
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _08130D70 @ =gUnknown_8462E58
movs r0, 0x1
movs r2, 0x3
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r4, _08130D74 @ =gUnknown_203B108
ldr r1, [r4]
movs r0, 0xE1
diff --git a/asm/option_menu.s b/asm/option_menu.s
index 34768ce92..df5d187bc 100644
--- a/asm/option_menu.s
+++ b/asm/option_menu.s
@@ -309,11 +309,11 @@ _08088556:
movs r1, 0
bl SetGpuReg
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _08088678 @ =gUnknown_83CC2D8
movs r0, 0
movs r2, 0x3
- bl sub_8001658
+ bl InitBgsFromTemplates
movs r0, 0
movs r1, 0
movs r2, 0
diff --git a/asm/overworld.s b/asm/overworld.s
index 02b5e746f..f9422d297 100644
--- a/asm/overworld.s
+++ b/asm/overworld.s
@@ -3074,11 +3074,11 @@ sub_80562B0: @ 80562B0
bl MoveSaveBlocks_ResetHeap_
bl sub_8056E80
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _08056344 @ =gUnknown_826D320
movs r0, 0
movs r2, 0x4
- bl sub_8001658
+ bl InitBgsFromTemplates
movs r0, 0x1
movs r1, 0x5
movs r2, 0x1
@@ -3138,11 +3138,11 @@ sub_8056354: @ 8056354
mov r6, r8
push {r6}
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _080563E0 @ =gUnknown_826D320
movs r0, 0
movs r2, 0x4
- bl sub_8001658
+ bl InitBgsFromTemplates
movs r0, 0x1
movs r1, 0x5
movs r2, 0x1
diff --git a/asm/party_menu.s b/asm/party_menu.s
index 7ca4b3aa1..6bef97b0c 100644
--- a/asm/party_menu.s
+++ b/asm/party_menu.s
@@ -578,11 +578,11 @@ sub_811EECC: @ 811EECC
adds r2, r4, 0
bl memset
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _0811EF38 @ =gUnknown_8459EB8
movs r0, 0
movs r2, 0x3
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r1, [r5]
movs r0, 0x1
bl SetBgTilemapBuffer
diff --git a/asm/pokedex_screen.s b/asm/pokedex_screen.s
index d8114ea2b..77376e270 100644
--- a/asm/pokedex_screen.s
+++ b/asm/pokedex_screen.s
@@ -60,11 +60,11 @@ sub_810250C: @ 810250C
bl ResetTasks
bl remove_some_task
movs r0, 0x1
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _08102598 @ =gUnknown_8451EBC
movs r0, 0
movs r2, 0x4
- bl sub_8001658
+ bl InitBgsFromTemplates
movs r4, 0x80
lsls r4, 4
adds r0, r4, 0
diff --git a/asm/pokemon_special_anim.s b/asm/pokemon_special_anim.s
index b1aaa452e..ad42d068b 100644
--- a/asm/pokemon_special_anim.s
+++ b/asm/pokemon_special_anim.s
@@ -1563,11 +1563,11 @@ sub_811D184: @ 811D184
movs r1, 0
bl SetGpuReg
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _0811D270 @ =gUnknown_8459980
movs r0, 0
movs r2, 0x2
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r0, _0811D274 @ =gUnknown_8459988
bl InitWindows
movs r0, 0
diff --git a/asm/pokemon_storage_system.s b/asm/pokemon_storage_system.s
index 7eb81d847..7bc405b91 100644
--- a/asm/pokemon_storage_system.s
+++ b/asm/pokemon_storage_system.s
@@ -6717,7 +6717,7 @@ sub_808EFE4: @ 808EFE4
ldr r1, _0808F030 @ =gUnknown_83CEA50
movs r0, 0
movs r2, 0x4
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r1, _0808F034 @ =gUnknown_8E9C438
movs r0, 0
str r0, [sp]
diff --git a/asm/pokemon_summary_screen.s b/asm/pokemon_summary_screen.s
index f6e8dc3ad..28244b569 100644
--- a/asm/pokemon_summary_screen.s
+++ b/asm/pokemon_summary_screen.s
@@ -4645,11 +4645,11 @@ _08136BEA:
movs r1, 0
bl SetGpuReg
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _08136D40 @ =gUnknown_8463EFC
movs r0, 0
movs r2, 0x4
- bl sub_8001658
+ bl InitBgsFromTemplates
movs r0, 0
movs r1, 0
movs r2, 0
diff --git a/asm/region_map.s b/asm/region_map.s
index 4567e2bf7..fba9869de 100644
--- a/asm/region_map.s
+++ b/asm/region_map.s
@@ -1392,11 +1392,11 @@ _080C092A:
movs r1, 0
bl SetGpuReg
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _080C0A20 @ =gUnknown_83F1A50
movs r0, 0
movs r2, 0x4
- bl sub_8001658
+ bl InitBgsFromTemplates
movs r0, 0
movs r1, 0
movs r2, 0
diff --git a/asm/seagallop.s b/asm/seagallop.s
index 9e189c02e..ea7bd3536 100644
--- a/asm/seagallop.s
+++ b/asm/seagallop.s
@@ -65,11 +65,11 @@ _08146EEE:
bl AllocZeroed
str r0, [r4]
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _08146F1C @ =gUnknown_846AEF8
movs r0, 0
movs r2, 0x1
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r1, [r4]
movs r0, 0x3
bl SetBgTilemapBuffer
diff --git a/asm/shop.s b/asm/shop.s
index a99066578..a9e4ba047 100644
--- a/asm/shop.s
+++ b/asm/shop.s
@@ -644,11 +644,11 @@ _0809AFCA:
sub_809AFD0: @ 809AFD0
push {lr}
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _0809B070 @ =gUnknown_83DF0C4
movs r0, 0
movs r2, 0x4
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r0, _0809B074 @ =gUnknown_2039958
ldr r1, [r0]
movs r0, 0x1
diff --git a/asm/slot_machine.s b/asm/slot_machine.s
index 105e2850f..489ddeee4 100644
--- a/asm/slot_machine.s
+++ b/asm/slot_machine.s
@@ -3474,11 +3474,11 @@ _081411D0:
bl SetGpuReg
bl sub_80F6C14
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _081413A0 @ =gUnknown_8466B10
movs r0, 0
movs r2, 0x4
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r0, _081413A4 @ =gUnknown_8466B20
bl InitWindows
ldr r1, _081413A8 @ =0x0000205c
diff --git a/asm/start_menu.s b/asm/start_menu.s
index 081f0eebf..fc3dea0a9 100644
--- a/asm/start_menu.s
+++ b/asm/start_menu.s
@@ -1771,11 +1771,11 @@ _0806FB00:
b _0806FB64
_0806FB12:
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _0806FB34 @ =gUnknown_83A73B8
movs r0, 0
movs r2, 0x1
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r0, _0806FB38 @ =gUnknown_83A73BC
bl InitWindows
movs r0, 0
diff --git a/asm/teachy_tv.s b/asm/teachy_tv.s
index 9f250560e..9a6f9c115 100644
--- a/asm/teachy_tv.s
+++ b/asm/teachy_tv.s
@@ -239,11 +239,11 @@ sub_815AD88: @ 815AD88
push {r4,lr}
bl sub_80BF7C8
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _0815AE20 @ =gUnknown_84792E0
movs r0, 0
movs r2, 0x4
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r4, _0815AE24 @ =gUnknown_203F450
ldr r1, [r4]
adds r1, 0x4
diff --git a/asm/title_screen.s b/asm/title_screen.s
index 0151bcba6..4dc0c43da 100644
--- a/asm/title_screen.s
+++ b/asm/title_screen.s
@@ -79,11 +79,11 @@ _08078946:
str r0, [r1, 0x8]
ldr r0, [r1, 0x8]
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _080789E8 @ =gUnknown_83BFB74
movs r0, 0
movs r2, 0x4
- bl sub_8001658
+ bl InitBgsFromTemplates
movs r1, 0x82
lsls r1, 5
movs r0, 0
diff --git a/asm/tm_case.s b/asm/tm_case.s
index e727ee878..bf9163797 100644
--- a/asm/tm_case.s
+++ b/asm/tm_case.s
@@ -342,11 +342,11 @@ sub_8131AB8: @ 8131AB8
bl AllocZeroed
str r0, [r4]
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _08131B1C @ =gUnknown_8463134
movs r0, 0
movs r2, 0x3
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r1, [r4]
movs r0, 0x2
bl SetBgTilemapBuffer
diff --git a/asm/trade.s b/asm/trade.s
index 6ebaf9948..406bbc88f 100644
--- a/asm/trade.s
+++ b/asm/trade.s
@@ -30,11 +30,11 @@ sub_804C600: @ 804C600
movs r2, 0x14
bl LoadPalette
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _0804C704 @ =gUnknown_8261F1C
movs r0, 0
movs r2, 0x4
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r0, _0804C708 @ =gUnknown_2031DA8
ldr r1, [r0]
movs r0, 0x8F
@@ -7810,11 +7810,11 @@ sub_80504CC: @ 80504CC
movs r1, 0
bl SetGpuReg
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _080505B4 @ =gUnknown_826D1D4
movs r0, 0
movs r2, 0x4
- bl sub_8001658
+ bl InitBgsFromTemplates
movs r0, 0
movs r1, 0
movs r2, 0
diff --git a/asm/trainer_card.s b/asm/trainer_card.s
index 2cc358510..b60bba1a5 100644
--- a/asm/trainer_card.s
+++ b/asm/trainer_card.s
@@ -1594,11 +1594,11 @@ sub_8089D0C: @ 8089D0C
bl ResetSpriteData
bl ResetPaletteFade
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _08089D84 @ =gUnknown_83CD888
movs r0, 0
movs r2, 0x4
- bl sub_8001658
+ bl InitBgsFromTemplates
movs r0, 0
movs r1, 0
movs r2, 0
diff --git a/asm/union_room_chat.s b/asm/union_room_chat.s
index a9b2bd82d..f463953c4 100644
--- a/asm/union_room_chat.s
+++ b/asm/union_room_chat.s
@@ -2992,11 +2992,11 @@ sub_8129B14: @ 8129B14
cmp r0, 0
beq _08129B70
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _08129B68 @ =gUnknown_845AA84
movs r0, 0
movs r2, 0x4
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r0, _08129B6C @ =gUnknown_845AA94
bl InitWindows
bl reset_temp_tile_data_buffers
diff --git a/asm/unk_8147AA8.s b/asm/unk_8147AA8.s
index d0d6d3791..cd77e0c7d 100644
--- a/asm/unk_8147AA8.s
+++ b/asm/unk_8147AA8.s
@@ -4786,11 +4786,11 @@ _08149DEE:
b _08149F5A
_08149DF0:
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _08149EE8 @ =gUnknown_846D8D4
movs r0, 0
movs r2, 0x4
- bl sub_8001658
+ bl InitBgsFromTemplates
ldr r0, _08149EEC @ =gUnknown_846D8E4
bl InitWindows
bl sub_80F6C14
diff --git a/asm/unk_814D5C8.s b/asm/unk_814D5C8.s
index bbde70074..dc4f5ab52 100644
--- a/asm/unk_814D5C8.s
+++ b/asm/unk_814D5C8.s
@@ -75,11 +75,11 @@ _0814D660:
b _0814D878
_0814D66E:
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _0814D6F0 @ =gUnknown_846E3CC
movs r0, 0
movs r2, 0x4
- bl sub_8001658
+ bl InitBgsFromTemplates
movs r0, 0xE0
lsls r0, 1
adds r1, r5, r0
diff --git a/asm/unk_81507FC.s b/asm/unk_81507FC.s
index 381c4a092..a46ac1ef6 100644
--- a/asm/unk_81507FC.s
+++ b/asm/unk_81507FC.s
@@ -11239,11 +11239,11 @@ _08155EC6:
movs r1, 0
bl SetGpuReg
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _08155FD8 @ =gUnknown_847565C
movs r0, 0
movs r2, 0x4
- bl sub_8001658
+ bl InitBgsFromTemplates
movs r0, 0
movs r1, 0
movs r2, 0
diff --git a/asm/window.s b/asm/window.s
index aaf823c12..670b96cc0 100644
--- a/asm/window.s
+++ b/asm/window.s
@@ -69,7 +69,7 @@ _08003B88:
movs r2, 0
str r2, [sp, 0x4]
_08003B8E:
- ldr r0, _08003BC8 @ =gUnknown_3003D8C
+ ldr r0, _08003BC8 @ =gUnneededFireRedVariable
ldr r0, [r0]
cmp r0, 0x1
bne _08003BCC
@@ -80,7 +80,7 @@ _08003B8E:
adds r0, r7, 0
movs r1, 0
movs r3, 0
- bl sub_80014F0
+ bl DummiedOutFireRedLeafGreenTileAllocFunc
str r0, [sp]
movs r0, 0x1
negs r0, r0
@@ -95,7 +95,7 @@ _08003BB8: .4byte gUnknown_3003E40
_08003BBC: .4byte nullsub_6
_08003BC0: .4byte gUnknown_81EA144
_08003BC4: .4byte gUnknown_20204B4
-_08003BC8: .4byte gUnknown_3003D8C
+_08003BC8: .4byte gUnneededFireRedVariable
_08003BCC:
ldr r0, _08003C04 @ =gUnknown_3003E40
mov r9, r0
@@ -184,7 +184,7 @@ _08003C70:
ldr r1, [r6, 0x4]
str r0, [r2]
str r1, [r2, 0x4]
- ldr r0, _08003CDC @ =gUnknown_3003D8C
+ ldr r0, _08003CDC @ =gUnneededFireRedVariable
ldr r0, [r0]
cmp r0, 0x1
bne _08003CA6
@@ -198,7 +198,7 @@ _08003C70:
adds r0, r7, 0
ldr r1, [sp]
movs r3, 0x1
- bl sub_80014F0
+ bl DummiedOutFireRedLeafGreenTileAllocFunc
_08003CA6:
adds r6, 0x8
ldr r0, [sp, 0x4]
@@ -229,7 +229,7 @@ _08003CC8:
bx r1
.align 2, 0
_08003CD8: .4byte gUnknown_20204B4
-_08003CDC: .4byte gUnknown_3003D8C
+_08003CDC: .4byte gUnneededFireRedVariable
_08003CE0: .4byte gUnknown_3003E30
thumb_func_end InitWindows
@@ -267,7 +267,7 @@ _08003D14:
ldrb r7, [r0]
movs r1, 0
mov r9, r1
- ldr r0, _08003DD8 @ =gUnknown_3003D8C
+ ldr r0, _08003DD8 @ =gUnneededFireRedVariable
ldr r0, [r0]
cmp r0, 0x1
bne _08003D46
@@ -279,7 +279,7 @@ _08003D14:
adds r0, r7, 0
movs r1, 0
movs r3, 0
- bl sub_80014F0
+ bl DummiedOutFireRedLeafGreenTileAllocFunc
mov r9, r0
movs r0, 0x1
negs r0, r0
@@ -356,7 +356,7 @@ _08003DCE:
b _08003E24
.align 2, 0
_08003DD4: .4byte gUnknown_20204B4
-_08003DD8: .4byte gUnknown_3003D8C
+_08003DD8: .4byte gUnneededFireRedVariable
_08003DDC: .4byte gUnknown_3003E40
_08003DE0: .4byte 0x0000ffff
_08003DE4: .4byte nullsub_6
@@ -375,7 +375,7 @@ _08003DE8:
ldr r1, [r3, 0x4]
str r0, [r2]
str r1, [r2, 0x4]
- ldr r0, _08003E38 @ =gUnknown_3003D8C
+ ldr r0, _08003E38 @ =gUnneededFireRedVariable
ldr r0, [r0]
cmp r0, 0x1
bne _08003E22
@@ -388,7 +388,7 @@ _08003DE8:
adds r0, r7, 0
mov r1, r9
movs r3, 0x1
- bl sub_80014F0
+ bl DummiedOutFireRedLeafGreenTileAllocFunc
_08003E22:
adds r0, r6, 0
_08003E24:
@@ -402,7 +402,7 @@ _08003E24:
bx r1
.align 2, 0
_08003E34: .4byte gUnknown_20204B4
-_08003E38: .4byte gUnknown_3003D8C
+_08003E38: .4byte gUnneededFireRedVariable
thumb_func_end AddWindow
thumb_func_start RemoveWindow
@@ -417,7 +417,7 @@ RemoveWindow: @ 8003E3C
adds r4, r0, r1
ldrb r3, [r4]
adds r7, r3, 0
- ldr r0, _08003EBC @ =gUnknown_3003D8C
+ ldr r0, _08003EBC @ =gUnneededFireRedVariable
ldr r0, [r0]
cmp r0, 0x1
bne _08003E68
@@ -427,7 +427,7 @@ RemoveWindow: @ 8003E3C
muls r2, r0
adds r0, r3, 0
movs r3, 0x2
- bl sub_80014F0
+ bl DummiedOutFireRedLeafGreenTileAllocFunc
_08003E68:
ldr r0, _08003EC0 @ =gUnknown_81EA144
ldr r1, [r0, 0x4]
@@ -469,7 +469,7 @@ _08003EB0:
bx r0
.align 2, 0
_08003EB8: .4byte gUnknown_20204B4
-_08003EBC: .4byte gUnknown_3003D8C
+_08003EBC: .4byte gUnneededFireRedVariable
_08003EC0: .4byte gUnknown_81EA144
_08003EC4: .4byte gUnknown_3003E40
_08003EC8: .4byte nullsub_6
diff --git a/asm/wireless_communication_status_screen.s b/asm/wireless_communication_status_screen.s
index c6b667356..abac81dc1 100644
--- a/asm/wireless_communication_status_screen.s
+++ b/asm/wireless_communication_status_screen.s
@@ -57,11 +57,11 @@ sub_814F1E4: @ 814F1E4
movs r0, 0
bl SetVBlankCallback
movs r0, 0
- bl sub_8001618
+ bl ResetBgsAndClearDma3BusyFlags
ldr r1, _0814F30C @ =gUnknown_846FA74
movs r0, 0
movs r2, 0x2
- bl sub_8001658
+ bl InitBgsFromTemplates
movs r4, 0x80
lsls r4, 4
adds r0, r4, 0
diff --git a/common_syms/bg.txt b/common_syms/bg.txt
new file mode 100644
index 000000000..2495d1646
--- /dev/null
+++ b/common_syms/bg.txt
@@ -0,0 +1 @@
+gUnneededFireRedVariable
diff --git a/data/data.s b/data/data.s
index d98a49aca..bca0e3455 100644
--- a/data/data.s
+++ b/data/data.s
@@ -1,8 +1,5 @@
.section .rodata
-gUnknown_81E9F64:: @ 81E9F64
- .incbin "baserom.gba", 0x1E9F64, 0x4
-
gUnknown_81E9F68:: @ 81E9F68
.incbin "baserom.gba", 0x1E9F68, 0x38
diff --git a/include/bg.h b/include/bg.h
index 0c6b4ac26..8f1eb787f 100644
--- a/include/bg.h
+++ b/include/bg.h
@@ -43,7 +43,7 @@ u16 GetBgControlAttribute(u8 bg, u8 attributeId);
u8 LoadBgVram(u8 bg, const void *src, u16 size, u16 destOffset, u8 mode);
void SetTextModeAndHideBgs(void);
bool8 IsInvalidBg(u8 bg);
-int DummiedOutFireRedLeafGreenTileAllocFunc(int a1, int a2, int a3, int a4);
+int DummiedOutFireRedLeafGreenTileAllocFunc(int bg, int offset, int count, int mode);
void ResetBgsAndClearDma3BusyFlags(u32 leftoverFireRedLeafGreenVariable);
void InitBgsFromTemplates(u8 bgMode, const struct BgTemplate *templates, u8 numTemplates);
void InitBgFromTemplate(const struct BgTemplate *template);
diff --git a/include/gba/defines.h b/include/gba/defines.h
index 7fd429d9e..b3fce2bfc 100644
--- a/include/gba/defines.h
+++ b/include/gba/defines.h
@@ -15,6 +15,11 @@
#define INTR_CHECK (*(u16 *)0x3007FF8)
#define INTR_VECTOR (*(void **)0x3007FFC)
+#define EWRAM_START 0x02000000
+#define EWRAM_END (EWRAM_START + 0x40000)
+#define IWRAM_START 0x03000000
+#define IWRAM_END (IWRAM_START + 0x8000)
+
#define PLTT 0x5000000
#define PLTT_SIZE 0x400
@@ -29,9 +34,11 @@
#define BG_VRAM VRAM
#define BG_VRAM_SIZE 0x10000
-#define BG_CHAR_ADDR(n) (void *)(BG_VRAM + (0x4000 * (n)))
-#define BG_SCREEN_ADDR(n) (void *)(BG_VRAM + (0x800 * (n)))
-#define BG_TILE_ADDR(n) (void *)(BG_VRAM + (0x80 * (n)))
+#define BG_CHAR_SIZE 0x4000
+#define BG_SCREEN_SIZE 0x800
+#define BG_CHAR_ADDR(n) (void *)(BG_VRAM + (BG_CHAR_SIZE * (n)))
+#define BG_SCREEN_ADDR(n) (void *)(BG_VRAM + (BG_SCREEN_SIZE * (n)))
+#define BG_TILE_ADDR(n) (void *)(BG_VRAM + (0x80 * (n)))
// text-mode BG
#define OBJ_VRAM0 (void *)(VRAM + 0x10000)
@@ -44,6 +51,8 @@
#define OAM 0x7000000
#define OAM_SIZE 0x400
+#define ROM_HEADER_SIZE 0xC0
+
#define DISPLAY_WIDTH 240
#define DISPLAY_HEIGHT 160
diff --git a/ld_script.txt b/ld_script.txt
index 432b55a78..18af439bd 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -85,7 +85,7 @@ SECTIONS {
src/main.o(.text);
src/gpu_regs.o(.text);
src/dma3_manager.o(.text);
- asm/bg.o(.text);
+ src/bg.o(.text);
asm/malloc.o(.text);
asm/text_printer.o(.text);
asm/window.o(.text);
@@ -392,6 +392,7 @@ SECTIONS {
SUBALIGN(4)
{
src/main.o(.rodata);
+ src/bg.o(.rodata);
data/data.o(.rodata);
src/m4a_tables.o(.rodata);
data/sound_data.o(.rodata);
diff --git a/src/bg.c b/src/bg.c
new file mode 100644
index 000000000..86c95b953
--- /dev/null
+++ b/src/bg.c
@@ -0,0 +1,1707 @@
+#include "global.h"
+#include "bg.h"
+#include "dma3.h"
+#include "gpu_regs.h"
+
+#define DISPCNT_ALL_BG_AND_MODE_BITS (DISPCNT_BG_ALL_ON | 0x7)
+
+struct BgControl
+{
+ struct BgConfig {
+ u16 visible:1;
+ u16 unknown_1:1;
+ u16 screenSize:2;
+ u16 priority:2;
+ u16 mosaic:1;
+ u16 wraparound:1;
+
+ u16 charBaseIndex:2;
+ u16 mapBaseIndex:5;
+ u16 paletteMode:1;
+
+ u8 unknown_2;
+ u8 unknown_3;
+ } configs[4];
+
+ u16 bgVisibilityAndMode;
+};
+
+struct BgConfig2
+{
+ u32 baseTile:10;
+ u32 basePalette:4;
+ u32 unk_3:18;
+
+ void* tilemap;
+ u32 bg_x;
+ u32 bg_y;
+};
+
+static struct BgControl sGpuBgConfigs;
+static struct BgConfig2 sGpuBgConfigs2[4];
+static u32 sDmaBusyBitfield[4];
+static u8 gpu_tile_allocation_map_bg[0x100];
+
+u32 gUnneededFireRedVariable;
+
+static const struct BgConfig sZeroedBgControlStruct = { 0 };
+
+void ResetBgs(void)
+{
+ ResetBgControlStructs();
+ sGpuBgConfigs.bgVisibilityAndMode = 0;
+ SetTextModeAndHideBgs();
+}
+
+static void SetBgModeInternal(u8 bgMode)
+{
+ sGpuBgConfigs.bgVisibilityAndMode &= 0xFFF8;
+ sGpuBgConfigs.bgVisibilityAndMode |= bgMode;
+}
+
+u8 GetBgMode(void)
+{
+ return sGpuBgConfigs.bgVisibilityAndMode & 0x7;
+}
+
+void ResetBgControlStructs(void)
+{
+ struct BgConfig* bgConfigs = &sGpuBgConfigs.configs[0];
+ struct BgConfig zeroedConfig = sZeroedBgControlStruct;
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ bgConfigs[i] = zeroedConfig;
+ }
+}
+
+void Unused_ResetBgControlStruct(u8 bg)
+{
+ if (IsInvalidBg(bg) == FALSE)
+ {
+ sGpuBgConfigs.configs[bg] = sZeroedBgControlStruct;
+ }
+}
+
+void SetBgControlAttributes(u8 bg, u8 charBaseIndex, u8 mapBaseIndex, u8 screenSize, u8 paletteMode, u8 priority, u8 mosaic, u8 wraparound)
+{
+ if (IsInvalidBg(bg) == FALSE)
+ {
+ if (charBaseIndex != 0xFF)
+ {
+ sGpuBgConfigs.configs[bg].charBaseIndex = charBaseIndex & 0x3;
+ }
+
+ if (mapBaseIndex != 0xFF)
+ {
+ sGpuBgConfigs.configs[bg].mapBaseIndex = mapBaseIndex & 0x1F;
+ }
+
+ if (screenSize != 0xFF)
+ {
+ sGpuBgConfigs.configs[bg].screenSize = screenSize & 0x3;
+ }
+
+ if (paletteMode != 0xFF)
+ {
+ sGpuBgConfigs.configs[bg].paletteMode = paletteMode;
+ }
+
+ if (priority != 0xFF)
+ {
+ sGpuBgConfigs.configs[bg].priority = priority & 0x3;
+ }
+
+ if (mosaic != 0xFF)
+ {
+ sGpuBgConfigs.configs[bg].mosaic = mosaic & 0x1;
+ }
+
+ if (wraparound != 0xFF)
+ {
+ sGpuBgConfigs.configs[bg].wraparound = wraparound;
+ }
+
+ sGpuBgConfigs.configs[bg].unknown_2 = 0;
+ sGpuBgConfigs.configs[bg].unknown_3 = 0;
+
+ sGpuBgConfigs.configs[bg].visible = 1;
+ }
+}
+
+u16 GetBgControlAttribute(u8 bg, u8 attributeId)
+{
+ if (IsInvalidBg(bg) == FALSE && sGpuBgConfigs.configs[bg].visible != FALSE)
+ {
+ switch (attributeId)
+ {
+ case BG_CTRL_ATTR_VISIBLE:
+ return sGpuBgConfigs.configs[bg].visible;
+ case BG_CTRL_ATTR_CHARBASEINDEX:
+ return sGpuBgConfigs.configs[bg].charBaseIndex;
+ case BG_CTRL_ATTR_MAPBASEINDEX:
+ return sGpuBgConfigs.configs[bg].mapBaseIndex;
+ case BG_CTRL_ATTR_SCREENSIZE:
+ return sGpuBgConfigs.configs[bg].screenSize;
+ case BG_CTRL_ATTR_PALETTEMODE:
+ return sGpuBgConfigs.configs[bg].paletteMode;
+ case BG_CTRL_ATTR_PRIORITY:
+ return sGpuBgConfigs.configs[bg].priority;
+ case BG_CTRL_ATTR_MOSAIC:
+ return sGpuBgConfigs.configs[bg].mosaic;
+ case BG_CTRL_ATTR_WRAPAROUND:
+ return sGpuBgConfigs.configs[bg].wraparound;
+ }
+ }
+
+ return 0xFF;
+}
+
+u8 LoadBgVram(u8 bg, const void *src, u16 size, u16 destOffset, u8 mode)
+{
+ u16 offset;
+ s8 cursor;
+
+ if (IsInvalidBg(bg) == FALSE && sGpuBgConfigs.configs[bg].visible != FALSE)
+ {
+ switch (mode)
+ {
+ case 0x1:
+ offset = sGpuBgConfigs.configs[bg].charBaseIndex * BG_CHAR_SIZE;
+ break;
+ case 0x2:
+ offset = sGpuBgConfigs.configs[bg].mapBaseIndex * BG_SCREEN_SIZE;
+ break;
+ default:
+ cursor = -1;
+ goto end;
+ }
+
+ offset = destOffset + offset;
+
+ cursor = RequestDma3Copy(src, (void*)(offset + BG_VRAM), size, 0);
+
+ if (cursor == -1)
+ {
+ return -1;
+ }
+ }
+ else
+ {
+ return -1;
+ }
+
+end:
+ return cursor;
+}
+
+void ShowBgInternal(u8 bg)
+{
+ u16 value;
+ if (IsInvalidBg(bg) == FALSE && sGpuBgConfigs.configs[bg].visible != FALSE)
+ {
+ value = sGpuBgConfigs.configs[bg].priority |
+ (sGpuBgConfigs.configs[bg].charBaseIndex << 2) |
+ (sGpuBgConfigs.configs[bg].mosaic << 6) |
+ (sGpuBgConfigs.configs[bg].paletteMode << 7) |
+ (sGpuBgConfigs.configs[bg].mapBaseIndex << 8) |
+ (sGpuBgConfigs.configs[bg].wraparound << 13) |
+ (sGpuBgConfigs.configs[bg].screenSize << 14);
+
+ SetGpuReg((bg << 1) + 0x8, value);
+
+ sGpuBgConfigs.bgVisibilityAndMode |= 1 << (bg + 8);
+ sGpuBgConfigs.bgVisibilityAndMode &= DISPCNT_ALL_BG_AND_MODE_BITS;
+ }
+}
+
+static void HideBgInternal(u8 bg)
+{
+ if (IsInvalidBg(bg) == FALSE)
+ {
+ sGpuBgConfigs.bgVisibilityAndMode &= ~(1 << (bg + 8));
+ sGpuBgConfigs.bgVisibilityAndMode &= DISPCNT_ALL_BG_AND_MODE_BITS;
+ }
+}
+
+static void SyncBgVisibilityAndMode(void)
+{
+ SetGpuReg(0, (GetGpuReg(0) & ~DISPCNT_ALL_BG_AND_MODE_BITS) | sGpuBgConfigs.bgVisibilityAndMode);
+}
+
+void SetTextModeAndHideBgs(void)
+{
+ SetGpuReg(0, GetGpuReg(0) & ~DISPCNT_ALL_BG_AND_MODE_BITS);
+}
+
+static void SetBgAffineInternal(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispCenterX, s16 dispCenterY, s16 scaleX, s16 scaleY, u16 rotationAngle)
+{
+ struct BgAffineSrcData src;
+ struct BgAffineDstData dest;
+
+ switch (sGpuBgConfigs.bgVisibilityAndMode & 0x7)
+ {
+ case 1:
+ if (bg != 2)
+ return;
+ break;
+ case 2:
+ if (bg < 2 || bg > 3)
+ return;
+ break;
+ case 0:
+ default:
+ return;
+ }
+
+ src.texX = srcCenterX;
+ src.texY = srcCenterY;
+ src.scrX = dispCenterX;
+ src.scrY = dispCenterY;
+ src.sx = scaleX;
+ src.sy = scaleY;
+ src.alpha = rotationAngle;
+
+ BgAffineSet(&src, &dest, 1);
+
+ SetGpuReg(REG_OFFSET_BG2PA, dest.pa);
+ SetGpuReg(REG_OFFSET_BG2PB, dest.pb);
+ SetGpuReg(REG_OFFSET_BG2PC, dest.pc);
+ SetGpuReg(REG_OFFSET_BG2PD, dest.pd);
+ SetGpuReg(REG_OFFSET_BG2PA, dest.pa);
+ SetGpuReg(REG_OFFSET_BG2X_L, (s16)(dest.dx));
+ SetGpuReg(REG_OFFSET_BG2X_H, (s16)(dest.dx >> 16));
+ SetGpuReg(REG_OFFSET_BG2Y_L, (s16)(dest.dy));
+ SetGpuReg(REG_OFFSET_BG2Y_H, (s16)(dest.dy >> 16));
+}
+
+bool8 IsInvalidBg(u8 bg)
+{
+ if (bg > 3)
+ return TRUE;
+ return FALSE;
+}
+
+int DummiedOutFireRedLeafGreenTileAllocFunc(int bg, int offset, int count, int mode)
+{
+ int start, end;
+ int blockSize;
+ int blockStart;
+ int i;
+
+ switch (mode)
+ {
+ case 0:
+ start = GetBgControlAttribute(bg, BG_CTRL_ATTR_CHARBASEINDEX) * (BG_CHAR_SIZE / TILE_SIZE_4BPP);
+ end = start + 0x400;
+ if (end > 0x800)
+ end = 0x800;
+ blockSize = 0;
+ blockStart = 0;
+ for (i = start, offset = 0; i < end; i++, offset++)
+ {
+ if (!((gpu_tile_allocation_map_bg[i / 8] >> (i % 8)) & 1))
+ {
+ if (blockSize)
+ {
+ blockSize++;
+ if (blockSize == count)
+ return blockStart;
+ }
+ else
+ {
+ blockStart = offset;
+ blockSize = 1;
+ }
+ }
+ else
+ {
+ blockSize = 0;
+ }
+ }
+ return -1;
+ case 1:
+ start = GetBgControlAttribute(bg, BG_CTRL_ATTR_CHARBASEINDEX) * (BG_CHAR_SIZE / TILE_SIZE_4BPP) + offset;
+ end = start + count;
+ for (i = start; i < end; i++)
+ gpu_tile_allocation_map_bg[i / 8] |= 1 << (i % 8);
+ break;
+ case 2:
+ start = GetBgControlAttribute(bg, BG_CTRL_ATTR_CHARBASEINDEX) * (BG_CHAR_SIZE / TILE_SIZE_4BPP) + offset;
+ end = start + count;
+ for (i = start; i < end; i++)
+ gpu_tile_allocation_map_bg[i / 8] &= ~(1 << (i % 8));
+ break;
+ }
+
+ return 0;
+}
+
+void ResetBgsAndClearDma3BusyFlags(u32 leftoverFireRedLeafGreenVariable)
+{
+ int i;
+ ResetBgs();
+
+ for (i = 0; i < 4; i++)
+ {
+ sDmaBusyBitfield[i] = 0;
+ }
+
+ gUnneededFireRedVariable = leftoverFireRedLeafGreenVariable;
+
+ for (i = 0; i < 0x100; i++)
+ {
+ gpu_tile_allocation_map_bg[i] = 0;
+ }
+}
+
+#ifdef NONMATCHING
+void InitBgsFromTemplates(u8 bgMode, const struct BgTemplate *templates, u8 numTemplates)
+{
+ int i;
+ u8 bg;
+
+ SetBgModeInternal(bgMode);
+ ResetBgControlStructs();
+
+ for (i = 0; i < numTemplates; i++)
+ {
+ bg = templates[i].bg;
+ if (bg < 4) {
+ SetBgControlAttributes(bg,
+ templates[i].charBaseIndex,
+ templates[i].mapBaseIndex,
+ templates[i].screenSize,
+ templates[i].paletteMode,
+ templates[i].priority,
+ 0,
+ 0);
+
+ sGpuBgConfigs2[bg].baseTile = templates[i].baseTile;
+ sGpuBgConfigs2[bg].basePalette = 0;
+ sGpuBgConfigs2[bg].unk_3 = 0;
+
+ sGpuBgConfigs2[bg].tilemap = NULL;
+ sGpuBgConfigs2[bg].bg_x = 0;
+ sGpuBgConfigs2[bg].bg_y = 0;
+
+ gpu_tile_allocation_map_bg[(templates[i].charBaseIndex * (BG_CHAR_SIZE / TILE_SIZE_4BPP)) / 8] = 1;
+ }
+ }
+}
+#else
+__attribute__((naked))
+void InitBgsFromTemplates(u8 bgMode, const struct BgTemplate *templates, u8 numTemplates)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x10\n\
+ adds r5, r1, 0\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ lsls r2, 24\n\
+ lsrs r4, r2, 24\n\
+ bl SetBgModeInternal\n\
+ bl ResetBgControlStructs\n\
+ cmp r4, 0\n\
+ beq _08001712\n\
+ movs r7, 0\n\
+ ldr r0, _08001724 @ =sGpuBgConfigs2\n\
+ mov r9, r0\n\
+ adds r6, r5, 0\n\
+ ldr r2, _08001728 @ =gpu_tile_allocation_map_bg\n\
+ mov r10, r2\n\
+ mov r8, r4\n\
+_08001688:\n\
+ ldr r4, [r6]\n\
+ lsls r0, r4, 30\n\
+ lsrs r5, r0, 30\n\
+ cmp r5, 0x3\n\
+ bhi _08001704\n\
+ lsls r1, r4, 28\n\
+ lsrs r1, 30\n\
+ lsls r2, r4, 23\n\
+ lsrs r2, 27\n\
+ lsls r3, r4, 21\n\
+ lsrs r3, 30\n\
+ lsls r0, r4, 20\n\
+ lsrs r0, 31\n\
+ str r0, [sp]\n\
+ lsls r0, r4, 18\n\
+ lsrs r0, 30\n\
+ str r0, [sp, 0x4]\n\
+ str r7, [sp, 0x8]\n\
+ str r7, [sp, 0xC]\n\
+ adds r0, r5, 0\n\
+ bl SetBgControlAttributes\n\
+ lsls r4, r5, 4\n\
+ mov r5, r9\n\
+ adds r3, r4, r5\n\
+ ldr r2, [r6]\n\
+ lsls r2, 8\n\
+ lsrs r2, 22\n\
+ ldrh r0, [r3]\n\
+ ldr r5, _0800172C @ =0xfffffc00\n\
+ adds r1, r5, 0\n\
+ ands r0, r1\n\
+ orrs r0, r2\n\
+ strh r0, [r3]\n\
+ ldrb r0, [r3, 0x1]\n\
+ movs r2, 0x3D\n\
+ negs r2, r2\n\
+ adds r1, r2, 0\n\
+ ands r0, r1\n\
+ strb r0, [r3, 0x1]\n\
+ ldr r0, [r3]\n\
+ ldr r1, _08001730 @ =0x00003fff\n\
+ ands r0, r1\n\
+ str r0, [r3]\n\
+ mov r0, r9\n\
+ adds r0, 0x4\n\
+ adds r0, r4, r0\n\
+ str r7, [r0]\n\
+ mov r0, r9\n\
+ adds r0, 0x8\n\
+ adds r0, r4, r0\n\
+ str r7, [r0]\n\
+ ldr r5, _08001734 @ =sGpuBgConfigs2 + 0xC\n\
+ adds r4, r5\n\
+ str r7, [r4]\n\
+ ldr r0, [r6]\n\
+ lsls r0, 28\n\
+ lsrs r0, 30\n\
+ lsls r0, 6\n\
+ add r0, r10\n\
+ movs r1, 0x1\n\
+ strb r1, [r0]\n\
+_08001704:\n\
+ adds r6, 0x4\n\
+ movs r0, 0x1\n\
+ negs r0, r0\n\
+ add r8, r0\n\
+ mov r2, r8\n\
+ cmp r2, 0\n\
+ bne _08001688\n\
+_08001712:\n\
+ add sp, 0x10\n\
+ pop {r3-r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov r10, r5\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_08001724: .4byte sGpuBgConfigs2\n\
+_08001728: .4byte gpu_tile_allocation_map_bg\n\
+_0800172C: .4byte 0xfffffc00\n\
+_08001730: .4byte 0x00003fff\n\
+_08001734: .4byte sGpuBgConfigs2 + 0xC\n\
+.syntax divided");
+}
+#endif // NONMATCHING
+
+void InitBgFromTemplate(const struct BgTemplate *template)
+{
+ u8 bg = template->bg;
+
+ if (bg < 4)
+ {
+ SetBgControlAttributes(bg,
+ template->charBaseIndex,
+ template->mapBaseIndex,
+ template->screenSize,
+ template->paletteMode,
+ template->priority,
+ 0,
+ 0);
+
+ sGpuBgConfigs2[bg].baseTile = template->baseTile;
+ sGpuBgConfigs2[bg].basePalette = 0;
+ sGpuBgConfigs2[bg].unk_3 = 0;
+
+ sGpuBgConfigs2[bg].tilemap = NULL;
+ sGpuBgConfigs2[bg].bg_x = 0;
+ sGpuBgConfigs2[bg].bg_y = 0;
+
+ gpu_tile_allocation_map_bg[(template->charBaseIndex * (BG_CHAR_SIZE / TILE_SIZE_4BPP)) / 8] = 1;
+ }
+}
+
+u16 LoadBgTiles(u8 bg, const void* src, u16 size, u16 destOffset)
+{
+ u16 tileOffset;
+ u8 cursor;
+
+ if (GetBgControlAttribute(bg, BG_CTRL_ATTR_PALETTEMODE) == 0)
+ {
+ tileOffset = (sGpuBgConfigs2[bg].baseTile + destOffset) * 0x20;
+ }
+ else
+ {
+ tileOffset = (sGpuBgConfigs2[bg].baseTile + destOffset) * 0x40;
+ }
+
+ cursor = LoadBgVram(bg, src, size, tileOffset, DISPCNT_MODE_1);
+
+ if (cursor == 0xFF)
+ {
+ return -1;
+ }
+
+ sDmaBusyBitfield[cursor / 0x20] |= (1 << (cursor % 0x20));
+
+ if (gUnneededFireRedVariable == 1)
+ {
+ DummiedOutFireRedLeafGreenTileAllocFunc(bg, tileOffset / 0x20, size / 0x20, 1);
+ }
+
+ return cursor;
+}
+
+u16 LoadBgTilemap(u8 bg, const void *src, u16 size, u16 destOffset)
+{
+ u8 cursor;
+
+ cursor = LoadBgVram(bg, src, size, destOffset * 32, DISPCNT_MODE_2);
+
+ if (cursor == 0xFF)
+ {
+ return -1;
+ }
+
+ sDmaBusyBitfield[cursor / 0x20] |= (1 << (cursor % 0x20));
+
+ return cursor;
+}
+
+u16 Unused_LoadBgPalette(u8 bg, const void *src, u16 size, u16 destOffset)
+{
+ u16 paletteOffset;
+ s8 cursor;
+
+ if (IsInvalidBg32(bg) == FALSE)
+ {
+ paletteOffset = (sGpuBgConfigs2[bg].basePalette * 0x20) + (destOffset * 2);
+ cursor = RequestDma3Copy(src, (void*)(paletteOffset + BG_PLTT), size, 0);
+
+ if (cursor == -1)
+ {
+ return -1;
+ }
+ }
+ else
+ {
+ return -1;
+ }
+
+ sDmaBusyBitfield[cursor / 0x20] |= (1 << (cursor % 0x20));
+
+ return (u8)cursor;
+}
+
+#ifdef NONMATCHING // Matches everything but r5 and r6 are flipped, rrr
+bool8 IsDma3ManagerBusyWithBgCopy(void)
+{
+ u8 mod;
+ u8 div;
+ s8 reqSpace;
+
+ int i;
+
+ for (i = 0; i < 0x80; i++)
+ {
+ div = i / 0x20;
+ mod = i % 0x20;
+
+ if ((sDmaBusyBitfield[div] & (1 << mod)) != FALSE)
+ {
+ reqSpace = CheckForSpaceForDma3Request(i);
+ if (reqSpace == -1)
+ {
+ return TRUE;
+ }
+
+ sDmaBusyBitfield[div] &= ~(1 << mod);
+ }
+ }
+
+ return FALSE;
+}
+#else
+__attribute__((naked))
+bool8 IsDma3ManagerBusyWithBgCopy(void)
+{
+ asm("push {r4-r7,lr}\n\
+ mov r5, #0\n\
+ mov r7, #0x1\n\
+ neg r7, r7\n\
+_08001ADC:\n\
+ add r0, r5, #0\n\
+ cmp r5, #0\n\
+ bge _08001AE4\n\
+ add r0, #0x1F\n\
+_08001AE4:\n\
+ asr r0, #5\n\
+ lsl r2, r0, #24\n\
+ lsl r0, #5\n\
+ sub r0, r5, r0\n\
+ lsl r0, #24\n\
+ lsr r0, #24\n\
+ ldr r1, =sDmaBusyBitfield\n\
+ lsr r2, #22\n\
+ add r4, r2, r1\n\
+ mov r6, #0x1\n\
+ lsl r6, r0\n\
+ ldr r0, [r4]\n\
+ and r0, r6\n\
+ cmp r0, #0\n\
+ beq _08001B22\n\
+ lsl r0, r5, #16\n\
+ asr r0, #16\n\
+ bl CheckForSpaceForDma3Request\n\
+ lsl r0, #24\n\
+ asr r0, #24\n\
+ cmp r0, r7\n\
+ bne _08001B1C\n\
+ mov r0, #0x1\n\
+ b _08001B2A\n\
+ .pool\n\
+_08001B1C:\n\
+ ldr r0, [r4]\n\
+ bic r0, r6\n\
+ str r0, [r4]\n\
+_08001B22:\n\
+ add r5, #0x1\n\
+ cmp r5, #0x7F\n\
+ ble _08001ADC\n\
+ mov r0, #0\n\
+_08001B2A:\n\
+ pop {r4-r7}\n\
+ pop {r1}\n\
+ bx r1\n");
+}
+#endif // NONMATCHING
+
+void ShowBg(u8 bg)
+{
+ ShowBgInternal(bg);
+ SyncBgVisibilityAndMode();
+}
+
+void HideBg(u8 bg)
+{
+ HideBgInternal(bg);
+ SyncBgVisibilityAndMode();
+}
+
+void SetBgAttribute(u8 bg, u8 attributeId, u8 value)
+{
+ switch (attributeId)
+ {
+ case 1:
+ SetBgControlAttributes(bg, value, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF);
+ break;
+ case 2:
+ SetBgControlAttributes(bg, 0xFF, value, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF);
+ break;
+ case 3:
+ SetBgControlAttributes(bg, 0xFF, 0xFF, value, 0xFF, 0xFF, 0xFF, 0xFF);
+ break;
+ case 4:
+ SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, value, 0xFF, 0xFF, 0xFF);
+ break;
+ case 7:
+ SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, 0xFF, value, 0xFF, 0xFF);
+ break;
+ case 5:
+ SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, value, 0xFF);
+ break;
+ case 6:
+ SetBgControlAttributes(bg, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, value);
+ break;
+ }
+}
+
+u16 GetBgAttribute(u8 bg, u8 attributeId)
+{
+ switch (attributeId)
+ {
+ case 1:
+ return GetBgControlAttribute(bg, BG_CTRL_ATTR_CHARBASEINDEX);
+ case 2:
+ return GetBgControlAttribute(bg, BG_CTRL_ATTR_MAPBASEINDEX);
+ case 3:
+ return GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE);
+ case 4:
+ return GetBgControlAttribute(bg, BG_CTRL_ATTR_PALETTEMODE);
+ case 7:
+ return GetBgControlAttribute(bg, BG_CTRL_ATTR_PRIORITY);
+ case 5:
+ return GetBgControlAttribute(bg, BG_CTRL_ATTR_MOSAIC);
+ case 6:
+ return GetBgControlAttribute(bg, BG_CTRL_ATTR_WRAPAROUND);
+ case 8:
+ switch (GetBgType(bg))
+ {
+ case 0:
+ return GetBgMetricTextMode(bg, 0) * 0x800;
+ case 1:
+ return GetBgMetricAffineMode(bg, 0) * 0x100;
+ default:
+ return 0;
+ }
+ case 9:
+ return GetBgType(bg);
+ case 10:
+ return sGpuBgConfigs2[bg].baseTile;
+ default:
+ return -1;
+ }
+}
+
+u32 ChangeBgX(u8 bg, u32 value, u8 op)
+{
+ u8 mode;
+ u16 temp1;
+ u16 temp2;
+
+ if (IsInvalidBg32(bg) != FALSE || GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0)
+ {
+ return -1;
+ }
+
+ switch (op)
+ {
+ case 0:
+ default:
+ sGpuBgConfigs2[bg].bg_x = value;
+ break;
+ case 1:
+ sGpuBgConfigs2[bg].bg_x += value;
+ break;
+ case 2:
+ sGpuBgConfigs2[bg].bg_x -= value;
+ break;
+ }
+
+ mode = GetBgMode();
+
+ switch (bg)
+ {
+ case 0:
+ temp1 = sGpuBgConfigs2[0].bg_x >> 0x8;
+ SetGpuReg(REG_OFFSET_BG0HOFS, temp1);
+ break;
+ case 1:
+ temp1 = sGpuBgConfigs2[1].bg_x >> 0x8;
+ SetGpuReg(REG_OFFSET_BG1HOFS, temp1);
+ break;
+ case 2:
+ if (mode == 0)
+ {
+ temp1 = sGpuBgConfigs2[2].bg_x >> 0x8;
+ SetGpuReg(REG_OFFSET_BG2HOFS, temp1);
+ }
+ else
+ {
+ temp1 = sGpuBgConfigs2[2].bg_x >> 0x10;
+ temp2 = sGpuBgConfigs2[2].bg_x & 0xFFFF;
+ SetGpuReg(REG_OFFSET_BG2X_H, temp1);
+ SetGpuReg(REG_OFFSET_BG2X_L, temp2);
+ }
+ break;
+ case 3:
+ if (mode == 0)
+ {
+ temp1 = sGpuBgConfigs2[3].bg_x >> 0x8;
+ SetGpuReg(REG_OFFSET_BG3HOFS, temp1);
+ }
+ else if (mode == 2)
+ {
+ temp1 = sGpuBgConfigs2[3].bg_x >> 0x10;
+ temp2 = sGpuBgConfigs2[3].bg_x & 0xFFFF;
+ SetGpuReg(REG_OFFSET_BG3X_H, temp1);
+ SetGpuReg(REG_OFFSET_BG3X_L, temp2);
+ }
+ break;
+ }
+
+ return sGpuBgConfigs2[bg].bg_x;
+}
+
+u32 GetBgX(u8 bg)
+{
+ if (IsInvalidBg32(bg) != FALSE)
+ return -1;
+ if (GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0)
+ return -1;
+ return sGpuBgConfigs2[bg].bg_x;
+}
+
+u32 ChangeBgY(u8 bg, u32 value, u8 op)
+{
+ u8 mode;
+ u16 temp1;
+ u16 temp2;
+
+ if (IsInvalidBg32(bg) != FALSE || GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0)
+ {
+ return -1;
+ }
+
+ switch (op)
+ {
+ case 0:
+ default:
+ sGpuBgConfigs2[bg].bg_y = value;
+ break;
+ case 1:
+ sGpuBgConfigs2[bg].bg_y += value;
+ break;
+ case 2:
+ sGpuBgConfigs2[bg].bg_y -= value;
+ break;
+ }
+
+ mode = GetBgMode();
+
+ switch (bg)
+ {
+ case 0:
+ temp1 = sGpuBgConfigs2[0].bg_y >> 0x8;
+ SetGpuReg(REG_OFFSET_BG0VOFS, temp1);
+ break;
+ case 1:
+ temp1 = sGpuBgConfigs2[1].bg_y >> 0x8;
+ SetGpuReg(REG_OFFSET_BG1VOFS, temp1);
+ break;
+ case 2:
+ if (mode == 0)
+ {
+ temp1 = sGpuBgConfigs2[2].bg_y >> 0x8;
+ SetGpuReg(REG_OFFSET_BG2VOFS, temp1);
+ }
+ else
+ {
+ temp1 = sGpuBgConfigs2[2].bg_y >> 0x10;
+ temp2 = sGpuBgConfigs2[2].bg_y & 0xFFFF;
+ SetGpuReg(REG_OFFSET_BG2Y_H, temp1);
+ SetGpuReg(REG_OFFSET_BG2Y_L, temp2);
+ }
+ break;
+ case 3:
+ if (mode == 0)
+ {
+ temp1 = sGpuBgConfigs2[3].bg_y >> 0x8;
+ SetGpuReg(REG_OFFSET_BG3VOFS, temp1);
+ }
+ else if (mode == 2)
+ {
+ temp1 = sGpuBgConfigs2[3].bg_y >> 0x10;
+ temp2 = sGpuBgConfigs2[3].bg_y & 0xFFFF;
+ SetGpuReg(REG_OFFSET_BG3Y_H, temp1);
+ SetGpuReg(REG_OFFSET_BG3Y_L, temp2);
+ }
+ break;
+ }
+
+ return sGpuBgConfigs2[bg].bg_y;
+}
+
+u32 GetBgY(u8 bg)
+{
+ if (IsInvalidBg32(bg) != FALSE)
+ return -1;
+ if (GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0)
+ return -1;
+ return sGpuBgConfigs2[bg].bg_y;
+}
+
+void SetBgAffine(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispCenterX, s16 dispCenterY, s16 scaleX, s16 scaleY, u16 rotationAngle)
+{
+ SetBgAffineInternal(bg, srcCenterX, srcCenterY, dispCenterX, dispCenterY, scaleX, scaleY, rotationAngle);
+}
+
+u8 Unused_AdjustBgMosaic(u8 a1, u8 a2)
+{
+ u16 result;
+ s16 test1;
+ s16 test2;
+
+ result = GetGpuReg(REG_OFFSET_MOSAIC);
+
+ test1 = result & 0xF;
+ test2 = (result >> 4) & 0xF;
+ result &= 0xFF00;
+
+ switch (a2)
+ {
+ case 0:
+ default:
+ test1 = a1 & 0xF;
+ test2 = a1 >> 0x4;
+ break;
+ case 1:
+ test1 = a1 & 0xF;
+ break;
+ case 2:
+ if ((test1 + a1) > 0xF)
+ {
+ test1 = 0xF;
+ }
+ else
+ {
+ test1 += a1;
+ }
+ break;
+ case 3:
+ if ((test1 - a1) < 0)
+ {
+ test1 = 0x0;
+ }
+ else
+ {
+ test1 -= a1;
+ }
+ break;
+ case 4:
+ test2 = a1 & 0xF;
+ break;
+ case 5:
+ if ((test2 + a1) > 0xF)
+ {
+ test2 = 0xF;
+ }
+ else
+ {
+ test2 += a1;
+ }
+ break;
+ case 6:
+ if ((test2 - a1) < 0)
+ {
+ test2 = 0x0;
+ }
+ else
+ {
+ test2 -= a1;
+ }
+ break;
+ }
+
+ result |= ((test2 << 0x4) & 0xF0);
+ result |= (test1 & 0xF);
+
+ SetGpuReg(REG_OFFSET_MOSAIC, result);
+
+ return result;
+}
+
+void SetBgTilemapBuffer(u8 bg, void *tilemap)
+{
+ if (IsInvalidBg32(bg) == FALSE && GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) != 0x0)
+ {
+ sGpuBgConfigs2[bg].tilemap = tilemap;
+ }
+}
+
+void UnsetBgTilemapBuffer(u8 bg)
+{
+ if (IsInvalidBg32(bg) == FALSE && GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) != 0x0)
+ {
+ sGpuBgConfigs2[bg].tilemap = NULL;
+ }
+}
+
+void* GetBgTilemapBuffer(u8 bg)
+{
+ if (IsInvalidBg32(bg) != FALSE)
+ return NULL;
+ if (GetBgControlAttribute(bg, BG_CTRL_ATTR_VISIBLE) == 0)
+ return NULL;
+ return sGpuBgConfigs2[bg].tilemap;
+}
+
+void CopyToBgTilemapBuffer(u8 bg, const void *src, u16 mode, u16 destOffset)
+{
+ if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE)
+ {
+ if (mode != 0)
+ {
+ CpuCopy16(src, (void *)(sGpuBgConfigs2[bg].tilemap + (destOffset * 32)), mode);
+ }
+ else
+ {
+ LZ77UnCompWram(src, (void *)(sGpuBgConfigs2[bg].tilemap + (destOffset * 32)));
+ }
+ }
+}
+
+void CopyBgTilemapBufferToVram(u8 bg)
+{
+ u16 sizeToLoad;
+
+ if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE)
+ {
+ switch (GetBgType(bg))
+ {
+ case 0:
+ sizeToLoad = GetBgMetricTextMode(bg, 0) * 0x800;
+ break;
+ case 1:
+ sizeToLoad = GetBgMetricAffineMode(bg, 0) * 0x100;
+ break;
+ default:
+ sizeToLoad = 0;
+ break;
+ }
+ LoadBgVram(bg, sGpuBgConfigs2[bg].tilemap, sizeToLoad, 0, 2);
+ }
+}
+
+void CopyToBgTilemapBufferRect(u8 bg, void* src, u8 destX, u8 destY, u8 width, u8 height)
+{
+ void* srcCopy;
+ u16 destX16;
+ u16 destY16;
+ u16 mode;
+
+ if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE)
+ {
+ switch (GetBgType(bg))
+ {
+ case 0:
+ srcCopy = src;
+ for (destY16 = destY; destY16 < (destY + height); destY16++)
+ {
+ for (destX16 = destX; destX16 < (destX + width); destX16++)
+ {
+ ((u16*)sGpuBgConfigs2[bg].tilemap)[((destY16 * 0x20) + destX16)] = *((u16*)srcCopy)++;
+ }
+ }
+ break;
+ case 1:
+ srcCopy = src;
+ mode = GetBgMetricAffineMode(bg, 0x1);
+ for (destY16 = destY; destY16 < (destY + height); destY16++)
+ {
+ for (destX16 = destX; destX16 < (destX + width); destX16++)
+ {
+ ((u8*)sGpuBgConfigs2[bg].tilemap)[((destY16 * mode) + destX16)] = *((u8*)srcCopy)++;
+ }
+ }
+ break;
+ }
+ }
+}
+
+void CopyToBgTilemapBufferRect_ChangePalette(u8 bg, void *src, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette)
+{
+ CopyRectToBgTilemapBufferRect(bg, src, 0, 0, rectWidth, rectHeight, destX, destY, rectWidth, rectHeight, palette, 0, 0);
+}
+// Skipping for now, it probably uses structs passed by value
+/*
+void CopyRectToBgTilemapBufferRect(u8 bg, void* src, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette1, u16 tileOffset, u16 palette2)
+{
+ u16 attribute;
+ u16 mode;
+ u16 mode2;
+
+ void* srcCopy;
+ u16 destX16;
+ u16 destY16;
+
+ if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE)
+ {
+ attribute = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE);
+ mode = GetBgMetricTextMode(bg, 0x1) * 0x20;
+ mode2 = GetBgMetricTextMode(bg, 0x2) * 0x20;
+ switch (GetBgType(bg))
+ {
+ case 0:
+ srcCopy = src;
+ for (destY16 = destY; destY16 < (destY + rectHeight); destY16++)
+ {
+ for (destX16 = destX; destX16 < (destX + rectWidth); destX16++)
+ {
+ CopyTileMapEntry(&((u16*)srcCopy)[(srcY * rectWidth) + srcX], &((u16*)sGpuBgConfigs2[bg].tilemap)[GetTileMapIndexFromCoords(destX16, destY16, attribute, mode, mode2)], palette1, tileOffset, palette2);
+ }
+ }
+ break;
+ case 1:
+ srcCopy = src;
+ mode = GetBgMetricAffineMode(bg, 0x1);
+ for (destY16 = destY; destY16 < (destY + rectHeight); destY16++)
+ {
+ for (destX16 = destX; destX16 < (destX + rectWidth); destX16++)
+ {
+ CopyTileMapEntry(&((u16*)srcCopy)[(srcY * rectWidth) + srcX], &((u16*)sGpuBgConfigs2[bg].tilemap)[GetTileMapIndexFromCoords(destX16, destY16, attribute, mode, mode2)], palette1, tileOffset, palette2);
+ }
+ }
+ break;
+ }
+ }
+}*/
+__attribute__((naked))
+void CopyRectToBgTilemapBufferRect(u8 bg, void* src, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette1, u16 tileOffset, u16 palette2)
+{
+ asm("push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, #0x40\n\
+ str r1, [sp, #0x8]\n\
+ ldr r1, [sp, #0x60]\n\
+ ldr r4, [sp, #0x68]\n\
+ ldr r5, [sp, #0x6C]\n\
+ ldr r6, [sp, #0x70]\n\
+ ldr r7, [sp, #0x74]\n\
+ mov r8, r7\n\
+ ldr r7, [sp, #0x78]\n\
+ mov r9, r7\n\
+ ldr r7, [sp, #0x7C]\n\
+ mov r10, r7\n\
+ ldr r7, [sp, #0x80]\n\
+ mov r12, r7\n\
+ lsl r0, #24\n\
+ lsr r0, #24\n\
+ str r0, [sp, #0x4]\n\
+ lsl r2, #24\n\
+ lsr r2, #24\n\
+ str r2, [sp, #0xC]\n\
+ lsl r3, #24\n\
+ lsr r3, #24\n\
+ str r3, [sp, #0x10]\n\
+ lsl r1, #24\n\
+ lsr r7, r1, #24\n\
+ lsl r4, #24\n\
+ lsr r4, #24\n\
+ str r4, [sp, #0x14]\n\
+ lsl r5, #24\n\
+ lsr r5, #24\n\
+ lsl r6, #24\n\
+ lsr r6, #24\n\
+ str r6, [sp, #0x18]\n\
+ mov r0, r8\n\
+ lsl r0, #24\n\
+ lsr r4, r0, #24\n\
+ mov r1, r9\n\
+ lsl r1, #24\n\
+ lsr r1, #24\n\
+ str r1, [sp, #0x1C]\n\
+ mov r2, r10\n\
+ lsl r2, #16\n\
+ lsr r2, #16\n\
+ str r2, [sp, #0x20]\n\
+ mov r0, r12\n\
+ lsl r0, #16\n\
+ lsr r0, #16\n\
+ str r0, [sp, #0x24]\n\
+ ldr r0, [sp, #0x4]\n\
+ bl IsInvalidBg32\n\
+ cmp r0, #0\n\
+ beq _08002592\n\
+ b _080026EE\n\
+_08002592:\n\
+ ldr r0, [sp, #0x4]\n\
+ bl IsTileMapOutsideWram\n\
+ cmp r0, #0\n\
+ beq _0800259E\n\
+ b _080026EE\n\
+_0800259E:\n\
+ ldr r0, [sp, #0x4]\n\
+ mov r1, #0x4\n\
+ bl GetBgControlAttribute\n\
+ lsl r0, #16\n\
+ lsr r0, #16\n\
+ str r0, [sp, #0x30]\n\
+ ldr r0, [sp, #0x4]\n\
+ mov r1, #0x1\n\
+ bl GetBgMetricTextMode\n\
+ lsl r0, #21\n\
+ lsr r0, #16\n\
+ str r0, [sp, #0x28]\n\
+ ldr r0, [sp, #0x4]\n\
+ mov r1, #0x2\n\
+ bl GetBgMetricTextMode\n\
+ lsl r0, #21\n\
+ lsr r0, #16\n\
+ str r0, [sp, #0x2C]\n\
+ ldr r0, [sp, #0x4]\n\
+ bl GetBgType\n\
+ cmp r0, #0\n\
+ beq _080025D8\n\
+ cmp r0, #0x1\n\
+ beq _08002674\n\
+ b _080026EE\n\
+_080025D8:\n\
+ ldr r1, [sp, #0x10]\n\
+ add r0, r1, #0\n\
+ mul r0, r7\n\
+ ldr r2, [sp, #0xC]\n\
+ add r0, r2\n\
+ lsl r0, #1\n\
+ ldr r1, [sp, #0x8]\n\
+ add r6, r1, r0\n\
+ add r0, r5, r4\n\
+ cmp r5, r0\n\
+ blt _080025F0\n\
+ b _080026EE\n\
+_080025F0:\n\
+ ldr r2, [sp, #0x18]\n\
+ sub r2, r7, r2\n\
+ str r2, [sp, #0x34]\n\
+ str r0, [sp, #0x38]\n\
+_080025F8:\n\
+ ldr r4, [sp, #0x14]\n\
+ ldr r7, [sp, #0x18]\n\
+ add r0, r4, r7\n\
+ add r1, r5, #0x1\n\
+ str r1, [sp, #0x3C]\n\
+ cmp r4, r0\n\
+ bge _0800265A\n\
+ ldr r2, [sp, #0x4]\n\
+ lsl r0, r2, #4\n\
+ ldr r1, =sGpuBgConfigs2+4\n\
+ add r0, r1\n\
+ mov r10, r0\n\
+ ldr r7, [sp, #0x20]\n\
+ lsl r7, #16\n\
+ mov r9, r7\n\
+ ldr r1, [sp, #0x24]\n\
+ lsl r0, r1, #16\n\
+ asr r0, #16\n\
+ mov r8, r0\n\
+_0800261E:\n\
+ ldr r2, [sp, #0x2C]\n\
+ str r2, [sp]\n\
+ add r0, r4, #0\n\
+ add r1, r5, #0\n\
+ ldr r2, [sp, #0x30]\n\
+ ldr r3, [sp, #0x28]\n\
+ bl GetTileMapIndexFromCoords\n\
+ lsl r0, #16\n\
+ lsr r0, #15\n\
+ mov r7, r10\n\
+ ldr r1, [r7]\n\
+ add r1, r0\n\
+ mov r0, r8\n\
+ str r0, [sp]\n\
+ add r0, r6, #0\n\
+ ldr r2, [sp, #0x1C]\n\
+ mov r7, r9\n\
+ asr r3, r7, #16\n\
+ bl CopyTileMapEntry\n\
+ add r6, #0x2\n\
+ add r0, r4, #0x1\n\
+ lsl r0, #16\n\
+ lsr r4, r0, #16\n\
+ ldr r1, [sp, #0x14]\n\
+ ldr r2, [sp, #0x18]\n\
+ add r0, r1, r2\n\
+ cmp r4, r0\n\
+ blt _0800261E\n\
+_0800265A:\n\
+ ldr r5, [sp, #0x34]\n\
+ lsl r0, r5, #1\n\
+ add r6, r0\n\
+ ldr r7, [sp, #0x3C]\n\
+ lsl r0, r7, #16\n\
+ lsr r5, r0, #16\n\
+ ldr r0, [sp, #0x38]\n\
+ cmp r5, r0\n\
+ blt _080025F8\n\
+ b _080026EE\n\
+ .pool\n\
+_08002674:\n\
+ ldr r1, [sp, #0x10]\n\
+ add r0, r1, #0\n\
+ mul r0, r7\n\
+ ldr r2, [sp, #0xC]\n\
+ add r0, r2\n\
+ ldr r1, [sp, #0x8]\n\
+ add r6, r1, r0\n\
+ ldr r0, [sp, #0x4]\n\
+ mov r1, #0x1\n\
+ bl GetBgMetricAffineMode\n\
+ lsl r0, #16\n\
+ lsr r0, #16\n\
+ mov r9, r0\n\
+ add r0, r5, r4\n\
+ cmp r5, r0\n\
+ bge _080026EE\n\
+ ldr r2, [sp, #0x18]\n\
+ sub r2, r7, r2\n\
+ str r2, [sp, #0x34]\n\
+ str r0, [sp, #0x38]\n\
+ ldr r7, =sGpuBgConfigs2+4\n\
+ mov r10, r7\n\
+ ldr r0, [sp, #0x4]\n\
+ lsl r0, #4\n\
+ mov r8, r0\n\
+_080026A8:\n\
+ ldr r4, [sp, #0x14]\n\
+ ldr r1, [sp, #0x18]\n\
+ add r0, r4, r1\n\
+ add r2, r5, #0x1\n\
+ str r2, [sp, #0x3C]\n\
+ cmp r4, r0\n\
+ bge _080026DE\n\
+ mov r3, r8\n\
+ add r3, r10\n\
+ mov r7, r9\n\
+ mul r7, r5\n\
+ mov r12, r7\n\
+ add r2, r0, #0\n\
+_080026C2:\n\
+ ldr r1, [r3]\n\
+ mov r5, r12\n\
+ add r0, r5, r4\n\
+ add r1, r0\n\
+ ldrb r0, [r6]\n\
+ ldr r7, [sp, #0x20]\n\
+ add r0, r7\n\
+ strb r0, [r1]\n\
+ add r6, #0x1\n\
+ add r0, r4, #0x1\n\
+ lsl r0, #16\n\
+ lsr r4, r0, #16\n\
+ cmp r4, r2\n\
+ blt _080026C2\n\
+_080026DE:\n\
+ ldr r0, [sp, #0x34]\n\
+ add r6, r0\n\
+ ldr r1, [sp, #0x3C]\n\
+ lsl r0, r1, #16\n\
+ lsr r5, r0, #16\n\
+ ldr r2, [sp, #0x38]\n\
+ cmp r5, r2\n\
+ blt _080026A8\n\
+_080026EE:\n\
+ add sp, #0x40\n\
+ pop {r3-r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov r10, r5\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .pool\n");
+}
+
+void FillBgTilemapBufferRect_Palette0(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height)
+{
+ u16 x16;
+ u16 y16;
+ u16 mode;
+
+ if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE)
+ {
+ switch (GetBgType(bg))
+ {
+ case 0:
+ for (y16 = y; y16 < (y + height); y16++)
+ {
+ for (x16 = x; x16 < (x + width); x16++)
+ {
+ ((u16*)sGpuBgConfigs2[bg].tilemap)[((y16 * 0x20) + x16)] = tileNum;
+ }
+ }
+ break;
+ case 1:
+ mode = GetBgMetricAffineMode(bg, 0x1);
+ for (y16 = y; y16 < (y + height); y16++)
+ {
+ for (x16 = x; x16 < (x + width); x16++)
+ {
+ ((u8*)sGpuBgConfigs2[bg].tilemap)[((y16 * mode) + x16)] = tileNum;
+ }
+ }
+ break;
+ }
+ }
+}
+
+void FillBgTilemapBufferRect(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height, u8 palette)
+{
+ WriteSequenceToBgTilemapBuffer(bg, tileNum, x, y, width, height, palette, 0);
+}
+
+void WriteSequenceToBgTilemapBuffer(u8 bg, u16 firstTileNum, u8 x, u8 y, u8 width, u8 height, u8 paletteSlot, s16 tileNumDelta)
+{
+ u16 mode;
+ u16 mode2;
+ u16 attribute;
+ u16 mode3;
+
+ u16 x16;
+ u16 y16;
+
+ if (IsInvalidBg32(bg) == FALSE && IsTileMapOutsideWram(bg) == FALSE)
+ {
+ attribute = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE);
+ mode = GetBgMetricTextMode(bg, 0x1) * 0x20;
+ mode2 = GetBgMetricTextMode(bg, 0x2) * 0x20;
+ switch (GetBgType(bg))
+ {
+ case 0:
+ for (y16 = y; y16 < (y + height); y16++)
+ {
+ for (x16 = x; x16 < (x + width); x16++)
+ {
+ CopyTileMapEntry(&firstTileNum, &((u16*)sGpuBgConfigs2[bg].tilemap)[(u16)GetTileMapIndexFromCoords(x16, y16, attribute, mode, mode2)], paletteSlot, 0, 0);
+ firstTileNum = (firstTileNum & 0xFC00) + ((firstTileNum + tileNumDelta) & 0x3FF);
+ }
+ }
+ break;
+ case 1:
+ mode3 = GetBgMetricAffineMode(bg, 0x1);
+ for (y16 = y; y16 < (y + height); y16++)
+ {
+ for (x16 = x; x16 < (x + width); x16++)
+ {
+ ((u8*)sGpuBgConfigs2[bg].tilemap)[(y16 * mode3) + x16] = firstTileNum;
+ firstTileNum = (firstTileNum & 0xFC00) + ((firstTileNum + tileNumDelta) & 0x3FF);
+ }
+ }
+ break;
+ }
+ }
+}
+
+u16 GetBgMetricTextMode(u8 bg, u8 whichMetric)
+{
+ u8 attribute;
+
+ attribute = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE);
+
+ switch (whichMetric)
+ {
+ case 0:
+ switch (attribute)
+ {
+ case 0:
+ return 1;
+ case 1:
+ case 2:
+ return 2;
+ case 3:
+ return 4;
+ }
+ break;
+ case 1:
+ switch (attribute)
+ {
+ case 0:
+ return 1;
+ case 1:
+ return 2;
+ case 2:
+ return 1;
+ case 3:
+ return 2;
+ }
+ break;
+ case 2:
+ switch (attribute)
+ {
+ case 0:
+ case 1:
+ return 1;
+ case 2:
+ case 3:
+ return 2;
+ }
+ break;
+ }
+ return 0;
+}
+
+u32 GetBgMetricAffineMode(u8 bg, u8 whichMetric)
+{
+ u8 attribute;
+
+ attribute = GetBgControlAttribute(bg, BG_CTRL_ATTR_SCREENSIZE);
+
+ switch (whichMetric)
+ {
+ case 0:
+ switch (attribute)
+ {
+ case 0:
+ return 0x1;
+ case 1:
+ return 0x4;
+ case 2:
+ return 0x10;
+ case 3:
+ return 0x40;
+ }
+ break;
+ case 1:
+ case 2:
+ return 0x10 << attribute;
+ }
+ return 0;
+}
+
+u32 GetTileMapIndexFromCoords(s32 x, s32 y, s32 screenSize, u32 screenWidth, u32 screenHeight)
+{
+ x = x & (screenWidth - 1);
+ y = y & (screenHeight - 1);
+
+ switch (screenSize)
+ {
+ case 0:
+ case 2:
+ break;
+ case 3:
+ if (y >= 0x20)
+ y += 0x20;
+ case 1:
+ if (x >= 0x20)
+ {
+ x -= 0x20;
+ y += 0x20;
+ }
+ }
+ return (y * 0x20) + x;
+}
+
+#ifdef NONMATCHING // This one has some weird switch statement cases that refuse to cooperate
+void CopyTileMapEntry(u16 *src, u16 *dest, s32 palette1, u32 tileOffset, u32 palette2)
+{
+ u16 test;
+ switch (palette1)
+ {
+ default:
+ if (palette1 > 0x10 || palette1 < 0)
+ test = *src + tileOffset + (palette2 << 12);
+ else
+ test = ((*src + tileOffset) & 0xFFF) + ((palette1 + palette2) << 12);
+ break;
+ case 0x10:
+ test = ((*dest & 0xFC00) + (palette2 << 12)) | ((*src + tileOffset) & 0x3FF);
+ break;
+ }
+
+ *dest = test;
+}
+#else
+__attribute__((naked))
+void CopyTileMapEntry(u16 *src, u16 *dest, s32 palette1, u32 tileOffset, u32 palette2)
+{
+ asm("push {r4-r6,lr}\n\
+ add r4, r0, #0\n\
+ add r6, r1, #0\n\
+ ldr r5, [sp, #0x10]\n\
+ cmp r2, #0x10\n\
+ beq _08002B14\n\
+ cmp r2, #0x10\n\
+ bgt _08002B34\n\
+ cmp r2, #0\n\
+ blt _08002B34\n\
+ ldrh r0, [r4]\n\
+ add r0, r3\n\
+ ldr r3, =0x00000fff\n\
+ add r1, r3, #0\n\
+ and r0, r1\n\
+ add r1, r2, r5\n\
+ lsl r1, #12\n\
+ b _08002B3A\n\
+ .pool\n\
+_08002B14:\n\
+ ldrh r1, [r6]\n\
+ mov r0, #0xFC\n\
+ lsl r0, #8\n\
+ and r1, r0\n\
+ lsl r2, r5, #12\n\
+ add r2, r1, r2\n\
+ ldrh r0, [r4]\n\
+ add r0, r3\n\
+ ldr r3, =0x000003ff\n\
+ add r1, r3, #0\n\
+ and r0, r1\n\
+ orr r0, r2\n\
+ b _08002B3C\n\
+ .pool\n\
+_08002B34:\n\
+ ldrh r0, [r4]\n\
+ add r0, r3\n\
+ lsl r1, r5, #12\n\
+_08002B3A:\n\
+ add r0, r1\n\
+_08002B3C:\n\
+ lsl r0, #16\n\
+ lsr r1, r0, #16\n\
+ strh r1, [r6]\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n");
+}
+#endif // NONMATCHING
+
+u32 GetBgType(u8 bg)
+{
+ u8 mode;
+
+ mode = GetBgMode();
+
+
+ switch (bg)
+ {
+ case 0:
+ case 1:
+ switch (mode)
+ {
+ case 0:
+ case 1:
+ return 0;
+ }
+ break;
+ case 2:
+ switch (mode)
+ {
+ case 0:
+ return 0;
+ case 1:
+ case 2:
+ return 1;
+ }
+ break;
+ case 3:
+ switch (mode)
+ {
+ case 0:
+ return 0;
+ case 2:
+ return 1;
+ }
+ break;
+ }
+
+ return 0xFFFF;
+}
+
+bool32 IsInvalidBg32(u8 bg)
+{
+ if (bg > 3)
+ return TRUE;
+ return FALSE;
+}
+
+bool32 IsTileMapOutsideWram(u8 bg)
+{
+ if (sGpuBgConfigs2[bg].tilemap > (void*)IWRAM_END)
+ return TRUE;
+ if (sGpuBgConfigs2[bg].tilemap == 0x0)
+ return TRUE;
+ return FALSE;
+}
diff --git a/sym_bss.txt b/sym_bss.txt
index be1acb833..069cfff4d 100644
--- a/sym_bss.txt
+++ b/sym_bss.txt
@@ -6,25 +6,9 @@
.space 0x4
- .align 2
-gUnknown_30008D0: @ 30008D0
- .space 0x18
-
-gUnknown_30008E8: @ 30008E8
- .space 0x4
-
-gUnknown_30008EC: @ 30008EC
- .space 0x8
-
-gUnknown_30008F4: @ 30008F4
- .space 0x34
-
-gUnknown_3000928: @ 3000928
- .space 0x10
-
-gUnknown_3000938: @ 3000938
- .space 0x100
+ .include "src/bg.o"
+ .align 2
gUnknown_3000A38: @ 3000A38
.space 0x4
diff --git a/sym_common.txt b/sym_common.txt
index 2ebd71c33..4253c5d77 100644
--- a/sym_common.txt
+++ b/sym_common.txt
@@ -1,7 +1,5 @@
.include "main.o"
-
-gUnknown_3003D8C: @ 3003D8C
- .space 0x4
+ .include "bg.o"
gUnknown_3003D90: @ 3003D90
.space 0x10