summaryrefslogtreecommitdiff
path: root/arm9/src/GX_layers.c
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/src/GX_layers.c')
-rw-r--r--arm9/src/GX_layers.c110
1 files changed, 110 insertions, 0 deletions
diff --git a/arm9/src/GX_layers.c b/arm9/src/GX_layers.c
new file mode 100644
index 00000000..a43a2277
--- /dev/null
+++ b/arm9/src/GX_layers.c
@@ -0,0 +1,110 @@
+#include "GX_layers.h"
+
+
+struct GX_LayerData layer_data;
+
+THUMB_FUNC void FUN_0201E66C(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;
+} \ No newline at end of file