diff options
author | Akira Akashi <rubenru09@aol.com> | 2021-03-23 09:15:14 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-23 09:15:14 +0000 |
commit | 41ed9de2d4c81986cce976f2d93923b70101ac3a (patch) | |
tree | d3e292aa1b4ca9f99a1feb194b21f3d29df53377 /arm9/src | |
parent | 11fdf1d630a743f3236135028ea51e818331210f (diff) | |
parent | 0faaad19be1e1b318404e9b9e8a7f1eda672d5de (diff) |
Merge pull request #344 from remicalixte/unk_0201E66C
Decompile unk_0201E66C.s to GX_layers.c
Diffstat (limited to 'arm9/src')
-rw-r--r-- | arm9/src/GX_layers.c | 110 | ||||
-rw-r--r-- | arm9/src/error_message_reset.c | 16 |
2 files changed, 116 insertions, 10 deletions
diff --git a/arm9/src/GX_layers.c b/arm9/src/GX_layers.c new file mode 100644 index 00000000..ce188876 --- /dev/null +++ b/arm9/src/GX_layers.c @@ -0,0 +1,110 @@ +#include "GX_layers.h" + + +struct GX_LayerData layer_data; + +THUMB_FUNC void GX_SetBanks(const struct GraphicsBanks *banks) +{ + GX_ResetBankForBG(); + GX_ResetBankForBGExtPltt(); + GX_ResetBankForSubBG(); + FUN_020C6034(); + GX_ResetBankForOBJ(); + GX_ResetBankForOBJExtPltt(); + FUN_020C605C(); + GX_ResetBankForSubOBJ(); + GX_ResetBankForTex(); + GX_ResetBankForTexPltt(); + + GX_SetBankForBG(banks->bg); + GX_SetBankForBGExtPltt(banks->bgextpltt); + GX_SetBankForSubBG(banks->subbg); + GX_SetBankForSubBGExtPltt(banks->subbgextpltt); + GX_SetBankForOBJ(banks->obj); + GX_SetBankForOBJExtPltt(banks->objextpltt); + GX_SetBankForSubOBJ(banks->subobj); + GX_SetBankForSubOBJExtPltt(banks->subobjextpltt); + GX_SetBankForTex(banks->tex); + GX_SetBankForTexPltt(banks->texpltt); +} + + +THUMB_FUNC void GX_DisableEngineALayers() +{ + layer_data.EngineA_DISPCNT_LayerMask = 0; +} + +THUMB_FUNC void GX_EngineAToggleLayers(u32 layer_mask, GX_LayerToggle layer_toggle) +{ + if (layer_toggle == GX_LAYER_TOGGLE_ON) + { + if ((layer_data.EngineA_DISPCNT_LayerMask & layer_mask) != 0) + { + return; + } + } + else + { + if ((layer_data.EngineA_DISPCNT_LayerMask & layer_mask) == 0) + { + return; + } + } + + reg_GX_DISPCNT = (reg_GX_DISPCNT & 0xFFFFE0FF) | (layer_data.EngineA_DISPCNT_LayerMask ^= layer_mask) << 8; +} + +THUMB_FUNC void GX_SetEngineALayers(u32 layer_mask) +{ + layer_data.EngineA_DISPCNT_LayerMask = layer_mask; + reg_GX_DISPCNT = (reg_GX_DISPCNT & 0xFFFFE0FF) | layer_mask << 8; +} + +THUMB_FUNC void GX_DisableEngineBLayers() +{ + layer_data.EngineB_DISPCNT_LayerMask = 0; +} + +THUMB_FUNC void GX_EngineBToggleLayers(u32 layer_mask, GX_LayerToggle layer_toggle) +{ + if (layer_toggle == GX_LAYER_TOGGLE_ON) + { + if ((layer_data.EngineB_DISPCNT_LayerMask & layer_mask) != 0) + { + return; + } + } + else + { + if ((layer_data.EngineB_DISPCNT_LayerMask & layer_mask) == 0) + { + return; + } + } + + reg_GXS_DB_DISPCNT = (reg_GXS_DB_DISPCNT & 0xFFFFE0FF) | (layer_data.EngineB_DISPCNT_LayerMask ^= layer_mask) << 8; +} + +THUMB_FUNC void GX_BothDispOn() +{ + GX_DispOn(); + + reg_GXS_DB_DISPCNT |= 0x10000; +} + +THUMB_FUNC void GX_SwapDisplay() +{ + if (gMain.unk65 == 0) + { + reg_GX_POWCNT |= 0x8000; //send display A to lower screen + } + else + { + reg_GX_POWCNT &= 0xFFFF7FFF; // sned display A to upper screen + } +} + +THUMB_FUNC u32 GX_GetEngineALayers() +{ + return layer_data.EngineA_DISPCNT_LayerMask; +} diff --git a/arm9/src/error_message_reset.c b/arm9/src/error_message_reset.c index 7d1caccb..3a727924 100644 --- a/arm9/src/error_message_reset.c +++ b/arm9/src/error_message_reset.c @@ -1,4 +1,5 @@ #include "error_message_reset.h" +#include "GX_layers.h" const u32 UNK_020FF49C[2] = { 0x1a030300, 0x00230112 }; @@ -13,9 +14,6 @@ const struct GraphicsBanks UNK_020FF4D8 = { bg : 3 }; u32 sErrorMessagePrinterLock; extern void FUN_0200E3A0(PMLCDTarget, int); -extern void FUN_0201E6D8(); -extern void FUN_0201E7A0(); -extern void FUN_0201E66C(const struct GraphicsBanks *banks); extern u32 *FUN_02016B94(u32 param0); extern void FUN_02016BBC(const struct GraphicsModes *modes); extern void FUN_02016C18(u32 *param0, u32 param1, void *param2, u32 param3); @@ -27,14 +25,12 @@ extern void FUN_02017FE4(u32 param0, u32 param1); extern void FUN_02019150(u32 *param0, u32 *param1, const u32 *param2); extern void FUN_020196F4(u32 *, u8, u16, u16, u16, u16); extern void FUN_0200CCA4(u32 *param0, u32 param1, u32 param2, u32 param3); -extern void FUN_0201E788(); extern void FUN_0200E394(u32 param0); extern void FUN_0200A274(u32 param0, u32 param1, u32 param2); extern BOOL FUN_02032DAC(void); extern BOOL FUN_0202FB80(void); extern BOOL FUN_02033678(void); extern void FUN_02019178(u32 *param0); -extern void FUN_0201E740(); THUMB_FUNC void VBlankHandler() { @@ -66,8 +62,8 @@ THUMB_FUNC void PrintErrorMessageAndReset() Main_SetVBlankIntrCB(NULL, NULL); FUN_02015F34(NULL, NULL); - FUN_0201E6D8(); - FUN_0201E740(); + GX_DisableEngineALayers(); + GX_DisableEngineBLayers(); reg_GX_DISPCNT &= 0xFFFFE0FF; reg_GXS_DB_DISPCNT &= 0xFFFFE0FF; @@ -75,14 +71,14 @@ THUMB_FUNC void PrintErrorMessageAndReset() FUN_0201669C(4, 8); gMain.unk65 = 0; - FUN_0201E7A0(); + GX_SwapDisplay(); reg_G2_BLDCNT = 0; reg_G2S_DB_BLDCNT = 0; reg_GX_DISPCNT &= 0xFFFF1FFF; reg_GXS_DB_DISPCNT &= 0xFFFF1FFF; - FUN_0201E66C(&UNK_020FF4D8); + GX_SetBanks(&UNK_020FF4D8); ptr = FUN_02016B94(0); FUN_02016BBC(&UNK_020FF4AC); @@ -109,7 +105,7 @@ THUMB_FUNC void PrintErrorMessageAndReset() AddTextPrinterParameterized((u32)buf, 0, (const u16 *)str, 0, 0, 0, NULL); // wtf String_dtor(str); - FUN_0201E788(); + GX_BothDispOn(); FUN_0200E394(0); FUN_0200E394(1); FUN_0200A274(0, 0x3f, 3); |