diff options
author | Seth Barberee <seth.barberee@gmail.com> | 2021-01-04 13:40:33 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-04 13:40:33 -0600 |
commit | 469212f7ee42d04e3160d357ed1f088f12edd391 (patch) | |
tree | ea53fd58f6dc9a42e38c3a7a78d6b7baa760a520 /src | |
parent | 87cd9885a9f8b38a76ab6add4a634e2a8a4837ee (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.c | 8 | ||||
-rw-r--r-- | src/code_800B5F0.c | 99 | ||||
-rw-r--r-- | src/code_800C9CC.c | 172 | ||||
-rw-r--r-- | src/cpu.c | 170 | ||||
-rw-r--r-- | src/main.c | 165 | ||||
-rw-r--r-- | src/music_pre.c | 55 |
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 @@ -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*)®_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) { |