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/main.c | |
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/main.c')
-rw-r--r-- | src/main.c | 165 |
1 files changed, 154 insertions, 11 deletions
@@ -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; +} + |