summaryrefslogtreecommitdiff
path: root/arm9/src
diff options
context:
space:
mode:
authorAkira Akashi <rubenru09@aol.com>2021-03-23 09:15:14 +0000
committerGitHub <noreply@github.com>2021-03-23 09:15:14 +0000
commit41ed9de2d4c81986cce976f2d93923b70101ac3a (patch)
treed3e292aa1b4ca9f99a1feb194b21f3d29df53377 /arm9/src
parent11fdf1d630a743f3236135028ea51e818331210f (diff)
parent0faaad19be1e1b318404e9b9e8a7f1eda672d5de (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.c110
-rw-r--r--arm9/src/error_message_reset.c16
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);