summaryrefslogtreecommitdiff
path: root/arm9/src
diff options
context:
space:
mode:
authorAkira Akashi <rubenru09@aol.com>2021-06-10 22:42:43 +0100
committerGitHub <noreply@github.com>2021-06-10 22:42:43 +0100
commitaa185f6be5696ae4bd6c9f8093eb13a06cb2cc79 (patch)
tree8f56e977e7e4f69c1c48249118074f500857f195 /arm9/src
parent6bede5a9393e2796c110e6304f455293a240cd7b (diff)
parente8d0b49a6864d6077a5d7b1c123c49481fe14bfe (diff)
Merge branch 'master' into unkk_020851B8
Diffstat (limited to 'arm9/src')
-rw-r--r--arm9/src/GX_layers.c37
-rw-r--r--arm9/src/bg_window.c5456
-rw-r--r--arm9/src/error_message_reset.c70
-rw-r--r--arm9/src/filesystem.c30
-rw-r--r--arm9/src/gf_gfx_loader.c12
-rw-r--r--arm9/src/main.c3
-rw-r--r--arm9/src/poke_overlay.c19
-rw-r--r--arm9/src/scrcmd.c14
-rw-r--r--arm9/src/scrcmd_24.c140
-rw-r--r--arm9/src/script.c2
-rw-r--r--arm9/src/script_pokemon_util.c2
-rw-r--r--arm9/src/text_02054590.c22
-rw-r--r--arm9/src/timer3.c46
-rw-r--r--arm9/src/unk_0200BB14.c40
-rw-r--r--arm9/src/unk_02016B94.c8110
-rw-r--r--arm9/src/unk_0202E29C.c2
-rw-r--r--arm9/src/unk_0202F150.c11
17 files changed, 5621 insertions, 8395 deletions
diff --git a/arm9/src/GX_layers.c b/arm9/src/GX_layers.c
index f0ac9472..28147dbd 100644
--- a/arm9/src/GX_layers.c
+++ b/arm9/src/GX_layers.c
@@ -3,19 +3,19 @@
#include "gx.h"
#include "main.h"
-
-struct GX_LayerData layer_data;
+static u32 EngineA_DISPCNT_LayerMask;
+static u32 EngineB_DISPCNT_LayerMask;
THUMB_FUNC void GX_SetBanks(const struct GraphicsBanks *banks)
{
GX_ResetBankForBG();
GX_ResetBankForBGExtPltt();
GX_ResetBankForSubBG();
- FUN_020C6034();
+ GX_ResetBankForSubBGExtPltt();
GX_ResetBankForOBJ();
GX_ResetBankForOBJExtPltt();
- FUN_020C605C();
GX_ResetBankForSubOBJ();
+ GX_ResetBankForSubOBJExtPltt();
GX_ResetBankForTex();
GX_ResetBankForTexPltt();
@@ -34,80 +34,79 @@ THUMB_FUNC void GX_SetBanks(const struct GraphicsBanks *banks)
THUMB_FUNC void GX_DisableEngineALayers()
{
- layer_data.EngineA_DISPCNT_LayerMask = 0;
+ 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)
+ if ((EngineA_DISPCNT_LayerMask & layer_mask) != 0)
{
return;
}
}
else
{
- if ((layer_data.EngineA_DISPCNT_LayerMask & layer_mask) == 0)
+ if ((EngineA_DISPCNT_LayerMask & layer_mask) == 0)
{
return;
}
}
- reg_GX_DISPCNT = (reg_GX_DISPCNT & 0xFFFFE0FF) | (layer_data.EngineA_DISPCNT_LayerMask ^= layer_mask) << 8;
+ GX_SetVisiblePlane(EngineA_DISPCNT_LayerMask ^= layer_mask);
}
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;
+ EngineA_DISPCNT_LayerMask = layer_mask;
+ GX_SetVisiblePlane(layer_mask);
}
THUMB_FUNC void GX_DisableEngineBLayers()
{
- layer_data.EngineB_DISPCNT_LayerMask = 0;
+ 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)
+ if ((EngineB_DISPCNT_LayerMask & layer_mask) != 0)
{
return;
}
}
else
{
- if ((layer_data.EngineB_DISPCNT_LayerMask & layer_mask) == 0)
+ if ((EngineB_DISPCNT_LayerMask & layer_mask) == 0)
{
return;
}
}
- reg_GXS_DB_DISPCNT = (reg_GXS_DB_DISPCNT & 0xFFFFE0FF) | (layer_data.EngineB_DISPCNT_LayerMask ^= layer_mask) << 8;
+ GXS_SetVisiblePlane(EngineB_DISPCNT_LayerMask ^= layer_mask);
}
THUMB_FUNC void GX_BothDispOn()
{
GX_DispOn();
-
- reg_GXS_DB_DISPCNT |= 0x10000;
+ GXS_DispOn();
}
THUMB_FUNC void GX_SwapDisplay()
{
if (gMain.unk65 == 0)
{
- reg_GX_POWCNT |= 0x8000; //send display A to lower screen
+ GX_SetDispSelect(GX_DISP_SELECT_MAIN_SUB);
}
else
{
- reg_GX_POWCNT &= 0xFFFF7FFF; // sned display A to upper screen
+ GX_SetDispSelect(GX_DISP_SELECT_SUB_MAIN);
}
}
THUMB_FUNC u32 GX_GetEngineALayers()
{
- return layer_data.EngineA_DISPCNT_LayerMask;
+ return EngineA_DISPCNT_LayerMask;
}
diff --git a/arm9/src/bg_window.c b/arm9/src/bg_window.c
new file mode 100644
index 00000000..2986645f
--- /dev/null
+++ b/arm9/src/bg_window.c
@@ -0,0 +1,5456 @@
+#include "global.h"
+#include "bg_window.h"
+#include "GX_layers.h"
+#include "game_init.h"
+#include "gx.h"
+#include "heap.h"
+
+const u8 sTilemapWidthByBufferSize[] = {
+ [GF_BG_SCR_SIZE_128x128] = 0x10,
+ [GF_BG_SCR_SIZE_256x256] = 0x20,
+ [GF_BG_SCR_SIZE_256x512] = 0x20,
+ [GF_BG_SCR_SIZE_512x256] = 0x20,
+ [GF_BG_SCR_SIZE_512x512] = 0x20,
+ [GF_BG_SCR_SIZE_1024x1024] = 0x20,
+};
+
+void (*const sScheduleWindowCopyToVramFuncs[])(struct Window *) = {
+ ScheduleWindowCopyToVram_TextMode,
+ ScheduleWindowCopyToVram_AffineMode,
+ ScheduleWindowCopyToVram_TextMode,
+};
+
+void (*const sClearWindowTilemapAndCopyToVramFuncs[])(struct Window *) = {
+ ClearWindowTilemapAndCopyToVram_TextMode,
+ ClearWindowTilemapAndCopyToVram_AffineMode,
+ ClearWindowTilemapAndCopyToVram_TextMode,
+};
+
+void (*const sClearWindowTilemapAndScheduleTransferFuncs[])(struct Window *) = {
+ ClearWindowTilemapAndScheduleTransfer_TextMode,
+ ClearWindowTilemapAndScheduleTransfer_AffineMode,
+ ClearWindowTilemapAndScheduleTransfer_TextMode,
+};
+
+void (*const sPutWindowTilemapFuncs[])(struct Window *) = {
+ PutWindowTilemap_TextMode,
+ PutWindowTilemap_AffineMode,
+ PutWindowTilemap_TextMode,
+};
+
+void (*const sCopyWindowToVramFuncs[])(struct Window *) = {
+ CopyWindowToVram_TextMode,
+ CopyWindowToVram_AffineMode,
+ CopyWindowToVram_TextMode,
+};
+
+void (*const sClearWindowTilemapFuncs[])(struct Window *) = {
+ ClearWindowTilemapText,
+ ClearWindowTilemapAffine,
+ ClearWindowTilemapText,
+};
+
+THUMB_FUNC struct BgConfig *BgConfig_Alloc(u32 heap_id)
+{
+ struct BgConfig *ptr = AllocFromHeap(heap_id, sizeof(struct BgConfig));
+ memset(ptr, 0, sizeof(struct BgConfig));
+ ptr->heap_id = heap_id;
+ ptr->scrollScheduled = 0;
+ ptr->bufferTransferScheduled = 0;
+
+ return ptr;
+}
+
+THUMB_FUNC u32 BgConfig_GetHeapId(struct BgConfig *bgConfig)
+{
+ return bgConfig->heap_id;
+}
+
+THUMB_FUNC void SetBothScreensModesAndDisable(const struct GraphicsModes *modes)
+{
+ GX_SetGraphicsMode(modes->dispMode, modes->bgMode, modes->_2d3dMode);
+ GXS_SetGraphicsMode(modes->subMode);
+ GX_SetBGScrOffset(0);
+ GX_SetBGCharOffset(0);
+
+ GX_DisableEngineALayers();
+ GX_DisableEngineBLayers();
+}
+
+THUMB_FUNC void SetScreenModeAndDisable(const struct GraphicsModes *gfxModes, u32 whichScreen)
+{
+ if (whichScreen == 0)
+ {
+ GX_SetGraphicsMode(gfxModes->dispMode, gfxModes->bgMode, gfxModes->_2d3dMode);
+ GX_DisableEngineALayers();
+ }
+ else
+ {
+ GXS_SetGraphicsMode(gfxModes->subMode);
+ GX_DisableEngineBLayers();
+ }
+}
+
+THUMB_FUNC void InitBgFromTemplate(
+ struct BgConfig *bgConfig, u8 bgId, const struct BgTemplate *template, u8 bgMode)
+{
+ u8 screenSize = TranslateGFBgModePairToGXScreenSize(template->size, bgMode);
+ switch (bgId)
+ {
+ case GF_BG_LYR_MAIN_0:
+ GX_EngineAToggleLayers(GF_BG_LYR_MAIN_0_F, GX_LAYER_TOGGLE_ON);
+ G2_SetBG0Control(screenSize, template->colorMode, template->screenBase, template->charBase, template->bgExtPltt);
+ G2_SetBG0Priority(template->priority);
+ G2_BG0Mosaic(template->mosaic);
+ break;
+
+ case GF_BG_LYR_MAIN_1:
+ GX_EngineAToggleLayers(GF_BG_LYR_MAIN_1_F, GX_LAYER_TOGGLE_ON);
+ G2_SetBG1Control(screenSize, template->colorMode, template->screenBase, template->charBase, template->bgExtPltt);
+ G2_SetBG1Priority(template->priority);
+ G2_BG1Mosaic(template->mosaic);
+ break;
+
+ case GF_BG_LYR_MAIN_2:
+ GX_EngineAToggleLayers(GF_BG_LYR_MAIN_2_F, GX_LAYER_TOGGLE_ON);
+ switch (bgMode)
+ {
+ default:
+ case GF_BG_TYPE_TEXT:
+ G2_SetBG2ControlText(screenSize, template->colorMode, template->screenBase, template->charBase);
+ break;
+ case GF_BG_TYPE_AFFINE:
+ G2_SetBG2ControlAffine(screenSize, template->areaOver, template->screenBase, template->charBase);
+ break;
+ case GF_BG_TYPE_256x16PLTT:
+ G2_SetBG2Control256x16Pltt(screenSize, template->areaOver, template->screenBase, template->charBase);
+ break;
+ }
+ G2_SetBG2Priority(template->priority);
+ G2_BG2Mosaic(template->mosaic);
+ break;
+
+ case GF_BG_LYR_MAIN_3:
+ GX_EngineAToggleLayers(GF_BG_LYR_MAIN_3_F, GX_LAYER_TOGGLE_ON);
+ switch (bgMode)
+ {
+ default:
+ case GF_BG_TYPE_TEXT:
+ G2_SetBG3ControlText(screenSize, template->colorMode, template->screenBase, template->charBase);
+ break;
+ case GF_BG_TYPE_AFFINE:
+ G2_SetBG3ControlAffine(screenSize, template->areaOver, template->screenBase, template->charBase);
+ break;
+ case GF_BG_TYPE_256x16PLTT:
+ G2_SetBG3Control256x16Pltt(screenSize, template->areaOver, template->screenBase, template->charBase);
+ break;
+ }
+ G2_SetBG3Priority(template->priority);
+ G2_BG3Mosaic(template->mosaic);
+ break;
+
+ case GF_BG_LYR_SUB_0:
+ GX_EngineBToggleLayers(GF_BG_LYR_SUB_0_F, GX_LAYER_TOGGLE_ON);
+ G2S_SetBG0Control(screenSize, template->colorMode, template->screenBase, template->charBase, template->bgExtPltt);
+ G2S_SetBG0Priority(template->priority);
+ G2S_BG0Mosaic(template->mosaic);
+ break;
+
+ case GF_BG_LYR_SUB_1:
+ GX_EngineBToggleLayers(GF_BG_LYR_SUB_1_F, GX_LAYER_TOGGLE_ON);
+ G2S_SetBG1Control(screenSize, template->colorMode, template->screenBase, template->charBase, template->bgExtPltt);
+ G2S_SetBG1Priority(template->priority);
+ G2S_BG1Mosaic(template->mosaic);
+ break;
+
+ case GF_BG_LYR_SUB_2:
+ GX_EngineBToggleLayers(GF_BG_LYR_SUB_2_F, GX_LAYER_TOGGLE_ON);
+ switch (bgMode)
+ {
+ default:
+ case GF_BG_TYPE_TEXT:
+ G2S_SetBG2ControlText(screenSize, template->colorMode, template->screenBase, template->charBase);
+ break;
+ case GF_BG_TYPE_AFFINE:
+ G2S_SetBG2ControlAffine(screenSize, template->areaOver, template->screenBase, template->charBase);
+ break;
+ case GF_BG_TYPE_256x16PLTT:
+ G2S_SetBG2Control256x16Pltt(screenSize, template->areaOver, template->screenBase, template->charBase);
+ break;
+ }
+ G2S_SetBG2Priority(template->priority);
+ G2S_BG2Mosaic(template->mosaic);
+ break;
+
+ case GF_BG_LYR_SUB_3:
+ GX_EngineBToggleLayers(GF_BG_LYR_SUB_3_F, GX_LAYER_TOGGLE_ON);
+ switch (bgMode)
+ {
+ default:
+ case GF_BG_TYPE_TEXT:
+ G2S_SetBG3ControlText(screenSize, template->colorMode, template->screenBase, template->charBase);
+ break;
+ case GF_BG_TYPE_AFFINE:
+ G2S_SetBG3ControlAffine(screenSize, template->areaOver, template->screenBase, template->charBase);
+ break;
+ case GF_BG_TYPE_256x16PLTT:
+ G2S_SetBG3Control256x16Pltt(screenSize, template->areaOver, template->screenBase, template->charBase);
+ break;
+ }
+ G2S_SetBG3Priority(template->priority);
+ G2S_BG3Mosaic(template->mosaic);
+ break;
+ }
+
+ bgConfig->bgs[bgId].rotation = 0;
+ bgConfig->bgs[bgId].xScale = FX32_ONE;
+ bgConfig->bgs[bgId].yScale = FX32_ONE;
+ bgConfig->bgs[bgId].centerX = 0;
+ bgConfig->bgs[bgId].centerY = 0;
+
+ if (template->bufferSize != 0)
+ {
+ bgConfig->bgs[bgId].tilemapBuffer = AllocFromHeap(bgConfig->heap_id, template->bufferSize);
+
+ MI_CpuClear16(bgConfig->bgs[bgId].tilemapBuffer, template->bufferSize);
+
+ bgConfig->bgs[bgId].bufferSize = template->bufferSize;
+ bgConfig->bgs[bgId].baseTile = template->baseTile;
+ }
+ else
+ {
+ bgConfig->bgs[bgId].tilemapBuffer = NULL;
+ bgConfig->bgs[bgId].bufferSize = 0;
+ bgConfig->bgs[bgId].baseTile = 0;
+ }
+
+ bgConfig->bgs[bgId].size = template->size;
+ bgConfig->bgs[bgId].mode = bgMode;
+ bgConfig->bgs[bgId].colorMode = template->colorMode;
+
+ if (bgMode == GF_BG_TYPE_TEXT && template->colorMode == GX_BG_COLORMODE_16)
+ {
+ bgConfig->bgs[bgId].tileSize = 0x20;
+ }
+ else
+ {
+ bgConfig->bgs[bgId].tileSize = 0x40;
+ }
+
+ BgSetPosTextAndCommit(bgConfig, bgId, BG_POS_OP_SET_X, template->x);
+ BgSetPosTextAndCommit(bgConfig, bgId, BG_POS_OP_SET_Y, template->y);
+}
+
+THUMB_FUNC void SetBgControlParam(struct BgConfig *config, u8 bgId, u32 attr, u8 value)
+{
+ if (attr == GF_BG_CNT_SET_COLOR_MODE)
+ {
+ config->bgs[bgId].colorMode = value;
+ }
+
+ switch (bgId)
+ {
+ case GF_BG_LYR_MAIN_0:
+ GXBg01Control bg0cnt = G2_GetBG0Control();
+ if (attr == GF_BG_CNT_SET_SCREEN_BASE)
+ {
+ bg0cnt.screenBase = value;
+ }
+ else if (attr == GF_BG_CNT_SET_CHAR_BASE)
+ {
+ bg0cnt.charBase = value;
+ }
+
+ G2_SetBG0Control(bg0cnt.screenSize, config->bgs[bgId].colorMode, bg0cnt.screenBase, bg0cnt.charBase, bg0cnt.bgExtPltt);
+ break;
+ case GF_BG_LYR_MAIN_1:
+ GXBg01Control bg1cnt = G2_GetBG1Control();
+ if (attr == GF_BG_CNT_SET_SCREEN_BASE)
+ {
+ bg1cnt.screenBase = value;
+ }
+ else if (attr == GF_BG_CNT_SET_CHAR_BASE)
+ {
+ bg1cnt.charBase = value;
+ }
+
+ G2_SetBG1Control(bg1cnt.screenSize, config->bgs[bgId].colorMode, bg1cnt.screenBase, bg1cnt.charBase, bg1cnt.bgExtPltt);
+ break;
+ case GF_BG_LYR_MAIN_2:
+ switch (config->bgs[bgId].mode)
+ {
+ default:
+ case GF_BG_TYPE_TEXT:
+ GXBg23ControlText bg2cnt_tx = G2_GetBG2ControlText();
+ if (attr == GF_BG_CNT_SET_SCREEN_BASE)
+ {
+ bg2cnt_tx.screenBase = value;
+ }
+ else if (attr == GF_BG_CNT_SET_CHAR_BASE)
+ {
+ bg2cnt_tx.charBase = value;
+ }
+
+ G2_SetBG2ControlText(bg2cnt_tx.screenSize, config->bgs[bgId].colorMode, bg2cnt_tx.screenBase, bg2cnt_tx.charBase);
+ break;
+ case GF_BG_TYPE_AFFINE:
+ GXBg23ControlAffine bg2cnt_aff = G2_GetBG2ControlAffine();
+ if (attr == GF_BG_CNT_SET_SCREEN_BASE)
+ {
+ bg2cnt_aff.screenBase = value;
+ }
+ else if (attr == GF_BG_CNT_SET_CHAR_BASE)
+ {
+ bg2cnt_aff.charBase = value;
+ }
+
+ G2_SetBG2ControlAffine(bg2cnt_aff.screenSize, bg2cnt_aff.areaOver, bg2cnt_aff.screenBase,
+ bg2cnt_aff.charBase);
+ break;
+ case GF_BG_TYPE_256x16PLTT:
+ GXBg23Control256x16Pltt bg2cnt_256x16pltt = G2_GetBG2Control256x16Pltt();
+ if (attr == GF_BG_CNT_SET_SCREEN_BASE)
+ {
+ bg2cnt_256x16pltt.screenBase = value;
+ }
+ else if (attr == GF_BG_CNT_SET_CHAR_BASE)
+ {
+ bg2cnt_256x16pltt.charBase = value;
+ }
+
+ G2_SetBG2Control256x16Pltt(bg2cnt_256x16pltt.screenSize, bg2cnt_256x16pltt.areaOver,
+ bg2cnt_256x16pltt.screenBase, bg2cnt_256x16pltt.charBase);
+ break;
+ }
+ break;
+ case GF_BG_LYR_MAIN_3:
+ switch (config->bgs[bgId].mode)
+ {
+ default:
+ case GF_BG_TYPE_TEXT:
+ GXBg23ControlText bg3cnt_tx = G2_GetBG3ControlText();
+ if (attr == GF_BG_CNT_SET_SCREEN_BASE)
+ {
+ bg3cnt_tx.screenBase = value;
+ }
+ else if (attr == GF_BG_CNT_SET_CHAR_BASE)
+ {
+ bg3cnt_tx.charBase = value;
+ }
+
+ G2_SetBG3ControlText(bg3cnt_tx.screenSize, config->bgs[bgId].colorMode, bg3cnt_tx.screenBase, bg3cnt_tx.charBase);
+ break;
+ case GF_BG_TYPE_AFFINE:
+ GXBg23ControlAffine bg3cnt_aff = G2_GetBG3ControlAffine();
+ if (attr == GF_BG_CNT_SET_SCREEN_BASE)
+ {
+ bg3cnt_aff.screenBase = value;
+ }
+ else if (attr == GF_BG_CNT_SET_CHAR_BASE)
+ {
+ bg3cnt_aff.charBase = value;
+ }
+
+ G2_SetBG3ControlAffine(bg3cnt_aff.screenSize, bg3cnt_aff.areaOver, bg3cnt_aff.screenBase,
+ bg3cnt_aff.charBase);
+ break;
+ case GF_BG_TYPE_256x16PLTT:
+ GXBg23Control256x16Pltt bg3cnt_256x16pltt = G2_GetBG3Control256x16Pltt();
+ if (attr == GF_BG_CNT_SET_SCREEN_BASE)
+ {
+ bg3cnt_256x16pltt.screenBase = value;
+ }
+ else if (attr == GF_BG_CNT_SET_CHAR_BASE)
+ {
+ bg3cnt_256x16pltt.charBase = value;
+ }
+
+ G2_SetBG3Control256x16Pltt(bg3cnt_256x16pltt.screenSize, bg3cnt_256x16pltt.areaOver,
+ bg3cnt_256x16pltt.screenBase, bg3cnt_256x16pltt.charBase);
+ break;
+ }
+ break;
+ case GF_BG_LYR_SUB_0:
+ GXBg01Control bg0cntsub = G2S_GetBG0Control();
+ if (attr == GF_BG_CNT_SET_SCREEN_BASE)
+ {
+ bg0cntsub.screenBase = value;
+ }
+ else if (attr == GF_BG_CNT_SET_CHAR_BASE)
+ {
+ bg0cntsub.charBase = value;
+ }
+
+ G2S_SetBG0Control(bg0cntsub.screenSize, config->bgs[bgId].colorMode, bg0cntsub.screenBase, bg0cntsub.charBase, bg0cntsub.bgExtPltt);
+ break;
+ case GF_BG_LYR_SUB_1:
+ GXBg01Control bg1cntsub = G2S_GetBG1Control();
+ if (attr == GF_BG_CNT_SET_SCREEN_BASE)
+ {
+ bg1cntsub.screenBase = value;
+ }
+ else if (attr == GF_BG_CNT_SET_CHAR_BASE)
+ {
+ bg1cntsub.charBase = value;
+ }
+
+ G2S_SetBG1Control(bg1cntsub.screenSize, config->bgs[bgId].colorMode, bg1cntsub.screenBase, bg1cntsub.charBase, bg1cntsub.bgExtPltt);
+ break;
+ case GF_BG_LYR_SUB_2:
+ switch (config->bgs[bgId].mode)
+ {
+ default:
+ case GF_BG_TYPE_TEXT:
+ GXBg23ControlText bg2cntsub_tx = G2S_GetBG2ControlText();
+ if (attr == GF_BG_CNT_SET_SCREEN_BASE)
+ {
+ bg2cntsub_tx.screenBase = value;
+ }
+ else if (attr == GF_BG_CNT_SET_CHAR_BASE)
+ {
+ bg2cntsub_tx.charBase = value;
+ }
+
+ G2S_SetBG2ControlText(bg2cntsub_tx.screenSize, config->bgs[bgId].colorMode, bg2cntsub_tx.screenBase, bg2cntsub_tx.charBase);
+ break;
+ case GF_BG_TYPE_AFFINE:
+ GXBg23ControlAffine bg2cntsub_aff = G2S_GetBG2ControlAffine();
+ if (attr == GF_BG_CNT_SET_SCREEN_BASE)
+ {
+ bg2cntsub_aff.screenBase = value;
+ }
+ else if (attr == GF_BG_CNT_SET_CHAR_BASE)
+ {
+ bg2cntsub_aff.charBase = value;
+ }
+
+ G2S_SetBG2ControlAffine(bg2cntsub_aff.screenSize, bg2cntsub_aff.areaOver, bg2cntsub_aff.screenBase,
+ bg2cntsub_aff.charBase);
+ break;
+ case GF_BG_TYPE_256x16PLTT:
+ GXBg23Control256x16Pltt bg2cntsub_256x16pltt = G2S_GetBG2Control256x16Pltt();
+ if (attr == GF_BG_CNT_SET_SCREEN_BASE)
+ {
+ bg2cntsub_256x16pltt.screenBase = value;
+ }
+ else if (attr == GF_BG_CNT_SET_CHAR_BASE)
+ {
+ bg2cntsub_256x16pltt.charBase = value;
+ }
+
+ G2S_SetBG2Control256x16Pltt(bg2cntsub_256x16pltt.screenSize, bg2cntsub_256x16pltt.areaOver,
+ bg2cntsub_256x16pltt.screenBase, bg2cntsub_256x16pltt.charBase);
+ break;
+ }
+ break;
+ case GF_BG_LYR_SUB_3:
+ switch (config->bgs[bgId].mode)
+ {
+ default:
+ case GF_BG_TYPE_TEXT:
+ GXBg23ControlText bg3cntsub_tx = G2S_GetBG3ControlText();
+ if (attr == GF_BG_CNT_SET_SCREEN_BASE)
+ {
+ bg3cntsub_tx.screenBase = value;
+ }
+ else if (attr == GF_BG_CNT_SET_CHAR_BASE)
+ {
+ bg3cntsub_tx.charBase = value;
+ }
+
+ G2S_SetBG3ControlText(bg3cntsub_tx.screenSize, config->bgs[bgId].colorMode, bg3cntsub_tx.screenBase, bg3cntsub_tx.charBase);
+ break;
+ case GF_BG_TYPE_AFFINE:
+ GXBg23ControlAffine bg3cntsub_aff = G2S_GetBG3ControlAffine();
+ if (attr == GF_BG_CNT_SET_SCREEN_BASE)
+ {
+ bg3cntsub_aff.screenBase = value;
+ }
+ else if (attr == GF_BG_CNT_SET_CHAR_BASE)
+ {
+ bg3cntsub_aff.charBase = value;
+ }
+
+ G2S_SetBG3ControlAffine(bg3cntsub_aff.screenSize, bg3cntsub_aff.areaOver, bg3cntsub_aff.screenBase,
+ bg3cntsub_aff.charBase);
+ break;
+ case GF_BG_TYPE_256x16PLTT:
+ GXBg23Control256x16Pltt bg3cntsub_256x16pltt = G2S_GetBG3Control256x16Pltt();
+ if (attr == GF_BG_CNT_SET_SCREEN_BASE)
+ {
+ bg3cntsub_256x16pltt.screenBase = value;
+ }
+ else if (attr == GF_BG_CNT_SET_CHAR_BASE)
+ {
+ bg3cntsub_256x16pltt.charBase = value;
+ }
+
+ G2S_SetBG3Control256x16Pltt(bg3cntsub_256x16pltt.screenSize, bg3cntsub_256x16pltt.areaOver,
+ bg3cntsub_256x16pltt.screenBase, bg3cntsub_256x16pltt.charBase);
+ break;
+ }
+ break;
+ }
+}
+
+THUMB_FUNC u8 TranslateGFBgModePairToGXScreenSize(u8 size, u32 bgMode)
+{
+ switch (bgMode)
+ {
+ case GF_BG_TYPE_TEXT:
+
+ if (size == GF_BG_SCR_SIZE_256x256)
+ {
+ return GX_BG_SCRSIZE_TEXT_256x256;
+ }
+ else if (size == GF_BG_SCR_SIZE_256x512)
+ {
+ return GX_BG_SCRSIZE_TEXT_256x512;
+ }
+ else if (size == GF_BG_SCR_SIZE_512x256)
+ {
+ return GX_BG_SCRSIZE_TEXT_512x256;
+ }
+ else if (size == GF_BG_SCR_SIZE_512x512)
+ {
+ return GX_BG_SCRSIZE_TEXT_512x512;
+ }
+ break;
+
+ case GF_BG_TYPE_AFFINE:
+
+ if (size == GF_BG_SCR_SIZE_128x128)
+ {
+ return GX_BG_SCRSIZE_AFFINE_128x128;
+ }
+ else if (size == GF_BG_SCR_SIZE_256x256)
+ {
+ return GX_BG_SCRSIZE_AFFINE_256x256;
+ }
+ else if (size == GF_BG_SCR_SIZE_512x512)
+ {
+ return GX_BG_SCRSIZE_AFFINE_512x512;
+ }
+ else if (size == GF_BG_SCR_SIZE_1024x1024)
+ {
+ return GX_BG_SCRSIZE_AFFINE_1024x1024;
+ }
+ break;
+
+ case GF_BG_TYPE_256x16PLTT:
+
+ if (size == GF_BG_SCR_SIZE_128x128)
+ {
+ return GX_BG_SCRSIZE_256x16PLTT_128x128;
+ }
+ else if (size == GF_BG_SCR_SIZE_256x256)
+ {
+ return GX_BG_SCRSIZE_256x16PLTT_256x256;
+ }
+ else if (size == GF_BG_SCR_SIZE_512x512)
+ {
+ return GX_BG_SCRSIZE_256x16PLTT_512x512;
+ }
+ else if (size == GF_BG_SCR_SIZE_1024x1024)
+ {
+ return GX_BG_SCRSIZE_256x16PLTT_1024x1024;
+ }
+ break;
+ }
+
+ return GX_BG_SCRSIZE_TEXT_256x256; // GX_BG_SCRSIZE_AFFINE_128x128; GX_BG_SCRSIZE_256x16PLTT_128x128;
+}
+
+THUMB_FUNC void GetBgScreenDimensions(u32 screenSize, u8 *width_p, u8 *height_p)
+{
+ switch (screenSize)
+ {
+ case GF_BG_SCR_SIZE_128x128:
+ *width_p = 0x10;
+ *height_p = 0x10;
+ break;
+ case GF_BG_SCR_SIZE_256x256:
+ *width_p = 0x20;
+ *height_p = 0x20;
+ break;
+ case GF_BG_SCR_SIZE_256x512:
+ *width_p = 0x20;
+ *height_p = 0x40;
+ break;
+ case GF_BG_SCR_SIZE_512x256:
+ *width_p = 0x40;
+ *height_p = 0x20;
+ break;
+ case GF_BG_SCR_SIZE_512x512:
+ *width_p = 0x40;
+ *height_p = 0x40;
+ break;
+ case GF_BG_SCR_SIZE_1024x1024:
+ *width_p = 0x80;
+ *height_p = 0x80;
+ break;
+ }
+}
+
+THUMB_FUNC void FreeBgTilemapBuffer(struct BgConfig *bgConfig, u32 bgId)
+{
+ if (bgConfig->bgs[bgId].tilemapBuffer != NULL)
+ {
+ FreeToHeap(bgConfig->bgs[bgId].tilemapBuffer);
+ bgConfig->bgs[bgId].tilemapBuffer = NULL;
+ }
+}
+
+THUMB_FUNC void SetBgPriority(u32 bgId, u16 priority)
+{
+ switch (bgId)
+ {
+ case GF_BG_LYR_MAIN_0:
+ G2_SetBG0Priority(priority);
+ break;
+ case GF_BG_LYR_MAIN_1:
+ G2_SetBG1Priority(priority);
+ break;
+ case GF_BG_LYR_MAIN_2:
+ G2_SetBG2Priority(priority);
+ break;
+ case GF_BG_LYR_MAIN_3:
+ G2_SetBG3Priority(priority);
+ break;
+ case GF_BG_LYR_SUB_0:
+ G2S_SetBG0Priority(priority);
+ break;
+ case GF_BG_LYR_SUB_1:
+ G2S_SetBG1Priority(priority);
+ break;
+ case GF_BG_LYR_SUB_2:
+ G2S_SetBG2Priority(priority);
+ break;
+ case GF_BG_LYR_SUB_3:
+ G2S_SetBG3Priority(priority);
+ break;
+ }
+}
+
+THUMB_FUNC void ToggleBgLayer(u32 bgId, GX_LayerToggle toggle)
+{
+ switch (bgId)
+ {
+ case GF_BG_LYR_MAIN_0:
+ GX_EngineAToggleLayers(GF_BG_LYR_MAIN_0_F, toggle);
+ break;
+ case GF_BG_LYR_MAIN_1:
+ GX_EngineAToggleLayers(GF_BG_LYR_MAIN_1_F, toggle);
+ break;
+ case GF_BG_LYR_MAIN_2:
+ GX_EngineAToggleLayers(GF_BG_LYR_MAIN_2_F, toggle);
+ break;
+ case GF_BG_LYR_MAIN_3:
+ GX_EngineAToggleLayers(GF_BG_LYR_MAIN_3_F, toggle);
+ break;
+ case GF_BG_LYR_SUB_0:
+ GX_EngineBToggleLayers(GF_BG_LYR_SUB_0_F, toggle);
+ break;
+ case GF_BG_LYR_SUB_1:
+ GX_EngineBToggleLayers(GF_BG_LYR_SUB_1_F, toggle);
+ break;
+ case GF_BG_LYR_SUB_2:
+ GX_EngineBToggleLayers(GF_BG_LYR_SUB_2_F, toggle);
+ break;
+ case GF_BG_LYR_SUB_3:
+ GX_EngineBToggleLayers(GF_BG_LYR_SUB_3_F, toggle);
+ break;
+ }
+}
+
+THUMB_FUNC void BgSetPosTextAndCommit(struct BgConfig *bgConfig, u32 bgId, u32 op, fx32 val)
+{
+ Bg_SetPosText(&bgConfig->bgs[bgId], op, val);
+
+ u32 x = (u32)bgConfig->bgs[bgId].hOffset;
+ u32 y = (u32)bgConfig->bgs[bgId].vOffset;
+ switch (bgId)
+ {
+ case GF_BG_LYR_MAIN_0:
+ G2_SetBG0Offset(x, y);
+ break;
+ case GF_BG_LYR_MAIN_1:
+ G2_SetBG1Offset(x, y);
+ break;
+ case GF_BG_LYR_MAIN_2:
+ if (bgConfig->bgs[GF_BG_LYR_MAIN_2].mode == 0)
+ {
+ G2_SetBG2Offset(x, y);
+ }
+ else
+ {
+ BgAffineReset(bgConfig, GF_BG_LYR_MAIN_2);
+ }
+
+ break;
+ case GF_BG_LYR_MAIN_3:
+ if (bgConfig->bgs[GF_BG_LYR_MAIN_3].mode == 0)
+ {
+ G2_SetBG3Offset(x, y);
+ }
+ else
+ {
+ BgAffineReset(bgConfig, GF_BG_LYR_MAIN_3);
+ }
+ break;
+ case GF_BG_LYR_SUB_0:
+ G2S_SetBG0Offset(x, y);
+ break;
+ case GF_BG_LYR_SUB_1:
+ G2S_SetBG1Offset(x, y);
+ break;
+ case GF_BG_LYR_SUB_2:
+ if (bgConfig->bgs[GF_BG_LYR_SUB_2].mode == 0)
+ {
+ G2S_SetBG2Offset(x, y);
+ }
+ else
+ {
+ BgAffineReset(bgConfig, GF_BG_LYR_SUB_2);
+ }
+ break;
+ case GF_BG_LYR_SUB_3:
+ if (bgConfig->bgs[GF_BG_LYR_SUB_3].mode == 0)
+ {
+ G2S_SetBG3Offset(x, y);
+ }
+ else
+ {
+ BgAffineReset(bgConfig, GF_BG_LYR_SUB_3);
+ }
+ break;
+ }
+}
+
+THUMB_FUNC fx32 Bg_GetXpos(struct BgConfig *bgConfig, u32 bgId)
+{
+ return bgConfig->bgs[bgId].hOffset;
+}
+
+THUMB_FUNC fx32 Bg_GetYpos(struct BgConfig *bgConfig, u32 bgId)
+{
+ return bgConfig->bgs[bgId].vOffset;
+}
+
+THUMB_FUNC void Bg_SetTextDimAndAffineParams(struct BgConfig *bgConfig,
+ u32 bgId,
+ u32 txOp,
+ fx32 txVal,
+ struct Mtx22 *mtx,
+ fx32 centerX,
+ fx32 centerY)
+{
+ Bg_SetPosText(&bgConfig->bgs[bgId], txOp, txVal);
+ SetBgAffine(bgConfig, bgId, mtx, centerX, centerY);
+}
+
+THUMB_FUNC void Bg_SetPosText(struct Bg *bg, u32 op, fx32 val)
+{
+ switch (op)
+ {
+ case BG_POS_OP_SET_X:
+ bg->hOffset = val;
+ break;
+ case BG_POS_OP_ADD_X:
+ bg->hOffset += val;
+ break;
+ case BG_POS_OP_SUB_X:
+ bg->hOffset -= val;
+ break;
+ case BG_POS_OP_SET_Y:
+ bg->vOffset = val;
+ break;
+ case BG_POS_OP_ADD_Y:
+ bg->vOffset += val;
+ break;
+ case BG_POS_OP_SUB_Y:
+ bg->vOffset -= val;
+ break;
+ }
+}
+
+THUMB_FUNC void SetBgAffine(
+ struct BgConfig *bgConfig, u32 bgId, struct Mtx22 *mtx, fx32 centerX, fx32 centerY)
+{
+ switch (bgId)
+ {
+ case GF_BG_LYR_MAIN_2:
+ G2_SetBG2Affine(mtx, centerX, centerY, bgConfig->bgs[bgId].hOffset, bgConfig->bgs[bgId].vOffset);
+ break;
+ case GF_BG_LYR_MAIN_3:
+ G2_SetBG3Affine(mtx, centerX, centerY, bgConfig->bgs[bgId].hOffset, bgConfig->bgs[bgId].vOffset);
+ break;
+ case GF_BG_LYR_SUB_2:
+ G2S_SetBG2Affine(mtx, centerX, centerY, bgConfig->bgs[bgId].hOffset, bgConfig->bgs[bgId].vOffset);
+ break;
+ case GF_BG_LYR_SUB_3:
+ G2S_SetBG3Affine(mtx, centerX, centerY, bgConfig->bgs[bgId].hOffset, bgConfig->bgs[bgId].vOffset);
+ break;
+ }
+}
+
+THUMB_FUNC void BgAffineReset(struct BgConfig *bgConfig, u32 bgId)
+{
+ struct Mtx22 mtx;
+ MTX22_2DAffine(&mtx, 0, FX32_ONE, FX32_ONE, 0);
+ SetBgAffine(bgConfig, bgId, &mtx, 0, 0);
+}
+
+THUMB_FUNC void CopyOrUncompressTilemapData(const void *src, void *dest, u32 size)
+{
+ if (size == 0)
+ {
+ MI_UncompressLZ8(src, dest);
+ return;
+ }
+
+ if (((u32)src % 4) == 0 && ((u32)dest % 4) == 0 && ((u16)size % 4) == 0)
+ {
+ MI_CpuCopy32(src, dest, size);
+ return;
+ }
+
+ MI_CpuCopy16(src, dest, size);
+}
+
+THUMB_FUNC void BgCommitTilemapBufferToVram(struct BgConfig *bgConfig, u32 bgId)
+{
+ BgCopyOrUncompressTilemapBufferRangeToVram(bgConfig,
+ bgId,
+ bgConfig->bgs[bgId].tilemapBuffer,
+ bgConfig->bgs[bgId].bufferSize,
+ bgConfig->bgs[bgId].baseTile);
+}
+
+THUMB_FUNC void BgCopyOrUncompressTilemapBufferRangeToVram(
+ struct BgConfig *bgConfig, u32 bgId, u32 *src, u32 size, u32 tileOffset)
+{
+ if (size == 0)
+ {
+ void *tilemapBuffer = bgConfig->bgs[bgId].tilemapBuffer;
+ if (tilemapBuffer != 0)
+ {
+ CopyOrUncompressTilemapData(src, tilemapBuffer, size);
+ LoadBgVramScr(bgId, tilemapBuffer, bgConfig->bgs[bgId].baseTile * 2, bgConfig->bgs[bgId].bufferSize);
+ return;
+ }
+
+ u32 uncompSize = src[0] >> 8;
+ void *ptr = AllocFromHeapAtEnd(bgConfig->heap_id, uncompSize);
+ CopyOrUncompressTilemapData(src, ptr, size);
+ LoadBgVramScr(bgId, ptr, tileOffset * 2, uncompSize);
+ FreeToHeap(ptr);
+ return;
+ }
+
+ LoadBgVramScr(bgId, src, tileOffset * 2, size);
+}
+
+THUMB_FUNC void LoadBgVramScr(u32 bgId, void *buffer_p, u32 offset, u32 size)
+{
+ DC_FlushRange(buffer_p, size);
+
+ switch (bgId)
+ {
+ case 0:
+ GX_LoadBG0Scr(buffer_p, offset, size);
+ break;
+ case 1:
+ GX_LoadBG1Scr(buffer_p, offset, size);
+ break;
+ case 2:
+ GX_LoadBG2Scr(buffer_p, offset, size);
+ break;
+ case 3:
+ GX_LoadBG3Scr(buffer_p, offset, size);
+ break;
+ case 4:
+ GXS_LoadBG0Scr(buffer_p, offset, size);
+ break;
+ case 5:
+ GXS_LoadBG1Scr(buffer_p, offset, size);
+ break;
+ case 6:
+ GXS_LoadBG2Scr(buffer_p, offset, size);
+ break;
+ case 7:
+ GXS_LoadBG3Scr(buffer_p, offset, size);
+ break;
+ }
+}
+
+THUMB_FUNC void BG_LoadScreenTilemapData(
+ struct BgConfig *bgConfig, u32 bgId, void *src, u32 numTiles)
+{
+ CopyOrUncompressTilemapData(src, bgConfig->bgs[bgId].tilemapBuffer, numTiles);
+}
+
+THUMB_FUNC void BG_LoadCharTilesData(
+ struct BgConfig *bgConfig, u32 bgId, u32 *charData, u32 offset, u32 numTiles)
+{
+ if (bgConfig->bgs[bgId].colorMode == GX_BG_COLORMODE_16)
+ {
+ BG_LoadCharPixelData(bgConfig, bgId, charData, offset, numTiles << 5);
+ return;
+ }
+ BG_LoadCharPixelData(bgConfig, bgId, charData, offset, numTiles << 6);
+}
+
+THUMB_FUNC void BG_LoadCharPixelData(
+ struct BgConfig *bgConfig, u32 bgId, u32 *charData, u32 size, u32 offset)
+{
+ if (size == 0)
+ {
+
+ u32 uncompressedSize = charData[0] >> 8;
+ void *ptr = AllocFromHeapAtEnd(bgConfig->heap_id, uncompressedSize);
+ CopyOrUncompressTilemapData(charData, ptr, size);
+ LoadBgVramChar(bgId, ptr, offset, uncompressedSize);
+ FreeToHeap(ptr);
+ return;
+ }
+
+ LoadBgVramChar(bgId, charData, offset, size);
+}
+
+THUMB_FUNC void LoadBgVramChar(u32 bgId, void *buffer_p, u32 offset, u32 size)
+{
+ DC_FlushRange(buffer_p, size);
+
+ switch (bgId)
+ {
+ case GF_BG_LYR_MAIN_0:
+ GX_LoadBG0Char(buffer_p, offset, size);
+ break;
+ case GF_BG_LYR_MAIN_1:
+ GX_LoadBG1Char(buffer_p, offset, size);
+ break;
+ case GF_BG_LYR_MAIN_2:
+ GX_LoadBG2Char(buffer_p, offset, size);
+ break;
+ case GF_BG_LYR_MAIN_3:
+ GX_LoadBG3Char(buffer_p, offset, size);
+ break;
+ case GF_BG_LYR_SUB_0:
+ GXS_LoadBG0Char(buffer_p, offset, size);
+ break;
+ case GF_BG_LYR_SUB_1:
+ GXS_LoadBG1Char(buffer_p, offset, size);
+ break;
+ case GF_BG_LYR_SUB_2:
+ GXS_LoadBG2Char(buffer_p, offset, size);
+ break;
+ case GF_BG_LYR_SUB_3:
+ GXS_LoadBG3Char(buffer_p, offset, size);
+ break;
+ }
+}
+
+THUMB_FUNC void BG_ClearCharDataRange(u32 bgId, u32 size, u32 offset, u32 heap_id)
+{
+ void *ptr = AllocFromHeapAtEnd(heap_id, size);
+ memset(ptr, 0, size);
+
+ LoadBgVramChar(bgId, ptr, offset, size);
+ FreeToHeapExplicit(heap_id, ptr);
+}
+
+THUMB_FUNC void BG_FillCharDataRange(
+ struct BgConfig *param0, u32 bgId, u32 fillValue, u32 count, u32 offset)
+{
+ void *st4;
+ u32 size = count * param0->bgs[bgId].tileSize;
+ u32 r5 = fillValue;
+ st4 = AllocFromHeapAtEnd(param0->heap_id, size);
+
+ if (param0->bgs[bgId].tileSize == 0x20)
+ {
+ r5 = (r5 << 0xc | r5 << 0x8 | r5 << 0x4 | r5);
+ r5 |= r5 << 0x10;
+ }
+ else
+ {
+ r5 = r5 << 0x18 | r5 << 0x10 | r5 << 8 | r5;
+ }
+
+ MI_CpuFillFast(st4, r5, size);
+
+ LoadBgVramChar((u8)bgId, st4, param0->bgs[bgId].tileSize * offset, size);
+ FreeToHeap(st4);
+}
+
+THUMB_FUNC void BG_LoadPlttData(u32 bgId, void *plttData, u32 size, u32 offset)
+{
+ DC_FlushRange(plttData, size);
+ if (bgId < GF_BG_LYR_MAIN_CNT)
+ {
+ GX_LoadBGPltt(plttData, offset, size);
+ return;
+ }
+
+ GXS_LoadBGPltt(plttData, offset, size);
+}
+
+THUMB_FUNC void BG_SetMaskColor(u32 bgId, u32 value)
+{
+ BG_LoadPlttData(bgId, &value, 2, 0);
+}
+
+THUMB_FUNC u16 GetTileMapIndexFromCoords(u8 x, u8 y, u8 screenSize)
+{
+ switch (screenSize)
+ {
+ case GF_BG_SCR_SIZE_128x128:
+ return (u16)(x + (y << 4));
+ case GF_BG_SCR_SIZE_256x256:
+ case GF_BG_SCR_SIZE_256x512:
+ return (u16)(x + (y << 5));
+ case GF_BG_SCR_SIZE_512x256:
+ return (u16)((x & 0x1f) + ((y + (x & ~0x1f)) << 5));
+ case GF_BG_SCR_SIZE_512x512:
+ u16 res = (u16)(((u16)((x >> 5) + (y >> 5) * 2)) << 10);
+ res += (x & 0x1f) + ((y & 0x1f) << 5);
+ return res;
+ case GF_BG_SCR_SIZE_1024x1024:
+ return 0;
+ }
+
+ return x;
+}
+
+THUMB_FUNC u16 GetSrcTileMapIndexFromCoords(u8 x, u8 y, u8 width, u8 height)
+{
+ u8 coordType = 0;
+ u16 r3 = 0;
+ s16 r4 = (s16)(width - 32);
+ s16 r5 = (s16)(height - 32);
+
+ if (((u32)x >> 5) != 0)
+ {
+ coordType++;
+ }
+
+ if (((u32)y >> 5) != 0)
+ {
+ coordType += 2;
+ }
+
+ switch (coordType)
+ {
+ case 0:
+ if (r4 >= 0)
+ {
+ r3 += x + (y << 5);
+ }
+ else
+ {
+ r3 += x + y * width;
+ }
+ break;
+ case 1:
+ if (r5 >= 0)
+ {
+ r3 += 0x400;
+ }
+ else
+ {
+ r3 += (height << 5);
+ }
+
+ r3 += (x & 0x1f) + y * r4;
+ break;
+ case 2:
+ r3 += width << 5;
+ if (r4 >= 0)
+ {
+ r3 += x + ((y & 0x1f) << 5);
+ }
+ else
+ {
+ r3 += x + (y & 0x1f) * width;
+ }
+ break;
+ case 3:
+ r3 += (width + r5) << 5;
+ r3 += (x & 0x1f) + (y & 0x1f) * r4;
+ break;
+ }
+
+ return r3;
+}
+
+THUMB_FUNC void LoadRectToBgTilemapRect(struct BgConfig *bgConfig,
+ u32 bgId,
+ void *src,
+ u8 dstX,
+ u8 dstY,
+ u8 width,
+ u8 height)
+{
+ CopyToBgTilemapRect(bgConfig, bgId, dstX, dstY, width, height, src, 0, 0, width, height);
+}
+
+THUMB_FUNC void CopyToBgTilemapRect(struct BgConfig *bgConfig,
+ u32 bgId,
+ u8 dstX,
+ u8 dstY,
+ u8 dstWidth,
+ u8 dstHeight,
+ void *src,
+ u8 srcX,
+ u8 srcY,
+ u8 srcWidth,
+ u8 srcHeight)
+{
+ if (bgConfig->bgs[bgId].mode != 1)
+ {
+ CopyBgTilemapRectText(&bgConfig->bgs[bgId],
+ dstX,
+ dstY,
+ dstWidth,
+ dstHeight,
+ (u16 *) src,
+ srcX,
+ srcY,
+ srcWidth,
+ srcHeight,
+ 0);
+ }
+ else
+ {
+ CopyBgTilemapRectAffine(&bgConfig->bgs[bgId],
+ dstX,
+ dstY,
+ dstWidth,
+ dstHeight,
+ (u8 *) src,
+ srcX,
+ srcY,
+ srcWidth,
+ srcHeight,
+ 0);
+ }
+}
+
+THUMB_FUNC void CopyRectToBgTilemapRect(struct BgConfig *bgConfig,
+ u32 bgId,
+ u8 dstX,
+ u8 dstY,
+ u8 dstWidth,
+ u8 dstHeight,
+ void *src,
+ u8 srcX,
+ u8 srcY,
+ u8 srcWidth,
+ u8 srcHeight)
+{
+ if (bgConfig->bgs[bgId].mode != 1)
+ {
+ CopyBgTilemapRectText(&bgConfig->bgs[bgId],
+ dstX,
+ dstY,
+ dstWidth,
+ dstHeight,
+ (u16 *) src,
+ srcX,
+ srcY,
+ srcWidth,
+ srcHeight,
+ TRUE);
+ }
+ else
+ {
+ CopyBgTilemapRectAffine(&bgConfig->bgs[bgId],
+ dstX,
+ dstY,
+ dstWidth,
+ dstHeight,
+ (u8 *) src,
+ srcX,
+ srcY,
+ srcWidth,
+ srcHeight,
+ TRUE);
+ }
+}
+
+THUMB_FUNC void CopyBgTilemapRectText(struct Bg *bg,
+ u8 dstX,
+ u8 dstY,
+ u8 dstWidth,
+ u8 dstHeight,
+ u16 *src,
+ u8 srcX,
+ u8 srcY,
+ u8 srcWidth,
+ u8 srcHeight,
+ u8 adjustForSrcDims)
+{
+ u16 *tilemapBuffer = bg->tilemapBuffer;
+
+ if (tilemapBuffer == 0)
+ {
+ return;
+ }
+
+ u8 screenWidth;
+ u8 screenHeight;
+ GetBgScreenDimensions(bg->size, &screenWidth, &screenHeight);
+
+ u8 i;
+ u8 j;
+ if (adjustForSrcDims == 0)
+ {
+ for (i = 0; i < dstHeight; i++)
+ {
+
+ if (dstY + i >= screenHeight)
+ {
+ break;
+ }
+
+ if (srcY + i >= srcHeight)
+ {
+ break;
+ }
+
+ for (j = 0; j < dstWidth; j++)
+ {
+
+ if (dstX + j >= screenWidth)
+ {
+ break;
+ }
+
+ if (srcX + j >= srcWidth)
+ {
+ break;
+ }
+
+ ((u16 *)tilemapBuffer)[GetTileMapIndexFromCoords((u8) (dstX + j), (u8) (dstY + i), bg->size)] =
+ src[srcX + srcWidth * (srcY + i) + j];
+ }
+ }
+ }
+ else
+ {
+ for (i = 0; i < dstHeight; i++)
+ {
+
+ if (dstY + i >= screenHeight)
+ {
+ break;
+ }
+
+ if (srcY + i >= srcHeight)
+ {
+ break;
+ }
+
+ for (j = 0; j < dstWidth; j++)
+ {
+
+ if (dstX + j >= screenWidth)
+ {
+ break;
+ }
+
+ if (srcX + j >= srcWidth)
+ {
+ break;
+ }
+
+ ((u16 *)tilemapBuffer)[GetTileMapIndexFromCoords((u8) (dstX + j), (u8) (dstY + i), bg->size)] =
+ src[GetSrcTileMapIndexFromCoords((u8) (srcX + j), (u8) (srcY + i), srcWidth, srcHeight)];
+ }
+ }
+ }
+}
+
+THUMB_FUNC void CopyBgTilemapRectAffine(struct Bg *bg,
+ u8 dstX,
+ u8 dstY,
+ u8 dstWidth,
+ u8 dstHeight,
+ u8 *src,
+ u8 srcX,
+ u8 srcY,
+ u8 srcWidth,
+ u8 srcHeight,
+ u8 adjustForSrcDims)
+{
+ void *tilemapBuffer = bg->tilemapBuffer;
+
+ if (tilemapBuffer == 0)
+ {
+ return;
+ }
+
+ u8 screenWidth;
+ u8 screenHeight;
+ GetBgScreenDimensions(bg->size, &screenWidth, &screenHeight);
+
+ u8 i;
+ u8 j;
+ if (adjustForSrcDims == 0)
+ {
+ for (i = 0; i < dstHeight; i++)
+ {
+
+ if (dstY + i >= screenHeight)
+ {
+ break;
+ }
+
+ if (srcY + i >= srcHeight)
+ {
+ break;
+ }
+
+ for (j = 0; j < dstWidth; j++)
+ {
+
+ if (dstX + j >= screenWidth)
+ {
+ break;
+ }
+
+ if (srcX + j >= srcWidth)
+ {
+ break;
+ }
+
+ ((u8 *)tilemapBuffer)[GetTileMapIndexFromCoords((u8) (dstX + j), (u8) (dstY + i), bg->size)] =
+ src[srcX + srcWidth * (srcY + i) + j];
+ }
+ }
+ }
+ else
+ {
+ for (i = 0; i < dstHeight; i++)
+ {
+
+ if (dstY + i >= screenHeight)
+ {
+ break;
+ }
+
+ if (srcY + i >= srcHeight)
+ {
+ break;
+ }
+
+ for (j = 0; j < dstWidth; j++)
+ {
+
+ if (dstX + j >= screenWidth)
+ {
+ break;
+ }
+
+ if (srcX + j >= srcWidth)
+ {
+ break;
+ }
+
+ ((u8 *)tilemapBuffer)[GetTileMapIndexFromCoords((u8) (dstX + j), (u8) (dstY + i), bg->size)] =
+ src[GetSrcTileMapIndexFromCoords((u8) (srcX + j), (u8) (srcY + i), srcWidth, srcHeight)];
+ }
+ }
+ }
+}
+
+THUMB_FUNC void FillBgTilemapRect(struct BgConfig *bgConfig,
+ u32 bgId,
+ u16 fillValue,
+ u8 x,
+ u8 y,
+ u8 width,
+ u8 height,
+ u8 paletteNum)
+{
+ if (bgConfig->bgs[bgId].mode != 1)
+ {
+
+ FillBgTilemapRectText(&bgConfig->bgs[bgId], fillValue, x, y, width, height, paletteNum);
+ }
+ else
+ {
+ FillBgTilemapRectAffine(&bgConfig->bgs[bgId], (u8) fillValue, x, y, width, height);
+ }
+}
+
+THUMB_FUNC void FillBgTilemapRectText(struct Bg *bg,
+ u16 fillValue,
+ u8 x,
+ u8 y,
+ u8 width,
+ u8 height,
+ u8 paletteNum)
+{
+ void *tilemapBuffer = bg->tilemapBuffer;
+
+ if (tilemapBuffer != 0)
+ {
+
+ u8 screenWidth;
+ u8 screenHeight;
+ GetBgScreenDimensions(bg->size, &screenWidth, &screenHeight);
+
+ u8 i;
+ u8 j;
+ for (i = y; i < y + height; i++)
+ {
+ if (i >= screenHeight)
+ {
+ break;
+ }
+
+ for (j = x; j < x + width; j++)
+ {
+ if (j >= screenWidth)
+ {
+ break;
+ }
+
+ u16 idx = GetTileMapIndexFromCoords(j, i, bg->size);
+
+ if (paletteNum == 0x11)
+ {
+ ((u16 *)tilemapBuffer)[idx] = fillValue;
+ }
+ else if (paletteNum == 0x10)
+ {
+ ((u16 *)tilemapBuffer)[idx] = (u16)((((u16 *)tilemapBuffer)[idx] & 0xF000) + fillValue);
+ }
+ else
+ {
+ ((u16 *)tilemapBuffer)[idx] = (u16)((paletteNum << 0xc) + fillValue);
+ }
+ }
+ }
+ }
+}
+
+THUMB_FUNC void FillBgTilemapRectAffine(
+ struct Bg *bg, u8 fillValue, u8 x, u8 y, u8 width, u8 height)
+{
+ void *tilemapBuffer = bg->tilemapBuffer;
+
+ if (tilemapBuffer != 0)
+ {
+
+ u8 screenWidth;
+ u8 screenHeight;
+ GetBgScreenDimensions(bg->size, &screenWidth, &screenHeight);
+
+ u8 i;
+ u8 j;
+ for (i = y; i < y + height; i++)
+ {
+ if (i >= screenHeight)
+ {
+ break;
+ }
+
+ for (j = x; j < x + width; j++)
+ {
+ if (j >= screenWidth)
+ {
+ break;
+ }
+
+ ((u8 *)tilemapBuffer)[GetTileMapIndexFromCoords(j, i, bg->size)] = fillValue;
+ }
+ }
+ }
+}
+
+THUMB_FUNC void BgTilemapRectChangePalette(struct BgConfig *bgConfig,
+ u32 bgId,
+ u8 x,
+ u8 y,
+ u8 width,
+ u8 height,
+ u8 paletteNum)
+{
+ void *tilemapBuffer = bgConfig->bgs[bgId].tilemapBuffer;
+
+ if (tilemapBuffer != NULL)
+ {
+ u8 screenWidth;
+ u8 screenHeight;
+ GetBgScreenDimensions(bgConfig->bgs[bgId].size, &screenWidth, &screenHeight);
+
+ u8 i;
+ u8 j;
+ for (i = y; i < y + height; i++)
+ {
+ if (i >= screenHeight)
+ {
+ break;
+ }
+
+ for (j = x; j < x + width; j++)
+ {
+ if (j >= screenWidth)
+ {
+ break;
+ }
+
+ u16 idx = GetTileMapIndexFromCoords(j, i, bgConfig->bgs[bgId].size);
+ ((u16 *)tilemapBuffer)[idx] = (u16)((((u16 *)tilemapBuffer)[idx] & 0xfff) | (paletteNum << 0xc));
+ }
+ }
+ }
+}
+
+THUMB_FUNC void BgClearTilemapBufferAndCommit(struct BgConfig *bgConfig, u32 bgId)
+{
+ if (bgConfig->bgs[bgId].tilemapBuffer != NULL)
+ {
+ MI_CpuClear16(bgConfig->bgs[bgId].tilemapBuffer, bgConfig->bgs[bgId].bufferSize);
+ BgCommitTilemapBufferToVram(bgConfig, bgId);
+ }
+}
+
+THUMB_FUNC void BgFillTilemapBufferAndCommit(struct BgConfig *bgConfig, u32 bgId, u16 fillValue)
+{
+ if (bgConfig->bgs[bgId].tilemapBuffer != NULL)
+ {
+ MI_CpuFill16(bgConfig->bgs[bgId].tilemapBuffer, fillValue, bgConfig->bgs[bgId].bufferSize);
+ BgCommitTilemapBufferToVram(bgConfig, bgId);
+ }
+}
+
+THUMB_FUNC void BgFillTilemapBufferAndSchedule(struct BgConfig *bgConfig, u32 bgId, u16 fillValue)
+{
+ if (bgConfig->bgs[bgId].tilemapBuffer != NULL)
+ {
+ MI_CpuFill16(bgConfig->bgs[bgId].tilemapBuffer, fillValue, bgConfig->bgs[bgId].bufferSize);
+ ScheduleBgTilemapBufferTransfer(bgConfig, bgId);
+ }
+}
+
+THUMB_FUNC void *BgGetCharPtr(u32 bgId)
+{
+ switch (bgId)
+ {
+ case GF_BG_LYR_MAIN_0:
+ return G2_GetBG0CharPtr();
+ case GF_BG_LYR_MAIN_1:
+ return G2_GetBG1CharPtr();
+ case GF_BG_LYR_MAIN_2:
+ return G2_GetBG2CharPtr();
+ case GF_BG_LYR_MAIN_3:
+ return G2_GetBG3CharPtr();
+ case GF_BG_LYR_SUB_0:
+ return G2S_GetBG0CharPtr();
+ case GF_BG_LYR_SUB_1:
+ return G2S_GetBG1CharPtr();
+ case GF_BG_LYR_SUB_2:
+ return G2S_GetBG2CharPtr();
+ case GF_BG_LYR_SUB_3:
+ return G2S_GetBG3CharPtr();
+ }
+
+ return NULL;
+}
+
+THUMB_FUNC void Convert4bppTo8bppInternal(u8 *src4bpp, u32 size, u8 (*dest8bpp), u8 paletteNum)
+{
+ paletteNum <<= 4;
+ for (u32 i = 0; i < size; i++)
+ {
+ dest8bpp[i * 2 + 0] = (u8)(src4bpp[i] & 0xf);
+ if (dest8bpp[i * 2 + 0] != 0)
+ {
+ dest8bpp[i * 2 + 0] += paletteNum;
+ }
+
+ dest8bpp[i * 2 + 1] = (u8)((src4bpp[i] >> 4) & 0xf);
+ if (dest8bpp[i * 2 + 1] != 0)
+ {
+ dest8bpp[i * 2 + 1] += paletteNum;
+ }
+ }
+}
+
+THUMB_FUNC u8 *Convert4bppTo8bpp(u8 *src4Bpp, u32 size, u8 paletteNum, u32 heap_id)
+{
+ u8 *ptr = (u8*)AllocFromHeap(heap_id, size * 2);
+
+ Convert4bppTo8bppInternal(src4Bpp, size, ptr, paletteNum);
+
+ return ptr;
+}
+
+THUMB_FUNC void *GetBgTilemapBuffer(struct BgConfig *bgConfig, u8 bgId)
+{
+ return bgConfig->bgs[bgId].tilemapBuffer;
+}
+
+THUMB_FUNC u16 GetBgAffineRotation(struct BgConfig *bgConfig, u32 bgId)
+{
+ return bgConfig->bgs[bgId].rotation;
+}
+
+THUMB_FUNC u8 GetBgPriority(struct BgConfig *bgConfig, u32 bgId)
+{
+ switch (bgId)
+ {
+ case GF_BG_LYR_MAIN_0:
+ return G2_GetBG0Control().priority;
+ case GF_BG_LYR_MAIN_1:
+ return G2_GetBG1Control().priority;
+ case GF_BG_LYR_MAIN_2:
+ switch (bgConfig->bgs[bgId].mode)
+ {
+ default:
+ case GF_BG_TYPE_TEXT:
+ return G2_GetBG2ControlText().priority;
+ case GF_BG_TYPE_AFFINE:
+ return G2_GetBG2ControlAffine().priority;
+ case GF_BG_TYPE_256x16PLTT:
+ return G2_GetBG2Control256x16Pltt().priority;
+ }
+ break;
+ case GF_BG_LYR_MAIN_3:
+ switch (bgConfig->bgs[bgId].mode)
+ {
+ default:
+ case GF_BG_TYPE_TEXT:
+ return G2_GetBG3ControlText().priority;
+ case GF_BG_TYPE_AFFINE:
+ return G2_GetBG3ControlAffine().priority;
+ case GF_BG_TYPE_256x16PLTT:
+ return G2_GetBG3Control256x16Pltt().priority;
+ }
+ break;
+
+ case GF_BG_LYR_SUB_0:
+ return G2S_GetBG0Control().priority;
+ case GF_BG_LYR_SUB_1:
+ return G2S_GetBG1Control().priority;
+
+ case GF_BG_LYR_SUB_2:
+ switch (bgConfig->bgs[bgId].mode)
+ {
+ default:
+ case GF_BG_TYPE_TEXT:
+ return G2S_GetBG2ControlText().priority;
+ case GF_BG_TYPE_AFFINE:
+ return G2S_GetBG2ControlAffine().priority;
+ case GF_BG_TYPE_256x16PLTT:
+ return G2S_GetBG2Control256x16Pltt().priority;
+ }
+ break;
+ case GF_BG_LYR_SUB_3:
+ switch (bgConfig->bgs[bgId].mode)
+ {
+ default:
+ case GF_BG_TYPE_TEXT:
+ return G2S_GetBG3ControlText().priority;
+ case GF_BG_TYPE_AFFINE:
+ return G2S_GetBG3ControlAffine().priority;
+ case GF_BG_TYPE_256x16PLTT:
+ return G2S_GetBG3Control256x16Pltt().priority;
+ }
+ break;
+ }
+
+ return 0;
+}
+
+THUMB_FUNC void BlitBitmapRect4Bit(const struct Bitmap *src,
+ const struct Bitmap *dst,
+ u16 srcX,
+ u16 srcY,
+ u16 dstX,
+ u16 dstY,
+ u16 width,
+ u16 height,
+ u16 colorKey)
+{
+ int xEnd, yEnd;
+ int multiplierSrcY, multiplierDstY;
+ int loopSrcY, loopDstY;
+ int loopSrcX, loopDstX;
+ int toOrr, toShift;
+ u8 * pixelsSrc, * pixelsDst;
+
+ if (dst->width - dstX < width)
+ xEnd = dst->width - dstX + srcX;
+ else
+ xEnd = width + srcX;
+ if (dst->height - dstY < height)
+ yEnd = dst->height - dstY + srcY;
+ else
+ yEnd = height + srcY;
+ multiplierSrcY = (src->width + (src->width & 7)) >> 3;
+ multiplierDstY = (dst->width + (dst->width & 7)) >> 3;
+
+ if (colorKey == 0xFFFF)
+ {
+ for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++)
+ {
+ for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++)
+ {
+ pixelsSrc = (u8 *)(src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX << 2) & 0x3FE0) + (((loopSrcY << 2) & 0x3FE0) * multiplierSrcY) + (((loopSrcY << 2) & 0x1C)));
+ pixelsDst = (u8 *)(dst->pixels + ((loopDstX >> 1) & 3) + ((loopDstX << 2) & 0x3FE0) + (((loopDstY << 2) & 0x3FE0) * multiplierDstY) + (((loopDstY << 2) & 0x1C)));
+
+ toOrr = (*pixelsSrc >> ((loopSrcX & 1) * 4)) & 0xF;
+ toShift = (loopDstX & 1) * 4;
+ *pixelsDst = ((toOrr << toShift) | (*pixelsDst & (0xF0 >> toShift)));
+ }
+ }
+ }
+ else
+ {
+ for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++)
+ {
+ for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++)
+ {
+ pixelsSrc = (u8 *)(src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX << 2) & 0x3FE0) + (((loopSrcY << 2) & 0x3FE0) * multiplierSrcY) + ((u32)((loopSrcY << 2) & 0x1C)));
+ pixelsDst = (u8 *)(dst->pixels + ((loopDstX >> 1) & 3) + ((loopDstX << 2) & 0x3FE0) + (((loopDstY << 2) & 0x3FE0) * multiplierDstY) + ((u32)((loopDstY << 2) & 0x1C)));
+
+ toOrr = (*pixelsSrc >> ((loopSrcX & 1) * 4)) & 0xF;
+ if (toOrr != colorKey)
+ {
+ toShift = (loopDstX & 1) * 4;
+ *pixelsDst = (u8) ((toOrr << toShift) | (*pixelsDst & (0xF0 >> toShift)));
+ }
+ }
+ }
+ }
+}
+
+THUMB_FUNC void BlitBitmapRect8Bit(const struct Bitmap *src,
+ const struct Bitmap *dst,
+ u16 srcX,
+ u16 srcY,
+ u16 dstX,
+ u16 dstY,
+ u16 width,
+ u16 height,
+ u16 colorKey)
+{
+ int xEnd, yEnd;
+ int multiplierSrcY, multiplierDstY;
+ int loopSrcY, loopDstY;
+ int loopSrcX, loopDstX;
+ u8 * pixelsSrc, * pixelsDst;
+
+ if (dst->width - dstX < width)
+ xEnd = dst->width - dstX + srcX;
+ else
+ xEnd = width + srcX;
+ if (dst->height - dstY < height)
+ yEnd = dst->height - dstY + srcY;
+ else
+ yEnd = height + srcY;
+ multiplierSrcY = (src->width + (src->width & 7)) >> 3;
+ multiplierDstY = (dst->width + (dst->width & 7)) >> 3;
+
+ if (colorKey == 0xFFFF)
+ {
+ for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++)
+ {
+ for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++)
+ {
+ pixelsSrc = (u8 *)(src->pixels + ((loopSrcX >> 0) & 7) + ((loopSrcX << 3) & 0x7FC0) + (((loopSrcY << 3) & 0x7FC0) * multiplierSrcY) + (((loopSrcY << 3) & 0x38)));
+ pixelsDst = (u8 *)(dst->pixels + ((loopDstX >> 0) & 7) + ((loopDstX << 3) & 0x7FC0) + (((loopDstY << 3) & 0x7FC0) * multiplierDstY) + (((loopDstY << 3) & 0x38)));
+
+ *pixelsDst = *pixelsSrc;
+ }
+ }
+ }
+ else
+ {
+ for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++)
+ {
+ for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++)
+ {
+ pixelsSrc = (u8 *)(src->pixels + ((loopSrcX >> 0) & 7) + ((loopSrcX << 3) & 0x7FC0) + (((loopSrcY << 3) & 0x7FC0) * multiplierSrcY) + (((loopSrcY << 3) & 0x38)));
+ pixelsDst = (u8 *)(dst->pixels + ((loopDstX >> 0) & 7) + ((loopDstX << 3) & 0x7FC0) + (((loopDstY << 3) & 0x7FC0) * multiplierDstY) + (((loopDstY << 3) & 0x38)));
+
+ if (*pixelsSrc != colorKey)
+ *pixelsDst = *pixelsSrc;
+ }
+ }
+ }
+}
+
+THUMB_FUNC void FillBitmapRect4Bit(
+ struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue)
+{
+
+ int r6 = x + width;
+ if (r6 > surface->width)
+ {
+ r6 = surface->width;
+ }
+
+ int r12 = y + height;
+ if (r12 > surface->height)
+ {
+ r12 = surface->height;
+ }
+
+ int lr = (((surface->width) + (surface->width & 7)) >> 3);
+
+ for (int i = y; i < r12; i++)
+ {
+
+ for (int j = x; j < r6; j++)
+ {
+
+ u8 *unk = (u8 *)((u8 *)surface->pixels + ((j >> 1) & 3) + ((j << 2) & 0x3fe0) +
+ (((i << 2) & 0x3fe0) * lr) + ((i << 2) & 0x1c));
+
+ if ((j & 1) != 0)
+ {
+ *unk &= 0xf;
+ *unk |= (fillValue << 4);
+ }
+ else
+ {
+ *unk &= 0xf0;
+ *unk |= fillValue;
+ }
+ }
+ }
+}
+
+THUMB_FUNC void FillBitmapRect8Bit(
+ struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue)
+{
+
+ int r6 = x + width;
+ if (r6 > surface->width)
+ {
+ r6 = surface->width;
+ }
+
+ int r12 = y + height;
+ if (r12 > surface->height)
+ {
+ r12 = surface->height;
+ }
+
+ int lr = (((surface->width) + (surface->width & 7)) >> 3);
+
+ for (int i = y; i < r12; i++)
+ {
+
+ for (int j = x; j < r6; j++)
+ {
+
+ u8 *unk = (u8 *)((u8 *)surface->pixels + (j & 7) + ((j << 3) & 0x7fc0) +
+ (((i << 3) & 0x7fc0) * lr) + ((i << 3) & 0x38));
+
+ *unk = fillValue;
+ }
+ }
+}
+
+THUMB_FUNC struct Window *AllocWindows(u32 heap_id, s32 size)
+{
+ struct Window *ptr = AllocFromHeap(heap_id, (u32)(size << 4));
+
+ for (u16 i = 0; i < size; i++)
+ {
+ InitWindow(&ptr[i]);
+ }
+
+ return ptr;
+}
+
+THUMB_FUNC void InitWindow(struct Window *window)
+{
+ window->bgConfig = NULL;
+ window->bgId = GF_BG_LYR_UNALLOC;
+ window->tilemapLeft = 0;
+ window->tilemapTop = 0;
+ window->width = 0;
+ window->height = 0;
+ window->paletteNum = 0;
+
+ window->baseTile = 0;
+ window->pixelBuffer = NULL;
+
+ window->colorMode = GF_BG_CLR_4BPP;
+}
+
+THUMB_FUNC BOOL WindowIsInUse(struct Window *window)
+{
+ if (window->bgConfig == NULL || window->bgId == 0xff || window->pixelBuffer == NULL)
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+THUMB_FUNC void AddWindowParameterized(struct BgConfig *param0,
+ struct Window *window,
+ u8 bgId,
+ u8 tilemapLeft,
+ u8 tilemapTop,
+ u8 width,
+ u8 height,
+ u8 paletteNum,
+ u16 baseTile)
+{
+ if (param0->bgs[bgId].tilemapBuffer == NULL)
+ {
+ return;
+ }
+
+ void *ptr = AllocFromHeap(param0->heap_id, (u32)(width * height * param0->bgs[bgId].tileSize));
+
+ if (ptr == NULL)
+ {
+ return;
+ }
+ window->bgConfig = param0;
+ window->bgId = bgId;
+ window->tilemapLeft = tilemapLeft;
+ window->tilemapTop = tilemapTop;
+ window->width = width;
+ window->height = height;
+ window->paletteNum = paletteNum;
+
+ window->baseTile = baseTile;
+ window->pixelBuffer = ptr;
+
+ window->colorMode = param0->bgs[bgId].colorMode == GX_BG_COLORMODE_16 ? GF_BG_CLR_4BPP : GF_BG_CLR_8BPP;
+}
+
+THUMB_FUNC void AddTextWindowTopLeftCorner(struct BgConfig *param0,
+ struct Window *window,
+ u8 width,
+ u8 height,
+ u16 baseTile,
+ u8 paletteNum)
+{
+ u32 size = (u32)(width * height * 32);
+
+ void *ptr = AllocFromHeap(param0->heap_id, size);
+
+ paletteNum |= (paletteNum * 16);
+ memset(ptr, paletteNum, size);
+
+ if (ptr != NULL)
+ {
+ window->bgConfig = param0;
+ window->width = width;
+ window->height = height;
+ window->baseTile = baseTile;
+ window->pixelBuffer = ptr;
+ window->colorMode = GF_BG_CLR_4BPP;
+ }
+}
+
+THUMB_FUNC void AddWindow(
+ struct BgConfig *bgConfig, struct Window *window, const struct WindowTemplate *template)
+{
+
+ AddWindowParameterized(bgConfig,
+ window,
+ template->bgId,
+ template->tilemapLeft,
+ template->tilemapTop,
+ template->width,
+ template->height,
+ template->paletteNum,
+ template->baseTile);
+}
+
+THUMB_FUNC void RemoveWindow(struct Window *window)
+{
+ FreeToHeap(window->pixelBuffer);
+
+ window->bgConfig = NULL;
+ window->bgId = 0xff;
+ window->tilemapLeft = 0;
+ window->tilemapTop = 0;
+ window->width = 0;
+ window->height = 0;
+ window->paletteNum = 0;
+ window->baseTile = 0;
+ window->pixelBuffer = NULL;
+}
+
+THUMB_FUNC void WindowArray_dtor(struct Window *windows, int count)
+{
+ for (u16 i = 0; i < count; i++)
+ {
+ if (windows[i].pixelBuffer != NULL)
+ {
+ FreeToHeap(windows[i].pixelBuffer);
+ }
+ }
+
+ FreeToHeap(windows);
+}
+
+THUMB_FUNC void CopyWindowToVram(struct Window *window)
+{
+
+ GF_ASSERT(window != NULL);
+ GF_ASSERT(window->bgConfig != NULL);
+ GF_ASSERT(window->bgId < NELEMS(window->bgConfig->bgs));
+ GF_ASSERT(window->bgConfig->bgs[window->bgId].mode < NELEMS(sCopyWindowToVramFuncs));
+
+ sCopyWindowToVramFuncs[window->bgConfig->bgs[window->bgId].mode](window);
+}
+
+THUMB_FUNC void ScheduleWindowCopyToVram(struct Window *window)
+{
+
+ GF_ASSERT(window);
+ GF_ASSERT(window->bgConfig);
+ GF_ASSERT(window->bgId < NELEMS(window->bgConfig->bgs));
+ GF_ASSERT(window->bgConfig->bgs[window->bgId].mode < NELEMS(sScheduleWindowCopyToVramFuncs));
+
+ sScheduleWindowCopyToVramFuncs[window->bgConfig->bgs[window->bgId].mode](window);
+}
+
+THUMB_FUNC void PutWindowTilemap(struct Window *window)
+{
+ sPutWindowTilemapFuncs[window->bgConfig->bgs[window->bgId].mode](window);
+}
+
+THUMB_FUNC void PutWindowTilemapRectAnchoredTopLeft(struct Window *window, u8 width, u8 height)
+{
+ u8 widthBak = window->width;
+ u8 heightBak = window->height;
+
+ window->width = width;
+ window->height = height;
+ sPutWindowTilemapFuncs[window->bgConfig->bgs[window->bgId].mode](window);
+
+ window->width = widthBak;
+ window->height = heightBak;
+}
+
+THUMB_FUNC void ClearWindowTilemap(struct Window *window)
+{
+ sClearWindowTilemapFuncs[window->bgConfig->bgs[window->bgId].mode](window);
+}
+
+THUMB_FUNC void PutWindowTilemap_TextMode(struct Window *param0)
+{
+ u32 i, j;
+ u32 r3;
+ u32 iCount, jCount;
+ u16 *st4 = param0->bgConfig->bgs[param0->bgId].tilemapBuffer;
+
+ if (st4 == NULL)
+ {
+ return;
+ }
+
+ r3 = param0->baseTile;
+ jCount = (u32)(param0->tilemapLeft + param0->width);
+ iCount = (u32)(param0->tilemapTop + param0->height);
+
+ for (i = param0->tilemapTop; i < iCount; i++)
+ {
+ for (j = param0->tilemapLeft; j < jCount; j++)
+ {
+ st4[((i & 0x20) * 32) + ((j & 0x20) * 32) + ((i & 0x1f) << 5) + (j & 0x1f)] =
+ (u16)(r3 | (param0->paletteNum << 12));
+
+ r3++;
+ }
+ }
+}
+
+THUMB_FUNC void PutWindowTilemap_AffineMode(struct Window *window)
+{
+ int j, i;
+ u8 *dst;
+
+ int tileId;
+ int tilemapWidth;
+
+ if (window->bgConfig->bgs[window->bgId].tilemapBuffer == NULL)
+ {
+ return;
+ }
+
+ tilemapWidth = sTilemapWidthByBufferSize[window->bgConfig->bgs[window->bgId].size];
+
+ dst = window->bgConfig->bgs[window->bgId].tilemapBuffer + window->tilemapTop * tilemapWidth + window->tilemapLeft;
+ tileId = window->baseTile;
+
+ for (i = 0; i < window->height; i++)
+ {
+ for (j = 0; j < window->width; j++)
+ {
+ dst[j] = (u8)tileId;
+ tileId++;
+ }
+ dst += tilemapWidth;
+ }
+}
+
+THUMB_FUNC void ClearWindowTilemapText(struct Window *window)
+{
+
+ u32 i, j;
+
+ u32 yEnd, xEnd;
+ u32 tilemapWidth;
+
+ u16 *dst;
+
+ if (window->bgConfig->bgs[window->bgId].tilemapBuffer == NULL)
+ {
+ return;
+ }
+ dst = window->bgConfig->bgs[window->bgId].tilemapBuffer;
+
+ tilemapWidth = sTilemapWidthByBufferSize[window->bgConfig->bgs[window->bgId].size];
+ xEnd = (u32)(window->tilemapLeft + window->width);
+ yEnd = (u32)(window->tilemapTop + window->height);
+
+ for (i = window->tilemapTop; i < yEnd; i++)
+ {
+ for (j = window->tilemapLeft; j < xEnd; j++)
+ {
+ dst[((i & 0x20) * 32) + ((j & 0x20) * 32) + ((i & 0x1f) * tilemapWidth) + (j & 0x1f)] = 0;
+ }
+ }
+}
+
+THUMB_FUNC void ClearWindowTilemapAffine(struct Window *window)
+{
+
+ int j, i;
+ u8 *dstPos;
+
+ int tilemapWidth;
+
+ if (window->bgConfig->bgs[window->bgId].tilemapBuffer == NULL)
+ {
+ return;
+ }
+
+ tilemapWidth = sTilemapWidthByBufferSize[window->bgConfig->bgs[window->bgId].size];
+ dstPos = window->bgConfig->bgs[window->bgId].tilemapBuffer + window->tilemapTop * tilemapWidth + window->tilemapLeft;
+
+ for (i = 0; i < window->height; i++)
+ {
+ for (j = 0; j < window->width; j++)
+ {
+ dstPos[j] = 0;
+ }
+ dstPos += tilemapWidth;
+ }
+}
+
+THUMB_FUNC void CopyWindowToVram_TextMode(struct Window *window)
+{
+ PutWindowTilemap_TextMode(window);
+ CopyWindowPixelsToVram_TextMode(window);
+ BgCopyOrUncompressTilemapBufferRangeToVram(window->bgConfig,
+ window->bgId,
+ window->bgConfig->bgs[window->bgId].tilemapBuffer,
+ window->bgConfig->bgs[window->bgId].bufferSize,
+ window->bgConfig->bgs[window->bgId].baseTile);
+}
+
+THUMB_FUNC void ScheduleWindowCopyToVram_TextMode(struct Window *window)
+{
+ PutWindowTilemap_TextMode(window);
+ ScheduleBgTilemapBufferTransfer(window->bgConfig, window->bgId);
+ CopyWindowPixelsToVram_TextMode(window);
+}
+
+THUMB_FUNC void CopyWindowToVram_AffineMode(struct Window *window)
+{
+ PutWindowTilemap_AffineMode(window);
+ BgCopyOrUncompressTilemapBufferRangeToVram(window->bgConfig,
+ window->bgId,
+ window->bgConfig->bgs[window->bgId].tilemapBuffer,
+ window->bgConfig->bgs[window->bgId].bufferSize,
+ window->bgConfig->bgs[window->bgId].baseTile);
+
+ BG_LoadCharTilesData(window->bgConfig,
+ window->bgId,
+ window->pixelBuffer,
+ (u32)(window->width * window->height * 64),
+ window->baseTile);
+}
+
+THUMB_FUNC void ScheduleWindowCopyToVram_AffineMode(struct Window *window)
+{
+ PutWindowTilemap_AffineMode(window);
+ ScheduleBgTilemapBufferTransfer(window->bgConfig, window->bgId);
+ BG_LoadCharTilesData(window->bgConfig,
+ window->bgId,
+ window->pixelBuffer,
+ (u32)(window->width * window->height * 64),
+ window->baseTile);
+}
+
+THUMB_FUNC void CopyWindowPixelsToVram_TextMode(struct Window *window)
+{
+ BG_LoadCharTilesData(window->bgConfig,
+ window->bgId,
+ window->pixelBuffer,
+ (u32)(window->width * window->height * window->bgConfig->bgs[window->bgId].tileSize),
+ window->baseTile);
+}
+
+THUMB_FUNC void ClearWindowTilemapAndCopyToVram(struct Window *window)
+{
+ sClearWindowTilemapAndCopyToVramFuncs[window->bgConfig->bgs[window->bgId].mode](window);
+}
+
+THUMB_FUNC void ClearWindowTilemapAndScheduleTransfer(struct Window *window)
+{
+ sClearWindowTilemapAndScheduleTransferFuncs[window->bgConfig->bgs[window->bgId].mode](window);
+}
+
+THUMB_FUNC void ClearWindowTilemapAndCopyToVram_TextMode(struct Window *window)
+{
+ ClearWindowTilemapText(window);
+ BgCopyOrUncompressTilemapBufferRangeToVram(window->bgConfig,
+ window->bgId,
+ window->bgConfig->bgs[window->bgId].tilemapBuffer,
+ window->bgConfig->bgs[window->bgId].bufferSize,
+ window->bgConfig->bgs[window->bgId].baseTile);
+}
+
+THUMB_FUNC void ClearWindowTilemapAndScheduleTransfer_TextMode(struct Window *window)
+{
+ ClearWindowTilemapText(window);
+ ScheduleBgTilemapBufferTransfer(window->bgConfig, window->bgId);
+}
+
+THUMB_FUNC void ClearWindowTilemapAndCopyToVram_AffineMode(struct Window *window)
+{
+ ClearWindowTilemapAffine(window);
+ BgCopyOrUncompressTilemapBufferRangeToVram(window->bgConfig,
+ window->bgId,
+ window->bgConfig->bgs[window->bgId].tilemapBuffer,
+ window->bgConfig->bgs[window->bgId].bufferSize,
+ window->bgConfig->bgs[window->bgId].baseTile);
+}
+
+THUMB_FUNC void ClearWindowTilemapAndScheduleTransfer_AffineMode(struct Window *window)
+{
+ ClearWindowTilemapAffine(window);
+ ScheduleBgTilemapBufferTransfer(window->bgConfig, window->bgId);
+}
+
+THUMB_FUNC void FillWindowPixelBuffer(struct Window *window, u8 param1)
+{
+ if (window->bgConfig->bgs[window->bgId].tileSize == 0x20)
+ {
+ param1 |= param1 << 4;
+ }
+
+ MI_CpuFillFast(
+ window->pixelBuffer,
+ (u32)((param1 << 0x18) | (param1 << 0x10) | (param1 << 0x8) | param1),
+ (u32)(window->bgConfig->bgs[window->bgId].tileSize * window->width * window->height));
+}
+
+THUMB_FUNC void BlitBitmapRectToWindow(struct Window *window,
+ const void *src,
+ u16 srcX,
+ u16 srcY,
+ u16 srcWidth,
+ u16 srcHeight,
+ u16 dstX,
+ u16 dstY,
+ u16 dstWidth,
+ u16 dstHeight)
+{
+ BlitBitmapRect(
+ window, src, srcX, srcY, srcWidth, srcHeight, dstX, dstY, dstWidth, dstHeight, 0);
+}
+
+THUMB_FUNC void BlitBitmapRect(struct Window *window,
+ void *param1,
+ u16 param2,
+ u16 param3,
+ u16 param4,
+ u16 param5,
+ u16 param6,
+ u16 param7,
+ u16 param8,
+ u16 param9,
+ u16 param10)
+{
+ struct Bitmap st1c = { param1, param4, param5 };
+ struct Bitmap st14 = {
+ window->pixelBuffer, (u16)(window->width << 3), (u16)(window->height << 3)
+ };
+
+ if (window->bgConfig->bgs[window->bgId].colorMode == GX_BG_COLORMODE_16)
+ {
+ BlitBitmapRect4Bit(&st1c, &st14, param2, param3, param6, param7, param8, param9, param10);
+ }
+ else
+ {
+ BlitBitmapRect8Bit(&st1c, &st14, param2, param3, param6, param7, param8, param9, param10);
+ }
+}
+
+THUMB_FUNC void FillWindowPixelRect(
+ struct Window *window, u8 fillValue, u16 x, u16 y, u16 width, u16 height)
+{
+ struct Bitmap st8 = {
+ window->pixelBuffer, (u16)(window->width << 3), (u16)(window->height << 3)
+ };
+
+ if (window->bgConfig->bgs[window->bgId].colorMode == GX_BG_COLORMODE_16)
+ {
+ FillBitmapRect4Bit(&st8, x, y, width, height, fillValue);
+ }
+ else
+ {
+ FillBitmapRect8Bit(&st8, x, y, width, height, fillValue);
+ }
+}
+
+#ifdef NONMATCHING
+THUMB_FUNC void CopyGlyphToWindow(
+ struct Window *window, u32 *param1, u32 param2, u32 param3, u16 param4, u16 param5, u32 param6)
+{
+ u32 str330 = param6;
+ u32 *st0 = param1;
+ u16 st5c = param4;
+
+ void *st278 = window->unk0c;
+ u16 st58 = window->width << 3;
+
+ int st8 = st58 - st5c;
+
+ if (st8 >= param2)
+ {
+ st8 = param2;
+ }
+
+ int st4 = (u16)(window->height << 3) - param5;
+ u16 st48 = param5;
+
+ if (st4 >= param3)
+ {
+ st4 = param3;
+ }
+
+ u8 r4 = 0;
+ if (st8 > 8)
+ {
+ r4 |= 1;
+ }
+
+ if (st4 > 8)
+ {
+ r4 |= 2;
+ }
+
+ if (window->unk0b_15 == 0)
+ {
+ switch (r4)
+ {
+ case 0:
+ u8 st70 = param6;
+ for (u32 st274 = 0; st274 < st4; st274++)
+ {
+ u32 st6c = (st58 + (st58 & 7)) >> 3;
+
+ u32 st26c = st0[0];
+ u8 st270 = (u8)((st70 >> st274) & 1);
+ u32 r2 = st5c;
+
+ for (u32 r1 = 0; r1 < st8; r1++)
+ {
+ u32 r3 = st5c << 2;
+ u32 st68 = ((st48 << 2) & 0x3fe0) * st6c;
+ u32 r7 = (st48 << 2) & 0x1c;
+ u32 st64 = (((st48 + 1) << 2) & 0x3fe0) * st6c;
+ u32 st60 = ((st48 + 1) << 2) & 0x1c;
+ u32 r4 = r1;
+
+ void *st27c = st278 + ((r2 >> 1) & 3) + (r3 & 0x3fe0);
+ u8 *r0 = st27c + st68;
+
+ u8 r5 = (u8)((st26c >> r4) & 0xf);
+ if (r5 != 0)
+ {
+ u32 st280 = (r5 << ((r2 & 1) << 2));
+ u32 st284 = r0[r7];
+
+ u8 r5 = ((0xf0 >> ((r2 & 1) << 2)) & st284) | st280;
+ r0[r7] = r5;
+
+ if (st270 != 0)
+ {
+ *(u8 *)(st27c + st64 + st60) = r5;
+ }
+ }
+
+ r4 += 4;
+ r3 += 4;
+ r2 += 1;
+ }
+
+ if (st270 != 0)
+ {
+ st48 += 2;
+ }
+ else
+ {
+ st48++;
+ }
+
+ st0++;
+ }
+
+ break;
+
+ case 1:
+ u32 *st25c = st0;
+ u32 st264 = st48;
+ u8 st54 = param6;
+ u8 st84 = param6;
+
+ for (u32 st268 = 0; st268 < st4; st268++)
+ {
+ u32 st80 = (st58 + (st58 & 7)) >> 3;
+
+ u32 st258 = *st25c;
+ u32 r2 = st5c;
+ u8 st260 = (st84 >> st268) & 1;
+ u32 r3 = st5c << 2;
+ u32 st7c = ((st264 << 2) & 0x3fe0) * st80;
+ u32 r7 = (st264 << 2) & 0x1c;
+ u32 st78 = (((st264 + 1) << 2) & 0x3fe0) * st80;
+ u32 st74 = ((st264 + 1) << 2) & 0x1c;
+ u32 r4 = 0;
+
+ for (u32 r1 = 0; r1 < 8; r1++)
+ {
+ void *st288 = st278 + ((r2 >> 1) & 3) + (r3 & 0x3fe0);
+ u8 *r0 = st288 + st7c;
+ u8 r5 = (st258 >> r4) & 0xf;
+ if (r5 != 0)
+ {
+ u32 st28c = r5 << ((r2 & 1) << 2);
+ u32 st290 = r0[r7];
+ u8 r5 = ((0xf0 >> ((r2 & 1) << 2)) & st290) | st28c;
+ r0[r7] = r5;
+
+ if (st260 != 0)
+ {
+ *(u8 *)(st288 + st78 + st74) = r5;
+ }
+ }
+
+ r4 += 4;
+ r3 += 4;
+ r2++;
+ }
+
+ if (st260 != 0)
+ {
+ st264 += 2;
+ }
+ else
+ {
+ st264++;
+ }
+
+ st25c++;
+ }
+
+ st0 += 0x20;
+ u8 st98 = st54;
+
+ for (u32 st254 = 0; st254 < st4; st254++)
+ {
+ st5c += 8;
+ u32 st94 = (st58 + (st58 & 7)) >> 3;
+
+ //_02019A00
+ }
+
+ break;
+
+ case 2:
+ // TODO
+ break;
+ case 3:
+ // TODO
+ break;
+ }
+ }
+ else
+ {
+ // TODO: _0201A12C
+ }
+}
+#else
+asm void CopyGlyphToWindow(
+ struct Window *window, const char *param1, u16 param2, u16 param3, u16 param4, u16 param5, u16 param6)
+{
+ // clang-format off
+ push {r4-r7, lr}
+ sub sp, #0x1fc
+ sub sp, #0x118
+ add r5, r0, #0x0
+ ldr r0, [sp, #0x330]
+ str r1, [sp, #0x0]
+ str r0, [sp, #0x330]
+ add r1, sp, #0x318
+ ldrh r1, [r1, #0x10]
+ ldr r0, [r5, #0xc]
+ str r1, [sp, #0x5c]
+ ldrb r1, [r5, #0x7]
+ str r0, [sp, #0x278]
+ ldrb r0, [r5, #0x8]
+ lsl r1, r1, #0x13
+ lsr r4, r1, #0x10
+ ldr r1, [sp, #0x5c]
+ lsl r0, r0, #0x13
+ sub r1, r4, r1
+ lsr r0, r0, #0x10
+ str r4, [sp, #0x58]
+ str r1, [sp, #0x8]
+ cmp r1, r2
+ blt _0201977E
+ str r2, [sp, #0x8]
+_0201977E:
+ add r1, sp, #0x318
+ ldrh r1, [r1, #0x14]
+ sub r0, r0, r1
+ str r1, [sp, #0x48]
+ str r0, [sp, #0x4]
+ cmp r0, r3
+ blt _0201978E
+ str r3, [sp, #0x4]
+_0201978E:
+ ldr r0, [sp, #0x8]
+ mov r4, #0x0
+ cmp r0, #0x8
+ ble _0201979E
+ mov r0, #0x1
+ orr r0, r4
+ lsl r0, r0, #0x18
+ lsr r4, r0, #0x18
+_0201979E:
+ ldr r0, [sp, #0x4]
+ cmp r0, #0x8
+ ble _020197AC
+ mov r0, #0x2
+ orr r0, r4
+ lsl r0, r0, #0x18
+ lsr r4, r0, #0x18
+_020197AC:
+ ldrh r0, [r5, #0xa]
+ lsl r0, r0, #0x10
+ lsr r0, r0, #0x1f
+ beq _020197B8
+ bl _0201A12C
+_020197B8:
+ cmp r4, #0x3
+ bls _020197C0
+ bl _0201A8BC
+_020197C0:
+ add r0, r4, r4
+ add r0, pc
+ ldrh r0, [r0, #0x6]
+ lsl r0, r0, #0x10
+ asr r0, r0, #0x10
+ add pc, r0
+_020197CC:
+ lsl r6, r0, #0
+ lsl r0, r1, #4
+ lsl r0, r3, #12
+ lsl r0, r7, #20
+ // jump table (using 16-bit offset)
+ // .short _020197D4 - _020197CC - 2; case 0
+ // .short _020198D6 - _020197CC - 2; case 1
+ // .short _02019AE6 - _020197CC - 2; case 2
+ // .short _02019D06 - _020197CC - 2; case 3
+_020197D4:
+ ldr r0, [sp, #0x330]
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x70]
+ mov r0, #0x0
+ str r0, [sp, #0x274]
+ ldr r0, [sp, #0x4]
+ cmp r0, #0x0
+ bgt _020197EA
+ bl _0201A8BC
+_020197EA:
+ ldr r0, [sp, #0x58]
+ mov r1, #0x7
+ and r1, r0
+ add r0, r0, r1
+ asr r0, r0, #0x3
+ str r0, [sp, #0x6c]
+_020197F6:
+ ldr r0, [sp, #0x0]
+ ldr r1, [sp, #0x70]
+ ldr r0, [r0, #0x0]
+ ldr r2, [sp, #0x5c]
+ str r0, [sp, #0x26c]
+ ldr r0, [sp, #0x274]
+ asr r1, r0
+ mov r0, #0x1
+ and r0, r1
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x270]
+ ldr r0, [sp, #0x8]
+ mov r1, #0x0
+ cmp r0, #0x0
+ ble _020198AA
+ ble _020198AA
+ add r0, r2, #0x0
+ lsl r3, r0, #0x2
+ ldr r0, [sp, #0x48]
+ ldr r6, [sp, #0x6c]
+ lsl r5, r0, #0x2
+ ldr r0, =0x00003FE0
+ add r7, r5, #0x0
+ and r0, r5
+ mul r6, r0
+ mov r0, #0x1c
+ and r7, r0
+ ldr r0, [sp, #0x48]
+ str r6, [sp, #0x68]
+ add r0, r0, #0x1
+ lsl r6, r0, #0x2
+ ldr r0, =0x00003FE0
+ ldr r5, [sp, #0x6c]
+ and r0, r6
+ mul r5, r0
+ mov r0, #0x1c
+ and r0, r6
+ add r4, r1, #0x0
+ str r5, [sp, #0x64]
+ str r0, [sp, #0x60]
+_02019848:
+ asr r5, r2, #0x1
+ mov r0, #0x3
+ and r5, r0
+ ldr r0, [sp, #0x278]
+ add r0, r0, r5
+ ldr r5, =0x00003FE0
+ and r5, r3
+ add r5, r0, r5
+ ldr r0, [sp, #0x68]
+ str r5, [sp, #0x27c]
+ add r0, r5, r0
+ ldr r5, [sp, #0x26c]
+ add r6, r5, #0x0
+ lsr r6, r4
+ mov r5, #0xf
+ and r5, r6
+ lsl r5, r5, #0x18
+ lsr r5, r5, #0x18
+ beq _0201989C
+ lsl r6, r2, #0x1f
+ lsr r6, r6, #0x1d
+ lsl r5, r6
+ str r5, [sp, #0x280]
+ ldrb r5, [r0, r7]
+ str r5, [sp, #0x284]
+ mov r5, #0xf0
+ asr r5, r6
+ ldr r6, [sp, #0x284]
+ and r6, r5
+ ldr r5, [sp, #0x280]
+ orr r5, r6
+ lsl r5, r5, #0x18
+ lsr r5, r5, #0x18
+ strb r5, [r0, r7]
+ ldr r0, [sp, #0x270]
+ cmp r0, #0x0
+ beq _0201989C
+ ldr r6, [sp, #0x27c]
+ ldr r0, [sp, #0x64]
+ add r6, r6, r0
+ ldr r0, [sp, #0x60]
+ strb r5, [r0, r6]
+_0201989C:
+ ldr r0, [sp, #0x8]
+ add r1, r1, #0x1
+ add r4, r4, #0x4
+ add r3, r3, #0x4
+ add r2, r2, #0x1
+ cmp r1, r0
+ blt _02019848
+_020198AA:
+ ldr r0, [sp, #0x270]
+ cmp r0, #0x0
+ beq _020198B8
+ ldr r0, [sp, #0x48]
+ add r0, r0, #0x2
+ str r0, [sp, #0x48]
+ b _020198BE
+_020198B8:
+ ldr r0, [sp, #0x48]
+ add r0, r0, #0x1
+ str r0, [sp, #0x48]
+_020198BE:
+ ldr r0, [sp, #0x0]
+ add r0, r0, #0x4
+ str r0, [sp, #0x0]
+ ldr r0, [sp, #0x274]
+ add r1, r0, #0x1
+ ldr r0, [sp, #0x4]
+ str r1, [sp, #0x274]
+ cmp r1, r0
+ blt _020197F6
+ add sp, #0x1fc
+ add sp, #0x118
+ pop {r4-r7, pc}
+_020198D6:
+ ldr r0, [sp, #0x0]
+ str r0, [sp, #0x25c]
+ ldr r0, [sp, #0x48]
+ str r0, [sp, #0x264]
+ ldr r0, [sp, #0x330]
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x54]
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x84]
+ mov r0, #0x0
+ str r0, [sp, #0x268]
+ ldr r0, [sp, #0x4]
+ cmp r0, #0x0
+ ble _020199D2
+ ldr r0, [sp, #0x58]
+ mov r1, #0x7
+ and r1, r0
+ add r0, r0, r1
+ asr r0, r0, #0x3
+ str r0, [sp, #0x80]
+_02019902:
+ ldr r0, [sp, #0x25c]
+ ldr r1, [sp, #0x84]
+ ldr r0, [r0, #0x0]
+ ldr r2, [sp, #0x5c]
+ str r0, [sp, #0x258]
+ ldr r0, [sp, #0x268]
+ ldr r6, [sp, #0x80]
+ asr r1, r0
+ mov r0, #0x1
+ and r0, r1
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x260]
+ add r0, r2, #0x0
+ lsl r3, r0, #0x2
+ ldr r0, [sp, #0x264]
+ mov r1, #0x0
+ lsl r5, r0, #0x2
+ ldr r0, =0x00003FE0
+ add r7, r5, #0x0
+ and r0, r5
+ mul r6, r0
+ mov r0, #0x1c
+ and r7, r0
+ ldr r0, [sp, #0x264]
+ str r6, [sp, #0x7c]
+ add r0, r0, #0x1
+ lsl r6, r0, #0x2
+ ldr r0, =0x00003FE0
+ ldr r5, [sp, #0x80]
+ and r0, r6
+ mul r5, r0
+ mov r0, #0x1c
+ and r0, r6
+ add r4, r1, #0x0
+ str r5, [sp, #0x78]
+ str r0, [sp, #0x74]
+_0201994C:
+ asr r5, r2, #0x1
+ mov r0, #0x3
+ and r5, r0
+ ldr r0, [sp, #0x278]
+ add r0, r0, r5
+ ldr r5, =0x00003FE0
+ and r5, r3
+ add r5, r0, r5
+ ldr r0, [sp, #0x7c]
+ str r5, [sp, #0x288]
+ add r0, r5, r0
+ ldr r5, [sp, #0x258]
+ add r6, r5, #0x0
+ lsr r6, r4
+ mov r5, #0xf
+ and r5, r6
+ lsl r5, r5, #0x18
+ lsr r5, r5, #0x18
+ beq _020199A0
+ lsl r6, r2, #0x1f
+ lsr r6, r6, #0x1d
+ lsl r5, r6
+ str r5, [sp, #0x28c]
+ ldrb r5, [r0, r7]
+ str r5, [sp, #0x290]
+ mov r5, #0xf0
+ asr r5, r6
+ ldr r6, [sp, #0x290]
+ and r6, r5
+ ldr r5, [sp, #0x28c]
+ orr r5, r6
+ lsl r5, r5, #0x18
+ lsr r5, r5, #0x18
+ strb r5, [r0, r7]
+ ldr r0, [sp, #0x260]
+ cmp r0, #0x0
+ beq _020199A0
+ ldr r6, [sp, #0x288]
+ ldr r0, [sp, #0x78]
+ add r6, r6, r0
+ ldr r0, [sp, #0x74]
+ strb r5, [r0, r6]
+_020199A0:
+ add r1, r1, #0x1
+ add r4, r4, #0x4
+ add r3, r3, #0x4
+ add r2, r2, #0x1
+ cmp r1, #0x8
+ blt _0201994C
+ ldr r0, [sp, #0x260]
+ cmp r0, #0x0
+ beq _020199BA
+ ldr r0, [sp, #0x264]
+ add r0, r0, #0x2
+ str r0, [sp, #0x264]
+ b _020199C0
+_020199BA:
+ ldr r0, [sp, #0x264]
+ add r0, r0, #0x1
+ str r0, [sp, #0x264]
+_020199C0:
+ ldr r0, [sp, #0x25c]
+ add r0, r0, #0x4
+ str r0, [sp, #0x25c]
+ ldr r0, [sp, #0x268]
+ add r1, r0, #0x1
+ ldr r0, [sp, #0x4]
+ str r1, [sp, #0x268]
+ cmp r1, r0
+ blt _02019902
+_020199D2:
+ ldr r0, [sp, #0x0]
+ add r0, #0x20
+ str r0, [sp, #0x0]
+ ldr r0, [sp, #0x54]
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x98]
+ mov r0, #0x0
+ str r0, [sp, #0x254]
+ ldr r0, [sp, #0x4]
+ cmp r0, #0x0
+ bgt _020199EE
+ bl _0201A8BC
+_020199EE:
+ ldr r0, [sp, #0x5c]
+ mov r1, #0x7
+ add r0, #0x8
+ str r0, [sp, #0x5c]
+ ldr r0, [sp, #0x58]
+ and r1, r0
+ add r0, r0, r1
+ asr r0, r0, #0x3
+ str r0, [sp, #0x94]
+_02019A00:
+ ldr r0, [sp, #0x0]
+ ldr r1, [sp, #0x98]
+ ldr r0, [r0, #0x0]
+ ldr r2, [sp, #0x5c]
+ str r0, [sp, #0x24c]
+ ldr r0, [sp, #0x254]
+ asr r1, r0
+ mov r0, #0x1
+ and r0, r1
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x250]
+ ldr r0, [sp, #0x8]
+ mov r1, #0x0
+ str r0, [sp, #0x294]
+ sub r0, #0x8
+ str r0, [sp, #0x294]
+ cmp r0, #0x0
+ ble _02019ABA
+ ble _02019ABA
+ add r0, r2, #0x0
+ lsl r3, r0, #0x2
+ ldr r0, [sp, #0x48]
+ ldr r6, [sp, #0x94]
+ lsl r5, r0, #0x2
+ ldr r0, =0x00003FE0
+ add r7, r5, #0x0
+ and r0, r5
+ mul r6, r0
+ mov r0, #0x1c
+ and r7, r0
+ ldr r0, [sp, #0x48]
+ str r6, [sp, #0x90]
+ add r0, r0, #0x1
+ lsl r6, r0, #0x2
+ ldr r0, =0x00003FE0
+ ldr r5, [sp, #0x94]
+ and r0, r6
+ mul r5, r0
+ mov r0, #0x1c
+ and r0, r6
+ add r4, r1, #0x0
+ str r5, [sp, #0x8c]
+ str r0, [sp, #0x88]
+_02019A58:
+ asr r5, r2, #0x1
+ mov r0, #0x3
+ and r5, r0
+ ldr r0, [sp, #0x278]
+ add r0, r0, r5
+ ldr r5, =0x00003FE0
+ and r5, r3
+ add r5, r0, r5
+ ldr r0, [sp, #0x90]
+ str r5, [sp, #0x298]
+ add r0, r5, r0
+ ldr r5, [sp, #0x24c]
+ add r6, r5, #0x0
+ lsr r6, r4
+ mov r5, #0xf
+ and r5, r6
+ lsl r5, r5, #0x18
+ lsr r5, r5, #0x18
+ beq _02019AAC
+ lsl r6, r2, #0x1f
+ lsr r6, r6, #0x1d
+ lsl r5, r6
+ str r5, [sp, #0x29c]
+ ldrb r5, [r0, r7]
+ str r5, [sp, #0x2a0]
+ mov r5, #0xf0
+ asr r5, r6
+ ldr r6, [sp, #0x2a0]
+ and r6, r5
+ ldr r5, [sp, #0x29c]
+ orr r5, r6
+ lsl r5, r5, #0x18
+ lsr r5, r5, #0x18
+ strb r5, [r0, r7]
+ ldr r0, [sp, #0x250]
+ cmp r0, #0x0
+ beq _02019AAC
+ ldr r6, [sp, #0x298]
+ ldr r0, [sp, #0x8c]
+ add r6, r6, r0
+ ldr r0, [sp, #0x88]
+ strb r5, [r0, r6]
+_02019AAC:
+ ldr r0, [sp, #0x294]
+ add r1, r1, #0x1
+ add r4, r4, #0x4
+ add r3, r3, #0x4
+ add r2, r2, #0x1
+ cmp r1, r0
+ blt _02019A58
+_02019ABA:
+ ldr r0, [sp, #0x250]
+ cmp r0, #0x0
+ beq _02019AC8
+ ldr r0, [sp, #0x48]
+ add r0, r0, #0x2
+ str r0, [sp, #0x48]
+ b _02019ACE
+_02019AC8:
+ ldr r0, [sp, #0x48]
+ add r0, r0, #0x1
+ str r0, [sp, #0x48]
+_02019ACE:
+ ldr r0, [sp, #0x0]
+ add r0, r0, #0x4
+ str r0, [sp, #0x0]
+ ldr r0, [sp, #0x254]
+ add r1, r0, #0x1
+ ldr r0, [sp, #0x4]
+ str r1, [sp, #0x254]
+ cmp r1, r0
+ blt _02019A00
+ add sp, #0x1fc
+ add sp, #0x118
+ pop {r4-r7, pc}
+_02019AE6:
+ ldr r0, [sp, #0x0]
+ mov r1, #0x7
+ str r0, [sp, #0x23c]
+ ldr r0, [sp, #0x48]
+ str r0, [sp, #0x244]
+ mov r0, #0x0
+ str r0, [sp, #0x248]
+ ldr r0, [sp, #0x330]
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0xa8]
+ ldr r0, [sp, #0x58]
+ and r1, r0
+ add r0, r0, r1
+ asr r0, r0, #0x3
+ str r0, [sp, #0x40]
+_02019B06:
+ ldr r0, [sp, #0x23c]
+ ldr r1, [sp, #0xa8]
+ ldr r0, [r0, #0x0]
+ ldr r2, [sp, #0x5c]
+ str r0, [sp, #0x238]
+ ldr r0, [sp, #0x248]
+ asr r1, r0
+ mov r0, #0x1
+ and r0, r1
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x240]
+ ldr r0, [sp, #0x8]
+ mov r1, #0x0
+ cmp r0, #0x0
+ ble _02019BC2
+ ble _02019BC2
+ add r0, r2, #0x0
+ lsl r3, r0, #0x2
+ ldr r0, [sp, #0x244]
+ ldr r6, [sp, #0x40]
+ lsl r5, r0, #0x2
+ ldr r0, =0x00003FE0
+ add r7, r5, #0x0
+ and r0, r5
+ mul r6, r0
+ mov r0, #0x1c
+ and r7, r0
+ ldr r0, [sp, #0x244]
+ str r6, [sp, #0xa4]
+ add r0, r0, #0x1
+ lsl r6, r0, #0x2
+ ldr r0, =0x00003FE0
+ ldr r5, [sp, #0x40]
+ and r0, r6
+ mul r5, r0
+ mov r0, #0x1c
+ and r0, r6
+ add r4, r1, #0x0
+ str r5, [sp, #0xa0]
+ str r0, [sp, #0x9c]
+_02019B58:
+ asr r5, r2, #0x1
+ mov r0, #0x3
+ and r5, r0
+ ldr r0, [sp, #0x278]
+ add r0, r0, r5
+ ldr r5, =0x00003FE0
+// b _02019B6C
+// nop
+// _02019B68: .word 0x00003FE0
+// _02019B6C:
+ and r5, r3
+ add r5, r0, r5
+ ldr r0, [sp, #0xa4]
+ str r5, [sp, #0x2a4]
+ add r0, r5, r0
+ ldr r5, [sp, #0x238]
+ add r6, r5, #0x0
+ lsr r6, r4
+ mov r5, #0xf
+ and r5, r6
+ lsl r5, r5, #0x18
+ lsr r5, r5, #0x18
+ beq _02019BB4
+ lsl r6, r2, #0x1f
+ lsr r6, r6, #0x1d
+ lsl r5, r6
+ str r5, [sp, #0x2a8]
+ ldrb r5, [r0, r7]
+ str r5, [sp, #0x2ac]
+ mov r5, #0xf0
+ asr r5, r6
+ ldr r6, [sp, #0x2ac]
+ and r6, r5
+ ldr r5, [sp, #0x2a8]
+ orr r5, r6
+ lsl r5, r5, #0x18
+ lsr r5, r5, #0x18
+ strb r5, [r0, r7]
+ ldr r0, [sp, #0x240]
+ cmp r0, #0x0
+ beq _02019BB4
+ ldr r6, [sp, #0x2a4]
+ ldr r0, [sp, #0xa0]
+ add r6, r6, r0
+ ldr r0, [sp, #0x9c]
+ strb r5, [r0, r6]
+_02019BB4:
+ ldr r0, [sp, #0x8]
+ add r1, r1, #0x1
+ add r4, r4, #0x4
+ add r3, r3, #0x4
+ add r2, r2, #0x1
+ cmp r1, r0
+ blt _02019B58
+_02019BC2:
+ ldr r0, [sp, #0x240]
+ cmp r0, #0x0
+ beq _02019BD0
+ ldr r0, [sp, #0x244]
+ add r0, r0, #0x2
+ str r0, [sp, #0x244]
+ b _02019BD6
+_02019BD0:
+ ldr r0, [sp, #0x244]
+ add r0, r0, #0x1
+ str r0, [sp, #0x244]
+_02019BD6:
+ ldr r0, [sp, #0x23c]
+ add r0, r0, #0x4
+ str r0, [sp, #0x23c]
+ ldr r0, [sp, #0x248]
+ add r0, r0, #0x1
+ str r0, [sp, #0x248]
+ cmp r0, #0x8
+ blt _02019B06
+ ldr r0, [sp, #0x0]
+ mov r2, #0x0
+ add r0, #0x40
+ str r0, [sp, #0x0]
+ ldr r0, [sp, #0x48]
+ mov r1, #0x1
+ add r0, #0x8
+ str r0, [sp, #0x48]
+_02019BF6:
+ ldr r0, [sp, #0x330]
+ asr r0, r2
+ tst r0, r1
+ beq _02019C04
+ ldr r0, [sp, #0x48]
+ add r0, r0, #0x1
+ str r0, [sp, #0x48]
+_02019C04:
+ add r2, r2, #0x1
+ cmp r2, #0x8
+ blt _02019BF6
+ ldr r0, [sp, #0x330]
+ asr r0, r0, #0x8
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0xb8]
+ mov r0, #0x0
+ str r0, [sp, #0x20]
+ ldr r0, [sp, #0x4]
+ sub r0, #0x8
+ cmp r0, #0x0
+ bgt _02019C24
+ bl _0201A8BC
+_02019C24:
+ ldr r0, [sp, #0x0]
+ ldr r1, [sp, #0xb8]
+ ldr r0, [r0, #0x0]
+ ldr r2, [sp, #0x5c]
+ str r0, [sp, #0x230]
+ ldr r0, [sp, #0x20]
+ asr r1, r0
+ mov r0, #0x1
+ and r0, r1
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x234]
+ ldr r0, [sp, #0x8]
+ mov r1, #0x0
+ cmp r0, #0x0
+ ble _02019CD8
+ ble _02019CD8
+ add r0, r2, #0x0
+ lsl r3, r0, #0x2
+ ldr r0, [sp, #0x48]
+ ldr r6, [sp, #0x40]
+ lsl r5, r0, #0x2
+ ldr r0, =0x00003FE0
+ add r7, r5, #0x0
+ and r0, r5
+ mul r6, r0
+ mov r0, #0x1c
+ and r7, r0
+ ldr r0, [sp, #0x48]
+ str r6, [sp, #0xb4]
+ add r0, r0, #0x1
+ lsl r6, r0, #0x2
+ ldr r0, =0x00003FE0
+ ldr r5, [sp, #0x40]
+ and r0, r6
+ mul r5, r0
+ mov r0, #0x1c
+ and r0, r6
+ add r4, r1, #0x0
+ str r5, [sp, #0xb0]
+ str r0, [sp, #0xac]
+_02019C76:
+ asr r5, r2, #0x1
+ mov r0, #0x3
+ and r5, r0
+ ldr r0, [sp, #0x278]
+ add r0, r0, r5
+ ldr r5, =0x00003FE0
+ and r5, r3
+ add r5, r0, r5
+ ldr r0, [sp, #0xb4]
+ str r5, [sp, #0x2b0]
+ add r0, r5, r0
+ ldr r5, [sp, #0x230]
+ add r6, r5, #0x0
+ lsr r6, r4
+ mov r5, #0xf
+ and r5, r6
+ lsl r5, r5, #0x18
+ lsr r5, r5, #0x18
+ beq _02019CCA
+ lsl r6, r2, #0x1f
+ lsr r6, r6, #0x1d
+ lsl r5, r6
+ str r5, [sp, #0x2b4]
+ ldrb r5, [r0, r7]
+ str r5, [sp, #0x2b8]
+ mov r5, #0xf0
+ asr r5, r6
+ ldr r6, [sp, #0x2b8]
+ and r6, r5
+ ldr r5, [sp, #0x2b4]
+ orr r5, r6
+ lsl r5, r5, #0x18
+ lsr r5, r5, #0x18
+ strb r5, [r0, r7]
+ ldr r0, [sp, #0x234]
+ cmp r0, #0x0
+ beq _02019CCA
+ ldr r6, [sp, #0x2b0]
+ ldr r0, [sp, #0xb0]
+ add r6, r6, r0
+ ldr r0, [sp, #0xac]
+ strb r5, [r0, r6]
+_02019CCA:
+ ldr r0, [sp, #0x8]
+ add r1, r1, #0x1
+ add r4, r4, #0x4
+ add r3, r3, #0x4
+ add r2, r2, #0x1
+ cmp r1, r0
+ blt _02019C76
+_02019CD8:
+ ldr r0, [sp, #0x234]
+ cmp r0, #0x0
+ beq _02019CE6
+ ldr r0, [sp, #0x48]
+ add r0, r0, #0x2
+ str r0, [sp, #0x48]
+ b _02019CEC
+_02019CE6:
+ ldr r0, [sp, #0x48]
+ add r0, r0, #0x1
+ str r0, [sp, #0x48]
+_02019CEC:
+ ldr r0, [sp, #0x0]
+ ldr r1, [sp, #0x4]
+ add r0, r0, #0x4
+ str r0, [sp, #0x0]
+ ldr r0, [sp, #0x20]
+ sub r1, #0x8
+ add r0, r0, #0x1
+ str r0, [sp, #0x20]
+ cmp r0, r1
+ blt _02019C24
+ add sp, #0x1fc
+ add sp, #0x118
+ pop {r4-r7, pc}
+_02019D06:
+ ldr r0, [sp, #0x0]
+ str r0, [sp, #0x220]
+ ldr r0, [sp, #0x48]
+ str r0, [sp, #0x228]
+ ldr r0, [sp, #0x330]
+ lsl r0, r0, #0x18
+ lsr r1, r0, #0x18
+ mov r0, #0x0
+ str r0, [sp, #0x22c]
+ lsl r0, r1, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x3c]
+ ldr r0, [sp, #0x58]
+ mov r1, #0x7
+ and r1, r0
+ add r0, r0, r1
+ asr r0, r0, #0x3
+ str r0, [sp, #0x38]
+_02019D2A:
+ ldr r0, [sp, #0x220]
+ ldr r1, [sp, #0x3c]
+ ldr r0, [r0, #0x0]
+ ldr r2, [sp, #0x5c]
+ str r0, [sp, #0x21c]
+ ldr r0, [sp, #0x22c]
+ ldr r6, [sp, #0x38]
+ asr r1, r0
+ mov r0, #0x1
+ and r0, r1
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x224]
+ add r0, r2, #0x0
+ lsl r3, r0, #0x2
+ ldr r0, [sp, #0x228]
+ mov r1, #0x0
+ lsl r5, r0, #0x2
+ ldr r0, =0x00003FE0
+ add r7, r5, #0x0
+ and r0, r5
+ mul r6, r0
+ mov r0, #0x1c
+ and r7, r0
+ ldr r0, [sp, #0x228]
+ str r6, [sp, #0xc4]
+ add r0, r0, #0x1
+ lsl r6, r0, #0x2
+ ldr r0, =0x00003FE0
+ ldr r5, [sp, #0x38]
+ and r0, r6
+ mul r5, r0
+ mov r0, #0x1c
+ and r0, r6
+ str r3, [sp, #0x34]
+ add r4, r1, #0x0
+ str r5, [sp, #0xc0]
+ str r0, [sp, #0xbc]
+_02019D76:
+ asr r5, r2, #0x1
+ mov r0, #0x3
+ and r5, r0
+ ldr r0, [sp, #0x278]
+ add r0, r0, r5
+ ldr r5, =0x00003FE0
+ and r5, r3
+ add r5, r0, r5
+ ldr r0, [sp, #0xc4]
+ str r5, [sp, #0x2bc]
+ add r0, r5, r0
+ ldr r5, [sp, #0x21c]
+ add r6, r5, #0x0
+ lsr r6, r4
+ mov r5, #0xf
+ and r5, r6
+ lsl r5, r5, #0x18
+ lsr r5, r5, #0x18
+ beq _02019DCA
+ lsl r6, r2, #0x1f
+ lsr r6, r6, #0x1d
+ lsl r5, r6
+ str r5, [sp, #0x2c0]
+ ldrb r5, [r0, r7]
+ str r5, [sp, #0x2c4]
+ mov r5, #0xf0
+ asr r5, r6
+ ldr r6, [sp, #0x2c4]
+ and r6, r5
+ ldr r5, [sp, #0x2c0]
+ orr r5, r6
+ lsl r5, r5, #0x18
+ lsr r5, r5, #0x18
+ strb r5, [r0, r7]
+ ldr r0, [sp, #0x224]
+ cmp r0, #0x0
+ beq _02019DCA
+ ldr r6, [sp, #0x2bc]
+ ldr r0, [sp, #0xc0]
+ add r6, r6, r0
+ ldr r0, [sp, #0xbc]
+ strb r5, [r0, r6]
+_02019DCA:
+ add r1, r1, #0x1
+ add r4, r4, #0x4
+ add r3, r3, #0x4
+ add r2, r2, #0x1
+ cmp r1, #0x8
+ blt _02019D76
+ ldr r0, [sp, #0x224]
+ cmp r0, #0x0
+ beq _02019DE4
+ ldr r0, [sp, #0x228]
+ add r0, r0, #0x2
+ str r0, [sp, #0x228]
+ b _02019DEA
+_02019DE4:
+ ldr r0, [sp, #0x228]
+ add r0, r0, #0x1
+ str r0, [sp, #0x228]
+_02019DEA:
+ ldr r0, [sp, #0x220]
+ add r0, r0, #0x4
+ str r0, [sp, #0x220]
+ ldr r0, [sp, #0x22c]
+ add r0, r0, #0x1
+ str r0, [sp, #0x22c]
+ cmp r0, #0x8
+ blt _02019D2A
+ ldr r0, [sp, #0x0]
+ str r0, [sp, #0x20c]
+ add r0, #0x20
+ str r0, [sp, #0x20c]
+ ldr r0, [sp, #0x48]
+ str r0, [sp, #0x214]
+ mov r0, #0x0
+ str r0, [sp, #0x218]
+ ldr r0, [sp, #0x5c]
+ str r0, [sp, #0xd4]
+ add r0, #0x8
+ str r0, [sp, #0xd4]
+_02019E12:
+ ldr r0, [sp, #0x20c]
+ ldr r1, [sp, #0x3c]
+ ldr r0, [r0, #0x0]
+ ldr r2, [sp, #0xd4]
+ str r0, [sp, #0x208]
+ ldr r0, [sp, #0x218]
+ asr r1, r0
+ mov r0, #0x1
+ and r0, r1
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x210]
+ ldr r0, [sp, #0x8]
+ mov r1, #0x0
+ str r0, [sp, #0x2c8]
+ sub r0, #0x8
+ str r0, [sp, #0x2c8]
+ cmp r0, #0x0
+ ble _02019ECC
+ ble _02019ECC
+ add r0, r2, #0x0
+ lsl r3, r0, #0x2
+ ldr r0, [sp, #0x214]
+ ldr r6, [sp, #0x38]
+ lsl r5, r0, #0x2
+ ldr r0, =0x00003FE0
+ add r7, r5, #0x0
+ and r0, r5
+ mul r6, r0
+ mov r0, #0x1c
+ and r7, r0
+ ldr r0, [sp, #0x214]
+ str r6, [sp, #0xd0]
+ add r0, r0, #0x1
+ lsl r6, r0, #0x2
+ ldr r0, =0x00003FE0
+ ldr r5, [sp, #0x38]
+ and r0, r6
+ mul r5, r0
+ mov r0, #0x1c
+ and r0, r6
+ add r4, r1, #0x0
+ str r5, [sp, #0xcc]
+ str r0, [sp, #0xc8]
+_02019E6A:
+ asr r5, r2, #0x1
+ mov r0, #0x3
+ and r5, r0
+ ldr r0, [sp, #0x278]
+ add r0, r0, r5
+ ldr r5, =0x00003FE0
+ and r5, r3
+ add r5, r0, r5
+ ldr r0, [sp, #0xd0]
+ str r5, [sp, #0x2cc]
+ add r0, r5, r0
+ ldr r5, [sp, #0x208]
+ add r6, r5, #0x0
+ lsr r6, r4
+ mov r5, #0xf
+ and r5, r6
+ lsl r5, r5, #0x18
+ lsr r5, r5, #0x18
+ beq _02019EBE
+ lsl r6, r2, #0x1f
+ lsr r6, r6, #0x1d
+ lsl r5, r6
+ str r5, [sp, #0x2d0]
+ ldrb r5, [r0, r7]
+ str r5, [sp, #0x2d4]
+ mov r5, #0xf0
+ asr r5, r6
+ ldr r6, [sp, #0x2d4]
+ and r6, r5
+ ldr r5, [sp, #0x2d0]
+ orr r5, r6
+ lsl r5, r5, #0x18
+ lsr r5, r5, #0x18
+ strb r5, [r0, r7]
+ ldr r0, [sp, #0x210]
+ cmp r0, #0x0
+ beq _02019EBE
+ ldr r6, [sp, #0x2cc]
+ ldr r0, [sp, #0xcc]
+ add r6, r6, r0
+ ldr r0, [sp, #0xc8]
+ strb r5, [r0, r6]
+_02019EBE:
+ ldr r0, [sp, #0x2c8]
+ add r1, r1, #0x1
+ add r4, r4, #0x4
+ add r3, r3, #0x4
+ add r2, r2, #0x1
+ cmp r1, r0
+ blt _02019E6A
+_02019ECC:
+ ldr r0, [sp, #0x210]
+ cmp r0, #0x0
+ beq _02019EDA
+ ldr r0, [sp, #0x214]
+ add r0, r0, #0x2
+ str r0, [sp, #0x214]
+ b _02019EE0
+_02019EDA:
+ ldr r0, [sp, #0x214]
+ add r0, r0, #0x1
+ str r0, [sp, #0x214]
+_02019EE0:
+ ldr r0, [sp, #0x20c]
+ add r0, r0, #0x4
+ str r0, [sp, #0x20c]
+ ldr r0, [sp, #0x218]
+ add r0, r0, #0x1
+ str r0, [sp, #0x218]
+ cmp r0, #0x8
+ blt _02019E12
+ ldr r0, [sp, #0x0]
+ mov r2, #0x0
+ str r0, [sp, #0x1fc]
+ add r0, #0x40
+ str r0, [sp, #0x1fc]
+ ldr r0, [sp, #0x48]
+ mov r1, #0x1
+ add r0, #0x8
+ str r0, [sp, #0x48]
+ str r0, [sp, #0x204]
+_02019F04:
+ ldr r0, [sp, #0x330]
+ asr r0, r2
+ tst r0, r1
+ beq _02019F12
+ ldr r0, [sp, #0x204]
+ add r0, r0, #0x1
+ str r0, [sp, #0x204]
+_02019F12:
+ add r2, r2, #0x1
+ cmp r2, #0x8
+ blt _02019F04
+ ldr r0, [sp, #0x330]
+ asr r0, r0, #0x8
+ str r0, [sp, #0x50]
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0xe4]
+ mov r0, #0x0
+ str r0, [sp, #0x1c]
+ ldr r0, [sp, #0x4]
+ sub r0, #0x8
+ cmp r0, #0x0
+ ble _0201A008
+_02019F30:
+ ldr r0, [sp, #0x1fc]
+ ldr r1, [sp, #0xe4]
+ ldr r0, [r0, #0x0]
+ ldr r6, [sp, #0x38]
+ str r0, [sp, #0x1f8]
+ ldr r0, [sp, #0x1c]
+ ldr r2, [sp, #0x5c]
+ asr r1, r0
+ mov r0, #0x1
+ and r0, r1
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x200]
+ ldr r0, [sp, #0x204]
+ mov r1, #0x0
+ lsl r5, r0, #0x2
+ ldr r0, =0x00003FE0
+ add r7, r5, #0x0
+ and r0, r5
+ mul r6, r0
+ mov r0, #0x1c
+ and r7, r0
+ ldr r0, [sp, #0x204]
+ str r6, [sp, #0xe0]
+ add r0, r0, #0x1
+ lsl r6, r0, #0x2
+ ldr r0, =0x00003FE0
+ ldr r5, [sp, #0x38]
+ and r0, r6
+ mul r5, r0
+ mov r0, #0x1c
+ and r0, r6
+ ldr r3, [sp, #0x34]
+ add r4, r1, #0x0
+ str r5, [sp, #0xdc]
+ str r0, [sp, #0xd8]
+_02019F78:
+ asr r5, r2, #0x1
+ mov r0, #0x3
+ and r5, r0
+ ldr r0, [sp, #0x278]
+ add r0, r0, r5
+ ldr r5, =0x00003FE0
+// b _02019F8C
+// nop
+// _02019F88: .word 0x00003FE0
+// _02019F8C:
+ and r5, r3
+ add r5, r0, r5
+ ldr r0, [sp, #0xe0]
+ str r5, [sp, #0x2d8]
+ add r0, r5, r0
+ ldr r5, [sp, #0x1f8]
+ add r6, r5, #0x0
+ lsr r6, r4
+ mov r5, #0xf
+ and r5, r6
+ lsl r5, r5, #0x18
+ lsr r5, r5, #0x18
+ beq _02019FD4
+ lsl r6, r2, #0x1f
+ lsr r6, r6, #0x1d
+ lsl r5, r6
+ str r5, [sp, #0x2dc]
+ ldrb r5, [r0, r7]
+ str r5, [sp, #0x2e0]
+ mov r5, #0xf0
+ asr r5, r6
+ ldr r6, [sp, #0x2e0]
+ and r6, r5
+ ldr r5, [sp, #0x2dc]
+ orr r5, r6
+ lsl r5, r5, #0x18
+ lsr r5, r5, #0x18
+ strb r5, [r0, r7]
+ ldr r0, [sp, #0x200]
+ cmp r0, #0x0
+ beq _02019FD4
+ ldr r6, [sp, #0x2d8]
+ ldr r0, [sp, #0xdc]
+ add r6, r6, r0
+ ldr r0, [sp, #0xd8]
+ strb r5, [r0, r6]
+_02019FD4:
+ add r1, r1, #0x1
+ add r4, r4, #0x4
+ add r3, r3, #0x4
+ add r2, r2, #0x1
+ cmp r1, #0x8
+ blt _02019F78
+ ldr r0, [sp, #0x200]
+ cmp r0, #0x0
+ beq _02019FEE
+ ldr r0, [sp, #0x204]
+ add r0, r0, #0x2
+ str r0, [sp, #0x204]
+ b _02019FF4
+_02019FEE:
+ ldr r0, [sp, #0x204]
+ add r0, r0, #0x1
+ str r0, [sp, #0x204]
+_02019FF4:
+ ldr r0, [sp, #0x1fc]
+ ldr r1, [sp, #0x4]
+ add r0, r0, #0x4
+ str r0, [sp, #0x1fc]
+ ldr r0, [sp, #0x1c]
+ sub r1, #0x8
+ add r0, r0, #0x1
+ str r0, [sp, #0x1c]
+ cmp r0, r1
+ blt _02019F30
+_0201A008:
+ ldr r0, [sp, #0x0]
+ mov r2, #0x0
+ add r0, #0x60
+ str r0, [sp, #0x0]
+ mov r1, #0x1
+_0201A012:
+ ldr r0, [sp, #0x330]
+ asr r0, r2
+ tst r0, r1
+ beq _0201A020
+ ldr r0, [sp, #0x48]
+ add r0, r0, #0x1
+ str r0, [sp, #0x48]
+_0201A020:
+ add r2, r2, #0x1
+ cmp r2, #0x8
+ blt _0201A012
+ ldr r0, [sp, #0x50]
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0xf4]
+ mov r0, #0x0
+ str r0, [sp, #0x18]
+ ldr r0, [sp, #0x4]
+ sub r0, #0x8
+ cmp r0, #0x0
+ bgt _0201A03E
+ bl _0201A8BC
+_0201A03E:
+ ldr r0, [sp, #0x5c]
+ add r0, #0x8
+ str r0, [sp, #0x5c]
+_0201A044:
+ ldr r0, [sp, #0x0]
+ ldr r1, [sp, #0xf4]
+ ldr r0, [r0, #0x0]
+ ldr r2, [sp, #0x5c]
+ str r0, [sp, #0x1f0]
+ ldr r0, [sp, #0x18]
+ asr r1, r0
+ mov r0, #0x1
+ and r0, r1
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x1f4]
+ ldr r0, [sp, #0x8]
+ mov r1, #0x0
+ str r0, [sp, #0x2e4]
+ sub r0, #0x8
+ str r0, [sp, #0x2e4]
+ cmp r0, #0x0
+ ble _0201A0FE
+ ble _0201A0FE
+ add r0, r2, #0x0
+ lsl r3, r0, #0x2
+ ldr r0, [sp, #0x48]
+ ldr r6, [sp, #0x38]
+ lsl r5, r0, #0x2
+ ldr r0, =0x00003FE0
+ add r7, r5, #0x0
+ and r0, r5
+ mul r6, r0
+ mov r0, #0x1c
+ and r7, r0
+ ldr r0, [sp, #0x48]
+ str r6, [sp, #0xf0]
+ add r0, r0, #0x1
+ lsl r6, r0, #0x2
+ ldr r0, =0x00003FE0
+ ldr r5, [sp, #0x38]
+ and r0, r6
+ mul r5, r0
+ mov r0, #0x1c
+ and r0, r6
+ add r4, r1, #0x0
+ str r5, [sp, #0xec]
+ str r0, [sp, #0xe8]
+_0201A09C:
+ asr r5, r2, #0x1
+ mov r0, #0x3
+ and r5, r0
+ ldr r0, [sp, #0x278]
+ add r0, r0, r5
+ ldr r5, =0x00003FE0
+ and r5, r3
+ add r5, r0, r5
+ ldr r0, [sp, #0xf0]
+ str r5, [sp, #0x2e8]
+ add r0, r5, r0
+ ldr r5, [sp, #0x1f0]
+ add r6, r5, #0x0
+ lsr r6, r4
+ mov r5, #0xf
+ and r5, r6
+ lsl r5, r5, #0x18
+ lsr r5, r5, #0x18
+ beq _0201A0F0
+ lsl r6, r2, #0x1f
+ lsr r6, r6, #0x1d
+ lsl r5, r6
+ str r5, [sp, #0x2ec]
+ ldrb r5, [r0, r7]
+ mov r12, r5
+ mov r5, #0xf0
+ asr r5, r6
+ mov r6, r12
+ and r6, r5
+ ldr r5, [sp, #0x2ec]
+ orr r5, r6
+ lsl r5, r5, #0x18
+ lsr r5, r5, #0x18
+ strb r5, [r0, r7]
+ ldr r0, [sp, #0x1f4]
+ cmp r0, #0x0
+ beq _0201A0F0
+ ldr r6, [sp, #0x2e8]
+ ldr r0, [sp, #0xec]
+ add r6, r6, r0
+ ldr r0, [sp, #0xe8]
+ strb r5, [r0, r6]
+_0201A0F0:
+ ldr r0, [sp, #0x2e4]
+ add r1, r1, #0x1
+ add r4, r4, #0x4
+ add r3, r3, #0x4
+ add r2, r2, #0x1
+ cmp r1, r0
+ blt _0201A09C
+_0201A0FE:
+ ldr r0, [sp, #0x1f4]
+ cmp r0, #0x0
+ beq _0201A10C
+ ldr r0, [sp, #0x48]
+ add r0, r0, #0x2
+ str r0, [sp, #0x48]
+ b _0201A112
+_0201A10C:
+ ldr r0, [sp, #0x48]
+ add r0, r0, #0x1
+ str r0, [sp, #0x48]
+_0201A112:
+ ldr r0, [sp, #0x0]
+ ldr r1, [sp, #0x4]
+ add r0, r0, #0x4
+ str r0, [sp, #0x0]
+ ldr r0, [sp, #0x18]
+ sub r1, #0x8
+ add r0, r0, #0x1
+ str r0, [sp, #0x18]
+ cmp r0, r1
+ blt _0201A044
+ add sp, #0x1fc
+ add sp, #0x118
+ pop {r4-r7, pc}
+_0201A12C: // 0x0201A12C
+ lsl r1, r2, #0x2
+ mul r1, r3
+ ldr r3, [r5, #0x0]
+ ldrb r2, [r5, #0x9]
+ ldr r0, [sp, #0x0]
+ ldr r3, [r3, #0x0]
+ lsl r1, r1, #0x3
+ bl Convert4bppTo8bpp
+ str r0, [sp, #0x1ec]
+ cmp r4, #0x3
+ bhi _0201A21E
+ add r0, r4, r4
+ add r0, pc
+ ldrh r0, [r0, #0x6]
+ lsl r0, r0, #0x10
+ asr r0, r0, #0x10
+ add pc, r0
+_0201A150:
+
+ lsl r6, r0, #0
+ lsl r6, r1, #3
+ lsl r0, r7, #9
+ lsl r4, r3, #16
+ // jump table (using 16-bit offset)
+ // .short _0201A158 - _0201A150 - 2; case 0
+ // .short _0201A220 - _0201A150 - 2; case 1
+ // .short _0201A3CA - _0201A150 - 2; case 2
+ // .short _0201A56E - _0201A150 - 2; case 3
+_0201A158:
+ ldr r0, [sp, #0x330]
+ ldr r7, [sp, #0x1ec]
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x10c]
+ mov r0, #0x0
+ str r0, [sp, #0x1e8]
+ ldr r0, [sp, #0x4]
+ cmp r0, #0x0
+ ble _0201A21E
+ ldr r0, [sp, #0x58]
+ mov r1, #0x7
+ and r1, r0
+ add r0, r0, r1
+ asr r0, r0, #0x3
+ str r0, [sp, #0x108]
+_0201A178:
+ ldr r1, [sp, #0x10c]
+ ldr r0, [sp, #0x1e8]
+ mov r4, #0x0
+ asr r1, r0
+ mov r0, #0x1
+ and r0, r1
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x310]
+ ldr r0, [sp, #0x8]
+ ldr r5, [sp, #0x5c]
+ cmp r0, #0x0
+ ble _0201A1FC
+ ble _0201A1FC
+ add r0, r5, #0x0
+ lsl r6, r0, #0x3
+ ldr r0, [sp, #0x48]
+ ldr r2, [sp, #0x108]
+ lsl r1, r0, #0x3
+ ldr r0, =0x00007FC0
+ mov r3, #0x38
+ and r0, r1
+ mul r2, r0
+ add r0, r1, #0x0
+ and r0, r3
+ str r0, [sp, #0x100]
+ ldr r0, [sp, #0x48]
+ str r2, [sp, #0x104]
+ add r0, r0, #0x1
+ lsl r1, r0, #0x3
+ ldr r0, =0x00007FC0
+ ldr r2, [sp, #0x108]
+ and r0, r1
+ mul r2, r0
+ add r0, r1, #0x0
+ and r0, r3
+ str r2, [sp, #0xfc]
+ str r0, [sp, #0xf8]
+_0201A1C4:
+ mov r0, #0x7
+ add r1, r5, #0x0
+ and r1, r0
+ ldr r0, [sp, #0x278]
+ add r1, r0, r1
+ ldr r0, =0x00007FC0
+ and r0, r6
+ add r3, r1, r0
+ ldr r0, [sp, #0x104]
+ ldrb r1, [r7, r4]
+ add r2, r3, r0
+ cmp r1, #0x0
+ beq _0201A1F0
+ ldr r0, [sp, #0x100]
+ strb r1, [r2, r0]
+ ldr r0, [sp, #0x310]
+ cmp r0, #0x0
+ beq _0201A1F0
+ ldr r0, [sp, #0xfc]
+ add r2, r3, r0
+ ldr r0, [sp, #0xf8]
+ strb r1, [r0, r2]
+_0201A1F0:
+ ldr r0, [sp, #0x8]
+ add r4, r4, #0x1
+ add r6, #0x8
+ add r5, r5, #0x1
+ cmp r4, r0
+ blt _0201A1C4
+_0201A1FC:
+ ldr r0, [sp, #0x310]
+ cmp r0, #0x0
+ beq _0201A20A
+ ldr r0, [sp, #0x48]
+ add r0, r0, #0x2
+ str r0, [sp, #0x48]
+ b _0201A210
+_0201A20A:
+ ldr r0, [sp, #0x48]
+ add r0, r0, #0x1
+ str r0, [sp, #0x48]
+_0201A210:
+ ldr r0, [sp, #0x1e8]
+ add r7, #0x8
+ add r1, r0, #0x1
+ ldr r0, [sp, #0x4]
+ str r1, [sp, #0x1e8]
+ cmp r1, r0
+ blt _0201A178
+_0201A21E:
+ b _0201A8B6
+_0201A220:
+ ldr r0, [sp, #0x48]
+ ldr r7, [sp, #0x1ec]
+ str r0, [sp, #0x1e0]
+ ldr r0, [sp, #0x330]
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x4c]
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x124]
+ mov r0, #0x0
+ str r0, [sp, #0x1e4]
+ ldr r0, [sp, #0x4]
+ cmp r0, #0x0
+ ble _0201A2E6
+ ldr r0, [sp, #0x58]
+ mov r1, #0x7
+ and r1, r0
+ add r0, r0, r1
+ asr r0, r0, #0x3
+ str r0, [sp, #0x120]
+_0201A24A:
+ ldr r1, [sp, #0x124]
+ ldr r0, [sp, #0x1e4]
+ ldr r5, [sp, #0x5c]
+ asr r1, r0
+ mov r0, #0x1
+ and r0, r1
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x30c]
+ add r0, r5, #0x0
+ lsl r6, r0, #0x3
+ ldr r0, [sp, #0x1e0]
+ ldr r2, [sp, #0x120]
+ lsl r1, r0, #0x3
+ ldr r0, =0x00007FC0
+ mov r3, #0x38
+ and r0, r1
+ mul r2, r0
+ add r0, r1, #0x0
+ and r0, r3
+ str r0, [sp, #0x118]
+ ldr r0, [sp, #0x1e0]
+ str r2, [sp, #0x11c]
+ add r0, r0, #0x1
+ lsl r1, r0, #0x3
+ ldr r0, =0x00007FC0
+ ldr r2, [sp, #0x120]
+ and r0, r1
+ mul r2, r0
+ add r0, r1, #0x0
+ and r0, r3
+ mov r4, #0x0
+ str r2, [sp, #0x114]
+ str r0, [sp, #0x110]
+_0201A28E:
+ mov r0, #0x7
+ add r1, r5, #0x0
+ and r1, r0
+ ldr r0, [sp, #0x278]
+ add r1, r0, r1
+ ldr r0, =0x00007FC0
+ and r0, r6
+ add r3, r1, r0
+ ldr r0, [sp, #0x11c]
+ ldrb r1, [r7, r4]
+ add r2, r3, r0
+ cmp r1, #0x0
+ beq _0201A2BA
+ ldr r0, [sp, #0x118]
+ strb r1, [r2, r0]
+ ldr r0, [sp, #0x30c]
+ cmp r0, #0x0
+ beq _0201A2BA
+ ldr r0, [sp, #0x114]
+ add r2, r3, r0
+ ldr r0, [sp, #0x110]
+ strb r1, [r0, r2]
+_0201A2BA:
+ add r4, r4, #0x1
+ add r6, #0x8
+ add r5, r5, #0x1
+ cmp r4, #0x8
+ blt _0201A28E
+ ldr r0, [sp, #0x30c]
+ cmp r0, #0x0
+ beq _0201A2D2
+ ldr r0, [sp, #0x1e0]
+ add r0, r0, #0x2
+ str r0, [sp, #0x1e0]
+ b _0201A2D8
+_0201A2D2:
+ ldr r0, [sp, #0x1e0]
+ add r0, r0, #0x1
+ str r0, [sp, #0x1e0]
+_0201A2D8:
+ ldr r0, [sp, #0x1e4]
+ add r7, #0x8
+ add r1, r0, #0x1
+ ldr r0, [sp, #0x4]
+ str r1, [sp, #0x1e4]
+ cmp r1, r0
+ blt _0201A24A
+_0201A2E6:
+ ldr r0, [sp, #0x1ec]
+ str r0, [sp, #0x308]
+ add r0, #0x40
+ str r0, [sp, #0x308]
+ ldr r0, [sp, #0x4c]
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x13c]
+ mov r0, #0x0
+ str r0, [sp, #0x1dc]
+ ldr r0, [sp, #0x4]
+ cmp r0, #0x0
+ ble _0201A3C8
+ ldr r0, [sp, #0x5c]
+ mov r1, #0x7
+ add r0, #0x8
+ str r0, [sp, #0x5c]
+ ldr r0, [sp, #0x58]
+ and r1, r0
+ add r0, r0, r1
+ asr r0, r0, #0x3
+ str r0, [sp, #0x138]
+_0201A312:
+ ldr r1, [sp, #0x13c]
+ ldr r0, [sp, #0x1dc]
+ ldr r7, [sp, #0x8]
+ asr r1, r0
+ mov r0, #0x1
+ and r0, r1
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ sub r7, #0x8
+ mov r4, #0x0
+ str r0, [sp, #0x1d8]
+ ldr r5, [sp, #0x5c]
+ cmp r7, #0x0
+ ble _0201A398
+ ble _0201A398
+ add r0, r5, #0x0
+ lsl r6, r0, #0x3
+ ldr r0, [sp, #0x48]
+ ldr r2, [sp, #0x138]
+ lsl r1, r0, #0x3
+ ldr r0, =0x00007FC0
+ mov r3, #0x38
+ and r0, r1
+ mul r2, r0
+ add r0, r1, #0x0
+ and r0, r3
+ str r0, [sp, #0x130]
+ ldr r0, [sp, #0x48]
+ str r2, [sp, #0x134]
+ add r0, r0, #0x1
+ lsl r1, r0, #0x3
+ ldr r0, =0x00007FC0
+ ldr r2, [sp, #0x138]
+ and r0, r1
+ mul r2, r0
+ add r0, r1, #0x0
+ and r0, r3
+ str r2, [sp, #0x12c]
+ str r0, [sp, #0x128]
+_0201A360:
+ mov r0, #0x7
+ add r1, r5, #0x0
+ and r1, r0
+ ldr r0, [sp, #0x278]
+ add r1, r0, r1
+ ldr r0, =0x00007FC0
+ and r0, r6
+ add r3, r1, r0
+ ldr r0, [sp, #0x134]
+ add r2, r3, r0
+ ldr r0, [sp, #0x308]
+ ldrb r1, [r0, r4]
+ cmp r1, #0x0
+ beq _0201A38E
+ ldr r0, [sp, #0x130]
+ strb r1, [r2, r0]
+ ldr r0, [sp, #0x1d8]
+ cmp r0, #0x0
+ beq _0201A38E
+ ldr r0, [sp, #0x12c]
+ add r2, r3, r0
+ ldr r0, [sp, #0x128]
+ strb r1, [r0, r2]
+_0201A38E:
+ add r4, r4, #0x1
+ add r6, #0x8
+ add r5, r5, #0x1
+ cmp r4, r7
+ blt _0201A360
+_0201A398:
+ ldr r0, [sp, #0x1d8]
+ cmp r0, #0x0
+ beq _0201A3B0
+ ldr r0, [sp, #0x48]
+ add r0, r0, #0x2
+ str r0, [sp, #0x48]
+ b _0201A3B6
+// nop
+// _0201A3A8: .word 0x00003FE0
+// _0201A3AC: .word 0x00007FC0
+_0201A3B0:
+ ldr r0, [sp, #0x48]
+ add r0, r0, #0x1
+ str r0, [sp, #0x48]
+_0201A3B6:
+ ldr r0, [sp, #0x308]
+ add r0, #0x8
+ str r0, [sp, #0x308]
+ ldr r0, [sp, #0x1dc]
+ add r1, r0, #0x1
+ ldr r0, [sp, #0x4]
+ str r1, [sp, #0x1dc]
+ cmp r1, r0
+ blt _0201A312
+_0201A3C8:
+ b _0201A8B6
+_0201A3CA:
+ ldr r0, [sp, #0x48]
+ mov r1, #0x7
+ str r0, [sp, #0x1d0]
+ mov r0, #0x0
+ str r0, [sp, #0x1d4]
+ ldr r0, [sp, #0x330]
+ ldr r7, [sp, #0x1ec]
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x150]
+ ldr r0, [sp, #0x58]
+ and r1, r0
+ add r0, r0, r1
+ asr r0, r0, #0x3
+ str r0, [sp, #0x30]
+_0201A3E8:
+ ldr r1, [sp, #0x150]
+ ldr r0, [sp, #0x1d4]
+ mov r4, #0x0
+ asr r1, r0
+ mov r0, #0x1
+ and r0, r1
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x304]
+ ldr r0, [sp, #0x8]
+ ldr r5, [sp, #0x5c]
+ cmp r0, #0x0
+ ble _0201A46C
+ ble _0201A46C
+ add r0, r5, #0x0
+ lsl r6, r0, #0x3
+ ldr r0, [sp, #0x1d0]
+ ldr r2, [sp, #0x30]
+ lsl r1, r0, #0x3
+ ldr r0, =0x00007FC0
+ mov r3, #0x38
+ and r0, r1
+ mul r2, r0
+ add r0, r1, #0x0
+ and r0, r3
+ str r0, [sp, #0x148]
+ ldr r0, [sp, #0x1d0]
+ str r2, [sp, #0x14c]
+ add r0, r0, #0x1
+ lsl r1, r0, #0x3
+ ldr r0, =0x00007FC0
+ ldr r2, [sp, #0x30]
+ and r0, r1
+ mul r2, r0
+ add r0, r1, #0x0
+ and r0, r3
+ str r2, [sp, #0x144]
+ str r0, [sp, #0x140]
+_0201A434:
+ mov r0, #0x7
+ add r1, r5, #0x0
+ and r1, r0
+ ldr r0, [sp, #0x278]
+ add r1, r0, r1
+ ldr r0, =0x00007FC0
+ and r0, r6
+ add r3, r1, r0
+ ldr r0, [sp, #0x14c]
+ ldrb r1, [r7, r4]
+ add r2, r3, r0
+ cmp r1, #0x0
+ beq _0201A460
+ ldr r0, [sp, #0x148]
+ strb r1, [r2, r0]
+ ldr r0, [sp, #0x304]
+ cmp r0, #0x0
+ beq _0201A460
+ ldr r0, [sp, #0x144]
+ add r2, r3, r0
+ ldr r0, [sp, #0x140]
+ strb r1, [r0, r2]
+_0201A460:
+ ldr r0, [sp, #0x8]
+ add r4, r4, #0x1
+ add r6, #0x8
+ add r5, r5, #0x1
+ cmp r4, r0
+ blt _0201A434
+_0201A46C:
+ ldr r0, [sp, #0x304]
+ cmp r0, #0x0
+ beq _0201A47A
+ ldr r0, [sp, #0x1d0]
+ add r0, r0, #0x2
+ str r0, [sp, #0x1d0]
+ b _0201A480
+_0201A47A:
+ ldr r0, [sp, #0x1d0]
+ add r0, r0, #0x1
+ str r0, [sp, #0x1d0]
+_0201A480:
+ ldr r0, [sp, #0x1d4]
+ add r7, #0x8
+ add r0, r0, #0x1
+ str r0, [sp, #0x1d4]
+ cmp r0, #0x8
+ blt _0201A3E8
+ ldr r0, [sp, #0x48]
+ ldr r7, [sp, #0x1ec]
+ add r0, #0x8
+ str r0, [sp, #0x48]
+ add r7, #0x80
+ mov r0, #0x0
+ mov r2, #0x1
+_0201A49A:
+ ldr r1, [sp, #0x330]
+ asr r1, r0
+ tst r1, r2
+ beq _0201A4A8
+ ldr r1, [sp, #0x48]
+ add r1, r1, #0x1
+ str r1, [sp, #0x48]
+_0201A4A8:
+ add r0, r0, #0x1
+ cmp r0, #0x8
+ blt _0201A49A
+ ldr r0, [sp, #0x330]
+ asr r0, r0, #0x8
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x164]
+ mov r0, #0x0
+ str r0, [sp, #0x14]
+ ldr r0, [sp, #0x4]
+ sub r0, #0x8
+ cmp r0, #0x0
+ ble _0201A56C
+_0201A4C4:
+ ldr r1, [sp, #0x164]
+ ldr r0, [sp, #0x14]
+ mov r4, #0x0
+ asr r1, r0
+ mov r0, #0x1
+ and r0, r1
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x300]
+ ldr r0, [sp, #0x8]
+ ldr r5, [sp, #0x5c]
+ cmp r0, #0x0
+ ble _0201A548
+ ble _0201A548
+ add r0, r5, #0x0
+ lsl r6, r0, #0x3
+ ldr r0, [sp, #0x48]
+ ldr r2, [sp, #0x30]
+ lsl r1, r0, #0x3
+ ldr r0, =0x00007FC0
+ mov r3, #0x38
+ and r0, r1
+ mul r2, r0
+ add r0, r1, #0x0
+ and r0, r3
+ str r0, [sp, #0x15c]
+ ldr r0, [sp, #0x48]
+ str r2, [sp, #0x160]
+ add r0, r0, #0x1
+ lsl r1, r0, #0x3
+ ldr r0, =0x00007FC0
+ ldr r2, [sp, #0x30]
+ and r0, r1
+ mul r2, r0
+ add r0, r1, #0x0
+ and r0, r3
+ str r2, [sp, #0x158]
+ str r0, [sp, #0x154]
+_0201A510:
+ mov r0, #0x7
+ add r1, r5, #0x0
+ and r1, r0
+ ldr r0, [sp, #0x278]
+ add r1, r0, r1
+ ldr r0, =0x00007FC0
+ and r0, r6
+ add r3, r1, r0
+ ldr r0, [sp, #0x160]
+ ldrb r1, [r7, r4]
+ add r2, r3, r0
+ cmp r1, #0x0
+ beq _0201A53C
+ ldr r0, [sp, #0x15c]
+ strb r1, [r2, r0]
+ ldr r0, [sp, #0x300]
+ cmp r0, #0x0
+ beq _0201A53C
+ ldr r0, [sp, #0x158]
+ add r2, r3, r0
+ ldr r0, [sp, #0x154]
+ strb r1, [r0, r2]
+_0201A53C:
+ ldr r0, [sp, #0x8]
+ add r4, r4, #0x1
+ add r6, #0x8
+ add r5, r5, #0x1
+ cmp r4, r0
+ blt _0201A510
+_0201A548:
+ ldr r0, [sp, #0x300]
+ cmp r0, #0x0
+ beq _0201A556
+ ldr r0, [sp, #0x48]
+ add r0, r0, #0x2
+ str r0, [sp, #0x48]
+ b _0201A55C
+_0201A556:
+ ldr r0, [sp, #0x48]
+ add r0, r0, #0x1
+ str r0, [sp, #0x48]
+_0201A55C:
+ ldr r0, [sp, #0x14]
+ ldr r1, [sp, #0x4]
+ add r0, r0, #0x1
+ sub r1, #0x8
+ add r7, #0x8
+ str r0, [sp, #0x14]
+ cmp r0, r1
+ blt _0201A4C4
+_0201A56C:
+ b _0201A8B6
+_0201A56E:
+ ldr r0, [sp, #0x48]
+ ldr r7, [sp, #0x1ec]
+ str r0, [sp, #0x1c8]
+ ldr r0, [sp, #0x330]
+ lsl r0, r0, #0x18
+ lsr r1, r0, #0x18
+ mov r0, #0x0
+ str r0, [sp, #0x1cc]
+ lsl r0, r1, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x2c]
+ ldr r0, [sp, #0x58]
+ mov r1, #0x7
+ and r1, r0
+ add r0, r0, r1
+ asr r0, r0, #0x3
+ str r0, [sp, #0x28]
+_0201A590:
+ ldr r1, [sp, #0x2c]
+ ldr r0, [sp, #0x1cc]
+ ldr r5, [sp, #0x5c]
+ asr r1, r0
+ mov r0, #0x1
+ and r0, r1
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x2fc]
+ add r0, r5, #0x0
+ lsl r6, r0, #0x3
+ ldr r0, [sp, #0x1c8]
+ ldr r2, [sp, #0x28]
+ lsl r1, r0, #0x3
+ ldr r0, =0x00007FC0
+ mov r3, #0x38
+ and r0, r1
+ mul r2, r0
+ add r0, r1, #0x0
+ and r0, r3
+ str r0, [sp, #0x170]
+ ldr r0, [sp, #0x1c8]
+ str r2, [sp, #0x174]
+ add r0, r0, #0x1
+ lsl r1, r0, #0x3
+ ldr r0, =0x00007FC0
+ ldr r2, [sp, #0x28]
+ and r0, r1
+ mul r2, r0
+ add r0, r1, #0x0
+ and r0, r3
+ mov r4, #0x0
+ str r6, [sp, #0x24]
+ str r2, [sp, #0x16c]
+ str r0, [sp, #0x168]
+_0201A5D6:
+ mov r0, #0x7
+ add r1, r5, #0x0
+ and r1, r0
+ ldr r0, [sp, #0x278]
+ add r1, r0, r1
+ ldr r0, =0x00007FC0
+ and r0, r6
+ add r3, r1, r0
+ ldr r0, [sp, #0x174]
+ ldrb r1, [r7, r4]
+ add r2, r3, r0
+ cmp r1, #0x0
+ beq _0201A602
+ ldr r0, [sp, #0x170]
+ strb r1, [r2, r0]
+ ldr r0, [sp, #0x2fc]
+ cmp r0, #0x0
+ beq _0201A602
+ ldr r0, [sp, #0x16c]
+ add r2, r3, r0
+ ldr r0, [sp, #0x168]
+ strb r1, [r0, r2]
+_0201A602:
+ add r4, r4, #0x1
+ add r6, #0x8
+ add r5, r5, #0x1
+ cmp r4, #0x8
+ blt _0201A5D6
+ ldr r0, [sp, #0x2fc]
+ cmp r0, #0x0
+ beq _0201A61A
+ ldr r0, [sp, #0x1c8]
+ add r0, r0, #0x2
+ str r0, [sp, #0x1c8]
+ b _0201A620
+_0201A61A:
+ ldr r0, [sp, #0x1c8]
+ add r0, r0, #0x1
+ str r0, [sp, #0x1c8]
+_0201A620:
+ ldr r0, [sp, #0x1cc]
+ add r7, #0x8
+ add r0, r0, #0x1
+ str r0, [sp, #0x1cc]
+ cmp r0, #0x8
+ blt _0201A590
+ ldr r0, [sp, #0x1ec]
+ str r0, [sp, #0x2f8]
+ add r0, #0x40
+ str r0, [sp, #0x2f8]
+ ldr r0, [sp, #0x48]
+ str r0, [sp, #0x1c0]
+ mov r0, #0x0
+ str r0, [sp, #0x1c4]
+ ldr r0, [sp, #0x5c]
+ str r0, [sp, #0x188]
+ add r0, #0x8
+ str r0, [sp, #0x188]
+_0201A644:
+ ldr r1, [sp, #0x2c]
+ ldr r0, [sp, #0x1c4]
+ ldr r7, [sp, #0x8]
+ asr r1, r0
+ mov r0, #0x1
+ and r0, r1
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ sub r7, #0x8
+ mov r4, #0x0
+ str r0, [sp, #0x1bc]
+ ldr r5, [sp, #0x188]
+ cmp r7, #0x0
+ ble _0201A6CA
+ ble _0201A6CA
+ add r0, r5, #0x0
+ lsl r6, r0, #0x3
+ ldr r0, [sp, #0x1c0]
+ ldr r2, [sp, #0x28]
+ lsl r1, r0, #0x3
+ ldr r0, =0x00007FC0
+ mov r3, #0x38
+ and r0, r1
+ mul r2, r0
+ add r0, r1, #0x0
+ and r0, r3
+ str r0, [sp, #0x180]
+ ldr r0, [sp, #0x1c0]
+ str r2, [sp, #0x184]
+ add r0, r0, #0x1
+ lsl r1, r0, #0x3
+ ldr r0, =0x00007FC0
+ ldr r2, [sp, #0x28]
+ and r0, r1
+ mul r2, r0
+ add r0, r1, #0x0
+ and r0, r3
+ str r2, [sp, #0x17c]
+ str r0, [sp, #0x178]
+_0201A692:
+ mov r0, #0x7
+ add r1, r5, #0x0
+ and r1, r0
+ ldr r0, [sp, #0x278]
+ add r1, r0, r1
+ ldr r0, =0x00007FC0
+ and r0, r6
+ add r3, r1, r0
+ ldr r0, [sp, #0x184]
+ add r2, r3, r0
+ ldr r0, [sp, #0x2f8]
+ ldrb r1, [r0, r4]
+ cmp r1, #0x0
+ beq _0201A6C0
+ ldr r0, [sp, #0x180]
+ strb r1, [r2, r0]
+ ldr r0, [sp, #0x1bc]
+ cmp r0, #0x0
+ beq _0201A6C0
+ ldr r0, [sp, #0x17c]
+ add r2, r3, r0
+ ldr r0, [sp, #0x178]
+ strb r1, [r0, r2]
+_0201A6C0:
+ add r4, r4, #0x1
+ add r6, #0x8
+ add r5, r5, #0x1
+ cmp r4, r7
+ blt _0201A692
+_0201A6CA:
+ ldr r0, [sp, #0x1bc]
+ cmp r0, #0x0
+ beq _0201A6D8
+ ldr r0, [sp, #0x1c0]
+ add r0, r0, #0x2
+ str r0, [sp, #0x1c0]
+ b _0201A6DE
+_0201A6D8:
+ ldr r0, [sp, #0x1c0]
+ add r0, r0, #0x1
+ str r0, [sp, #0x1c0]
+_0201A6DE:
+ ldr r0, [sp, #0x2f8]
+ add r0, #0x8
+ str r0, [sp, #0x2f8]
+ ldr r0, [sp, #0x1c4]
+ add r0, r0, #0x1
+ str r0, [sp, #0x1c4]
+ cmp r0, #0x8
+ blt _0201A644
+ ldr r0, [sp, #0x48]
+ ldr r7, [sp, #0x1ec]
+ add r0, #0x8
+ add r7, #0x80
+ str r0, [sp, #0x48]
+ str r0, [sp, #0x1b8]
+ mov r0, #0x0
+ mov r2, #0x1
+_0201A6FE:
+ ldr r1, [sp, #0x330]
+ asr r1, r0
+ tst r1, r2
+ beq _0201A70C
+ ldr r1, [sp, #0x1b8]
+ add r1, r1, #0x1
+ str r1, [sp, #0x1b8]
+_0201A70C:
+ add r0, r0, #0x1
+ cmp r0, #0x8
+ blt _0201A6FE
+ ldr r0, [sp, #0x330]
+ asr r0, r0, #0x8
+ str r0, [sp, #0x44]
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x19c]
+ mov r0, #0x0
+ str r0, [sp, #0x10]
+ ldr r0, [sp, #0x4]
+ sub r0, #0x8
+ cmp r0, #0x0
+ ble _0201A7CE
+_0201A72A:
+ ldr r1, [sp, #0x19c]
+ ldr r0, [sp, #0x10]
+ ldr r2, [sp, #0x28]
+ asr r1, r0
+ mov r0, #0x1
+ and r0, r1
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x2f4]
+ ldr r0, [sp, #0x1b8]
+ mov r3, #0x38
+ lsl r1, r0, #0x3
+ ldr r0, =0x00007FC0
+// b _0201A74C
+// nop
+// _0201A748: .word 0x00007FC0
+// _0201A74C:
+ ldr r5, [sp, #0x5c]
+ and r0, r1
+ mul r2, r0
+ add r0, r1, #0x0
+ and r0, r3
+ str r0, [sp, #0x194]
+ ldr r0, [sp, #0x1b8]
+ str r2, [sp, #0x198]
+ add r0, r0, #0x1
+ lsl r1, r0, #0x3
+ ldr r0, =0x00007FC0
+ ldr r2, [sp, #0x28]
+ and r0, r1
+ mul r2, r0
+ add r0, r1, #0x0
+ and r0, r3
+ ldr r6, [sp, #0x24]
+ mov r4, #0x0
+ str r2, [sp, #0x190]
+ str r0, [sp, #0x18c]
+_0201A774:
+ mov r0, #0x7
+ add r1, r5, #0x0
+ and r1, r0
+ ldr r0, [sp, #0x278]
+ add r1, r0, r1
+ ldr r0, =0x00007FC0
+ and r0, r6
+ add r3, r1, r0
+ ldr r0, [sp, #0x198]
+ ldrb r1, [r7, r4]
+ add r2, r3, r0
+ cmp r1, #0x0
+ beq _0201A7A0
+ ldr r0, [sp, #0x194]
+ strb r1, [r2, r0]
+ ldr r0, [sp, #0x2f4]
+ cmp r0, #0x0
+ beq _0201A7A0
+ ldr r0, [sp, #0x190]
+ add r2, r3, r0
+ ldr r0, [sp, #0x18c]
+ strb r1, [r0, r2]
+_0201A7A0:
+ add r4, r4, #0x1
+ add r6, #0x8
+ add r5, r5, #0x1
+ cmp r4, #0x8
+ blt _0201A774
+ ldr r0, [sp, #0x2f4]
+ cmp r0, #0x0
+ beq _0201A7B8
+ ldr r0, [sp, #0x1b8]
+ add r0, r0, #0x2
+ str r0, [sp, #0x1b8]
+ b _0201A7BE
+_0201A7B8:
+ ldr r0, [sp, #0x1b8]
+ add r0, r0, #0x1
+ str r0, [sp, #0x1b8]
+_0201A7BE:
+ ldr r0, [sp, #0x10]
+ ldr r1, [sp, #0x4]
+ add r0, r0, #0x1
+ sub r1, #0x8
+ add r7, #0x8
+ str r0, [sp, #0x10]
+ cmp r0, r1
+ blt _0201A72A
+_0201A7CE:
+ ldr r0, [sp, #0x1ec]
+ mov r2, #0x0
+ str r0, [sp, #0x2f0]
+ add r0, #0xc0
+ str r0, [sp, #0x2f0]
+ mov r1, #0x1
+_0201A7DA:
+ ldr r0, [sp, #0x330]
+ asr r0, r2
+ tst r0, r1
+ beq _0201A7E8
+ ldr r0, [sp, #0x48]
+ add r0, r0, #0x1
+ str r0, [sp, #0x48]
+_0201A7E8:
+ add r2, r2, #0x1
+ cmp r2, #0x8
+ blt _0201A7DA
+ ldr r0, [sp, #0x44]
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ str r0, [sp, #0x1b0]
+ mov r0, #0x0
+ str r0, [sp, #0xc]
+ ldr r0, [sp, #0x4]
+ sub r0, #0x8
+ cmp r0, #0x0
+ ble _0201A8B6
+ ldr r0, [sp, #0x5c]
+ add r0, #0x8
+ str r0, [sp, #0x5c]
+_0201A808:
+ ldr r1, [sp, #0x1b0]
+ ldr r0, [sp, #0xc]
+ ldr r7, [sp, #0x8]
+ asr r1, r0
+ mov r0, #0x1
+ and r0, r1
+ lsl r0, r0, #0x18
+ lsr r0, r0, #0x18
+ sub r7, #0x8
+ mov r4, #0x0
+ str r0, [sp, #0x1b4]
+ ldr r5, [sp, #0x5c]
+ cmp r7, #0x0
+ ble _0201A88E
+ ble _0201A88E
+ add r0, r5, #0x0
+ lsl r6, r0, #0x3
+ ldr r0, [sp, #0x48]
+ ldr r2, [sp, #0x28]
+ lsl r1, r0, #0x3
+ ldr r0, =0x00007FC0
+ mov r3, #0x38
+ and r0, r1
+ mul r2, r0
+ add r0, r1, #0x0
+ and r0, r3
+ str r0, [sp, #0x1a8]
+ ldr r0, [sp, #0x48]
+ str r2, [sp, #0x1ac]
+ add r0, r0, #0x1
+ lsl r1, r0, #0x3
+ ldr r0, =0x00007FC0
+ ldr r2, [sp, #0x28]
+ and r0, r1
+ mul r2, r0
+ add r0, r1, #0x0
+ and r0, r3
+ str r2, [sp, #0x1a4]
+ str r0, [sp, #0x1a0]
+_0201A856:
+ mov r0, #0x7
+ add r1, r5, #0x0
+ and r1, r0
+ ldr r0, [sp, #0x278]
+ add r1, r0, r1
+ ldr r0, =0x00007FC0
+ and r0, r6
+ add r3, r1, r0
+ ldr r0, [sp, #0x1ac]
+ add r2, r3, r0
+ ldr r0, [sp, #0x2f0]
+ ldrb r1, [r0, r4]
+ cmp r1, #0x0
+ beq _0201A884
+ ldr r0, [sp, #0x1a8]
+ strb r1, [r2, r0]
+ ldr r0, [sp, #0x1b4]
+ cmp r0, #0x0
+ beq _0201A884
+ ldr r0, [sp, #0x1a4]
+ add r2, r3, r0
+ ldr r0, [sp, #0x1a0]
+ strb r1, [r0, r2]
+_0201A884:
+ add r4, r4, #0x1
+ add r6, #0x8
+ add r5, r5, #0x1
+ cmp r4, r7
+ blt _0201A856
+_0201A88E:
+ ldr r0, [sp, #0x1b4]
+ cmp r0, #0x0
+ beq _0201A89C
+ ldr r0, [sp, #0x48]
+ add r0, r0, #0x2
+ str r0, [sp, #0x48]
+ b _0201A8A2
+_0201A89C:
+ ldr r0, [sp, #0x48]
+ add r0, r0, #0x1
+ str r0, [sp, #0x48]
+_0201A8A2:
+ ldr r0, [sp, #0x2f0]
+ ldr r1, [sp, #0x4]
+ add r0, #0x8
+ str r0, [sp, #0x2f0]
+ ldr r0, [sp, #0xc]
+ sub r1, #0x8
+ add r0, r0, #0x1
+ str r0, [sp, #0xc]
+ cmp r0, r1
+ blt _0201A808
+_0201A8B6:
+ ldr r0, [sp, #0x1ec]
+ bl FreeToHeap
+_0201A8BC: // 0x0201A8BC
+ add sp, #0x1fc
+ add sp, #0x118
+ pop {r4-r7, pc}
+ // clang-format on
+}
+#endif
+
+THUMB_FUNC void ScrollWindow(struct Window *window, u32 param1, u8 param2, u8 param3)
+{
+ if (window->bgConfig->bgs[window->bgId].colorMode == GX_BG_COLORMODE_16)
+ {
+ ScrollWindow4bpp(window, param1, param2, param3);
+ }
+ else
+ {
+ ScrollWindow8bpp(window, param1, param2, param3);
+ }
+}
+
+THUMB_FUNC void ScrollWindow4bpp(struct Window *window, u32 param1, u8 param2, u8 fillValue)
+{
+ void *r2;
+ int r5, r1, r3;
+ int st4, stc;
+ u32 st8;
+ int i, j;
+
+ r2 = window->pixelBuffer;
+ st4 = (fillValue << 0x18) | (fillValue << 0x10) | (fillValue << 0x8) | fillValue;
+ stc = window->height * window->width * 32;
+ st8 = window->width;
+
+ switch (param1)
+ {
+ case 0:
+ for (i = 0; i < stc; i += 32)
+ {
+ r3 = param2;
+ for (j = 0; j < 8; j++)
+ {
+ r5 = i + (j << 2);
+ r1 = i + (int)(((st8 * (r3 & ~7)) | (r3 & 7)) << 2);
+
+ if (r1 < stc)
+ {
+ *(u32 *)(r2 + r5) = *(u32 *)(r2 + r1);
+ }
+ else
+ {
+ *(u32 *)(r2 + r5) = (u32)st4;
+ }
+
+ r3++;
+ }
+ }
+
+ break;
+ case 1:
+ r2 += stc - 4;
+ for (i = 0; i < stc; i += 32)
+ {
+ r3 = param2;
+ for (j = 0; j < 8; j++)
+ {
+ r5 = i + (j << 2);
+ r1 = i + (int)(((st8 * (r3 & ~7)) | (r3 & 7)) << 2);
+
+ if (r1 < stc)
+ {
+ *(u32 *)(r2 - r5) = *(u32 *)(r2 - r1);
+ }
+ else
+ {
+ *(u32 *)(r2 - r5) = (u32)st4;
+ }
+
+ r3++;
+ }
+ }
+
+ break;
+ case 2:
+ case 3:
+ break;
+ }
+}
+
+THUMB_FUNC void ScrollWindow8bpp(struct Window *window, u32 param1, u8 param2, u8 fillValue)
+{
+
+ void *pixelBuffer;
+ int dstOffs, srcOffs, r3;
+ int st4, size;
+ u32 srcWidth;
+ int i, j;
+
+ pixelBuffer = (u8 *)window->pixelBuffer;
+ st4 = (fillValue << 0x18) | (fillValue << 0x10) | (fillValue << 0x8) | fillValue;
+ size = window->height * window->width * 64;
+ srcWidth = window->width;
+
+ switch (param1)
+ {
+ case 0:
+ for (i = 0; i < size; i += 64)
+ {
+ r3 = param2;
+ for (j = 0; j < 8; j++)
+ {
+ dstOffs = i + (j << 3);
+ srcOffs = i + (int)(((srcWidth * (r3 & ~7)) | (r3 & 7)) << 3);
+
+ if (srcOffs < size)
+ {
+ *(u32 *)(pixelBuffer + dstOffs) = *(u32 *)(pixelBuffer + srcOffs);
+ }
+ else
+ {
+ *(u32 *)(pixelBuffer + dstOffs) = (u32)st4;
+ }
+
+ dstOffs += 4;
+ srcOffs += 4;
+ if (srcOffs < size + 4)
+ {
+ *(u32 *)(pixelBuffer + dstOffs) = *(u32 *)(pixelBuffer + srcOffs);
+ }
+ else
+ {
+ *(u32 *)(pixelBuffer + dstOffs) = (u32)st4;
+ }
+
+ r3++;
+ }
+ }
+
+ break;
+ case 1:
+ pixelBuffer += size - 8;
+ for (i = 0; i < size; i += 64)
+ {
+ r3 = param2;
+ for (j = 0; j < 8; j++)
+ {
+ dstOffs = i + (j << 3);
+ srcOffs = i + (int)(((srcWidth * (r3 & ~7)) | (r3 & 7)) << 3);
+
+ if (srcOffs < size)
+ {
+ *(u32 *)(pixelBuffer - dstOffs) = *(u32 *)(pixelBuffer - srcOffs);
+ }
+ else
+ {
+ *(u32 *)(pixelBuffer - dstOffs) = (u32)st4;
+ }
+
+ dstOffs -= 4;
+ srcOffs -= 4;
+ if (srcOffs < size - 4)
+ {
+ *(u32 *)(pixelBuffer - dstOffs) = *(u32 *)(pixelBuffer - srcOffs);
+ }
+ else
+ {
+ *(u32 *)(pixelBuffer - dstOffs) = (u32)st4;
+ }
+
+ r3++;
+ }
+ }
+
+ break;
+ case 2:
+ case 3:
+ break;
+ }
+}
+
+THUMB_FUNC u8 GetWindowBgId(struct Window *window)
+{
+ return window->bgId;
+}
+
+THUMB_FUNC u8 GetWindowWidth(struct Window *window)
+{
+ return window->width;
+}
+THUMB_FUNC u8 GetWindowHeight(struct Window *window)
+{
+ return window->height;
+}
+THUMB_FUNC u8 GetWindowX(struct Window *window)
+{
+ return window->tilemapLeft;
+}
+THUMB_FUNC u8 GetWindowY(struct Window *window)
+{
+ return window->tilemapTop;
+}
+THUMB_FUNC void MoveWindowX(struct Window *window, u8 x)
+{
+ window->tilemapLeft = x;
+}
+THUMB_FUNC void MoveWindowY(struct Window *window, u8 y)
+{
+ window->tilemapTop = y;
+}
+THUMB_FUNC void SetWindowPaletteNum(struct Window *window, u8 paletteNum)
+{
+ window->paletteNum = paletteNum;
+}
+
+THUMB_FUNC NNSG2dCharacterData * LoadCharacterDataFromFile(void **char_ret, u32 heap_id, const char *path)
+{
+ void *ptr = AllocAndReadFile(heap_id, path);
+ *char_ret = ptr;
+ NNSG2dCharacterData *st0;
+ NNS_G2dGetUnpackedBGCharacterData(ptr, &st0);
+
+ return st0;
+}
+
+THUMB_FUNC NNSG2dPaletteData * LoadPaletteDataFromFile(void **pltt_ret, u32 heap_id, const char *path)
+{
+ void *ptr = AllocAndReadFile(heap_id, path);
+ *pltt_ret = ptr;
+ NNSG2dPaletteData *st0;
+ NNS_G2dGetUnpackedPaletteData(ptr, &st0);
+
+ return st0;
+}
+
+THUMB_FUNC void DoScheduledBgGpuUpdates(struct BgConfig *bgConfig)
+{
+ ApplyScheduledBgPosUpdate(bgConfig);
+ DoScheduledBgTilemapBufferTransfers(bgConfig);
+
+ bgConfig->scrollScheduled = 0;
+ bgConfig->bufferTransferScheduled = 0;
+}
+
+THUMB_FUNC void DoScheduledBgTilemapBufferTransfers(struct BgConfig *bgConfig)
+{
+ if ((bgConfig->bufferTransferScheduled & (1 << GF_BG_LYR_MAIN_0)) != 0)
+ {
+ LoadBgVramScr(GF_BG_LYR_MAIN_0, bgConfig->bgs[GF_BG_LYR_MAIN_0].tilemapBuffer, bgConfig->bgs[GF_BG_LYR_MAIN_0].baseTile * 2, bgConfig->bgs[GF_BG_LYR_MAIN_0].bufferSize);
+ }
+
+ if ((bgConfig->bufferTransferScheduled & (1 << GF_BG_LYR_MAIN_1)) != 0)
+ {
+ LoadBgVramScr(GF_BG_LYR_MAIN_1, bgConfig->bgs[GF_BG_LYR_MAIN_1].tilemapBuffer, bgConfig->bgs[GF_BG_LYR_MAIN_1].baseTile * 2, bgConfig->bgs[GF_BG_LYR_MAIN_1].bufferSize);
+ }
+
+ if ((bgConfig->bufferTransferScheduled & (1 << GF_BG_LYR_MAIN_2)) != 0)
+ {
+ LoadBgVramScr(GF_BG_LYR_MAIN_2, bgConfig->bgs[GF_BG_LYR_MAIN_2].tilemapBuffer, bgConfig->bgs[GF_BG_LYR_MAIN_2].baseTile * 2, bgConfig->bgs[GF_BG_LYR_MAIN_2].bufferSize);
+ }
+
+ if ((bgConfig->bufferTransferScheduled & (1 << GF_BG_LYR_MAIN_3)) != 0)
+ {
+ LoadBgVramScr(GF_BG_LYR_MAIN_3, bgConfig->bgs[GF_BG_LYR_MAIN_3].tilemapBuffer, bgConfig->bgs[GF_BG_LYR_MAIN_3].baseTile * 2, bgConfig->bgs[GF_BG_LYR_MAIN_3].bufferSize);
+ }
+
+ if ((bgConfig->bufferTransferScheduled & (1 << GF_BG_LYR_SUB_0)) != 0)
+ {
+ LoadBgVramScr(GF_BG_LYR_SUB_0, bgConfig->bgs[GF_BG_LYR_SUB_0].tilemapBuffer, bgConfig->bgs[GF_BG_LYR_SUB_0].baseTile * 2, bgConfig->bgs[GF_BG_LYR_SUB_0].bufferSize);
+ }
+
+ if ((bgConfig->bufferTransferScheduled & (1 << GF_BG_LYR_SUB_1)) != 0)
+ {
+ LoadBgVramScr(GF_BG_LYR_SUB_1, bgConfig->bgs[GF_BG_LYR_SUB_1].tilemapBuffer, bgConfig->bgs[GF_BG_LYR_SUB_1].baseTile * 2, bgConfig->bgs[GF_BG_LYR_SUB_1].bufferSize);
+ }
+
+ if ((bgConfig->bufferTransferScheduled & (1 << GF_BG_LYR_SUB_2)) != 0)
+ {
+ LoadBgVramScr(GF_BG_LYR_SUB_2, bgConfig->bgs[GF_BG_LYR_SUB_2].tilemapBuffer, bgConfig->bgs[GF_BG_LYR_SUB_2].baseTile * 2, bgConfig->bgs[GF_BG_LYR_SUB_2].bufferSize);
+ }
+
+ if ((bgConfig->bufferTransferScheduled & (1 << GF_BG_LYR_SUB_3)) != 0)
+ {
+ LoadBgVramScr(GF_BG_LYR_SUB_3, bgConfig->bgs[GF_BG_LYR_SUB_3].tilemapBuffer, bgConfig->bgs[GF_BG_LYR_SUB_3].baseTile * 2, bgConfig->bgs[GF_BG_LYR_SUB_3].bufferSize);
+ }
+}
+
+THUMB_FUNC void ScheduleBgTilemapBufferTransfer(struct BgConfig *bgConfig, u32 bgId)
+{
+ bgConfig->bufferTransferScheduled |= 1 << bgId;
+}
+
+THUMB_FUNC void ApplyScheduledBgPosUpdate(struct BgConfig *bgConfig)
+{
+ if ((bgConfig->scrollScheduled & (1 << GF_BG_LYR_MAIN_0)) != 0)
+ {
+ G2_SetBG0Offset(bgConfig->bgs[GF_BG_LYR_MAIN_0].hOffset, bgConfig->bgs[GF_BG_LYR_MAIN_0].vOffset);
+ }
+
+ if ((bgConfig->scrollScheduled & (1 << GF_BG_LYR_MAIN_1)) != 0)
+ {
+ G2_SetBG1Offset(bgConfig->bgs[GF_BG_LYR_MAIN_1].hOffset, bgConfig->bgs[GF_BG_LYR_MAIN_1].vOffset);
+ }
+
+ if ((bgConfig->scrollScheduled & (1 << GF_BG_LYR_MAIN_2)) != 0)
+ {
+ if (bgConfig->bgs[GF_BG_LYR_MAIN_2].mode == 0)
+ {
+ G2_SetBG2Offset(bgConfig->bgs[GF_BG_LYR_MAIN_2].hOffset, bgConfig->bgs[GF_BG_LYR_MAIN_2].vOffset);
+ }
+ else
+ {
+ struct Mtx22 st38;
+ MTX22_2DAffine(
+ &st38, bgConfig->bgs[GF_BG_LYR_MAIN_2].rotation, bgConfig->bgs[GF_BG_LYR_MAIN_2].xScale, bgConfig->bgs[GF_BG_LYR_MAIN_2].yScale, 2);
+ G2_SetBG2Affine(
+ &st38,
+ bgConfig->bgs[GF_BG_LYR_MAIN_2].centerX,
+ bgConfig->bgs[GF_BG_LYR_MAIN_2].centerY,
+ bgConfig->bgs[GF_BG_LYR_MAIN_2].hOffset,
+ bgConfig->bgs[GF_BG_LYR_MAIN_2].vOffset);
+ }
+ }
+
+ if ((bgConfig->scrollScheduled & (1 << GF_BG_LYR_MAIN_3)) != 0)
+ {
+ if (bgConfig->bgs[GF_BG_LYR_MAIN_3].mode == 0)
+ {
+ G2_SetBG3Offset(bgConfig->bgs[GF_BG_LYR_MAIN_3].hOffset, bgConfig->bgs[GF_BG_LYR_MAIN_3].vOffset);
+ }
+ else
+ {
+ struct Mtx22 st28;
+ MTX22_2DAffine(
+ &st28, bgConfig->bgs[GF_BG_LYR_MAIN_3].rotation, bgConfig->bgs[GF_BG_LYR_MAIN_3].xScale, bgConfig->bgs[GF_BG_LYR_MAIN_3].yScale, 2);
+ G2_SetBG3Affine(
+ &st28,
+ bgConfig->bgs[GF_BG_LYR_MAIN_3].centerX,
+ bgConfig->bgs[GF_BG_LYR_MAIN_3].centerY,
+ bgConfig->bgs[GF_BG_LYR_MAIN_3].hOffset,
+ bgConfig->bgs[GF_BG_LYR_MAIN_3].vOffset);
+ }
+ }
+
+ if ((bgConfig->scrollScheduled & (1 << GF_BG_LYR_SUB_0)) != 0)
+ {
+ G2S_SetBG0Offset(bgConfig->bgs[GF_BG_LYR_SUB_0].hOffset, bgConfig->bgs[GF_BG_LYR_SUB_0].vOffset);
+ }
+
+ if ((bgConfig->scrollScheduled & (1 << GF_BG_LYR_SUB_1)) != 0)
+ {
+ G2S_SetBG1Offset(bgConfig->bgs[GF_BG_LYR_SUB_1].hOffset, bgConfig->bgs[GF_BG_LYR_SUB_1].vOffset);
+ }
+
+ if ((bgConfig->scrollScheduled & (1 << GF_BG_LYR_SUB_2)) != 0)
+ {
+ if (bgConfig->bgs[GF_BG_LYR_SUB_2].mode == 0)
+ {
+ G2S_SetBG2Offset(bgConfig->bgs[GF_BG_LYR_SUB_2].hOffset, bgConfig->bgs[GF_BG_LYR_SUB_2].vOffset);
+ }
+ else
+ {
+ struct Mtx22 st18;
+ MTX22_2DAffine(
+ &st18, bgConfig->bgs[GF_BG_LYR_SUB_2].rotation, bgConfig->bgs[GF_BG_LYR_SUB_2].xScale, bgConfig->bgs[GF_BG_LYR_SUB_2].yScale, 2);
+ G2S_SetBG2Affine(
+ &st18,
+ bgConfig->bgs[GF_BG_LYR_SUB_2].centerX,
+ bgConfig->bgs[GF_BG_LYR_SUB_2].centerY,
+ bgConfig->bgs[GF_BG_LYR_SUB_2].hOffset,
+ bgConfig->bgs[GF_BG_LYR_SUB_2].vOffset);
+ }
+ }
+
+ if ((bgConfig->scrollScheduled & (1 << GF_BG_LYR_SUB_3)) != 0)
+ {
+ if (bgConfig->bgs[GF_BG_LYR_SUB_3].mode == 0)
+ {
+ G2S_SetBG3Offset(bgConfig->bgs[GF_BG_LYR_SUB_3].hOffset, bgConfig->bgs[GF_BG_LYR_SUB_3].vOffset);
+ }
+ else
+ {
+ struct Mtx22 st08;
+ MTX22_2DAffine(
+ &st08, bgConfig->bgs[GF_BG_LYR_SUB_3].rotation, bgConfig->bgs[GF_BG_LYR_SUB_3].xScale, bgConfig->bgs[GF_BG_LYR_SUB_3].yScale, 2);
+ G2S_SetBG3Affine(
+ &st08,
+ bgConfig->bgs[GF_BG_LYR_SUB_3].centerX,
+ bgConfig->bgs[GF_BG_LYR_SUB_3].centerY,
+ bgConfig->bgs[GF_BG_LYR_SUB_3].hOffset,
+ bgConfig->bgs[GF_BG_LYR_SUB_3].vOffset);
+ }
+ }
+}
+
+THUMB_FUNC void ScheduleSetBgPosText(
+ struct BgConfig *bgConfig, u32 bgId, u32 op, fx32 value)
+{
+ Bg_SetPosText(&bgConfig->bgs[bgId], op, value);
+ bgConfig->scrollScheduled |= 1 << bgId;
+}
+
+THUMB_FUNC void ScheduleSetBgAffineRotation(
+ struct BgConfig *bgConfig, u32 bgId, u32 op, u16 value)
+{
+ Bg_SetAffineRotation(&bgConfig->bgs[bgId], op, value);
+ bgConfig->scrollScheduled |= 1 << bgId;
+}
+
+THUMB_FUNC void Bg_SetAffineRotation(struct Bg *bg, u32 op, u16 val)
+{
+ switch (op)
+ {
+ case BG_POS_OP_SET_ROT:
+ bg->rotation = val;
+ break;
+ case BG_POS_OP_ADD_ROT:
+ bg->rotation += val;
+ break;
+ case BG_POS_OP_SUB_ROT:
+ bg->rotation -= val;
+ break;
+ }
+}
+
+THUMB_FUNC void ScheduleSetBgAffinePos(
+ struct BgConfig *bgConfig, u32 bgId, u32 op, fx32 value)
+{
+ Bg_SetAffinePos(&bgConfig->bgs[bgId], op, value);
+ bgConfig->scrollScheduled |= 1 << bgId;
+}
+
+THUMB_FUNC void Bg_SetAffinePos(struct Bg *bg, u32 op, fx32 val)
+{
+ switch (op)
+ {
+ case BG_POS_OP_SET_CENTERX:
+ bg->centerX = val;
+ break;
+ case BG_POS_OP_ADD_CENTERX:
+ bg->centerX += val;
+ break;
+ case BG_POS_OP_SUB_CENTERX:
+ bg->centerX -= val;
+ break;
+ case BG_POS_OP_SET_CENTERY:
+ bg->centerY = val;
+ break;
+ case BG_POS_OP_ADD_CENTERY:
+ bg->centerY += val;
+ break;
+ case BG_POS_OP_SUB_CENTERY:
+ bg->centerY -= val;
+ break;
+ }
+}
+
+THUMB_FUNC u32 DoesPixelAtScreenXYMatchPtrVal(
+ struct BgConfig *bgConfig, u8 bgId, u8 x, u8 y, u16 *src)
+{
+ void *bgCharPtr;
+ u16 tilemapIdx;
+ u8 xPixOffs;
+ u8 yPixOffs;
+ u8 pixelValue;
+ u8 i;
+
+ if (bgConfig->bgs[bgId].tilemapBuffer == NULL)
+ {
+ return 0;
+ }
+
+ tilemapIdx = GetTileMapIndexFromCoords((u8) (x >> 3), (u8) (y >> 3), bgConfig->bgs[bgId].size);
+ bgCharPtr = BgGetCharPtr(bgId);
+
+ xPixOffs = (u8)(x & 7);
+ yPixOffs = (u8)(y & 7);
+
+ if (bgConfig->bgs[bgId].colorMode == GX_BG_COLORMODE_16)
+ {
+ u16 *tilemapBuffer = bgConfig->bgs[bgId].tilemapBuffer;
+ u8 *ptr = AllocFromHeapAtEnd(bgConfig->heap_id, 0x40);
+
+ bgCharPtr += ((tilemapBuffer[tilemapIdx] & 0x3ff) << 5);
+ for (i = 0; i < 0x20; i++)
+ {
+ ptr[(i << 1)] = (u8)(((u8 *)bgCharPtr)[i] & 0xf);
+ ptr[(i << 1) + 1] = (u8)(((u8 *)bgCharPtr)[i] >> 4);
+ }
+
+ ApplyFlipFlagsToTile(bgConfig, (u8)((tilemapBuffer[tilemapIdx] >> 0xa) & 3), ptr);
+
+ pixelValue = ptr[xPixOffs + (yPixOffs << 3)];
+ FreeToHeap(ptr);
+
+ if ((src[0] & (1 << pixelValue)) != 0)
+ {
+ return 1;
+ }
+ }
+ else
+ {
+ if (bgConfig->bgs[bgId].mode != GF_BG_TYPE_AFFINE)
+ {
+ u16 *tilemapBuffer = bgConfig->bgs[bgId].tilemapBuffer;
+ u8 *ptr = AllocFromHeapAtEnd(bgConfig->heap_id, 0x40);
+
+ memcpy(ptr, bgCharPtr + ((tilemapBuffer[tilemapIdx] & 0x3ff) << 6), 0x40);
+
+ ApplyFlipFlagsToTile(bgConfig, (u8)((tilemapBuffer[tilemapIdx] >> 0xa) & 3), ptr);
+
+ pixelValue = ptr[xPixOffs + (yPixOffs << 3)];
+ FreeToHeap(ptr);
+ }
+ else
+ {
+ pixelValue = ((u8 *)bgCharPtr)[(((u8 *)bgConfig->bgs[bgId].tilemapBuffer)[tilemapIdx] << 6) + xPixOffs + (yPixOffs << 3)];
+ }
+
+ // BUG: Infinite loop
+ while (TRUE)
+ {
+ if (src[0] == 0xffff)
+ {
+ break;
+ }
+ if (pixelValue == (u8)(src[0]))
+ {
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
+THUMB_FUNC void ApplyFlipFlagsToTile(struct BgConfig *bgConfig, u8 flag, u8 *src)
+{
+ u8 i, j;
+ if (flag != 0)
+ {
+ u8 *ptr = AllocFromHeapAtEnd(bgConfig->heap_id, 0x40);
+
+ if ((flag & 1) != 0)
+ {
+ for (i = 0; i < 8; i++)
+ {
+ for (j = 0; j < 8; j++)
+ {
+ ptr[i * 8 + j] = src[i * 8 + (7 - j)];
+ }
+ }
+
+ memcpy(src, ptr, 0x40);
+ }
+
+ if ((flag & 2) != 0)
+ {
+ for (i = 0; i < 8; i++)
+ {
+ u8 *r3 = &ptr[i * 8];
+ u8 *r2 = &src[(7 - i) * 8];
+ for (u32 j = 8; j > 0; j--)
+ {
+ *r3++ = *r2++;
+ }
+ }
+
+ memcpy(src, ptr, 0x40);
+ }
+
+ FreeToHeap(ptr);
+ }
+}
diff --git a/arm9/src/error_message_reset.c b/arm9/src/error_message_reset.c
index 07c285a4..e0d01bde 100644
--- a/arm9/src/error_message_reset.c
+++ b/arm9/src/error_message_reset.c
@@ -3,26 +3,46 @@
#include "gx.h"
#include "unk_02031734.h"
#include "unk_0202F150.h"
-#include "unk_02016B94.h"
+#include "bg_window.h"
#include "PAD_pad.h"
-const struct UnkStruct_02016B94_4 UNK_020FF49C = { 0, 3, 3, 0x1a, 0x12, 1, 0x23 };
+const struct WindowTemplate UNK_020FF49C = {
+ .bgId = GF_BG_LYR_MAIN_0,
+ .tilemapLeft = 3,
+ .tilemapTop = 3,
+ .width = 26,
+ .height = 18,
+ .paletteNum = 1,
+ .baseTile = 0x23
+};
const struct HeapParam UNK_020FF4A4[] = {
{0x00020000, OS_ARENA_MAIN}
};
-const struct GraphicsModes UNK_020FF4AC = { dispMode : GX_DISPMODE_GRAPHICS };
-
-const struct UnkStruct_02016B94_1 UNK_020FF4BC = { 0, 0, 0x800, 0, 1, 0, 0, 6, 0, 1, 0, 0, 0 };
+const struct GraphicsModes UNK_020FF4AC = { .dispMode = GX_DISPMODE_GRAPHICS };
+
+const struct BgTemplate UNK_020FF4BC = {
+ .x = 0,
+ .y = 0,
+ .bufferSize = 0x800,
+ .baseTile = 0,
+ .size = GF_BG_SCR_SIZE_256x256,
+ .colorMode = GX_BG_COLORMODE_16,
+ .screenBase = GX_BG_SCRBASE_0x0000, .charBase = GX_BG_CHARBASE_0x18000,
+ .bgExtPltt = GX_BG_EXTPLTT_01,
+ .priority = 1,
+ .areaOver = 0,
+ .mosaic = FALSE
+};
-const struct GraphicsBanks UNK_020FF4D8 = { bg : 3 };
+const struct GraphicsBanks UNK_020FF4D8 = { .bg = 3 };
u32 sErrorMessagePrinterLock;
extern void FUN_0200E3A0(PMLCDTarget, int);
-extern void FUN_0200CB00(struct UnkStruct_02016B94_2 *param0, u32 param1, u32 param2, u32 param3, u8 param4, u32 param5);
+extern void FUN_0200CB00(struct BgConfig *param0, u32 param1, u32 param2, u32 param3, u8 param4, u32 param5);
extern void FUN_02002ED0(u32 param0, u32 param1, u32 param2);
extern void FUN_0200CCA4(struct Window *param0, u32 param1, u32 param2, u32 param3);
extern void FUN_0200E394(u32 param0);
@@ -30,15 +50,14 @@ extern void FUN_0200A274(u32 param0, u32 param1, u32 param2);
THUMB_FUNC void VBlankHandler()
{
- *(vu32 *)HW_INTR_CHECK_BUF |= 1;
-
+ OS_SetIrqCheckFlag(OS_IE_V_BLANK);
MI_WaitDma(3);
}
THUMB_FUNC void PrintErrorMessageAndReset()
{
- struct UnkStruct_02016B94_2 *ptr;
+ struct BgConfig *ptr;
struct Window buf;
if (sErrorMessagePrinterLock != 1)
@@ -61,38 +80,39 @@ THUMB_FUNC void PrintErrorMessageAndReset()
GX_DisableEngineALayers();
GX_DisableEngineBLayers();
- reg_GX_DISPCNT &= ~REG_GX_DISPCNT_DISPLAY_MASK;
- reg_GXS_DB_DISPCNT &= ~REG_GXS_DB_DISPCNT_DISPLAY_MASK;
+ GX_SetVisiblePlane(0);
+ GXS_SetVisiblePlane(0);
SetKeyRepeatTimers(4, 8);
gMain.unk65 = 0;
GX_SwapDisplay();
- reg_G2_BLDCNT = 0;
- reg_G2S_DB_BLDCNT = 0;
- reg_GX_DISPCNT &= ~(REG_GX_DISPCNT_OW_MASK | REG_GX_DISPCNT_W1_MASK | REG_GX_DISPCNT_W0_MASK);
- reg_GXS_DB_DISPCNT &= ~(REG_GXS_DB_DISPCNT_OW_MASK | REG_GXS_DB_DISPCNT_W1_MASK | REG_GXS_DB_DISPCNT_W0_MASK);
+ G2_BlendNone();
+ G2S_BlendNone();
+
+ GX_SetVisibleWnd(0);
+ GXS_SetVisibleWnd(0);
GX_SetBanks(&UNK_020FF4D8);
- ptr = FUN_02016B94(0);
- FUN_02016BBC(&UNK_020FF4AC);
+ ptr = BgConfig_Alloc(0);
+ SetBothScreensModesAndDisable(&UNK_020FF4AC);
- FUN_02016C18(ptr, 0, &UNK_020FF4BC, 0);
- FUN_02018744(ptr, 0);
+ InitBgFromTemplate(ptr, 0, &UNK_020FF4BC, 0);
+ BgClearTilemapBufferAndCommit(ptr, 0);
FUN_0200CB00(ptr, 0, 503, 2, 0, 0);
FUN_02002ED0(0, 0x20, 0);
- FUN_02017F18(0, 0x20, 0, 0);
- FUN_02017FE4(0, 0x6C21);
- FUN_02017FE4(4, 0x6C21);
+ BG_ClearCharDataRange(0, 0x20, 0, 0);
+ BG_SetMaskColor(0, 0x6C21);
+ BG_SetMaskColor(4, 0x6C21);
struct MsgData *msg_data = NewMsgDataFromNarc(1, NARC_MSGDATA_MSG, 0xc8, 0);
struct String *str = String_ctor(6 << 6, 0);
FUN_0201BD5C();
- FUN_02019150(ptr, &buf, &UNK_020FF49C);
+ AddWindow(ptr, &buf, &UNK_020FF49C);
FillWindowPixelRect(&buf, 15, 0, 0, 0xd0, 0x90);
FUN_0200CCA4(&buf, 0, 0x1f7, 2);
@@ -126,7 +146,7 @@ THUMB_FUNC void PrintErrorMessageAndReset()
FUN_0200E3A0(PM_LCD_TOP, 0x7FFF);
FUN_0200E3A0(PM_LCD_BOTTOM, 0x7FFF);
- FUN_02019178(&buf);
+ RemoveWindow(&buf);
DestroyMsgData(msg_data);
FreeToHeap(ptr);
diff --git a/arm9/src/filesystem.c b/arm9/src/filesystem.c
index ed82acb9..37d381a3 100644
--- a/arm9/src/filesystem.c
+++ b/arm9/src/filesystem.c
@@ -175,8 +175,7 @@ THUMB_FUNC void ReadFromNarcMemberByPathAndId(void * dest, const char * path, s3
FS_SeekFile(&file, (s32)(chunk_starts[0] + 4), FS_SEEK_SET);
FS_ReadFile(&file, &chunk_size, 4);
FS_ReadFile(&file, &num_files, 2);
- if (num_files <= file_idx)
- GF_AssertFail();
+ GF_ASSERT(num_files > file_idx);
chunk_starts[1] = chunk_starts[0] + chunk_size;
FS_SeekFile(&file, (s32)(chunk_starts[1] + 4), FS_SEEK_SET);
FS_ReadFile(&file, &chunk_size, 4);
@@ -190,8 +189,7 @@ THUMB_FUNC void ReadFromNarcMemberByPathAndId(void * dest, const char * path, s3
chunk_size = file_end - file_start;
else
chunk_size = size;
- if (chunk_size == 0)
- GF_AssertFail();
+ GF_ASSERT(chunk_size != 0);
FS_ReadFile(&file, dest, (s32)chunk_size);
FS_CloseFile(&file);
}
@@ -216,8 +214,7 @@ THUMB_FUNC void * AllocAndReadFromNarcMemberByPathAndId(const char * path, s32 f
FS_SeekFile(&file, (s32)(chunk_starts[0] + 4), FS_SEEK_SET);
FS_ReadFile(&file, &chunk_size, 4);
FS_ReadFile(&file, &num_files, 2);
- if (num_files <= file_idx)
- GF_AssertFail();
+ GF_ASSERT(num_files > file_idx);
chunk_starts[1] = chunk_starts[0] + chunk_size;
FS_SeekFile(&file, (s32)(chunk_starts[1] + 4), FS_SEEK_SET);
FS_ReadFile(&file, &chunk_size, 4);
@@ -231,8 +228,7 @@ THUMB_FUNC void * AllocAndReadFromNarcMemberByPathAndId(const char * path, s32 f
chunk_size = file_end - file_start;
else
chunk_size = size;
- if (chunk_size == 0)
- GF_AssertFail();
+ GF_ASSERT(chunk_size != 0);
switch (r4)
{
case 0:
@@ -296,8 +292,7 @@ THUMB_FUNC u32 GetNarcMemberSizeByIdPair(NarcId narc_id, s32 file_idx)
FS_SeekFile(&file, (s32)(chunk_starts[0] + 4), FS_SEEK_SET);
FS_ReadFile(&file, &chunk_size, 4);
FS_ReadFile(&file, &num_files, 2);
- if (num_files <= file_idx)
- GF_AssertFail();
+ GF_ASSERT(num_files > file_idx);
chunk_starts[1] = chunk_starts[0] + chunk_size;
FS_SeekFile(&file, (s32)(chunk_starts[1] + 4), FS_SEEK_SET);
FS_ReadFile(&file, &chunk_size, 4);
@@ -308,8 +303,7 @@ THUMB_FUNC u32 GetNarcMemberSizeByIdPair(NarcId narc_id, s32 file_idx)
chunk_starts[2] = chunk_starts[1] + btnf_size;
FS_SeekFile(&file, (s32)(chunk_starts[2] + 8 + file_start + 0), FS_SEEK_SET);
chunk_size = file_end - file_start;
- if (chunk_size == 0)
- GF_AssertFail();
+ GF_ASSERT(chunk_size != 0);
// Bug: File is never closed
return chunk_size;
}
@@ -348,8 +342,7 @@ THUMB_FUNC void * NARC_AllocAndReadWholeMember(NARC * narc, u32 file_id, u32 hea
u32 file_start;
u32 file_end;
void * dest;
- if (narc->num_files <= file_id)
- GF_AssertFail();
+ GF_ASSERT(narc->num_files > file_id);
FS_SeekFile(&narc->file, (s32)(narc->btaf_start + 12 + 8 * file_id), FS_SEEK_SET);
FS_ReadFile(&narc->file, &file_start, 4);
FS_ReadFile(&narc->file, &file_end, 4);
@@ -366,8 +359,7 @@ THUMB_FUNC void NARC_ReadWholeMember(NARC * narc, u32 file_id, void * dest)
{
u32 file_start;
u32 file_end;
- if (narc->num_files <= file_id)
- GF_AssertFail();
+ GF_ASSERT(narc->num_files > file_id);
FS_SeekFile(&narc->file, (s32)(narc->btaf_start + 12 + 8 * file_id), FS_SEEK_SET);
FS_ReadFile(&narc->file, &file_start, 4);
FS_ReadFile(&narc->file, &file_end, 4);
@@ -379,8 +371,7 @@ THUMB_FUNC u32 NARC_GetMemberSize(NARC * narc, u32 file_id)
{
u32 file_start;
u32 file_end;
- if (narc->num_files <= file_id)
- GF_AssertFail();
+ GF_ASSERT(narc->num_files > file_id);
FS_SeekFile(&narc->file, (s32)(narc->btaf_start + 12 + 8 * file_id), FS_SEEK_SET);
FS_ReadFile(&narc->file, &file_start, 4);
FS_ReadFile(&narc->file, &file_end, 4);
@@ -390,8 +381,7 @@ THUMB_FUNC u32 NARC_GetMemberSize(NARC * narc, u32 file_id)
THUMB_FUNC void NARC_ReadFromMember(NARC * narc, u32 file_id, u32 pos, u32 size, void * dest)
{
u32 file_start;
- if (narc->num_files <= file_id)
- GF_AssertFail();
+ GF_ASSERT(narc->num_files > file_id);
FS_SeekFile(&narc->file, (s32)(narc->btaf_start + 12 + 8 * file_id), FS_SEEK_SET);
FS_ReadFile(&narc->file, &file_start, 4);
FS_SeekFile(&narc->file, (s32)(narc->gmif_start + 8 + file_start + pos), FS_SEEK_SET);
diff --git a/arm9/src/gf_gfx_loader.c b/arm9/src/gf_gfx_loader.c
index 769c90d9..1dc7f50e 100644
--- a/arm9/src/gf_gfx_loader.c
+++ b/arm9/src/gf_gfx_loader.c
@@ -3,7 +3,7 @@
#include "NNS_g2d.h"
#include "gf_gfx_loader.h"
-THUMB_FUNC u32 GfGfxLoader_LoadCharData(NarcId narcId, s32 memberNo, struct UnkStruct_02016B94_2 * unkStruct02016B94_2, u32 a3, u32 a4, u32 szByte, BOOL isCompressed, u32 heap_id)
+THUMB_FUNC u32 GfGfxLoader_LoadCharData(NarcId narcId, s32 memberNo, struct BgConfig * unkStruct02016B94_2, u32 a3, u32 a4, u32 szByte, BOOL isCompressed, u32 heap_id)
{
NNSG2dCharacterData * pCharData;
void * pFile = GfGfxLoader_LoadFromNarc(narcId, memberNo, isCompressed, heap_id, FALSE);
@@ -13,14 +13,14 @@ THUMB_FUNC u32 GfGfxLoader_LoadCharData(NarcId narcId, s32 memberNo, struct UnkS
{
if (szByte == 0)
szByte = pCharData->szByte;
- FUN_02017E14(unkStruct02016B94_2, (u8)a3, pCharData->pRawData, szByte, a4);
+ BG_LoadCharTilesData(unkStruct02016B94_2, (u8)a3, pCharData->pRawData, szByte, a4);
}
FreeToHeap(pFile);
}
return szByte;
}
-THUMB_FUNC void GfGfxLoader_LoadScrnData(NarcId narcId, s32 memberNo, struct UnkStruct_02016B94_2 * unkStruct02016B94_2, u32 a3, u32 a4, u32 szByte, BOOL isCompressed, u32 heap_id)
+THUMB_FUNC void GfGfxLoader_LoadScrnData(NarcId narcId, s32 memberNo, struct BgConfig * unkStruct02016B94_2, u32 a3, u32 a4, u32 szByte, BOOL isCompressed, u32 heap_id)
{
NNSG2dScreenData * pScreenData;
void * pFile = GfGfxLoader_LoadFromNarc(narcId, memberNo, isCompressed, heap_id, TRUE);
@@ -30,9 +30,9 @@ THUMB_FUNC void GfGfxLoader_LoadScrnData(NarcId narcId, s32 memberNo, struct Unk
{
if (szByte == 0)
szByte = pScreenData->szByte;
- if (FUN_0201886C(unkStruct02016B94_2, (u8)a3) != NULL)
- FUN_02017DFC(unkStruct02016B94_2, (u8)a3, pScreenData->rawData, szByte);
- FUN_02017CE8(unkStruct02016B94_2, (u8)a3, pScreenData->rawData, szByte, a4);
+ if (GetBgTilemapBuffer(unkStruct02016B94_2, (u8) a3) != NULL)
+ BG_LoadScreenTilemapData(unkStruct02016B94_2, (u8) a3, pScreenData->rawData, szByte);
+ BgCopyOrUncompressTilemapBufferRangeToVram(unkStruct02016B94_2, (u8) a3, pScreenData->rawData, szByte, a4);
}
FreeToHeap(pFile);
}
diff --git a/arm9/src/main.c b/arm9/src/main.c
index fa35c81c..979fb7ca 100644
--- a/arm9/src/main.c
+++ b/arm9/src/main.c
@@ -168,8 +168,7 @@ THUMB_FUNC void Main_RunOverlayManager(void)
THUMB_FUNC void RegisterMainOverlay(FSOverlayID id, const struct Unk21DBE18 * arg1)
{
- if (UNK_02016FA8.unkC != NULL)
- GF_AssertFail();
+ GF_ASSERT(UNK_02016FA8.unkC == NULL);
UNK_02016FA8.unk8 = id;
UNK_02016FA8.unkC = arg1;
}
diff --git a/arm9/src/poke_overlay.c b/arm9/src/poke_overlay.c
index e11ecbb6..bb5bb891 100644
--- a/arm9/src/poke_overlay.c
+++ b/arm9/src/poke_overlay.c
@@ -8,10 +8,8 @@ static struct LoadedOverlay gLoadedOverlays[3][8];
THUMB_FUNC void FreeOverlayAllocation(struct LoadedOverlay * loaded)
{
- if (loaded->active != TRUE)
- GF_AssertFail();
- if (FS_UnloadOverlay(MI_PROCESSOR_ARM9, loaded->id) != TRUE)
- GF_AssertFail();
+ GF_ASSERT(loaded->active == TRUE);
+ GF_ASSERT(FS_UnloadOverlay(MI_PROCESSOR_ARM9, loaded->id) == TRUE);
loaded->active = FALSE;
}
@@ -34,8 +32,7 @@ THUMB_FUNC s32 GetOverlayLoadDestination(FSOverlayID id)
FSOverlayInfo info;
u8 *end;
u8 *start;
- if (FS_LoadOverlayInfo(&info, MI_PROCESSOR_ARM9, id) != TRUE)
- GF_AssertFail();
+ GF_ASSERT(FS_LoadOverlayInfo(&info, MI_PROCESSOR_ARM9, id) == TRUE);
start = (u8 *)HW_ITCM_IMAGE;
end = (u8 *)HW_ITCM_END;
if (info.header.ram_address <= end && info.header.ram_address >= start)
@@ -72,7 +69,7 @@ THUMB_FUNC BOOL HandleLoadOverlay(FSOverlayID id, s32 a1)
}
if (r6 >= 8)
{
- GF_AssertFail();
+ GF_ASSERT(0);
return FALSE;
}
if (r7 == OVERLAY_LOAD_ITCM || r7 == OVERLAY_LOAD_DTCM)
@@ -91,7 +88,7 @@ THUMB_FUNC BOOL HandleLoadOverlay(FSOverlayID id, s32 a1)
result = LoadOverlayNoInitAsync(MI_PROCESSOR_ARM9, id);
break;
default:
- GF_AssertFail();
+ GF_ASSERT(0);
return FALSE;
}
if (r7 == OVERLAY_LOAD_ITCM || r7 == OVERLAY_LOAD_DTCM)
@@ -100,7 +97,7 @@ THUMB_FUNC BOOL HandleLoadOverlay(FSOverlayID id, s32 a1)
}
if (result == 0)
{
- GF_AssertFail();
+ GF_ASSERT(0);
return FALSE;
}
return TRUE;
@@ -120,7 +117,7 @@ THUMB_FUNC BOOL CanOverlayBeLoaded(FSOverlayID id)
{
if ((start >= start2 && start < end2) || (end > start2 && end <= end2) || (start <= start2 && end >= end2))
{
- GF_AssertFail();
+ GF_ASSERT(0);
return FALSE;
}
}
@@ -146,7 +143,7 @@ THUMB_FUNC BOOL GetOverlayRamBounds(FSOverlayID id, void ** start, void ** end)
{
FSOverlayInfo info;
if (!FS_LoadOverlayInfo(&info, MI_PROCESSOR_ARM9, id)) {
- GF_AssertFail();
+ GF_ASSERT(0);
return FALSE;
}
*start = (void *)info.header.ram_address;
diff --git a/arm9/src/scrcmd.c b/arm9/src/scrcmd.c
index 7adb1fe8..6287579c 100644
--- a/arm9/src/scrcmd.c
+++ b/arm9/src/scrcmd.c
@@ -4,7 +4,7 @@
#include "options.h"
#include "player_data.h"
#include "text.h"
-#include "unk_02016B94.h"
+#include "bg_window.h"
extern void *FUN_02039438(struct UnkSavStruct80* arg, u32 id);
extern void *CreateScriptContext(struct UnkSavStruct80* arg, u16 id);
@@ -779,7 +779,7 @@ THUMB_FUNC BOOL ScrCmd_CloseMessageBox(struct ScriptContext* ctx)
struct Window *unk = FUN_02039438(unk80, 0x1);
u8 *unk2 = FUN_02039438(unk80, 0x6);
FUN_0200D0E0(unk, 0); //clear window?
- FUN_02019178(unk);
+ RemoveWindow(unk);
*unk2 = 0;
return FALSE;
}
@@ -789,7 +789,7 @@ THUMB_FUNC BOOL ScrCmd_Unk0035(struct ScriptContext* ctx)
struct UnkSavStruct80 *unk80 = ctx->unk80;
struct Window *unk = FUN_02039438(unk80, 0x1);
u8 *unk2 = FUN_02039438(unk80, 0x6);
- FUN_02019178(unk);
+ RemoveWindow(unk);
*unk2 = 0;
return FALSE;
}
@@ -834,11 +834,11 @@ THUMB_FUNC static BOOL FUN_0203A6C8(struct ScriptContext* ctx)
{
if (*xdir == 0)
{
- FUN_020179E0(unk80->unk08, 3, 1, *xval);
+ BgSetPosTextAndCommit(unk80->unk08, 3, 1, *xval);
}
else
{
- FUN_020179E0(unk80->unk08, 3, 2, *xval);
+ BgSetPosTextAndCommit(unk80->unk08, 3, 2, *xval);
}
}
@@ -846,11 +846,11 @@ THUMB_FUNC static BOOL FUN_0203A6C8(struct ScriptContext* ctx)
{
if (*ydir == 0)
{
- FUN_020179E0(unk80->unk08, 3, 4, *yval);
+ BgSetPosTextAndCommit(unk80->unk08, 3, 4, *yval);
}
else
{
- FUN_020179E0(unk80->unk08, 3, 5, *yval);
+ BgSetPosTextAndCommit(unk80->unk08, 3, 5, *yval);
}
}
diff --git a/arm9/src/scrcmd_24.c b/arm9/src/scrcmd_24.c
index 9c8f8d4b..b38ed05a 100644
--- a/arm9/src/scrcmd_24.c
+++ b/arm9/src/scrcmd_24.c
@@ -25,11 +25,13 @@ THUMB_FUNC BOOL ScrCmd_Unk01C6(struct ScriptContext* ctx)
return TRUE;
}
-#ifdef NONMATCHING
THUMB_FUNC BOOL ScrCmd_Unk01C7(struct ScriptContext* ctx)
{
- u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
- struct UnkStruct_02037CF0** unk_ptr = FUN_02039438(ctx->unk80, 19);
+ struct UnkStruct_02037CF0** unk_ptr;
+ u16* ret_ptr;
+
+ ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ unk_ptr = FUN_02039438(ctx->unk80, 19);
GF_ASSERT(*unk_ptr != NULL);
*ret_ptr = FUN_02037D5C(*unk_ptr);
@@ -42,44 +44,6 @@ THUMB_FUNC BOOL ScrCmd_Unk01C7(struct ScriptContext* ctx)
*unk_ptr = NULL;
return FALSE;
}
-#else
-THUMB_FUNC asm BOOL ScrCmd_Unk01C7(struct ScriptContext* ctx)
-{
- push {r3-r5, lr}
- add r4, r0, #0x0
- bl ScriptReadHalfword
- add r1, r0, #0x0
- add r0, r4, #0x0
- add r0, #0x80
- ldr r0, [r0, #0x0]
- bl GetVarPointer
- add r4, #0x80
- add r5, r0, #0x0
- ldr r0, [r4, #0x0]
- mov r1, #0x13
- bl FUN_02039438
- add r4, r0, #0x0
- ldr r0, [r4, #0x0]
- cmp r0, #0x0
- bne _02045DFC
- bl GF_AssertFail
-_02045DFC:
- ldr r0, [r4, #0x0]
- bl FUN_02037D5C
- strh r0, [r5, #0x0]
- ldrh r0, [r5, #0x0]
- cmp r0, #0x4
- bne _02045E0E
- mov r0, #0xff
- strh r0, [r5, #0x0]
-_02045E0E:
- ldr r0, [r4, #0x0]
- bl FreeToHeap
- mov r0, #0x0
- str r0, [r4, #0x0]
- pop {r3-r5, pc}
-}
-#endif
THUMB_FUNC BOOL ScrCmd_Unk021E(struct ScriptContext* ctx)
{
@@ -159,12 +123,15 @@ THUMB_FUNC BOOL ScrCmd_Unk0222(struct ScriptContext* ctx)
return FALSE;
}
-#ifdef NONMATCHING
THUMB_FUNC BOOL ScrCmd_Unk0223(struct ScriptContext* ctx)
{
- u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
- struct UnkStruct_02037CF0** unk = FUN_02039438(ctx->unk80, 19);
- struct UnkStruct_02037CF0* unk_sub = *unk;
+ struct UnkStruct_02037CF0** unk;
+ struct UnkStruct_02037CF0* unk_sub;
+ u16* ret_ptr;
+
+ ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ unk = FUN_02039438(ctx->unk80, 19);
+ unk_sub = *unk;
GF_ASSERT(unk_sub != NULL);
@@ -180,49 +147,16 @@ THUMB_FUNC BOOL ScrCmd_Unk0223(struct ScriptContext* ctx)
FUN_02088DF0(unk_sub);
return FALSE;
}
-#else
-THUMB_FUNC asm BOOL ScrCmd_Unk0223(struct ScriptContext* ctx)
-{
- push {r3-r5, lr}
- add r4, r0, #0x0
- bl ScriptReadHalfword
- add r1, r0, #0x0
- add r0, r4, #0x0
- add r0, #0x80
- ldr r0, [r0, #0x0]
- bl GetVarPointer
- add r4, #0x80
- add r5, r0, #0x0
- ldr r0, [r4, #0x0]
- mov r1, #0x13
- bl FUN_02039438
- ldr r4, [r0, #0x0]
- cmp r4, #0x0
- bne _02045FB2
- bl GF_AssertFail
-_02045FB2:
- ldrb r0, [r4, #0x16]
- cmp r0, #0x0
- bne _02045FBC
- mov r0, #0x0
- b _02045FBE
-_02045FBC:
- mov r0, #0xff
-_02045FBE:
- strh r0, [r5, #0x0]
- add r0, r4, #0x0
- bl FUN_02088DF0
- mov r0, #0x0
- pop {r3-r5, pc}
-}
-#endif
-#ifdef NONMATCHING
THUMB_FUNC BOOL ScrCmd_Unk0225(struct ScriptContext* ctx)
{
- u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
- struct UnkStruct_02037CF0** unk = FUN_02039438(ctx->unk80, 19);
- struct UnkStruct_02037CF0* unk_sub = *unk;
+ struct UnkStruct_02037CF0** unk;
+ struct UnkStruct_02037CF0* unk_sub;
+ u16* ret_ptr;
+
+ ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ unk = FUN_02039438(ctx->unk80, 19);
+ unk_sub = *unk;
GF_ASSERT(unk_sub != NULL);
@@ -238,39 +172,3 @@ THUMB_FUNC BOOL ScrCmd_Unk0225(struct ScriptContext* ctx)
FUN_02088DF0(unk_sub);
return FALSE;
}
-#else
-THUMB_FUNC asm BOOL ScrCmd_Unk0225(struct ScriptContext* ctx)
-{
- push {r3-r5, lr}
- add r4, r0, #0x0
- bl ScriptReadHalfword
- add r1, r0, #0x0
- add r0, r4, #0x0
- add r0, #0x80
- ldr r0, [r0, #0x0]
- bl GetVarPointer
- add r4, #0x80
- add r5, r0, #0x0
- ldr r0, [r4, #0x0]
- mov r1, #0x13
- bl FUN_02039438
- ldr r4, [r0, #0x0]
- cmp r4, #0x0
- bne _02045FB2
- bl GF_AssertFail
-_02045FB2:
- ldrb r0, [r4, #0x16]
- cmp r0, #0x0
- bne _02045FBC
- mov r0, #0x0
- b _02045FBE
-_02045FBC:
- mov r0, #0xff
-_02045FBE:
- strh r0, [r5, #0x0]
- add r0, r4, #0x0
- bl FUN_02088DF0
- mov r0, #0x0
- pop {r3-r5, pc}
-}
-#endif
diff --git a/arm9/src/script.c b/arm9/src/script.c
index 3de2ee73..3e8cca58 100644
--- a/arm9/src/script.c
+++ b/arm9/src/script.c
@@ -76,7 +76,7 @@ THUMB_FUNC u8 RunScriptCommand(struct ScriptContext *ctx)
cmdCode = ScriptReadHalfword(ctx);
if (cmdCode >= ctx->cmdCount)
{
- GF_AssertFail();
+ GF_ASSERT(0);
ctx->mode = 0;
return FALSE;
}
diff --git a/arm9/src/script_pokemon_util.c b/arm9/src/script_pokemon_util.c
index 55519ca3..de78ae28 100644
--- a/arm9/src/script_pokemon_util.c
+++ b/arm9/src/script_pokemon_util.c
@@ -109,7 +109,7 @@ struct Pokemon * GetFirstAliveMonInParty_CrashIfNone(struct PlayerParty * party)
if(MonNotFaintedOrEgg(mon))
return mon;
}
- GF_AssertFail();
+ GF_ASSERT(0);
return 0;
}
diff --git a/arm9/src/text_02054590.c b/arm9/src/text_02054590.c
index dcbad024..d4984f78 100644
--- a/arm9/src/text_02054590.c
+++ b/arm9/src/text_02054590.c
@@ -1,20 +1,20 @@
#include "text_02054590.h"
#include "text.h"
-#include "unk_02016B94.h"
+#include "bg_window.h"
extern void FUN_0201BD5C(void);
extern void FUN_02002ED0(u32 param0, u32 param1, u32 param2);
extern void FUN_02002EEC(u32 param0, u32 param1, u32 param2);
extern void FUN_0200CD68(
- struct UnkStruct_02016B94_2 *param0, u32 param1, u32 param2, u32 param3, u8 param4, u32 param5);
+ struct BgConfig *param0, u32 param1, u32 param2, u32 param3, u8 param4, u32 param5);
extern void FUN_0200D0BC(struct Window *param0, u32 param1, u32 param2, u32 param3);
extern void FUN_02002B60(u8 param0);
extern void FUN_02002B7C(u32 param0);
extern void FUN_02002BB8(u32 param0);
-extern void FUN_0200D300(struct UnkStruct_02016B94_2 *param0,
+extern void FUN_0200D300(struct BgConfig *param0,
u32 param1,
u32 param2,
u32 param3,
@@ -33,21 +33,21 @@ THUMB_FUNC void FUN_02054590(u32 param0, u32 param1)
FUN_02002EEC(param0, 384, 4);
}
-THUMB_FUNC void FUN_020545B8(struct UnkStruct_02016B94_2 *param0, struct Window *param1, u32 param2)
+THUMB_FUNC void FUN_020545B8(struct BgConfig *param0, struct Window *param1, u32 param2)
{
if (param2 == 3)
{
- FUN_02019064(param0, param1, 3, 2, 19, 27, 4, 12, 813);
+ AddWindowParameterized(param0, param1, 3, 2, 19, 27, 4, 12, 813);
}
else
{
- FUN_02019064(param0, param1, 7, 2, 19, 27, 4, 12, 404);
+ AddWindowParameterized(param0, param1, 7, 2, 19, 27, 4, 12, 404);
}
}
THUMB_FUNC void FUN_02054608(struct Window *param0, struct Options *options)
{
- FUN_0200CD68(param0->unk00, FUN_0201AB08(param0), 994, 10, (u8)Options_GetFrame(options), 4);
+ FUN_0200CD68(param0->bgConfig, GetWindowBgId(param0), 994, 10, (u8)Options_GetFrame(options), 4);
FUN_0205464C(param0);
FUN_0200D0BC(param0, 0, 994, 10);
}
@@ -79,7 +79,7 @@ THUMB_FUNC u8 FUN_020546C8(u32 param0) // bool8?
}
THUMB_FUNC void FUN_020546E0(
- struct UnkStruct_02016B94_2 *param0, struct Window *param1, u32 param2, u32 param3)
+ struct BgConfig *param0, struct Window *param1, u32 param2, u32 param3)
{
u32 r4 = 0;
u32 r5 = 0;
@@ -95,17 +95,17 @@ THUMB_FUNC void FUN_020546E0(
}
if (param3 == 3)
{
- FUN_02019064(param0, param1, 3, (u8)r4, 19, (u8)r5, 4, 9, 813);
+ AddWindowParameterized(param0, param1, 3, (u8) r4, 19, (u8) r5, 4, 9, 813);
}
else
{
- FUN_02019064(param0, param1, 7, (u8)r4, 19, (u8)r5, 4, 9, 404);
+ AddWindowParameterized(param0, param1, 7, (u8) r4, 19, (u8) r5, 4, 9, 404);
}
}
THUMB_FUNC void FUN_02054744(struct Window *param0, u32 param1, u32 param2)
{
- FUN_0200D300(param0->unk00, FUN_0201AB08(param0), 0x399, 9, (u8)param1, param2, 4);
+ FUN_0200D300(param0->bgConfig, GetWindowBgId(param0), 0x399, 9, (u8)param1, param2, 4);
FillWindowPixelBuffer(param0, 15);
FUN_0200D6F8(param0, 0, 0x399, 9, (u8)param1);
}
diff --git a/arm9/src/timer3.c b/arm9/src/timer3.c
index 1799fd24..d4e8f8a1 100644
--- a/arm9/src/timer3.c
+++ b/arm9/src/timer3.c
@@ -1,37 +1,37 @@
#include "timer3.h"
-struct Timer3Data timer3_data;
+static BOOL timer3_needReset;
+static vu64 timer3_counter;
THUMB_FUNC void Init_Timer3()
{
- timer3_data.Timer3Counter = 0;
- timer3_data.NeedReset = FALSE;
+ timer3_counter = 0;
+ timer3_needReset = FALSE;
- reg_OS_TM3CNT_H = 0;
- reg_OS_TM3CNT_L = 0;
- reg_OS_TM3CNT_H = 0xc1; // start timer3 with f/64 and irq enable
+ OS_SetTimerControl(OS_TIMER_3, 0);
+ OS_SetTimerCount(OS_TIMER_3, 0);
+ OS_SetTimerControl(OS_TIMER_3, REG_OS_TM3CNT_H_E_MASK | REG_OS_TM3CNT_H_I_MASK | OS_TIMER_PRESCALER_64); // start timer3 with f/64 and irq enable
- OS_SetIrqFunction(0x40, &CountUpTimer3);
- OS_EnableIrqMask(0x40); // irq on timer3 overflow
+ OS_SetIrqFunction(OS_IE_TIMER3, &CountUpTimer3);
+ OS_EnableIrqMask(OS_IE_TIMER3); // irq on timer3 overflow
}
THUMB_FUNC void CountUpTimer3()
{
- timer3_data.Timer3Counter++;
+ timer3_counter++;
- if (timer3_data.NeedReset)
+ if (timer3_needReset)
{
- reg_OS_TM3CNT_H = 0;
- reg_OS_TM3CNT_L = 0;
- reg_OS_TM3CNT_H = 0xc1;
- timer3_data.NeedReset = FALSE;
+ OS_SetTimerControl(OS_TIMER_3, 0);
+ OS_SetTimerCount(OS_TIMER_3, 0);
+ OS_SetTimerControl(OS_TIMER_3, REG_OS_TM3CNT_H_E_MASK | REG_OS_TM3CNT_H_I_MASK | OS_TIMER_PRESCALER_64);
+ timer3_needReset = FALSE;
}
- *(vu32 *)HW_INTR_CHECK_BUF |= 0x40;
-
- OS_SetIrqFunction(0x40, &CountUpTimer3);
+ OS_SetIrqCheckFlag(OS_IE_TIMER3);
+ OS_SetIrqFunction(OS_IE_TIMER3, &CountUpTimer3);
}
THUMB_FUNC u64 internal_GetTimer3Count()
@@ -39,15 +39,15 @@ THUMB_FUNC u64 internal_GetTimer3Count()
OSIntrMode intr_mode = OS_DisableInterrupts();
vu16 timer3 = reg_OS_TM3CNT_L;
- vu64 timer3_counter = timer3_data.Timer3Counter & 0x0000ffffffffffff;
+ vu64 counter = timer3_counter & 0x0000ffffffffffff;
- if (reg_OS_IF & 0x40 && !(timer3 & 0x8000))
+ if (reg_OS_IF & OS_IE_TIMER3 && !(timer3 & 0x8000))
{
- timer3_counter++;
+ counter++;
}
OS_RestoreInterrupts(intr_mode);
- return (timer3_counter << 16) | timer3;
+ return (counter << 16) | timer3;
}
THUMB_FUNC u64 GetTimer3Count()
@@ -57,10 +57,10 @@ THUMB_FUNC u64 GetTimer3Count()
THUMB_FUNC u64 Timer3CountToMilliSeconds(u64 count)
{
- return (count *64) / 33514;
+ return (count * 64) / (HW_SYSTEM_CLOCK / 1000);
}
THUMB_FUNC u64 Timer3CountToSeconds(u64 count)
{
- return (count *64) / HW_SYSTEM_CLOCK;
+ return (count * 64) / HW_SYSTEM_CLOCK;
}
diff --git a/arm9/src/unk_0200BB14.c b/arm9/src/unk_0200BB14.c
index 358d21ea..4ed957d6 100644
--- a/arm9/src/unk_0200BB14.c
+++ b/arm9/src/unk_0200BB14.c
@@ -517,13 +517,8 @@ THUMB_FUNC BOOL FUN_0200C00C(u32 *param0,
return TRUE;
}
- GF_AssertFail();
- if (r5 != 0)
- {
- return TRUE;
- }
-
- return FALSE;
+ GF_ASSERT(0);
+ return r5 != 0 ? TRUE : FALSE;
}
THUMB_FUNC s32 FUN_0200C06C(u32 *param0,
@@ -549,7 +544,7 @@ THUMB_FUNC s32 FUN_0200C06C(u32 *param0,
return (s8)FUN_02009E88(r5, param6);
}
- GF_AssertFail();
+ GF_ASSERT(0);
return -1;
}
@@ -721,7 +716,7 @@ THUMB_FUNC struct UnkStruct_0200BB14_5 *FUN_0200C154(
}
else
{
- GF_AssertFail();
+ GF_ASSERT(0);
}
return ptr;
@@ -805,13 +800,8 @@ THUMB_FUNC BOOL FUN_0200C404(u32 *param0,
GF_ASSERT(r4 == 1);
return r4;
}
- GF_AssertFail();
- if (r5 != 0)
- {
- return TRUE;
- }
-
- return FALSE;
+ GF_ASSERT(0);
+ return r5 != 0 ? TRUE : FALSE;
}
THUMB_FUNC BOOL FUN_0200C474(u32 *param0, u32 param1)
@@ -1259,13 +1249,8 @@ THUMB_FUNC BOOL FUN_0200C918(u32 *param0,
return TRUE;
}
- GF_AssertFail();
- if (r5 != 0)
- {
- return TRUE;
- }
-
- return FALSE;
+ GF_ASSERT(0);
+ return r5 != 0 ? TRUE : FALSE;
}
THUMB_FUNC BOOL FUN_0200C978(u32 *param0,
@@ -1290,13 +1275,8 @@ THUMB_FUNC BOOL FUN_0200C978(u32 *param0,
return TRUE;
}
- GF_AssertFail();
- if (r5 != 0)
- {
- return TRUE;
- }
-
- return FALSE;
+ GF_ASSERT(0);
+ return r5 != 0 ? TRUE : FALSE;
}
THUMB_FUNC void FUN_0200C9D8(
diff --git a/arm9/src/unk_02016B94.c b/arm9/src/unk_02016B94.c
deleted file mode 100644
index c03fbd75..00000000
--- a/arm9/src/unk_02016B94.c
+++ /dev/null
@@ -1,8110 +0,0 @@
-#include "global.h"
-#include "unk_02016B94.h"
-#include "GX_layers.h"
-#include "game_init.h"
-#include "gx.h"
-#include "heap.h"
-
-extern void NNS_G2dGetUnpackedBGCharacterData(void *param0, u32 *param1);
-extern void NNS_G2dGetUnpackedPaletteData(void *param0, u32 *param1);
-
-const u8 UNK_020EDB30[8] = {
- 0x10,
- 0x20,
- 0x20,
- 0x20,
- 0x20,
- 0x20,
- 0x00,
- 0x00,
-};
-
-void (*const UNK_020EDB5C[])(struct Window *) = {
- FUN_020194C8,
- FUN_0201951C,
- FUN_020194C8,
-};
-
-void (*const UNK_020EDB50[])(struct Window *) = {
- FUN_020195A8,
- FUN_020195E4,
- FUN_020195A8,
-};
-
-void (*const UNK_020EDB44[])(struct Window *) = {
- FUN_020195D0,
- FUN_0201960C,
- FUN_020195D0,
-};
-
-void (*const UNK_020EDB38[])(struct Window *) = {
- FUN_020192D4,
- FUN_02019358,
- FUN_020192D4,
-};
-
-void (*const UNK_020EDB68[])(struct Window *) = {
- FUN_0201949C,
- FUN_020194E0,
- FUN_0201949C,
-};
-
-void (*const UNK_020EDB74[])(struct Window *) = {
- FUN_020193B4,
- FUN_02019444,
- FUN_020193B4,
-};
-
-THUMB_FUNC struct UnkStruct_02016B94_2 *FUN_02016B94(u32 heap_id)
-{
- struct UnkStruct_02016B94_2 *ptr = AllocFromHeap(heap_id, sizeof(struct UnkStruct_02016B94_2));
- memset(ptr, 0, sizeof(struct UnkStruct_02016B94_2));
- ptr->unk00 = heap_id;
- ptr->unk04 = 0;
- ptr->unk06 = 0;
-
- return ptr;
-}
-
-THUMB_FUNC u32 FUN_02016BB8(u32 *param0)
-{
- return *param0;
-}
-
-THUMB_FUNC void FUN_02016BBC(const struct GraphicsModes *modes)
-{
- GX_SetGraphicsMode(modes->dispMode, modes->bgMode, modes->_2d3dMode);
- GXS_SetGraphicsMode(modes->subMode);
- reg_GX_DISPCNT &= ~REG_GX_DISPCNT_BGSCREENOFFSET_MASK;
- reg_GX_DISPCNT &= ~REG_GX_DISPCNT_BGCHAROFFSET_MASK;
-
- GX_DisableEngineALayers();
- GX_DisableEngineBLayers();
-}
-
-THUMB_FUNC void FUN_02016BF4(const struct GraphicsModes *param0, u32 param1)
-{
- if (param1 == 0)
- {
- GX_SetGraphicsMode(param0->dispMode, param0->bgMode, param0->_2d3dMode);
- GX_DisableEngineALayers();
- }
- else
- {
- GXS_SetGraphicsMode(param0->subMode);
- GX_DisableEngineBLayers();
- }
-}
-
-#ifdef NONMATCHING
-THUMB_FUNC void FUN_02016C18(
- struct UnkStruct_02016B94_2 *param0, u8 param1, const struct UnkStruct_02016B94_1 *param2, u8 param3)
-{
- u8 res = FUN_020177DC(param2->unk10, param3);
- switch (param1)
- {
- case 0:
- GX_EngineAToggleLayers(1, GX_LAYER_TOGGLE_ON);
-
- reg_G2_BG0CNT = (reg_G2_BG0CNT & 0x43) | (res << 14) | (param2->unk12 << 8) |
- (param2->unk11 << 7) | (param2->unk14 << 13) | (param2->unk13 << 2);
- reg_G2_BG0CNT = (reg_G2_BG0CNT & ~3) | (param2->unk15);
-
- if (param2->unk18 != 0)
- {
- reg_G2_BG0CNT |= 0x40;
- }
- else
- {
- reg_G2_BG0CNT &= ~0x40;
- }
-
- break;
-
- case 1:
- GX_EngineAToggleLayers(2, GX_LAYER_TOGGLE_ON);
- reg_G2_BG1CNT = (reg_G2_BG1CNT & 0x43) | (res << 14) | (param2->unk12 << 8) |
- (param2->unk11 << 7) | (param2->unk14 << 13) | (param2->unk13 << 2);
- reg_G2_BG1CNT = (reg_G2_BG1CNT & ~3) | (param2->unk15);
-
- if (param2->unk18 != 0)
- {
- reg_G2_BG1CNT |= 0x40;
- }
- else
- {
- reg_G2_BG1CNT &= ~0x40;
- }
-
- break;
-
- case 2:
- GX_EngineAToggleLayers(4, GX_LAYER_TOGGLE_ON);
- switch (param3)
- {
- default:
- case 0:
- reg_G2_BG2CNT = (reg_G2_BG2CNT & 0x43) | (res << 14) | (param2->unk12 << 8) |
- (param2->unk11 << 7) | (param2->unk13 << 2);
- break;
- case 1:
- reg_G2_BG2CNT = (reg_G2_BG2CNT & 0x43) | (res << 14) | (param2->unk12 << 8) |
- (param2->unk16 << 13) | (param2->unk13 << 2);
- break;
- case 2:
- reg_G2_BG2CNT = (reg_G2_BG2CNT & 0x43) | (res << 14) | (param2->unk12 << 8) |
- (param2->unk16 << 13) | (param2->unk13 << 2);
- break;
- }
-
- reg_G2_BG2CNT = (reg_G2_BG2CNT & ~3) | (param2->unk15);
-
- if (param2->unk18 != 0)
- {
- reg_G2_BG2CNT |= 0x40;
- }
- else
- {
- reg_G2_BG2CNT &= ~0x40;
- }
-
- break;
-
- case 3:
- GX_EngineAToggleLayers(8, GX_LAYER_TOGGLE_ON);
-
- switch (param3)
- {
- default:
- case 0:
- reg_G2_BG3CNT = (reg_G2_BG3CNT & 0x43) | (res << 14) | (param2->unk12 << 8) |
- (param2->unk11 << 7) | (param2->unk13 << 2);
- break;
- case 1:
- reg_G2_BG3CNT = (reg_G2_BG3CNT & 0x43) | (res << 14) | (param2->unk12 << 8) |
- (param2->unk16 << 13) | (param2->unk13 << 2);
- break;
- case 2:
- reg_G2_BG3CNT = (reg_G2_BG3CNT & 0x43) | (res << 14) | (param2->unk12 << 8) |
- (param2->unk16 << 13) | (param2->unk13 << 2);
- break;
- }
-
- reg_G2_BG3CNT = (reg_G2_BG3CNT & ~3) | (param2->unk15);
- if (param2->unk18 != 0)
- {
- reg_G2_BG3CNT |= 0x40;
- }
- else
- {
- reg_G2_BG3CNT &= ~0x40;
- }
- break;
-
- case 4:
- GX_EngineBToggleLayers(1, GX_LAYER_TOGGLE_ON);
-
- reg_G2S_DB_BG0CNT = (reg_G2S_DB_BG0CNT & 0x43) | (res << 14) | (param2->unk12 << 8) |
- (param2->unk11 << 7) | (param2->unk14 << 13) | (param2->unk13 << 2);
-
- reg_G2S_DB_BG0CNT = (reg_G2S_DB_BG0CNT & ~3) | (param2->unk15);
-
- if (param2->unk18 != 0)
- {
- reg_G2S_DB_BG0CNT |= 0x40;
- }
- else
- {
- reg_G2S_DB_BG0CNT &= ~0x40;
- }
-
- break;
-
- case 5:
- GX_EngineBToggleLayers(2, GX_LAYER_TOGGLE_ON);
-
- reg_G2S_DB_BG1CNT = (reg_G2S_DB_BG1CNT & 0x43) | (res << 14) | (param2->unk12 << 8) |
- (param2->unk11 << 7) | (param2->unk14 << 13) | (param2->unk13 << 2);
-
- reg_G2S_DB_BG1CNT = (reg_G2S_DB_BG1CNT & ~3) | (param2->unk15);
-
- if (param2->unk18 != 0)
- {
- reg_G2S_DB_BG1CNT |= 0x40;
- }
- else
- {
- reg_G2S_DB_BG1CNT &= ~0x40;
- }
-
- break;
-
- case 6:
- GX_EngineBToggleLayers(4, GX_LAYER_TOGGLE_ON);
-
- switch (param3)
- {
- default:
- case 0:
- reg_G2S_DB_BG2CNT = (reg_G2S_DB_BG2CNT & 0x43) | (res << 14) | (param2->unk12 << 8) |
- (param2->unk11 << 7) | (param2->unk13 << 2);
- break;
- case 1:
- reg_G2S_DB_BG2CNT = (reg_G2S_DB_BG2CNT & 0x43) | (res << 14) | (param2->unk12 << 8) |
- (param2->unk16 << 13) | (param2->unk13 << 2);
- break;
- case 2:
- reg_G2S_DB_BG2CNT = (reg_G2S_DB_BG2CNT & 0x43) | (res << 14) | (param2->unk12 << 8) |
- (param2->unk16 << 13) | (param2->unk13 << 2);
- break;
- }
-
- reg_G2S_DB_BG2CNT = (reg_G2S_DB_BG2CNT & ~3) | (param2->unk15);
-
- if (param2->unk18 != 0)
- {
- reg_G2S_DB_BG2CNT |= 0x40;
- }
- else
- {
- reg_G2S_DB_BG2CNT &= ~0x40;
- }
-
- break;
- case 7:
- GX_EngineBToggleLayers(8, GX_LAYER_TOGGLE_ON);
- switch (param3)
- {
- default:
- case 0:
- reg_G2S_DB_BG3CNT = (reg_G2S_DB_BG3CNT & 0x43) | (res << 14) | (param2->unk12 << 8) |
- (param2->unk11 << 7) | (param2->unk13 << 2);
- break;
- case 1:
- reg_G2S_DB_BG3CNT = (reg_G2S_DB_BG3CNT & 0x43) | (res << 14) | (param2->unk12 << 8) |
- (param2->unk16 << 13) | (param2->unk13 << 2);
- break;
- case 2:
- reg_G2S_DB_BG3CNT = (reg_G2S_DB_BG3CNT & 0x43) | (res << 14) | (param2->unk12 << 8) |
- (param2->unk16 << 13) | (param2->unk13 << 2);
- break;
- }
-
- reg_G2S_DB_BG3CNT = (reg_G2S_DB_BG3CNT & ~3) | (param2->unk15);
- if (param2->unk18 != 0)
- {
- reg_G2S_DB_BG3CNT |= 0x40;
- }
- else
- {
- reg_G2S_DB_BG3CNT &= ~0x40;
- }
- break;
- }
-
- param0->unk08[param1].unk20 = 0;
- param0->unk08[param1].unk24 = 0x1000;
- param0->unk08[param1].unk28 = 0x1000;
- param0->unk08[param1].unk2c = 0;
- param0->unk08[param1].unk30 = 0;
-
- if (param2->unk08 != 0)
- {
- param0->unk08[param1].unk08 = AllocFromHeap(param0->unk00, param2->unk08);
-
- MI_CpuClear16(param0->unk08[param1].unk08, param2->unk08);
-
- param0->unk08[param1].unk0c = param2->unk08;
- param0->unk08[param1].unk10 = param2->unk0c;
- }
- else
- {
- param0->unk08[param1].unk08 = 0;
- param0->unk08[param1].unk0c = 0;
- param0->unk08[param1].unk10 = 0;
- }
-
- param0->unk08[param1].unk1d = param2->unk10;
- param0->unk08[param1].unk1c = param3;
- param0->unk08[param1].unk1e = param2->unk11;
-
- if (param3 == 0 && param2->unk11 == 0)
- {
- param0->unk08[param1].unk1f = 0x20;
- }
- else
- {
- param0->unk08[param1].unk1f = 0x40;
- }
-
- FUN_020179E0(param0, param1, 0, param2->unk00);
- FUN_020179E0(param0, param1, 3, param2->unk04);
-}
-#else
-THUMB_FUNC asm void FUN_02016C18(
- struct UnkStruct_02016B94_2 *param0, u8 param1, const struct UnkStruct_02016B94_1 *param2, u8 param3)
-{
- // clang-format off
- push {r3-r7, lr}
- sub sp, #0x18
- str r1, [sp, #0x4]
- str r3, [sp, #0x8]
- add r4, r2, #0x0
- str r0, [sp, #0x0]
- ldrb r0, [r4, #0x10]
- ldr r1, [sp, #0x8]
- bl FUN_020177DC
- add r5, r0, #0x0
- ldr r0, [sp, #0x4]
- cmp r0, #0x7
- bls _02016C36
- b _0201705A
-_02016C36:
- add r0, r0, r0
- add r0, pc
- ldrh r0, [r0, #0x6]
- lsl r0, r0, #0x10
- asr r0, r0, #0x10
- add pc, r0
-_02016C42:
- // jump table (using 16-bit offset)
- // .short _02016C52 - _02016C42 - 2; case 0
- // .short _02016CAA - _02016C42 - 2; case 1
- // .short _02016D02 - _02016C42 - 2; case 2
- // .short _02016DA4 - _02016C42 - 2; case 3
- // .short _02016E46 - _02016C42 - 2; case 4
- // .short _02016E9E - _02016C42 - 2; case 5
- // .short _02016EF6 - _02016C42 - 2; case 6
- // .short _02016F98 - _02016C42 - 2; case 7
-
- lsl r6, r1, #0
- lsl r6, r4, #1
- lsl r6, r7, #2
- lsl r0, r4, #5
- lsl r2, r0, #8
- lsl r2, r3, #9
- lsl r2, r6, #10
- lsl r4, r2, #13
-_02016C52:
- mov r0, #0x1
- add r1, r0, #0x0
- bl GX_EngineAToggleLayers
- ldrb r3, [r4, #0x14]
- ldrb r1, [r4, #0x12]
- ldrb r0, [r4, #0x11]
- ldrb r2, [r4, #0x13]
- lsl r6, r3, #0xd
- lsl r0, r0, #0x7
- lsl r3, r2, #0x2
- str r0, [sp, #0xc]
- ldr r2, =0x04000008
- lsl r7, r1, #0x8
- ldrh r1, [r2, #0x0]
- mov r0, #0x43
- and r0, r1
- lsl r1, r5, #0xe
- orr r1, r0
- ldr r0, [sp, #0xc]
- orr r0, r1
- orr r0, r7
- orr r0, r3
- orr r0, r6
- strh r0, [r2, #0x0]
- ldrh r1, [r2, #0x0]
- mov r0, #0x3
- bic r1, r0
- ldrb r0, [r4, #0x15]
- orr r0, r1
- strh r0, [r2, #0x0]
- ldr r0, [r4, #0x18]
- cmp r0, #0x0
- beq _02016CA0
- ldrh r1, [r2, #0x0]
- mov r0, #0x40
- orr r0, r1
- strh r0, [r2, #0x0]
- b _0201705A
-_02016CA0:
- ldrh r1, [r2, #0x0]
- mov r0, #0x40
- bic r1, r0
- strh r1, [r2, #0x0]
- b _0201705A
-_02016CAA:
- mov r0, #0x2
- mov r1, #0x1
- bl GX_EngineAToggleLayers
- ldrb r3, [r4, #0x14]
- ldrb r1, [r4, #0x12]
- ldrb r0, [r4, #0x11]
- ldrb r2, [r4, #0x13]
- lsl r6, r3, #0xd
- lsl r0, r0, #0x7
- lsl r3, r2, #0x2
- str r0, [sp, #0x10]
- ldr r2, =0x0400000A
- lsl r7, r1, #0x8
- ldrh r1, [r2, #0x0]
- mov r0, #0x43
- and r0, r1
- lsl r1, r5, #0xe
- orr r1, r0
- ldr r0, [sp, #0x10]
- orr r0, r1
- orr r0, r7
- orr r0, r3
- orr r0, r6
- strh r0, [r2, #0x0]
- ldrh r1, [r2, #0x0]
- mov r0, #0x3
- bic r1, r0
- ldrb r0, [r4, #0x15]
- orr r0, r1
- strh r0, [r2, #0x0]
- ldr r0, [r4, #0x18]
- cmp r0, #0x0
- beq _02016CF8
- ldrh r1, [r2, #0x0]
- mov r0, #0x40
- orr r0, r1
- strh r0, [r2, #0x0]
- b _0201705A
-_02016CF8:
- ldrh r1, [r2, #0x0]
- mov r0, #0x40
- bic r1, r0
- strh r1, [r2, #0x0]
- b _0201705A
-_02016D02:
- mov r0, #0x4
- mov r1, #0x1
- bl GX_EngineAToggleLayers
- ldr r0, [sp, #0x8]
- cmp r0, #0x0
- beq _02016D18
- cmp r0, #0x1
- beq _02016D3A
- cmp r0, #0x2
- beq _02016D5C
-_02016D18:
- ldrb r1, [r4, #0x12]
- ldr r7, =0x0400000C
- ldrb r2, [r4, #0x13]
- lsl r3, r1, #0x8
- ldrb r0, [r4, #0x11]
- lsl r6, r2, #0x2
- ldrh r1, [r7, #0x0]
- lsl r2, r0, #0x7
- mov r0, #0x43
- and r0, r1
- lsl r1, r5, #0xe
- orr r0, r1
- orr r0, r2
- orr r0, r3
- orr r0, r6
- strh r0, [r7, #0x0]
- b _02016D7C
-_02016D3A:
- ldrb r2, [r4, #0x13]
- ldrb r1, [r4, #0x12]
- ldrb r0, [r4, #0x16]
- lsl r3, r2, #0x2
- ldr r7, =0x0400000C
- lsl r2, r1, #0x8
- lsl r6, r0, #0xd
- ldrh r1, [r7, #0x0]
- mov r0, #0x43
- and r0, r1
- lsl r1, r5, #0xe
- orr r0, r1
- orr r0, r2
- orr r0, r3
- orr r0, r6
- strh r0, [r7, #0x0]
- b _02016D7C
-_02016D5C:
- ldrb r1, [r4, #0x12]
- ldr r7, =0x0400000C
- ldrb r0, [r4, #0x16]
- lsl r3, r1, #0x8
- ldrb r2, [r4, #0x13]
- lsl r6, r0, #0xd
- ldrh r1, [r7, #0x0]
- mov r0, #0x43
- lsl r2, r2, #0x2
- and r0, r1
- lsl r1, r5, #0xe
- orr r0, r1
- orr r0, r2
- orr r0, r3
- orr r0, r6
- strh r0, [r7, #0x0]
-_02016D7C:
- ldr r0, =0x0400000C
- mov r1, #0x3
- ldrh r2, [r0, #0x0]
- bic r2, r1
- ldrb r1, [r4, #0x15]
- orr r1, r2
- strh r1, [r0, #0x0]
- ldr r1, [r4, #0x18]
- cmp r1, #0x0
- beq _02016D9A
- ldrh r2, [r0, #0x0]
- mov r1, #0x40
- orr r1, r2
- strh r1, [r0, #0x0]
- b _0201705A
-_02016D9A:
- ldrh r2, [r0, #0x0]
- mov r1, #0x40
- bic r2, r1
- strh r2, [r0, #0x0]
- b _0201705A
-_02016DA4:
- mov r0, #0x8
- mov r1, #0x1
- bl GX_EngineAToggleLayers
- ldr r0, [sp, #0x8]
- cmp r0, #0x0
- beq _02016DBA
- cmp r0, #0x1
- beq _02016DDC
- cmp r0, #0x2
- beq _02016DFE
-_02016DBA:
- ldrb r1, [r4, #0x12]
- ldr r7, =0x0400000E
- ldrb r2, [r4, #0x13]
- lsl r3, r1, #0x8
- ldrb r0, [r4, #0x11]
- lsl r6, r2, #0x2
- ldrh r1, [r7, #0x0]
- lsl r2, r0, #0x7
- mov r0, #0x43
- and r0, r1
- lsl r1, r5, #0xe
- orr r0, r1
- orr r0, r2
- orr r0, r3
- orr r0, r6
- strh r0, [r7, #0x0]
- b _02016E1E
-_02016DDC:
- ldrb r2, [r4, #0x13]
- ldrb r1, [r4, #0x12]
- ldrb r0, [r4, #0x16]
- lsl r3, r2, #0x2
- ldr r7, =0x0400000E
- lsl r2, r1, #0x8
- lsl r6, r0, #0xd
- ldrh r1, [r7, #0x0]
- mov r0, #0x43
- and r0, r1
- lsl r1, r5, #0xe
- orr r0, r1
- orr r0, r2
- orr r0, r3
- orr r0, r6
- strh r0, [r7, #0x0]
- b _02016E1E
-_02016DFE:
- ldrb r1, [r4, #0x12]
- ldr r7, =0x0400000E
- ldrb r0, [r4, #0x16]
- lsl r3, r1, #0x8
- ldrb r2, [r4, #0x13]
- lsl r6, r0, #0xd
- ldrh r1, [r7, #0x0]
- mov r0, #0x43
- lsl r2, r2, #0x2
- and r0, r1
- lsl r1, r5, #0xe
- orr r0, r1
- orr r0, r2
- orr r0, r3
- orr r0, r6
- strh r0, [r7, #0x0]
-_02016E1E:
- ldr r0, =0x0400000E
- mov r1, #0x3
- ldrh r2, [r0, #0x0]
- bic r2, r1
- ldrb r1, [r4, #0x15]
- orr r1, r2
- strh r1, [r0, #0x0]
- ldr r1, [r4, #0x18]
- cmp r1, #0x0
- beq _02016E3C
- ldrh r2, [r0, #0x0]
- mov r1, #0x40
- orr r1, r2
- strh r1, [r0, #0x0]
- b _0201705A
-_02016E3C:
- ldrh r2, [r0, #0x0]
- mov r1, #0x40
- bic r2, r1
- strh r2, [r0, #0x0]
- b _0201705A
-_02016E46:
- mov r0, #0x1
- add r1, r0, #0x0
- bl GX_EngineBToggleLayers
- ldrb r3, [r4, #0x14]
- ldrb r1, [r4, #0x12]
- ldrb r0, [r4, #0x11]
- ldrb r2, [r4, #0x13]
- lsl r6, r3, #0xd
- lsl r0, r0, #0x7
- lsl r3, r2, #0x2
- str r0, [sp, #0x14]
- ldr r2, =0x04001008
- lsl r7, r1, #0x8
- ldrh r1, [r2, #0x0]
- mov r0, #0x43
- and r0, r1
- lsl r1, r5, #0xe
- orr r1, r0
- ldr r0, [sp, #0x14]
- orr r0, r1
- orr r0, r7
- orr r0, r3
- orr r0, r6
- strh r0, [r2, #0x0]
- ldrh r1, [r2, #0x0]
- mov r0, #0x3
- bic r1, r0
- ldrb r0, [r4, #0x15]
- orr r0, r1
- strh r0, [r2, #0x0]
- ldr r0, [r4, #0x18]
- cmp r0, #0x0
- beq _02016E94
- ldrh r1, [r2, #0x0]
- mov r0, #0x40
- orr r0, r1
- strh r0, [r2, #0x0]
- b _0201705A
-_02016E94:
- ldrh r1, [r2, #0x0]
- mov r0, #0x40
- bic r1, r0
- strh r1, [r2, #0x0]
- b _0201705A
-_02016E9E:
- mov r0, #0x2
- mov r1, #0x1
- bl GX_EngineBToggleLayers
- ldrb r2, [r4, #0x13]
- ldrb r1, [r4, #0x12]
- ldrb r0, [r4, #0x11]
- lsl r6, r2, #0x2
- ldrb r3, [r4, #0x14]
- lsl r0, r0, #0x7
- mov r12, r0
- ldr r2, =0x0400100A
- lsl r7, r1, #0x8
- ldrh r1, [r2, #0x0]
- mov r0, #0x43
- lsl r3, r3, #0xd
- and r0, r1
- lsl r1, r5, #0xe
- orr r0, r1
- mov r1, r12
- orr r0, r1
- orr r0, r7
- orr r0, r6
- orr r0, r3
- strh r0, [r2, #0x0]
- ldrh r1, [r2, #0x0]
- mov r0, #0x3
- bic r1, r0
- ldrb r0, [r4, #0x15]
- orr r0, r1
- strh r0, [r2, #0x0]
- ldr r0, [r4, #0x18]
- cmp r0, #0x0
- beq _02016EEC
- ldrh r1, [r2, #0x0]
- mov r0, #0x40
- orr r0, r1
- strh r0, [r2, #0x0]
- b _0201705A
-_02016EEC:
- ldrh r1, [r2, #0x0]
- mov r0, #0x40
- bic r1, r0
- strh r1, [r2, #0x0]
- b _0201705A
-_02016EF6:
- mov r0, #0x4
- mov r1, #0x1
- bl GX_EngineBToggleLayers
- ldr r0, [sp, #0x8]
- cmp r0, #0x0
- beq _02016F0C
- cmp r0, #0x1
- beq _02016F2E
- cmp r0, #0x2
- beq _02016F50
-_02016F0C:
- ldrb r1, [r4, #0x12]
- ldr r7, =0x0400100C
- ldrb r2, [r4, #0x13]
- lsl r3, r1, #0x8
- ldrb r0, [r4, #0x11]
- lsl r6, r2, #0x2
- ldrh r1, [r7, #0x0]
- lsl r2, r0, #0x7
- mov r0, #0x43
- and r0, r1
- lsl r1, r5, #0xe
- orr r0, r1
- orr r0, r2
- orr r0, r3
- orr r0, r6
- strh r0, [r7, #0x0]
- b _02016F70
-_02016F2E:
- ldrb r2, [r4, #0x13]
- ldrb r1, [r4, #0x12]
- ldrb r0, [r4, #0x16]
- lsl r3, r2, #0x2
- ldr r7, =0x0400100C
- lsl r2, r1, #0x8
- lsl r6, r0, #0xd
- ldrh r1, [r7, #0x0]
- mov r0, #0x43
- and r0, r1
- lsl r1, r5, #0xe
- orr r0, r1
- orr r0, r2
- orr r0, r3
- orr r0, r6
- strh r0, [r7, #0x0]
- b _02016F70
-_02016F50:
- ldrb r1, [r4, #0x12]
- ldr r7, =0x0400100C
- ldrb r0, [r4, #0x16]
- lsl r3, r1, #0x8
- ldrb r2, [r4, #0x13]
- lsl r6, r0, #0xd
- ldrh r1, [r7, #0x0]
- mov r0, #0x43
- lsl r2, r2, #0x2
- and r0, r1
- lsl r1, r5, #0xe
- orr r0, r1
- orr r0, r2
- orr r0, r3
- orr r0, r6
- strh r0, [r7, #0x0]
-_02016F70:
- ldr r0, =0x0400100C
- mov r1, #0x3
- ldrh r2, [r0, #0x0]
- bic r2, r1
- ldrb r1, [r4, #0x15]
- orr r1, r2
- strh r1, [r0, #0x0]
- ldr r1, [r4, #0x18]
- cmp r1, #0x0
- beq _02016F8E
- ldrh r2, [r0, #0x0]
- mov r1, #0x40
- orr r1, r2
- strh r1, [r0, #0x0]
- b _0201705A
-_02016F8E:
- ldrh r2, [r0, #0x0]
- mov r1, #0x40
- bic r2, r1
- strh r2, [r0, #0x0]
- b _0201705A
-_02016F98:
- mov r0, #0x8
- mov r1, #0x1
- bl GX_EngineBToggleLayers
- ldr r0, [sp, #0x8]
- cmp r0, #0x0
- beq _02016FAE
- cmp r0, #0x1
- beq _02016FF2
- cmp r0, #0x2
- beq _02017014
-_02016FAE:
- ldrb r1, [r4, #0x12]
- ldr r7, =0x0400100E
- b _02016FD4
-_02016FD4:
- ldrb r2, [r4, #0x13]
- lsl r3, r1, #0x8
- ldrb r0, [r4, #0x11]
- lsl r6, r2, #0x2
- ldrh r1, [r7, #0x0]
- lsl r2, r0, #0x7
- mov r0, #0x43
- and r0, r1
- lsl r1, r5, #0xe
- orr r0, r1
- orr r0, r2
- orr r0, r3
- orr r0, r6
- strh r0, [r7, #0x0]
- b _02017034
-_02016FF2:
- ldrb r2, [r4, #0x13]
- ldrb r1, [r4, #0x12]
- ldrb r0, [r4, #0x16]
- lsl r3, r2, #0x2
- ldr r7, =0x0400100E
- lsl r2, r1, #0x8
- lsl r6, r0, #0xd
- ldrh r1, [r7, #0x0]
- mov r0, #0x43
- and r0, r1
- lsl r1, r5, #0xe
- orr r0, r1
- orr r0, r2
- orr r0, r3
- orr r0, r6
- strh r0, [r7, #0x0]
- b _02017034
-_02017014:
- ldrb r1, [r4, #0x12]
- ldr r7, =0x0400100E
- ldrb r0, [r4, #0x16]
- lsl r3, r1, #0x8
- ldrb r2, [r4, #0x13]
- lsl r6, r0, #0xd
- ldrh r1, [r7, #0x0]
- mov r0, #0x43
- lsl r2, r2, #0x2
- and r0, r1
- lsl r1, r5, #0xe
- orr r0, r1
- orr r0, r2
- orr r0, r3
- orr r0, r6
- strh r0, [r7, #0x0]
-_02017034:
- ldr r0, =0x0400100E
- mov r1, #0x3
- ldrh r2, [r0, #0x0]
- bic r2, r1
- ldrb r1, [r4, #0x15]
- orr r1, r2
- strh r1, [r0, #0x0]
- ldr r1, [r4, #0x18]
- cmp r1, #0x0
- beq _02017052
- ldrh r2, [r0, #0x0]
- mov r1, #0x40
- orr r1, r2
- strh r1, [r0, #0x0]
- b _0201705A
-_02017052:
- ldrh r2, [r0, #0x0]
- mov r1, #0x40
- bic r2, r1
- strh r2, [r0, #0x0]
-_0201705A:
- ldr r0, [sp, #0x4]
- mov r1, #0x2c
- add r5, r0, #0x0
- ldr r0, [sp, #0x0]
- mul r5, r1
- add r2, r0, r5
- mov r3, #0x0
- mov r0, #0x1
- strh r3, [r2, #0x20]
- lsl r0, r0, #0xc
- str r0, [r2, #0x24]
- str r0, [r2, #0x28]
- str r3, [r2, #0x2c]
- str r3, [r2, #0x30]
- ldr r1, [r4, #0x8]
- cmp r1, #0x0
- beq _020170A2
- ldr r0, [sp, #0x0]
- ldr r6, [sp, #0x0]
- ldr r0, [r0, #0x0]
- add r6, #0x8
- bl AllocFromHeap
- str r0, [r6, r5]
- ldr r1, [r6, r5]
- ldr r2, [r4, #0x8]
- mov r0, #0x0
- bl MIi_CpuClear16
- ldr r0, [sp, #0x0]
- ldr r2, [r4, #0x8]
- add r1, r0, r5
- str r2, [r1, #0xc]
- ldr r0, [r4, #0xc]
- str r0, [r1, #0x10]
- b _020170A8
-_020170A2:
- str r3, [r2, #0x8]
- str r3, [r2, #0xc]
- str r3, [r2, #0x10]
-_020170A8:
- ldr r0, [sp, #0x0]
- ldrb r1, [r4, #0x10]
- add r0, r0, r5
- strb r1, [r0, #0x1d]
- ldr r1, [sp, #0x8]
- strb r1, [r0, #0x1c]
- ldrb r1, [r4, #0x11]
- strb r1, [r0, #0x1e]
- ldr r1, [sp, #0x8]
- cmp r1, #0x0
- bne _020170CA
- ldrb r1, [r4, #0x11]
- cmp r1, #0x0
- bne _020170CA
- mov r1, #0x20
- strb r1, [r0, #0x1f]
- b _020170D2
-_020170CA:
- ldr r0, [sp, #0x0]
- mov r1, #0x40
- add r0, r0, r5
- strb r1, [r0, #0x1f]
-_020170D2:
- ldr r0, [sp, #0x0]
- ldr r1, [sp, #0x4]
- ldr r3, [r4, #0x0]
- mov r2, #0x0
- bl FUN_020179E0
- ldr r0, [sp, #0x0]
- ldr r1, [sp, #0x4]
- ldr r3, [r4, #0x4]
- mov r2, #0x3
- bl FUN_020179E0
- add sp, #0x18
- pop {r3-r7, pc}
- // clang-format on
-}
-#endif
-
-#ifdef NONMATCHING
-THUMB_FUNC void FUN_020170F4(struct UnkStruct_02016B94_2 *param0, u8 param1, u32 param2, u8 param3)
-{
- if (param2 == 0)
- {
- param0->unk08[param1].unk1e = param3;
- }
-
- switch (param1)
- {
- case 0:
- u16 bg0cnt = reg_G2_BG0CNT;
- if (param2 == 1)
- {
- bg0cnt = bg0cnt & 0xFFFFE0FF | ((u32)(param3 << 0x1b) >> 0x13);
- }
- else if (param2 == 2)
- {
- bg0cnt = bg0cnt & ~0x3c | ((u32)(param3 << 0x1c) >> 0x1a);
- }
-
- reg_G2_BG0CNT = (reg_G2_BG0CNT & 0x43) | ((u32)(bg0cnt << 0x10) >> 0x1e) << 0xe |
- param0->unk08[param1].unk1e << 7 | ((u32)(bg0cnt << 0x13) >> 0x1b) << 8 |
- ((u32)(bg0cnt << 0x1a) >> 0x1c) << 2 |
- ((u32)(bg0cnt << 0x12) >> 0x1f) << 0xd;
-
- break;
- case 1:
- u16 bg1cnt = reg_G2_BG1CNT;
- if (param2 == 1)
- {
- bg1cnt = bg1cnt & 0xFFFFE0FF | ((u32)(param3 << 0x1b) >> 0x13);
- }
- else if (param2 == 2)
- {
- bg1cnt = bg1cnt & ~0x3c | ((u32)(param3 << 0x1c) >> 0x1a);
- }
-
- reg_G2_BG1CNT = (reg_G2_BG1CNT & 0x43) | (((u32)bg1cnt << 0x10) >> 0x1e) << 0xe |
- param0->unk08[param1].unk1e << 7 | ((u32)(bg1cnt << 0x13) >> 0x1b) << 8 |
- ((u32)(bg1cnt << 0x1a) >> 0x1c) << 2 |
- ((u32)(bg1cnt << 0x12) >> 0x1f) << 0xd;
-
- break;
- case 2:
- switch (param0->unk08[param1].unk1c)
- {
- default:
- case 0:
- u16 bg2cnt_0 = reg_G2_BG2CNT;
- if (param2 == 1)
- {
- bg2cnt_0 = bg2cnt_0 & 0xFFFFE0FF | ((u32)(param3 << 0x1b) >> 0x13);
- }
- else if (param2 == 2)
- {
- bg2cnt_0 = bg2cnt_0 & ~0x3c | ((u32)(param3 << 0x1c) >> 0x1a);
- }
-
- reg_G2_BG2CNT = (reg_G2_BG2CNT & 0x43) | ((u32)(bg2cnt_0 << 0x10) >> 0x1e) << 0xe |
- param0->unk08[param1].unk1e << 7 |
- ((u32)(bg2cnt_0 << 0x13) >> 0x1b) << 8 |
- ((u32)(bg2cnt_0 << 0x1a) >> 0x1c) << 2;
-
- break;
- case 1:
- u16 bg2cnt_1 = reg_G2_BG2CNT;
- if (param2 == 1)
- {
- bg2cnt_1 = bg2cnt_1 & 0xFFFFE0FF | ((u32)(param3 << 0x1b) >> 0x13);
- }
- else if (param2 == 2)
- {
- bg2cnt_1 = bg2cnt_1 & ~0x3c | ((u32)(param3 << 0x1c) >> 0x1a);
- }
-
- reg_G2_BG2CNT = (reg_G2_BG2CNT & 0x43) | ((u32)(bg2cnt_1 << 0x10) >> 0x1e) << 0xe |
- ((u32)(bg2cnt_1 << 0x13) >> 0x1b) << 8 |
- ((u32)(bg2cnt_1 << 0x1a) >> 0x1c) << 2 |
- ((u32)(bg2cnt_1 << 0x12) >> 0x1f) << 0xd;
- break;
- case 2:
- u16 bg2cnt_2 = reg_G2_BG2CNT;
- if (param2 == 1)
- {
- bg2cnt_2 = bg2cnt_2 & 0xFFFFE0FF | ((u32)(param3 << 0x1b) >> 0x13);
- }
- else if (param2 == 2)
- {
- bg2cnt_2 = bg2cnt_2 & ~0x38 | ((u32)(param3 << 0x1d) >> 0x1a);
- }
-
- reg_G2_BG2CNT = (reg_G2_BG2CNT & 0x43) | ((u32)(bg2cnt_2 << 0x10) >> 0x1e) << 0xe |
- ((u32)(bg2cnt_2 << 0x13) >> 0x1b) << 8 |
- ((u32)(bg2cnt_2 << 0x1a) >> 0x1d) << 2 |
- ((u32)(bg2cnt_2 << 0x12) >> 0x1f) << 0xd;
- break;
- }
- break;
- case 3:
- switch (param0->unk08[param1].unk1c)
- {
- default:
- case 0:
- u16 bg3cnt_0 = reg_G2_BG3CNT;
- if (param2 == 1)
- {
- bg3cnt_0 = bg3cnt_0 & 0xFFFFE0FF | ((u32)(param3 << 0x1b) >> 0x13);
- }
- else if (param2 == 2)
- {
- bg3cnt_0 = bg3cnt_0 & ~0x3c | ((u32)(param3 << 0x1c) >> 0x1a);
- }
-
- reg_G2_BG3CNT = (reg_G2_BG3CNT & 0x43) | ((u32)(bg3cnt_0 << 0x10) >> 0x1e) << 0xe |
- param0->unk08[param1].unk1e << 7 |
- ((u32)(bg3cnt_0 << 0x13) >> 0x1b) << 8 |
- ((u32)(bg3cnt_0 << 0x1a) >> 0x1c) << 2;
-
- break;
- case 1:
- u16 bg3cnt_1 = reg_G2_BG3CNT;
- if (param2 == 1)
- {
- bg3cnt_1 = bg3cnt_1 & 0xFFFFE0FF | ((u32)(param3 << 0x1b) >> 0x13);
- }
- else if (param2 == 2)
- {
- bg3cnt_1 = bg3cnt_1 & ~0x3c | ((u32)(param3 << 0x1c) >> 0x1a);
- }
-
- reg_G2_BG3CNT = (reg_G2_BG3CNT & 0x43) | ((u32)(bg3cnt_1 << 0x10) >> 0x1e) << 0xe |
- ((u32)(bg3cnt_1 << 0x13) >> 0x1b) << 8 |
- ((u32)(bg3cnt_1 << 0x1a) >> 0x1c) << 2 |
- ((u32)(bg3cnt_1 << 0x12) >> 0x1f) << 0xd;
- break;
- case 2:
- u16 bg3cnt_2 = reg_G2_BG3CNT;
- if (param2 == 1)
- {
- bg3cnt_2 = bg3cnt_2 & 0xFFFFE0FF | ((u32)(param3 << 0x1b) >> 0x13);
- }
- else if (param2 == 2)
- {
- bg3cnt_2 = bg3cnt_2 & ~0x38 | ((u32)(param3 << 0x1d) >> 0x1a);
- }
-
- reg_G2_BG3CNT = (reg_G2_BG3CNT & 0x43) | ((u32)(bg3cnt_2 << 0x10) >> 0x1e) << 0xe |
- ((u32)(bg3cnt_2 << 0x13) >> 0x1b) << 8 |
- ((u32)(bg3cnt_2 << 0x1a) >> 0x1d) << 2 |
- ((u32)(bg3cnt_2 << 0x12) >> 0x1f) << 0xd;
- break;
- }
- break;
- case 4:
- u16 db_bg0cnt = reg_G2S_DB_BG0CNT;
- if (param2 == 1)
- {
- db_bg0cnt = db_bg0cnt & 0xFFFFE0FF | ((u32)(param3 << 0x1b) >> 0x13);
- }
- else if (param2 == 2)
- {
- db_bg0cnt = db_bg0cnt & ~0x3c | ((u32)(param3 << 0x1c) >> 0x1a);
- }
-
- reg_G2S_DB_BG0CNT =
- (reg_G2S_DB_BG0CNT & 0x43) | ((u32)(db_bg0cnt << 0x10) >> 0x1e) << 0xe |
- param0->unk08[param1].unk1e << 7 | ((u32)(db_bg0cnt << 0x13) >> 0x1b) << 8 |
- ((u32)(db_bg0cnt << 0x1a) >> 0x1c) << 2 | ((u32)(db_bg0cnt << 0x12) >> 0x1f) << 0xd;
-
- break;
- case 5:
- u16 db_bg1cnt = reg_G2S_DB_BG1CNT;
- if (param2 == 1)
- {
- db_bg1cnt = db_bg1cnt & 0xFFFFE0FF | ((u32)(param3 << 0x1b) >> 0x13);
- }
- else if (param2 == 2)
- {
- db_bg1cnt = db_bg1cnt & ~0x3c | ((u32)(param3 << 0x1c) >> 0x1a);
- }
-
- reg_G2S_DB_BG1CNT =
- (reg_G2S_DB_BG1CNT & 0x43) | ((u32)(db_bg1cnt << 0x10) >> 0x1e) << 0xe |
- param0->unk08[param1].unk1e << 7 | ((u32)(db_bg1cnt << 0x13) >> 0x1b) << 8 |
- ((u32)(db_bg1cnt << 0x1a) >> 0x1c) << 2 | ((u32)(db_bg1cnt << 0x12) >> 0x1f) << 0xd;
-
- break;
- case 6:
- switch (param0->unk08[param1].unk1c)
- {
- default:
- case 0:
- u16 db_bg2cnt_0 = reg_G2S_DB_BG2CNT;
- if (param2 == 1)
- {
- db_bg2cnt_0 = db_bg2cnt_0 & 0xFFFFE0FF | ((u32)(param3 << 0x1b) >> 0x13);
- }
- else if (param2 == 2)
- {
- db_bg2cnt_0 = db_bg2cnt_0 & ~0x3c | ((u32)(param3 << 0x1c) >> 0x1a);
- }
-
- reg_G2S_DB_BG2CNT =
- (reg_G2S_DB_BG2CNT & 0x43) | ((u32)(db_bg2cnt_0 << 0x10) >> 0x1e) << 0xe |
- param0->unk08[param1].unk1e << 7 | ((u32)(db_bg2cnt_0 << 0x13) >> 0x1b) << 8 |
- ((u32)(db_bg2cnt_0 << 0x1a) >> 0x1c) << 2;
-
- break;
- case 1:
- u16 db_bg2cnt_1 = reg_G2S_DB_BG2CNT;
- if (param2 == 1)
- {
- db_bg2cnt_1 = db_bg2cnt_1 & 0xFFFFE0FF | ((u32)(param3 << 0x1b) >> 0x13);
- }
- else if (param2 == 2)
- {
- db_bg2cnt_1 = db_bg2cnt_1 & ~0x3c | ((u32)(param3 << 0x1c) >> 0x1a);
- }
-
- reg_G2S_DB_BG2CNT = (reg_G2S_DB_BG2CNT & 0x43) |
- ((u32)(db_bg2cnt_1 << 0x10) >> 0x1e) << 0xe |
- ((u32)(db_bg2cnt_1 << 0x13) >> 0x1b) << 8 |
- ((u32)(db_bg2cnt_1 << 0x1a) >> 0x1c) << 2 |
- ((u32)(db_bg2cnt_1 << 0x12) >> 0x1f) << 0xd;
- break;
- case 2:
- u16 db_bg2cnt_2 = reg_G2S_DB_BG2CNT;
- if (param2 == 1)
- {
- db_bg2cnt_2 = db_bg2cnt_2 & 0xFFFFE0FF | ((u32)(param3 << 0x1b) >> 0x13);
- }
- else if (param2 == 2)
- {
- db_bg2cnt_2 = db_bg2cnt_2 & ~0x38 | ((u32)(param3 << 0x1d) >> 0x1a);
- }
-
- reg_G2S_DB_BG2CNT = (reg_G2S_DB_BG2CNT & 0x43) |
- ((u32)(db_bg2cnt_2 << 0x10) >> 0x1e) << 0xe |
- ((u32)(db_bg2cnt_2 << 0x13) >> 0x1b) << 8 |
- ((u32)(db_bg2cnt_2 << 0x1a) >> 0x1d) << 2 |
- ((u32)(db_bg2cnt_2 << 0x12) >> 0x1f) << 0xd;
- break;
- }
- break;
- case 7:
- switch (param0->unk08[param1].unk1c)
- {
- default:
- case 0:
- u16 db_bg3cnt_0 = reg_G2S_DB_BG3CNT;
- if (param2 == 1)
- {
- db_bg3cnt_0 = db_bg3cnt_0 & 0xFFFFE0FF | ((u32)(param3 << 0x1b) >> 0x13);
- }
- else if (param2 == 2)
- {
- db_bg3cnt_0 = db_bg3cnt_0 & ~0x3c | ((u32)(param3 << 0x1c) >> 0x1a);
- }
-
- reg_G2S_DB_BG3CNT =
- (reg_G2S_DB_BG3CNT & 0x43) | ((u32)(db_bg3cnt_0 << 0x10) >> 0x1e) << 0xe |
- param0->unk08[param1].unk1e << 7 | ((u32)(db_bg3cnt_0 << 0x13) >> 0x1b) << 8 |
- ((u32)(db_bg3cnt_0 << 0x1a) >> 0x1c) << 2;
-
- break;
- case 1:
- u16 db_bg3cnt_1 = reg_G2S_DB_BG3CNT;
- if (param2 == 1)
- {
- db_bg3cnt_1 = db_bg3cnt_1 & 0xFFFFE0FF | ((u32)(param3 << 0x1b) >> 0x13);
- }
- else if (param2 == 2)
- {
- db_bg3cnt_1 = db_bg3cnt_1 & ~0x3c | ((u32)(param3 << 0x1c) >> 0x1a);
- }
-
- reg_G2S_DB_BG3CNT = (reg_G2S_DB_BG3CNT & 0x43) |
- ((u32)(db_bg3cnt_1 << 0x10) >> 0x1e) << 0xe |
- ((u32)(db_bg3cnt_1 << 0x13) >> 0x1b) << 8 |
- ((u32)(db_bg3cnt_1 << 0x1a) >> 0x1c) << 2 |
- ((u32)(db_bg3cnt_1 << 0x12) >> 0x1f) << 0xd;
- break;
- case 2:
- u16 db_bg3cnt_2 = reg_G2S_DB_BG3CNT;
- if (param2 == 1)
- {
- db_bg3cnt_2 = db_bg3cnt_2 & 0xFFFFE0FF | ((u32)(param3 << 0x1b) >> 0x13);
- }
- else if (param2 == 2)
- {
- db_bg3cnt_2 = db_bg3cnt_2 & ~0x38 | ((u32)(param3 << 0x1d) >> 0x1a);
- }
-
- reg_G2S_DB_BG3CNT = (reg_G2S_DB_BG3CNT & 0x43) |
- ((u32)(db_bg3cnt_2 << 0x10) >> 0x1e) << 0xe |
- ((u32)(db_bg3cnt_2 << 0x13) >> 0x1b) << 8 |
- ((u32)(db_bg3cnt_2 << 0x1a) >> 0x1d) << 2 |
- ((u32)(db_bg3cnt_2 << 0x12) >> 0x1f) << 0xd;
- break;
- }
- break;
- }
-}
-#else
-THUMB_FUNC asm void FUN_020170F4(
- struct UnkStruct_02016B94_2 *param0, u8 param1, u32 param2, u8 param3)
-{
- // clang-format off
- push {r3-r7, lr}
- sub sp, #0x20
- add r4, r1, #0x0
- add r5, r0, #0x0
- add r1, r2, #0x0
- add r0, r3, #0x0
- cmp r1, #0x0
- bne _0201710C
- mov r2, #0x2c
- mul r2, r4
- add r2, r5, r2
- strb r0, [r2, #0x1e]
-_0201710C:
- cmp r4, #0x7
- bls _02017112
- b _020177C4
-_02017112:
- add r2, r4, r4
- add r2, pc
- ldrh r2, [r2, #0x6]
- lsl r2, r2, #0x10
- asr r2, r2, #0x10
- add pc, r2
-_0201711E: //; jump table (using 16-bit offset)
- // .short _0201712E - _0201711E - 2; case 0
- // .short _0201719A - _0201711E - 2; case 1
- // .short _02017206 - _0201711E - 2; case 2
- // .short _0201733A - _0201711E - 2; case 3
- // .short _0201746E - _0201711E - 2; case 4
- // .short _020174F4 - _0201711E - 2; case 5
- // .short _02017560 - _0201711E - 2; case 6
- // .short _02017694 - _0201711E - 2; case 7
-
- lsl r6, r1, #0
- lsl r2, r7, #1
- lsl r6, r4, #3
- lsl r2, r3, #8
- lsl r6, r1, #13
- lsl r4, r2, #15
- lsl r0, r0, #17
- lsl r4, r6, #21
-_0201712E:
- ldr r2, =0x04000008
- cmp r1, #0x1
- ldrh r3, [r2, #0x0]
- add r2, sp, #0x0
- strh r3, [r2, #0x1e]
- bne _0201714A
- ldrh r3, [r2, #0x1e]
- ldr r1, =0xFFFFE0FF
- lsl r0, r0, #0x1b
- and r1, r3
- lsr r0, r0, #0x13
- orr r0, r1
- strh r0, [r2, #0x1e]
- b _0201715C
-_0201714A:
- cmp r1, #0x2
- bne _0201715C
- ldrh r3, [r2, #0x1e]
- mov r1, #0x3c
- lsl r0, r0, #0x1c
- bic r3, r1
- lsr r0, r0, #0x1a
- orr r0, r3
- strh r0, [r2, #0x1e]
-_0201715C:
- add r0, sp, #0x0
- ldrh r3, [r0, #0x1e]
- add sp, #0x20
- lsl r0, r3, #0x12
- lsr r6, r0, #0x1f
- lsl r0, r3, #0x1a
- lsr r2, r0, #0x1c
- lsl r0, r3, #0x13
- lsr r1, r0, #0x1b
- mov r0, #0x2c
- mul r0, r4
- add r0, r5, r0
- lsl r3, r3, #0x10
- lsr r5, r3, #0x1e
- lsl r3, r2, #0x2
- ldrb r0, [r0, #0x1e]
- lsl r2, r1, #0x8
- lsl r4, r6, #0xd
- lsl r1, r0, #0x7
- ldr r0, =0x04000008
- mov r6, #0x43
- ldrh r7, [r0, #0x0]
- lsl r5, r5, #0xe
- and r6, r7
- orr r5, r6
- orr r1, r5
- orr r1, r2
- orr r1, r3
- orr r1, r4
- strh r1, [r0, #0x0]
- pop {r3-r7, pc}
-_0201719A:
- ldr r2, =0x0400000A
- cmp r1, #0x1
- ldrh r3, [r2, #0x0]
- add r2, sp, #0x0
- strh r3, [r2, #0x1c]
- bne _020171B6
- ldrh r3, [r2, #0x1c]
- ldr r1, =0xFFFFE0FF
- lsl r0, r0, #0x1b
- and r1, r3
- lsr r0, r0, #0x13
- orr r0, r1
- strh r0, [r2, #0x1c]
- b _020171C8
-_020171B6:
- cmp r1, #0x2
- bne _020171C8
- ldrh r3, [r2, #0x1c]
- mov r1, #0x3c
- lsl r0, r0, #0x1c
- bic r3, r1
- lsr r0, r0, #0x1a
- orr r0, r3
- strh r0, [r2, #0x1c]
-_020171C8:
- add r0, sp, #0x0
- ldrh r3, [r0, #0x1c]
- add sp, #0x20
- lsl r0, r3, #0x12
- lsr r6, r0, #0x1f
- lsl r0, r3, #0x1a
- lsr r2, r0, #0x1c
- lsl r0, r3, #0x13
- lsr r1, r0, #0x1b
- mov r0, #0x2c
- mul r0, r4
- add r0, r5, r0
- lsl r3, r3, #0x10
- lsr r5, r3, #0x1e
- lsl r3, r2, #0x2
- ldrb r0, [r0, #0x1e]
- lsl r2, r1, #0x8
- lsl r4, r6, #0xd
- lsl r1, r0, #0x7
- ldr r0, =0x0400000A
- mov r6, #0x43
- ldrh r7, [r0, #0x0]
- lsl r5, r5, #0xe
- and r6, r7
- orr r5, r6
- orr r1, r5
- orr r1, r2
- orr r1, r3
- orr r1, r4
- strh r1, [r0, #0x0]
- pop {r3-r7, pc}
-_02017206:
- mov r2, #0x2c
- mul r2, r4
- add r3, r5, r2
- ldrb r3, [r3, #0x1c]
- cmp r3, #0x0
- beq _0201721A
- cmp r3, #0x1
- beq _0201727A
- cmp r3, #0x2
- beq _020172DA
-_0201721A:
- ldr r3, =0x0400000C
- cmp r1, #0x1
- ldrh r4, [r3, #0x0]
- add r3, sp, #0x0
- strh r4, [r3, #0x1a]
- bne _02017236
- ldrh r4, [r3, #0x1a]
- ldr r1, =0xFFFFE0FF
- lsl r0, r0, #0x1b
- and r1, r4
- lsr r0, r0, #0x13
- orr r0, r1
- strh r0, [r3, #0x1a]
- b _02017248
-_02017236:
- cmp r1, #0x2
- bne _02017248
- ldrh r4, [r3, #0x1a]
- mov r1, #0x3c
- lsl r0, r0, #0x1c
- bic r4, r1
- lsr r0, r0, #0x1a
- orr r0, r4
- strh r0, [r3, #0x1a]
-_02017248:
- add r0, sp, #0x0
- ldrh r3, [r0, #0x1a]
- add r2, r5, r2
- ldr r6, =0x0400000C
- lsl r0, r3, #0x1a
- ldrb r4, [r2, #0x1e]
- lsr r1, r0, #0x1c
- lsl r0, r3, #0x13
- lsl r2, r3, #0x10
- lsr r3, r2, #0x1e
- ldrh r5, [r6, #0x0]
- lsr r0, r0, #0x1b
- lsl r2, r1, #0x2
- lsl r1, r0, #0x8
- lsl r0, r4, #0x7
- mov r4, #0x43
- and r4, r5
- lsl r3, r3, #0xe
- orr r3, r4
- orr r0, r3
- orr r0, r1
- orr r0, r2
- add sp, #0x20
- strh r0, [r6, #0x0]
- pop {r3-r7, pc}
-_0201727A:
- ldr r2, =0x0400000C
- cmp r1, #0x1
- ldrh r3, [r2, #0x0]
- add r2, sp, #0x0
- strh r3, [r2, #0x18]
- bne _02017296
- ldrh r3, [r2, #0x18]
- ldr r1, =0xFFFFE0FF
- lsl r0, r0, #0x1b
- and r1, r3
- lsr r0, r0, #0x13
- orr r0, r1
- strh r0, [r2, #0x18]
- b _020172A8
-_02017296:
- cmp r1, #0x2
- bne _020172A8
- ldrh r3, [r2, #0x18]
- mov r1, #0x3c
- lsl r0, r0, #0x1c
- bic r3, r1
- lsr r0, r0, #0x1a
- orr r0, r3
- strh r0, [r2, #0x18]
-_020172A8:
- add r0, sp, #0x0
- ldrh r3, [r0, #0x18]
- ldr r6, =0x0400000C
- add sp, #0x20
- lsl r1, r3, #0x13
- lsl r0, r3, #0x1a
- lsr r4, r1, #0x1b
- lsl r1, r3, #0x12
- lsr r2, r1, #0x1f
- lsl r1, r3, #0x10
- lsr r3, r1, #0x1e
- lsr r0, r0, #0x1c
- lsl r1, r0, #0x2
- lsl r0, r4, #0x8
- ldrh r5, [r6, #0x0]
- mov r4, #0x43
- lsl r3, r3, #0xe
- and r4, r5
- orr r3, r4
- orr r0, r3
- lsl r2, r2, #0xd
- orr r0, r1
- orr r0, r2
- strh r0, [r6, #0x0]
- pop {r3-r7, pc}
-_020172DA:
- ldr r2, =0x0400000C
- cmp r1, #0x1
- ldrh r3, [r2, #0x0]
- add r2, sp, #0x0
- strh r3, [r2, #0x16]
- bne _020172F6
- ldrh r3, [r2, #0x16]
- ldr r1, =0xFFFFE0FF
- lsl r0, r0, #0x1b
- and r1, r3
- lsr r0, r0, #0x13
- orr r0, r1
- strh r0, [r2, #0x16]
- b _02017308
-_020172F6:
- cmp r1, #0x2
- bne _02017308
- ldrh r3, [r2, #0x16]
- mov r1, #0x38
- lsl r0, r0, #0x1d
- bic r3, r1
- lsr r0, r0, #0x1a
- orr r0, r3
- strh r0, [r2, #0x16]
-_02017308:
- add r0, sp, #0x0
- ldrh r3, [r0, #0x16]
- ldr r6, =0x0400000C
- add sp, #0x20
- lsl r1, r3, #0x13
- lsr r4, r1, #0x1b
- lsl r1, r3, #0x12
- lsr r2, r1, #0x1f
- lsl r0, r3, #0x1a
- lsl r1, r3, #0x10
- lsr r3, r1, #0x1e
- lsl r1, r4, #0x8
- lsr r0, r0, #0x1d
- ldrh r5, [r6, #0x0]
- mov r4, #0x43
- lsl r3, r3, #0xe
- and r4, r5
- lsl r0, r0, #0x2
- orr r3, r4
- orr r0, r3
- lsl r2, r2, #0xd
- orr r0, r1
- orr r0, r2
- strh r0, [r6, #0x0]
- pop {r3-r7, pc}
-_0201733A:
- mov r2, #0x2c
- mul r2, r4
- add r3, r5, r2
- ldrb r3, [r3, #0x1c]
- cmp r3, #0x0
- beq _0201734E
- cmp r3, #0x1
- beq _020173AE
- cmp r3, #0x2
- beq _0201740E
-_0201734E:
- ldr r3, =0x0400000E
- cmp r1, #0x1
- ldrh r4, [r3, #0x0]
- add r3, sp, #0x0
- strh r4, [r3, #0x14]
- bne _0201736A
- ldrh r4, [r3, #0x14]
- ldr r1, =0xFFFFE0FF
- lsl r0, r0, #0x1b
- and r1, r4
- lsr r0, r0, #0x13
- orr r0, r1
- strh r0, [r3, #0x14]
- b _0201737C
-_0201736A:
- cmp r1, #0x2
- bne _0201737C
- ldrh r4, [r3, #0x14]
- mov r1, #0x3c
- lsl r0, r0, #0x1c
- bic r4, r1
- lsr r0, r0, #0x1a
- orr r0, r4
- strh r0, [r3, #0x14]
-_0201737C:
- add r0, sp, #0x0
- ldrh r3, [r0, #0x14]
- add r2, r5, r2
- ldr r6, =0x0400000E
- lsl r0, r3, #0x1a
- ldrb r4, [r2, #0x1e]
- lsr r1, r0, #0x1c
- lsl r0, r3, #0x13
- lsl r2, r3, #0x10
- lsr r3, r2, #0x1e
- ldrh r5, [r6, #0x0]
- lsr r0, r0, #0x1b
- lsl r2, r1, #0x2
- lsl r1, r0, #0x8
- lsl r0, r4, #0x7
- mov r4, #0x43
- and r4, r5
- lsl r3, r3, #0xe
- orr r3, r4
- orr r0, r3
- orr r0, r1
- orr r0, r2
- add sp, #0x20
- strh r0, [r6, #0x0]
- pop {r3-r7, pc}
-_020173AE:
- ldr r2, =0x0400000E
- cmp r1, #0x1
- ldrh r3, [r2, #0x0]
- add r2, sp, #0x0
- strh r3, [r2, #0x12]
- bne _020173CA
- ldrh r3, [r2, #0x12]
- ldr r1, =0xFFFFE0FF
- lsl r0, r0, #0x1b
- and r1, r3
- lsr r0, r0, #0x13
- orr r0, r1
- strh r0, [r2, #0x12]
- b _020173DC
-_020173CA:
- cmp r1, #0x2
- bne _020173DC
- ldrh r3, [r2, #0x12]
- mov r1, #0x3c
- lsl r0, r0, #0x1c
- bic r3, r1
- lsr r0, r0, #0x1a
- orr r0, r3
- strh r0, [r2, #0x12]
-_020173DC:
- add r0, sp, #0x0
- ldrh r3, [r0, #0x12]
- ldr r6, =0x0400000E
- add sp, #0x20
- lsl r1, r3, #0x13
- lsl r0, r3, #0x1a
- lsr r4, r1, #0x1b
- lsl r1, r3, #0x12
- lsr r2, r1, #0x1f
- lsl r1, r3, #0x10
- lsr r3, r1, #0x1e
- lsr r0, r0, #0x1c
- lsl r1, r0, #0x2
- lsl r0, r4, #0x8
- ldrh r5, [r6, #0x0]
- mov r4, #0x43
- lsl r3, r3, #0xe
- and r4, r5
- orr r3, r4
- orr r0, r3
- lsl r2, r2, #0xd
- orr r0, r1
- orr r0, r2
- strh r0, [r6, #0x0]
- pop {r3-r7, pc}
-_0201740E:
- ldr r2, =0x0400000E
- cmp r1, #0x1
- ldrh r3, [r2, #0x0]
- add r2, sp, #0x0
- strh r3, [r2, #0x10]
- bne _0201742A
- ldrh r3, [r2, #0x10]
- ldr r1, =0xFFFFE0FF
- lsl r0, r0, #0x1b
- and r1, r3
- lsr r0, r0, #0x13
- orr r0, r1
- strh r0, [r2, #0x10]
- b _0201743C
-_0201742A:
- cmp r1, #0x2
- bne _0201743C
- ldrh r3, [r2, #0x10]
- mov r1, #0x38
- lsl r0, r0, #0x1d
- bic r3, r1
- lsr r0, r0, #0x1a
- orr r0, r3
- strh r0, [r2, #0x10]
-_0201743C:
- add r0, sp, #0x0
- ldrh r3, [r0, #0x10]
- ldr r6, =0x0400000E
- add sp, #0x20
- lsl r1, r3, #0x13
- lsr r4, r1, #0x1b
- lsl r1, r3, #0x12
- lsr r2, r1, #0x1f
- lsl r0, r3, #0x1a
- lsl r1, r3, #0x10
- lsr r3, r1, #0x1e
- lsl r1, r4, #0x8
- lsr r0, r0, #0x1d
- ldrh r5, [r6, #0x0]
- mov r4, #0x43
- lsl r3, r3, #0xe
- and r4, r5
- lsl r0, r0, #0x2
- orr r3, r4
- orr r0, r3
- lsl r2, r2, #0xd
- orr r0, r1
- orr r0, r2
- strh r0, [r6, #0x0]
- pop {r3-r7, pc}
-_0201746E:
- ldr r2, =0x04001008
- cmp r1, #0x1
- ldrh r3, [r2, #0x0]
- add r2, sp, #0x0
- strh r3, [r2, #0xe]
- bne _020174A4
- ldrh r3, [r2, #0xe]
- ldr r1, =0xFFFFE0FF
- b _02017498
-_02017498:
- lsl r0, r0, #0x1b
- and r1, r3
- lsr r0, r0, #0x13
- orr r0, r1
- strh r0, [r2, #0xe]
- b _020174B6
-_020174A4:
- cmp r1, #0x2
- bne _020174B6
- ldrh r3, [r2, #0xe]
- mov r1, #0x3c
- lsl r0, r0, #0x1c
- bic r3, r1
- lsr r0, r0, #0x1a
- orr r0, r3
- strh r0, [r2, #0xe]
-_020174B6:
- add r0, sp, #0x0
- ldrh r3, [r0, #0xe]
- add sp, #0x20
- lsl r0, r3, #0x12
- lsr r6, r0, #0x1f
- lsl r0, r3, #0x1a
- lsr r2, r0, #0x1c
- lsl r0, r3, #0x13
- lsr r1, r0, #0x1b
- mov r0, #0x2c
- mul r0, r4
- add r0, r5, r0
- lsl r3, r3, #0x10
- lsr r5, r3, #0x1e
- lsl r3, r2, #0x2
- ldrb r0, [r0, #0x1e]
- lsl r2, r1, #0x8
- lsl r4, r6, #0xd
- lsl r1, r0, #0x7
- ldr r0, =0x04001008
- mov r6, #0x43
- ldrh r7, [r0, #0x0]
- lsl r5, r5, #0xe
- and r6, r7
- orr r5, r6
- orr r1, r5
- orr r1, r2
- orr r1, r3
- orr r1, r4
- strh r1, [r0, #0x0]
- pop {r3-r7, pc}
-_020174F4:
- ldr r2, =0x0400100A
- cmp r1, #0x1
- ldrh r3, [r2, #0x0]
- add r2, sp, #0x0
- strh r3, [r2, #0xc]
- bne _02017510
- ldrh r3, [r2, #0xc]
- ldr r1, =0xFFFFE0FF
- lsl r0, r0, #0x1b
- and r1, r3
- lsr r0, r0, #0x13
- orr r0, r1
- strh r0, [r2, #0xc]
- b _02017522
-_02017510:
- cmp r1, #0x2
- bne _02017522
- ldrh r3, [r2, #0xc]
- mov r1, #0x3c
- lsl r0, r0, #0x1c
- bic r3, r1
- lsr r0, r0, #0x1a
- orr r0, r3
- strh r0, [r2, #0xc]
-_02017522:
- add r0, sp, #0x0
- ldrh r3, [r0, #0xc]
- add sp, #0x20
- lsl r0, r3, #0x12
- lsr r6, r0, #0x1f
- lsl r0, r3, #0x1a
- lsr r2, r0, #0x1c
- lsl r0, r3, #0x13
- lsr r1, r0, #0x1b
- mov r0, #0x2c
- mul r0, r4
- add r0, r5, r0
- lsl r3, r3, #0x10
- lsr r5, r3, #0x1e
- lsl r3, r2, #0x2
- ldrb r0, [r0, #0x1e]
- lsl r2, r1, #0x8
- lsl r4, r6, #0xd
- lsl r1, r0, #0x7
- ldr r0, =0x0400100A
- mov r6, #0x43
- ldrh r7, [r0, #0x0]
- lsl r5, r5, #0xe
- and r6, r7
- orr r5, r6
- orr r1, r5
- orr r1, r2
- orr r1, r3
- orr r1, r4
- strh r1, [r0, #0x0]
- pop {r3-r7, pc}
-_02017560:
- mov r2, #0x2c
- mul r2, r4
- add r3, r5, r2
- ldrb r3, [r3, #0x1c]
- cmp r3, #0x0
- beq _02017574
- cmp r3, #0x1
- beq _020175D4
- cmp r3, #0x2
- beq _02017634
-_02017574:
- ldr r3, =0x0400100C
- cmp r1, #0x1
- ldrh r4, [r3, #0x0]
- add r3, sp, #0x0
- strh r4, [r3, #0xa]
- bne _02017590
- ldrh r4, [r3, #0xa]
- ldr r1, =0xFFFFE0FF
- lsl r0, r0, #0x1b
- and r1, r4
- lsr r0, r0, #0x13
- orr r0, r1
- strh r0, [r3, #0xa]
- b _020175A2
-_02017590:
- cmp r1, #0x2
- bne _020175A2
- ldrh r4, [r3, #0xa]
- mov r1, #0x3c
- lsl r0, r0, #0x1c
- bic r4, r1
- lsr r0, r0, #0x1a
- orr r0, r4
- strh r0, [r3, #0xa]
-_020175A2:
- add r0, sp, #0x0
- ldrh r3, [r0, #0xa]
- add r2, r5, r2
- ldr r6, =0x0400100C
- lsl r0, r3, #0x1a
- ldrb r4, [r2, #0x1e]
- lsr r1, r0, #0x1c
- lsl r0, r3, #0x13
- lsl r2, r3, #0x10
- lsr r3, r2, #0x1e
- ldrh r5, [r6, #0x0]
- lsr r0, r0, #0x1b
- lsl r2, r1, #0x2
- lsl r1, r0, #0x8
- lsl r0, r4, #0x7
- mov r4, #0x43
- and r4, r5
- lsl r3, r3, #0xe
- orr r3, r4
- orr r0, r3
- orr r0, r1
- orr r0, r2
- add sp, #0x20
- strh r0, [r6, #0x0]
- pop {r3-r7, pc}
-_020175D4:
- ldr r2, =0x0400100C
- cmp r1, #0x1
- ldrh r3, [r2, #0x0]
- add r2, sp, #0x0
- strh r3, [r2, #0x8]
- bne _020175F0
- ldrh r3, [r2, #0x8]
- ldr r1, =0xFFFFE0FF
- lsl r0, r0, #0x1b
- and r1, r3
- lsr r0, r0, #0x13
- orr r0, r1
- strh r0, [r2, #0x8]
- b _02017602
-_020175F0:
- cmp r1, #0x2
- bne _02017602
- ldrh r3, [r2, #0x8]
- mov r1, #0x3c
- lsl r0, r0, #0x1c
- bic r3, r1
- lsr r0, r0, #0x1a
- orr r0, r3
- strh r0, [r2, #0x8]
-_02017602:
- add r0, sp, #0x0
- ldrh r3, [r0, #0x8]
- ldr r6, =0x0400100C
- add sp, #0x20
- lsl r1, r3, #0x13
- lsl r0, r3, #0x1a
- lsr r4, r1, #0x1b
- lsl r1, r3, #0x12
- lsr r2, r1, #0x1f
- lsl r1, r3, #0x10
- lsr r3, r1, #0x1e
- lsr r0, r0, #0x1c
- lsl r1, r0, #0x2
- lsl r0, r4, #0x8
- ldrh r5, [r6, #0x0]
- mov r4, #0x43
- lsl r3, r3, #0xe
- and r4, r5
- orr r3, r4
- orr r0, r3
- lsl r2, r2, #0xd
- orr r0, r1
- orr r0, r2
- strh r0, [r6, #0x0]
- pop {r3-r7, pc}
-_02017634:
- ldr r2, =0x0400100C
- cmp r1, #0x1
- ldrh r3, [r2, #0x0]
- add r2, sp, #0x0
- strh r3, [r2, #0x6]
- bne _02017650
- ldrh r3, [r2, #0x6]
- ldr r1, =0xFFFFE0FF
- lsl r0, r0, #0x1b
- and r1, r3
- lsr r0, r0, #0x13
- orr r0, r1
- strh r0, [r2, #0x6]
- b _02017662
-_02017650:
- cmp r1, #0x2
- bne _02017662
- ldrh r3, [r2, #0x6]
- mov r1, #0x38
- lsl r0, r0, #0x1d
- bic r3, r1
- lsr r0, r0, #0x1a
- orr r0, r3
- strh r0, [r2, #0x6]
-_02017662:
- add r0, sp, #0x0
- ldrh r3, [r0, #0x6]
- ldr r6, =0x0400100C
- add sp, #0x20
- lsl r1, r3, #0x13
- lsr r4, r1, #0x1b
- lsl r1, r3, #0x12
- lsr r2, r1, #0x1f
- lsl r0, r3, #0x1a
- lsl r1, r3, #0x10
- lsr r3, r1, #0x1e
- lsl r1, r4, #0x8
- lsr r0, r0, #0x1d
- ldrh r5, [r6, #0x0]
- mov r4, #0x43
- lsl r3, r3, #0xe
- and r4, r5
- lsl r0, r0, #0x2
- orr r3, r4
- orr r0, r3
- lsl r2, r2, #0xd
- orr r0, r1
- orr r0, r2
- strh r0, [r6, #0x0]
- pop {r3-r7, pc}
-_02017694:
- mov r2, #0x2c
- mul r2, r4
- add r3, r5, r2
- ldrb r3, [r3, #0x1c]
- cmp r3, #0x0
- beq _020176A8
- cmp r3, #0x1
- beq _02017708
- cmp r3, #0x2
- beq _02017768
-_020176A8:
- ldr r3, =0x0400100E
- cmp r1, #0x1
- ldrh r4, [r3, #0x0]
- add r3, sp, #0x0
- strh r4, [r3, #0x4]
- bne _020176C4
- ldrh r4, [r3, #0x4]
- ldr r1, =0xFFFFE0FF
- lsl r0, r0, #0x1b
- and r1, r4
- lsr r0, r0, #0x13
- orr r0, r1
- strh r0, [r3, #0x4]
- b _020176D6
-_020176C4:
- cmp r1, #0x2
- bne _020176D6
- ldrh r4, [r3, #0x4]
- mov r1, #0x3c
- lsl r0, r0, #0x1c
- bic r4, r1
- lsr r0, r0, #0x1a
- orr r0, r4
- strh r0, [r3, #0x4]
-_020176D6:
- add r0, sp, #0x0
- ldrh r3, [r0, #0x4]
- add r2, r5, r2
- ldr r6, =0x0400100E
- lsl r0, r3, #0x1a
- ldrb r4, [r2, #0x1e]
- lsr r1, r0, #0x1c
- lsl r0, r3, #0x13
- lsl r2, r3, #0x10
- lsr r3, r2, #0x1e
- ldrh r5, [r6, #0x0]
- lsr r0, r0, #0x1b
- lsl r2, r1, #0x2
- lsl r1, r0, #0x8
- lsl r0, r4, #0x7
- mov r4, #0x43
- and r4, r5
- lsl r3, r3, #0xe
- orr r3, r4
- orr r0, r3
- orr r0, r1
- orr r0, r2
- add sp, #0x20
- strh r0, [r6, #0x0]
- pop {r3-r7, pc}
-_02017708:
- ldr r2, =0x0400100E
- cmp r1, #0x1
- ldrh r3, [r2, #0x0]
- add r2, sp, #0x0
- strh r3, [r2, #0x2]
- bne _02017724
- ldrh r3, [r2, #0x2]
- ldr r1, =0xFFFFE0FF
- lsl r0, r0, #0x1b
- and r1, r3
- lsr r0, r0, #0x13
- orr r0, r1
- strh r0, [r2, #0x2]
- b _02017736
-_02017724:
- cmp r1, #0x2
- bne _02017736
- ldrh r3, [r2, #0x2]
- mov r1, #0x3c
- lsl r0, r0, #0x1c
- bic r3, r1
- lsr r0, r0, #0x1a
- orr r0, r3
- strh r0, [r2, #0x2]
-_02017736:
- add r0, sp, #0x0
- ldrh r3, [r0, #0x2]
- ldr r6, =0x0400100E
- add sp, #0x20
- lsl r1, r3, #0x13
- lsl r0, r3, #0x1a
- lsr r4, r1, #0x1b
- lsl r1, r3, #0x12
- lsr r2, r1, #0x1f
- lsl r1, r3, #0x10
- lsr r3, r1, #0x1e
- lsr r0, r0, #0x1c
- lsl r1, r0, #0x2
- lsl r0, r4, #0x8
- ldrh r5, [r6, #0x0]
- mov r4, #0x43
- lsl r3, r3, #0xe
- and r4, r5
- orr r3, r4
- orr r0, r3
- lsl r2, r2, #0xd
- orr r0, r1
- orr r0, r2
- strh r0, [r6, #0x0]
- pop {r3-r7, pc}
-_02017768:
- ldr r2, =0x0400100E
- cmp r1, #0x1
- ldrh r3, [r2, #0x0]
- add r2, sp, #0x0
- strh r3, [r2, #0x0]
- bne _02017784
- ldrh r3, [r2, #0x0]
- ldr r1, =0xFFFFE0FF
- lsl r0, r0, #0x1b
- and r1, r3
- lsr r0, r0, #0x13
- orr r0, r1
- strh r0, [r2, #0x0]
- b _02017796
-_02017784:
- cmp r1, #0x2
- bne _02017796
- ldrh r3, [r2, #0x0]
- mov r1, #0x38
- lsl r0, r0, #0x1d
- bic r3, r1
- lsr r0, r0, #0x1a
- orr r0, r3
- strh r0, [r2, #0x0]
-_02017796:
- add r0, sp, #0x0
- ldrh r3, [r0, #0x0]
- ldr r6, =0x0400100E
- lsl r1, r3, #0x13
- lsr r4, r1, #0x1b
- lsl r1, r3, #0x12
- lsr r2, r1, #0x1f
- lsl r0, r3, #0x1a
- lsl r1, r3, #0x10
- lsr r3, r1, #0x1e
- lsl r1, r4, #0x8
- lsr r0, r0, #0x1d
- ldrh r5, [r6, #0x0]
- mov r4, #0x43
- lsl r3, r3, #0xe
- and r4, r5
- lsl r0, r0, #0x2
- orr r3, r4
- orr r0, r3
- lsl r2, r2, #0xd
- orr r0, r1
- orr r0, r2
- strh r0, [r6, #0x0]
-_020177C4:
- add sp, #0x20
- pop {r3-r7, pc}
- // clang-format on
-}
-#endif
-
-THUMB_FUNC u8 FUN_020177DC(u8 param0, u32 param1)
-{
- switch (param1)
- {
- case 0:
-
- if (param0 == 1)
- {
- return 0;
- }
- else if (param0 == 2)
- {
- return 2;
- }
- else if (param0 == 3)
- {
- return 1;
- }
- else if (param0 == 4)
- {
- return 3;
- }
- break;
-
- case 1:
-
- if (param0 == 0)
- {
- return 0;
- }
- else if (param0 == 1)
- {
- return 1;
- }
- else if (param0 == 4)
- {
- return 2;
- }
- else if (param0 == 5)
- {
- return 3;
- }
- break;
-
- case 2:
-
- if (param0 == 0)
- {
- return 0;
- }
- else if (param0 == 1)
- {
- return 1;
- }
- else if (param0 == 4)
- {
- return 2;
- }
- else if (param0 == 5)
- {
- return 3;
- }
- break;
- }
-
- return 0;
-}
-
-THUMB_FUNC void FUN_02017850(u32 param0, u8 *param1, u8 *param2)
-{
- switch (param0)
- {
- case 0:
- *param1 = 0x10;
- *param2 = 0x10;
- break;
- case 1:
- *param1 = 0x20;
- *param2 = 0x20;
- break;
- case 2:
- *param1 = 0x20;
- *param2 = 0x40;
- break;
- case 3:
- *param1 = 0x40;
- *param2 = 0x20;
- break;
- case 4:
- *param1 = 0x40;
- *param2 = 0x40;
- break;
- case 5:
- *param1 = 0x80;
- *param2 = 0x80;
- break;
- }
-}
-
-THUMB_FUNC void FUN_020178A0(struct UnkStruct_02016B94_2 *param0, u32 param1)
-{
- if (param0->unk08[param1].unk08 != NULL)
- {
- FreeToHeap(param0->unk08[param1].unk08);
- param0->unk08[param1].unk08 = NULL;
- }
-}
-
-THUMB_FUNC void FUN_020178BC(u32 param0, u16 param1)
-{
- switch (param0)
- {
- case 0:
- reg_G2_BG0CNT = (u16)(reg_G2_BG0CNT & ~3 | param1);
- break;
- case 1:
- reg_G2_BG1CNT = (u16)(reg_G2_BG1CNT & ~3 | param1);
- break;
- case 2:
- reg_G2_BG2CNT = (u16)(reg_G2_BG2CNT & ~3 | param1);
- break;
- case 3:
- reg_G2_BG3CNT = (u16)(reg_G2_BG3CNT & ~3 | param1);
- break;
- case 4:
- reg_G2S_DB_BG0CNT = (u16)(reg_G2S_DB_BG0CNT & ~3 | param1);
- break;
- case 5:
- reg_G2S_DB_BG1CNT = (u16)(reg_G2S_DB_BG1CNT & ~3 | param1);
- break;
- case 6:
- reg_G2S_DB_BG2CNT = (u16)(reg_G2S_DB_BG2CNT & ~3 | param1);
- break;
- case 7:
- reg_G2S_DB_BG3CNT = (u16)(reg_G2S_DB_BG3CNT & ~3 | param1);
- break;
- }
-}
-
-THUMB_FUNC void FUN_0201797C(u32 param0, GX_LayerToggle toggle)
-{
- switch (param0)
- {
- case 0:
- GX_EngineAToggleLayers(1, toggle);
- break;
- case 1:
- GX_EngineAToggleLayers(2, toggle);
- break;
- case 2:
- GX_EngineAToggleLayers(4, toggle);
- break;
- case 3:
- GX_EngineAToggleLayers(8, toggle);
- break;
- case 4:
- GX_EngineBToggleLayers(1, toggle);
- break;
- case 5:
- GX_EngineBToggleLayers(2, toggle);
- break;
- case 6:
- GX_EngineBToggleLayers(4, toggle);
- break;
- case 7:
- GX_EngineBToggleLayers(8, toggle);
- break;
- }
-}
-
-THUMB_FUNC void FUN_020179E0(struct UnkStruct_02016B94_2 *param0, u32 param1, u32 param2, fx32 val)
-{
- FUN_02017B8C(&param0->unk08[param1], param2, val);
-
- u32 r1 = (u32)param0->unk08[param1].unk14;
- u32 r0 = (u32)param0->unk08[param1].unk18;
- switch (param1)
- {
- case 0:
-
- reg_G2_BG0OFS = (r1 & 0x1FF) | ((r0 << 16) & 0x1FF0000);
- break;
- case 1:
-
- reg_G2_BG1OFS = (r1 & 0x1FF) | ((r0 << 16) & 0x1FF0000);
- break;
-
- case 2:
- if (param0->unk08[2].unk1c == 0)
- {
- reg_G2_BG2OFS = (r1 & 0x1FF) | ((r0 << 16) & 0x1FF0000);
- }
- else
- {
- FUN_02017C6C(param0, 2);
- }
-
- break;
-
- case 3:
- if (param0->unk08[3].unk1c == 0)
- {
- reg_G2_BG3OFS = (r1 & 0x1FF) | ((r0 << 16) & 0x1FF0000);
- }
- else
- {
- FUN_02017C6C(param0, 3);
- }
-
- break;
-
- case 4:
-
- reg_G2S_DB_BG0OFS = (r1 & 0x1FF) | ((r0 << 16) & 0x1FF0000);
- break;
- case 5:
-
- reg_G2S_DB_BG1OFS = (r1 & 0x1FF) | ((r0 << 16) & 0x1FF0000);
- break;
-
- case 6:
- if (param0->unk08[6].unk1c == 0)
- {
- reg_G2S_DB_BG2OFS = (r1 & 0x1FF) | ((r0 << 16) & 0x1FF0000);
- }
- else
- {
- FUN_02017C6C(param0, 6);
- }
-
- break;
-
- case 7:
- if (param0->unk08[7].unk1c == 0)
- {
- reg_G2S_DB_BG3OFS = (r1 & 0x1FF) | ((r0 << 16) & 0x1FF0000);
- }
- else
- {
- FUN_02017C6C(param0, 7);
- }
-
- break;
- }
-}
-
-THUMB_FUNC fx32 FUN_02017B48(struct UnkStruct_02016B94_2 *param0, u32 param1)
-{
- return param0->unk08[param1].unk14;
-}
-
-THUMB_FUNC fx32 FUN_02017B54(struct UnkStruct_02016B94_2 *param0, u32 param1)
-{
- return param0->unk08[param1].unk18;
-}
-
-THUMB_FUNC void FUN_02017B60(struct UnkStruct_02016B94_2 *param0,
- u32 param1,
- u32 param2,
- fx32 param3,
- struct Mtx22 *param4,
- fx32 param5,
- fx32 param6)
-{
- FUN_02017B8C(&param0->unk08[param1], param2, param3);
- FUN_02017BD0(param0, param1, param4, param5, param6);
-}
-
-THUMB_FUNC void FUN_02017B8C(struct UnkStruct_02016B94_2_sub *param0, u32 param1, fx32 val)
-{
- switch (param1)
- {
- case 0:
- param0->unk14 = val;
- break;
- case 1:
- param0->unk14 += val;
- break;
- case 2:
- param0->unk14 -= val;
- break;
- case 3:
- param0->unk18 = val;
- break;
- case 4:
- param0->unk18 += val;
- break;
- case 5:
- param0->unk18 -= val;
- break;
- }
-}
-
-THUMB_FUNC void FUN_02017BD0(
- struct UnkStruct_02016B94_2 *param0, u32 param1, struct Mtx22 *param2, fx32 param3, fx32 param4)
-{
- switch (param1)
- {
- case 2:
- G2x_SetBGyAffine_(reg_G2_BG2P,
- param2,
- param3,
- param4,
- param0->unk08[param1].unk14,
- param0->unk08[param1].unk18);
- break;
- case 3:
- G2x_SetBGyAffine_(reg_G2_BG3P,
- param2,
- param3,
- param4,
- param0->unk08[param1].unk14,
- param0->unk08[param1].unk18);
- break;
- case 6:
- G2x_SetBGyAffine_(reg_G2S_DB_BG2P,
- param2,
- param3,
- param4,
- param0->unk08[param1].unk14,
- param0->unk08[param1].unk18);
- break;
- case 7:
- G2x_SetBGyAffine_(reg_G2S_DB_BG3P,
- param2,
- param3,
- param4,
- param0->unk08[param1].unk14,
- param0->unk08[param1].unk18);
- break;
- }
-}
-
-THUMB_FUNC void FUN_02017C6C(struct UnkStruct_02016B94_2 *param0, u32 param1)
-{
- struct Mtx22 mtx;
- MTX22_2DAffine(&mtx, 0, 0x1000, 0x1000, 0);
- FUN_02017BD0(param0, param1, &mtx, 0, 0);
-}
-
-THUMB_FUNC void FUN_02017C98(const void *param0, void *param1, u32 param2)
-{
- if (param2 == 0)
- {
- MI_UncompressLZ8(param0, param1);
- return;
- }
-
- if (((u32)param0 % 4) == 0 && ((u32)param1 % 4) == 0 && ((u16)param2 % 4) == 0)
- {
- MI_CpuCopy32(param0, param1, param2);
- return;
- }
-
- MI_CpuCopy16(param0, param1, param2);
-}
-
-THUMB_FUNC void FUN_02017CD0(struct UnkStruct_02016B94_2 *param0, u32 param1)
-{
- FUN_02017CE8(param0,
- param1,
- param0->unk08[param1].unk08,
- param0->unk08[param1].unk0c,
- param0->unk08[param1].unk10);
-}
-
-THUMB_FUNC void FUN_02017CE8(
- struct UnkStruct_02016B94_2 *param0, u32 param1, u32 *param2, u32 param3, u32 param4)
-{
- u32 st0 = param3;
- if (param3 == 0)
- {
- void *st4 = param0->unk08[param1].unk08;
- if (st4 != 0)
- {
- FUN_02017C98(param2, st4, param3);
- FUN_02017D68(param1, st4, param0->unk08[param1].unk10 * 2, param0->unk08[param1].unk0c);
- return;
- }
-
- u32 r7 = param2[0] >> 8;
- void *ptr = AllocFromHeapAtEnd(param0->unk00, r7);
- FUN_02017C98(param2, ptr, st0);
- FUN_02017D68(param1, ptr, param4 * 2, r7);
- FreeToHeap(ptr);
- return;
- }
-
- FUN_02017D68(param1, param2, param4 * 2, param3);
-}
-
-THUMB_FUNC void FUN_02017D68(u32 param0, void *param1, u32 offset, u32 size)
-{
- DC_FlushRange(param1, size);
-
- switch (param0)
- {
- case 0:
- GX_LoadBG0Scr(param1, offset, size);
- break;
- case 1:
- GX_LoadBG1Scr(param1, offset, size);
- break;
- case 2:
- GX_LoadBG2Scr(param1, offset, size);
- break;
- case 3:
- GX_LoadBG3Scr(param1, offset, size);
- break;
- case 4:
- GXS_LoadBG0Scr(param1, offset, size);
- break;
- case 5:
- GXS_LoadBG1Scr(param1, offset, size);
- break;
- case 6:
- GXS_LoadBG2Scr(param1, offset, size);
- break;
- case 7:
- GXS_LoadBG3Scr(param1, offset, size);
- break;
- }
-}
-
-THUMB_FUNC void FUN_02017DFC(
- struct UnkStruct_02016B94_2 *param0, u32 param1, void *param2, u32 param3)
-{
- FUN_02017C98(param2, param0->unk08[param1].unk08, param3);
-}
-
-THUMB_FUNC void FUN_02017E14(
- struct UnkStruct_02016B94_2 *param0, u32 param1, u32 *param2, u32 param3, u32 param4)
-{
- if (param0->unk08[param1].unk1e == 0)
- {
- FUN_02017E40(param0, param1, param2, param3, param4 << 5);
- return;
- }
- FUN_02017E40(param0, param1, param2, param3, param4 << 6);
-}
-
-THUMB_FUNC void FUN_02017E40(
- struct UnkStruct_02016B94_2 *param0, u32 param1, u32 *param2, u32 param3, u32 param4)
-{
- u32 st0 = param3;
- if (param3 == 0)
- {
-
- u32 r4 = param2[0] >> 8;
- void *ptr = AllocFromHeapAtEnd(param0->unk00, r4);
- FUN_02017C98(param2, ptr, st0);
- FUN_02017E84(param1, ptr, param4, r4);
- FreeToHeap(ptr);
- return;
- }
-
- FUN_02017E84(param1, param2, param4, param3);
-}
-
-THUMB_FUNC void FUN_02017E84(u32 param0, void *param1, u32 offset, u32 size)
-{
- DC_FlushRange(param1, size);
-
- switch (param0)
- {
- case 0:
- GX_LoadBG0Char(param1, offset, size);
- break;
- case 1:
- GX_LoadBG1Char(param1, offset, size);
- break;
- case 2:
- GX_LoadBG2Char(param1, offset, size);
- break;
- case 3:
- GX_LoadBG3Char(param1, offset, size);
- break;
- case 4:
- GXS_LoadBG0Char(param1, offset, size);
- break;
- case 5:
- GXS_LoadBG1Char(param1, offset, size);
- break;
- case 6:
- GXS_LoadBG2Char(param1, offset, size);
- break;
- case 7:
- GXS_LoadBG3Char(param1, offset, size);
- break;
- }
-}
-
-THUMB_FUNC void FUN_02017F18(u32 param0, u32 size, u32 offset, u32 heap_id)
-{
- void *ptr = AllocFromHeapAtEnd(heap_id, size);
- memset(ptr, 0, size);
-
- FUN_02017E84(param0, ptr, offset, size);
- FreeToHeapExplicit(heap_id, ptr);
-}
-
-THUMB_FUNC void FUN_02017F48(
- struct UnkStruct_02016B94_2 *param0, u32 param1, u32 param2, u32 param3, u32 param4)
-{
- void *st4;
- u32 st0 = param3 * param0->unk08[param1].unk1f;
- u32 r5 = param2;
- st4 = AllocFromHeapAtEnd(param0->unk00, st0);
-
- if (param0->unk08[param1].unk1f == 0x20)
- {
- r5 = (r5 << 0xc | r5 << 0x8 | r5 << 0x4 | r5);
- r5 |= r5 << 0x10;
- }
- else
- {
- r5 = r5 << 0x18 | r5 << 0x10 | r5 << 8 | r5;
- }
-
- MI_CpuFillFast(st4, r5, st0);
-
- FUN_02017E84((u8)param1, st4, param0->unk08[param1].unk1f * param4, st0);
- FreeToHeap(st4);
-}
-
-THUMB_FUNC void FUN_02017FB4(u32 param0, void *param1, u32 offset, u32 size)
-{
- DC_FlushRange(param1, offset);
- if (param0 < 4)
- {
- GX_LoadBGPltt(param1, size, offset);
- return;
- }
-
- GXS_LoadBGPltt(param1, size, offset);
-}
-
-THUMB_FUNC void FUN_02017FE4(u32 param0, u32 param1)
-{
- FUN_02017FB4(param0, &param1, 2, 0);
-}
-
-THUMB_FUNC u16 FUN_02017FFC(u8 param0, u8 param1, u8 param2)
-{
- switch (param2)
- {
- case 0:
- return (u16)(param0 + (param1 << 4));
- case 1:
- case 2:
- return (u16)(param0 + (param1 << 5));
- case 3:
- return (u16)((param0 & 0x1f) + ((param1 + (param0 & ~0x1f)) << 5));
- case 4:
- u16 res = (u16)(((u16)((param0 >> 5) + (param1 >> 5) * 2)) << 10);
- res += (param0 & 0x1f) + ((param1 & 0x1f) << 5);
- return res;
- case 5:
- return 0;
- }
-
- return param0;
-}
-
-THUMB_FUNC u16 FUN_02018068(u8 param0, u8 param1, u8 param2, u8 param3)
-{
- u8 r2 = 0;
- u16 r3 = 0;
- s16 r4 = (s16)(param2 - 32);
- s16 r5 = (s16)(param3 - 32);
-
- if (((u32)param0 >> 5) != 0)
- {
- r2++;
- }
-
- if (((u32)param1 >> 5) != 0)
- {
- r2 += 2;
- }
-
- switch (r2)
- {
- case 0:
- if (r4 >= 0)
- {
- r3 += param0 + (param1 << 5);
- }
- else
- {
- r3 += param0 + param1 * param2;
- }
- break;
- case 1:
- if (r5 >= 0)
- {
- r3 += 0x400;
- }
- else
- {
- r3 += (param3 << 5);
- }
-
- r3 += (param0 & 0x1f) + param1 * r4;
- break;
- case 2:
- r3 += param2 << 5;
- if (r4 >= 0)
- {
- r3 += param0 + ((param1 & 0x1f) << 5);
- }
- else
- {
- r3 += param0 + (param1 & 0x1f) * param2;
- }
- break;
- case 3:
- r3 += (param2 + r5) << 5;
- r3 += (param0 & 0x1f) + (param1 & 0x1f) * r4;
- break;
- }
-
- return r3;
-}
-
-THUMB_FUNC void FUN_02018148(struct UnkStruct_02016B94_2 *param0,
- u32 param1,
- void *param2,
- u8 param3,
- u8 param4,
- u8 param5,
- u8 param6)
-{
- FUN_02018170(param0, param1, param3, param4, param5, param6, param2, 0, 0, param5, param6);
-}
-
-THUMB_FUNC void FUN_02018170(struct UnkStruct_02016B94_2 *param0,
- u32 param1,
- u8 param2,
- u8 param3,
- u8 param4,
- u8 param5,
- void *param6,
- u8 param7,
- u8 param8,
- u8 param9,
- u8 param10)
-{
- if (param0->unk08[param1].unk1c != 1)
- {
- FUN_02018268(&param0->unk08[param1],
- param2,
- param3,
- param4,
- param5,
- (u16 *)param6,
- param7,
- param8,
- param9,
- param10,
- 0);
- }
- else
- {
- FUN_020183DC(&param0->unk08[param1],
- param2,
- param3,
- param4,
- param5,
- (u8 *)param6,
- param7,
- param8,
- param9,
- param10,
- 0);
- }
-}
-
-THUMB_FUNC void FUN_020181EC(struct UnkStruct_02016B94_2 *param0,
- u32 param1,
- u8 param2,
- u8 param3,
- u8 param4,
- u8 param5,
- void *param6,
- u8 param7,
- u8 param8,
- u8 param9,
- u8 param10)
-{
- if (param0->unk08[param1].unk1c != 1)
- {
- FUN_02018268(&param0->unk08[param1],
- param2,
- param3,
- param4,
- param5,
- (u16 *)param6,
- param7,
- param8,
- param9,
- param10,
- 1);
- }
- else
- {
- FUN_020183DC(&param0->unk08[param1],
- param2,
- param3,
- param4,
- param5,
- (u8 *)param6,
- param7,
- param8,
- param9,
- param10,
- 1);
- }
-}
-
-THUMB_FUNC void FUN_02018268(struct UnkStruct_02016B94_2_sub *param0,
- u8 param1,
- u8 param2,
- u8 param3,
- u8 param4,
- u16 *param5,
- u8 param6,
- u8 param7,
- u8 param8,
- u8 param9,
- u8 param10)
-{
- void *st2c = param0->unk08;
-
- if (st2c == 0)
- {
- return;
- }
-
- u8 st41;
- u8 st40;
- FUN_02017850(param0->unk1d, &st41, &st40);
-
- u8 i;
- u8 j;
- if (param10 == 0)
- {
- for (i = 0; i < param4; i++)
- {
-
- if (param2 + i >= st40)
- {
- break;
- }
-
- if (param7 + i >= param9)
- {
- break;
- }
-
- for (j = 0; j < param3; j++)
- {
-
- if (param1 + j >= st41)
- {
- break;
- }
-
- if (param6 + j >= param8)
- {
- break;
- }
-
- ((u16 *)st2c)[FUN_02017FFC((u8)(param1 + j), (u8)(param2 + i), param0->unk1d)] =
- param5[param6 + param8 * (param7 + i) + j];
- }
- }
- }
- else
- {
- for (i = 0; i < param4; i++)
- {
-
- if (param2 + i >= st40)
- {
- break;
- }
-
- if (param7 + i >= param9)
- {
- break;
- }
-
- for (j = 0; j < param3; j++)
- {
-
- if (param1 + j >= st41)
- {
- break;
- }
-
- if (param6 + j >= param8)
- {
- break;
- }
-
- ((u16 *)st2c)[FUN_02017FFC((u8)(param1 + j), (u8)(param2 + i), param0->unk1d)] =
- param5[FUN_02018068((u8)(param6 + j), (u8)(param7 + i), param8, param9)];
- }
- }
- }
-}
-
-THUMB_FUNC void FUN_020183DC(struct UnkStruct_02016B94_2_sub *param0,
- u8 param1,
- u8 param2,
- u8 param3,
- u8 param4,
- u8 *param5,
- u8 param6,
- u8 param7,
- u8 param8,
- u8 param9,
- u8 param10)
-{
- void *st2c = param0->unk08;
-
- if (st2c == 0)
- {
- return;
- }
-
- u8 st41;
- u8 st40;
- FUN_02017850(param0->unk1d, &st41, &st40);
-
- u8 i;
- u8 j;
- if (param10 == 0)
- {
- for (i = 0; i < param4; i++)
- {
-
- if (param2 + i >= st40)
- {
- break;
- }
-
- if (param7 + i >= param9)
- {
- break;
- }
-
- for (j = 0; j < param3; j++)
- {
-
- if (param1 + j >= st41)
- {
- break;
- }
-
- if (param6 + j >= param8)
- {
- break;
- }
-
- ((u8 *)st2c)[FUN_02017FFC((u8)(param1 + j), (u8)(param2 + i), param0->unk1d)] =
- param5[param6 + param8 * (param7 + i) + j];
- }
- }
- }
- else
- {
- for (i = 0; i < param4; i++)
- {
-
- if (param2 + i >= st40)
- {
- break;
- }
-
- if (param7 + i >= param9)
- {
- break;
- }
-
- for (j = 0; j < param3; j++)
- {
-
- if (param1 + j >= st41)
- {
- break;
- }
-
- if (param6 + j >= param8)
- {
- break;
- }
-
- ((u8 *)st2c)[FUN_02017FFC((u8)(param1 + j), (u8)(param2 + i), param0->unk1d)] =
- param5[FUN_02018068((u8)(param6 + j), (u8)(param7 + i), param8, param9)];
- }
- }
- }
-}
-
-THUMB_FUNC void FUN_02018540(struct UnkStruct_02016B94_2 *param0,
- u32 param1,
- u16 param2,
- u8 param3,
- u8 param4,
- u8 param5,
- u8 param6,
- u8 param7)
-{
- if (param0->unk08[param1].unk1c != 1)
- {
-
- FUN_02018590(&param0->unk08[param1], param2, param3, param4, param5, param6, param7);
- }
- else
- {
- FUN_02018640(&param0->unk08[param1], (u8)param2, param3, param4, param5, param6);
- }
-}
-
-THUMB_FUNC void FUN_02018590(struct UnkStruct_02016B94_2_sub *param0,
- u16 param1,
- u8 param2,
- u8 param3,
- u8 param4,
- u8 param5,
- u8 param6)
-{
- void *r4 = param0->unk08;
-
- if (r4 != 0)
- {
-
- u8 st19;
- u8 st18;
- FUN_02017850(param0->unk1d, &st19, &st18);
-
- u8 i;
- u8 j;
- for (i = param3; i < param3 + param5; i++)
- {
- if (i >= st18)
- {
- break;
- }
-
- for (j = param2; j < param2 + param4; j++)
- {
- if (j >= st19)
- {
- break;
- }
-
- u16 idx = FUN_02017FFC(j, i, param0->unk1d);
-
- if (param6 == 0x11)
- {
- ((u16 *)r4)[idx] = param1;
- }
- else if (param6 == 0x10)
- {
- ((u16 *)r4)[idx] = (u16)((((u16 *)r4)[idx] & 0xF000) + param1);
- }
- else
- {
- ((u16 *)r4)[idx] = (u16)((param6 << 0xc) + param1);
- }
- }
- }
- }
-}
-
-THUMB_FUNC void FUN_02018640(
- struct UnkStruct_02016B94_2_sub *param0, u8 param1, u8 param2, u8 param3, u8 param4, u8 param5)
-{
- void *r4 = param0->unk08;
-
- if (r4 != 0)
- {
-
- u8 st19;
- u8 st18;
- FUN_02017850(param0->unk1d, &st19, &st18);
-
- u8 i;
- u8 j;
- for (i = param3; i < param3 + param5; i++)
- {
- if (i >= st18)
- {
- break;
- }
-
- for (j = param2; j < param2 + param4; j++)
- {
- if (j >= st19)
- {
- break;
- }
-
- ((u8 *)r4)[FUN_02017FFC(j, i, param0->unk1d)] = param1;
- }
- }
- }
-}
-
-THUMB_FUNC void FUN_020186B4(struct UnkStruct_02016B94_2 *param0,
- u32 param1,
- u8 param2,
- u8 param3,
- u8 param4,
- u8 param5,
- u8 param6)
-{
- void *r4 = param0->unk08[param1].unk08;
-
- if (r4 != NULL)
- {
- u8 st11;
- u8 st10;
- FUN_02017850(param0->unk08[param1].unk1d, &st11, &st10);
-
- u8 i;
- u8 j;
- for (i = param3; i < param3 + param5; i++)
- {
- if (i >= st10)
- {
- break;
- }
-
- for (j = param2; j < param2 + param4; j++)
- {
- if (j >= st11)
- {
- break;
- }
-
- u16 idx = FUN_02017FFC(j, i, param0->unk08[param1].unk1d);
- ((u16 *)r4)[idx] = (u16)((((u16 *)r4)[idx] & 0xfff) | (param6 << 0xc));
- }
- }
- }
-}
-
-THUMB_FUNC void FUN_02018744(struct UnkStruct_02016B94_2 *param0, u32 param1)
-{
- if (param0->unk08[param1].unk08 != NULL)
- {
- MI_CpuClear16(param0->unk08[param1].unk08, param0->unk08[param1].unk0c);
- FUN_02017CD0(param0, param1);
- }
-}
-
-THUMB_FUNC void FUN_02018768(struct UnkStruct_02016B94_2 *param0, u32 param1, u16 param2)
-{
- if (param0->unk08[param1].unk08 != NULL)
- {
- MI_CpuFill16(param0->unk08[param1].unk08, param2, param0->unk08[param1].unk0c);
- FUN_02017CD0(param0, param1);
- }
-}
-
-THUMB_FUNC void FUN_0201878C(struct UnkStruct_02016B94_2 *param0, u32 param1, u16 param2)
-{
- if (param0->unk08[param1].unk08 != NULL)
- {
- MI_CpuFill16(param0->unk08[param1].unk08, param2, param0->unk08[param1].unk0c);
- FUN_0201AC68(param0, param1);
- }
-}
-
-THUMB_FUNC void *FUN_020187B0(u32 param0)
-{
- switch (param0)
- {
- case 0:
- return G2_GetBG0CharPtr();
- case 1:
- return G2_GetBG1CharPtr();
- case 2:
- return G2_GetBG2CharPtr();
- case 3:
- return G2_GetBG3CharPtr();
- case 4:
- return G2S_GetBG0CharPtr();
- case 5:
- return G2S_GetBG1CharPtr();
- case 6:
- return G2S_GetBG2CharPtr();
- case 7:
- return G2S_GetBG3CharPtr();
- }
-
- return NULL;
-}
-
-THUMB_FUNC void FUN_02018808(u8 *param0, u32 param1, u8 (*param2)[2], u8 param3)
-{
- param3 <<= 4;
- for (int i = 0; i < param1; i++)
- {
- param2[i][0] = (u8)(param0[i] & 0xf);
- if (param2[i][0] != 0)
- {
- param2[i][0] += param3;
- }
-
- param2[i][1] = (u8)((param0[i] >> 4) & 0xf);
- if (param2[i][1] != 0)
- {
- param2[i][1] += param3;
- }
- }
-}
-
-THUMB_FUNC u8 (*FUN_02018848(u8 *param0, u32 param1, u8 param2, u32 heap_id))[2]
-{
- u8(*ptr)[2] = (u8(*)[2])AllocFromHeap(heap_id, param1 * 2);
-
- FUN_02018808(param0, param1, ptr, param2);
-
- return ptr;
-}
-
-THUMB_FUNC void *FUN_0201886C(struct UnkStruct_02016B94_2 *param0, u8 param1)
-{
- return param0->unk08[param1].unk08;
-}
-
-THUMB_FUNC u16 FUN_02018878(struct UnkStruct_02016B94_2 *param0, u32 param1)
-{
- return param0->unk08[param1].unk20;
-}
-
-#ifdef NONMATCHING
-THUMB_FUNC u8 FUN_02018884(struct UnkStruct_02016B94_2 *param0, u32 param1)
-{
-
- // the compiler keeps optimizing the stack away :(
- u16 st0[16];
- switch (param1)
- {
- case 0:
- st0[15] = reg_G2_BG0CNT;
- return (u32)(st0[15] << 0x1e) >> 0x1e;
- case 1:
- st0[14] = reg_G2_BG1CNT;
- return (u32)(st0[14] << 0x1e) >> 0x1e;
-
- case 2:
- switch (param0->unk08[param1].unk1c)
- {
- default:
- case 0:
- st0[13] = reg_G2_BG2CNT;
- return (u32)(st0[13] << 0x1e) >> 0x1e;
- case 1:
- st0[12] = reg_G2_BG2CNT;
- return (u32)(st0[12] << 0x1e) >> 0x1e;
- case 2:
- st0[11] = reg_G2_BG2CNT;
- return (u32)(st0[11] << 0x1e) >> 0x1e;
- }
- break;
- case 3:
- switch (param0->unk08[param1].unk1c)
- {
- default:
- case 0:
- st0[10] = reg_G2_BG3CNT;
- return (u32)(st0[10] << 0x1e) >> 0x1e;
- case 1:
- st0[9] = reg_G2_BG3CNT;
- return (u32)(st0[9] << 0x1e) >> 0x1e;
- case 2:
- st0[8] = reg_G2_BG3CNT;
- return (u32)(st0[8] << 0x1e) >> 0x1e;
- }
- break;
-
- case 4:
- st0[7] = reg_G2S_DB_BG0CNT;
- return (u32)(st0[7] << 0x1e) >> 0x1e;
- case 5:
- st0[6] = reg_G2S_DB_BG1CNT;
- return (u32)(st0[6] << 0x1e) >> 0x1e;
-
- case 6:
- switch (param0->unk08[param1].unk1c)
- {
- default:
- case 0:
- st0[5] = reg_G2S_DB_BG2CNT;
- return (u32)(st0[5] << 0x1e) >> 0x1e;
- case 1:
- st0[4] = reg_G2S_DB_BG2CNT;
- return (u32)(st0[4] << 0x1e) >> 0x1e;
- case 2:
- st0[3] = reg_G2S_DB_BG2CNT;
- return (u32)(st0[3] << 0x1e) >> 0x1e;
- }
- break;
- case 7:
- switch (param0->unk08[param1].unk1c)
- {
- default:
- case 0:
- st0[2] = reg_G2S_DB_BG3CNT;
- return (u32)(st0[2] << 0x1e) >> 0x1e;
- case 1:
- st0[1] = reg_G2S_DB_BG3CNT;
- return (u32)(st0[1] << 0x1e) >> 0x1e;
- case 2:
- st0[0] = reg_G2S_DB_BG3CNT;
- return (u32)(st0[0] << 0x1e) >> 0x1e;
- }
- break;
- }
-
- return 0;
-}
-#else
-THUMB_FUNC asm u8 FUN_02018884(struct UnkStruct_02016B94_2 *param0, u32 param1)
-{
- // clang-format off
- sub sp, #0x20
- cmp r1, #0x7
- bls _0201888C
- b _02018A38
-_0201888C:
- add r2, r1, r1
- add r2, pc
- ldrh r2, [r2, #0x6]
- lsl r2, r2, #0x10
- asr r2, r2, #0x10
- add pc, r2
-_02018898:
- // jump table (using 16-bit offset)
- // .short _020188A8 - _02018898 - 2; case 0
- // .short _020188BC - _02018898 - 2; case 1
- // .short _020188D0 - _02018898 - 2; case 2
- // .short _02018920 - _02018898 - 2; case 3
- // .short _02018970 - _02018898 - 2; case 4
- // .short _02018984 - _02018898 - 2; case 5
- // .short _02018998 - _02018898 - 2; case 6
- // .short _020189E8 - _02018898 - 2; case 7
-
- lsl r6, r1, #0
- lsl r2, r4, #0
- lsl r6, r6, #0
- lsl r6, r0, #2
- lsl r6, r2, #3
- lsl r2, r5, #3
- lsl r6, r7, #3
- lsl r6, r1, #5
-_020188A8:
- ldr r0, =0x04000008
- ldrh r1, [r0, #0x0]
- add r0, sp, #0x0
- add sp, #0x20
- strh r1, [r0, #0x1e]
- lsl r0, r1, #0x1e
- lsr r0, r0, #0x1e
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- bx lr
-_020188BC:
- ldr r0, =0x0400000A
- ldrh r1, [r0, #0x0]
- add r0, sp, #0x0
- add sp, #0x20
- strh r1, [r0, #0x1c]
- lsl r0, r1, #0x1e
- lsr r0, r0, #0x1e
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- bx lr
-_020188D0:
- mov r2, #0x2c
- mul r2, r1
- add r0, r0, r2
- ldrb r0, [r0, #0x1c]
- cmp r0, #0x0
- beq _020188E4
- cmp r0, #0x1
- beq _020188F8
- cmp r0, #0x2
- beq _0201890C
-_020188E4:
- ldr r0, =0x0400000C
- ldrh r1, [r0, #0x0]
- add r0, sp, #0x0
- add sp, #0x20
- strh r1, [r0, #0x1a]
- lsl r0, r1, #0x1e
- lsr r0, r0, #0x1e
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- bx lr
-_020188F8:
- ldr r0, =0x0400000C
- ldrh r1, [r0, #0x0]
- add r0, sp, #0x0
- add sp, #0x20
- strh r1, [r0, #0x18]
- lsl r0, r1, #0x1e
- lsr r0, r0, #0x1e
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- bx lr
-_0201890C:
- ldr r0, =0x0400000C
- ldrh r1, [r0, #0x0]
- add r0, sp, #0x0
- add sp, #0x20
- strh r1, [r0, #0x16]
- lsl r0, r1, #0x1e
- lsr r0, r0, #0x1e
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- bx lr
-_02018920:
- mov r2, #0x2c
- mul r2, r1
- add r0, r0, r2
- ldrb r0, [r0, #0x1c]
- cmp r0, #0x0
- beq _02018934
- cmp r0, #0x1
- beq _02018948
- cmp r0, #0x2
- beq _0201895C
-_02018934:
- ldr r0, =0x0400000E
- ldrh r1, [r0, #0x0]
- add r0, sp, #0x0
- add sp, #0x20
- strh r1, [r0, #0x14]
- lsl r0, r1, #0x1e
- lsr r0, r0, #0x1e
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- bx lr
-_02018948:
- ldr r0, =0x0400000E
- ldrh r1, [r0, #0x0]
- add r0, sp, #0x0
- add sp, #0x20
- strh r1, [r0, #0x12]
- lsl r0, r1, #0x1e
- lsr r0, r0, #0x1e
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- bx lr
-_0201895C:
- ldr r0, =0x0400000E
- ldrh r1, [r0, #0x0]
- add r0, sp, #0x0
- add sp, #0x20
- strh r1, [r0, #0x10]
- lsl r0, r1, #0x1e
- lsr r0, r0, #0x1e
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- bx lr
-_02018970:
- ldr r0, =0x04001008
- ldrh r1, [r0, #0x0]
- add r0, sp, #0x0
- add sp, #0x20
- strh r1, [r0, #0xe]
- lsl r0, r1, #0x1e
- lsr r0, r0, #0x1e
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- bx lr
-_02018984:
- ldr r0, =0x0400100A
- ldrh r1, [r0, #0x0]
- add r0, sp, #0x0
- add sp, #0x20
- strh r1, [r0, #0xc]
- lsl r0, r1, #0x1e
- lsr r0, r0, #0x1e
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- bx lr
-_02018998:
- mov r2, #0x2c
- mul r2, r1
- add r0, r0, r2
- ldrb r0, [r0, #0x1c]
- cmp r0, #0x0
- beq _020189AC
- cmp r0, #0x1
- beq _020189C0
- cmp r0, #0x2
- beq _020189D4
-_020189AC:
- ldr r0, =0x0400100C
- ldrh r1, [r0, #0x0]
- add r0, sp, #0x0
- add sp, #0x20
- strh r1, [r0, #0xa]
- lsl r0, r1, #0x1e
- lsr r0, r0, #0x1e
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- bx lr
-_020189C0:
- ldr r0, =0x0400100C
- ldrh r1, [r0, #0x0]
- add r0, sp, #0x0
- add sp, #0x20
- strh r1, [r0, #0x8]
- lsl r0, r1, #0x1e
- lsr r0, r0, #0x1e
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- bx lr
-_020189D4:
- ldr r0, =0x0400100C
- ldrh r1, [r0, #0x0]
- add r0, sp, #0x0
- add sp, #0x20
- strh r1, [r0, #0x6]
- lsl r0, r1, #0x1e
- lsr r0, r0, #0x1e
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- bx lr
-_020189E8:
- mov r2, #0x2c
- mul r2, r1
- add r0, r0, r2
- ldrb r0, [r0, #0x1c]
- cmp r0, #0x0
- beq _020189FC
- cmp r0, #0x1
- beq _02018A10
- cmp r0, #0x2
- beq _02018A24
-_020189FC:
- ldr r0, =0x0400100E
- ldrh r1, [r0, #0x0]
- add r0, sp, #0x0
- add sp, #0x20
- strh r1, [r0, #0x4]
- lsl r0, r1, #0x1e
- lsr r0, r0, #0x1e
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- bx lr
-_02018A10:
- ldr r0, =0x0400100E
- ldrh r1, [r0, #0x0]
- add r0, sp, #0x0
- add sp, #0x20
- strh r1, [r0, #0x2]
- lsl r0, r1, #0x1e
- lsr r0, r0, #0x1e
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- bx lr
-_02018A24:
- ldr r0, =0x0400100E
- ldrh r1, [r0, #0x0]
- add r0, sp, #0x0
- add sp, #0x20
- strh r1, [r0, #0x0]
- lsl r0, r1, #0x1e
- lsr r0, r0, #0x1e
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- bx lr
-_02018A38:
- mov r0, #0x0
- add sp, #0x20
- bx lr
- // clang-format on
-}
-#endif
-
-#ifdef NONMATCHING
-THUMB_FUNC void BlitBitmapRect4Bit(struct UnkStruct_02016B94_3 *param0,
- struct UnkStruct_02016B94_3 *param1,
- u16 param2,
- u16 param3,
- u16 param4,
- u16 param5,
- u16 param6,
- u16 param7,
- u16 param8)
-{
-
- u8 *unk1;
- u8 *unk2;
-
- int st50;
- if (param1->unk04 - param4 < param6)
- {
- st50 = param2 + param1->unk04 - param4;
- }
- else
- {
- st50 = param2 + param6;
- }
-
- int st4c;
- if (param1->unk06 - param5 < param7)
- {
- st4c = param3 + param1->unk06 - param5;
- }
- else
- {
- st4c = param3 + param7;
- }
-
- int st48 = (param0->unk04 + (param0->unk04 & 7)) >> 3;
-
- int st44 = (param1->unk04 + (param1->unk04 & 7)) >> 3;
-
- u32 i, i1;
- u32 j, j1;
- if (param8 == 0xFFFF)
- {
- i1 = param5;
- for (i = param3; i < st4c; i++)
- {
- j1 = param4;
- for (j = param2; j < st50; j++)
- {
-
- unk1 =
- (u32)(param1->unk00) + (j1 >> 1) &
- 0x3 + ((j1 << 2) & 0x3fe0) + st44 * ((i1 << 2) & 0x3fe0) + ((i1 << 2) & 0x1c);
- unk2 = (u32)(param0->unk00) + (j >> 1) &
- 0x3 + ((j << 2) & 0x3fe0) + st48 * ((i << 2) & 0x3FE0) + ((i << 2) & 0x1c);
-
- u8 r1 = *unk2;
-
- u32 r2 = (j1 << 0x1f) >> 0x1d;
- u32 r7 = ((r1 >> ((j << 0x1f) >> 0x1d)) & 0xf) << r2;
-
- *unk1 = r7 | (*unk1 & (0xf0 >> r2));
-
- j1++;
- }
- i1++;
- }
- }
- else
- {
-
- i1 = param5;
- for (i = param3; i < st4c; i++)
- {
- j1 = param4;
- for (j = param2; j < st50; j++)
- {
-
- unk1 = (u32)param1->unk00 + ((j1 >> 1) & 3) + ((j1 << 2) & 0x3fe0) +
- st44 * ((i1 << 2) & 0x3fe0) + (i1 << 2) &
- 0x1c;
- unk2 = (u32)param0->unk00 + ((j >> 1) & 3) + ((j << 2) & 0x3fe0) +
- st48 * ((i << 2) & 0x3fe0) + ((i << 2) & 0x1c);
- u8 r0 = ((*unk2) >> ((j << 0x1f) >> 0x1d)) & 0xf;
-
- if (r0 != param8)
- {
- u32 r7 = ((j1 << 0x1f) >> 0x1d);
- *unk1 = (r0 << r7) | (*unk1 & (0xf0 >> r7));
- }
-
- j1++;
- }
- i1++;
- }
- }
-}
-#else
-THUMB_FUNC asm void BlitBitmapRect4Bit(struct UnkStruct_02016B94_3 *param0,
- struct UnkStruct_02016B94_3 *param1,
- u16 param2,
- u16 param3,
- u16 param4,
- u16 param5,
- u16 param6,
- u16 param7,
- u16 param8)
-{
- // clang-format off
- push {r3-r7, lr}
- sub sp, #0x68
- str r2, [sp, #0x8]
- str r3, [sp, #0xc]
- add r2, sp, #0x70
- str r0, [sp, #0x0]
- ldrh r0, [r2, #0x10]
- str r1, [sp, #0x4]
- ldrh r2, [r2, #0x18]
- str r0, [sp, #0x10]
- add r0, r1, #0x0
- ldrh r1, [r0, #0x4]
- ldr r0, [sp, #0x10]
- sub r3, r1, r0
- cmp r3, r2
- bge _02018A88
- ldr r0, [sp, #0x8]
- add r0, r0, r3
- str r0, [sp, #0x50]
- b _02018A8E
-_02018A88:
- ldr r0, [sp, #0x8]
- add r0, r2, r0
- str r0, [sp, #0x50]
-_02018A8E:
- ldr r2, [sp, #0x4]
- add r3, sp, #0x70
- ldrh r0, [r3, #0x14]
- ldrh r2, [r2, #0x6]
- ldrh r3, [r3, #0x1c]
- sub r4, r2, r0
- cmp r4, r3
- bge _02018AA6
- ldr r2, [sp, #0xc]
- add r2, r2, r4
- str r2, [sp, #0x4c]
- b _02018AAC
-_02018AA6:
- ldr r2, [sp, #0xc]
- add r2, r3, r2
- str r2, [sp, #0x4c]
-_02018AAC:
- ldr r2, [sp, #0x0]
- mov r3, #0x7
- ldrh r4, [r2, #0x4]
- add r2, r4, #0x0
- and r2, r3
- add r2, r4, r2
- asr r2, r2, #0x3
- str r2, [sp, #0x48]
- add r2, r1, #0x0
- and r2, r3
- add r1, r1, r2
- asr r1, r1, #0x3
- str r1, [sp, #0x44]
- add r1, sp, #0x70
- ldrh r1, [r1, #0x20]
- ldr r2, =0x0000FFFF
- str r1, [sp, #0x38]
- cmp r1, r2
- bne _02018BB4
- ldr r2, [sp, #0xc]
- ldr r1, [sp, #0x4c]
- cmp r2, r1
- bge _02018ADE
- cmp r2, r1
- blt _02018AE0
-_02018ADE:
- b _02018C92
-_02018AE0:
- add r1, r2, #0x0
- lsl r1, r1, #0x2
- lsl r0, r0, #0x2
- str r1, [sp, #0x28]
- str r0, [sp, #0x24]
-_02018AEA:
- ldr r3, [sp, #0x8]
- ldr r0, [sp, #0x50]
- add r1, r3, #0x0
- ldr r4, [sp, #0x10]
- cmp r1, r0
- bge _02018B96
- cmp r1, r0
- bge _02018B96
- add r0, r3, #0x0
- lsl r5, r0, #0x2
- add r0, r4, #0x0
- lsl r6, r0, #0x2
- ldr r0, =0x00003FE0
- ldr r1, [sp, #0x28]
- ldr r2, [sp, #0x48]
- and r1, r0
- mul r2, r1
- str r2, [sp, #0x20]
- ldr r2, [sp, #0x28]
- mov r1, #0x1c
- and r2, r1
- str r2, [sp, #0x1c]
- ldr r2, [sp, #0x24]
- and r0, r2
- ldr r2, [sp, #0x44]
- mul r2, r0
- ldr r0, [sp, #0x24]
- str r2, [sp, #0x18]
- and r0, r1
- str r0, [sp, #0x14]
-_02018B26:
- ldr r0, [sp, #0x4]
- asr r2, r4, #0x1
- mov r1, #0x3
- ldr r0, [r0, #0x0]
- and r1, r2
- add r1, r0, r1
- ldr r0, =0x00003FE0
- and r0, r6
- add r1, r1, r0
- ldr r0, [sp, #0x18]
- add r6, r6, #0x4
- add r0, r1, r0
- str r0, [sp, #0x64]
- lsl r0, r4, #0x1f
- lsr r2, r0, #0x1d
- ldr r0, [sp, #0x0]
- asr r1, r3, #0x1
- ldr r7, [r0, #0x0]
- mov r0, #0x3
- and r0, r1
- ldr r1, =0x00003FE0
- add r4, r4, #0x1
- and r1, r5
- str r1, [sp, #0x54]
- add r1, r7, r0
- ldr r0, [sp, #0x54]
- add r5, r5, #0x4
- add r1, r0, r1
- ldr r0, [sp, #0x20]
- add r1, r0, r1
- ldr r0, [sp, #0x1c]
- ldrb r1, [r0, r1]
- lsl r0, r3, #0x1f
- lsr r0, r0, #0x1d
- asr r1, r0
- mov r0, #0xf
- and r0, r1
- add r7, r0, #0x0
- ldr r1, [sp, #0x14]
- ldr r0, [sp, #0x64]
- lsl r7, r2
- ldrb r0, [r0, r1]
- add r3, r3, #0x1
- str r0, [sp, #0x58]
- mov r0, #0xf0
- asr r0, r2
- ldr r1, [sp, #0x58]
- add r2, r7, #0x0
- and r0, r1
- orr r2, r0
- ldr r1, [sp, #0x14]
- ldr r0, [sp, #0x64]
- strb r2, [r0, r1]
- ldr r0, [sp, #0x50]
- cmp r3, r0
- blt _02018B26
-_02018B96:
- ldr r0, [sp, #0x28]
- add r0, r0, #0x4
- str r0, [sp, #0x28]
- ldr r0, [sp, #0xc]
- add r0, r0, #0x1
- str r0, [sp, #0xc]
- ldr r0, [sp, #0x24]
- ldr r1, [sp, #0xc]
- add r0, r0, #0x4
- str r0, [sp, #0x24]
- ldr r0, [sp, #0x4c]
- cmp r1, r0
- blt _02018AEA
- add sp, #0x68
- pop {r3-r7, pc}
-_02018BB4:
- ldr r2, [sp, #0xc]
- ldr r1, [sp, #0x4c]
- cmp r2, r1
- bge _02018C92
- cmp r2, r1
- bge _02018C92
- add r1, r2, #0x0
- lsl r1, r1, #0x2
- lsl r0, r0, #0x2
- str r1, [sp, #0x40]
- str r0, [sp, #0x3c]
-_02018BCA:
- ldr r3, [sp, #0x8]
- ldr r0, [sp, #0x50]
- add r1, r3, #0x0
- ldr r4, [sp, #0x10]
- cmp r1, r0
- bge _02018C78
- cmp r1, r0
- bge _02018C78
- add r0, r3, #0x0
- lsl r1, r0, #0x2
- add r0, r4, #0x0
- lsl r2, r0, #0x2
- ldr r0, =0x00003FE0
- ldr r5, [sp, #0x40]
- ldr r6, [sp, #0x48]
- and r5, r0
- mul r6, r5
- str r6, [sp, #0x34]
- ldr r6, [sp, #0x40]
- mov r5, #0x1c
- and r6, r5
- str r6, [sp, #0x30]
- ldr r6, [sp, #0x3c]
- and r0, r6
- ldr r6, [sp, #0x44]
- mul r6, r0
- ldr r0, [sp, #0x3c]
- str r6, [sp, #0x2c]
- and r0, r5
- str r0, [sp, #0x60]
-_02018C06:
- ldr r0, [sp, #0x4]
- asr r6, r4, #0x1
- mov r5, #0x3
- and r5, r6
- ldr r0, [r0, #0x0]
- asr r6, r3, #0x1
- add r5, r0, r5
- ldr r0, =0x00003FE0
- and r0, r2
- add r5, r5, r0
- ldr r0, [sp, #0x2c]
- add r5, r5, r0
- ldr r0, [sp, #0x0]
- ldr r7, [r0, #0x0]
- mov r0, #0x3
- and r0, r6
- ldr r6, =0x00003FE0
- and r6, r1
- str r6, [sp, #0x5c]
- add r6, r7, r0
- ldr r0, [sp, #0x5c]
- add r6, r0, r6
- ldr r0, [sp, #0x34]
- add r6, r0, r6
- ldr r0, [sp, #0x30]
- ldrb r6, [r0, r6]
- lsl r0, r3, #0x1f
- lsr r0, r0, #0x1d
- asr r6, r0
- mov r0, #0xf
- and r0, r6
- ldr r6, [sp, #0x38]
- cmp r0, r6
- beq _02018C6A
- lsl r6, r4, #0x1f
- lsr r7, r6, #0x1d
- lsl r0, r7
- mov lr, r0
- ldr r0, [sp, #0x60]
- ldrb r0, [r5, r0]
- mov r12, r0
- mov r0, #0xf0
- add r6, r0, #0x0
- asr r6, r7
- mov r0, r12
- and r0, r6
- mov r6, lr
- orr r6, r0
- ldr r0, [sp, #0x60]
- strb r6, [r5, r0]
-_02018C6A:
- ldr r0, [sp, #0x50]
- add r3, r3, #0x1
- add r1, r1, #0x4
- add r2, r2, #0x4
- add r4, r4, #0x1
- cmp r3, r0
- blt _02018C06
-_02018C78:
- ldr r0, [sp, #0x40]
- add r0, r0, #0x4
- str r0, [sp, #0x40]
- ldr r0, [sp, #0xc]
- add r0, r0, #0x1
- str r0, [sp, #0xc]
- ldr r0, [sp, #0x3c]
- ldr r1, [sp, #0xc]
- add r0, r0, #0x4
- str r0, [sp, #0x3c]
- ldr r0, [sp, #0x4c]
- cmp r1, r0
- blt _02018BCA
-_02018C92:
- add sp, #0x68
- pop {r3-r7, pc}
- // clang-format on
-}
-#endif
-
-#ifdef NONMATCHING
-THUMB_FUNC void BlitBitmapRect8Bit(struct UnkStruct_02016B94_3 *param0,
- struct UnkStruct_02016B94_3 *param1,
- u16 param2,
- u16 param3,
- u16 param4,
- u16 param5,
- u16 param6,
- u16 param7,
- u16 param8)
-{
- // horrible for loops like the one above
-}
-#else
-THUMB_FUNC asm void BlitBitmapRect8Bit(struct UnkStruct_02016B94_3 *param0,
- struct UnkStruct_02016B94_3 *param1,
- u16 param2,
- u16 param3,
- u16 param4,
- u16 param5,
- u16 param6,
- u16 param7,
- u16 param8)
-{
- // clang-format off
- push {r3-r7, lr}
- sub sp, #0x50
- str r2, [sp, #0x8]
- str r3, [sp, #0xc]
- add r2, sp, #0x58
- str r0, [sp, #0x0]
- ldrh r0, [r2, #0x10]
- str r1, [sp, #0x4]
- ldrh r2, [r2, #0x18]
- str r0, [sp, #0x10]
- add r0, r1, #0x0
- ldrh r1, [r0, #0x4]
- ldr r0, [sp, #0x10]
- sub r3, r1, r0
- cmp r3, r2
- bge _02018CC6
- ldr r0, [sp, #0x8]
- add r0, r0, r3
- b _02018CCA
-_02018CC6:
- ldr r0, [sp, #0x8]
- add r0, r2, r0
-_02018CCA:
- ldr r2, [sp, #0x4]
- add r3, sp, #0x58
- mov r12, r0
- ldrh r0, [r3, #0x14]
- ldrh r2, [r2, #0x6]
- ldrh r3, [r3, #0x1c]
- sub r4, r2, r0
- cmp r4, r3
- bge _02018CE2
- ldr r2, [sp, #0xc]
- add r2, r2, r4
- b _02018CE6
-_02018CE2:
- ldr r2, [sp, #0xc]
- add r2, r3, r2
-_02018CE6:
- mov lr, r2
- ldr r2, [sp, #0x0]
- mov r3, #0x7
- ldrh r4, [r2, #0x4]
- add r2, r4, #0x0
- and r2, r3
- add r2, r4, r2
- asr r2, r2, #0x3
- str r2, [sp, #0x4c]
- add r2, r1, #0x0
- and r2, r3
- add r1, r1, r2
- asr r1, r1, #0x3
- str r1, [sp, #0x48]
- add r1, sp, #0x58
- ldrh r1, [r1, #0x20]
- ldr r2, =0x0000FFFF
- str r1, [sp, #0x3c]
- cmp r1, r2
- bne _02018DC6
- ldr r2, [sp, #0xc]
- mov r1, lr
- cmp r2, r1
- bge _02018D1C
- mov r1, lr
- cmp r2, r1
- blt _02018D1E
-_02018D1C:
- b _02018E7C
-_02018D1E:
- add r1, r2, #0x0
- lsl r1, r1, #0x3
- lsl r0, r0, #0x3
- str r1, [sp, #0x28]
- str r0, [sp, #0x24]
-_02018D28:
- ldr r1, [sp, #0x8]
- mov r0, r12
- add r2, r1, #0x0
- ldr r7, [sp, #0x10]
- cmp r2, r0
- bge _02018DA8
- mov r0, r12
- cmp r2, r0
- bge _02018DA8
- add r0, r1, #0x0
- lsl r2, r0, #0x3
- add r0, r7, #0x0
- lsl r3, r0, #0x3
- ldr r6, =0x00007FC0
- ldr r0, [sp, #0x28]
- ldr r4, [sp, #0x4c]
- and r0, r6
- mul r4, r0
- str r4, [sp, #0x20]
- ldr r0, [sp, #0x28]
- mov r5, #0x38
- and r0, r5
- str r0, [sp, #0x1c]
- ldr r0, [sp, #0x24]
- ldr r4, [sp, #0x48]
- and r0, r6
- mul r4, r0
- ldr r0, [sp, #0x24]
- str r4, [sp, #0x18]
- and r0, r5
- str r0, [sp, #0x14]
-_02018D66:
- ldr r0, [sp, #0x0]
- add r5, r1, #0x0
- mov r4, #0x7
- and r5, r4
- ldr r0, [r0, #0x0]
- ldr r4, =0x00007FC0
- add r0, r0, r5
- and r4, r2
- add r4, r4, r0
- ldr r0, [sp, #0x20]
- add r5, r7, #0x0
- add r4, r0, r4
- ldr r0, [sp, #0x1c]
- add r1, r1, #0x1
- ldrb r6, [r0, r4]
- ldr r0, [sp, #0x4]
- mov r4, #0x7
- and r5, r4
- ldr r0, [r0, #0x0]
- ldr r4, =0x00007FC0
- add r0, r0, r5
- and r4, r3
- add r4, r4, r0
- ldr r0, [sp, #0x18]
- add r2, #0x8
- add r4, r0, r4
- ldr r0, [sp, #0x14]
- add r3, #0x8
- strb r6, [r0, r4]
- mov r0, r12
- add r7, r7, #0x1
- cmp r1, r0
- blt _02018D66
-_02018DA8:
- ldr r0, [sp, #0x28]
- add r0, #0x8
- str r0, [sp, #0x28]
- ldr r0, [sp, #0xc]
- add r0, r0, #0x1
- str r0, [sp, #0xc]
- ldr r0, [sp, #0x24]
- ldr r1, [sp, #0xc]
- add r0, #0x8
- str r0, [sp, #0x24]
- mov r0, lr
- cmp r1, r0
- blt _02018D28
- add sp, #0x50
- pop {r3-r7, pc}
-_02018DC6:
- ldr r2, [sp, #0xc]
- mov r1, lr
- cmp r2, r1
- bge _02018E7C
- mov r1, lr
- cmp r2, r1
- bge _02018E7C
- add r1, r2, #0x0
- lsl r1, r1, #0x3
- lsl r0, r0, #0x3
- str r1, [sp, #0x44]
- str r0, [sp, #0x40]
-_02018DDE:
- ldr r2, [sp, #0x8]
- mov r0, r12
- add r1, r2, #0x0
- ldr r3, [sp, #0x10]
- cmp r1, r0
- bge _02018E62
- mov r0, r12
- cmp r1, r0
- bge _02018E62
- add r0, r2, #0x0
- lsl r6, r0, #0x3
- add r0, r3, #0x0
- lsl r1, r0, #0x3
- ldr r7, =0x00007FC0
- ldr r0, [sp, #0x44]
- ldr r4, [sp, #0x4c]
- and r0, r7
- mul r4, r0
- str r4, [sp, #0x38]
- ldr r0, [sp, #0x44]
- mov r5, #0x38
- and r0, r5
- str r0, [sp, #0x34]
- ldr r0, [sp, #0x40]
- ldr r4, [sp, #0x48]
- and r0, r7
- mul r4, r0
- ldr r0, [sp, #0x40]
- str r4, [sp, #0x30]
- and r0, r5
- str r0, [sp, #0x2c]
-_02018E1C:
- ldr r0, [sp, #0x4]
- mov r4, #0x7
- ldr r0, [r0, #0x0]
- and r4, r3
- add r0, r0, r4
- ldr r4, =0x00007FC0
- add r5, r2, #0x0
- and r4, r1
- add r4, r0, r4
- ldr r0, [sp, #0x30]
- add r7, r4, r0
- ldr r0, [sp, #0x0]
- mov r4, #0x7
- and r5, r4
- ldr r0, [r0, #0x0]
- ldr r4, =0x00007FC0
- add r0, r0, r5
- and r4, r6
- add r4, r4, r0
- ldr r0, [sp, #0x38]
- add r4, r0, r4
- ldr r0, [sp, #0x34]
- ldrb r0, [r0, r4]
- ldr r4, [sp, #0x3c]
- cmp r0, r4
- beq _02018E54
- ldr r4, [sp, #0x2c]
- strb r0, [r7, r4]
-_02018E54:
- add r2, r2, #0x1
- mov r0, r12
- add r6, #0x8
- add r1, #0x8
- add r3, r3, #0x1
- cmp r2, r0
- blt _02018E1C
-_02018E62:
- ldr r0, [sp, #0x44]
- add r0, #0x8
- str r0, [sp, #0x44]
- ldr r0, [sp, #0xc]
- add r0, r0, #0x1
- str r0, [sp, #0xc]
- ldr r0, [sp, #0x40]
- ldr r1, [sp, #0xc]
- add r0, #0x8
- str r0, [sp, #0x40]
- mov r0, lr
- cmp r1, r0
- blt _02018DDE
-_02018E7C:
- add sp, #0x50
- pop {r3-r7, pc}
- // clang-format on
-}
-#endif
-
-THUMB_FUNC void FUN_02018E88(
- struct UnkStruct_02016B94_3 *param0, u16 param1, u16 param2, u16 param3, u16 param4, u8 param5)
-{
-
- int r6 = param1 + param3;
- if (r6 > param0->unk04)
- {
- r6 = param0->unk04;
- }
-
- int r12 = param2 + param4;
- if (r12 > param0->unk06)
- {
- r12 = param0->unk06;
- }
-
- int lr = (((param0->unk04) + (param0->unk04 & 7)) >> 3);
-
- for (int i = param2; i < r12; i++)
- {
-
- for (int j = param1; j < r6; j++)
- {
-
- u8 *unk = (u8 *)((u8 *)param0->unk00 + ((j >> 1) & 3) + ((j << 2) & 0x3fe0) +
- (((i << 2) & 0x3fe0) * lr) + ((i << 2) & 0x1c));
-
- if ((j & 1) != 0)
- {
- *unk &= 0xf;
- *unk |= (param5 << 4);
- }
- else
- {
- *unk &= 0xf0;
- *unk |= param5;
- }
- }
- }
-}
-
-THUMB_FUNC void FUN_02018F4C(
- struct UnkStruct_02016B94_3 *param0, u16 param1, u16 param2, u16 param3, u16 param4, u8 param5)
-{
-
- int r6 = param1 + param3;
- if (r6 > param0->unk04)
- {
- r6 = param0->unk04;
- }
-
- int r12 = param2 + param4;
- if (r12 > param0->unk06)
- {
- r12 = param0->unk06;
- }
-
- int lr = (((param0->unk04) + (param0->unk04 & 7)) >> 3);
-
- for (int i = param2; i < r12; i++)
- {
-
- for (int j = param1; j < r6; j++)
- {
-
- u8 *unk = (u8 *)((u8 *)param0->unk00 + (j & 7) + ((j << 3) & 0x7fc0) +
- (((i << 3) & 0x7fc0) * lr) + ((i << 3) & 0x38));
-
- *unk = param5;
- }
- }
-}
-
-THUMB_FUNC void *AllocWindows(u32 heap_id, s32 size)
-{
- struct Window *ptr = AllocFromHeap(heap_id, (u32)(size << 4));
-
- for (u16 i = 0; i < size; i++)
- {
- InitWindow(&ptr[i]);
- }
-
- return ptr;
-}
-
-THUMB_FUNC void InitWindow(struct Window *param0)
-{
- param0->unk00 = 0;
- param0->unk04 = 0xff;
- param0->unk05 = 0;
- param0->unk06 = 0;
- param0->width = 0;
- param0->height = 0;
- param0->unk09 = 0;
-
- param0->unk0a_0 = 0;
- param0->unk0c = 0;
-
- param0->unk0b_15 = 0;
-}
-
-THUMB_FUNC BOOL FUN_02019048(struct Window *param0)
-{
- if (param0->unk00 == 0 || param0->unk04 == 0xff || param0->unk0c == 0)
- {
- return FALSE;
- }
-
- return TRUE;
-}
-
-enum UnkEnum1
-{
- UnkEnum1_0 = 0,
- UnkEnum1_1 = 1
-};
-
-THUMB_FUNC void FUN_02019064(struct UnkStruct_02016B94_2 *param0,
- struct Window *param1,
- u8 param2,
- u8 param3,
- u8 param4,
- u8 param5,
- u8 param6,
- u8 param7,
- u16 param8)
-{
- if (param0->unk08[param2].unk08 == NULL)
- {
- return;
- }
-
- void *ptr = AllocFromHeap(param0->unk00, (u32)(param5 * param6 * param0->unk08[param2].unk1f));
-
- if (ptr == NULL)
- {
- return;
- }
- param1->unk00 = param0;
- param1->unk04 = param2;
- param1->unk05 = param3;
- param1->unk06 = param4;
- param1->width = param5;
- param1->height = param6;
- param1->unk09 = param7;
-
- param1->unk0a_0 = param8;
- param1->unk0c = ptr;
-
- enum UnkEnum1 r2;
- if (param0->unk08[param2].unk1e == 0)
- {
- r2 = UnkEnum1_0;
- }
- else
- {
- r2 = UnkEnum1_1;
- }
-
- param1->unk0b_15 = r2;
-}
-
-THUMB_FUNC void FUN_020190EC(struct UnkStruct_02016B94_2 *param0,
- struct Window *param1,
- u8 param2,
- u8 param3,
- u16 param4,
- u8 param5)
-{
- u32 size = (u32)(param2 * param3 * 32);
-
- void *ptr = AllocFromHeap(param0->unk00, size);
-
- param5 |= (param5 * 16);
- memset(ptr, param5, size);
-
- if (ptr != NULL)
- {
- param1->unk00 = param0;
- param1->width = param2;
- param1->height = param3;
- param1->unk0a_0 = param4;
- param1->unk0c = ptr;
- param1->unk0b_15 = 0;
- }
-}
-
-THUMB_FUNC void FUN_02019150(
- struct UnkStruct_02016B94_2 *param0, struct Window *param1, const struct UnkStruct_02016B94_4 *param2)
-{
-
- FUN_02019064(param0,
- param1,
- param2->unk0,
- param2->unk1,
- param2->unk2,
- param2->unk3,
- param2->unk4,
- param2->unk5,
- param2->unk6);
-}
-
-THUMB_FUNC void FUN_02019178(struct Window *param0)
-{
- FreeToHeap(param0->unk0c);
-
- param0->unk00 = 0;
- param0->unk04 = 0xff;
- param0->unk05 = 0;
- param0->unk06 = 0;
- param0->width = 0;
- param0->height = 0;
- param0->unk09 = 0;
- param0->unk0a_0 = 0;
- param0->unk0c = 0;
-}
-
-THUMB_FUNC void FUN_020191A4(struct Window *param0, int param1)
-{
- for (u16 i = 0; i < param1; i++)
- {
- if (param0[i].unk0c != NULL)
- {
- FreeToHeap(param0[i].unk0c);
- }
- }
-
- FreeToHeap(param0);
-}
-
-THUMB_FUNC void CopyWindowToVram(struct Window *param0)
-{
-
- GF_ASSERT(param0);
- GF_ASSERT(param0->unk00);
- GF_ASSERT(param0->unk04 < 8);
- GF_ASSERT(param0->unk00->unk08[param0->unk04].unk1c < 3);
-
- UNK_020EDB68[param0->unk00->unk08[param0->unk04].unk1c](param0);
-}
-
-THUMB_FUNC void FUN_02019220(struct Window *param0)
-{
-
- GF_ASSERT(param0);
- GF_ASSERT(param0->unk00);
- GF_ASSERT(param0->unk04 < 8);
- GF_ASSERT(param0->unk00->unk08[param0->unk04].unk1c < 3);
-
- UNK_020EDB5C[param0->unk00->unk08[param0->unk04].unk1c](param0);
-}
-
-THUMB_FUNC void FUN_02019270(struct Window *param0)
-{
- UNK_020EDB38[param0->unk00->unk08[param0->unk04].unk1c](param0);
-}
-
-THUMB_FUNC void FUN_0201928C(struct Window *param0, u8 param1, u8 param2)
-{
- u8 unk07 = param0->width;
- u8 unk08 = param0->height;
-
- param0->width = param1;
- param0->height = param2;
- UNK_020EDB38[param0->unk00->unk08[param0->unk04].unk1c](param0);
-
- param0->width = unk07;
- param0->height = unk08;
-}
-
-THUMB_FUNC void FUN_020192B8(struct Window *param0)
-{
- UNK_020EDB74[param0->unk00->unk08[param0->unk04].unk1c](param0);
-}
-
-THUMB_FUNC void FUN_020192D4(struct Window *param0)
-{
- u32 i, j;
- u32 r3;
- u32 iCount, jCount;
- u16 *st4 = param0->unk00->unk08[param0->unk04].unk08;
-
- if (st4 == NULL)
- {
- return;
- }
-
- r3 = param0->unk0a_0;
- jCount = (u32)(param0->unk05 + param0->width);
- iCount = (u32)(param0->unk06 + param0->height);
-
- for (i = param0->unk06; i < iCount; i++)
- {
- for (j = param0->unk05; j < jCount; j++)
- {
- st4[((i & 0x20) * 32) + ((j & 0x20) * 32) + ((i & 0x1f) << 5) + (j & 0x1f)] =
- (u16)(r3 | (param0->unk09 << 12));
-
- r3++;
- }
- }
-}
-
-THUMB_FUNC void FUN_02019358(struct Window *param0)
-{
- int j, i;
- u8 *r4;
-
- int r5;
- int r6;
-
- if (param0->unk00->unk08[param0->unk04].unk08 == NULL)
- {
- return;
- }
-
- r6 = UNK_020EDB30[param0->unk00->unk08[param0->unk04].unk1d];
-
- r4 = param0->unk00->unk08[param0->unk04].unk08 + param0->unk06 * r6 + param0->unk05;
- r5 = param0->unk0a_0;
-
- for (i = 0; i < param0->height; i++)
- {
- for (j = 0; j < param0->width; j++)
- {
- r4[j] = (u8)r5;
- r5++;
- }
- r4 += r6;
- }
-}
-
-THUMB_FUNC void FUN_020193B4(struct Window *param0)
-{
-
- u32 i, j;
-
- u32 iCount, jCount;
- u32 st8;
-
- u16 *st4;
-
- if (param0->unk00->unk08[param0->unk04].unk08 == NULL)
- {
- return;
- }
- st4 = param0->unk00->unk08[param0->unk04].unk08;
-
- st8 = UNK_020EDB30[param0->unk00->unk08[param0->unk04].unk1d];
- jCount = (u32)(param0->unk05 + param0->width);
- iCount = (u32)(param0->unk06 + param0->height);
-
- for (i = param0->unk06; i < iCount; i++)
- {
- for (j = param0->unk05; j < jCount; j++)
- {
- st4[((i & 0x20) * 32) + ((j & 0x20) * 32) + ((i & 0x1f) * st8) + (j & 0x1f)] = 0;
- }
- }
-}
-
-THUMB_FUNC void FUN_02019444(struct Window *param0)
-{
-
- int j, i;
- u8 *r5;
-
- int r6;
-
- if (param0->unk00->unk08[param0->unk04].unk08 == NULL)
- {
- return;
- }
-
- r6 = UNK_020EDB30[param0->unk00->unk08[param0->unk04].unk1d];
- r5 = param0->unk00->unk08[param0->unk04].unk08 + param0->unk06 * r6 + param0->unk05;
-
- for (i = 0; i < param0->height; i++)
- {
- for (j = 0; j < param0->width; j++)
- {
- r5[j] = 0;
- }
- r5 += r6;
- }
-}
-
-THUMB_FUNC void FUN_0201949C(struct Window *window)
-{
- FUN_020192D4(window);
- FUN_02019548(window);
- FUN_02017CE8(window->unk00,
- window->unk04,
- window->unk00->unk08[window->unk04].unk08,
- window->unk00->unk08[window->unk04].unk0c,
- window->unk00->unk08[window->unk04].unk10);
-}
-
-THUMB_FUNC void FUN_020194C8(struct Window *window)
-{
- FUN_020192D4(window);
- FUN_0201AC68(window->unk00, window->unk04);
- FUN_02019548(window);
-}
-
-THUMB_FUNC void FUN_020194E0(struct Window *window)
-{
- FUN_02019358(window);
- FUN_02017CE8(window->unk00,
- window->unk04,
- window->unk00->unk08[window->unk04].unk08,
- window->unk00->unk08[window->unk04].unk0c,
- window->unk00->unk08[window->unk04].unk10);
-
- FUN_02017E14(window->unk00,
- window->unk04,
- window->unk0c,
- (u32)(window->width * window->height * 64),
- window->unk0a_0);
-}
-
-THUMB_FUNC void FUN_0201951C(struct Window *window)
-{
- FUN_02019358(window);
- FUN_0201AC68(window->unk00, window->unk04);
- FUN_02017E14(window->unk00,
- window->unk04,
- window->unk0c,
- (u32)(window->width * window->height * 64),
- window->unk0a_0);
-}
-
-THUMB_FUNC void FUN_02019548(struct Window *window)
-{
- FUN_02017E14(window->unk00,
- window->unk04,
- window->unk0c,
- (u32)(window->width * window->height * window->unk00->unk08[window->unk04].unk1f),
- window->unk0a_0);
-}
-
-THUMB_FUNC void FUN_02019570(struct Window *window)
-{
- UNK_020EDB50[window->unk00->unk08[window->unk04].unk1c](window);
-}
-
-THUMB_FUNC void FUN_0201958C(struct Window *window)
-{
- UNK_020EDB44[window->unk00->unk08[window->unk04].unk1c](window);
-}
-
-THUMB_FUNC void FUN_020195A8(struct Window *window)
-{
- FUN_020193B4(window);
- FUN_02017CE8(window->unk00,
- window->unk04,
- window->unk00->unk08[window->unk04].unk08,
- window->unk00->unk08[window->unk04].unk0c,
- window->unk00->unk08[window->unk04].unk10);
-}
-
-THUMB_FUNC void FUN_020195D0(struct Window *window)
-{
- FUN_020193B4(window);
- FUN_0201AC68(window->unk00, window->unk04);
-}
-
-THUMB_FUNC void FUN_020195E4(struct Window *window)
-{
- FUN_02019444(window);
- FUN_02017CE8(window->unk00,
- window->unk04,
- window->unk00->unk08[window->unk04].unk08,
- window->unk00->unk08[window->unk04].unk0c,
- window->unk00->unk08[window->unk04].unk10);
-}
-
-THUMB_FUNC void FUN_0201960C(struct Window *window)
-{
- FUN_02019444(window);
- FUN_0201AC68(window->unk00, window->unk04);
-}
-
-THUMB_FUNC void FillWindowPixelBuffer(struct Window *window, u8 param1)
-{
- if (window->unk00->unk08[window->unk04].unk1f == 0x20)
- {
- param1 |= param1 << 4;
- }
-
- MI_CpuFillFast(
- window->unk0c,
- (u32)((param1 << 0x18) | (param1 << 0x10) | (param1 << 0x8) | param1),
- (u32)(window->unk00->unk08[window->unk04].unk1f * window->width * window->height));
-}
-
-THUMB_FUNC void BlitBitmapRectToWindow(struct Window *window,
- const void *src,
- u16 srcX,
- u16 srcY,
- u16 srcWidth,
- u16 srcHeight,
- u16 dstX,
- u16 dstY,
- u16 dstWidth,
- u16 dstHeight)
-{
- BlitBitmapRect(
- window, src, srcX, srcY, srcWidth, srcHeight, dstX, dstY, dstWidth, dstHeight, 0);
-}
-
-THUMB_FUNC void BlitBitmapRect(struct Window *window,
- void *param1,
- u16 param2,
- u16 param3,
- u16 param4,
- u16 param5,
- u16 param6,
- u16 param7,
- u16 param8,
- u16 param9,
- u16 param10)
-{
- struct UnkStruct_02016B94_3 st1c = { param1, param4, param5 };
- struct UnkStruct_02016B94_3 st14 = {
- window->unk0c, (u16)(window->width << 3), (u16)(window->height << 3)
- };
-
- if (window->unk00->unk08[window->unk04].unk1e == 0)
- {
- BlitBitmapRect4Bit(&st1c, &st14, param2, param3, param6, param7, param8, param9, param10);
- }
- else
- {
- BlitBitmapRect8Bit(&st1c, &st14, param2, param3, param6, param7, param8, param9, param10);
- }
-}
-
-THUMB_FUNC void FillWindowPixelRect(
- struct Window *window, u8 fillValue, u16 x, u16 y, u16 width, u16 height)
-{
- struct UnkStruct_02016B94_3 st8 = {
- window->unk0c, (u16)(window->width << 3), (u16)(window->height << 3)
- };
-
- if (window->unk00->unk08[window->unk04].unk1e == 0)
- {
- FUN_02018E88(&st8, x, y, width, height, fillValue);
- }
- else
- {
- FUN_02018F4C(&st8, x, y, width, height, fillValue);
- }
-}
-
-#ifdef NONMATCHING
-THUMB_FUNC void FUN_0201974C(
- struct Window *window, u32 *param1, u32 param2, u32 param3, u16 param4, u16 param5, u32 param6)
-{
- u32 str330 = param6;
- u32 *st0 = param1;
- u16 st5c = param4;
-
- void *st278 = window->unk0c;
- u16 st58 = window->width << 3;
-
- int st8 = st58 - st5c;
-
- if (st8 >= param2)
- {
- st8 = param2;
- }
-
- int st4 = (u16)(window->height << 3) - param5;
- u16 st48 = param5;
-
- if (st4 >= param3)
- {
- st4 = param3;
- }
-
- u8 r4 = 0;
- if (st8 > 8)
- {
- r4 |= 1;
- }
-
- if (st4 > 8)
- {
- r4 |= 2;
- }
-
- if (window->unk0b_15 == 0)
- {
- switch (r4)
- {
- case 0:
- u8 st70 = param6;
- for (u32 st274 = 0; st274 < st4; st274++)
- {
- u32 st6c = (st58 + (st58 & 7)) >> 3;
-
- u32 st26c = st0[0];
- u8 st270 = (u8)((st70 >> st274) & 1);
- u32 r2 = st5c;
-
- for (u32 r1 = 0; r1 < st8; r1++)
- {
- u32 r3 = st5c << 2;
- u32 st68 = ((st48 << 2) & 0x3fe0) * st6c;
- u32 r7 = (st48 << 2) & 0x1c;
- u32 st64 = (((st48 + 1) << 2) & 0x3fe0) * st6c;
- u32 st60 = ((st48 + 1) << 2) & 0x1c;
- u32 r4 = r1;
-
- void *st27c = st278 + ((r2 >> 1) & 3) + (r3 & 0x3fe0);
- u8 *r0 = st27c + st68;
-
- u8 r5 = (u8)((st26c >> r4) & 0xf);
- if (r5 != 0)
- {
- u32 st280 = (r5 << ((r2 & 1) << 2));
- u32 st284 = r0[r7];
-
- u8 r5 = ((0xf0 >> ((r2 & 1) << 2)) & st284) | st280;
- r0[r7] = r5;
-
- if (st270 != 0)
- {
- *(u8 *)(st27c + st64 + st60) = r5;
- }
- }
-
- r4 += 4;
- r3 += 4;
- r2 += 1;
- }
-
- if (st270 != 0)
- {
- st48 += 2;
- }
- else
- {
- st48++;
- }
-
- st0++;
- }
-
- break;
-
- case 1:
- u32 *st25c = st0;
- u32 st264 = st48;
- u8 st54 = param6;
- u8 st84 = param6;
-
- for (u32 st268 = 0; st268 < st4; st268++)
- {
- u32 st80 = (st58 + (st58 & 7)) >> 3;
-
- u32 st258 = *st25c;
- u32 r2 = st5c;
- u8 st260 = (st84 >> st268) & 1;
- u32 r3 = st5c << 2;
- u32 st7c = ((st264 << 2) & 0x3fe0) * st80;
- u32 r7 = (st264 << 2) & 0x1c;
- u32 st78 = (((st264 + 1) << 2) & 0x3fe0) * st80;
- u32 st74 = ((st264 + 1) << 2) & 0x1c;
- u32 r4 = 0;
-
- for (u32 r1 = 0; r1 < 8; r1++)
- {
- void *st288 = st278 + ((r2 >> 1) & 3) + (r3 & 0x3fe0);
- u8 *r0 = st288 + st7c;
- u8 r5 = (st258 >> r4) & 0xf;
- if (r5 != 0)
- {
- u32 st28c = r5 << ((r2 & 1) << 2);
- u32 st290 = r0[r7];
- u8 r5 = ((0xf0 >> ((r2 & 1) << 2)) & st290) | st28c;
- r0[r7] = r5;
-
- if (st260 != 0)
- {
- *(u8 *)(st288 + st78 + st74) = r5;
- }
- }
-
- r4 += 4;
- r3 += 4;
- r2++;
- }
-
- if (st260 != 0)
- {
- st264 += 2;
- }
- else
- {
- st264++;
- }
-
- st25c++;
- }
-
- st0 += 0x20;
- u8 st98 = st54;
-
- for (u32 st254 = 0; st254 < st4; st254++)
- {
- st5c += 8;
- u32 st94 = (st58 + (st58 & 7)) >> 3;
-
- //_02019A00
- }
-
- break;
-
- case 2:
- // TODO
- break;
- case 3:
- // TODO
- break;
- }
- }
- else
- {
- // TODO: FUN_0201A12C
- }
-}
-#else
-asm void FUN_0201974C(
- struct Window *window, u32 *param1, u32 param2, u32 param3, u16 param4, u16 param5, u32 param6)
-{
- // clang-format off
- push {r4-r7, lr}
- sub sp, #0x1fc
- sub sp, #0x118
- add r5, r0, #0x0
- ldr r0, [sp, #0x330]
- str r1, [sp, #0x0]
- str r0, [sp, #0x330]
- add r1, sp, #0x318
- ldrh r1, [r1, #0x10]
- ldr r0, [r5, #0xc]
- str r1, [sp, #0x5c]
- ldrb r1, [r5, #0x7]
- str r0, [sp, #0x278]
- ldrb r0, [r5, #0x8]
- lsl r1, r1, #0x13
- lsr r4, r1, #0x10
- ldr r1, [sp, #0x5c]
- lsl r0, r0, #0x13
- sub r1, r4, r1
- lsr r0, r0, #0x10
- str r4, [sp, #0x58]
- str r1, [sp, #0x8]
- cmp r1, r2
- blt _0201977E
- str r2, [sp, #0x8]
-_0201977E:
- add r1, sp, #0x318
- ldrh r1, [r1, #0x14]
- sub r0, r0, r1
- str r1, [sp, #0x48]
- str r0, [sp, #0x4]
- cmp r0, r3
- blt _0201978E
- str r3, [sp, #0x4]
-_0201978E:
- ldr r0, [sp, #0x8]
- mov r4, #0x0
- cmp r0, #0x8
- ble _0201979E
- mov r0, #0x1
- orr r0, r4
- lsl r0, r0, #0x18
- lsr r4, r0, #0x18
-_0201979E:
- ldr r0, [sp, #0x4]
- cmp r0, #0x8
- ble _020197AC
- mov r0, #0x2
- orr r0, r4
- lsl r0, r0, #0x18
- lsr r4, r0, #0x18
-_020197AC:
- ldrh r0, [r5, #0xa]
- lsl r0, r0, #0x10
- lsr r0, r0, #0x1f
- beq _020197B8
- bl FUN_0201A12C
-_020197B8:
- cmp r4, #0x3
- bls _020197C0
- bl FUN_0201A8BC
-_020197C0:
- add r0, r4, r4
- add r0, pc
- ldrh r0, [r0, #0x6]
- lsl r0, r0, #0x10
- asr r0, r0, #0x10
- add pc, r0
-_020197CC:
- lsl r6, r0, #0
- lsl r0, r1, #4
- lsl r0, r3, #12
- lsl r0, r7, #20
- // jump table (using 16-bit offset)
- // .short _020197D4 - _020197CC - 2; case 0
- // .short _020198D6 - _020197CC - 2; case 1
- // .short _02019AE6 - _020197CC - 2; case 2
- // .short _02019D06 - _020197CC - 2; case 3
-_020197D4:
- ldr r0, [sp, #0x330]
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x70]
- mov r0, #0x0
- str r0, [sp, #0x274]
- ldr r0, [sp, #0x4]
- cmp r0, #0x0
- bgt _020197EA
- bl FUN_0201A8BC
-_020197EA:
- ldr r0, [sp, #0x58]
- mov r1, #0x7
- and r1, r0
- add r0, r0, r1
- asr r0, r0, #0x3
- str r0, [sp, #0x6c]
-_020197F6:
- ldr r0, [sp, #0x0]
- ldr r1, [sp, #0x70]
- ldr r0, [r0, #0x0]
- ldr r2, [sp, #0x5c]
- str r0, [sp, #0x26c]
- ldr r0, [sp, #0x274]
- asr r1, r0
- mov r0, #0x1
- and r0, r1
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x270]
- ldr r0, [sp, #0x8]
- mov r1, #0x0
- cmp r0, #0x0
- ble _020198AA
- ble _020198AA
- add r0, r2, #0x0
- lsl r3, r0, #0x2
- ldr r0, [sp, #0x48]
- ldr r6, [sp, #0x6c]
- lsl r5, r0, #0x2
- ldr r0, =0x00003FE0
- add r7, r5, #0x0
- and r0, r5
- mul r6, r0
- mov r0, #0x1c
- and r7, r0
- ldr r0, [sp, #0x48]
- str r6, [sp, #0x68]
- add r0, r0, #0x1
- lsl r6, r0, #0x2
- ldr r0, =0x00003FE0
- ldr r5, [sp, #0x6c]
- and r0, r6
- mul r5, r0
- mov r0, #0x1c
- and r0, r6
- add r4, r1, #0x0
- str r5, [sp, #0x64]
- str r0, [sp, #0x60]
-_02019848:
- asr r5, r2, #0x1
- mov r0, #0x3
- and r5, r0
- ldr r0, [sp, #0x278]
- add r0, r0, r5
- ldr r5, =0x00003FE0
- and r5, r3
- add r5, r0, r5
- ldr r0, [sp, #0x68]
- str r5, [sp, #0x27c]
- add r0, r5, r0
- ldr r5, [sp, #0x26c]
- add r6, r5, #0x0
- lsr r6, r4
- mov r5, #0xf
- and r5, r6
- lsl r5, r5, #0x18
- lsr r5, r5, #0x18
- beq _0201989C
- lsl r6, r2, #0x1f
- lsr r6, r6, #0x1d
- lsl r5, r6
- str r5, [sp, #0x280]
- ldrb r5, [r0, r7]
- str r5, [sp, #0x284]
- mov r5, #0xf0
- asr r5, r6
- ldr r6, [sp, #0x284]
- and r6, r5
- ldr r5, [sp, #0x280]
- orr r5, r6
- lsl r5, r5, #0x18
- lsr r5, r5, #0x18
- strb r5, [r0, r7]
- ldr r0, [sp, #0x270]
- cmp r0, #0x0
- beq _0201989C
- ldr r6, [sp, #0x27c]
- ldr r0, [sp, #0x64]
- add r6, r6, r0
- ldr r0, [sp, #0x60]
- strb r5, [r0, r6]
-_0201989C:
- ldr r0, [sp, #0x8]
- add r1, r1, #0x1
- add r4, r4, #0x4
- add r3, r3, #0x4
- add r2, r2, #0x1
- cmp r1, r0
- blt _02019848
-_020198AA:
- ldr r0, [sp, #0x270]
- cmp r0, #0x0
- beq _020198B8
- ldr r0, [sp, #0x48]
- add r0, r0, #0x2
- str r0, [sp, #0x48]
- b _020198BE
-_020198B8:
- ldr r0, [sp, #0x48]
- add r0, r0, #0x1
- str r0, [sp, #0x48]
-_020198BE:
- ldr r0, [sp, #0x0]
- add r0, r0, #0x4
- str r0, [sp, #0x0]
- ldr r0, [sp, #0x274]
- add r1, r0, #0x1
- ldr r0, [sp, #0x4]
- str r1, [sp, #0x274]
- cmp r1, r0
- blt _020197F6
- add sp, #0x1fc
- add sp, #0x118
- pop {r4-r7, pc}
-_020198D6:
- ldr r0, [sp, #0x0]
- str r0, [sp, #0x25c]
- ldr r0, [sp, #0x48]
- str r0, [sp, #0x264]
- ldr r0, [sp, #0x330]
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x54]
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x84]
- mov r0, #0x0
- str r0, [sp, #0x268]
- ldr r0, [sp, #0x4]
- cmp r0, #0x0
- ble _020199D2
- ldr r0, [sp, #0x58]
- mov r1, #0x7
- and r1, r0
- add r0, r0, r1
- asr r0, r0, #0x3
- str r0, [sp, #0x80]
-_02019902:
- ldr r0, [sp, #0x25c]
- ldr r1, [sp, #0x84]
- ldr r0, [r0, #0x0]
- ldr r2, [sp, #0x5c]
- str r0, [sp, #0x258]
- ldr r0, [sp, #0x268]
- ldr r6, [sp, #0x80]
- asr r1, r0
- mov r0, #0x1
- and r0, r1
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x260]
- add r0, r2, #0x0
- lsl r3, r0, #0x2
- ldr r0, [sp, #0x264]
- mov r1, #0x0
- lsl r5, r0, #0x2
- ldr r0, =0x00003FE0
- add r7, r5, #0x0
- and r0, r5
- mul r6, r0
- mov r0, #0x1c
- and r7, r0
- ldr r0, [sp, #0x264]
- str r6, [sp, #0x7c]
- add r0, r0, #0x1
- lsl r6, r0, #0x2
- ldr r0, =0x00003FE0
- ldr r5, [sp, #0x80]
- and r0, r6
- mul r5, r0
- mov r0, #0x1c
- and r0, r6
- add r4, r1, #0x0
- str r5, [sp, #0x78]
- str r0, [sp, #0x74]
-_0201994C:
- asr r5, r2, #0x1
- mov r0, #0x3
- and r5, r0
- ldr r0, [sp, #0x278]
- add r0, r0, r5
- ldr r5, =0x00003FE0
- and r5, r3
- add r5, r0, r5
- ldr r0, [sp, #0x7c]
- str r5, [sp, #0x288]
- add r0, r5, r0
- ldr r5, [sp, #0x258]
- add r6, r5, #0x0
- lsr r6, r4
- mov r5, #0xf
- and r5, r6
- lsl r5, r5, #0x18
- lsr r5, r5, #0x18
- beq _020199A0
- lsl r6, r2, #0x1f
- lsr r6, r6, #0x1d
- lsl r5, r6
- str r5, [sp, #0x28c]
- ldrb r5, [r0, r7]
- str r5, [sp, #0x290]
- mov r5, #0xf0
- asr r5, r6
- ldr r6, [sp, #0x290]
- and r6, r5
- ldr r5, [sp, #0x28c]
- orr r5, r6
- lsl r5, r5, #0x18
- lsr r5, r5, #0x18
- strb r5, [r0, r7]
- ldr r0, [sp, #0x260]
- cmp r0, #0x0
- beq _020199A0
- ldr r6, [sp, #0x288]
- ldr r0, [sp, #0x78]
- add r6, r6, r0
- ldr r0, [sp, #0x74]
- strb r5, [r0, r6]
-_020199A0:
- add r1, r1, #0x1
- add r4, r4, #0x4
- add r3, r3, #0x4
- add r2, r2, #0x1
- cmp r1, #0x8
- blt _0201994C
- ldr r0, [sp, #0x260]
- cmp r0, #0x0
- beq _020199BA
- ldr r0, [sp, #0x264]
- add r0, r0, #0x2
- str r0, [sp, #0x264]
- b _020199C0
-_020199BA:
- ldr r0, [sp, #0x264]
- add r0, r0, #0x1
- str r0, [sp, #0x264]
-_020199C0:
- ldr r0, [sp, #0x25c]
- add r0, r0, #0x4
- str r0, [sp, #0x25c]
- ldr r0, [sp, #0x268]
- add r1, r0, #0x1
- ldr r0, [sp, #0x4]
- str r1, [sp, #0x268]
- cmp r1, r0
- blt _02019902
-_020199D2:
- ldr r0, [sp, #0x0]
- add r0, #0x20
- str r0, [sp, #0x0]
- ldr r0, [sp, #0x54]
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x98]
- mov r0, #0x0
- str r0, [sp, #0x254]
- ldr r0, [sp, #0x4]
- cmp r0, #0x0
- bgt _020199EE
- bl FUN_0201A8BC
-_020199EE:
- ldr r0, [sp, #0x5c]
- mov r1, #0x7
- add r0, #0x8
- str r0, [sp, #0x5c]
- ldr r0, [sp, #0x58]
- and r1, r0
- add r0, r0, r1
- asr r0, r0, #0x3
- str r0, [sp, #0x94]
-_02019A00:
- ldr r0, [sp, #0x0]
- ldr r1, [sp, #0x98]
- ldr r0, [r0, #0x0]
- ldr r2, [sp, #0x5c]
- str r0, [sp, #0x24c]
- ldr r0, [sp, #0x254]
- asr r1, r0
- mov r0, #0x1
- and r0, r1
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x250]
- ldr r0, [sp, #0x8]
- mov r1, #0x0
- str r0, [sp, #0x294]
- sub r0, #0x8
- str r0, [sp, #0x294]
- cmp r0, #0x0
- ble _02019ABA
- ble _02019ABA
- add r0, r2, #0x0
- lsl r3, r0, #0x2
- ldr r0, [sp, #0x48]
- ldr r6, [sp, #0x94]
- lsl r5, r0, #0x2
- ldr r0, =0x00003FE0
- add r7, r5, #0x0
- and r0, r5
- mul r6, r0
- mov r0, #0x1c
- and r7, r0
- ldr r0, [sp, #0x48]
- str r6, [sp, #0x90]
- add r0, r0, #0x1
- lsl r6, r0, #0x2
- ldr r0, =0x00003FE0
- ldr r5, [sp, #0x94]
- and r0, r6
- mul r5, r0
- mov r0, #0x1c
- and r0, r6
- add r4, r1, #0x0
- str r5, [sp, #0x8c]
- str r0, [sp, #0x88]
-_02019A58:
- asr r5, r2, #0x1
- mov r0, #0x3
- and r5, r0
- ldr r0, [sp, #0x278]
- add r0, r0, r5
- ldr r5, =0x00003FE0
- and r5, r3
- add r5, r0, r5
- ldr r0, [sp, #0x90]
- str r5, [sp, #0x298]
- add r0, r5, r0
- ldr r5, [sp, #0x24c]
- add r6, r5, #0x0
- lsr r6, r4
- mov r5, #0xf
- and r5, r6
- lsl r5, r5, #0x18
- lsr r5, r5, #0x18
- beq _02019AAC
- lsl r6, r2, #0x1f
- lsr r6, r6, #0x1d
- lsl r5, r6
- str r5, [sp, #0x29c]
- ldrb r5, [r0, r7]
- str r5, [sp, #0x2a0]
- mov r5, #0xf0
- asr r5, r6
- ldr r6, [sp, #0x2a0]
- and r6, r5
- ldr r5, [sp, #0x29c]
- orr r5, r6
- lsl r5, r5, #0x18
- lsr r5, r5, #0x18
- strb r5, [r0, r7]
- ldr r0, [sp, #0x250]
- cmp r0, #0x0
- beq _02019AAC
- ldr r6, [sp, #0x298]
- ldr r0, [sp, #0x8c]
- add r6, r6, r0
- ldr r0, [sp, #0x88]
- strb r5, [r0, r6]
-_02019AAC:
- ldr r0, [sp, #0x294]
- add r1, r1, #0x1
- add r4, r4, #0x4
- add r3, r3, #0x4
- add r2, r2, #0x1
- cmp r1, r0
- blt _02019A58
-_02019ABA:
- ldr r0, [sp, #0x250]
- cmp r0, #0x0
- beq _02019AC8
- ldr r0, [sp, #0x48]
- add r0, r0, #0x2
- str r0, [sp, #0x48]
- b _02019ACE
-_02019AC8:
- ldr r0, [sp, #0x48]
- add r0, r0, #0x1
- str r0, [sp, #0x48]
-_02019ACE:
- ldr r0, [sp, #0x0]
- add r0, r0, #0x4
- str r0, [sp, #0x0]
- ldr r0, [sp, #0x254]
- add r1, r0, #0x1
- ldr r0, [sp, #0x4]
- str r1, [sp, #0x254]
- cmp r1, r0
- blt _02019A00
- add sp, #0x1fc
- add sp, #0x118
- pop {r4-r7, pc}
-_02019AE6:
- ldr r0, [sp, #0x0]
- mov r1, #0x7
- str r0, [sp, #0x23c]
- ldr r0, [sp, #0x48]
- str r0, [sp, #0x244]
- mov r0, #0x0
- str r0, [sp, #0x248]
- ldr r0, [sp, #0x330]
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0xa8]
- ldr r0, [sp, #0x58]
- and r1, r0
- add r0, r0, r1
- asr r0, r0, #0x3
- str r0, [sp, #0x40]
-_02019B06:
- ldr r0, [sp, #0x23c]
- ldr r1, [sp, #0xa8]
- ldr r0, [r0, #0x0]
- ldr r2, [sp, #0x5c]
- str r0, [sp, #0x238]
- ldr r0, [sp, #0x248]
- asr r1, r0
- mov r0, #0x1
- and r0, r1
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x240]
- ldr r0, [sp, #0x8]
- mov r1, #0x0
- cmp r0, #0x0
- ble _02019BC2
- ble _02019BC2
- add r0, r2, #0x0
- lsl r3, r0, #0x2
- ldr r0, [sp, #0x244]
- ldr r6, [sp, #0x40]
- lsl r5, r0, #0x2
- ldr r0, =0x00003FE0
- add r7, r5, #0x0
- and r0, r5
- mul r6, r0
- mov r0, #0x1c
- and r7, r0
- ldr r0, [sp, #0x244]
- str r6, [sp, #0xa4]
- add r0, r0, #0x1
- lsl r6, r0, #0x2
- ldr r0, =0x00003FE0
- ldr r5, [sp, #0x40]
- and r0, r6
- mul r5, r0
- mov r0, #0x1c
- and r0, r6
- add r4, r1, #0x0
- str r5, [sp, #0xa0]
- str r0, [sp, #0x9c]
-_02019B58:
- asr r5, r2, #0x1
- mov r0, #0x3
- and r5, r0
- ldr r0, [sp, #0x278]
- add r0, r0, r5
- ldr r5, =0x00003FE0
-// b _02019B6C
-// nop
-// _02019B68: .word 0x00003FE0
-// _02019B6C:
- and r5, r3
- add r5, r0, r5
- ldr r0, [sp, #0xa4]
- str r5, [sp, #0x2a4]
- add r0, r5, r0
- ldr r5, [sp, #0x238]
- add r6, r5, #0x0
- lsr r6, r4
- mov r5, #0xf
- and r5, r6
- lsl r5, r5, #0x18
- lsr r5, r5, #0x18
- beq _02019BB4
- lsl r6, r2, #0x1f
- lsr r6, r6, #0x1d
- lsl r5, r6
- str r5, [sp, #0x2a8]
- ldrb r5, [r0, r7]
- str r5, [sp, #0x2ac]
- mov r5, #0xf0
- asr r5, r6
- ldr r6, [sp, #0x2ac]
- and r6, r5
- ldr r5, [sp, #0x2a8]
- orr r5, r6
- lsl r5, r5, #0x18
- lsr r5, r5, #0x18
- strb r5, [r0, r7]
- ldr r0, [sp, #0x240]
- cmp r0, #0x0
- beq _02019BB4
- ldr r6, [sp, #0x2a4]
- ldr r0, [sp, #0xa0]
- add r6, r6, r0
- ldr r0, [sp, #0x9c]
- strb r5, [r0, r6]
-_02019BB4:
- ldr r0, [sp, #0x8]
- add r1, r1, #0x1
- add r4, r4, #0x4
- add r3, r3, #0x4
- add r2, r2, #0x1
- cmp r1, r0
- blt _02019B58
-_02019BC2:
- ldr r0, [sp, #0x240]
- cmp r0, #0x0
- beq _02019BD0
- ldr r0, [sp, #0x244]
- add r0, r0, #0x2
- str r0, [sp, #0x244]
- b _02019BD6
-_02019BD0:
- ldr r0, [sp, #0x244]
- add r0, r0, #0x1
- str r0, [sp, #0x244]
-_02019BD6:
- ldr r0, [sp, #0x23c]
- add r0, r0, #0x4
- str r0, [sp, #0x23c]
- ldr r0, [sp, #0x248]
- add r0, r0, #0x1
- str r0, [sp, #0x248]
- cmp r0, #0x8
- blt _02019B06
- ldr r0, [sp, #0x0]
- mov r2, #0x0
- add r0, #0x40
- str r0, [sp, #0x0]
- ldr r0, [sp, #0x48]
- mov r1, #0x1
- add r0, #0x8
- str r0, [sp, #0x48]
-_02019BF6:
- ldr r0, [sp, #0x330]
- asr r0, r2
- tst r0, r1
- beq _02019C04
- ldr r0, [sp, #0x48]
- add r0, r0, #0x1
- str r0, [sp, #0x48]
-_02019C04:
- add r2, r2, #0x1
- cmp r2, #0x8
- blt _02019BF6
- ldr r0, [sp, #0x330]
- asr r0, r0, #0x8
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0xb8]
- mov r0, #0x0
- str r0, [sp, #0x20]
- ldr r0, [sp, #0x4]
- sub r0, #0x8
- cmp r0, #0x0
- bgt _02019C24
- bl FUN_0201A8BC
-_02019C24:
- ldr r0, [sp, #0x0]
- ldr r1, [sp, #0xb8]
- ldr r0, [r0, #0x0]
- ldr r2, [sp, #0x5c]
- str r0, [sp, #0x230]
- ldr r0, [sp, #0x20]
- asr r1, r0
- mov r0, #0x1
- and r0, r1
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x234]
- ldr r0, [sp, #0x8]
- mov r1, #0x0
- cmp r0, #0x0
- ble _02019CD8
- ble _02019CD8
- add r0, r2, #0x0
- lsl r3, r0, #0x2
- ldr r0, [sp, #0x48]
- ldr r6, [sp, #0x40]
- lsl r5, r0, #0x2
- ldr r0, =0x00003FE0
- add r7, r5, #0x0
- and r0, r5
- mul r6, r0
- mov r0, #0x1c
- and r7, r0
- ldr r0, [sp, #0x48]
- str r6, [sp, #0xb4]
- add r0, r0, #0x1
- lsl r6, r0, #0x2
- ldr r0, =0x00003FE0
- ldr r5, [sp, #0x40]
- and r0, r6
- mul r5, r0
- mov r0, #0x1c
- and r0, r6
- add r4, r1, #0x0
- str r5, [sp, #0xb0]
- str r0, [sp, #0xac]
-_02019C76:
- asr r5, r2, #0x1
- mov r0, #0x3
- and r5, r0
- ldr r0, [sp, #0x278]
- add r0, r0, r5
- ldr r5, =0x00003FE0
- and r5, r3
- add r5, r0, r5
- ldr r0, [sp, #0xb4]
- str r5, [sp, #0x2b0]
- add r0, r5, r0
- ldr r5, [sp, #0x230]
- add r6, r5, #0x0
- lsr r6, r4
- mov r5, #0xf
- and r5, r6
- lsl r5, r5, #0x18
- lsr r5, r5, #0x18
- beq _02019CCA
- lsl r6, r2, #0x1f
- lsr r6, r6, #0x1d
- lsl r5, r6
- str r5, [sp, #0x2b4]
- ldrb r5, [r0, r7]
- str r5, [sp, #0x2b8]
- mov r5, #0xf0
- asr r5, r6
- ldr r6, [sp, #0x2b8]
- and r6, r5
- ldr r5, [sp, #0x2b4]
- orr r5, r6
- lsl r5, r5, #0x18
- lsr r5, r5, #0x18
- strb r5, [r0, r7]
- ldr r0, [sp, #0x234]
- cmp r0, #0x0
- beq _02019CCA
- ldr r6, [sp, #0x2b0]
- ldr r0, [sp, #0xb0]
- add r6, r6, r0
- ldr r0, [sp, #0xac]
- strb r5, [r0, r6]
-_02019CCA:
- ldr r0, [sp, #0x8]
- add r1, r1, #0x1
- add r4, r4, #0x4
- add r3, r3, #0x4
- add r2, r2, #0x1
- cmp r1, r0
- blt _02019C76
-_02019CD8:
- ldr r0, [sp, #0x234]
- cmp r0, #0x0
- beq _02019CE6
- ldr r0, [sp, #0x48]
- add r0, r0, #0x2
- str r0, [sp, #0x48]
- b _02019CEC
-_02019CE6:
- ldr r0, [sp, #0x48]
- add r0, r0, #0x1
- str r0, [sp, #0x48]
-_02019CEC:
- ldr r0, [sp, #0x0]
- ldr r1, [sp, #0x4]
- add r0, r0, #0x4
- str r0, [sp, #0x0]
- ldr r0, [sp, #0x20]
- sub r1, #0x8
- add r0, r0, #0x1
- str r0, [sp, #0x20]
- cmp r0, r1
- blt _02019C24
- add sp, #0x1fc
- add sp, #0x118
- pop {r4-r7, pc}
-_02019D06:
- ldr r0, [sp, #0x0]
- str r0, [sp, #0x220]
- ldr r0, [sp, #0x48]
- str r0, [sp, #0x228]
- ldr r0, [sp, #0x330]
- lsl r0, r0, #0x18
- lsr r1, r0, #0x18
- mov r0, #0x0
- str r0, [sp, #0x22c]
- lsl r0, r1, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x3c]
- ldr r0, [sp, #0x58]
- mov r1, #0x7
- and r1, r0
- add r0, r0, r1
- asr r0, r0, #0x3
- str r0, [sp, #0x38]
-_02019D2A:
- ldr r0, [sp, #0x220]
- ldr r1, [sp, #0x3c]
- ldr r0, [r0, #0x0]
- ldr r2, [sp, #0x5c]
- str r0, [sp, #0x21c]
- ldr r0, [sp, #0x22c]
- ldr r6, [sp, #0x38]
- asr r1, r0
- mov r0, #0x1
- and r0, r1
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x224]
- add r0, r2, #0x0
- lsl r3, r0, #0x2
- ldr r0, [sp, #0x228]
- mov r1, #0x0
- lsl r5, r0, #0x2
- ldr r0, =0x00003FE0
- add r7, r5, #0x0
- and r0, r5
- mul r6, r0
- mov r0, #0x1c
- and r7, r0
- ldr r0, [sp, #0x228]
- str r6, [sp, #0xc4]
- add r0, r0, #0x1
- lsl r6, r0, #0x2
- ldr r0, =0x00003FE0
- ldr r5, [sp, #0x38]
- and r0, r6
- mul r5, r0
- mov r0, #0x1c
- and r0, r6
- str r3, [sp, #0x34]
- add r4, r1, #0x0
- str r5, [sp, #0xc0]
- str r0, [sp, #0xbc]
-_02019D76:
- asr r5, r2, #0x1
- mov r0, #0x3
- and r5, r0
- ldr r0, [sp, #0x278]
- add r0, r0, r5
- ldr r5, =0x00003FE0
- and r5, r3
- add r5, r0, r5
- ldr r0, [sp, #0xc4]
- str r5, [sp, #0x2bc]
- add r0, r5, r0
- ldr r5, [sp, #0x21c]
- add r6, r5, #0x0
- lsr r6, r4
- mov r5, #0xf
- and r5, r6
- lsl r5, r5, #0x18
- lsr r5, r5, #0x18
- beq _02019DCA
- lsl r6, r2, #0x1f
- lsr r6, r6, #0x1d
- lsl r5, r6
- str r5, [sp, #0x2c0]
- ldrb r5, [r0, r7]
- str r5, [sp, #0x2c4]
- mov r5, #0xf0
- asr r5, r6
- ldr r6, [sp, #0x2c4]
- and r6, r5
- ldr r5, [sp, #0x2c0]
- orr r5, r6
- lsl r5, r5, #0x18
- lsr r5, r5, #0x18
- strb r5, [r0, r7]
- ldr r0, [sp, #0x224]
- cmp r0, #0x0
- beq _02019DCA
- ldr r6, [sp, #0x2bc]
- ldr r0, [sp, #0xc0]
- add r6, r6, r0
- ldr r0, [sp, #0xbc]
- strb r5, [r0, r6]
-_02019DCA:
- add r1, r1, #0x1
- add r4, r4, #0x4
- add r3, r3, #0x4
- add r2, r2, #0x1
- cmp r1, #0x8
- blt _02019D76
- ldr r0, [sp, #0x224]
- cmp r0, #0x0
- beq _02019DE4
- ldr r0, [sp, #0x228]
- add r0, r0, #0x2
- str r0, [sp, #0x228]
- b _02019DEA
-_02019DE4:
- ldr r0, [sp, #0x228]
- add r0, r0, #0x1
- str r0, [sp, #0x228]
-_02019DEA:
- ldr r0, [sp, #0x220]
- add r0, r0, #0x4
- str r0, [sp, #0x220]
- ldr r0, [sp, #0x22c]
- add r0, r0, #0x1
- str r0, [sp, #0x22c]
- cmp r0, #0x8
- blt _02019D2A
- ldr r0, [sp, #0x0]
- str r0, [sp, #0x20c]
- add r0, #0x20
- str r0, [sp, #0x20c]
- ldr r0, [sp, #0x48]
- str r0, [sp, #0x214]
- mov r0, #0x0
- str r0, [sp, #0x218]
- ldr r0, [sp, #0x5c]
- str r0, [sp, #0xd4]
- add r0, #0x8
- str r0, [sp, #0xd4]
-_02019E12:
- ldr r0, [sp, #0x20c]
- ldr r1, [sp, #0x3c]
- ldr r0, [r0, #0x0]
- ldr r2, [sp, #0xd4]
- str r0, [sp, #0x208]
- ldr r0, [sp, #0x218]
- asr r1, r0
- mov r0, #0x1
- and r0, r1
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x210]
- ldr r0, [sp, #0x8]
- mov r1, #0x0
- str r0, [sp, #0x2c8]
- sub r0, #0x8
- str r0, [sp, #0x2c8]
- cmp r0, #0x0
- ble _02019ECC
- ble _02019ECC
- add r0, r2, #0x0
- lsl r3, r0, #0x2
- ldr r0, [sp, #0x214]
- ldr r6, [sp, #0x38]
- lsl r5, r0, #0x2
- ldr r0, =0x00003FE0
- add r7, r5, #0x0
- and r0, r5
- mul r6, r0
- mov r0, #0x1c
- and r7, r0
- ldr r0, [sp, #0x214]
- str r6, [sp, #0xd0]
- add r0, r0, #0x1
- lsl r6, r0, #0x2
- ldr r0, =0x00003FE0
- ldr r5, [sp, #0x38]
- and r0, r6
- mul r5, r0
- mov r0, #0x1c
- and r0, r6
- add r4, r1, #0x0
- str r5, [sp, #0xcc]
- str r0, [sp, #0xc8]
-_02019E6A:
- asr r5, r2, #0x1
- mov r0, #0x3
- and r5, r0
- ldr r0, [sp, #0x278]
- add r0, r0, r5
- ldr r5, =0x00003FE0
- and r5, r3
- add r5, r0, r5
- ldr r0, [sp, #0xd0]
- str r5, [sp, #0x2cc]
- add r0, r5, r0
- ldr r5, [sp, #0x208]
- add r6, r5, #0x0
- lsr r6, r4
- mov r5, #0xf
- and r5, r6
- lsl r5, r5, #0x18
- lsr r5, r5, #0x18
- beq _02019EBE
- lsl r6, r2, #0x1f
- lsr r6, r6, #0x1d
- lsl r5, r6
- str r5, [sp, #0x2d0]
- ldrb r5, [r0, r7]
- str r5, [sp, #0x2d4]
- mov r5, #0xf0
- asr r5, r6
- ldr r6, [sp, #0x2d4]
- and r6, r5
- ldr r5, [sp, #0x2d0]
- orr r5, r6
- lsl r5, r5, #0x18
- lsr r5, r5, #0x18
- strb r5, [r0, r7]
- ldr r0, [sp, #0x210]
- cmp r0, #0x0
- beq _02019EBE
- ldr r6, [sp, #0x2cc]
- ldr r0, [sp, #0xcc]
- add r6, r6, r0
- ldr r0, [sp, #0xc8]
- strb r5, [r0, r6]
-_02019EBE:
- ldr r0, [sp, #0x2c8]
- add r1, r1, #0x1
- add r4, r4, #0x4
- add r3, r3, #0x4
- add r2, r2, #0x1
- cmp r1, r0
- blt _02019E6A
-_02019ECC:
- ldr r0, [sp, #0x210]
- cmp r0, #0x0
- beq _02019EDA
- ldr r0, [sp, #0x214]
- add r0, r0, #0x2
- str r0, [sp, #0x214]
- b _02019EE0
-_02019EDA:
- ldr r0, [sp, #0x214]
- add r0, r0, #0x1
- str r0, [sp, #0x214]
-_02019EE0:
- ldr r0, [sp, #0x20c]
- add r0, r0, #0x4
- str r0, [sp, #0x20c]
- ldr r0, [sp, #0x218]
- add r0, r0, #0x1
- str r0, [sp, #0x218]
- cmp r0, #0x8
- blt _02019E12
- ldr r0, [sp, #0x0]
- mov r2, #0x0
- str r0, [sp, #0x1fc]
- add r0, #0x40
- str r0, [sp, #0x1fc]
- ldr r0, [sp, #0x48]
- mov r1, #0x1
- add r0, #0x8
- str r0, [sp, #0x48]
- str r0, [sp, #0x204]
-_02019F04:
- ldr r0, [sp, #0x330]
- asr r0, r2
- tst r0, r1
- beq _02019F12
- ldr r0, [sp, #0x204]
- add r0, r0, #0x1
- str r0, [sp, #0x204]
-_02019F12:
- add r2, r2, #0x1
- cmp r2, #0x8
- blt _02019F04
- ldr r0, [sp, #0x330]
- asr r0, r0, #0x8
- str r0, [sp, #0x50]
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0xe4]
- mov r0, #0x0
- str r0, [sp, #0x1c]
- ldr r0, [sp, #0x4]
- sub r0, #0x8
- cmp r0, #0x0
- ble _0201A008
-_02019F30:
- ldr r0, [sp, #0x1fc]
- ldr r1, [sp, #0xe4]
- ldr r0, [r0, #0x0]
- ldr r6, [sp, #0x38]
- str r0, [sp, #0x1f8]
- ldr r0, [sp, #0x1c]
- ldr r2, [sp, #0x5c]
- asr r1, r0
- mov r0, #0x1
- and r0, r1
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x200]
- ldr r0, [sp, #0x204]
- mov r1, #0x0
- lsl r5, r0, #0x2
- ldr r0, =0x00003FE0
- add r7, r5, #0x0
- and r0, r5
- mul r6, r0
- mov r0, #0x1c
- and r7, r0
- ldr r0, [sp, #0x204]
- str r6, [sp, #0xe0]
- add r0, r0, #0x1
- lsl r6, r0, #0x2
- ldr r0, =0x00003FE0
- ldr r5, [sp, #0x38]
- and r0, r6
- mul r5, r0
- mov r0, #0x1c
- and r0, r6
- ldr r3, [sp, #0x34]
- add r4, r1, #0x0
- str r5, [sp, #0xdc]
- str r0, [sp, #0xd8]
-_02019F78:
- asr r5, r2, #0x1
- mov r0, #0x3
- and r5, r0
- ldr r0, [sp, #0x278]
- add r0, r0, r5
- ldr r5, =0x00003FE0
-// b _02019F8C
-// nop
-// _02019F88: .word 0x00003FE0
-// _02019F8C:
- and r5, r3
- add r5, r0, r5
- ldr r0, [sp, #0xe0]
- str r5, [sp, #0x2d8]
- add r0, r5, r0
- ldr r5, [sp, #0x1f8]
- add r6, r5, #0x0
- lsr r6, r4
- mov r5, #0xf
- and r5, r6
- lsl r5, r5, #0x18
- lsr r5, r5, #0x18
- beq _02019FD4
- lsl r6, r2, #0x1f
- lsr r6, r6, #0x1d
- lsl r5, r6
- str r5, [sp, #0x2dc]
- ldrb r5, [r0, r7]
- str r5, [sp, #0x2e0]
- mov r5, #0xf0
- asr r5, r6
- ldr r6, [sp, #0x2e0]
- and r6, r5
- ldr r5, [sp, #0x2dc]
- orr r5, r6
- lsl r5, r5, #0x18
- lsr r5, r5, #0x18
- strb r5, [r0, r7]
- ldr r0, [sp, #0x200]
- cmp r0, #0x0
- beq _02019FD4
- ldr r6, [sp, #0x2d8]
- ldr r0, [sp, #0xdc]
- add r6, r6, r0
- ldr r0, [sp, #0xd8]
- strb r5, [r0, r6]
-_02019FD4:
- add r1, r1, #0x1
- add r4, r4, #0x4
- add r3, r3, #0x4
- add r2, r2, #0x1
- cmp r1, #0x8
- blt _02019F78
- ldr r0, [sp, #0x200]
- cmp r0, #0x0
- beq _02019FEE
- ldr r0, [sp, #0x204]
- add r0, r0, #0x2
- str r0, [sp, #0x204]
- b _02019FF4
-_02019FEE:
- ldr r0, [sp, #0x204]
- add r0, r0, #0x1
- str r0, [sp, #0x204]
-_02019FF4:
- ldr r0, [sp, #0x1fc]
- ldr r1, [sp, #0x4]
- add r0, r0, #0x4
- str r0, [sp, #0x1fc]
- ldr r0, [sp, #0x1c]
- sub r1, #0x8
- add r0, r0, #0x1
- str r0, [sp, #0x1c]
- cmp r0, r1
- blt _02019F30
-_0201A008:
- ldr r0, [sp, #0x0]
- mov r2, #0x0
- add r0, #0x60
- str r0, [sp, #0x0]
- mov r1, #0x1
-_0201A012:
- ldr r0, [sp, #0x330]
- asr r0, r2
- tst r0, r1
- beq _0201A020
- ldr r0, [sp, #0x48]
- add r0, r0, #0x1
- str r0, [sp, #0x48]
-_0201A020:
- add r2, r2, #0x1
- cmp r2, #0x8
- blt _0201A012
- ldr r0, [sp, #0x50]
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0xf4]
- mov r0, #0x0
- str r0, [sp, #0x18]
- ldr r0, [sp, #0x4]
- sub r0, #0x8
- cmp r0, #0x0
- bgt _0201A03E
- bl FUN_0201A8BC
-_0201A03E:
- ldr r0, [sp, #0x5c]
- add r0, #0x8
- str r0, [sp, #0x5c]
-_0201A044:
- ldr r0, [sp, #0x0]
- ldr r1, [sp, #0xf4]
- ldr r0, [r0, #0x0]
- ldr r2, [sp, #0x5c]
- str r0, [sp, #0x1f0]
- ldr r0, [sp, #0x18]
- asr r1, r0
- mov r0, #0x1
- and r0, r1
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x1f4]
- ldr r0, [sp, #0x8]
- mov r1, #0x0
- str r0, [sp, #0x2e4]
- sub r0, #0x8
- str r0, [sp, #0x2e4]
- cmp r0, #0x0
- ble _0201A0FE
- ble _0201A0FE
- add r0, r2, #0x0
- lsl r3, r0, #0x2
- ldr r0, [sp, #0x48]
- ldr r6, [sp, #0x38]
- lsl r5, r0, #0x2
- ldr r0, =0x00003FE0
- add r7, r5, #0x0
- and r0, r5
- mul r6, r0
- mov r0, #0x1c
- and r7, r0
- ldr r0, [sp, #0x48]
- str r6, [sp, #0xf0]
- add r0, r0, #0x1
- lsl r6, r0, #0x2
- ldr r0, =0x00003FE0
- ldr r5, [sp, #0x38]
- and r0, r6
- mul r5, r0
- mov r0, #0x1c
- and r0, r6
- add r4, r1, #0x0
- str r5, [sp, #0xec]
- str r0, [sp, #0xe8]
-_0201A09C:
- asr r5, r2, #0x1
- mov r0, #0x3
- and r5, r0
- ldr r0, [sp, #0x278]
- add r0, r0, r5
- ldr r5, =0x00003FE0
- and r5, r3
- add r5, r0, r5
- ldr r0, [sp, #0xf0]
- str r5, [sp, #0x2e8]
- add r0, r5, r0
- ldr r5, [sp, #0x1f0]
- add r6, r5, #0x0
- lsr r6, r4
- mov r5, #0xf
- and r5, r6
- lsl r5, r5, #0x18
- lsr r5, r5, #0x18
- beq _0201A0F0
- lsl r6, r2, #0x1f
- lsr r6, r6, #0x1d
- lsl r5, r6
- str r5, [sp, #0x2ec]
- ldrb r5, [r0, r7]
- mov r12, r5
- mov r5, #0xf0
- asr r5, r6
- mov r6, r12
- and r6, r5
- ldr r5, [sp, #0x2ec]
- orr r5, r6
- lsl r5, r5, #0x18
- lsr r5, r5, #0x18
- strb r5, [r0, r7]
- ldr r0, [sp, #0x1f4]
- cmp r0, #0x0
- beq _0201A0F0
- ldr r6, [sp, #0x2e8]
- ldr r0, [sp, #0xec]
- add r6, r6, r0
- ldr r0, [sp, #0xe8]
- strb r5, [r0, r6]
-_0201A0F0:
- ldr r0, [sp, #0x2e4]
- add r1, r1, #0x1
- add r4, r4, #0x4
- add r3, r3, #0x4
- add r2, r2, #0x1
- cmp r1, r0
- blt _0201A09C
-_0201A0FE:
- ldr r0, [sp, #0x1f4]
- cmp r0, #0x0
- beq _0201A10C
- ldr r0, [sp, #0x48]
- add r0, r0, #0x2
- str r0, [sp, #0x48]
- b _0201A112
-_0201A10C:
- ldr r0, [sp, #0x48]
- add r0, r0, #0x1
- str r0, [sp, #0x48]
-_0201A112:
- ldr r0, [sp, #0x0]
- ldr r1, [sp, #0x4]
- add r0, r0, #0x4
- str r0, [sp, #0x0]
- ldr r0, [sp, #0x18]
- sub r1, #0x8
- add r0, r0, #0x1
- str r0, [sp, #0x18]
- cmp r0, r1
- blt _0201A044
- add sp, #0x1fc
- add sp, #0x118
- pop {r4-r7, pc}
-
-FUN_0201A12C: // 0x0201A12C
- lsl r1, r2, #0x2
- mul r1, r3
- ldr r3, [r5, #0x0]
- ldrb r2, [r5, #0x9]
- ldr r0, [sp, #0x0]
- ldr r3, [r3, #0x0]
- lsl r1, r1, #0x3
- bl FUN_02018848
- str r0, [sp, #0x1ec]
- cmp r4, #0x3
- bhi _0201A21E
- add r0, r4, r4
- add r0, pc
- ldrh r0, [r0, #0x6]
- lsl r0, r0, #0x10
- asr r0, r0, #0x10
- add pc, r0
-_0201A150:
-
- lsl r6, r0, #0
- lsl r6, r1, #3
- lsl r0, r7, #9
- lsl r4, r3, #16
- // jump table (using 16-bit offset)
- // .short _0201A158 - _0201A150 - 2; case 0
- // .short _0201A220 - _0201A150 - 2; case 1
- // .short _0201A3CA - _0201A150 - 2; case 2
- // .short _0201A56E - _0201A150 - 2; case 3
-_0201A158:
- ldr r0, [sp, #0x330]
- ldr r7, [sp, #0x1ec]
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x10c]
- mov r0, #0x0
- str r0, [sp, #0x1e8]
- ldr r0, [sp, #0x4]
- cmp r0, #0x0
- ble _0201A21E
- ldr r0, [sp, #0x58]
- mov r1, #0x7
- and r1, r0
- add r0, r0, r1
- asr r0, r0, #0x3
- str r0, [sp, #0x108]
-_0201A178:
- ldr r1, [sp, #0x10c]
- ldr r0, [sp, #0x1e8]
- mov r4, #0x0
- asr r1, r0
- mov r0, #0x1
- and r0, r1
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x310]
- ldr r0, [sp, #0x8]
- ldr r5, [sp, #0x5c]
- cmp r0, #0x0
- ble _0201A1FC
- ble _0201A1FC
- add r0, r5, #0x0
- lsl r6, r0, #0x3
- ldr r0, [sp, #0x48]
- ldr r2, [sp, #0x108]
- lsl r1, r0, #0x3
- ldr r0, =0x00007FC0
- mov r3, #0x38
- and r0, r1
- mul r2, r0
- add r0, r1, #0x0
- and r0, r3
- str r0, [sp, #0x100]
- ldr r0, [sp, #0x48]
- str r2, [sp, #0x104]
- add r0, r0, #0x1
- lsl r1, r0, #0x3
- ldr r0, =0x00007FC0
- ldr r2, [sp, #0x108]
- and r0, r1
- mul r2, r0
- add r0, r1, #0x0
- and r0, r3
- str r2, [sp, #0xfc]
- str r0, [sp, #0xf8]
-_0201A1C4:
- mov r0, #0x7
- add r1, r5, #0x0
- and r1, r0
- ldr r0, [sp, #0x278]
- add r1, r0, r1
- ldr r0, =0x00007FC0
- and r0, r6
- add r3, r1, r0
- ldr r0, [sp, #0x104]
- ldrb r1, [r7, r4]
- add r2, r3, r0
- cmp r1, #0x0
- beq _0201A1F0
- ldr r0, [sp, #0x100]
- strb r1, [r2, r0]
- ldr r0, [sp, #0x310]
- cmp r0, #0x0
- beq _0201A1F0
- ldr r0, [sp, #0xfc]
- add r2, r3, r0
- ldr r0, [sp, #0xf8]
- strb r1, [r0, r2]
-_0201A1F0:
- ldr r0, [sp, #0x8]
- add r4, r4, #0x1
- add r6, #0x8
- add r5, r5, #0x1
- cmp r4, r0
- blt _0201A1C4
-_0201A1FC:
- ldr r0, [sp, #0x310]
- cmp r0, #0x0
- beq _0201A20A
- ldr r0, [sp, #0x48]
- add r0, r0, #0x2
- str r0, [sp, #0x48]
- b _0201A210
-_0201A20A:
- ldr r0, [sp, #0x48]
- add r0, r0, #0x1
- str r0, [sp, #0x48]
-_0201A210:
- ldr r0, [sp, #0x1e8]
- add r7, #0x8
- add r1, r0, #0x1
- ldr r0, [sp, #0x4]
- str r1, [sp, #0x1e8]
- cmp r1, r0
- blt _0201A178
-_0201A21E:
- b _0201A8B6
-_0201A220:
- ldr r0, [sp, #0x48]
- ldr r7, [sp, #0x1ec]
- str r0, [sp, #0x1e0]
- ldr r0, [sp, #0x330]
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x4c]
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x124]
- mov r0, #0x0
- str r0, [sp, #0x1e4]
- ldr r0, [sp, #0x4]
- cmp r0, #0x0
- ble _0201A2E6
- ldr r0, [sp, #0x58]
- mov r1, #0x7
- and r1, r0
- add r0, r0, r1
- asr r0, r0, #0x3
- str r0, [sp, #0x120]
-_0201A24A:
- ldr r1, [sp, #0x124]
- ldr r0, [sp, #0x1e4]
- ldr r5, [sp, #0x5c]
- asr r1, r0
- mov r0, #0x1
- and r0, r1
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x30c]
- add r0, r5, #0x0
- lsl r6, r0, #0x3
- ldr r0, [sp, #0x1e0]
- ldr r2, [sp, #0x120]
- lsl r1, r0, #0x3
- ldr r0, =0x00007FC0
- mov r3, #0x38
- and r0, r1
- mul r2, r0
- add r0, r1, #0x0
- and r0, r3
- str r0, [sp, #0x118]
- ldr r0, [sp, #0x1e0]
- str r2, [sp, #0x11c]
- add r0, r0, #0x1
- lsl r1, r0, #0x3
- ldr r0, =0x00007FC0
- ldr r2, [sp, #0x120]
- and r0, r1
- mul r2, r0
- add r0, r1, #0x0
- and r0, r3
- mov r4, #0x0
- str r2, [sp, #0x114]
- str r0, [sp, #0x110]
-_0201A28E:
- mov r0, #0x7
- add r1, r5, #0x0
- and r1, r0
- ldr r0, [sp, #0x278]
- add r1, r0, r1
- ldr r0, =0x00007FC0
- and r0, r6
- add r3, r1, r0
- ldr r0, [sp, #0x11c]
- ldrb r1, [r7, r4]
- add r2, r3, r0
- cmp r1, #0x0
- beq _0201A2BA
- ldr r0, [sp, #0x118]
- strb r1, [r2, r0]
- ldr r0, [sp, #0x30c]
- cmp r0, #0x0
- beq _0201A2BA
- ldr r0, [sp, #0x114]
- add r2, r3, r0
- ldr r0, [sp, #0x110]
- strb r1, [r0, r2]
-_0201A2BA:
- add r4, r4, #0x1
- add r6, #0x8
- add r5, r5, #0x1
- cmp r4, #0x8
- blt _0201A28E
- ldr r0, [sp, #0x30c]
- cmp r0, #0x0
- beq _0201A2D2
- ldr r0, [sp, #0x1e0]
- add r0, r0, #0x2
- str r0, [sp, #0x1e0]
- b _0201A2D8
-_0201A2D2:
- ldr r0, [sp, #0x1e0]
- add r0, r0, #0x1
- str r0, [sp, #0x1e0]
-_0201A2D8:
- ldr r0, [sp, #0x1e4]
- add r7, #0x8
- add r1, r0, #0x1
- ldr r0, [sp, #0x4]
- str r1, [sp, #0x1e4]
- cmp r1, r0
- blt _0201A24A
-_0201A2E6:
- ldr r0, [sp, #0x1ec]
- str r0, [sp, #0x308]
- add r0, #0x40
- str r0, [sp, #0x308]
- ldr r0, [sp, #0x4c]
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x13c]
- mov r0, #0x0
- str r0, [sp, #0x1dc]
- ldr r0, [sp, #0x4]
- cmp r0, #0x0
- ble _0201A3C8
- ldr r0, [sp, #0x5c]
- mov r1, #0x7
- add r0, #0x8
- str r0, [sp, #0x5c]
- ldr r0, [sp, #0x58]
- and r1, r0
- add r0, r0, r1
- asr r0, r0, #0x3
- str r0, [sp, #0x138]
-_0201A312:
- ldr r1, [sp, #0x13c]
- ldr r0, [sp, #0x1dc]
- ldr r7, [sp, #0x8]
- asr r1, r0
- mov r0, #0x1
- and r0, r1
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- sub r7, #0x8
- mov r4, #0x0
- str r0, [sp, #0x1d8]
- ldr r5, [sp, #0x5c]
- cmp r7, #0x0
- ble _0201A398
- ble _0201A398
- add r0, r5, #0x0
- lsl r6, r0, #0x3
- ldr r0, [sp, #0x48]
- ldr r2, [sp, #0x138]
- lsl r1, r0, #0x3
- ldr r0, =0x00007FC0
- mov r3, #0x38
- and r0, r1
- mul r2, r0
- add r0, r1, #0x0
- and r0, r3
- str r0, [sp, #0x130]
- ldr r0, [sp, #0x48]
- str r2, [sp, #0x134]
- add r0, r0, #0x1
- lsl r1, r0, #0x3
- ldr r0, =0x00007FC0
- ldr r2, [sp, #0x138]
- and r0, r1
- mul r2, r0
- add r0, r1, #0x0
- and r0, r3
- str r2, [sp, #0x12c]
- str r0, [sp, #0x128]
-_0201A360:
- mov r0, #0x7
- add r1, r5, #0x0
- and r1, r0
- ldr r0, [sp, #0x278]
- add r1, r0, r1
- ldr r0, =0x00007FC0
- and r0, r6
- add r3, r1, r0
- ldr r0, [sp, #0x134]
- add r2, r3, r0
- ldr r0, [sp, #0x308]
- ldrb r1, [r0, r4]
- cmp r1, #0x0
- beq _0201A38E
- ldr r0, [sp, #0x130]
- strb r1, [r2, r0]
- ldr r0, [sp, #0x1d8]
- cmp r0, #0x0
- beq _0201A38E
- ldr r0, [sp, #0x12c]
- add r2, r3, r0
- ldr r0, [sp, #0x128]
- strb r1, [r0, r2]
-_0201A38E:
- add r4, r4, #0x1
- add r6, #0x8
- add r5, r5, #0x1
- cmp r4, r7
- blt _0201A360
-_0201A398:
- ldr r0, [sp, #0x1d8]
- cmp r0, #0x0
- beq _0201A3B0
- ldr r0, [sp, #0x48]
- add r0, r0, #0x2
- str r0, [sp, #0x48]
- b _0201A3B6
-// nop
-// _0201A3A8: .word 0x00003FE0
-// _0201A3AC: .word 0x00007FC0
-_0201A3B0:
- ldr r0, [sp, #0x48]
- add r0, r0, #0x1
- str r0, [sp, #0x48]
-_0201A3B6:
- ldr r0, [sp, #0x308]
- add r0, #0x8
- str r0, [sp, #0x308]
- ldr r0, [sp, #0x1dc]
- add r1, r0, #0x1
- ldr r0, [sp, #0x4]
- str r1, [sp, #0x1dc]
- cmp r1, r0
- blt _0201A312
-_0201A3C8:
- b _0201A8B6
-_0201A3CA:
- ldr r0, [sp, #0x48]
- mov r1, #0x7
- str r0, [sp, #0x1d0]
- mov r0, #0x0
- str r0, [sp, #0x1d4]
- ldr r0, [sp, #0x330]
- ldr r7, [sp, #0x1ec]
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x150]
- ldr r0, [sp, #0x58]
- and r1, r0
- add r0, r0, r1
- asr r0, r0, #0x3
- str r0, [sp, #0x30]
-_0201A3E8:
- ldr r1, [sp, #0x150]
- ldr r0, [sp, #0x1d4]
- mov r4, #0x0
- asr r1, r0
- mov r0, #0x1
- and r0, r1
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x304]
- ldr r0, [sp, #0x8]
- ldr r5, [sp, #0x5c]
- cmp r0, #0x0
- ble _0201A46C
- ble _0201A46C
- add r0, r5, #0x0
- lsl r6, r0, #0x3
- ldr r0, [sp, #0x1d0]
- ldr r2, [sp, #0x30]
- lsl r1, r0, #0x3
- ldr r0, =0x00007FC0
- mov r3, #0x38
- and r0, r1
- mul r2, r0
- add r0, r1, #0x0
- and r0, r3
- str r0, [sp, #0x148]
- ldr r0, [sp, #0x1d0]
- str r2, [sp, #0x14c]
- add r0, r0, #0x1
- lsl r1, r0, #0x3
- ldr r0, =0x00007FC0
- ldr r2, [sp, #0x30]
- and r0, r1
- mul r2, r0
- add r0, r1, #0x0
- and r0, r3
- str r2, [sp, #0x144]
- str r0, [sp, #0x140]
-_0201A434:
- mov r0, #0x7
- add r1, r5, #0x0
- and r1, r0
- ldr r0, [sp, #0x278]
- add r1, r0, r1
- ldr r0, =0x00007FC0
- and r0, r6
- add r3, r1, r0
- ldr r0, [sp, #0x14c]
- ldrb r1, [r7, r4]
- add r2, r3, r0
- cmp r1, #0x0
- beq _0201A460
- ldr r0, [sp, #0x148]
- strb r1, [r2, r0]
- ldr r0, [sp, #0x304]
- cmp r0, #0x0
- beq _0201A460
- ldr r0, [sp, #0x144]
- add r2, r3, r0
- ldr r0, [sp, #0x140]
- strb r1, [r0, r2]
-_0201A460:
- ldr r0, [sp, #0x8]
- add r4, r4, #0x1
- add r6, #0x8
- add r5, r5, #0x1
- cmp r4, r0
- blt _0201A434
-_0201A46C:
- ldr r0, [sp, #0x304]
- cmp r0, #0x0
- beq _0201A47A
- ldr r0, [sp, #0x1d0]
- add r0, r0, #0x2
- str r0, [sp, #0x1d0]
- b _0201A480
-_0201A47A:
- ldr r0, [sp, #0x1d0]
- add r0, r0, #0x1
- str r0, [sp, #0x1d0]
-_0201A480:
- ldr r0, [sp, #0x1d4]
- add r7, #0x8
- add r0, r0, #0x1
- str r0, [sp, #0x1d4]
- cmp r0, #0x8
- blt _0201A3E8
- ldr r0, [sp, #0x48]
- ldr r7, [sp, #0x1ec]
- add r0, #0x8
- str r0, [sp, #0x48]
- add r7, #0x80
- mov r0, #0x0
- mov r2, #0x1
-_0201A49A:
- ldr r1, [sp, #0x330]
- asr r1, r0
- tst r1, r2
- beq _0201A4A8
- ldr r1, [sp, #0x48]
- add r1, r1, #0x1
- str r1, [sp, #0x48]
-_0201A4A8:
- add r0, r0, #0x1
- cmp r0, #0x8
- blt _0201A49A
- ldr r0, [sp, #0x330]
- asr r0, r0, #0x8
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x164]
- mov r0, #0x0
- str r0, [sp, #0x14]
- ldr r0, [sp, #0x4]
- sub r0, #0x8
- cmp r0, #0x0
- ble _0201A56C
-_0201A4C4:
- ldr r1, [sp, #0x164]
- ldr r0, [sp, #0x14]
- mov r4, #0x0
- asr r1, r0
- mov r0, #0x1
- and r0, r1
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x300]
- ldr r0, [sp, #0x8]
- ldr r5, [sp, #0x5c]
- cmp r0, #0x0
- ble _0201A548
- ble _0201A548
- add r0, r5, #0x0
- lsl r6, r0, #0x3
- ldr r0, [sp, #0x48]
- ldr r2, [sp, #0x30]
- lsl r1, r0, #0x3
- ldr r0, =0x00007FC0
- mov r3, #0x38
- and r0, r1
- mul r2, r0
- add r0, r1, #0x0
- and r0, r3
- str r0, [sp, #0x15c]
- ldr r0, [sp, #0x48]
- str r2, [sp, #0x160]
- add r0, r0, #0x1
- lsl r1, r0, #0x3
- ldr r0, =0x00007FC0
- ldr r2, [sp, #0x30]
- and r0, r1
- mul r2, r0
- add r0, r1, #0x0
- and r0, r3
- str r2, [sp, #0x158]
- str r0, [sp, #0x154]
-_0201A510:
- mov r0, #0x7
- add r1, r5, #0x0
- and r1, r0
- ldr r0, [sp, #0x278]
- add r1, r0, r1
- ldr r0, =0x00007FC0
- and r0, r6
- add r3, r1, r0
- ldr r0, [sp, #0x160]
- ldrb r1, [r7, r4]
- add r2, r3, r0
- cmp r1, #0x0
- beq _0201A53C
- ldr r0, [sp, #0x15c]
- strb r1, [r2, r0]
- ldr r0, [sp, #0x300]
- cmp r0, #0x0
- beq _0201A53C
- ldr r0, [sp, #0x158]
- add r2, r3, r0
- ldr r0, [sp, #0x154]
- strb r1, [r0, r2]
-_0201A53C:
- ldr r0, [sp, #0x8]
- add r4, r4, #0x1
- add r6, #0x8
- add r5, r5, #0x1
- cmp r4, r0
- blt _0201A510
-_0201A548:
- ldr r0, [sp, #0x300]
- cmp r0, #0x0
- beq _0201A556
- ldr r0, [sp, #0x48]
- add r0, r0, #0x2
- str r0, [sp, #0x48]
- b _0201A55C
-_0201A556:
- ldr r0, [sp, #0x48]
- add r0, r0, #0x1
- str r0, [sp, #0x48]
-_0201A55C:
- ldr r0, [sp, #0x14]
- ldr r1, [sp, #0x4]
- add r0, r0, #0x1
- sub r1, #0x8
- add r7, #0x8
- str r0, [sp, #0x14]
- cmp r0, r1
- blt _0201A4C4
-_0201A56C:
- b _0201A8B6
-_0201A56E:
- ldr r0, [sp, #0x48]
- ldr r7, [sp, #0x1ec]
- str r0, [sp, #0x1c8]
- ldr r0, [sp, #0x330]
- lsl r0, r0, #0x18
- lsr r1, r0, #0x18
- mov r0, #0x0
- str r0, [sp, #0x1cc]
- lsl r0, r1, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x2c]
- ldr r0, [sp, #0x58]
- mov r1, #0x7
- and r1, r0
- add r0, r0, r1
- asr r0, r0, #0x3
- str r0, [sp, #0x28]
-_0201A590:
- ldr r1, [sp, #0x2c]
- ldr r0, [sp, #0x1cc]
- ldr r5, [sp, #0x5c]
- asr r1, r0
- mov r0, #0x1
- and r0, r1
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x2fc]
- add r0, r5, #0x0
- lsl r6, r0, #0x3
- ldr r0, [sp, #0x1c8]
- ldr r2, [sp, #0x28]
- lsl r1, r0, #0x3
- ldr r0, =0x00007FC0
- mov r3, #0x38
- and r0, r1
- mul r2, r0
- add r0, r1, #0x0
- and r0, r3
- str r0, [sp, #0x170]
- ldr r0, [sp, #0x1c8]
- str r2, [sp, #0x174]
- add r0, r0, #0x1
- lsl r1, r0, #0x3
- ldr r0, =0x00007FC0
- ldr r2, [sp, #0x28]
- and r0, r1
- mul r2, r0
- add r0, r1, #0x0
- and r0, r3
- mov r4, #0x0
- str r6, [sp, #0x24]
- str r2, [sp, #0x16c]
- str r0, [sp, #0x168]
-_0201A5D6:
- mov r0, #0x7
- add r1, r5, #0x0
- and r1, r0
- ldr r0, [sp, #0x278]
- add r1, r0, r1
- ldr r0, =0x00007FC0
- and r0, r6
- add r3, r1, r0
- ldr r0, [sp, #0x174]
- ldrb r1, [r7, r4]
- add r2, r3, r0
- cmp r1, #0x0
- beq _0201A602
- ldr r0, [sp, #0x170]
- strb r1, [r2, r0]
- ldr r0, [sp, #0x2fc]
- cmp r0, #0x0
- beq _0201A602
- ldr r0, [sp, #0x16c]
- add r2, r3, r0
- ldr r0, [sp, #0x168]
- strb r1, [r0, r2]
-_0201A602:
- add r4, r4, #0x1
- add r6, #0x8
- add r5, r5, #0x1
- cmp r4, #0x8
- blt _0201A5D6
- ldr r0, [sp, #0x2fc]
- cmp r0, #0x0
- beq _0201A61A
- ldr r0, [sp, #0x1c8]
- add r0, r0, #0x2
- str r0, [sp, #0x1c8]
- b _0201A620
-_0201A61A:
- ldr r0, [sp, #0x1c8]
- add r0, r0, #0x1
- str r0, [sp, #0x1c8]
-_0201A620:
- ldr r0, [sp, #0x1cc]
- add r7, #0x8
- add r0, r0, #0x1
- str r0, [sp, #0x1cc]
- cmp r0, #0x8
- blt _0201A590
- ldr r0, [sp, #0x1ec]
- str r0, [sp, #0x2f8]
- add r0, #0x40
- str r0, [sp, #0x2f8]
- ldr r0, [sp, #0x48]
- str r0, [sp, #0x1c0]
- mov r0, #0x0
- str r0, [sp, #0x1c4]
- ldr r0, [sp, #0x5c]
- str r0, [sp, #0x188]
- add r0, #0x8
- str r0, [sp, #0x188]
-_0201A644:
- ldr r1, [sp, #0x2c]
- ldr r0, [sp, #0x1c4]
- ldr r7, [sp, #0x8]
- asr r1, r0
- mov r0, #0x1
- and r0, r1
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- sub r7, #0x8
- mov r4, #0x0
- str r0, [sp, #0x1bc]
- ldr r5, [sp, #0x188]
- cmp r7, #0x0
- ble _0201A6CA
- ble _0201A6CA
- add r0, r5, #0x0
- lsl r6, r0, #0x3
- ldr r0, [sp, #0x1c0]
- ldr r2, [sp, #0x28]
- lsl r1, r0, #0x3
- ldr r0, =0x00007FC0
- mov r3, #0x38
- and r0, r1
- mul r2, r0
- add r0, r1, #0x0
- and r0, r3
- str r0, [sp, #0x180]
- ldr r0, [sp, #0x1c0]
- str r2, [sp, #0x184]
- add r0, r0, #0x1
- lsl r1, r0, #0x3
- ldr r0, =0x00007FC0
- ldr r2, [sp, #0x28]
- and r0, r1
- mul r2, r0
- add r0, r1, #0x0
- and r0, r3
- str r2, [sp, #0x17c]
- str r0, [sp, #0x178]
-_0201A692:
- mov r0, #0x7
- add r1, r5, #0x0
- and r1, r0
- ldr r0, [sp, #0x278]
- add r1, r0, r1
- ldr r0, =0x00007FC0
- and r0, r6
- add r3, r1, r0
- ldr r0, [sp, #0x184]
- add r2, r3, r0
- ldr r0, [sp, #0x2f8]
- ldrb r1, [r0, r4]
- cmp r1, #0x0
- beq _0201A6C0
- ldr r0, [sp, #0x180]
- strb r1, [r2, r0]
- ldr r0, [sp, #0x1bc]
- cmp r0, #0x0
- beq _0201A6C0
- ldr r0, [sp, #0x17c]
- add r2, r3, r0
- ldr r0, [sp, #0x178]
- strb r1, [r0, r2]
-_0201A6C0:
- add r4, r4, #0x1
- add r6, #0x8
- add r5, r5, #0x1
- cmp r4, r7
- blt _0201A692
-_0201A6CA:
- ldr r0, [sp, #0x1bc]
- cmp r0, #0x0
- beq _0201A6D8
- ldr r0, [sp, #0x1c0]
- add r0, r0, #0x2
- str r0, [sp, #0x1c0]
- b _0201A6DE
-_0201A6D8:
- ldr r0, [sp, #0x1c0]
- add r0, r0, #0x1
- str r0, [sp, #0x1c0]
-_0201A6DE:
- ldr r0, [sp, #0x2f8]
- add r0, #0x8
- str r0, [sp, #0x2f8]
- ldr r0, [sp, #0x1c4]
- add r0, r0, #0x1
- str r0, [sp, #0x1c4]
- cmp r0, #0x8
- blt _0201A644
- ldr r0, [sp, #0x48]
- ldr r7, [sp, #0x1ec]
- add r0, #0x8
- add r7, #0x80
- str r0, [sp, #0x48]
- str r0, [sp, #0x1b8]
- mov r0, #0x0
- mov r2, #0x1
-_0201A6FE:
- ldr r1, [sp, #0x330]
- asr r1, r0
- tst r1, r2
- beq _0201A70C
- ldr r1, [sp, #0x1b8]
- add r1, r1, #0x1
- str r1, [sp, #0x1b8]
-_0201A70C:
- add r0, r0, #0x1
- cmp r0, #0x8
- blt _0201A6FE
- ldr r0, [sp, #0x330]
- asr r0, r0, #0x8
- str r0, [sp, #0x44]
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x19c]
- mov r0, #0x0
- str r0, [sp, #0x10]
- ldr r0, [sp, #0x4]
- sub r0, #0x8
- cmp r0, #0x0
- ble _0201A7CE
-_0201A72A:
- ldr r1, [sp, #0x19c]
- ldr r0, [sp, #0x10]
- ldr r2, [sp, #0x28]
- asr r1, r0
- mov r0, #0x1
- and r0, r1
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x2f4]
- ldr r0, [sp, #0x1b8]
- mov r3, #0x38
- lsl r1, r0, #0x3
- ldr r0, =0x00007FC0
-// b _0201A74C
-// nop
-// _0201A748: .word 0x00007FC0
-// _0201A74C:
- ldr r5, [sp, #0x5c]
- and r0, r1
- mul r2, r0
- add r0, r1, #0x0
- and r0, r3
- str r0, [sp, #0x194]
- ldr r0, [sp, #0x1b8]
- str r2, [sp, #0x198]
- add r0, r0, #0x1
- lsl r1, r0, #0x3
- ldr r0, =0x00007FC0
- ldr r2, [sp, #0x28]
- and r0, r1
- mul r2, r0
- add r0, r1, #0x0
- and r0, r3
- ldr r6, [sp, #0x24]
- mov r4, #0x0
- str r2, [sp, #0x190]
- str r0, [sp, #0x18c]
-_0201A774:
- mov r0, #0x7
- add r1, r5, #0x0
- and r1, r0
- ldr r0, [sp, #0x278]
- add r1, r0, r1
- ldr r0, =0x00007FC0
- and r0, r6
- add r3, r1, r0
- ldr r0, [sp, #0x198]
- ldrb r1, [r7, r4]
- add r2, r3, r0
- cmp r1, #0x0
- beq _0201A7A0
- ldr r0, [sp, #0x194]
- strb r1, [r2, r0]
- ldr r0, [sp, #0x2f4]
- cmp r0, #0x0
- beq _0201A7A0
- ldr r0, [sp, #0x190]
- add r2, r3, r0
- ldr r0, [sp, #0x18c]
- strb r1, [r0, r2]
-_0201A7A0:
- add r4, r4, #0x1
- add r6, #0x8
- add r5, r5, #0x1
- cmp r4, #0x8
- blt _0201A774
- ldr r0, [sp, #0x2f4]
- cmp r0, #0x0
- beq _0201A7B8
- ldr r0, [sp, #0x1b8]
- add r0, r0, #0x2
- str r0, [sp, #0x1b8]
- b _0201A7BE
-_0201A7B8:
- ldr r0, [sp, #0x1b8]
- add r0, r0, #0x1
- str r0, [sp, #0x1b8]
-_0201A7BE:
- ldr r0, [sp, #0x10]
- ldr r1, [sp, #0x4]
- add r0, r0, #0x1
- sub r1, #0x8
- add r7, #0x8
- str r0, [sp, #0x10]
- cmp r0, r1
- blt _0201A72A
-_0201A7CE:
- ldr r0, [sp, #0x1ec]
- mov r2, #0x0
- str r0, [sp, #0x2f0]
- add r0, #0xc0
- str r0, [sp, #0x2f0]
- mov r1, #0x1
-_0201A7DA:
- ldr r0, [sp, #0x330]
- asr r0, r2
- tst r0, r1
- beq _0201A7E8
- ldr r0, [sp, #0x48]
- add r0, r0, #0x1
- str r0, [sp, #0x48]
-_0201A7E8:
- add r2, r2, #0x1
- cmp r2, #0x8
- blt _0201A7DA
- ldr r0, [sp, #0x44]
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- str r0, [sp, #0x1b0]
- mov r0, #0x0
- str r0, [sp, #0xc]
- ldr r0, [sp, #0x4]
- sub r0, #0x8
- cmp r0, #0x0
- ble _0201A8B6
- ldr r0, [sp, #0x5c]
- add r0, #0x8
- str r0, [sp, #0x5c]
-_0201A808:
- ldr r1, [sp, #0x1b0]
- ldr r0, [sp, #0xc]
- ldr r7, [sp, #0x8]
- asr r1, r0
- mov r0, #0x1
- and r0, r1
- lsl r0, r0, #0x18
- lsr r0, r0, #0x18
- sub r7, #0x8
- mov r4, #0x0
- str r0, [sp, #0x1b4]
- ldr r5, [sp, #0x5c]
- cmp r7, #0x0
- ble _0201A88E
- ble _0201A88E
- add r0, r5, #0x0
- lsl r6, r0, #0x3
- ldr r0, [sp, #0x48]
- ldr r2, [sp, #0x28]
- lsl r1, r0, #0x3
- ldr r0, =0x00007FC0
- mov r3, #0x38
- and r0, r1
- mul r2, r0
- add r0, r1, #0x0
- and r0, r3
- str r0, [sp, #0x1a8]
- ldr r0, [sp, #0x48]
- str r2, [sp, #0x1ac]
- add r0, r0, #0x1
- lsl r1, r0, #0x3
- ldr r0, =0x00007FC0
- ldr r2, [sp, #0x28]
- and r0, r1
- mul r2, r0
- add r0, r1, #0x0
- and r0, r3
- str r2, [sp, #0x1a4]
- str r0, [sp, #0x1a0]
-_0201A856:
- mov r0, #0x7
- add r1, r5, #0x0
- and r1, r0
- ldr r0, [sp, #0x278]
- add r1, r0, r1
- ldr r0, =0x00007FC0
- and r0, r6
- add r3, r1, r0
- ldr r0, [sp, #0x1ac]
- add r2, r3, r0
- ldr r0, [sp, #0x2f0]
- ldrb r1, [r0, r4]
- cmp r1, #0x0
- beq _0201A884
- ldr r0, [sp, #0x1a8]
- strb r1, [r2, r0]
- ldr r0, [sp, #0x1b4]
- cmp r0, #0x0
- beq _0201A884
- ldr r0, [sp, #0x1a4]
- add r2, r3, r0
- ldr r0, [sp, #0x1a0]
- strb r1, [r0, r2]
-_0201A884:
- add r4, r4, #0x1
- add r6, #0x8
- add r5, r5, #0x1
- cmp r4, r7
- blt _0201A856
-_0201A88E:
- ldr r0, [sp, #0x1b4]
- cmp r0, #0x0
- beq _0201A89C
- ldr r0, [sp, #0x48]
- add r0, r0, #0x2
- str r0, [sp, #0x48]
- b _0201A8A2
-_0201A89C:
- ldr r0, [sp, #0x48]
- add r0, r0, #0x1
- str r0, [sp, #0x48]
-_0201A8A2:
- ldr r0, [sp, #0x2f0]
- ldr r1, [sp, #0x4]
- add r0, #0x8
- str r0, [sp, #0x2f0]
- ldr r0, [sp, #0xc]
- sub r1, #0x8
- add r0, r0, #0x1
- str r0, [sp, #0xc]
- cmp r0, r1
- blt _0201A808
-_0201A8B6:
- ldr r0, [sp, #0x1ec]
- bl FreeToHeap
-
-FUN_0201A8BC: // 0x0201A8BC
- add sp, #0x1fc
- add sp, #0x118
- pop {r4-r7, pc}
- // clang-format on
-}
-#endif
-
-THUMB_FUNC void ScrollWindow(struct Window *window, u32 param1, u8 param2, u8 param3)
-{
- if (window->unk00->unk08[window->unk04].unk1e == 0)
- {
- FUN_0201A8E8(window, param1, param2, param3);
- }
- else
- {
- FUN_0201A9D4(window, param1, param2, param3);
- }
-}
-
-THUMB_FUNC void FUN_0201A8E8(struct Window *window, u32 param1, u8 param2, u8 param3)
-{
- void *r2;
- int r5, r1, r3;
- int st4, stc;
- u32 st8;
- int i, j;
-
- r2 = window->unk0c;
- st4 = (param3 << 0x18) | (param3 << 0x10) | (param3 << 0x8) | param3;
- stc = window->height * window->width * 32;
- st8 = window->width;
-
- switch (param1)
- {
- case 0:
- for (i = 0; i < stc; i += 32)
- {
- r3 = param2;
- for (j = 0; j < 8; j++)
- {
- r5 = i + (j << 2);
- r1 = i + (int)(((st8 * (r3 & ~7)) | (r3 & 7)) << 2);
-
- if (r1 < stc)
- {
- *(u32 *)(r2 + r5) = *(u32 *)(r2 + r1);
- }
- else
- {
- *(u32 *)(r2 + r5) = (u32)st4;
- }
-
- r3++;
- }
- }
-
- break;
- case 1:
- r2 += stc - 4;
- for (i = 0; i < stc; i += 32)
- {
- r3 = param2;
- for (j = 0; j < 8; j++)
- {
- r5 = i + (j << 2);
- r1 = i + (int)(((st8 * (r3 & ~7)) | (r3 & 7)) << 2);
-
- if (r1 < stc)
- {
- *(u32 *)(r2 - r5) = *(u32 *)(r2 - r1);
- }
- else
- {
- *(u32 *)(r2 - r5) = (u32)st4;
- }
-
- r3++;
- }
- }
-
- break;
- case 2:
- case 3:
- break;
- }
-}
-
-THUMB_FUNC void FUN_0201A9D4(struct Window *window, u32 param1, u8 param2, u8 param3)
-{
-
- void *r2;
- int r5, r1, r3;
- int st4, stc;
- u32 st8;
- int i, j;
-
- r2 = (u8 *)window->unk0c;
- st4 = (param3 << 0x18) | (param3 << 0x10) | (param3 << 0x8) | param3;
- stc = window->height * window->width * 64;
- st8 = window->width;
-
- switch (param1)
- {
- case 0:
- for (i = 0; i < stc; i += 64)
- {
- r3 = param2;
- for (j = 0; j < 8; j++)
- {
- r5 = i + (j << 3);
- r1 = i + (int)(((st8 * (r3 & ~7)) | (r3 & 7)) << 3);
-
- if (r1 < stc)
- {
- *(u32 *)(r2 + r5) = *(u32 *)(r2 + r1);
- }
- else
- {
- *(u32 *)(r2 + r5) = (u32)st4;
- }
-
- r5 += 4;
- r1 += 4;
- if (r1 < stc + 4)
- {
- *(u32 *)(r2 + r5) = *(u32 *)(r2 + r1);
- }
- else
- {
- *(u32 *)(r2 + r5) = (u32)st4;
- }
-
- r3++;
- }
- }
-
- break;
- case 1:
- r2 += stc - 8;
- for (i = 0; i < stc; i += 64)
- {
- r3 = param2;
- for (j = 0; j < 8; j++)
- {
- r5 = i + (j << 3);
- r1 = i + (int)(((st8 * (r3 & ~7)) | (r3 & 7)) << 3);
-
- if (r1 < stc)
- {
- *(u32 *)(r2 - r5) = *(u32 *)(r2 - r1);
- }
- else
- {
- *(u32 *)(r2 - r5) = (u32)st4;
- }
-
- r5 -= 4;
- r1 -= 4;
- if (r1 < stc - 4)
- {
- *(u32 *)(r2 - r5) = *(u32 *)(r2 - r1);
- }
- else
- {
- *(u32 *)(r2 - r5) = (u32)st4;
- }
-
- r3++;
- }
- }
-
- break;
- case 2:
- case 3:
- break;
- }
-}
-
-THUMB_FUNC u8 FUN_0201AB08(struct Window *window)
-{
- return window->unk04;
-}
-
-THUMB_FUNC u8 GetWindowWidth(struct Window *window)
-{
- return window->width;
-}
-THUMB_FUNC u8 GetWindowHeight(struct Window *window)
-{
- return window->height;
-}
-THUMB_FUNC u8 FUN_0201AB14(struct Window *window)
-{
- return window->unk05;
-}
-THUMB_FUNC u8 FUN_0201AB18(struct Window *window)
-{
- return window->unk06;
-}
-THUMB_FUNC void FUN_0201AB1C(struct Window *window, u8 param1)
-{
- window->unk05 = param1;
-}
-THUMB_FUNC void FUN_0201AB20(struct Window *window, u8 param1)
-{
- window->unk06 = param1;
-}
-THUMB_FUNC void FUN_0201AB24(struct Window *window, u8 param1)
-{
- window->unk09 = param1;
-}
-
-THUMB_FUNC u32 FUN_0201AB28(struct Window *window, u32 heap_id, const char *path)
-{
- void *ptr = AllocAndReadFile(heap_id, path);
- window->unk00 = ptr;
- u32 st0;
- NNS_G2dGetUnpackedBGCharacterData(ptr, &st0);
-
- return st0;
-}
-
-THUMB_FUNC u32 FUN_0201AB44(struct Window *window, u32 heap_id, const char *path)
-{
- void *ptr = AllocAndReadFile(heap_id, path);
- window->unk00 = ptr;
- u32 st0;
- NNS_G2dGetUnpackedPaletteData(ptr, &st0);
-
- return st0;
-}
-
-THUMB_FUNC void FUN_0201AB60(struct UnkStruct_02016B94_2 *param0)
-{
- FUN_0201AC78(param0);
- FUN_0201AB78(param0);
-
- param0->unk04 = 0;
- param0->unk06 = 0;
-}
-
-THUMB_FUNC void FUN_0201AB78(struct UnkStruct_02016B94_2 *param0)
-{
- if ((param0->unk06 & 1) != 0)
- {
- FUN_02017D68(0, param0->unk08[0].unk08, param0->unk08[0].unk10 * 2, param0->unk08[0].unk0c);
- }
-
- if ((param0->unk06 & 2) != 0)
- {
- FUN_02017D68(1, param0->unk08[1].unk08, param0->unk08[1].unk10 * 2, param0->unk08[1].unk0c);
- }
-
- if ((param0->unk06 & 4) != 0)
- {
- FUN_02017D68(2, param0->unk08[2].unk08, param0->unk08[2].unk10 * 2, param0->unk08[2].unk0c);
- }
-
- if ((param0->unk06 & 8) != 0)
- {
- FUN_02017D68(3, param0->unk08[3].unk08, param0->unk08[3].unk10 * 2, param0->unk08[3].unk0c);
- }
-
- if ((param0->unk06 & 0x10) != 0)
- {
- FUN_02017D68(4, param0->unk08[4].unk08, param0->unk08[4].unk10 * 2, param0->unk08[4].unk0c);
- }
-
- if ((param0->unk06 & 0x20) != 0)
- {
- FUN_02017D68(5, param0->unk08[5].unk08, param0->unk08[5].unk10 * 2, param0->unk08[5].unk0c);
- }
-
- if ((param0->unk06 & 0x40) != 0)
- {
- FUN_02017D68(6, param0->unk08[6].unk08, param0->unk08[6].unk10 * 2, param0->unk08[6].unk0c);
- }
-
- if ((param0->unk06 & 0x80) != 0)
- {
- FUN_02017D68(7, param0->unk08[7].unk08, param0->unk08[7].unk10 * 2, param0->unk08[7].unk0c);
- }
-}
-
-THUMB_FUNC void FUN_0201AC68(struct UnkStruct_02016B94_2 *param0, u32 param1)
-{
- param0->unk06 |= 1 << param1;
-}
-
-THUMB_FUNC void FUN_0201AC78(struct UnkStruct_02016B94_2 *param0)
-{
- if ((param0->unk04 & 1) != 0)
- {
- reg_G2_BG0OFS = (u32)(
- (param0->unk08[0].unk14 & 0x1ff) | ((param0->unk08[0].unk18 << 0x10) & 0x1ff0000));
- }
-
- if ((param0->unk04 & 2) != 0)
- {
- reg_G2_BG1OFS = (u32)(
- (param0->unk08[1].unk14 & 0x1ff) | ((param0->unk08[1].unk18 << 0x10) & 0x1ff0000));
- }
-
- if ((param0->unk04 & 4) != 0)
- {
- if (param0->unk08[2].unk1c == 0)
- {
- reg_G2_BG2OFS = (u32)(
- (param0->unk08[2].unk14 & 0x1ff) | ((param0->unk08[2].unk18 << 0x10) & 0x1ff0000));
- }
- else
- {
- struct Mtx22 st38;
- MTX22_2DAffine(
- &st38, param0->unk08[2].unk20, param0->unk08[2].unk24, param0->unk08[2].unk28, 2);
- G2x_SetBGyAffine_(reg_G2_BG2P,
- &st38,
- param0->unk08[2].unk2c,
- param0->unk08[2].unk30,
- param0->unk08[2].unk14,
- param0->unk08[2].unk18);
- }
- }
-
- if ((param0->unk04 & 8) != 0)
- {
- if (param0->unk08[3].unk1c == 0)
- {
- reg_G2_BG3OFS = (u32)(
- (param0->unk08[3].unk14 & 0x1ff) | ((param0->unk08[3].unk18 << 0x10) & 0x1ff0000));
- }
- else
- {
- struct Mtx22 st28;
- MTX22_2DAffine(
- &st28, param0->unk08[3].unk20, param0->unk08[3].unk24, param0->unk08[3].unk28, 2);
- G2x_SetBGyAffine_(reg_G2_BG3P,
- &st28,
- param0->unk08[3].unk2c,
- param0->unk08[3].unk30,
- param0->unk08[3].unk14,
- param0->unk08[3].unk18);
- }
- }
-
- if ((param0->unk04 & 0x10) != 0)
- {
- reg_G2S_DB_BG0OFS = (u32)(
- (param0->unk08[4].unk14 & 0x1ff) | ((param0->unk08[4].unk18 << 0x10) & 0x1ff0000));
- }
-
- if ((param0->unk04 & 0x20) != 0)
- {
- reg_G2S_DB_BG1OFS = (u32)(
- (param0->unk08[5].unk14 & 0x1ff) | ((param0->unk08[5].unk18 << 0x10) & 0x1ff0000));
- }
-
- if ((param0->unk04 & 0x40) != 0)
- {
- if (param0->unk08[6].unk1c == 0)
- {
- reg_G2S_DB_BG2OFS = (u32)(
- (param0->unk08[6].unk14 & 0x1ff) | ((param0->unk08[6].unk18 << 0x10) & 0x1ff0000));
- }
- else
- {
- struct Mtx22 st18;
- MTX22_2DAffine(
- &st18, param0->unk08[6].unk20, param0->unk08[6].unk24, param0->unk08[6].unk28, 2);
- G2x_SetBGyAffine_(reg_G2S_DB_BG2P,
- &st18,
- param0->unk08[6].unk2c,
- param0->unk08[6].unk30,
- param0->unk08[6].unk14,
- param0->unk08[6].unk18);
- }
- }
-
- if ((param0->unk04 & 0x80) != 0)
- {
- if (param0->unk08[7].unk1c == 0)
- {
- reg_G2S_DB_BG3OFS = (u32)(
- (param0->unk08[7].unk14 & 0x1ff) | ((param0->unk08[7].unk18 << 0x10) & 0x1ff0000));
- }
- else
- {
- struct Mtx22 st08;
- MTX22_2DAffine(
- &st08, param0->unk08[7].unk20, param0->unk08[7].unk24, param0->unk08[7].unk28, 2);
- G2x_SetBGyAffine_(reg_G2S_DB_BG3P,
- &st08,
- param0->unk08[7].unk2c,
- param0->unk08[7].unk30,
- param0->unk08[7].unk14,
- param0->unk08[7].unk18);
- }
- }
-}
-
-THUMB_FUNC void FUN_0201AEE4(
- struct UnkStruct_02016B94_2 *param0, u32 param1, u32 param2, fx32 param3)
-{
- FUN_02017B8C(&param0->unk08[param1], param2, param3);
- param0->unk04 |= 1 << param1;
-}
-
-THUMB_FUNC void FUN_0201AF08(
- struct UnkStruct_02016B94_2 *param0, u32 param1, u32 param2, u16 param3)
-{
- FUN_0201AF2C(&param0->unk08[param1], param2, param3);
- param0->unk04 |= 1 << param1;
-}
-
-THUMB_FUNC void FUN_0201AF2C(struct UnkStruct_02016B94_2_sub *param0, u32 param1, u16 val)
-{
- switch (param1)
- {
- case 0:
- param0->unk20 = val;
- break;
- case 1:
- param0->unk20 += val;
- break;
- case 2:
- param0->unk20 -= val;
- break;
- }
-}
-
-THUMB_FUNC void FUN_0201AF50(
- struct UnkStruct_02016B94_2 *param0, u32 param1, u32 param2, fx32 param3)
-{
- FUN_0201AF74(&param0->unk08[param1], param2, param3);
- param0->unk04 |= 1 << param1;
-}
-
-THUMB_FUNC void FUN_0201AF74(struct UnkStruct_02016B94_2_sub *param0, u32 param1, fx32 val)
-{
- switch (param1 - 9)
- {
- case 0:
- param0->unk2c = val;
- break;
- case 1:
- param0->unk2c += val;
- break;
- case 2:
- param0->unk2c -= val;
- break;
- case 3:
- param0->unk30 = val;
- break;
- case 4:
- param0->unk30 += val;
- break;
- case 5:
- param0->unk30 -= val;
- break;
- }
-}
-
-THUMB_FUNC u32 FUN_0201AFBC(
- struct UnkStruct_02016B94_2 *param0, u8 param1, u8 param2, u8 param3, u16 *param4)
-{
- void *st18;
- u16 r6;
- u8 st14;
- u8 st10;
- u8 r5;
- u8 i;
-
- if (param0->unk08[param1].unk08 == NULL)
- {
- return 0;
- }
-
- r6 = FUN_02017FFC((u8)(param2 >> 3), (u8)(param3 >> 3), param0->unk08[param1].unk1d);
- st18 = FUN_020187B0(param1);
-
- st14 = (u8)(param2 & 7);
- st10 = (u8)(param3 & 7);
-
- if (param0->unk08[param1].unk1e == 0)
- {
- u16 *stc = param0->unk08[param1].unk08;
- u8 *ptr = AllocFromHeapAtEnd(param0->unk00, 0x40);
-
- st18 += ((stc[r6] & 0x3ff) << 5);
- for (i = 0; i < 0x20; i++)
- {
- ptr[(i << 1)] = (u8)(((u8 *)st18)[i] & 0xf);
- ptr[(i << 1) + 1] = (u8)(((u8 *)st18)[i] >> 4);
- }
-
- FUN_0201B118(param0, (u8)((stc[r6] >> 0xa) & 3), ptr);
-
- r5 = ptr[st14 + (st10 << 3)];
- FreeToHeap(ptr);
-
- if ((param4[0] & (1 << r5)) != 0)
- {
- return 1;
- }
- }
- else
- {
- if (param0->unk08[param1].unk1c != 1)
- {
- u16 *r4 = param0->unk08[param1].unk08;
- u8 *ptr = AllocFromHeapAtEnd(param0->unk00, 0x40);
-
- memcpy(ptr, st18 + ((r4[r6] & 0x3ff) << 6), 0x40);
-
- FUN_0201B118(param0, (u8)((r4[r6] >> 0xa) & 3), ptr);
-
- r5 = ptr[st14 + (st10 << 3)];
- FreeToHeap(ptr);
- }
- else
- {
- r5 = ((u8 *)st18)[(((u8 *)param0->unk08[param1].unk08)[r6] << 6) + st14 + (st10 << 3)];
- }
-
- while (TRUE)
- {
- if (param4[0] == 0xffff)
- {
- break;
- }
- if (r5 == (u8)(param4[0]))
- {
- return 1;
- }
- }
- }
- return 0;
-}
-
-THUMB_FUNC void FUN_0201B118(struct UnkStruct_02016B94_2 *param0, u8 param1, u8 *param2)
-{
- u8 i, j;
- if (param1 != 0)
- {
- u8 *ptr = AllocFromHeapAtEnd(param0->unk00, 0x40);
-
- if ((param1 & 1) != 0)
- {
- for (i = 0; i < 8; i++)
- {
- for (j = 0; j < 8; j++)
- {
- ptr[i * 8 + j] = param2[i * 8 + (7 - j)];
- }
- }
-
- memcpy(param2, ptr, 0x40);
- }
-
- if ((param1 & 2) != 0)
- {
- for (i = 0; i < 8; i++)
- {
- u8 *r3 = &ptr[i * 8];
- u8 *r2 = &param2[(7 - i) * 8];
- for (u32 j = 8; j > 0; j--)
- {
- *r3++ = *r2++;
- }
- }
-
- memcpy(param2, ptr, 0x40);
- }
-
- FreeToHeap(ptr);
- }
-}
diff --git a/arm9/src/unk_0202E29C.c b/arm9/src/unk_0202E29C.c
index 2b088d6f..52ee3143 100644
--- a/arm9/src/unk_0202E29C.c
+++ b/arm9/src/unk_0202E29C.c
@@ -432,7 +432,7 @@ THUMB_FUNC s32 FUN_0202E844(u32 param0)
count++;
}
- GF_AssertFail();
+ GF_ASSERT(0);
return 0;
}
diff --git a/arm9/src/unk_0202F150.c b/arm9/src/unk_0202F150.c
index ef9a6193..e5188db2 100644
--- a/arm9/src/unk_0202F150.c
+++ b/arm9/src/unk_0202F150.c
@@ -93,10 +93,7 @@ THUMB_FUNC u32 FUN_0202F150(u32 param0, u32 param1)
{
r4 = 1;
- if (UNK_021C59F4.unk04 == 0)
- {
- GF_AssertFail();
- }
+ GF_ASSERT(UNK_021C59F4.unk04 != 0);
}
UNK_021C59F4.unk04->unk65C = 0;
@@ -1191,7 +1188,7 @@ THUMB_FUNC void FUN_020304D4(u32 param0)
return;
}
- GF_AssertFail();
+ GF_ASSERT(0);
}
THUMB_FUNC void FUN_020304F0(u32 param0)
@@ -1202,7 +1199,7 @@ THUMB_FUNC void FUN_020304F0(u32 param0)
return;
}
- GF_AssertFail();
+ GF_ASSERT(0);
}
THUMB_FUNC void FUN_0203050C()
@@ -1741,7 +1738,7 @@ THUMB_FUNC u32 FUN_02030B3C(u32 param0, u8 *param1, u32 param2)
{
if (FUN_02031190() != 0)
{
- GF_AssertFail();
+ GF_ASSERT(0);
return 0;
}