summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSeth Barberee <seth.barberee@gmail.com>2021-01-04 13:40:33 -0600
committerGitHub <noreply@github.com>2021-01-04 13:40:33 -0600
commit469212f7ee42d04e3160d357ed1f088f12edd391 (patch)
treeea53fd58f6dc9a42e38c3a7a78d6b7baa760a520
parent87cd9885a9f8b38a76ab6add4a634e2a8a4837ee (diff)
CPU and GPU Reg Funcs Decomp (#16)
* decomp/doc cpu funcs and gpu reg funcs * use Cpu32 macro funcs * address review comments * decomp SetBGOBJEnableFlags
-rw-r--r--asm/code_800B540.s88
-rw-r--r--asm/code_800B5F0.s122
-rw-r--r--asm/code_800C9CC.s249
-rw-r--r--asm/code_800D090.s8
-rw-r--r--asm/code_803D110.s6
-rw-r--r--asm/code_80A26CC.s4
-rw-r--r--include/bg.h18
-rw-r--r--include/gba/io_reg.h35
-rwxr-xr-xld_script.txt4
-rw-r--r--src/code_2.c8
-rw-r--r--src/code_800B5F0.c99
-rw-r--r--src/code_800C9CC.c172
-rw-r--r--src/cpu.c170
-rw-r--r--src/main.c165
-rw-r--r--src/music_pre.c55
15 files changed, 510 insertions, 693 deletions
diff --git a/asm/code_800B540.s b/asm/code_800B540.s
deleted file mode 100644
index 2ac2395..0000000
--- a/asm/code_800B540.s
+++ /dev/null
@@ -1,88 +0,0 @@
- .include "constants/gba_constants.inc"
- .include "asm/macros.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start sub_800B540
-sub_800B540:
- push {r4,lr}
- ldr r1, _0800B5C8
- movs r2, 0
- adds r0, r1, 0
- adds r0, 0x14
-_0800B54A:
- str r2, [r0]
- subs r0, 0x4
- cmp r0, r1
- bge _0800B54A
- bl nullsub_17
- bl sub_800BD08
- ldr r1, _0800B5CC
-_0800B55C:
- ldrh r0, [r1]
- cmp r0, 0x9F
- bls _0800B55C
- ldr r4, _0800B5D0
- ldrh r0, [r4]
- movs r1, 0x45
- eors r0, r1
- strh r0, [r4]
- movs r2, 0x80
- lsls r2, 19
- ldrb r0, [r2]
- movs r1, 0x80
- orrs r0, r1
- strb r0, [r2]
- ldr r0, _0800B5D4
- bl sub_800B6B0
- ldr r1, _0800B5D8
- movs r0, 0xC1
- lsls r0, 16
- str r0, [r1]
- ldrh r0, [r4]
- ldr r2, _0800B5DC
- adds r1, r2, 0
- orrs r0, r1
- strh r0, [r4]
- ldr r1, _0800B5E0
- movs r0, 0x28
- strh r0, [r1]
- ldr r1, _0800B5E4
- movs r2, 0x1
- negs r2, r2
- adds r0, r2, 0
- strh r0, [r1]
- ldr r1, _0800B5E8
- movs r0, 0
- strh r0, [r1]
- bl sub_800D6AC
- bl sub_800D7D0
- ldr r1, _0800B5EC
- movs r0, 0x1
- strb r0, [r1]
- bl EnableInterrupts
- ldr r1, _0800B5CC
-_0800B5BA:
- ldrh r0, [r1]
- cmp r0, 0x9F
- bls _0800B5BA
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0800B5C8: .4byte gUnknown_202D5F0
-_0800B5CC: .4byte 0x04000006
-_0800B5D0: .4byte 0x04000200
-_0800B5D4: .4byte gUnknown_80B9C00
-_0800B5D8: .4byte 0x0400010c
-_0800B5DC: .4byte 0x00002045
-_0800B5E0: .4byte 0x04000004
-_0800B5E4: .4byte gUnknown_203B0AE
-_0800B5E8: .4byte gUnknown_203B0AC
-_0800B5EC: .4byte gInterruptsEnabled
- thumb_func_end sub_800B540
-
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/asm/code_800B5F0.s b/asm/code_800B5F0.s
index cb44c31..b30e371 100644
--- a/asm/code_800B5F0.s
+++ b/asm/code_800B5F0.s
@@ -651,126 +651,4 @@ _0800BC08: .4byte 0x00008304
_0800BC0C: .4byte 0x04000208
thumb_func_end sub_800BB44
- thumb_func_start nullsub_17
-nullsub_17:
- bx lr
- thumb_func_end nullsub_17
-
- thumb_func_start UpdateBGControlRegisters
-UpdateBGControlRegisters:
- push {r4,lr}
- sub sp, 0x10
- ldr r0, _0800BC2C
- ldrb r0, [r0]
- cmp r0, 0x1
- bne _0800BC30
- str r0, [sp]
- movs r0, 0x2
- str r0, [sp, 0x4]
- movs r0, 0
- b _0800BC3A
- .align 2, 0
-_0800BC2C: .4byte gUnknown_202D7FE
-_0800BC30:
- movs r0, 0
- str r0, [sp]
- movs r0, 0x1
- str r0, [sp, 0x4]
- movs r0, 0x2
-_0800BC3A:
- str r0, [sp, 0x8]
- movs r0, 0x3
- str r0, [sp, 0xC]
- ldr r1, _0800BCA8
- ldr r2, _0800BCAC
- ldrh r0, [r2, 0x4]
- strh r0, [r1]
- adds r1, 0x2
- ldrh r0, [r2, 0x6]
- strh r0, [r1]
- adds r1, 0x2
- ldr r2, _0800BCB0
- ldrh r0, [r2, 0x4]
- strh r0, [r1]
- adds r1, 0x2
- ldrh r0, [r2, 0x6]
- strh r0, [r1]
- adds r1, 0x2
- ldr r3, _0800BCB4
- ldrh r0, [r3, 0x4]
- strh r0, [r1]
- adds r1, 0x2
- ldrh r0, [r3, 0x6]
- strh r0, [r1]
- adds r1, 0x2
- ldr r2, _0800BCB8
- ldrh r0, [r2, 0x4]
- strh r0, [r1]
- adds r1, 0x2
- ldrh r0, [r2, 0x6]
- strh r0, [r1]
- ldr r2, _0800BCBC
- ldr r0, [sp]
- movs r4, 0xB0
- lsls r4, 6
- adds r1, r4, 0
- orrs r0, r1
- strh r0, [r2]
- adds r2, 0x2
- ldr r0, [sp, 0x4]
- movs r4, 0xB4
- lsls r4, 6
- adds r1, r4, 0
- orrs r0, r1
- strh r0, [r2]
- ldrh r1, [r3, 0x2]
- movs r0, 0x80
- lsls r0, 8
- cmp r1, r0
- bne _0800BCC8
- ldr r0, _0800BCC0
- ldr r1, [sp, 0x8]
- ldr r3, _0800BCC4
- adds r2, r3, 0
- b _0800BCD2
- .align 2, 0
-_0800BCA8: .4byte 0x04000010
-_0800BCAC: .4byte gUnknown_202D698
-_0800BCB0: .4byte gUnknown_202D6A0
-_0800BCB4: .4byte gUnknown_202D6A8
-_0800BCB8: .4byte gUnknown_202D6B0
-_0800BCBC: .4byte 0x04000008
-_0800BCC0: .4byte 0x0400000c
-_0800BCC4: .4byte 0x00002e08
-_0800BCC8:
- ldr r0, _0800BCF4
- ldr r1, [sp, 0x8]
- movs r4, 0xB8
- lsls r4, 6
- adds r2, r4, 0
-_0800BCD2:
- orrs r1, r2
- strh r1, [r0]
- ldr r2, _0800BCF8
- ldr r0, [sp, 0xC]
- ldr r3, _0800BCFC
- adds r1, r3, 0
- orrs r0, r1
- strh r0, [r2]
- ldr r1, _0800BD00
- ldr r0, _0800BD04
- ldrh r0, [r0]
- strh r0, [r1]
- add sp, 0x10
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0800BCF4: .4byte 0x0400000c
-_0800BCF8: .4byte 0x0400000e
-_0800BCFC: .4byte 0x00002f08
-_0800BD00: .4byte 0x04000050
-_0800BD04: .4byte gUnknown_202D7FC
- thumb_func_end UpdateBGControlRegisters
-
.align 2, 0 @ Don't pad with nop.
diff --git a/asm/code_800C9CC.s b/asm/code_800C9CC.s
deleted file mode 100644
index 8f34a57..0000000
--- a/asm/code_800C9CC.s
+++ /dev/null
@@ -1,249 +0,0 @@
- .include "constants/gba_constants.inc"
- .include "asm/macros.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start sub_800CD64
-sub_800CD64:
- ldr r2, _0800CD7C
- strb r1, [r2]
- ldr r2, _0800CD80
- negs r1, r0
- orrs r1, r0
- asrs r1, 31
- movs r3, 0x80
- lsls r3, 8
- adds r0, r3, 0
- ands r1, r0
- strh r1, [r2, 0x2]
- bx lr
- .align 2, 0
-_0800CD7C: .4byte gUnknown_202D7FE
-_0800CD80: .4byte gUnknown_202D6A8
- thumb_func_end sub_800CD64
-
- thumb_func_start SetBGOBJEnableFlags
-SetBGOBJEnableFlags:
- push {r4,lr}
- movs r3, 0x80
- lsls r3, 19
- ldrh r1, [r3]
- ldr r2, _0800CDA4
- ands r2, r1
- lsls r0, 8
- movs r4, 0xF8
- lsls r4, 5
- adds r1, r4, 0
- bics r1, r0
- orrs r2, r1
- strh r2, [r3]
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0800CDA4: .4byte 0x0000e0ff
- thumb_func_end SetBGOBJEnableFlags
-
- thumb_func_start sub_800CDA8
-sub_800CDA8:
- ldr r1, _0800CDBC
- str r0, [r1]
- ldr r2, _0800CDC0
- ldr r1, _0800CDC4
- lsls r0, 1
- adds r0, r1
- ldrh r0, [r0]
- strh r0, [r2]
- bx lr
- .align 2, 0
-_0800CDBC: .4byte gUnknown_202D800
-_0800CDC0: .4byte gUnknown_202D7FC
-_0800CDC4: .4byte gUnknown_203B0BE
- thumb_func_end sub_800CDA8
-
- thumb_func_start sub_800CDC8
-sub_800CDC8:
- ldr r0, _0800CDD0
- ldr r0, [r0]
- bx lr
- .align 2, 0
-_0800CDD0: .4byte gUnknown_202D800
- thumb_func_end sub_800CDC8
-
- thumb_func_start SetWindowTitle
-SetWindowTitle:
- bx lr
- thumb_func_end SetWindowTitle
-
- thumb_func_start nullsub_23
-nullsub_23:
- bx lr
- thumb_func_end nullsub_23
-
- thumb_func_start nullsub_182
-nullsub_182:
- bx lr
- thumb_func_end nullsub_182
-
- thumb_func_start sub_800CDE0
-sub_800CDE0:
- movs r0, 0x1
- bx lr
- thumb_func_end sub_800CDE0
-
- thumb_func_start CpuCopy
-CpuCopy:
- push {lr}
- adds r3, r0, 0
- cmp r2, 0
- bge _0800CDEE
- adds r2, 0x3
-_0800CDEE:
- lsls r2, 9
- lsrs r2, 11
- movs r0, 0x80
- lsls r0, 19
- orrs r2, r0
- adds r0, r1, 0
- adds r1, r3, 0
- bl CpuSet
- pop {r0}
- bx r0
- thumb_func_end CpuCopy
-
- thumb_func_start CpuClear
-CpuClear:
- push {lr}
- sub sp, 0x4
- adds r3, r0, 0
- movs r0, 0
- str r0, [sp]
- cmp r1, 0
- bge _0800CE14
- adds r1, 0x3
-_0800CE14:
- lsls r2, r1, 9
- lsrs r2, 11
- movs r0, 0xA0
- lsls r0, 19
- orrs r2, r0
- mov r0, sp
- adds r1, r3, 0
- bl CpuSet
- add sp, 0x4
- pop {r0}
- bx r0
- thumb_func_end CpuClear
-
- thumb_func_start CpuFill
-CpuFill:
- push {lr}
- sub sp, 0x4
- adds r3, r0, 0
- str r1, [sp]
- cmp r2, 0
- bge _0800CE3A
- adds r2, 0x3
-_0800CE3A:
- lsls r2, 9
- lsrs r2, 11
- movs r0, 0xA0
- lsls r0, 19
- orrs r2, r0
- mov r0, sp
- adds r1, r3, 0
- bl CpuSet
- add sp, 0x4
- pop {r0}
- bx r0
- thumb_func_end CpuFill
-
- thumb_func_start sub_800CE54
-sub_800CE54:
- push {lr}
- ldr r2, _0800CEC0
- ldrh r0, [r2]
- movs r3, 0x80
- lsls r3, 8
- adds r1, r3, 0
- orrs r0, r1
- ldr r1, _0800CEC4
- ands r0, r1
- strh r0, [r2]
- mov r8, r8
- mov r8, r8
- mov r8, r8
- mov r8, r8
- ldr r1, _0800CEC8
- ands r0, r1
- strh r0, [r2]
- ldr r1, _0800CECC
- ldr r2, _0800CED0
- adds r0, r2, 0
- strh r0, [r1]
- adds r1, 0x2
- movs r0, 0x3D
- strh r0, [r1]
- adds r1, 0x6
- ldr r0, _0800CED4
- ldrh r0, [r0]
- strh r0, [r1]
- adds r1, 0x2
- ldr r0, _0800CED8
- ldrh r0, [r0]
- strh r0, [r1]
- ldr r0, _0800CEDC
- ldrb r1, [r0]
- cmp r1, 0
- beq _0800CEF4
- ldr r1, _0800CEE0
- ldr r0, _0800CEE4
- ldr r2, [r0]
- adds r0, r2, 0x4
- str r0, [r1]
- ldr r3, _0800CEE8
- str r3, [r1, 0x4]
- ldr r0, _0800CEEC
- str r0, [r1, 0x8]
- ldr r0, [r1, 0x8]
- ldrh r0, [r2]
- strh r0, [r3]
- subs r1, 0x6E
- ldrh r0, [r2, 0x2]
- strh r0, [r1]
- ldr r0, _0800CEF0
- movs r1, 0xA0
- b _0800CEFE
- .align 2, 0
-_0800CEC0: .4byte 0x040000ba
-_0800CEC4: .4byte 0x0000cdff
-_0800CEC8: .4byte 0x00007fff
-_0800CECC: .4byte 0x04000048
-_0800CED0: .4byte 0x00003f3f
-_0800CED4: .4byte gUnknown_202D7FC
-_0800CED8: .4byte gUnknown_202D7FA
-_0800CEDC: .4byte gUnknown_2026E38
-_0800CEE0: .4byte 0x040000b0
-_0800CEE4: .4byte gUnknown_2026E3C
-_0800CEE8: .4byte 0x04000040
-_0800CEEC: .4byte 0xa2600002
-_0800CEF0: .4byte 0x04000044
-_0800CEF4:
- ldr r0, _0800CF08
- strh r1, [r0]
- adds r0, 0x2
- strh r1, [r0]
- adds r0, 0x2
-_0800CEFE:
- strh r1, [r0]
- adds r0, 0x2
- strh r1, [r0]
- pop {r0}
- bx r0
- .align 2, 0
-_0800CF08: .4byte 0x04000040
- thumb_func_end sub_800CE54
-
- .align 2,0
diff --git a/asm/code_800D090.s b/asm/code_800D090.s
index a77aeab..3fd539a 100644
--- a/asm/code_800D090.s
+++ b/asm/code_800D090.s
@@ -7522,7 +7522,7 @@ sub_8010960:
adds r1, r5
movs r2, 0
ldrsh r1, [r1, r2]
- bl sub_800CCA0
+ bl SetBG2RegOffsets
ldr r1, [r6]
adds r4, r1, r4
movs r2, 0
@@ -7530,7 +7530,7 @@ sub_8010960:
adds r1, r5
movs r2, 0
ldrsh r1, [r1, r2]
- bl sub_800CCAC
+ bl SetBG3RegOffsets
movs r0, 0x1
bl sub_8010A88
bl sub_8010A00
@@ -9139,7 +9139,7 @@ sub_801169C:
adds r1, r6
movs r3, 0
ldrsh r1, [r1, r3]
- bl sub_800CCA0
+ bl SetBG2RegOffsets
ldr r1, [r5]
adds r4, r1, r4
movs r2, 0
@@ -9147,7 +9147,7 @@ sub_801169C:
adds r1, r6
movs r3, 0
ldrsh r1, [r1, r3]
- bl sub_800CCAC
+ bl SetBG3RegOffsets
bl sub_8010F28
bl sub_80111C4
lsls r0, 24
diff --git a/asm/code_803D110.s b/asm/code_803D110.s
index 55aaf57..f5f9425 100644
--- a/asm/code_803D110.s
+++ b/asm/code_803D110.s
@@ -2567,7 +2567,7 @@ sub_803E490:
adds r1, r4
movs r2, 0
ldrsh r1, [r1, r2]
- bl sub_800CCA0
+ bl SetBG2RegOffsets
b _0803E4FC
.align 2, 0
_0803E4D8: .4byte gUnknown_202EDD4
@@ -2582,7 +2582,7 @@ _0803E4EC:
strb r0, [r1]
movs r0, 0
movs r1, 0
- bl sub_800CCA0
+ bl SetBG2RegOffsets
_0803E4FC:
ldr r4, _0803E62C
ldr r2, [r4]
@@ -2598,7 +2598,7 @@ _0803E4FC:
adds r2, r3
ldr r2, [r2]
subs r1, r2
- bl sub_800CCAC
+ bl SetBG3RegOffsets
bl sub_806CC10
bl sub_804522C
bl sub_803F9CC
diff --git a/asm/code_80A26CC.s b/asm/code_80A26CC.s
index ebc16bc..20676d2 100644
--- a/asm/code_80A26CC.s
+++ b/asm/code_80A26CC.s
@@ -4386,12 +4386,12 @@ _080A4998: .4byte 0x00000536
_080A499C:
ldr r0, [r4, 0x48]
ldr r1, [r4, 0x4C]
- bl sub_800CCA0
+ bl SetBG2RegOffsets
b _080A49AE
_080A49A6:
ldr r0, [r4, 0x48]
ldr r1, [r4, 0x4C]
- bl sub_800CCAC
+ bl SetBG3RegOffsets
_080A49AE:
adds r6, 0x1
adds r5, 0x1
diff --git a/include/bg.h b/include/bg.h
new file mode 100644
index 0000000..376fb6f
--- /dev/null
+++ b/include/bg.h
@@ -0,0 +1,18 @@
+struct BGControlStruct
+{
+ u16 padding;
+ u16 unk2;
+ s16 hofs;
+ s16 vofs;
+};
+
+void SetBG0RegOffsets(s32 xoffset, s32 yoffset);
+void SetBG1RegOffsets(s32 xoffset, s32 yoffset);
+void SetBG2RegOffsets(s32 xoffset, s32 yoffset);
+void SetBG3RegOffsets(s32 xoffset, s32 yoffset);
+void SetBGRegOffsets(s32 reg, u32 xoffset, s32 yoffset);
+void SetBGRegXOffset(s32 reg, s32 offset);
+void SetBGRegYOffset(s32 reg, s32 offset);
+void UpdateBGControlRegisters(void);
+void SetBGOBJEnableFlags(u32 mask);
+
diff --git a/include/gba/io_reg.h b/include/gba/io_reg.h
index 6dbe5e8..2453645 100644
--- a/include/gba/io_reg.h
+++ b/include/gba/io_reg.h
@@ -538,6 +538,41 @@
#define BGCNT_AFF512x512 0x8000
#define BGCNT_AFF1024x1024 0xC000
+// WININ/OUT
+#define WININ_WIN0_BG0 (1 << 0)
+#define WININ_WIN0_BG1 (1 << 1)
+#define WININ_WIN0_BG2 (1 << 2)
+#define WININ_WIN0_BG3 (1 << 3)
+#define WININ_WIN0_BG_ALL (WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3)
+#define WININ_WIN0_OBJ (1 << 4)
+#define WININ_WIN0_CLR (1 << 5)
+#define WININ_WIN0_ALL (WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR)
+#define WININ_WIN1_BG0 (1 << 8)
+#define WININ_WIN1_BG1 (1 << 9)
+#define WININ_WIN1_BG2 (1 << 10)
+#define WININ_WIN1_BG3 (1 << 11)
+#define WININ_WIN1_BG_ALL (WININ_WIN1_BG0 | WININ_WIN1_BG1 | WININ_WIN1_BG2 | WININ_WIN1_BG3)
+#define WININ_WIN1_OBJ (1 << 12)
+#define WININ_WIN1_CLR (1 << 13)
+#define WININ_WIN1_ALL (WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR)
+
+#define WINOUT_WIN01_BG0 (1 << 0)
+#define WINOUT_WIN01_BG1 (1 << 1)
+#define WINOUT_WIN01_BG2 (1 << 2)
+#define WINOUT_WIN01_BG3 (1 << 3)
+#define WINOUT_WIN01_BG_ALL (WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3)
+#define WINOUT_WIN01_OBJ (1 << 4)
+#define WINOUT_WIN01_CLR (1 << 5)
+#define WINOUT_WIN01_ALL (WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR)
+#define WINOUT_WINOBJ_BG0 (1 << 8)
+#define WINOUT_WINOBJ_BG1 (1 << 9)
+#define WINOUT_WINOBJ_BG2 (1 << 10)
+#define WINOUT_WINOBJ_BG3 (1 << 11)
+#define WINOUT_WINOBJ_BG_ALL (WINOUT_WINOBJ_BG0 | WINOUT_WINOBJ_BG1 | WINOUT_WINOBJ_BG2 | WINOUT_WINOBJ_BG3)
+#define WINOUT_WINOBJ_OBJ (1 << 12)
+#define WINOUT_WINOBJ_CLR (1 << 13)
+#define WINOUT_WINOBJ_ALL (WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR)
+
// BLDCNT
// Bits 0-5 select layers for the 1st target
#define BLDCNT_TGT1_BG0 (1 << 0)
diff --git a/ld_script.txt b/ld_script.txt
index 5acc3f0..1d675cd 100755
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -68,14 +68,12 @@ SECTIONS {
asm/code_8009804.o(.text);
src/file_system.o(.text);
src/main.o(.text);
- asm/code_800B540.o(.text);
- src/code_800B5F0.o(.text);
asm/code_800B5F0.o(.text);
src/music_pre.o(.text);
asm/music.o(.text);
src/music.o(.text);
src/code_800C9CC.o(.text);
- asm/code_800C9CC.o(.text);
+ src/cpu.o(.text);
src/flash.o(.text);
src/code_800D090.o(.text);
asm/code_800D090.o(.text);
diff --git a/src/code_2.c b/src/code_2.c
index 4e778e7..fcec96d 100644
--- a/src/code_2.c
+++ b/src/code_2.c
@@ -2,6 +2,7 @@
#include "file_system.h"
#include "friend_area.h"
#include "input.h"
+#include "bg.h"
extern void InitHeap(void);
extern void NDS_DebugInit(void);
@@ -37,8 +38,6 @@ extern void sub_80097B0(void);
extern void sub_800CDA8(u32);
extern void sub_800641C(u32, u32, u32);
extern void LoadTitleScreen(void);
-extern void sub_800CCA0(u32, u32);
-extern void sub_800CCAC(u32, u32);
extern void SetBGPaletteBufferColorRGB(s32, u8 *, s32, u8 *);
extern void sub_800BDFC(u32);
extern void sub_80095CC(u32, u32);
@@ -47,7 +46,6 @@ extern void sub_8012468(void);
extern u32 sub_8012484(void);
extern void sub_8012558(void);
extern u8 sub_80363E0(void);
-extern void SetBGOBJEnableFlags(u32);
extern void SetUpMenu(void);
extern u32 UpdateMenu(void);
extern void CleanUpMenu(void);
@@ -134,8 +132,8 @@ void GameLoop(void)
sub_800641C(0, 1, 1);
gUnknown_2026E4E = 0x1000;
LoadTitleScreen();
- sub_800CCA0(0, 0);
- sub_800CCAC(0, 0);
+ SetBG2RegOffsets(0, 0);
+ SetBG3RegOffsets(0, 0);
gUnknown_2000A80 = 0;
while (gUnknown_2000A80 < 32) {
s32 i;
diff --git a/src/code_800B5F0.c b/src/code_800B5F0.c
deleted file mode 100644
index 35b5282..0000000
--- a/src/code_800B5F0.c
+++ /dev/null
@@ -1,99 +0,0 @@
-#include "global.h"
-
-extern bool8 gInterruptsEnabled;
-extern u32 gIntrTable[];
-extern u32 IntrMain;
-extern u8 gUnknown_202D4B8;
-extern u32 gUnknown_202D5F0[];
-
-bool8 EnableInterrupts(void)
-{
- if(gInterruptsEnabled == FALSE)
- {
- return FALSE;
- }
-
- if((REG_IME & 1) != 0)
- {
- return FALSE;
- }
- else
- {
- REG_IME = 1;
- return TRUE;
- }
-}
-
-bool8 DisableInterrupts(void)
-{
- if(gInterruptsEnabled == 0)
- {
- return FALSE;
- }
-
- if((REG_IME & 1) == 0)
- {
- return FALSE;
- }
- else
- {
- REG_IME = 0;
- return TRUE;
- }
-
-}
-
-bool8 sub_800B650(void)
-{
- if(gInterruptsEnabled == FALSE)
- {
- return FALSE;
- }
-
- if((REG_IME & 1) != 0)
- {
- return FALSE;
- }
- else
- {
- return TRUE;
- }
-}
-
-void SetInterruptFlag(u16 flag)
-{
- if(gInterruptsEnabled == FALSE)
- {
- return;
- }
-
- REG_IME = 0;
- INTR_CHECK |= flag;
- REG_IME = 1;
-}
-
-void sub_800B6B0(const u32 *r0)
-{
- CpuCopy32(r0, &gIntrTable, 0x18); // 0x18 = 0x6 * 4 (0x4f00 is 32 bits)
- CpuCopy32(&IntrMain, &gUnknown_202D4B8, 0x120); // 0x120 = 0x48 * 4 (0x4f00 is 32 bits)
- INTR_VECTOR = &gUnknown_202D4B8;
-}
-
-u32 *sub_800B6E8(u32 r0)
-{
- return &gIntrTable[r0];
-}
-
-u32 sub_800B6F4(u32 r0, u32 r1)
-{
- u32 temp;
- u32 interrupt_var;
-
- interrupt_var = DisableInterrupts();
- temp = gUnknown_202D5F0[r0];
- gUnknown_202D5F0[r0] = r1;
- if(interrupt_var != FALSE){
- EnableInterrupts();
- }
- return temp;
-}
diff --git a/src/code_800C9CC.c b/src/code_800C9CC.c
index ddc49c6..28ce10a 100644
--- a/src/code_800C9CC.c
+++ b/src/code_800C9CC.c
@@ -1,23 +1,17 @@
#include "global.h"
#include "input.h"
-
-struct unkStruct_809CC88
-{
- u16 padding;
- u16 unk2;
- u16 unk4;
- u16 unk6;
-};
+#include "bg.h"
extern u16 gRawKeyInput;
extern u8 gUnknown_202D6B8;
extern u8 gUnknown_202D6B9;
extern u16 gUnknown_202D7FA;
+extern u8 gUnknown_202D7FE;
-extern struct unkStruct_809CC88 gUnknown_202D698;
-extern struct unkStruct_809CC88 gUnknown_202D6A0;
-extern struct unkStruct_809CC88 gUnknown_202D6A8;
-extern struct unkStruct_809CC88 gUnknown_202D6B0;
+extern struct BGControlStruct gUnknown_202D698;
+extern struct BGControlStruct gUnknown_202D6A0;
+extern struct BGControlStruct gUnknown_202D6A8;
+extern struct BGControlStruct gUnknown_202D6B0;
void ReadKeyInput(struct Inputs *r0)
{
@@ -97,122 +91,86 @@ void sub_800CC44(s32 r0, s32 r1)
}
-void sub_800CC88(u32 r0, u32 r1)
+void SetBG0RegOffsets(s32 xoffset, s32 yoffset)
{
- gUnknown_202D698.unk4 = r0;
- gUnknown_202D698.unk6 = r1;
+ gUnknown_202D698.hofs = xoffset;
+ gUnknown_202D698.vofs = yoffset;
}
-void sub_800CC94(u32 r0, u32 r1)
+void SetBG1RegOffsets(s32 xoffset, s32 yoffset)
{
- gUnknown_202D6A0.unk4 = r0;
- gUnknown_202D6A0.unk6 = r1;
+ gUnknown_202D6A0.hofs = xoffset;
+ gUnknown_202D6A0.vofs = yoffset;
}
-void sub_800CCA0(u32 r0, u32 r1)
+void SetBG2RegOffsets(s32 xoffset, s32 yoffset)
{
- gUnknown_202D6A8.unk4 = r0;
- gUnknown_202D6A8.unk6 = r1;
+ gUnknown_202D6A8.hofs = xoffset;
+ gUnknown_202D6A8.vofs = yoffset;
}
-void sub_800CCAC(u32 r0, u32 r1)
+void SetBG3RegOffsets(s32 xoffset, s32 yoffset)
{
- gUnknown_202D6B0.unk4 = r0;
- gUnknown_202D6B0.unk6 = r1;
+ gUnknown_202D6B0.hofs = xoffset;
+ gUnknown_202D6B0.vofs = yoffset;
}
-void sub_800CCB8(s32 r0, u32 r1, u32 r2)
+void SetBGRegOffsets(s32 reg, u32 xoffset, s32 yoffset)
{
- if(r0 == 1)
- {
- goto _0800CCD4;
- }
- if(r0 <= 1)
- {
- goto _0800CCCA;
- }
- if(r0 == 2)
- {
- goto _0800CCDE;
+ switch (reg) {
+ default:
+ case 0: return SetBG0RegOffsets(xoffset, yoffset);
+ case 1: return SetBG1RegOffsets(xoffset, yoffset);
+ case 2: return SetBG2RegOffsets(xoffset, yoffset);
+ case 3: return SetBG3RegOffsets(xoffset, yoffset);
}
- if(r0 == 3)
- {
- goto _0800CCE8;
- }
-
- _0800CCCA:
- sub_800CC88(r1, r2);
- return;
- _0800CCD4:
- sub_800CC94(r1, r2);
- return;
- _0800CCDE:
- sub_800CCA0(r1, r2);
- return;
- _0800CCE8:
- sub_800CCAC(r1, r2);
}
-void sub_800CCF4(s32 r0, u32 r1)
+void SetBGRegXOffset(s32 reg, s32 offset)
{
- if(r0 == 1)
- {
- goto _0800CD10;
- }
- if(r0 <= 1)
- {
- goto _0800CD06;
+ switch (reg) {
+ default:
+ case 0:
+ gUnknown_202D698.hofs = offset;
+ break;
+ case 1:
+ gUnknown_202D6A0.hofs = offset;
+ break;
+ case 2:
+ gUnknown_202D6A8.hofs = offset;
+ break;
+ case 3:
+ gUnknown_202D6B0.hofs = offset;
+ break;
}
- if(r0 == 2)
- {
- goto _0800CD18;
- }
- if(r0 == 3)
- {
- goto _0800CD20;
- }
-
- _0800CD06:
- gUnknown_202D698.unk4 = r1;
- return;
- _0800CD10:
- gUnknown_202D6A0.unk4 = r1;
- return;
- _0800CD18:
- gUnknown_202D6A8.unk4 = r1;
- return;
- _0800CD20:
- gUnknown_202D6B0.unk4 = r1;
}
-void sub_800CD2C(s32 r0, u32 r1)
+void SetBGRegYOffset(s32 reg, s32 offset)
{
- if(r0 == 1)
- {
- goto _0800CD48;
- }
- if(r0 <= 1)
- {
- goto _0800CD3E;
- }
- if(r0 == 2)
- {
- goto _0800CD50;
- }
- if(r0 == 3)
- {
- goto _0800CD58;
+ switch (reg) {
+ default:
+ case 0:
+ gUnknown_202D698.vofs = offset;
+ break;
+ case 1:
+ gUnknown_202D6A0.vofs = offset;
+ break;
+ case 2:
+ gUnknown_202D6A8.vofs = offset;
+ break;
+ case 3:
+ gUnknown_202D6B0.vofs = offset;
+ break;
}
+}
- _0800CD3E:
- gUnknown_202D698.unk6 = r1;
- return;
- _0800CD48:
- gUnknown_202D6A0.unk6 = r1;
- return;
- _0800CD50:
- gUnknown_202D6A8.unk6 = r1;
- return;
- _0800CD58:
- gUnknown_202D6B0.unk6 = r1;
+void sub_800CD64(s32 r0, u8 r1)
+{
+ gUnknown_202D7FE = r1;
+ gUnknown_202D6A8.unk2 = r0 ? 0x8000 : 0;
+}
+
+void SetBGOBJEnableFlags(u32 mask)
+{
+ REG_DISPCNT = (REG_DISPCNT & 0xe0ff) | (~(mask << 8) & (DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON));
}
diff --git a/src/cpu.c b/src/cpu.c
new file mode 100644
index 0000000..eb1043a
--- /dev/null
+++ b/src/cpu.c
@@ -0,0 +1,170 @@
+#include "global.h"
+
+extern u32 gUnknown_202D800;
+extern u16 gUnknown_202D7FC; // used to update Blend Count Reg
+extern u16 gUnknown_203B0BE[];
+
+void sub_800CDA8(u32 r0)
+{
+ gUnknown_202D800 = r0;
+ gUnknown_202D7FC = gUnknown_203B0BE[r0];
+}
+
+u32 sub_800CDC8(void)
+{
+ return gUnknown_202D800;
+}
+
+void SetWindowTitle(char *title)
+{
+}
+
+void nullsub_23(void)
+{
+}
+
+void nullsub_182(void)
+{
+}
+
+u32 sub_800CDE0(void)
+{
+ return 1;
+}
+
+void CpuCopy(void* src, void *dest, s32 size)
+{
+ CpuCopy32(dest, src, size);
+}
+
+void CpuClear(void* dest, s32 size)
+{
+ CpuFill32(NULL, dest, size);
+}
+
+void CpuFill(void* src, void *dest, s32 size)
+{
+ CpuFill32(dest, src, size);
+}
+
+#ifdef NONMATCHING
+void sub_800CE54(void)
+{
+ // TODO this is so gross.. looks like a macro or something else but I don't want to deal with this rn
+ REG_DMA0CNT_H = (REG_DMA0CNT_H | DMA_ENABLE) & 0xcdff;
+ asm("mov \tr8, r8");
+ asm("mov \tr8, r8");
+ asm("mov \tr8, r8");
+ asm("mov \tr8, r8");
+ REG_DMA0CNT_H &= 0x7fff;
+
+ // Everything below matches
+
+ REG_WININ = WININ_WIN0_ALL | WININ_WIN1_ALL;
+ REG_WINOUT = WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WIN01_BG3 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG0;
+ REG_BLDCNT = gUnknown_202D7FC;
+ REG_BLDALPHA = gUnknown_202D7FA;
+ if(gUnknown_2026E38 != 0)
+ {
+ DmaSet(0, &gUnknown_2026E3C[2], REG_ADDR_WIN0H, 0xa2600002);
+ REG_WIN0H = gUnknown_2026E3C[0];
+ REG_WIN1H = gUnknown_2026E3C[1];
+ REG_WIN0V = 160;
+ REG_WIN1V = 160;
+ }
+ else
+ {
+ REG_WIN0H = 0;
+ REG_WIN1H = 0;
+ REG_WIN0V = 0;
+ REG_WIN1V = 0;
+ }
+}
+#else
+NAKED
+void sub_800CE54(void)
+{
+ asm_unified("\tpush {lr}\n"
+ "\tldr r2, _0800CEC0\n"
+ "\tldrh r0, [r2]\n"
+ "\tmovs r3, 0x80\n"
+ "\tlsls r3, 8\n"
+ "\tadds r1, r3, 0\n"
+ "\torrs r0, r1\n"
+ "\tldr r1, _0800CEC4\n"
+ "\tands r0, r1\n"
+ "\tstrh r0, [r2]\n"
+ "\tmov r8, r8\n"
+ "\tmov r8, r8\n"
+ "\tmov r8, r8\n"
+ "\tmov r8, r8\n"
+ "\tldr r1, _0800CEC8\n"
+ "\tands r0, r1\n"
+ "\tstrh r0, [r2]\n"
+ "\tldr r1, _0800CECC\n"
+ "\tldr r2, _0800CED0\n"
+ "\tadds r0, r2, 0\n"
+ "\tstrh r0, [r1]\n"
+ "\tadds r1, 0x2\n"
+ "\tmovs r0, 0x3D\n"
+ "\tstrh r0, [r1]\n"
+ "\tadds r1, 0x6\n"
+ "\tldr r0, _0800CED4\n"
+ "\tldrh r0, [r0]\n"
+ "\tstrh r0, [r1]\n"
+ "\tadds r1, 0x2\n"
+ "\tldr r0, _0800CED8\n"
+ "\tldrh r0, [r0]\n"
+ "\tstrh r0, [r1]\n"
+ "\tldr r0, _0800CEDC\n"
+ "\tldrb r1, [r0]\n"
+ "\tcmp r1, 0\n"
+ "\tbeq _0800CEF4\n"
+ "\tldr r1, _0800CEE0\n"
+ "\tldr r0, _0800CEE4\n"
+ "\tldr r2, [r0]\n"
+ "\tadds r0, r2, 0x4\n"
+ "\tstr r0, [r1]\n"
+ "\tldr r3, _0800CEE8\n"
+ "\tstr r3, [r1, 0x4]\n"
+ "\tldr r0, _0800CEEC\n"
+ "\tstr r0, [r1, 0x8]\n"
+ "\tldr r0, [r1, 0x8]\n"
+ "\tldrh r0, [r2]\n"
+ "\tstrh r0, [r3]\n"
+ "\tsubs r1, 0x6E\n"
+ "\tldrh r0, [r2, 0x2]\n"
+ "\tstrh r0, [r1]\n"
+ "\tldr r0, _0800CEF0\n"
+ "\tmovs r1, 0xA0\n"
+ "\tb _0800CEFE\n"
+ "\t.align 2, 0\n"
+"_0800CEC0: .4byte 0x040000ba\n"
+"_0800CEC4: .4byte 0x0000cdff\n"
+"_0800CEC8: .4byte 0x00007fff\n"
+"_0800CECC: .4byte 0x04000048\n"
+"_0800CED0: .4byte 0x00003f3f\n"
+"_0800CED4: .4byte gUnknown_202D7FC\n"
+"_0800CED8: .4byte gUnknown_202D7FA\n"
+"_0800CEDC: .4byte gUnknown_2026E38\n"
+"_0800CEE0: .4byte 0x040000b0\n"
+"_0800CEE4: .4byte gUnknown_2026E3C\n"
+"_0800CEE8: .4byte 0x04000040\n"
+"_0800CEEC: .4byte 0xa2600002\n"
+"_0800CEF0: .4byte 0x04000044\n"
+"_0800CEF4:\n"
+ "\tldr r0, _0800CF08\n"
+ "\tstrh r1, [r0]\n"
+ "\tadds r0, 0x2\n"
+ "\tstrh r1, [r0]\n"
+ "\tadds r0, 0x2\n"
+"_0800CEFE:\n"
+ "\tstrh r1, [r0]\n"
+ "\tadds r0, 0x2\n"
+ "\tstrh r1, [r0]\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+"_0800CF08: .4byte 0x04000040");
+}
+#endif
diff --git a/src/main.c b/src/main.c
index 687ef6d..2d586a5 100644
--- a/src/main.c
+++ b/src/main.c
@@ -5,8 +5,16 @@
extern char ewram_start[];
+extern u8 gUnknown_202D4B8;
+extern void *gUnknown_202D5F0[6];
extern u16 gUnknown_202D7FC;
extern u8 gUnknown_202D7FE;
+extern u8 gInterruptsEnabled;
+extern u16 gUnknown_203B0AC;
+extern s16 gUnknown_203B0AE;
+extern u32 gIntrTable[];
+extern u32 IntrMain;
+
extern char alt_203B038[];
@@ -21,6 +29,7 @@ extern char unk_code_ram[];
extern char unk_code_ram_end[];
extern u8 gUnknown_80B9BF1[];
+extern u32 gUnknown_80B9C00;
extern char gUnknown_8270000[];
@@ -37,11 +46,20 @@ extern void sub_80057E8(void);
extern void InitFileSystem(void);
extern void sub_80098A0(void);
extern void InitGraphics(void);
-extern void sub_800B6F4(int, void *);
extern void GameLoop(void);
extern void Hang(void);
extern void sub_800CE54(void);
+extern void nullsub_17(void);
+extern void sub_800BD08(void); // music initializer
+extern void sub_800D6AC(void);
+extern void sub_800D7D0(void);
+
+bool8 EnableInterrupts(void);
+void InitIntrTable(const u32 *interrupt_table);
+void *sub_800B6F4(u32 index, void * new_callback);
+
+
void AgbMain(void)
{
u8 value[4];
@@ -76,16 +94,16 @@ void AgbMain(void)
REG_WIN1H = 0;
REG_WIN0V = 0;
REG_WIN1V = 0;
- REG_WININ = 16191;
- REG_WINOUT = 61;
- gUnknown_202D7FC = REG_BLDCNT = 15426;
- REG_BLDALPHA = 1546;
+ REG_WININ = WININ_WIN0_ALL | WININ_WIN1_ALL; // 16191
+ REG_WINOUT = WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR; // 61
+ gUnknown_202D7FC = REG_BLDCNT = BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_BD | BLDCNT_TGT2_OBJ; // 15426
+ REG_BLDALPHA = BLDALPHA_BLEND(10, 6); // 1546
gUnknown_202D7FE = 0;
- REG_BG0CNT = 11264;
- REG_BG1CNT = 11521;
- REG_BG2CNT = 11786;
- REG_BG3CNT = 12043;
- REG_DISPCNT = 32704;
+ REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_WRAP | BGCNT_SCREENBASE(12); // 11264
+ REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_WRAP | BGCNT_SCREENBASE(13); // 11521
+ REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_WRAP | BGCNT_SCREENBASE(14); // 11786
+ REG_BG3CNT = BGCNT_PRIORITY(3) | BGCNT_CHARBASE(2) | BGCNT_WRAP | BGCNT_SCREENBASE(15); // 12043
+ REG_DISPCNT = DISPCNT_WIN1_ON | DISPCNT_WIN0_ON | DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP | DISPCNT_FORCED_BLANK; // 32704
sub_800CDA8(1);
sub_800B540();
InitFlash();
@@ -102,7 +120,132 @@ void AgbMain(void)
sub_80098A0();
InitGraphics();
sub_800B6F4(1, sub_800CE54);
- REG_DISPCNT = 32576;
+ REG_DISPCNT = DISPCNT_WIN1_ON | DISPCNT_WIN0_ON | DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP; // 32576
GameLoop();
Hang();
}
+
+void sub_800B540(void)
+{
+ s32 i;
+ for (i = 0; i < 6; i++) {
+ gUnknown_202D5F0[i] = NULL;
+ }
+
+ nullsub_17();
+ sub_800BD08(); // initialize music and stop DMAs
+
+ while(REG_VCOUNT <= 159){}
+
+ REG_IE ^= INTR_FLAG_TIMER3 | INTR_FLAG_VBLANK | INTR_FLAG_VCOUNT; // 0x45
+
+ *(u8*)&REG_DISPCNT |= DISPCNT_FORCED_BLANK;
+
+ InitIntrTable(&gUnknown_80B9C00); // set up intrrupt vector/table
+
+ REG_TM3CNT = (TIMER_64CLK | TIMER_INTR_ENABLE | TIMER_ENABLE) << 16;
+
+ REG_IE |= INTR_FLAG_GAMEPAK | INTR_FLAG_TIMER3 | INTR_FLAG_VCOUNT | INTR_FLAG_VBLANK; // 0x2045
+ REG_DISPSTAT = DISPSTAT_VCOUNT_INTR | DISPSTAT_VBLANK_INTR;
+ gUnknown_203B0AE = -1;
+ gUnknown_203B0AC = 0;
+ sub_800D6AC(); // Some other IO REG update func
+ sub_800D7D0(); // Some other IO REG update func
+ gInterruptsEnabled = 1;
+ EnableInterrupts();
+
+ while(REG_VCOUNT <= 159){}
+}
+
+bool8 EnableInterrupts(void)
+{
+ if(!gInterruptsEnabled)
+ {
+ return FALSE;
+ }
+
+ if(REG_IME & 1)
+ {
+ return FALSE;
+ }
+ else
+ {
+ REG_IME = 1;
+ return TRUE;
+ }
+}
+
+bool8 DisableInterrupts(void)
+{
+ if(!gInterruptsEnabled)
+ {
+ return FALSE;
+ }
+
+ if(!(REG_IME & 1))
+ {
+ return FALSE;
+ }
+ else
+ {
+ REG_IME = 0;
+ return TRUE;
+ }
+
+}
+
+bool8 sub_800B650(void)
+{
+ if(!gInterruptsEnabled)
+ {
+ return FALSE;
+ }
+
+ if(REG_IME & 1)
+ {
+ return FALSE;
+ }
+ else
+ {
+ return TRUE;
+ }
+}
+
+void SetInterruptFlag(u16 flag)
+{
+ if(!gInterruptsEnabled)
+ {
+ return;
+ }
+
+ REG_IME = 0;
+ INTR_CHECK |= flag;
+ REG_IME = 1;
+}
+
+void InitIntrTable(const u32 *interrupt_table)
+{
+ CpuCopy32(interrupt_table, &gIntrTable, 0x18); // 0x18 = 0x6 * 4 (0x4f00 is 32 bits)
+ CpuCopy32(&IntrMain, &gUnknown_202D4B8, 0x120); // 0x120 = 0x48 * 4 (0x4f00 is 32 bits)
+ INTR_VECTOR = &gUnknown_202D4B8;
+}
+
+u32 *sub_800B6E8(u32 r0)
+{
+ return &gIntrTable[r0];
+}
+
+void *sub_800B6F4(u32 index, void * new_callback)
+{
+ void *old_callback;
+ u32 interrupt_var;
+
+ interrupt_var = DisableInterrupts();
+ old_callback = gUnknown_202D5F0[index];
+ gUnknown_202D5F0[index] = new_callback;
+ if(interrupt_var){
+ EnableInterrupts();
+ }
+ return old_callback;
+}
+
diff --git a/src/music_pre.c b/src/music_pre.c
index 292f0a8..4260ea1 100644
--- a/src/music_pre.c
+++ b/src/music_pre.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "gba/io_reg.h"
#include "m4a.h"
+#include "bg.h"
extern void nullsub_19(void);
extern void nullsub_20(u16 songIndex);
@@ -31,8 +32,62 @@ struct unkStruct_3000FD8
extern struct unkStruct_3000FD8 gUnknown_3000FD8[8];
+extern u8 gUnknown_202D7FE;
+extern u16 gUnknown_202D7FC;
+extern struct BGControlStruct gUnknown_202D698;
+extern struct BGControlStruct gUnknown_202D6A0;
+extern struct BGControlStruct gUnknown_202D6A8;
+extern struct BGControlStruct gUnknown_202D6B0;
+
void sub_800BF80(void);
+void nullsub_17(void)
+{
+}
+
+void UpdateBGControlRegisters(void)
+{
+ u32 BG[4];
+
+ if(gUnknown_202D7FE == 1)
+ {
+ BG[0] = 1;
+ BG[1] = 2;
+ BG[2] = 0;
+ BG[3] = 3;
+ }
+ else
+ {
+ BG[0] = 0;
+ BG[1] = 1;
+ BG[2] = 2;
+ BG[3] = 3;
+ }
+
+ REG_BG0HOFS = gUnknown_202D698.hofs;
+ REG_BG0VOFS = gUnknown_202D698.vofs;
+ REG_BG1HOFS = gUnknown_202D6A0.hofs;
+ REG_BG1VOFS = gUnknown_202D6A0.vofs;
+ REG_BG2HOFS = gUnknown_202D6A8.hofs;
+ REG_BG2VOFS = gUnknown_202D6A8.vofs;
+ REG_BG3HOFS = gUnknown_202D6B0.hofs;
+ REG_BG3VOFS = gUnknown_202D6B0.vofs;
+
+ REG_BG0CNT = BG[0] | 0xB0 << 6;
+ REG_BG1CNT = BG[1] | 0xB4 << 6;
+ if(gUnknown_202D6A8.unk2 == 0x80 << 8)
+ {
+ REG_BG2CNT = BG[2] | 0x2e08;
+ }
+ else
+ {
+ REG_BG2CNT = BG[2] | 0xB8 << 6;
+ }
+
+ REG_BG3CNT = BG[3] | 0x2f08;
+ REG_BLDCNT = gUnknown_202D7FC;
+}
+
// Some kind of initializer for music?
void sub_800BD08(void)
{