summaryrefslogtreecommitdiff
path: root/src
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 /src
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
Diffstat (limited to 'src')
-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
6 files changed, 447 insertions, 222 deletions
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)
{