summaryrefslogtreecommitdiff
path: root/arm9/src
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/src')
-rw-r--r--arm9/src/GX_layers.c37
-rw-r--r--arm9/src/bag.c25
-rw-r--r--arm9/src/bag_view.c210
-rw-r--r--arm9/src/bg_window.c5456
-rw-r--r--arm9/src/error_message_reset.c121
-rw-r--r--arm9/src/filesystem.c30
-rw-r--r--arm9/src/game_init.c284
-rw-r--r--arm9/src/gf_gfx_loader.c42
-rw-r--r--arm9/src/heap.c363
-rw-r--r--arm9/src/mail_message.c13
-rw-r--r--arm9/src/main.c13
-rw-r--r--arm9/src/options.c6
-rw-r--r--arm9/src/player_data.c4
-rw-r--r--arm9/src/poke_overlay.c19
-rw-r--r--arm9/src/render_text.c502
-rw-r--r--arm9/src/scrcmd.c14
-rw-r--r--arm9/src/scrcmd_18_c.c22
-rw-r--r--arm9/src/scrcmd_24.c140
-rw-r--r--arm9/src/scrcmd_party.c815
-rw-r--r--arm9/src/scrcmd_sound.c5
-rw-r--r--arm9/src/script.c2
-rw-r--r--arm9/src/script_pokemon_util.c2
-rw-r--r--arm9/src/text_02054590.c33
-rw-r--r--arm9/src/timer3.c46
-rw-r--r--arm9/src/unk_0200BB14.c44
-rw-r--r--arm9/src/unk_02016B94.c8110
-rw-r--r--arm9/src/unk_0201B8B8.c4
-rw-r--r--arm9/src/unk_0202E29C.c2
-rw-r--r--arm9/src/unk_0202F150.c13
-rw-r--r--arm9/src/unk_02031734.c46
-rw-r--r--arm9/src/unk_0205EC84.c436
-rw-r--r--arm9/src/unk_0206015C.c6
-rw-r--r--arm9/src/unk_020851B8.c45
-rw-r--r--arm9/src/unk_02085338.c165
-rw-r--r--arm9/src/unk_02088AAC.c185
35 files changed, 8422 insertions, 8838 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/bag.c b/arm9/src/bag.c
index 57609a8f..506f3ec1 100644
--- a/arm9/src/bag.c
+++ b/arm9/src/bag.c
@@ -296,40 +296,37 @@ void SortPocket(struct ItemSlot * slots, u32 count)
}
}
-extern struct BagView * BagView_new(u8 heap_id);
-extern void BagView_setitem(struct BagView * view, struct ItemSlot * slot, u8 pocket, u8 idx);
-
struct BagView * CreateBagView(struct Bag * bag, const u8 * pockets, u32 heap_id)
{
- struct BagView * view = BagView_new((u8)heap_id);
- int i;
- for (i = 0; pockets[i] != 0xFF; i++)
+ struct BagView * view = BagView_New((u8)heap_id);
+
+ for (u32 i = 0; pockets[i] != 0xFF; i++)
{
switch (pockets[i])
{
case POCKET_KEY_ITEMS:
- BagView_setitem(view, bag->keyItems, POCKET_KEY_ITEMS, (u8)i);
+ BagView_SetItem(view, bag->keyItems, POCKET_KEY_ITEMS, (u8)i);
break;
case POCKET_ITEMS:
- BagView_setitem(view, bag->items, POCKET_ITEMS, (u8)i);
+ BagView_SetItem(view, bag->items, POCKET_ITEMS, (u8)i);
break;
case POCKET_BERRIES:
- BagView_setitem(view, bag->berries, POCKET_BERRIES, (u8)i);
+ BagView_SetItem(view, bag->berries, POCKET_BERRIES, (u8)i);
break;
case POCKET_MEDICINE:
- BagView_setitem(view, bag->medicine, POCKET_MEDICINE, (u8)i);
+ BagView_SetItem(view, bag->medicine, POCKET_MEDICINE, (u8)i);
break;
case POCKET_BALLS:
- BagView_setitem(view, bag->balls, POCKET_BALLS, (u8)i);
+ BagView_SetItem(view, bag->balls, POCKET_BALLS, (u8)i);
break;
case POCKET_BATTLE_ITEMS:
- BagView_setitem(view, bag->battleItems, POCKET_BATTLE_ITEMS, (u8)i);
+ BagView_SetItem(view, bag->battleItems, POCKET_BATTLE_ITEMS, (u8)i);
break;
case POCKET_MAIL:
- BagView_setitem(view, bag->mail, POCKET_MAIL, (u8)i);
+ BagView_SetItem(view, bag->mail, POCKET_MAIL, (u8)i);
break;
case POCKET_TMHMS:
- BagView_setitem(view, bag->TMsHMs, POCKET_TMHMS, (u8)i);
+ BagView_SetItem(view, bag->TMsHMs, POCKET_TMHMS, (u8)i);
break;
}
}
diff --git a/arm9/src/bag_view.c b/arm9/src/bag_view.c
new file mode 100644
index 00000000..31d53861
--- /dev/null
+++ b/arm9/src/bag_view.c
@@ -0,0 +1,210 @@
+#include "global.h"
+#include "bag_view.h"
+#include "coins.h"
+#include "constants/items.h"
+#include "heap.h"
+#include "msgdata.h"
+#include "player_data.h"
+#include "script_buffers.h"
+#include "seal.h"
+#include "unk_0202A1E0.h"
+
+extern u32 *FUN_0202708C(u32 *);
+extern u32 FUN_02027168(u32 *);
+extern u16 FUN_02027184(u32 *);
+extern u32 *FUN_02027E24(struct SaveBlock2 *sav2);
+extern u8 FUN_02029E2C(struct SealCase *, u32);
+
+THUMB_FUNC struct BagView *BagView_New(u8 heap_id)
+{
+ struct BagView *ptr = AllocFromHeap(heap_id, sizeof(struct BagView));
+
+ memset(ptr, 0, sizeof(struct BagView));
+
+ return ptr;
+}
+
+THUMB_FUNC u32 BagView_sizeof()
+{
+ return sizeof(struct BagView);
+}
+
+THUMB_FUNC void FUN_0206E30C(struct BagView *bag_view, u8 r1)
+{
+ bag_view->unk65 = r1;
+}
+
+THUMB_FUNC void FUN_0206E314(
+ struct BagView *bag_view, struct SaveBlock2 *sav2, u8 r2, struct UnkStruct_0206F164 *r3)
+{
+ FUN_0206E30C(bag_view, r2);
+
+ bag_view->sav2 = sav2;
+ bag_view->unk6C = r3;
+ bag_view->unk66 = 0;
+}
+
+THUMB_FUNC void BagView_SetItem(struct BagView *bag_view, struct ItemSlot *slot, u8 pocket, u8 idx)
+{
+ bag_view->slots[idx].slot = slot;
+ bag_view->slots[idx].pocket = pocket;
+}
+
+THUMB_FUNC void FUN_0206E340(struct BagView *bag_view)
+{
+ bag_view->unk76 = 1;
+}
+
+THUMB_FUNC void FUN_0206E354(struct BagView *bag_view, u32 r1)
+{
+ bag_view->unk70 = r1;
+}
+
+THUMB_FUNC void FUN_0206E358(struct BagView *bag_view, u8 r1)
+{
+ bag_view->unk74 = r1;
+}
+
+THUMB_FUNC void FUN_0206E360(struct BagView *bag_view, u16 r1)
+{
+ bag_view->unk76_2 = r1;
+}
+
+THUMB_FUNC u16 FUN_0206E37C(struct BagView *bag_view)
+{
+ return bag_view->unk66;
+}
+
+THUMB_FUNC u16 FUN_0206E384(struct BagView *bag_view)
+{
+ return bag_view->unk68;
+}
+
+THUMB_FUNC u8 FUN_0206E38C(struct BagView *bag_view)
+{
+ return bag_view->unk74;
+}
+
+THUMB_FUNC u8 FUN_0206E394(struct BagView *bag_view)
+{
+ return bag_view->unk75;
+}
+
+THUMB_FUNC u32 FUN_0206E39C(struct SaveBlock2 *sav2)
+{
+ return (u32)CheckCoins(Sav2_PlayerData_GetCoinsAddr(sav2));
+}
+
+THUMB_FUNC u32 FUN_0206E3A8(struct SaveBlock2 *sav2)
+{
+ struct SealCase *seal_case = Sav2_SealCase_get(sav2);
+ u32 i;
+ u32 count = 0;
+
+ for (i = 1; i <= 0x50; ++i)
+ {
+ count += FUN_02029E2C(seal_case, i);
+ }
+
+ return count;
+}
+
+THUMB_FUNC u32 FUN_0206E3C8(struct SaveBlock2 *sav2)
+{
+ return FUN_02027168(FUN_0202708C(FUN_02027E24(sav2)));
+}
+
+THUMB_FUNC u32 FUN_0206E3D8(struct SaveBlock2 *sav2)
+{
+ return FUN_02027184(FUN_0202708C(FUN_02027E24(sav2)));
+}
+
+THUMB_FUNC u32 FUN_0206E3E8(struct SaveBlock2 *sav2)
+{
+ return SaveStruct23_Substruct2_SetField_0x0(SaveStruct23_GetSubstruct2(sav2), 0, DATA_GET);
+}
+
+THUMB_FUNC BOOL FUN_0206E3F8(struct SaveBlock2 *sav2, struct String *dest, u32 item_id, u32 heap_id)
+{
+ struct MsgData *msgData = NewMsgDataFromNarc(0, NARC_MSGDATA_MSG, 7, heap_id);
+ struct ScrStrBufs *scrStrBufs = ScrStrBufs_new(heap_id);
+ struct String *string;
+
+ if (item_id == ITEM_NONE)
+ {
+ string = NewString_ReadMsgData(msgData, 0x63);
+ }
+ else if (item_id == ITEM_POINT_CARD)
+ {
+ string = NewString_ReadMsgData(msgData, 0x61);
+
+ BufferIntegerAsString(scrStrBufs, 0, FUN_0206E3E8(sav2), 4, 0, TRUE);
+ }
+ else if (item_id == ITEM_SEAL_CASE)
+ {
+ string = NewString_ReadMsgData(msgData, 0x5C);
+
+ BufferIntegerAsString(scrStrBufs, 0, FUN_0206E3A8(sav2), 4, 0, TRUE);
+ }
+ else if (item_id == ITEM_FASHION_CASE)
+ {
+ string = NewString_ReadMsgData(msgData, 0x5D);
+
+ BufferIntegerAsString(scrStrBufs, 0, FUN_0206E3C8(sav2), 3, 0, TRUE);
+ BufferIntegerAsString(scrStrBufs, 1, FUN_0206E3D8(sav2), 2, 0, TRUE);
+ }
+ else if (item_id == ITEM_COIN_CASE)
+ {
+ string = NewString_ReadMsgData(msgData, 0x39);
+
+ BufferIntegerAsString(scrStrBufs, 0, FUN_0206E39C(sav2), 5, 0, TRUE);
+ }
+ else
+ {
+ ScrStrBufs_delete(scrStrBufs);
+ DestroyMsgData(msgData);
+
+ return FALSE;
+ }
+
+ StringExpandPlaceholders(scrStrBufs, dest, string);
+ String_dtor(string);
+ ScrStrBufs_delete(scrStrBufs);
+ DestroyMsgData(msgData);
+
+ return TRUE;
+}
+
+THUMB_FUNC void FUN_0206E51C(
+ struct PlayerData *playerData, struct String *dest, u32 r2, u32 r3, u32 heap_id)
+{
+#pragma unused(r2)
+ struct MsgData *msgData;
+
+ switch (r3)
+ {
+ case 1:
+ msgData = NewMsgDataFromNarc(1, NARC_MSGDATA_MSG, 7, heap_id);
+
+ ReadMsgDataIntoString(msgData, 0x38, dest);
+ DestroyMsgData(msgData);
+ return;
+ case 2:
+ msgData = NewMsgDataFromNarc(1, NARC_MSGDATA_MSG, 7, heap_id);
+
+ ReadMsgDataIntoString(msgData, 0x6F, dest);
+ DestroyMsgData(msgData);
+ return;
+ default:
+ msgData = NewMsgDataFromNarc(1, NARC_MSGDATA_MSG, 0xC7, heap_id);
+ struct ScrStrBufs *scrStrBufs = ScrStrBufs_new(heap_id);
+ struct String *src = NewString_ReadMsgData(msgData, 0x24);
+
+ BufferPlayersName(scrStrBufs, 0, playerData);
+ StringExpandPlaceholders(scrStrBufs, dest, src);
+ String_dtor(src);
+ ScrStrBufs_delete(scrStrBufs);
+ DestroyMsgData(msgData);
+ return;
+ }
+}
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 28627d6b..e0d01bde 100644
--- a/arm9/src/error_message_reset.c
+++ b/arm9/src/error_message_reset.c
@@ -1,25 +1,48 @@
#include "error_message_reset.h"
#include "GX_layers.h"
+#include "gx.h"
#include "unk_02031734.h"
#include "unk_0202F150.h"
-#include "unk_02016B94.h"
-
-
-
-const struct UnkStruct_02016B94_4 UNK_020FF49C = { 0, 3, 3, 0x1a, 0x12, 1, 0x23 };
-
-const u32 UNK_020FF4A4[2] = { 0x00020000, 0x00000000 };
-
-const struct GraphicsModes UNK_020FF4AC = { mode1 : 1 };
-
-const struct UnkStruct_02016B94_1 UNK_020FF4BC = { 0, 0, 0x800, 0, 1, 0, 0, 6, 0, 1, 0, 0, 0 };
-
-const struct GraphicsBanks UNK_020FF4D8 = { bg : 3 };
+#include "bg_window.h"
+#include "PAD_pad.h"
+
+
+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 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 };
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);
@@ -27,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)
@@ -44,13 +66,13 @@ THUMB_FUNC void PrintErrorMessageAndReset()
OS_SetArenaHi(OS_ARENA_MAIN, OS_GetInitArenaHi(OS_ARENA_MAIN));
OS_SetArenaLo(OS_ARENA_MAIN, OS_GetInitArenaLo(OS_ARENA_MAIN));
- FUN_020166C8((u32 *)UNK_020FF4A4, 1, 1, 0);
+ InitHeapSystem(UNK_020FF4A4, NELEMS(UNK_020FF4A4), 1, 0);
FUN_0200E3A0(PM_LCD_TOP, 0);
FUN_0200E3A0(PM_LCD_BOTTOM, 0);
- OS_DisableIrqMask(1);
- OS_SetIrqFunction(1, &VBlankHandler);
- OS_EnableIrqMask(1);
+ OS_DisableIrqMask(OS_IE_V_BLANK);
+ OS_SetIrqFunction(OS_IE_V_BLANK, &VBlankHandler);
+ OS_EnableIrqMask(OS_IE_V_BLANK);
Main_SetVBlankIntrCB(NULL, NULL);
@@ -58,38 +80,39 @@ THUMB_FUNC void PrintErrorMessageAndReset()
GX_DisableEngineALayers();
GX_DisableEngineBLayers();
- reg_GX_DISPCNT &= 0xFFFFE0FF;
- reg_GXS_DB_DISPCNT &= 0xFFFFE0FF;
+ GX_SetVisiblePlane(0);
+ GXS_SetVisiblePlane(0);
- FUN_0201669C(4, 8);
+ SetKeyRepeatTimers(4, 8);
gMain.unk65 = 0;
GX_SwapDisplay();
- reg_G2_BLDCNT = 0;
- reg_G2S_DB_BLDCNT = 0;
- reg_GX_DISPCNT &= 0xFFFF1FFF;
- reg_GXS_DB_DISPCNT &= 0xFFFF1FFF;
+ 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);
@@ -104,28 +127,26 @@ THUMB_FUNC void PrintErrorMessageAndReset()
FUN_0200A274(0, 0x3f, 3);
FUN_02032DAC();
- lid:
- HandleDSLidAction();
- FUN_0202FB80();
- if (!FUN_02033678())
+ while (1)
{
- OS_WaitIrq(1, 1);
- goto lid;
+ HandleDSLidAction();
+ FUN_0202FB80();
+ if (FUN_02033678())
+ break;
+ OS_WaitIrq(TRUE, OS_IE_V_BLANK);
}
-
- lid2:
- HandleDSLidAction();
- if (!((u16)(((reg_PAD_KEYINPUT | *(vu16 *)HW_BUTTON_XY_BUF) ^ 0x2FFF) & 0x2FFF) & 1))
+ while (1)
{
- OS_WaitIrq(1, 1);
- goto lid2;
+ HandleDSLidAction();
+ if ((PAD_Read() & PAD_BUTTON_A))
+ break;
+ OS_WaitIrq(TRUE, OS_IE_V_BLANK);
}
-
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/game_init.c b/arm9/src/game_init.c
index 64ea7a54..1c6098ea 100644
--- a/arm9/src/game_init.c
+++ b/arm9/src/game_init.c
@@ -10,6 +10,7 @@
#include "game_init.h"
#include "registers.h"
#include "heap.h"
+#include "OS_interrupt.h"
#pragma thumb on
@@ -30,11 +31,11 @@ OS_DTCM;
static struct {
void * contents;
u32 name_hash;
-} UNK_021C4928[128];
+} sFileCache[128];
struct Main gMain;
-void Main_HBlankIntr(BOOL);
+void Main_ToggleHBlankInterrupt(BOOL enableFlag);
void FUN_0201B5CC(void *);
void FUN_02015EA0(void)
@@ -66,7 +67,7 @@ void Main_SetVBlankIntrCB(void (*a0)(void *), void * a1)
void FUN_02015F1C(void)
{
- Main_HBlankIntr(FALSE);
+ Main_ToggleHBlankInterrupt(FALSE);
gMain.hBlankIntr = NULL;
gMain.hBlankIntrArg = NULL;
}
@@ -75,7 +76,7 @@ BOOL FUN_02015F34(void (*a0)(void *), void * a1)
{
if (a0 == 0)
{
- Main_HBlankIntr(FALSE);
+ Main_ToggleHBlankInterrupt(FALSE);
gMain.hBlankIntr = NULL;
gMain.hBlankIntrArg = NULL;
return TRUE;
@@ -84,7 +85,7 @@ BOOL FUN_02015F34(void (*a0)(void *), void * a1)
{
gMain.hBlankIntrArg = a1;
gMain.hBlankIntr = a0;
- Main_HBlankIntr(TRUE);
+ Main_ToggleHBlankInterrupt(TRUE);
return TRUE;
}
else
@@ -93,36 +94,36 @@ BOOL FUN_02015F34(void (*a0)(void *), void * a1)
}
}
-void FUN_02015F6C(void)
+void Main_CallHBlankCallback(void)
{
if (gMain.hBlankIntr != NULL)
gMain.hBlankIntr(gMain.hBlankIntrArg);
}
-void Main_HBlankIntr(BOOL a0)
+void Main_ToggleHBlankInterrupt(BOOL enableFlag)
{
(void)OS_DisableIrq();
- if (!a0)
+ if (!enableFlag)
{
(void)OS_GetIrqMask();
- OS_DisableIrqMask(2);
+ OS_DisableIrqMask(OS_IE_H_BLANK);
GX_HBlankIntr(FALSE);
}
else
{
(void)OS_GetIrqMask();
- OS_SetIrqFunction(2, FUN_02015F6C);
- OS_EnableIrqMask(2);
+ OS_SetIrqFunction(OS_IE_H_BLANK, Main_CallHBlankCallback);
+ OS_EnableIrqMask(OS_IE_H_BLANK);
GX_HBlankIntr(TRUE);
}
(void)OS_EnableIrq();
}
-const u32 UNK_020EDB10[][2] = {
- { 0x0000D000, 0x00000000 },
- { 0x00021000, 0x00000000 },
- { 0x00001000, 0x00000000 },
- { 0x0010D800, 0x00000000 }
+const struct HeapParam UNK_020EDB10[] = {
+ { 0x00D000, OS_ARENA_MAIN },
+ { 0x021000, OS_ARENA_MAIN },
+ { 0x001000, OS_ARENA_MAIN },
+ { 0x10D800, OS_ARENA_MAIN }
};
void FUN_02015FC8(void)
@@ -136,12 +137,12 @@ void FUN_02015FC8(void)
{
csum += digest[i];
}
- csum = (csum << 24) >> 24;
+ csum %= 256;
while (csum & 3)
{
csum++;
}
- FUN_020166C8((u32 *)UNK_020EDB10, 4, 92, csum);
+ InitHeapSystem(UNK_020EDB10, NELEMS(UNK_020EDB10), 92, csum);
}
void InitSystemForTheGame(void)
@@ -189,7 +190,7 @@ void InitGraphicMemory(void)
MI_CpuClearFast((void *)HW_DB_PLTT, HW_DB_PLTT_SIZE);
}
-void * FUN_020161A4(u32 heap_id, const char * path)
+void * AllocAndReadFile(u32 heap_id, const char * path)
{
void * ret;
@@ -214,7 +215,7 @@ void * FUN_020161A4(u32 heap_id, const char * path)
return ret;
}
-void FUN_020161F8(const char * path, void ** ptr)
+void OpenAndReadWholeFile(const char * path, void ** ptr)
{
FSFile file;
FS_InitFile(&file);
@@ -227,94 +228,94 @@ void FUN_020161F8(const char * path, void ** ptr)
}
}
-u32 FUN_02016230(const s8 * str)
+u32 GetFilenameHash(const s8 * str)
{
u16 len = (u16)strlen(str);
- u16 sp4;
+ u16 numWords;
if ((len % 4) != 0)
- sp4 = (u16)((len / 4) + 1);
+ numWords = (u16)((len / 4) + 1);
else
- sp4 = (u16)(len / 4);
- u32 r7 = 0;
+ numWords = (u16)(len / 4);
+ u32 hash = 0;
s32 i, j;
- for (i = 0; i < sp4; i++)
+ for (i = 0; i < numWords; i++)
{
- u32 r1 = 0;
+ u32 curWord = 0;
for (j = 0; j < 4; j++)
{
- int r5 = str[4 * i + j];
- if (r5 == 0)
+ int curChar = str[4 * i + j];
+ if (curChar == 0)
break;
- r1 |= r5 << (8 * j);
+ curWord |= curChar << (8 * j);
}
- r7 ^= r1;
+ hash ^= curWord;
}
- return r7;
+ return hash;
}
-int FUN_020162A0(u32 a0)
+int GetFileCacheId(u32 hash)
{
for (int i = 0; i < 128; i++)
{
- if (UNK_021C4928[i].name_hash == a0 && UNK_021C4928[i].contents != NULL)
+ if (sFileCache[i].name_hash == hash && sFileCache[i].contents != NULL)
return i;
}
return -1;
}
-int FUN_020162C8(void * a0, u32 a1)
+int AddFileToCache(void * contents, u32 hash)
{
for (int i = 0; i < 128; i++)
{
- if (UNK_021C4928[i].contents == NULL)
+ if (sFileCache[i].contents == NULL)
{
- UNK_021C4928[i].contents = a0;
- UNK_021C4928[i].name_hash = a1;
+ sFileCache[i].contents = contents;
+ sFileCache[i].name_hash = hash;
return i;
}
}
return -1;
}
-void FUN_020162FC(void)
+void ClearFileCache(void)
{
for (int i = 127; i > -1; i--)
{
- if (UNK_021C4928[i].contents != NULL)
+ if (sFileCache[i].contents != NULL)
{
- FreeToHeap(UNK_021C4928[i].contents);
- UNK_021C4928[i].contents = NULL;
- UNK_021C4928[i].name_hash = 0;
+ FreeToHeap(sFileCache[i].contents);
+ sFileCache[i].contents = NULL;
+ sFileCache[i].name_hash = 0;
}
}
}
-void * FUN_02016324(const s8 * str, u32 heap_id)
+void * OpenFileCached(const s8 * str, u32 heap_id)
{
- s8 sp0[32];
+ s8 filenameBuf[32];
FSFile file;
void * ret;
- int r5 = 0;
+ int skipCache = 0;
if (str[0] == '!')
{
- strcpy(sp0, str + 1);
- r5 = 1;
+ strcpy(filenameBuf, str + 1);
+ skipCache = 1;
}
else
{
- strcpy(sp0, str);
+ strcpy(filenameBuf, str);
}
- u32 r7 = FUN_02016230(sp0);
- s32 r0 = FUN_020162A0(r7);
- if (r0 >= 0 && r5 == 0)
+ u32 hash = GetFilenameHash(filenameBuf);
+ s32 cacheId = GetFileCacheId(hash);
+ if (cacheId >= 0 && skipCache == 0)
{
- ret = UNK_021C4928[r0].contents;
+ ret = sFileCache[cacheId].contents;
}
else
{
FS_InitFile(&file);
- if (FS_OpenFile(&file, (const char *)sp0))
+ if (FS_OpenFile(&file, (const char *)filenameBuf))
{
u32 size = file.prop.file.bottom - file.prop.file.top;
ret = AllocFromHeap(heap_id, size);
@@ -327,8 +328,8 @@ void * FUN_02016324(const s8 * str, u32 heap_id)
}
}
FS_CloseFile(&file);
- if (r5 == 0)
- FUN_020162C8(ret, r7);
+ if (skipCache == 0)
+ AddFileToCache(ret, hash);
}
else
ret = NULL;
@@ -336,24 +337,24 @@ void * FUN_02016324(const s8 * str, u32 heap_id)
return ret;
}
-void FUN_020163BC(void)
+void InitKeypadAndTouchpad(void)
{
TPCalibrateParam tp;
- gMain.unk34 = 0;
- gMain.unk38 = 0;
- gMain.unk3C = 0;
- gMain.unk40 = 0;
- gMain.unk44 = 0;
+ gMain.buttonMode = 0;
+ gMain.heldKeysRaw = 0;
+ gMain.newKeysRaw = 0;
+ gMain.newAndRepeatedKeysRaw = 0;
+ gMain.heldKeys = 0;
gMain.newKeys = 0;
gMain.newAndRepeatedKeys = 0;
- gMain.unk50 = 0;
- gMain.unk54 = 8;
- gMain.unk58 = 15;
- gMain.unk5C = 0;
- gMain.unk5E = 0;
- gMain.unk60 = 0;
- gMain.unk62 = 0;
- gMain.unk64 = 0;
+ gMain.keyRepeatCounter = 0;
+ gMain.keyRepeatContinueDelay = 8;
+ gMain.keyRepeatStartDelay = 15;
+ gMain.touchX = 0;
+ gMain.touchY = 0;
+ gMain.touchNew = 0;
+ gMain.touchHeld = 0;
+ gMain.touchpadReadAuto = 0;
TP_Init();
if (TP_GetUserInfo(&tp) == TRUE)
TP_SetCalibrateParam(&tp);
@@ -382,38 +383,53 @@ void FUN_02016454(u8 a0)
gMain.unk67 &= ~a0;
}
-void FUN_02016464(void)
+void ReadKeypadAndTocuhpad(void)
{
TPData raw, calib;
if (PAD_DetectFold())
{
+ // Can't press any buttons while the lid is closed.
gMain.newKeys = 0;
- gMain.unk44 = 0;
+ gMain.heldKeys = 0;
gMain.newAndRepeatedKeys = 0;
- gMain.unk60 = 0;
- gMain.unk62 = 0;
+ gMain.touchNew = 0;
+ gMain.touchHeld = 0;
return;
}
- u32 r0 = PAD_Read();
- gMain.unk40 = gMain.unk3C = (r0 ^ gMain.unk38) & r0;
- if (r0 != 0 && gMain.unk38 == r0)
+
+ u32 padRead = PAD_Read();
+
+ // newKeys is all keys that were pressed on this frame but
+ // not the last frame.
+ gMain.newAndRepeatedKeysRaw = gMain.newKeysRaw = (padRead ^ gMain.heldKeysRaw) & padRead;
+
+ // If you are holding down buttons, indicate them "repeated" every few frames
+ // as defined by .keyRepeatStartDelay and .keyRepeatContinueDelay.
+ // Same logic as gen3, but fixes the bug where the
+ // remapped keys are incorrectly used here.
+ // See also: pokeemerald/src/main.c:ReadKeys
+ if (padRead != 0 && gMain.heldKeysRaw == padRead)
{
- if (--gMain.unk50 == 0)
+ if (--gMain.keyRepeatCounter == 0)
{
- gMain.unk40 = r0;
- gMain.unk50 = gMain.unk54;
+ gMain.newAndRepeatedKeysRaw = padRead;
+ gMain.keyRepeatCounter = gMain.keyRepeatContinueDelay;
}
}
else
{
- gMain.unk50 = gMain.unk58;
+ gMain.keyRepeatCounter = gMain.keyRepeatStartDelay;
}
- gMain.unk38 = r0;
- gMain.newKeys = gMain.unk3C;
- gMain.unk44 = r0;
- gMain.newAndRepeatedKeys = gMain.unk40;
- FUN_02016568();
- if (gMain.unk64 == 0)
+ gMain.heldKeysRaw = padRead;
+
+ // Apply the button mode option to the read key input
+ gMain.newKeys = gMain.newKeysRaw;
+ gMain.heldKeys = padRead;
+ gMain.newAndRepeatedKeys = gMain.newAndRepeatedKeysRaw;
+ ApplyButtonModeToInput();
+
+ // Read the touchpad. New to gen 4.
+ if (gMain.touchpadReadAuto == 0)
{
while (TP_RequestRawSampling(&raw))
;
@@ -421,111 +437,117 @@ void FUN_02016464(void)
else
TP_GetLatestRawPointInAuto(&raw);
TP_GetCalibratedPoint(&calib, &raw);
- if (calib.validity == 0)
+
+ // If the touchpad is valid, we gucci.
+ if (calib.validity == TP_VALIDITY_VALID)
{
- gMain.unk5C = calib.x;
- gMain.unk5E = calib.y;
+ gMain.touchX = calib.x;
+ gMain.touchY = calib.y;
}
- else if (gMain.unk62)
+
+ // If the touchpad was used last frame, salvage what we can.
+ else if (gMain.touchHeld)
{
switch (calib.validity)
{
- case 1:
- gMain.unk5E = calib.y;
+ case TP_VALIDITY_INVALID_X:
+ gMain.touchY = calib.y;
break;
- case 2:
- gMain.unk5C = calib.x;
+ case TP_VALIDITY_INVALID_Y:
+ gMain.touchX = calib.x;
break;
- case 3:
+ case TP_VALIDITY_INVALID_XY:
break;
}
}
+ // What was read from the touchpad was not salvageable.
+ // Ignore touch input.
else
calib.touch = 0;
- gMain.unk60 = (u16)((gMain.unk62 ^ calib.touch) & calib.touch);
- gMain.unk62 = calib.touch;
+ gMain.touchNew = (u16)((gMain.touchHeld ^ calib.touch) & calib.touch);
+ gMain.touchHeld = calib.touch;
}
-void FUN_02016568(void)
+void ApplyButtonModeToInput(void)
{
- switch (gMain.unk34)
+ switch (gMain.buttonMode)
{
case 0: // Normal
break;
case 1: // Start = X
if (gMain.newKeys & PAD_BUTTON_START)
gMain.newKeys |= PAD_BUTTON_X;
- if (gMain.unk44 & PAD_BUTTON_START)
- gMain.unk44 |= PAD_BUTTON_X;
+ if (gMain.heldKeys & PAD_BUTTON_START)
+ gMain.heldKeys |= PAD_BUTTON_X;
if (gMain.newAndRepeatedKeys & PAD_BUTTON_START)
gMain.newAndRepeatedKeys |= PAD_BUTTON_X;
break;
case 2: // Swap X and Y; unused in the retail game
{
- u32 r1 = 0;
+ u32 swapMask = 0;
if (gMain.newKeys & PAD_BUTTON_X)
{
- r1 |= PAD_BUTTON_Y;
+ swapMask |= PAD_BUTTON_Y;
}
if (gMain.newKeys & PAD_BUTTON_Y)
{
- r1 |= PAD_BUTTON_X;
+ swapMask |= PAD_BUTTON_X;
}
- gMain.newKeys &= 0xF3FF;
- gMain.newKeys |= r1;
+ gMain.newKeys &= ((PAD_BUTTON_X | PAD_BUTTON_Y) ^ 0xFFFF);;
+ gMain.newKeys |= swapMask;
}
{
- u32 r1 = 0;
- if (gMain.unk44 & PAD_BUTTON_X)
+ u32 swapMask = 0;
+ if (gMain.heldKeys & PAD_BUTTON_X)
{
- r1 |= PAD_BUTTON_Y;
+ swapMask |= PAD_BUTTON_Y;
}
- if (gMain.unk44 & PAD_BUTTON_Y)
+ if (gMain.heldKeys & PAD_BUTTON_Y)
{
- r1 |= PAD_BUTTON_X;
+ swapMask |= PAD_BUTTON_X;
}
- gMain.unk44 &= 0xF3FF;
- gMain.unk44 |= r1;
+ gMain.heldKeys &= ((PAD_BUTTON_X | PAD_BUTTON_Y) ^ 0xFFFF);
+ gMain.heldKeys |= swapMask;
}
{
- u32 r1 = 0;
+ u32 swapMask = 0;
if (gMain.newAndRepeatedKeys & PAD_BUTTON_X)
{
- r1 |= PAD_BUTTON_Y;
+ swapMask |= PAD_BUTTON_Y;
}
if (gMain.newAndRepeatedKeys & PAD_BUTTON_Y)
{
- r1 |= PAD_BUTTON_X;
+ swapMask |= PAD_BUTTON_X;
}
- gMain.newAndRepeatedKeys &= 0xF3FF;
- gMain.newAndRepeatedKeys |= r1;
+ gMain.newAndRepeatedKeys &= ((PAD_BUTTON_X | PAD_BUTTON_Y) ^ 0xFFFF);
+ gMain.newAndRepeatedKeys |= swapMask;
}
break;
case 3: // L = A
if (gMain.newKeys & PAD_BUTTON_L)
gMain.newKeys |= PAD_BUTTON_A;
- if (gMain.unk44 & PAD_BUTTON_L)
- gMain.unk44 |= PAD_BUTTON_A;
+ if (gMain.heldKeys & PAD_BUTTON_L)
+ gMain.heldKeys |= PAD_BUTTON_A;
if (gMain.newAndRepeatedKeys & PAD_BUTTON_L)
gMain.newAndRepeatedKeys |= PAD_BUTTON_A;
- gMain.newKeys &= 0xFCFF;
- gMain.unk44 &= 0xFCFF;
- gMain.newAndRepeatedKeys &= 0xFCFF;
+ gMain.newKeys &= ((PAD_BUTTON_L | PAD_BUTTON_R) ^ 0xFFFF);
+ gMain.heldKeys &= ((PAD_BUTTON_L | PAD_BUTTON_R) ^ 0xFFFF);
+ gMain.newAndRepeatedKeys &= ((PAD_BUTTON_L | PAD_BUTTON_R) ^ 0xFFFF);
}
}
-void FUN_0201669C(int x, int y)
+void SetKeyRepeatTimers(int continueDelay, int startDelay)
{
- gMain.unk54 = x;
- gMain.unk58 = y;
+ gMain.keyRepeatContinueDelay = continueDelay;
+ gMain.keyRepeatStartDelay = startDelay;
}
-void FUN_020166A8(u8 a0)
+void SetSoftResetDisableMask(u8 a0)
{
- gMain.unk68 |= a0;
+ gMain.softResetDisabled |= a0;
}
-void FUN_020166B8(u8 a0)
+void ClearSoftResetDisableMask(u8 a0)
{
- gMain.unk68 &= ~a0;
+ gMain.softResetDisabled &= ~a0;
}
diff --git a/arm9/src/gf_gfx_loader.c b/arm9/src/gf_gfx_loader.c
index 769c90d9..0c6d593e 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 layer, u32 numTiles, 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)layer, pCharData->pRawData, szByte, numTiles);
}
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 layer, u32 tileOffset, u32 szByte, BOOL isCompressed, u32 heap_id)
{
NNSG2dScreenData * pScreenData;
void * pFile = GfGfxLoader_LoadFromNarc(narcId, memberNo, isCompressed, heap_id, TRUE);
@@ -30,20 +30,20 @@ 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) layer) != NULL)
+ BG_LoadScreenTilemapData(unkStruct02016B94_2, (u8) layer, pScreenData->rawData, szByte);
+ BgCopyOrUncompressTilemapBufferRangeToVram(unkStruct02016B94_2, (u8) layer, pScreenData->rawData, szByte, tileOffset);
}
FreeToHeap(pFile);
}
}
-THUMB_FUNC void GfGfxLoader_GXLoadPal(NarcId narcId, s32 memberNo, u32 whichRoutine, u32 baseAddr, u32 szByte, u32 heap_id)
+THUMB_FUNC void GfGfxLoader_GXLoadPal(NarcId narcId, s32 memberNo, u32 layer, u32 baseAddr, u32 szByte, u32 heap_id)
{
- GfGfxLoader_GXLoadPalWithSrcOffset(narcId, memberNo, whichRoutine, 0, baseAddr, szByte, heap_id);
+ GfGfxLoader_GXLoadPalWithSrcOffset(narcId, memberNo, layer, 0, baseAddr, szByte, heap_id);
}
-THUMB_FUNC void GfGfxLoader_GXLoadPalWithSrcOffset(NarcId narcId, s32 memberNo, u32 whichRoutine, u32 srcOffset, u32 baseAddr, u32 szByte, u32 heap_id)
+THUMB_FUNC void GfGfxLoader_GXLoadPalWithSrcOffset(NarcId narcId, s32 memberNo, u32 layer, u32 srcOffset, u32 baseAddr, u32 szByte, u32 heap_id)
{
static void (*const load_funcs[])(void *, u32, u32) = {
GX_LoadBGPltt,
@@ -65,30 +65,30 @@ THUMB_FUNC void GfGfxLoader_GXLoadPalWithSrcOffset(NarcId narcId, s32 memberNo,
if (szByte == 0)
szByte = pPltData->szByte - srcOffset;
DC_FlushRange(pPltData->pRawData, szByte);
- switch (whichRoutine)
+ switch (layer)
{
case 2:
GX_BeginLoadBGExtPltt();
- load_funcs[whichRoutine](pPltData->pRawData, baseAddr, szByte);
+ load_funcs[layer](pPltData->pRawData, baseAddr, szByte);
GX_EndLoadBGExtPltt();
break;
case 6:
GXS_BeginLoadBGExtPltt();
- load_funcs[whichRoutine](pPltData->pRawData, baseAddr, szByte);
+ load_funcs[layer](pPltData->pRawData, baseAddr, szByte);
GXS_EndLoadBGExtPltt();
break;
case 3:
GX_BeginLoadOBJExtPltt();
- load_funcs[whichRoutine](pPltData->pRawData, baseAddr, szByte);
+ load_funcs[layer](pPltData->pRawData, baseAddr, szByte);
GX_EndLoadOBJExtPltt();
break;
case 7:
GXS_BeginLoadOBJExtPltt();
- load_funcs[whichRoutine](pPltData->pRawData, baseAddr, szByte);
+ load_funcs[layer](pPltData->pRawData, baseAddr, szByte);
GXS_EndLoadOBJExtPltt();
break;
default:
- load_funcs[whichRoutine](pPltData->pRawData, baseAddr, szByte);
+ load_funcs[layer](pPltData->pRawData, baseAddr, szByte);
break;
}
}
@@ -96,7 +96,7 @@ THUMB_FUNC void GfGfxLoader_GXLoadPalWithSrcOffset(NarcId narcId, s32 memberNo,
}
}
-THUMB_FUNC u32 GfGfxLoader_LoadWholePalette(NarcId narcId, s32 memberId, u32 whichRoutine, u32 baseAddr, u32 szByte, BOOL isCompressed, u32 heap_id)
+THUMB_FUNC u32 GfGfxLoader_LoadWholePalette(NarcId narcId, s32 memberId, u32 layer, u32 baseAddr, u32 szByte, BOOL isCompressed, u32 heap_id)
{
static void (*const load_funcs[])(void *, u32, u32) = {
GX_LoadOBJ,
@@ -112,7 +112,7 @@ THUMB_FUNC u32 GfGfxLoader_LoadWholePalette(NarcId narcId, s32 memberId, u32 whi
if (szByte == 0)
szByte = pCharData->szByte;
DC_FlushRange(pCharData->pRawData, szByte);
- load_funcs[whichRoutine](pCharData->pRawData, baseAddr, szByte);
+ load_funcs[layer](pCharData->pRawData, baseAddr, szByte);
}
FreeToHeap(pFile);
}
@@ -142,7 +142,7 @@ THUMB_FUNC void GfGfxLoader_PartiallyLoadPalette(NarcId narcId, s32 memberId, NN
}
}
-THUMB_FUNC u32 GfGfxLoader_LoadImageMapping(NarcId narcId, s32 memberId, BOOL isCompressed, u32 whichRoutine, u32 szByte, NNS_G2D_VRAM_TYPE type, u32 baseAddr, u32 heap_id, NNSG2dImageProxy *pImgProxy)
+THUMB_FUNC u32 GfGfxLoader_LoadImageMapping(NarcId narcId, s32 memberId, BOOL isCompressed, u32 layer, u32 szByte, NNS_G2D_VRAM_TYPE type, u32 baseAddr, u32 heap_id, NNSG2dImageProxy *pImgProxy)
{
static void (*const load_funcs[])(const NNSG2dCharacterData *, u32, NNS_G2D_VRAM_TYPE, NNSG2dImageProxy *) = {
NNS_G2dLoadImage1DMapping,
@@ -158,7 +158,7 @@ THUMB_FUNC u32 GfGfxLoader_LoadImageMapping(NarcId narcId, s32 memberId, BOOL is
{
if (szByte != 0)
pSrcData->szByte = szByte;
- load_funcs[whichRoutine](pSrcData, baseAddr, type, pImgProxy);
+ load_funcs[layer](pSrcData, baseAddr, type, pImgProxy);
retSize = pSrcData->szByte;
}
FreeToHeap(pFile);
@@ -166,7 +166,7 @@ THUMB_FUNC u32 GfGfxLoader_LoadImageMapping(NarcId narcId, s32 memberId, BOOL is
return retSize;
}
-THUMB_FUNC void GfGfxLoader_SetObjCntFlagsAndLoadImageMapping(NarcId narcId, s32 memberId, BOOL isCompressed, u32 whichRoutine, u32 szByte, NNS_G2D_VRAM_TYPE type, u32 baseAddr, u32 heap_id, NNSG2dImageProxy * pImageProxy)
+THUMB_FUNC void GfGfxLoader_SetObjCntFlagsAndLoadImageMapping(NarcId narcId, s32 memberId, BOOL isCompressed, u32 layer, u32 szByte, NNS_G2D_VRAM_TYPE type, u32 baseAddr, u32 heap_id, NNSG2dImageProxy * pImageProxy)
{
static void (*const load_funcs[])(const NNSG2dCharacterData *, u32, NNS_G2D_VRAM_TYPE, NNSG2dImageProxy *) = {
NNS_G2dLoadImage1DMapping,
@@ -191,7 +191,7 @@ THUMB_FUNC void GfGfxLoader_SetObjCntFlagsAndLoadImageMapping(NarcId narcId, s32
default:
;
}
- load_funcs[whichRoutine](pCharacterData, baseAddr, type, pImageProxy);
+ load_funcs[layer](pCharacterData, baseAddr, type, pImageProxy);
}
FreeToHeap(pFile);
}
diff --git a/arm9/src/heap.c b/arm9/src/heap.c
index 7f35fdcc..842fd33a 100644
--- a/arm9/src/heap.c
+++ b/arm9/src/heap.c
@@ -1,31 +1,45 @@
#include "heap.h"
#include "error_message_reset.h"
#include "unk_02031734.h"
+#include "NNS_FND_expheap.h"
+#include "NNS_FND_allocator.h"
+struct HeapInfo
+{
+ NNSFndHeapHandle *heapHandles;
+ NNSFndHeapHandle *parentHeapHandles;
+ void **subHeapRawPtrs;
+ u16 *numMemBlocks;
+ u8 *heapIdxs;
+ u16 totalNumHeaps;
+ u16 nTemplates;
+ u16 maxHeaps;
+ u16 unallocatedHeapId;
+};
+
+typedef struct MemoryBlock
+{
+ u8 filler_00[12];
+ u32 heapId:8;
+ u32 filler_0D:24;
+} MemoryBlock;
-extern void *NNS_FndCreateExpHeapEx(void *param0, u32 param1, u32 param2);
-extern void *NNS_FndAllocFromExpHeapEx(void *param0, u32 param1, s32 param2);
-extern void NNS_FndDestroyExpHeap();
-extern void NNS_FndFreeToExpHeap(void *ptr1, void *ptr2);
-extern u32 NNS_FndGetTotalFreeSizeForExpHeap(void *param0);
-extern void NNS_FndInitAllocatorForExpHeap(u32 param0, void *param1, u32 param2);
-extern u32 NNS_FndGetSizeForMBlockExpHeap(void *param0);
-extern void NNS_FndResizeForMBlockExpHeap(void *ptr1, void *ptr2, u32 param2);
-
-
-struct UnkStruct_020166C8 UNK_021C4D28;
-
+struct HeapInfo sHeapInfo;
-THUMB_FUNC void FUN_020166C8(u32 *param0, u32 param1, u32 param2, u32 pre_size)
+THUMB_FUNC void InitHeapSystem(const struct HeapParam *templates, u32 nTemplates, u32 totalNumHeaps, u32 pre_size)
{
- u32 unk_size = param1 + 24;
+ void * ptr;
+ u32 unk_size, i;
- if (param2 < unk_size)
+ unk_size = nTemplates + 24;
+
+ if (totalNumHeaps < unk_size)
{
- param2 = unk_size;
+ totalNumHeaps = unk_size;
}
if (pre_size != 0)
{
+ // force align
while (pre_size % 4 != 0)
{
pre_size++;
@@ -34,207 +48,196 @@ THUMB_FUNC void FUN_020166C8(u32 *param0, u32 param1, u32 param2, u32 pre_size)
OS_AllocFromArenaLo(OS_ARENA_MAIN, pre_size, 4);
}
- u32 r7 = param2 * 2;
-
- void *ptr = OS_AllocFromArenaLo(OS_ARENA_MAIN, (unk_size * 3 + 1) * sizeof(u32) + r7 + param2, 4);
- UNK_021C4D28.unk00 = ptr;
- ptr += (unk_size + 1) * 4;
- UNK_021C4D28.unk04 = ptr;
- ptr += unk_size * 4;
- UNK_021C4D28.unk08 = ptr;
- ptr += unk_size * 4;
- UNK_021C4D28.unk0c = ptr;
- ptr += r7;
- UNK_021C4D28.unk10 = ptr;
- UNK_021C4D28.unk14 = (u16)param2;
- UNK_021C4D28.unk16 = (u16)param1;
-
- r7 = 0;
- UNK_021C4D28.unk1a = (u16)unk_size;
- UNK_021C4D28.unk18 = (u16)unk_size;
-
- while (r7 < param1)
+ sHeapInfo.heapHandles = (NNSFndHeapHandle*) OS_AllocFromArenaLo(
+ OS_ARENA_MAIN,
+ (unk_size + 1) * sizeof(NNSFndHeapHandle)
+ + unk_size * sizeof(NNSFndHeapHandle)
+ + unk_size * sizeof(void *)
+ + totalNumHeaps * sizeof(u16)
+ + totalNumHeaps,
+ 4
+ );
+ sHeapInfo.parentHeapHandles = sHeapInfo.heapHandles + (unk_size + 1);
+ sHeapInfo.subHeapRawPtrs = (void **)(sHeapInfo.parentHeapHandles + unk_size);
+ sHeapInfo.numMemBlocks = (u16 *)(sHeapInfo.subHeapRawPtrs + unk_size);
+ sHeapInfo.heapIdxs = (u8 *)(sHeapInfo.numMemBlocks + totalNumHeaps);
+ sHeapInfo.totalNumHeaps = (u16)totalNumHeaps;
+ sHeapInfo.nTemplates = (u16)nTemplates;
+
+ sHeapInfo.unallocatedHeapId = (u16)unk_size;
+ sHeapInfo.maxHeaps = (u16)unk_size;
+
+ for (i = 0; i < nTemplates; i++)
{
- void *ptr;
- if (param0[1] == 0 || param0[1] != 2)
+ switch (templates[i].arena)
{
- ptr = OS_AllocFromArenaLo(OS_ARENA_MAIN, param0[0], 4);
- }
- else
- {
- ptr = OS_AllocFromArenaHi(OS_ARENA_MAINEX, param0[0], 4);
+ case OS_ARENA_MAIN:
+ default:
+ ptr = OS_AllocFromArenaLo(OS_ARENA_MAIN, templates[i].size, 4);
+ break;
+ case OS_ARENA_MAINEX:
+ ptr = OS_AllocFromArenaHi(OS_ARENA_MAINEX, templates[i].size, 4);
+ break;
}
- if (ptr != 0)
+ if (ptr != NULL)
{
- UNK_021C4D28.unk00[r7] = NNS_FndCreateExpHeapEx(ptr, param0[0], 0);
- UNK_021C4D28.unk10[r7] = (u8)r7;
+ sHeapInfo.heapHandles[i] = NNS_FndCreateExpHeap(ptr, templates[i].size);
+ sHeapInfo.heapIdxs[i] = (u8)i;
}
else
{
- GF_AssertFail();
+ GF_ASSERT(0);
}
-
- param0 += 2;
- r7++;
}
- while (param1 < unk_size + 1)
+ for (i = nTemplates; i < unk_size + 1; i++)
{
- UNK_021C4D28.unk00[param1] = 0;
- UNK_021C4D28.unk10[param1] = (u8)UNK_021C4D28.unk1a;
-
- param1++;
+ sHeapInfo.heapHandles[i] = NULL;
+ sHeapInfo.heapIdxs[i] = (u8)sHeapInfo.unallocatedHeapId;
}
- while (param1 < param2)
+ while (i < totalNumHeaps)
{
- UNK_021C4D28.unk10[param1] = (u8)UNK_021C4D28.unk1a;
+ sHeapInfo.heapIdxs[i] = (u8)sHeapInfo.unallocatedHeapId;
- param1++;
+ i++;
}
- for (param1 = 0; param1 < param2; param1++)
+ for (i = 0; i < totalNumHeaps; i++)
{
- UNK_021C4D28.unk0c[param1] = 0;
+ sHeapInfo.numMemBlocks[i] = 0;
}
}
-THUMB_FUNC s32 FUN_020167F4()
+THUMB_FUNC s32 FindFirstAvailableHeapHandle()
{
- s32 i = UNK_021C4D28.unk16;
- s32 j = UNK_021C4D28.unk18;
+ s32 i;
- if (i < j)
+ for (i = sHeapInfo.nTemplates; i < sHeapInfo.maxHeaps; i++)
{
- void **ptr = UNK_021C4D28.unk00 + i;
- do
- {
- if (*ptr == 0)
- {
- return i;
- }
- i++;
- ptr++;
- } while (i < j);
+ if (sHeapInfo.heapHandles[i] == NULL)
+ return i;
}
return -1;
}
-THUMB_FUNC u32 FUN_0201681C(u32 param0, u32 param1, u32 param2)
+THUMB_FUNC BOOL CreateHeap(u32 parent, u32 child, u32 size)
{
- return FUN_02016834(param0, param1, param2, 4);
+ return CreateHeapInternal(parent, child, size, 4);
}
-THUMB_FUNC u32 FUN_02016828(u32 param0, u32 param1, u32 param2)
+THUMB_FUNC BOOL CreateHeapAtEnd(u32 parent, u32 child, u32 size)
{
- return FUN_02016834(param0, param1, param2, -4);
+ return CreateHeapInternal(parent, child, size, -4);
}
-THUMB_FUNC u32 FUN_02016834(u32 param0, u32 param1, u32 param2, s32 param3)
+THUMB_FUNC BOOL CreateHeapInternal(u32 parent, u32 child, u32 size, s32 alignment)
{
GF_ASSERT(OS_GetProcMode() != OS_PROCMODE_IRQ);
- u8 *ptr = UNK_021C4D28.unk10;
- if (UNK_021C4D28.unk1a == ptr[param1])
+ u8 *ptr = sHeapInfo.heapIdxs;
+ if (sHeapInfo.unallocatedHeapId == ptr[child])
{
- void *ptr2 = UNK_021C4D28.unk00[ptr[param0]];
- if (ptr2 != 0)
+ NNSFndHeapHandle parentHeap = sHeapInfo.heapHandles[ptr[parent]];
+ if (parentHeap != NULL)
{
- void *ptr3 = NNS_FndAllocFromExpHeapEx(ptr2, param2, param3);
- if (ptr3 != 0)
+ void *newHeapAddr = NNS_FndAllocFromExpHeapEx(parentHeap, size, alignment);
+ if (newHeapAddr != NULL)
{
- param3 = FUN_020167F4();
- if (param3 >= 0)
+ s32 i = FindFirstAvailableHeapHandle();
+ if (i >= 0)
{
- UNK_021C4D28.unk00[param3] = NNS_FndCreateExpHeapEx(ptr3, param2, 0);
+ sHeapInfo.heapHandles[i] = NNS_FndCreateExpHeap(newHeapAddr, size);
- if (UNK_021C4D28.unk00[param3] != 0)
+ if (sHeapInfo.heapHandles[i] != NULL)
{
- UNK_021C4D28.unk04[param3] = ptr2;
- UNK_021C4D28.unk08[param3] = ptr3;
- UNK_021C4D28.unk10[param1] = (u8)param3;
+ sHeapInfo.parentHeapHandles[i] = parentHeap;
+ sHeapInfo.subHeapRawPtrs[i] = newHeapAddr;
+ sHeapInfo.heapIdxs[child] = (u8)i;
- return 1;
+ return TRUE;
}
else
{
- GF_AssertFail();
+ GF_ASSERT(0);
}
}
else
{
- GF_AssertFail();
+ GF_ASSERT(0);
}
}
else
{
- GF_AssertFail();
+ GF_ASSERT(0);
}
}
else
{
- GF_AssertFail();
+ GF_ASSERT(0);
}
}
else
{
- GF_AssertFail();
+ GF_ASSERT(0);
}
- return 0;
+ return FALSE;
}
-THUMB_FUNC void FUN_020168D0(u32 heap_id)
+THUMB_FUNC void DestroyHeap(u32 heap_id)
{
- GF_ASSERT (OS_GetProcMode() != OS_PROCMODE_IRQ);
+ GF_ASSERT(OS_GetProcMode() != OS_PROCMODE_IRQ);
+
+ NNSFndHeapHandle handle = sHeapInfo.heapHandles[sHeapInfo.heapIdxs[heap_id]];
- if (UNK_021C4D28.unk00[UNK_021C4D28.unk10[heap_id]] != 0)
+ if (handle != NULL)
{
- NNS_FndDestroyExpHeap();
+ NNS_FndDestroyExpHeap(handle);
- u8 index = UNK_021C4D28.unk10[heap_id];
- void *ptr1 = UNK_021C4D28.unk04[index];
- void *ptr2 = UNK_021C4D28.unk08[index];
- if (ptr1 != 0 && ptr2 != 0)
+ u8 index = sHeapInfo.heapIdxs[heap_id];
+ NNSFndHeapHandle parentHeap = sHeapInfo.parentHeapHandles[index];
+ void *childRaw = sHeapInfo.subHeapRawPtrs[index];
+ if (parentHeap != NULL && childRaw != NULL)
{
- NNS_FndFreeToExpHeap(ptr1, ptr2);
+ NNS_FndFreeToExpHeap(parentHeap, childRaw);
}
else
{
- GF_AssertFail();
+ GF_ASSERT(0);
}
- UNK_021C4D28.unk00[UNK_021C4D28.unk10[heap_id]] = 0;
- UNK_021C4D28.unk04[UNK_021C4D28.unk10[heap_id]] = 0;
- UNK_021C4D28.unk08[UNK_021C4D28.unk10[heap_id]] = 0;
+ sHeapInfo.heapHandles[sHeapInfo.heapIdxs[heap_id]] = NULL;
+ sHeapInfo.parentHeapHandles[sHeapInfo.heapIdxs[heap_id]] = NULL;
+ sHeapInfo.subHeapRawPtrs[sHeapInfo.heapIdxs[heap_id]] = NULL;
- UNK_021C4D28.unk10[heap_id] = (u8)UNK_021C4D28.unk1a;
+ sHeapInfo.heapIdxs[heap_id] = (u8)sHeapInfo.unallocatedHeapId;
}
}
-THUMB_FUNC u32 *FUN_02016944(void *param0, u32 param1, s32 param2, u32 param3)
+THUMB_FUNC void *AllocFromHeapInternal(NNSFndHeapHandle heap, u32 size, s32 alignment, u32 heap_id)
{
- GF_ASSERT(param0);
+ GF_ASSERT(heap);
OSIntrMode intr_mode = OS_DisableInterrupts();
- param1 += 16;
- u32 *ptr = (u32 *)NNS_FndAllocFromExpHeapEx(param0, param1, param2);
+ size += sizeof(MemoryBlock);
+ void *ptr = NNS_FndAllocFromExpHeapEx(heap, size, alignment);
OS_RestoreInterrupts(intr_mode);
- if (ptr != 0)
+ if (ptr != NULL)
{
- ptr[3] = (ptr[3] & ~0xff) | (param3 & 0xff);
+ ((MemoryBlock *)ptr)->heapId = heap_id;
- ptr += 4;
+ ptr += sizeof(MemoryBlock);
}
return ptr;
}
-THUMB_FUNC void FUN_02016988()
+THUMB_FUNC void AllocFail()
{
if (FUN_02031810() != 0)
{
@@ -244,19 +247,19 @@ THUMB_FUNC void FUN_02016988()
void *AllocFromHeap(u32 heap_id, u32 size)
{
- void *ptr = 0;
- if (heap_id < UNK_021C4D28.unk14)
+ void *ptr = NULL;
+ if (heap_id < sHeapInfo.totalNumHeaps)
{
- u8 index = UNK_021C4D28.unk10[heap_id];
- ptr = FUN_02016944(UNK_021C4D28.unk00[index], size, 4, heap_id);
+ u8 index = sHeapInfo.heapIdxs[heap_id];
+ ptr = AllocFromHeapInternal(sHeapInfo.heapHandles[index], size, 4, heap_id);
}
- if (ptr != 0)
+ if (ptr != NULL)
{
- UNK_021C4D28.unk0c[heap_id]++;
+ sHeapInfo.numMemBlocks[heap_id]++;
}
else
{
- FUN_02016988();
+ AllocFail();
}
return ptr;
@@ -264,20 +267,20 @@ void *AllocFromHeap(u32 heap_id, u32 size)
void *AllocFromHeapAtEnd(u32 heap_id, u32 size)
{
- void *ptr = 0;
- if (heap_id < UNK_021C4D28.unk14)
+ void *ptr = NULL;
+ if (heap_id < sHeapInfo.totalNumHeaps)
{
- u8 index = UNK_021C4D28.unk10[heap_id];
- ptr = FUN_02016944(UNK_021C4D28.unk00[index], size, -4, heap_id);
+ u8 index = sHeapInfo.heapIdxs[heap_id];
+ ptr = AllocFromHeapInternal(sHeapInfo.heapHandles[index], size, -4, heap_id);
}
- if (ptr != 0)
+ if (ptr != NULL)
{
- UNK_021C4D28.unk0c[heap_id]++;
+ sHeapInfo.numMemBlocks[heap_id]++;
}
else
{
- FUN_02016988();
+ AllocFail();
}
return ptr;
@@ -285,97 +288,99 @@ void *AllocFromHeapAtEnd(u32 heap_id, u32 size)
void FreeToHeap(void *ptr)
{
- u8 heap_id = (u8)((u32 *)ptr)[-1];
+ ptr -= sizeof(MemoryBlock);
+ u32 heap_id = ((MemoryBlock *)ptr)->heapId;
- if ((u16)heap_id < UNK_021C4D28.unk14)
+ if (heap_id < sHeapInfo.totalNumHeaps)
{
- u8 index = UNK_021C4D28.unk10[heap_id];
- void *ptr2 = UNK_021C4D28.unk00[index];
- GF_ASSERT(ptr2);
+ u8 index = sHeapInfo.heapIdxs[heap_id];
+ NNSFndHeapHandle heap = sHeapInfo.heapHandles[index];
+ GF_ASSERT(heap != NULL);
- if (UNK_021C4D28.unk0c[heap_id] == 0)
+ if (sHeapInfo.numMemBlocks[heap_id] == 0)
{
- FUN_02016B90(heap_id);
+ GF_heap_c_dummy_return_true(heap_id);
}
- GF_ASSERT(UNK_021C4D28.unk0c[heap_id]);
+ GF_ASSERT(sHeapInfo.numMemBlocks[heap_id] != 0);
- UNK_021C4D28.unk0c[heap_id]--;
+ sHeapInfo.numMemBlocks[heap_id]--;
OSIntrMode intr_mode = OS_DisableInterrupts();
- NNS_FndFreeToExpHeap(ptr2, ptr - 16);
+ NNS_FndFreeToExpHeap(heap, ptr);
OS_RestoreInterrupts(intr_mode);
return;
}
- GF_AssertFail();
+ GF_ASSERT(0);
}
-void FreeToHeapExplicit(u32 param0, void *param1)
+void FreeToHeapExplicit(u32 heap_id, void *ptr)
{
- GF_ASSERT (OS_GetProcMode() != OS_PROCMODE_IRQ);
+ GF_ASSERT(OS_GetProcMode() != OS_PROCMODE_IRQ);
- if (param0 < UNK_021C4D28.unk14)
+ if (heap_id < sHeapInfo.totalNumHeaps)
{
- u8 index = UNK_021C4D28.unk10[param0];
- void *ptr = UNK_021C4D28.unk00[index];
- GF_ASSERT (ptr );
+ u8 index = sHeapInfo.heapIdxs[heap_id];
+ NNSFndHeapHandle heap = sHeapInfo.heapHandles[index];
+ GF_ASSERT( heap != NULL );
- u8 heap_id = (u8)((u32 *)param1)[-1];
- GF_ASSERT (heap_id == param0);
+ ptr -= sizeof(MemoryBlock);
+ GF_ASSERT(((MemoryBlock *)ptr)->heapId == heap_id);
- NNS_FndFreeToExpHeap(ptr, param1 - 16);
- GF_ASSERT (UNK_021C4D28.unk0c[param0]);
+ NNS_FndFreeToExpHeap(heap, ptr);
+ GF_ASSERT(sHeapInfo.numMemBlocks[heap_id] != 0);
- UNK_021C4D28.unk0c[param0]--;
+ sHeapInfo.numMemBlocks[heap_id]--;
return;
}
- GF_AssertFail();
+ GF_ASSERT(0);
}
-THUMB_FUNC u32 FUN_02016AF8(u32 param0)
+THUMB_FUNC u32 GF_ExpHeap_FndGetTotalFreeSize(u32 heap_id)
{
- if (param0 < UNK_021C4D28.unk14)
+ if (heap_id < sHeapInfo.totalNumHeaps)
{
- u8 index = UNK_021C4D28.unk10[param0];
- return NNS_FndGetTotalFreeSizeForExpHeap(UNK_021C4D28.unk00[index]);
+ u8 index = sHeapInfo.heapIdxs[heap_id];
+ return NNS_FndGetTotalFreeSizeForExpHeap(sHeapInfo.heapHandles[index]);
}
- GF_AssertFail();
+ GF_ASSERT(0);
return 0;
}
-THUMB_FUNC void FUN_02016B20(u32 param0, u32 param1, u32 param2)
+THUMB_FUNC void GF_ExpHeap_FndInitAllocator(NNSFndAllocator * pAllocator, u32 heap_id, int alignment)
{
- if (param1 < UNK_021C4D28.unk14)
+ if (heap_id < sHeapInfo.totalNumHeaps)
{
- u8 index = UNK_021C4D28.unk10[param1];
- NNS_FndInitAllocatorForExpHeap(param0, UNK_021C4D28.unk00[index], param2);
+ u8 index = sHeapInfo.heapIdxs[heap_id];
+ NNS_FndInitAllocatorForExpHeap(pAllocator, sHeapInfo.heapHandles[index], alignment);
return;
}
- GF_AssertFail();
+ GF_ASSERT(0);
}
-THUMB_FUNC void FUN_02016B44(void *ptr, u32 param1)
+THUMB_FUNC void ReallocFromHeap(void *ptr, u32 newSize)
{
- GF_ASSERT (OS_GetProcMode() != OS_PROCMODE_IRQ);
+ GF_ASSERT(OS_GetProcMode() != OS_PROCMODE_IRQ);
- param1 += 16;
- if (NNS_FndGetSizeForMBlockExpHeap(ptr - 16) >= param1)
+ newSize += sizeof(MemoryBlock);
+ ptr -= sizeof(MemoryBlock);
+ if (NNS_FndGetSizeForMBlockExpHeap(ptr) >= newSize)
{
- u8 heap_id = (u8)((u32 *)ptr)[-1];
+ u32 heap_id = ((MemoryBlock *)ptr)->heapId;
- u8 index = UNK_021C4D28.unk10[heap_id];
+ u8 index = sHeapInfo.heapIdxs[heap_id];
- NNS_FndResizeForMBlockExpHeap(UNK_021C4D28.unk00[index], ptr - 16, param1);
+ NNS_FndResizeForMBlockExpHeap(sHeapInfo.heapHandles[index], ptr, newSize);
return;
}
- GF_AssertFail();
+ GF_ASSERT(0);
}
-THUMB_FUNC u32 FUN_02016B90(u32 param0)
+THUMB_FUNC BOOL GF_heap_c_dummy_return_true(u32 heap_id)
{
-#pragma unused(param0)
- return 1;
+#pragma unused(heap_id)
+ return TRUE;
}
diff --git a/arm9/src/mail_message.c b/arm9/src/mail_message.c
index a5837d89..751a3ff0 100644
--- a/arm9/src/mail_message.c
+++ b/arm9/src/mail_message.c
@@ -3,6 +3,7 @@
#include "script_buffers.h"
#include "unk_0201B8B8.h"
#include "mail_message.h"
+#include "msgdata/msg.naix"
#pragma thumb on
@@ -19,11 +20,11 @@ struct UnkStruct_020ED556
extern u16 GetECWordIndexByPair(s16 bank, u16 num);
const u16 UNK_020ED54C[] = {
- 397,
- 399,
- 395,
- 396,
- 398
+ NARC_msg_narc_0397_bin,
+ NARC_msg_narc_0399_bin,
+ NARC_msg_narc_0395_bin,
+ NARC_msg_narc_0396_bin,
+ NARC_msg_narc_0398_bin
};
const struct UnkStruct_020ED556 UNK_020ED556[] = {
@@ -155,7 +156,7 @@ u16 MailMsg_GetMsgNo(struct MailMessage * mailMsg)
return mailMsg->msg_no;
}
-BOOL MailMsg_compare(struct MailMessage * mailMsg, struct MailMessage * a1)
+BOOL MailMsg_compare(const struct MailMessage *mailMsg, const struct MailMessage *a1)
{
s32 i;
if (mailMsg->msg_bank != a1->msg_bank || mailMsg->msg_no != a1->msg_no)
diff --git a/arm9/src/main.c b/arm9/src/main.c
index 749bec41..979fb7ca 100644
--- a/arm9/src/main.c
+++ b/arm9/src/main.c
@@ -53,10 +53,10 @@ THUMB_FUNC void NitroMain(void)
{
InitSystemForTheGame();
InitGraphicMemory();
- FUN_020163BC();
+ InitKeypadAndTouchpad();
FUN_02016438(0);
- PM_GetBackLight((PMBackLightSwitch *)SDK_STATIC_BSS_START, NULL);
+ PM_GetBackLight(&gBacklightTop, NULL);
FUN_02022294();
GF_InitRTCWork();
@@ -104,8 +104,8 @@ THUMB_FUNC void NitroMain(void)
{
FUN_02000EE8();
HandleDSLidAction();
- FUN_02016464();
- if ((gMain.unk38 & SOFT_RESET_KEY) == SOFT_RESET_KEY && !gMain.unk68) // soft reset?
+ ReadKeypadAndTocuhpad();
+ if ((gMain.heldKeysRaw & SOFT_RESET_KEY) == SOFT_RESET_KEY && !gMain.softResetDisabled) // soft reset?
{
DoSoftReset(0); // soft reset?
}
@@ -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;
}
@@ -248,7 +247,7 @@ THUMB_FUNC void FUN_02000F4C(u32 arg0, u32 arg1)
while (1)
{
HandleDSLidAction();
- FUN_02016464();
+ ReadKeypadAndTocuhpad();
if (gMain.newKeys & 1)
break;
FUN_02000E9C();
diff --git a/arm9/src/options.c b/arm9/src/options.c
index 296b398a..03b63864 100644
--- a/arm9/src/options.c
+++ b/arm9/src/options.c
@@ -35,14 +35,14 @@ void Options_SetButtonModeOnMain(struct SaveBlock2 * sav2, u32 buttonMode) {
switch (buttonMode) {
case 1:
- gMain.unk34 = 1;
+ gMain.buttonMode = 1;
break;
case 2:
- gMain.unk34 = 3;
+ gMain.buttonMode = 3;
break;
case 0:
default:
- gMain.unk34 = 0;
+ gMain.buttonMode = 0;
break;
}
}
diff --git a/arm9/src/player_data.c b/arm9/src/player_data.c
index ea5802aa..182e99e8 100644
--- a/arm9/src/player_data.c
+++ b/arm9/src/player_data.c
@@ -111,12 +111,12 @@ u16 PlayerProfile_GetTrainerID_VisibleHalf(struct PlayerData * data)
return (u16)data->playerId;
}
-void PlayerProfile_SetTrainerGender(struct PlayerData * data, u8 gender)
+void PlayerProfile_SetTrainerGender(struct PlayerData * data, GenderEnum gender)
{
data->gender = gender;
}
-u32 PlayerProfile_GetTrainerGender(struct PlayerData * data)
+GenderEnum PlayerProfile_GetTrainerGender(struct PlayerData * data)
{
return data->gender;
}
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/render_text.c b/arm9/src/render_text.c
new file mode 100644
index 00000000..af0218c8
--- /dev/null
+++ b/arm9/src/render_text.c
@@ -0,0 +1,502 @@
+#include "global.h"
+#include "render_text.h"
+#include "game_init.h"
+#include "string_util.h"
+#include "text.h"
+#include "unk_0201B8B8.h"
+
+u16 unk00;
+
+TextFlags gTextFlags;
+
+const u8 UNK_020ECB50[] = { 0, 1, 2, 1 };
+
+extern const char *FUN_02002D94(u8, u16);
+extern void PlaySE(u16);
+
+THUMB_FUNC u32 RenderText(struct TextPrinter *printer)
+{
+
+ struct TextPrinterSubStruct *subStruct =
+ (struct TextPrinterSubStruct *)(&printer->subStructFields);
+ u16 currentChar;
+
+ switch (printer->state)
+ {
+ case 0:
+ if (((gMain.heldKeys & 3) != 0 && subStruct->hasPrintBeenSpedUp != 0) ||
+ (gMain.touchHeld != 0 && gTextFlags.unk0_4 != 0))
+ {
+ printer->delayCounter = 0;
+ if (printer->textSpeedBottom != 0)
+ {
+ gTextFlags.unk0_6 = 1;
+ }
+ }
+
+ if (printer->delayCounter && printer->textSpeedBottom)
+ {
+ printer->delayCounter--;
+
+ if (gTextFlags.canABSpeedUpPrint != 0)
+ {
+ if ((gMain.newKeys & 3) || (gMain.touchNew != 0 && gTextFlags.unk0_4))
+ {
+ subStruct->hasPrintBeenSpedUp = 1;
+ printer->delayCounter = 0;
+ }
+ }
+
+ return 3;
+ }
+
+ printer->delayCounter = printer->textSpeedBottom;
+ currentChar = *printer->printerTemplate.currentChar.raw;
+ printer->printerTemplate.currentChar.raw++;
+
+ GF_ASSERT(currentChar != 0xF100);
+
+ switch (currentChar)
+ {
+ case EOS:
+ return 1;
+ case 0xE000:
+ printer->printerTemplate.currentX = printer->printerTemplate.x;
+ s32 fontAttribute = GetFontAttribute(printer->printerTemplate.fontId, 1);
+
+ printer->printerTemplate.currentY +=
+ printer->printerTemplate.lineSpacing + fontAttribute;
+
+ return 2;
+
+ case 0xF0FD:
+ printer->printerTemplate.currentChar.raw++;
+ return 2;
+ case 0xFFFE:
+ printer->printerTemplate.currentChar.raw--;
+ switch ((u16)MsgArray_GetControlCode(printer->printerTemplate.currentChar.raw))
+ {
+ case 0xFF00:
+ u16 field = (u16)MsgArray_ControlCodeGetField(
+ printer->printerTemplate.currentChar.raw, 0);
+ if (field == 0xff)
+ {
+ u8 r2 = printer->printerTemplate.unk4;
+ printer->printerTemplate.unk4 =
+ (u8)((printer->printerTemplate.fgColor - 1) / 2 + 100);
+
+ if (!(r2 >= 100 && r2 < 107))
+ {
+ break;
+ }
+
+ field = (u16)(r2 - 100);
+ }
+ else
+ {
+ if (field >= 0x64)
+ {
+ printer->printerTemplate.unk4 = (u8)field;
+ break;
+ }
+ }
+
+ printer->printerTemplate.fgColor = (u8)(field * 2 + 1);
+ printer->printerTemplate.shadowColor = (u8)(field * 2 + 2);
+
+ GenerateFontHalfRowLookupTable(printer->printerTemplate.fgColor,
+ printer->printerTemplate.bgColor,
+ printer->printerTemplate.shadowColor);
+
+ break;
+
+ case 0x200:
+ field = (u16)MsgArray_ControlCodeGetField(
+ printer->printerTemplate.currentChar.raw, 0);
+
+ FUN_0201C1EC(printer,
+ printer->printerTemplate.currentX,
+ printer->printerTemplate.currentY,
+ field);
+ if (printer->textSpeedTop != 0)
+ {
+ CopyWindowToVram(printer->printerTemplate.window);
+ }
+
+ break;
+ case 0x201:
+ printer->delayCounter = (u8)MsgArray_ControlCodeGetField(
+ printer->printerTemplate.currentChar.raw, 0);
+ printer->printerTemplate.currentChar.raw =
+ MsgArray_SkipControlCode(printer->printerTemplate.currentChar.raw);
+ printer->state = 6;
+
+ return 3;
+ case 0x202:
+ printer->Unk2A = (u16)MsgArray_ControlCodeGetField(
+ printer->printerTemplate.currentChar.raw, 0);
+ printer->printerTemplate.currentChar.raw =
+ MsgArray_SkipControlCode(printer->printerTemplate.currentChar.raw);
+
+ return 3;
+ case 0x203:
+ printer->printerTemplate.currentX = (u8)MsgArray_ControlCodeGetField(
+ printer->printerTemplate.currentChar.raw, 0);
+ break;
+ case 0x204:
+ printer->printerTemplate.currentY = (u8)MsgArray_ControlCodeGetField(
+ printer->printerTemplate.currentChar.raw, 0);
+ break;
+
+ case 0xFF01:
+ field = (u16)MsgArray_ControlCodeGetField(
+ printer->printerTemplate.currentChar.raw, 0);
+
+ switch (field)
+ {
+ case 100:
+ printer->printerTemplate.unk2 = 0;
+ printer->printerTemplate.unk3 = 0;
+ break;
+ case 200:
+ printer->printerTemplate.unk2 = 0xFFFC;
+ printer->printerTemplate.unk3 = 0;
+ break;
+ }
+
+ break;
+
+ case 0xFE06:
+ field = (u16)MsgArray_ControlCodeGetField(
+ printer->printerTemplate.currentChar.raw, 0);
+ if (field != 0xFE00)
+ {
+ if (field != 0xFE01)
+ {
+ break;
+ }
+
+ printer->state = 2;
+ TextPrinterInitDownArrowCounters(printer);
+ printer->printerTemplate.currentChar.raw = MsgArray_SkipControlCode(
+ printer->printerTemplate.currentChar.raw);
+
+ return 3;
+ }
+
+ printer->state = 3;
+ TextPrinterInitDownArrowCounters(printer);
+ printer->printerTemplate.currentChar.raw =
+ MsgArray_SkipControlCode(printer->printerTemplate.currentChar.raw);
+
+ return 3;
+ }
+
+ printer->printerTemplate.currentChar.raw =
+ MsgArray_SkipControlCode(printer->printerTemplate.currentChar.raw);
+ return 2;
+
+ case 0x25BC:
+ printer->state = 2;
+ TextPrinterInitDownArrowCounters(printer);
+ return 3;
+
+ case 0x25BD:
+ printer->state = 3;
+ TextPrinterInitDownArrowCounters(printer);
+ return 3;
+ }
+
+ const char *r5 = FUN_02002D94(subStruct->glyphId, currentChar);
+ CopyGlyphToWindow(printer->printerTemplate.window,
+ r5,
+ r5[0x80],
+ r5[0x81],
+ printer->printerTemplate.currentX,
+ printer->printerTemplate.currentY,
+ printer->printerTemplate.unk2);
+
+ printer->printerTemplate.currentX += r5[0x80] + printer->printerTemplate.letterSpacing;
+
+ return 0;
+ case 1:
+ if (TextPrinterWait(printer) != 0)
+ {
+ TextPrinterClearDownArrow(printer);
+
+ printer->state = 0;
+ }
+
+ return 3;
+ case 2:
+ if (TextPrinterWaitWithDownArrow(printer) != 0)
+ {
+ TextPrinterClearDownArrow(printer);
+ FillWindowPixelBuffer(
+ printer->printerTemplate.window, printer->printerTemplate.bgColor);
+ printer->printerTemplate.currentX = printer->printerTemplate.x;
+ printer->printerTemplate.currentY = printer->printerTemplate.y;
+ printer->state = 0;
+ }
+
+ return 3;
+ case 3:
+ if (TextPrinterWaitWithDownArrow(printer) != 0)
+ {
+ TextPrinterClearDownArrow(printer);
+ printer->scrollDistance =
+ (u8)(GetFontAttribute(printer->printerTemplate.fontId, 1) +
+ printer->printerTemplate.lineSpacing);
+ printer->printerTemplate.currentX = printer->printerTemplate.x;
+ printer->state = 4;
+ }
+
+ return 3;
+ case 4:
+ if (printer->scrollDistance != 0)
+ {
+ if ((int)printer->scrollDistance < 4)
+ {
+ ScrollWindow(printer->printerTemplate.window,
+ 0,
+ printer->scrollDistance,
+ (u8)(printer->printerTemplate.bgColor |
+ (printer->printerTemplate.bgColor << 4)));
+ printer->scrollDistance = 0;
+ }
+ else
+ {
+ ScrollWindow(printer->printerTemplate.window,
+ 0,
+ 4,
+ (u8)(printer->printerTemplate.bgColor |
+ (printer->printerTemplate.bgColor << 4)));
+
+ printer->scrollDistance -= 4;
+ }
+
+ CopyWindowToVram(printer->printerTemplate.window);
+ }
+ else
+ {
+ printer->state = 0;
+ }
+
+ return 3;
+ case 5:
+ printer->state = 0;
+ return 3;
+ case 6:
+ if (printer->delayCounter != 0)
+ {
+ printer->delayCounter--;
+ }
+ else
+ {
+ printer->state = 0;
+ }
+
+ return 3;
+ }
+
+ return 1;
+}
+
+THUMB_FUNC void FUN_02002840(u16 flag)
+{
+ unk00 = flag;
+}
+
+THUMB_FUNC void TextPrinterInitDownArrowCounters(struct TextPrinter *printer)
+{
+ struct TextPrinterSubStruct *subStruct =
+ (struct TextPrinterSubStruct *)(&printer->subStructFields);
+
+ if (gTextFlags.autoScroll)
+ {
+ subStruct->autoScrollDelay = 0;
+ return;
+ }
+
+ subStruct->downArrowYPosIdx = 0;
+ subStruct->downArrowDelay = 0;
+}
+
+THUMB_FUNC void TextPrinterDrawDownArrow(struct TextPrinter *printer)
+{
+ struct TextPrinterSubStruct *subStruct =
+ (struct TextPrinterSubStruct *)(&printer->subStructFields);
+
+ if (gTextFlags.autoScroll)
+ {
+ return;
+ }
+
+ if (subStruct->downArrowDelay != 0)
+ {
+ subStruct->downArrowDelay--;
+ return;
+ }
+
+ u8 bg_id = GetWindowBgId(printer->printerTemplate.window);
+ u8 x = GetWindowX(printer->printerTemplate.window);
+ u8 y = GetWindowY(printer->printerTemplate.window);
+ u8 width = GetWindowWidth(printer->printerTemplate.window);
+ u16 r6 = unk00;
+
+ FillBgTilemapRect(printer->printerTemplate.window->bgConfig,
+ bg_id,
+ (u16)(r6 + 18 + UNK_020ECB50[subStruct->downArrowYPosIdx] * 4),
+ (u8)(x + width + 1),
+ (u8)(y + 2),
+ 1,
+ 1,
+ 0x10);
+
+ FillBgTilemapRect(printer->printerTemplate.window->bgConfig,
+ bg_id,
+ (u16)(r6 + 19 + UNK_020ECB50[subStruct->downArrowYPosIdx] * 4),
+ (u8)(x + width + 2),
+ (u8)(y + 2),
+ 1,
+ 1,
+ 0x10);
+ FillBgTilemapRect(printer->printerTemplate.window->bgConfig,
+ bg_id,
+ (u16)(r6 + 20 + UNK_020ECB50[subStruct->downArrowYPosIdx] * 4),
+ (u8)(x + width + 1),
+ (u8)(y + 3),
+ 1,
+ 1,
+ 0x10);
+ FillBgTilemapRect(printer->printerTemplate.window->bgConfig,
+ bg_id,
+ (u16)(r6 + 21 + UNK_020ECB50[subStruct->downArrowYPosIdx] * 4),
+ (u8)(x + width + 2),
+ (u8)(y + 3),
+ 1,
+ 1,
+ 0x10);
+
+ BgCommitTilemapBufferToVram(printer->printerTemplate.window->bgConfig, bg_id);
+ subStruct->downArrowDelay = 8;
+ subStruct->downArrowYPosIdx++;
+}
+
+THUMB_FUNC void TextPrinterClearDownArrow(struct TextPrinter *printer)
+{
+ u8 bg_id = GetWindowBgId(printer->printerTemplate.window);
+ u8 x = GetWindowX(printer->printerTemplate.window);
+ u8 y = GetWindowY(printer->printerTemplate.window);
+ u8 width = GetWindowWidth(printer->printerTemplate.window);
+ u16 r6 = unk00;
+
+ FillBgTilemapRect(printer->printerTemplate.window->bgConfig,
+ bg_id,
+ (u16)(r6 + 10),
+ (u8)(x + width + 1),
+ (u8)(y + 2),
+ 1,
+ 2,
+ 0x10);
+ FillBgTilemapRect(printer->printerTemplate.window->bgConfig,
+ bg_id,
+ (u16)(r6 + 11),
+ (u8)(x + width + 2),
+ (u8)(y + 2),
+ 1,
+ 2,
+ 0x10);
+ BgCommitTilemapBufferToVram(printer->printerTemplate.window->bgConfig, bg_id);
+}
+
+THUMB_FUNC BOOL TextPrinterContinue(struct TextPrinter *printer)
+{
+#pragma unused(printer)
+ if ((gMain.newKeys & 3) != 0 || (gMain.touchNew != 0 && gTextFlags.unk0_4 != 0))
+ {
+ PlaySE(0x5DC);
+
+ gTextFlags.unk0_7 = 1;
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+THUMB_FUNC BOOL TextPrinterWaitAutoMode(struct TextPrinter *printer)
+{
+ struct TextPrinterSubStruct *subStruct =
+ (struct TextPrinterSubStruct *)(&printer->subStructFields);
+
+ if (subStruct->autoScrollDelay == 100)
+ {
+ return TRUE;
+ }
+
+ subStruct->autoScrollDelay++;
+ if (gTextFlags.unk0_5)
+ {
+ return TextPrinterContinue(printer);
+ }
+
+ return FALSE;
+}
+
+THUMB_FUNC BOOL TextPrinterWaitWithDownArrow(struct TextPrinter *printer)
+{
+ if (gTextFlags.autoScroll)
+ {
+ return TextPrinterWaitAutoMode(printer);
+ }
+ TextPrinterDrawDownArrow(printer);
+
+ return TextPrinterContinue(printer);
+}
+
+THUMB_FUNC u8 TextPrinterWait(struct TextPrinter *printer)
+{
+ if (gTextFlags.autoScroll)
+ {
+ return (u8)TextPrinterWaitAutoMode(printer);
+ }
+
+ return (u8)TextPrinterContinue(printer);
+}
+
+THUMB_FUNC void TextFlags_SetCanABSpeedUpPrint(BOOL param0)
+{
+ gTextFlags.canABSpeedUpPrint = param0;
+}
+
+THUMB_FUNC void FUN_02002B7C(s32 param0)
+{
+ gTextFlags.autoScroll = param0 & 1;
+ gTextFlags.unk0_5 = (param0 >> 1) & 1;
+}
+
+THUMB_FUNC void FUN_02002BB8(u32 param0)
+{
+ gTextFlags.unk0_4 = param0;
+}
+
+THUMB_FUNC u8 FUN_02002BD4()
+{
+ return gTextFlags.unk0_6;
+}
+
+THUMB_FUNC void FUN_02002BE4()
+{
+ gTextFlags.unk0_6 = 0;
+}
+
+THUMB_FUNC u8 FUN_02002BF4()
+{
+ return gTextFlags.unk0_7;
+}
+
+THUMB_FUNC void FUN_02002C04()
+{
+ gTextFlags.unk0_7 = 0;
+}
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_18_c.c b/arm9/src/scrcmd_18_c.c
deleted file mode 100644
index d4437c5f..00000000
--- a/arm9/src/scrcmd_18_c.c
+++ /dev/null
@@ -1,22 +0,0 @@
-#include "global.h"
-#include "script.h"
-#include "party.h"
-#include "save_block_2.h"
-#include "unk_0204639C.h"
-#include "map_header.h"
-#include "scrcmd.h"
-
-extern BOOL GiveMon(u32 heap_id, struct SaveBlock2 * sav2, u16 species, u8 level, u16 item, u32 mapSec, u8 encounterType);
-
-THUMB_FUNC BOOL ScrCmd_GiveMon(struct ScriptContext* ctx)
-{
- u32 mapSec = MapHeader_GetMapSec(*(ctx->unk80->mapId));
- struct UnkSavStruct80 *savePtr = ctx->unk80;
- u16 species = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
- u16 level = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
- u16 item = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
- u16 * varPtr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
- struct PlayerParty * party = SavArray_PlayerParty_get(savePtr->saveBlock2);
- *varPtr = (u16)GiveMon(11, savePtr->saveBlock2, species, (u8)level, item, mapSec, 12);
- return FALSE;
-}
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/scrcmd_party.c b/arm9/src/scrcmd_party.c
new file mode 100644
index 00000000..48d558c9
--- /dev/null
+++ b/arm9/src/scrcmd_party.c
@@ -0,0 +1,815 @@
+#include "scrcmd.h"
+#include "constants/moves.h"
+#include "itemtool.h"
+#include "map_header.h"
+#include "module_05.h"
+#include "party.h"
+#include "save_block_2.h"
+#include "script_pokemon_util.h"
+#include "unk_02015CC0.h"
+#include "unk_02022504.h"
+#include "unk_0204639C.h"
+#include "unk_0207FC5C.h"
+
+extern u16 FUN_02054DEC(struct SaveBlock2* sav2);
+
+THUMB_FUNC BOOL ScrCmd_GiveMon(struct ScriptContext* ctx)
+{
+ u32 mapSec = MapHeader_GetMapSec(*(ctx->unk80->mapId));
+ struct UnkSavStruct80 *savePtr = ctx->unk80;
+ u16 species = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 level = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 item = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 * varPtr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ struct PlayerParty * party = SavArray_PlayerParty_get(savePtr->saveBlock2);
+ *varPtr = (u16)GiveMon(11, savePtr->saveBlock2, species, (u8)level, item, mapSec, 12);
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_GetPartyMonSpecies(struct ScriptContext* ctx)
+{
+ u32 species;
+ u16* ret_ptr;
+
+ struct UnkSavStruct80* sav_ptr = ctx->unk80;
+ u16* mon_slot = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ struct PlayerParty* party = SavArray_PlayerParty_get(sav_ptr->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, *mon_slot);
+
+ BOOL party_mon_is_egg = (BOOL)GetMonData(party_mon, MON_DATA_IS_EGG, NULL);
+ if (party_mon_is_egg == FALSE)
+ {
+ species = GetMonData(party_mon, MON_DATA_SPECIES, NULL);
+ }
+ else
+ {
+ species = SPECIES_NONE;
+ }
+
+ *ret_ptr = (u16)species;
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_CheckPartyMonOTID(struct ScriptContext* ctx)
+{
+ struct UnkSavStruct80* sav_ptr = ctx->unk80;
+ struct SaveBlock2* sav2 = ScriptEnvironment_GetSav2Ptr(sav_ptr);
+ struct PlayerData* player = Sav2_PlayerData_GetProfileAddr(sav2);
+
+ u16* mon_slot = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+
+ struct PlayerParty* party = SavArray_PlayerParty_get(sav_ptr->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, *mon_slot);
+
+ u16 party_mon_otid = (u16)GetMonData(party_mon, MON_DATA_OTID, NULL);
+ u16 player_otid = (u16)PlayerProfile_GetTrainerID(player);
+ if (party_mon_otid == player_otid)
+ {
+ *ret_ptr = 0;
+ }
+ else
+ {
+ *ret_ptr = 1;
+ }
+
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_GiveEgg(struct ScriptContext* ctx)
+{
+ struct UnkSavStruct80* sav_ptr = ctx->unk80;
+ struct PlayerData* player = Sav2_PlayerData_GetProfileAddr(sav_ptr->saveBlock2);
+ u16 species = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 unk = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ struct PlayerParty* party = SavArray_PlayerParty_get(sav_ptr->saveBlock2);
+ u8 party_count = (u8)GetPartyCount(party);
+
+ if (party_count < PARTY_SIZE)
+ {
+ struct Pokemon* egg = AllocMonZeroed(11);
+ ZeroMonData(egg);
+
+ s32 met_loc = FUN_02015CF8(1, unk);
+ MOD05_SetEggStats(egg, species, 1, player, 3, met_loc);
+
+ AddMonToParty(party, egg);
+ FreeToHeap(egg);
+ }
+
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_SetPartyMonMove(struct ScriptContext* ctx)
+{
+ u16 mon_slot = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 move_slot = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 move = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ struct PlayerParty* party = SavArray_PlayerParty_get(ctx->unk80->saveBlock2);
+
+ PartyMonSetMoveInSlot(party, mon_slot, move_slot, move);
+
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_PartyMonHasMove(struct ScriptContext* ctx)
+{
+ struct UnkSavStruct80* sav_ptr = ctx->unk80;
+ u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 required_move = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 mon_slot = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ struct PlayerParty* party = SavArray_PlayerParty_get(sav_ptr->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, mon_slot);
+
+ *ret_ptr = 0;
+
+ BOOL party_mon_is_egg = (BOOL)GetMonData(party_mon, MON_DATA_IS_EGG, NULL);
+ if (party_mon_is_egg)
+ {
+ return FALSE;
+ }
+
+ if (required_move == GetMonData(party_mon, MON_DATA_MOVE1, NULL) ||
+ required_move == GetMonData(party_mon, MON_DATA_MOVE2, NULL) ||
+ required_move == GetMonData(party_mon, MON_DATA_MOVE3, NULL) ||
+ required_move == GetMonData(party_mon, MON_DATA_MOVE4, NULL))
+ {
+ *ret_ptr = 1;
+ }
+
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_FindPartyMonWithMove(struct ScriptContext* ctx)
+{
+ struct UnkSavStruct80* sav_ptr = ctx->unk80;
+ u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 required_move = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ u8 party_count = (u8)GetPartyCount(SavArray_PlayerParty_get(sav_ptr->saveBlock2));
+
+ u8 i;
+ for (i = 0, *ret_ptr = PARTY_SIZE; i < party_count; i++)
+ {
+ struct PlayerParty* party = SavArray_PlayerParty_get(sav_ptr->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, i);
+
+ BOOL party_mon_is_egg = (BOOL)GetMonData(party_mon, MON_DATA_IS_EGG, NULL);
+ if (party_mon_is_egg == FALSE)
+ {
+ if (required_move == GetMonData(party_mon, MON_DATA_MOVE1, NULL) ||
+ required_move == GetMonData(party_mon, MON_DATA_MOVE2, NULL) ||
+ required_move == GetMonData(party_mon, MON_DATA_MOVE3, NULL) ||
+ required_move == GetMonData(party_mon, MON_DATA_MOVE4, NULL))
+ {
+ *ret_ptr = i;
+ break;
+ }
+ }
+ }
+
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_SurvivePsn(struct ScriptContext* ctx)
+{
+ u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 mon_slot = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ struct PlayerParty* party = SavArray_PlayerParty_get(ctx->unk80->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, mon_slot);
+
+ *ret_ptr = (u16)SurvivePoisoning(party_mon);
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_CountPartyMonsAtOrBelowLevel(struct ScriptContext* ctx)
+{
+ u8 party_count;
+ u8 i;
+
+ struct UnkSavStruct80* sav_ptr = ctx->unk80;
+ u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 highest_level = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ party_count = (u8)GetPartyCount(SavArray_PlayerParty_get(sav_ptr->saveBlock2));
+
+ u8 mons;
+ for (i = 0, mons = 0, *ret_ptr = 0; i < party_count; i++)
+ {
+ struct PlayerParty* party = SavArray_PlayerParty_get(sav_ptr->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, i);
+
+ BOOL party_mon_is_egg = (BOOL)GetMonData(party_mon, MON_DATA_IS_EGG, NULL);
+ if (party_mon_is_egg == FALSE)
+ {
+ u32 party_mon_level = GetMonData(party_mon, MON_DATA_LEVEL, NULL);
+ if (party_mon_level <= highest_level)
+ {
+ mons++;
+ }
+ }
+ }
+
+ *ret_ptr = mons;
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_GetPartyMonLevel(struct ScriptContext* ctx)
+{
+ struct UnkSavStruct80* sav_ptr = ctx->unk80;
+ u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 mon_slot = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ struct PlayerParty* party = SavArray_PlayerParty_get(sav_ptr->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, mon_slot);
+
+ *ret_ptr = 0;
+
+ BOOL party_mon_is_egg = (BOOL)GetMonData(party_mon, MON_DATA_IS_EGG, NULL);
+ if (party_mon_is_egg == FALSE)
+ {
+ *ret_ptr = (u16)GetMonData(party_mon, MON_DATA_LEVEL, NULL);
+ }
+
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_GetPartyMonNature(struct ScriptContext* ctx)
+{
+ struct UnkSavStruct80* sav_ptr = ctx->unk80;
+ u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 mon_slot = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ u8 party_count = (u8)GetPartyCount(SavArray_PlayerParty_get(sav_ptr->saveBlock2));
+
+ if (mon_slot >= party_count)
+ {
+ *ret_ptr = 0;
+ return FALSE;
+ }
+
+ struct PlayerParty* party = SavArray_PlayerParty_get(sav_ptr->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, mon_slot);
+
+ BOOL party_mon_is_egg = (BOOL)GetMonData(party_mon, MON_DATA_IS_EGG, NULL);
+ if (party_mon_is_egg)
+ {
+ *ret_ptr = 0;
+ return FALSE;
+ }
+
+ *ret_ptr = GetMonNature(party_mon);
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_FindPartyMonWithNature(struct ScriptContext* ctx)
+{
+ struct UnkSavStruct80* sav_ptr = ctx->unk80;
+ u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 required_nature = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ u8 party_count = (u8)GetPartyCount(SavArray_PlayerParty_get(sav_ptr->saveBlock2));
+
+ u8 i;
+ for (i = 0, *ret_ptr = 0xFF; i < party_count; i++)
+ {
+ struct PlayerParty* party = SavArray_PlayerParty_get(sav_ptr->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, i);
+
+ BOOL party_mon_is_egg = (BOOL)GetMonData(party_mon, MON_DATA_IS_EGG, NULL);
+ if (party_mon_is_egg == FALSE)
+ {
+ u8 party_mon_nature = GetMonNature(party_mon);
+ if (required_nature == party_mon_nature)
+ {
+ *ret_ptr = i;
+ break;
+ }
+ }
+ }
+
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_GetPartyMonFriendship(struct ScriptContext* ctx)
+{
+ struct UnkSavStruct80* sav_ptr = ctx->unk80;
+ u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 mon_slot = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ struct PlayerParty* party = SavArray_PlayerParty_get(sav_ptr->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, mon_slot);
+
+ *ret_ptr = (u16)GetMonData(party_mon, MON_DATA_FRIENDSHIP, NULL);
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_AddPartyMonFriendship(struct ScriptContext* ctx)
+{
+ struct UnkSavStruct80* sav_ptr = ctx->unk80;
+ u16 friendship_to_add = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 mon_slot = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 map_sec = MapHeader_GetMapSec(*ctx->unk80->mapId);
+ struct PlayerParty* party = SavArray_PlayerParty_get(sav_ptr->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, mon_slot);
+
+ u16 friendship = (u16)GetMonData(party_mon, MON_DATA_FRIENDSHIP, NULL);
+
+ if (friendship_to_add != 0)
+ {
+ u16 party_mon_held_item = (u16)GetMonData(party_mon, MON_DATA_HELD_ITEM, NULL);
+ u32 held_item_hold_effect = GetItemAttr(party_mon_held_item, ITEMATTR_HOLD_EFFECT, 11);
+ if (held_item_hold_effect == HOLD_EFFECT_FRIENDSHIP_UP)
+ {
+ friendship_to_add = (u16)((friendship_to_add * 150) / 100);
+ }
+
+ u32 party_mon_pokeball = GetMonData(party_mon, MON_DATA_POKEBALL, NULL);
+ if (party_mon_pokeball == ITEM_LUXURY_BALL)
+ {
+ friendship_to_add++;
+ }
+
+ u32 party_mon_egg_met_location = GetMonData(party_mon, MON_DATA_EGG_MET_LOCATION, NULL);
+ if (map_sec == party_mon_egg_met_location)
+ {
+ friendship_to_add++;
+ }
+ }
+
+ friendship += friendship_to_add;
+ if (friendship > 0xFF)
+ {
+ friendship = 0xFF;
+ }
+
+ SetMonData(party_mon, MON_DATA_FRIENDSHIP, &friendship);
+
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_SubtractPartyMonFriendship(struct ScriptContext* ctx)
+{
+ struct UnkSavStruct80* sav_ptr = ctx->unk80;
+ u16 friendship_to_deplete = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 mon_slot = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ struct PlayerParty* party = SavArray_PlayerParty_get(sav_ptr->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, mon_slot);
+
+ u16 friendship = (u16)GetMonData(party_mon, MON_DATA_FRIENDSHIP, NULL);
+ if (friendship_to_deplete > friendship)
+ {
+ friendship = 0;
+ }
+ else
+ {
+ friendship -= friendship_to_deplete;
+ }
+
+ SetMonData(party_mon, MON_DATA_FRIENDSHIP, &friendship);
+
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_GetPartyMonContestCondition(struct ScriptContext* ctx)
+{
+ u16 mon_slot = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 contest_condition_id = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ struct PlayerParty* party = SavArray_PlayerParty_get(ctx->unk80->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, mon_slot);
+
+ *ret_ptr = (u16)GetMonData(party_mon, MON_DATA_COOL + contest_condition_id, NULL);
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_GetLeadingPartyMonSlot(struct ScriptContext* ctx)
+{
+ u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+
+ *ret_ptr = FUN_02054DEC(ctx->unk80->saveBlock2);
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_GetPartyMonTypes(struct ScriptContext* ctx)
+{
+ struct UnkSavStruct80* sav_ptr = ctx->unk80;
+ u16* type1 = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ u16* type2 = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 mon_slot = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ struct PlayerParty* party = SavArray_PlayerParty_get(sav_ptr->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, mon_slot);
+
+ *type1 = (u16)GetMonData(party_mon, MON_DATA_TYPE_1, NULL);
+ *type2 = (u16)GetMonData(party_mon, MON_DATA_TYPE_2, NULL);
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_CountPartyMons(struct ScriptContext* ctx)
+{
+ struct UnkSavStruct80* sav_ptr = ctx->unk80;
+ u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ struct PlayerParty* party = SavArray_PlayerParty_get(sav_ptr->saveBlock2);
+
+ *ret_ptr = (u16)GetPartyCount(party);
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_CountPartyMons_OmitEggs(struct ScriptContext* ctx)
+{
+ u32 non_egg_mons;
+ s32 i;
+
+ struct UnkSavStruct80* sav_ptr = ctx->unk80;
+ u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ s32 party_count = GetPartyCount(SavArray_PlayerParty_get(sav_ptr->saveBlock2));
+
+ for (i = 0, non_egg_mons = 0; i < party_count; i++)
+ {
+ struct PlayerParty* party = SavArray_PlayerParty_get(sav_ptr->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, i);
+
+ BOOL party_mon_is_egg = (BOOL)GetMonData(party_mon, MON_DATA_IS_EGG, NULL);
+ if (party_mon_is_egg == FALSE)
+ {
+ non_egg_mons++;
+ }
+
+ }
+
+ *ret_ptr = (u16)non_egg_mons;
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_CountAvailablePartyMons_IgnoreSlot(struct ScriptContext* ctx)
+{
+ u16 slot_to_ignore;
+ s32 party_count;
+
+ struct UnkSavStruct80* sav_ptr = ctx->unk80;
+ u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ slot_to_ignore = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ party_count = GetPartyCount(SavArray_PlayerParty_get(sav_ptr->saveBlock2));
+
+ u32 available_mons;
+ s32 i;
+ for (i = 0, available_mons = 0; i < party_count; i++)
+ {
+ if (i != slot_to_ignore)
+ {
+ struct PlayerParty* party = SavArray_PlayerParty_get(sav_ptr->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, i);
+
+ BOOL party_mon_is_egg = (BOOL)GetMonData(party_mon, MON_DATA_IS_EGG, NULL);
+ if (party_mon_is_egg == FALSE)
+ {
+ u32 party_mon_hp = GetMonData(party_mon, MON_DATA_HP, NULL);
+ if (party_mon_hp != 0)
+ {
+ available_mons++;
+ }
+ }
+ }
+ }
+
+ *ret_ptr = (u16)available_mons;
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_CountAvailablePartyAndPCMons(struct ScriptContext* ctx)
+{
+ s32 party_count;
+ struct PCStorage* pc;
+
+ struct UnkSavStruct80* sav_ptr = ctx->unk80;
+ u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ pc = GetStoragePCPointer(sav_ptr->saveBlock2);
+ party_count = GetPartyCount(SavArray_PlayerParty_get(sav_ptr->saveBlock2));
+
+ u32 mons;
+ s32 i;
+ for (i = 0, mons = 0; i < party_count; i++)
+ {
+ struct PlayerParty* party = SavArray_PlayerParty_get(sav_ptr->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, i);
+
+ BOOL party_mon_is_egg = (BOOL)GetMonData(party_mon, MON_DATA_IS_EGG, NULL);
+ if (party_mon_is_egg == FALSE)
+ {
+ u32 party_mon_hp = GetMonData(party_mon, MON_DATA_HP, NULL);
+ if (party_mon_hp != 0)
+ {
+ mons++;
+ }
+ }
+ }
+
+ *ret_ptr = (u16)(mons + PCStorage_CountMonsInAllBoxes(pc));
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_GetPartyEggCount(struct ScriptContext* ctx)
+{
+ s32 party_count;
+ u32 eggs_in_party;
+
+ struct UnkSavStruct80* sav_ptr = ctx->unk80;
+ u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ party_count = GetPartyCount(SavArray_PlayerParty_get(sav_ptr->saveBlock2));
+
+ s32 i;
+ for (i = 0, eggs_in_party = 0; i < party_count; i++)
+ {
+ struct PlayerParty* party = SavArray_PlayerParty_get(sav_ptr->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, i);
+
+ BOOL party_mon_is_egg = (BOOL)GetMonData(party_mon, MON_DATA_IS_EGG, NULL);
+ if (party_mon_is_egg)
+ {
+ eggs_in_party++;
+ }
+ }
+
+ *ret_ptr = (u16)eggs_in_party;
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_CheckPartyForPokerus(struct ScriptContext* ctx)
+{
+ u16 party_count;
+ u16 i;
+
+ struct UnkSavStruct80* sav_ptr = ctx->unk80;
+ u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ party_count = (u16)GetPartyCount(SavArray_PlayerParty_get(sav_ptr->saveBlock2));
+
+ for (i = 0, *ret_ptr = 0; i < party_count; i++)
+ {
+ struct PlayerParty* party = SavArray_PlayerParty_get(sav_ptr->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, i);
+
+ BOOL party_mon_has_pokerus = (BOOL)GetMonData(party_mon, MON_DATA_POKERUS, NULL);
+ if (party_mon_has_pokerus)
+ {
+ *ret_ptr = 1;
+ break;
+ }
+ }
+
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_GetPartyMonGender(struct ScriptContext* ctx)
+{
+ u16 mon_slot = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ struct PlayerParty* party = SavArray_PlayerParty_get(ctx->unk80->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, mon_slot);
+
+ *ret_ptr = (u16)GetMonData(party_mon, MON_DATA_GENDER, NULL);
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_CountPartyMonMoves(struct ScriptContext* ctx)
+{
+ struct Pokemon* party_mon;
+ u8 moves;
+
+ struct UnkSavStruct80* sav_ptr = ctx->unk80;
+ u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 mon_slot = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ struct PlayerParty* party = SavArray_PlayerParty_get(sav_ptr->saveBlock2);
+ party_mon = GetPartyMonByIndex(party, mon_slot);
+
+ BOOL party_mon_is_egg = (BOOL)GetMonData(party_mon, MON_DATA_IS_EGG, NULL);
+ if (party_mon_is_egg)
+ {
+ *ret_ptr = 0;
+ return FALSE;
+ }
+
+ moves = 0;
+
+ u32 move1 = GetMonData(party_mon, MON_DATA_MOVE1, NULL);
+ if (move1 != MOVE_NONE)
+ {
+ moves++;
+ }
+
+ u32 move2 = GetMonData(party_mon, MON_DATA_MOVE2, NULL);
+ if (move2 != MOVE_NONE)
+ {
+ moves++;
+ }
+
+ u32 move3 = GetMonData(party_mon, MON_DATA_MOVE3, NULL);
+ if (move3 != MOVE_NONE)
+ {
+ moves++;
+ }
+
+ u32 move4 = GetMonData(party_mon, MON_DATA_MOVE4, NULL);
+ if (move4 != MOVE_NONE)
+ {
+ moves++;
+ }
+
+ *ret_ptr = moves;
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_ForgetPartyMonMove(struct ScriptContext* ctx)
+{
+ struct UnkSavStruct80* sav_ptr = ctx->unk80;
+ u16 mon_slot = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 move_slot = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ struct PlayerParty* party = SavArray_PlayerParty_get(sav_ptr->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, mon_slot);
+
+ FUN_020699A4(party_mon, move_slot);
+
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_GetPartyMonMove(struct ScriptContext* ctx)
+{
+ struct UnkSavStruct80* sav_ptr = ctx->unk80;
+ u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 mon_slot = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 move_slot = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ struct PlayerParty* party = SavArray_PlayerParty_get(sav_ptr->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, mon_slot);
+
+ *ret_ptr = (u16)GetMonData(party_mon, MON_DATA_MOVE1 + move_slot, NULL);
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_GetPartyMonHeldItem(struct ScriptContext* ctx)
+{
+ struct UnkSavStruct80* sav_ptr = ctx->unk80;
+ u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 mon_slot = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ struct PlayerParty* party = SavArray_PlayerParty_get(sav_ptr->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, mon_slot);
+
+ *ret_ptr = (u16)GetMonData(party_mon, MON_DATA_HELD_ITEM, NULL);
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_ResetPartyMonHeldItem(struct ScriptContext* ctx)
+{
+ struct UnkSavStruct80* sav_ptr = ctx->unk80;
+ u16 mon_slot = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ struct PlayerParty* party = SavArray_PlayerParty_get(sav_ptr->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, mon_slot);
+
+ u16 party_mon_held_item = ITEM_NONE;
+ SetMonData(party_mon, MON_DATA_HELD_ITEM, &party_mon_held_item);
+
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_CheckPartyForSpecies(struct ScriptContext* ctx)
+{
+ struct UnkSavStruct80* sav_ptr = ctx->unk80;
+ u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 species = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ u8 party_count = (u8)GetPartyCount(SavArray_PlayerParty_get(sav_ptr->saveBlock2));
+
+ u8 i;
+ for (i = 0, *ret_ptr = 0; i < party_count; i++)
+ {
+ struct PlayerParty* party = SavArray_PlayerParty_get(sav_ptr->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, i);
+
+ BOOL party_mon_is_egg = (BOOL)GetMonData(party_mon, MON_DATA_IS_EGG, NULL);
+ if (party_mon_is_egg == FALSE)
+ {
+ u16 party_mon_species = (u16)GetMonData(party_mon, MON_DATA_SPECIES, NULL);
+ if (species == party_mon_species)
+ {
+ *ret_ptr = 1;
+ break;
+ }
+ }
+ }
+
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_CountPartyMonRibbons(struct ScriptContext* ctx)
+{
+ u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 mon_slot = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ struct PlayerParty* party = SavArray_PlayerParty_get(ctx->unk80->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, mon_slot);
+
+ u16 ribbon_idx;
+ u16 ribbons;
+ for (ribbon_idx = 0, ribbons = 0; ribbon_idx < 80; ribbon_idx++)
+ {
+ BOOL party_mon_has_ribbon = (BOOL)GetMonData(party_mon, FUN_0207FC5C((u8)ribbon_idx, 0), NULL);
+ if (party_mon_has_ribbon)
+ {
+ ribbons++;
+ }
+ }
+
+ *ret_ptr = ribbons;
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_CountTotalPartyRibbons(struct ScriptContext* ctx)
+{
+ struct PlayerParty* party;
+ u16 ribbon_idx;
+ u16 ribbons;
+
+ u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 party_count = (u16)GetPartyCount(SavArray_PlayerParty_get(ctx->unk80->saveBlock2));
+ party = SavArray_PlayerParty_get(ctx->unk80->saveBlock2);
+
+ for (ribbon_idx = 0, ribbons = 0; ribbon_idx < 80; ribbon_idx++)
+ {
+ for (u16 i = 0; i < party_count; i++)
+ {
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, i);
+
+ BOOL party_mon_is_egg = (BOOL)GetMonData(party_mon, MON_DATA_IS_EGG, NULL);
+ if (party_mon_is_egg)
+ {
+ // BUG: This `break` should be a `continue`, as any party mons after a detected
+ // egg would have their ribbons ignored.
+ break;
+ }
+
+ BOOL party_mon_has_ribbon = (BOOL)GetMonData(party_mon, FUN_0207FC5C((u8)ribbon_idx, 0), NULL);
+ if (party_mon_has_ribbon)
+ {
+ ribbons++;
+ break;
+ }
+ }
+ }
+
+ *ret_ptr = ribbons;
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_PartyMonHasRibbon(struct ScriptContext* ctx)
+{
+ u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 mon_slot = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 ribbon_idx = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ struct PlayerParty* party = SavArray_PlayerParty_get(ctx->unk80->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, mon_slot);
+
+ *ret_ptr = (u16)GetMonData(party_mon, FUN_0207FC5C((u8)ribbon_idx, 0), NULL);
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_GivePartyMonRibbon(struct ScriptContext* ctx)
+{
+ u16 mon_slot = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 ribbon_idx = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
+ u8 mon_has_ribbon = TRUE;
+ struct PlayerParty* party = SavArray_PlayerParty_get(ctx->unk80->saveBlock2);
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, mon_slot);
+
+ SetMonData(party_mon, (s32)FUN_0207FC5C((u8)ribbon_idx, 0), &mon_has_ribbon);
+
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_CheckPartyForBadEgg(struct ScriptContext* ctx)
+{
+ u16 ribbon_idx;
+
+ u16* ret_ptr = GetVarPointer(ctx->unk80, ScriptReadHalfword(ctx));
+ u16 party_count = (u16)GetPartyCount(SavArray_PlayerParty_get(ctx->unk80->saveBlock2));
+ struct PlayerParty* party = SavArray_PlayerParty_get(ctx->unk80->saveBlock2);
+
+ // BUG: Probably a copy-paste fail. Checks if your party has a Bad Egg in it,
+ // 80 times.
+ for (ribbon_idx = 0; ribbon_idx < 80; ribbon_idx++)
+ {
+ for (u16 i = 0; i < party_count; i++)
+ {
+ struct Pokemon* party_mon = GetPartyMonByIndex(party, i);
+ BOOL party_mon_is_egg = (BOOL)GetMonData(party_mon, MON_DATA_IS_EGG, NULL);
+ if (party_mon_is_egg)
+ {
+ BOOL party_mon_is_bad_egg = (BOOL)GetMonData(party_mon, MON_DATA_CHECKSUM_FAILED, NULL);
+ if (party_mon_is_bad_egg)
+ {
+ *ret_ptr = 1;
+ return FALSE;
+ }
+ }
+ }
+ }
+
+ *ret_ptr = 0;
+ return FALSE;
+}
+
+THUMB_FUNC BOOL ScrCmd_Unk00A0(struct ScriptContext* ctx)
+{
+#pragma unused(ctx)
+ return FALSE;
+}
diff --git a/arm9/src/scrcmd_sound.c b/arm9/src/scrcmd_sound.c
index ec5ab7f8..1251c612 100644
--- a/arm9/src/scrcmd_sound.c
+++ b/arm9/src/scrcmd_sound.c
@@ -18,7 +18,7 @@ extern void FUN_0200538C(u32, u16, u32);
extern void FUN_020053CC(u16, u16);
extern BOOL FUN_02005404(void);
extern u16 FUN_02005410(u16);
-extern void FUN_020054C8(u16);
+extern void PlaySE(u16);
extern void FUN_020054F0(u16, u32);
extern void FUN_020047C8(u8, u8);
extern void FUN_020040F4(u8);
@@ -123,7 +123,7 @@ THUMB_FUNC BOOL ScrCmd_Unk0058(struct ScriptContext* ctx)
THUMB_FUNC BOOL ScrCmd_PlayFanfare(struct ScriptContext* ctx)
{
u16 unk = VarGet(ctx->unk80, ScriptReadHalfword(ctx));
- FUN_020054C8(unk);
+ PlaySE(unk);
return FALSE;
}
@@ -263,4 +263,3 @@ THUMB_FUNC BOOL ScrCmd_SetVolume(struct ScriptContext* ctx)
return FALSE;
}
-
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..f5527257 100644
--- a/arm9/src/text_02054590.c
+++ b/arm9/src/text_02054590.c
@@ -1,20 +1,17 @@
#include "text_02054590.h"
#include "text.h"
-#include "unk_02016B94.h"
+#include "bg_window.h"
+#include "render_text.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 +30,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);
}
@@ -59,15 +56,15 @@ THUMB_FUNC void FUN_0205464C(struct Window *param0)
THUMB_FUNC u16 FUN_02054658(struct Window * window, struct String *str, struct Options *options, u8 param3)
{
- FUN_02002B60(param3);
+ TextFlags_SetCanABSpeedUpPrint(param3);
FUN_02002B7C(0);
FUN_02002BB8(0);
return AddTextPrinterParameterized(window, 1, str, 0, 0, (u32)Options_GetTextFrameDelay(options), NULL);
}
-THUMB_FUNC u16 DrawFieldMessage(struct Window * window, struct String *str, u8 fontId, u32 speed, u8 a4, u32 a5)
+THUMB_FUNC u16 DrawFieldMessage(struct Window * window, struct String *str, u8 fontId, u32 speed, u8 a4, s32 a5)
{
- FUN_02002B60(a4);
+ TextFlags_SetCanABSpeedUpPrint(a4);
FUN_02002B7C(a5);
FUN_02002BB8(0);
return AddTextPrinterParameterized(window, fontId, str, 0, 0, speed, NULL);
@@ -79,7 +76,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 +92,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 45850885..4ed957d6 100644
--- a/arm9/src/unk_0200BB14.c
+++ b/arm9/src/unk_0200BB14.c
@@ -323,7 +323,7 @@ THUMB_FUNC BOOL FUN_0200BD20(
for (s32 i = 0; i < st14; i++)
{
u32 st18 = FUN_02009660(param1->unk08, i);
- void *st1c = FUN_020161A4(param0->unk000, st10[i]);
+ void *st1c = AllocAndReadFile(param0->unk000, st10[i]);
FUN_02009668(st1c, st18, param0->unk000);
FreeToHeap(st1c);
@@ -344,7 +344,7 @@ THUMB_FUNC BOOL FUN_0200BD20(
FUN_02009A90(param1->unk24[0]);
FUN_02009D34(param1->unk24[1]);
- void *r6 = FUN_020161A4(param0->unk000, st10[6]);
+ void *r6 = AllocAndReadFile(param0->unk000, st10[6]);
param1->unk04 = FUN_02008BE0(r6,
param0->unk000,
param1->unk0c[0],
@@ -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 6a9dd194..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->mode1, modes->mode2, modes->mode4);
- GXS_SetGraphicsMode(modes->mode3);
- reg_GX_DISPCNT &= 0xC7FFFFFF;
- reg_GX_DISPCNT &= 0xF8FFFFFF;
-
- GX_DisableEngineALayers();
- GX_DisableEngineBLayers();
-}
-
-THUMB_FUNC void FUN_02016BF4(u32 *param0, u32 param1)
-{
- if (param1 == 0)
- {
- GX_SetGraphicsMode(param0[0], param0[1], param0[3]);
- GX_DisableEngineALayers();
- }
- else
- {
- GXS_SetGraphicsMode(param0[2]);
- GX_DisableEngineBLayers();
- }
-}
-
-#ifdef NONMATCHING
-THUMB_FUNC void FUN_02016C18(
- struct UnkStruct_02016B94_2 *param0, u8 param1, 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, 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, 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 = FUN_020161A4(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 = FUN_020161A4(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_0201B8B8.c b/arm9/src/unk_0201B8B8.c
index c7f77f87..b8e978f2 100644
--- a/arm9/src/unk_0201B8B8.c
+++ b/arm9/src/unk_0201B8B8.c
@@ -14,7 +14,7 @@ const u16 * MsgArray_SkipControlCode(const u16 * r4)
return r4;
}
-u16 MsgArray_GetControlCode(const u16 * r4)
+u32 MsgArray_GetControlCode(const u16 * r4)
{
GF_ASSERT(*r4 == 0xFFFE);
return r4[1];
@@ -25,7 +25,7 @@ BOOL MsgArray_ControlCodeIsStrVar(const u16 * r4)
return (MsgArray_GetControlCode(r4) & 0xFF00) == 0x100;
}
-u16 MsgArray_ControlCodeGetField(const u16 * r5, u32 r4)
+u32 MsgArray_ControlCodeGetField(const u16 * r5, u32 r4)
{
GF_ASSERT(*r5 == 0xFFFE);
GF_ASSERT(r4 < r5[2]);
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 09b5b56f..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;
@@ -535,7 +532,7 @@ THUMB_FUNC BOOL FUN_0202FB80()
{
UNK_021C59F4.unk00 = 0;
FUN_0202F984();
- UNK_021C59F4.unk04->unk628 |= gMain.unk44 & 0x7FFF;
+ UNK_021C59F4.unk04->unk628 |= gMain.heldKeys & 0x7FFF;
FUN_02030674();
FUN_0202FCCC();
@@ -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;
}
diff --git a/arm9/src/unk_02031734.c b/arm9/src/unk_02031734.c
index 57764b82..7d3b4c03 100644
--- a/arm9/src/unk_02031734.c
+++ b/arm9/src/unk_02031734.c
@@ -97,14 +97,14 @@ THUMB_FUNC void FUN_020317C0()
if (UNK_021C5A00->unk3F >= 0x13)
{
- FUN_020168D0(0x31);
+ DestroyHeap(0x31);
}
FUN_02033ED0();
FUN_0202E4F0();
FreeToHeap(UNK_021C5A00);
- FUN_020168D0(0xf);
+ DestroyHeap(0xf);
UNK_021C5A00 = NULL;
}
@@ -123,7 +123,7 @@ THUMB_FUNC void FUN_02031824(struct SaveBlock2 *sav2)
{
if (UNK_021C5A00 == NULL)
{
- FUN_02016828(3, 0xf, 0xe000);
+ CreateHeapAtEnd(3, 0xf, 0xe000);
FUN_02031734(sav2, 0xa);
UNK_021C5A00->unk40 = 0;
@@ -201,7 +201,7 @@ THUMB_FUNC void FUN_02031948(struct SaveBlock2 *sav2, u8 param1, u8 param2, u32
{
if (FUN_02030F40() == 0)
{
- FUN_02016828(3, 0xf, 0x7080);
+ CreateHeapAtEnd(3, 0xf, 0x7080);
FUN_02031734(sav2, param1);
UNK_021C5A00->unk40 = param2;
UNK_021C5A00->unk30 = param3;
@@ -213,7 +213,7 @@ THUMB_FUNC void FUN_02031990(struct SaveBlock2 *sav2, u8 param1, u8 param2, u32
{
if (FUN_02030F40() == 0)
{
- FUN_02016828(3, 0xf, 0x7080);
+ CreateHeapAtEnd(3, 0xf, 0x7080);
FUN_02031734(sav2, param1);
UNK_021C5A00->unk40 = param2;
UNK_021C5A00->unk30 = param3;
@@ -273,7 +273,7 @@ THUMB_FUNC void FUN_02031A7C(struct SaveBlock2 *sav2)
{
if (UNK_021C5A00 == NULL)
{
- if (FUN_02016828(3, 0xf, 0x7080) == 0)
+ if (CreateHeapAtEnd(3, 0xf, 0x7080) == 0)
{
FUN_020335E0();
}
@@ -406,7 +406,7 @@ THUMB_FUNC void FUN_02031C74(struct SaveBlock2 *sav2, u8 param1)
{
if (FUN_02030F40() == 0)
{
- FUN_02016828(3, 0xf, 0x7080);
+ CreateHeapAtEnd(3, 0xf, 0x7080);
FUN_02031734(sav2, param1);
FUN_02031D20(FUN_02032E00, 0);
}
@@ -416,7 +416,7 @@ THUMB_FUNC void FUN_02031CA8(struct SaveBlock2 *sav2, u8 param1)
{
if (FUN_02030F40() == 0)
{
- FUN_02016828(3, 0xf, 0x7080);
+ CreateHeapAtEnd(3, 0xf, 0x7080);
FUN_02031734(sav2, param1);
FUN_02031D20(FUN_02032E48, 0);
}
@@ -1393,7 +1393,7 @@ THUMB_FUNC void FUN_02032BD0(struct SaveBlock2 *sav2)
{
if (FUN_02030F40() == 0)
{
- FUN_02016828(3, 0xf, 0x7000);
+ CreateHeapAtEnd(3, 0xf, 0x7000);
FUN_02031734(sav2, 0xe);
UNK_021C5A00->unk40 = 0;
FUN_02031D20(FUN_02032B8C, 0);
@@ -1479,7 +1479,7 @@ THUMB_FUNC void FUN_02032D44(struct SaveBlock2 *sav2)
{
if (FUN_02030F40() == 0)
{
- FUN_02016828(3, 0xf, 0x7000);
+ CreateHeapAtEnd(3, 0xf, 0x7000);
FUN_02031734(sav2, 0x11);
UNK_021C5A00->unk40 = 0;
FUN_02031D20(FUN_02032CF4, 0);
@@ -1807,7 +1807,7 @@ THUMB_FUNC void FUN_020331C4()
{
if (UNK_021C5A00 != NULL)
{
- FUN_020166B8(1);
+ ClearSoftResetDisableMask(1);
FUN_02031D20(FUN_02032440, 5);
}
}
@@ -1866,7 +1866,7 @@ THUMB_FUNC void FUN_02033288(struct SaveBlock2 *sav2)
{
if (UNK_021C5A00 == NULL)
{
- FUN_02016828(3, 0xf, 0x100);
+ CreateHeapAtEnd(3, 0xf, 0x100);
UNK_021C5A00 =
(struct UnkStruct_02031734 *)AllocFromHeap(0xf, sizeof(struct UnkStruct_02031734));
MI_CpuFill8(UNK_021C5A00, 0, sizeof(struct UnkStruct_02031734));
@@ -1875,7 +1875,7 @@ THUMB_FUNC void FUN_02033288(struct SaveBlock2 *sav2)
UNK_021C5A00->unk46 = 1;
UNK_021C5A00->unk28 = sav2;
FUN_020334E8(0, 1);
- FUN_020166A8(1);
+ SetSoftResetDisableMask(1);
}
}
@@ -1883,11 +1883,11 @@ THUMB_FUNC void FUN_020332DC()
{
if (UNK_021C5A00 != 0)
{
- FUN_020166B8(1);
+ ClearSoftResetDisableMask(1);
FUN_020334E8(0, 0);
FreeToHeap(UNK_021C5A00);
UNK_021C5A00 = NULL;
- FUN_020168D0(0xf);
+ DestroyHeap(0xf);
}
}
@@ -1895,7 +1895,7 @@ THUMB_FUNC void FUN_02033310(struct SaveBlock2 *sav2)
{
if (UNK_021C5A00 == NULL)
{
- FUN_02016828(3, 0xf, 0x100);
+ CreateHeapAtEnd(3, 0xf, 0x100);
UNK_021C5A00 =
(struct UnkStruct_02031734 *)AllocFromHeap(0xf, sizeof(struct UnkStruct_02031734));
MI_CpuFill8(UNK_021C5A00, 0, sizeof(struct UnkStruct_02031734));
@@ -1903,7 +1903,7 @@ THUMB_FUNC void FUN_02033310(struct SaveBlock2 *sav2)
UNK_021C5A00->unk46 = 1;
UNK_021C5A00->unk28 = sav2;
FUN_020334E8(0, 1);
- FUN_020166A8(1);
+ SetSoftResetDisableMask(1);
}
}
@@ -1911,11 +1911,11 @@ THUMB_FUNC void FUN_02033364()
{
if (UNK_021C5A00 != 0)
{
- FUN_020166B8(1);
+ ClearSoftResetDisableMask(1);
FUN_020334E8(0, 0);
FreeToHeap(UNK_021C5A00);
UNK_021C5A00 = NULL;
- FUN_020168D0(0xf);
+ DestroyHeap(0xf);
}
}
@@ -1966,7 +1966,7 @@ THUMB_FUNC void FUN_0203341C()
{
if (FUN_0202E4C8())
{
- FUN_02016828(3, 0x31, 0x31000);
+ CreateHeapAtEnd(3, 0x31, 0x31000);
if (FUN_0202F918(1, 1, 0x200, 1) != 0)
{
MOD05_021D74E0(UNK_021C5A00->unk28, 0x31);
@@ -1985,8 +1985,8 @@ THUMB_FUNC void *FUN_0203346C(struct SaveBlock2 *sav2, u32 param1)
return 0;
}
- FUN_020166A8(1);
- FUN_02016828(3, 0xf, 0x7080);
+ SetSoftResetDisableMask(1);
+ CreateHeapAtEnd(3, 0xf, 0x7080);
FUN_02031734(sav2, 0x17);
UNK_021C5A00->unk00 = AllocFromHeap(0xf, param1);
MI_CpuFill8(UNK_021C5A00->unk00, 0, param1);
@@ -2127,7 +2127,7 @@ THUMB_FUNC void FUN_020335F4()
FUN_0200541C();
FUN_0202287C(UNK_021C5A00->unk28);
- gMain.unk64 = 1;
+ gMain.touchpadReadAuto = 1;
if (UNK_021C5A00->unk4E == 3)
{
FUN_020335A4(3);
diff --git a/arm9/src/unk_0205EC84.c b/arm9/src/unk_0205EC84.c
new file mode 100644
index 00000000..a7e4531f
--- /dev/null
+++ b/arm9/src/unk_0205EC84.c
@@ -0,0 +1,436 @@
+#include "global.h"
+#include "proto.h"
+#include "unk_0205EC84.h"
+
+static THUMB_FUNC void _flag_set(struct ScriptState * state, u16 flag_id)
+{
+ SetFlagInArray(state, flag_id);
+}
+
+static THUMB_FUNC void _flag_clear(struct ScriptState * state, u16 flag_id)
+{
+ ClearFlagInArray(state, flag_id);
+}
+
+static THUMB_FUNC BOOL _flag_check(struct ScriptState * state, u16 flag_id)
+{
+ return CheckFlagInArray(state, flag_id);
+}
+
+static THUMB_FUNC BOOL _flag_op(struct ScriptState * state, u32 op, u32 flag_id)
+{
+ switch (op)
+ {
+ case 1:
+ _flag_set(state, (u16)flag_id);
+ break;
+ case 0:
+ _flag_clear(state, (u16)flag_id);
+ break;
+ case 2:
+ return _flag_check(state, (u16)flag_id);
+ default:
+ GF_ASSERT(0);
+ }
+ return FALSE;
+}
+
+THUMB_FUNC void FUN_0205ECD4(struct ScriptState * state)
+{
+ _flag_set(state, 0x960);
+}
+
+THUMB_FUNC BOOL FUN_0205ECE0(struct ScriptState * state)
+{
+ return _flag_check(state, 0x960);
+}
+
+THUMB_FUNC BOOL FUN_0205ECEC(struct ScriptState * state)
+{
+ return _flag_check(state, 0x98D);
+}
+
+THUMB_FUNC void FUN_0205ECFC(struct ScriptState * state)
+{
+ _flag_set(state, 0x964);
+}
+
+THUMB_FUNC BOOL FUN_0205ED0C(struct ScriptState * state)
+{
+ return _flag_check(state, 0x964);
+}
+
+THUMB_FUNC void FUN_0205ED1C(struct ScriptState * state)
+{
+ _flag_set(state, 0x961);
+}
+
+THUMB_FUNC void FUN_0205ED2C(struct ScriptState * state)
+{
+ _flag_clear(state, 0x961);
+}
+
+THUMB_FUNC BOOL FUN_0205ED3C(struct ScriptState * state)
+{
+ return _flag_check(state, 0x961);
+}
+
+THUMB_FUNC void FUN_0205ED4C(struct ScriptState * state)
+{
+ _flag_set(state, 0x965);
+}
+
+THUMB_FUNC void FUN_0205ED5C(struct ScriptState * state)
+{
+ _flag_clear(state, 0x965);
+}
+
+THUMB_FUNC BOOL FUN_0205ED6C(struct ScriptState * state)
+{
+ return _flag_check(state, 0x965);
+}
+
+THUMB_FUNC void FUN_0205ED7C(struct ScriptState * state)
+{
+ _flag_set(state, 0x96D);
+}
+
+THUMB_FUNC void FUN_0205ED8C(struct ScriptState * state)
+{
+ _flag_clear(state, 0x96D);
+}
+
+THUMB_FUNC BOOL FUN_0205ED9C(struct ScriptState * state)
+{
+ return _flag_check(state, 0x96D);
+}
+
+THUMB_FUNC void FUN_0205EDAC(struct ScriptState * state)
+{
+ _flag_set(state, 0x96E);
+}
+
+THUMB_FUNC void FUN_0205EDBC(struct ScriptState * state)
+{
+ _flag_set(state, 0x96F);
+}
+
+THUMB_FUNC void FUN_0205EDCC(struct ScriptState * state)
+{
+ _flag_set(state, 0x970);
+}
+
+THUMB_FUNC void FUN_0205EDD8(struct ScriptState * state)
+{
+ _flag_set(state, 0x971);
+}
+
+THUMB_FUNC void FUN_0205EDE8(struct ScriptState * state)
+{
+ _flag_set(state, 0x972);
+}
+
+THUMB_FUNC void FUN_0205EDF8(struct ScriptState * state)
+{
+ _flag_set(state, 0x973);
+}
+
+THUMB_FUNC void FUN_0205EE08(struct ScriptState * state, u32 a1)
+{
+ switch (a1)
+ {
+ case 0:
+ _flag_set(state, 0x968);
+ break;
+ case 1:
+ _flag_set(state, 0x969);
+ break;
+ case 2:
+ _flag_set(state, 0x96A);
+ break;
+ case 3:
+ _flag_set(state, 0x96B);
+ break;
+ case 4:
+ _flag_set(state, 0x96C);
+ break;
+ }
+}
+
+THUMB_FUNC BOOL FUN_0205EE60(struct ScriptState * state, u32 a1)
+{
+ switch (a1)
+ {
+ case 0:
+ return _flag_check(state, 0x968);
+ case 1:
+ return _flag_check(state, 0x969);
+ case 2:
+ return _flag_check(state, 0x96A);
+ case 3:
+ return _flag_check(state, 0x96B);
+ case 4:
+ return _flag_check(state, 0x96C);
+ }
+ // UB: No return value
+}
+
+THUMB_FUNC BOOL FUN_0205EEB8(struct ScriptState * state, u32 a1)
+{
+ BOOL ret = FALSE;
+ switch (a1)
+ {
+ case 0:
+ break;
+ case 1:
+ ret = _flag_check(state, 0x97F);
+ break;
+ case 2:
+ ret = _flag_check(state, 0x980);
+ break;
+ case 3:
+ ret = _flag_check(state, 0x981);
+ break;
+ case 4:
+ ret = _flag_check(state, 0x982);
+ break;
+ case 5:
+ ret = _flag_check(state, 0x983);
+ break;
+ }
+ return ret;
+}
+
+THUMB_FUNC s32 FUN_0205EF20(struct ScriptState * state, s32 a1)
+{
+ s32 ret = 0;
+ switch (a1)
+ {
+ case 314:
+ if (_flag_check(state, 0x984) == TRUE)
+ ret = 1070;
+ break;
+ case 316:
+ if (_flag_check(state, 0x984) == TRUE)
+ ret = 1065;
+ break;
+ case 312:
+ if (_flag_check(state, 0x98E) == TRUE)
+ ret = 1070;
+ break;
+ case 318:
+ if (_flag_check(state, 0x98F) == TRUE)
+ ret = 1070;
+ break;
+ case 251:
+ if (_flag_check(state, 0x995) == TRUE)
+ ret = 1069;
+ break;
+ case 422:
+ if (_flag_check(state, 0x993) == TRUE)
+ ret = 1098;
+ break;
+ case 305:
+ case 306:
+ case 307:
+ case 308:
+ case 309:
+ case 310:
+ case 494:
+ case 497:
+ if (_flag_check(state, 0x985) == TRUE)
+ {
+ if (!IsNighttime())
+ ret = 1016;
+ else
+ ret = 1045;
+ }
+ else if (a1 == 305)
+ {
+ if (_flag_check(state, 0x986) == TRUE)
+ ret = 1067;
+ }
+ break;
+ case 72:
+ case 73:
+ case 74:
+ case 75:
+ if (_flag_check(state, 0x987) == TRUE)
+ {
+ if (!IsNighttime())
+ ret = 1013;
+ else
+ ret = 1042;
+ }
+ break;
+ case 201:
+ if (_flag_check(state, 0x988) == TRUE)
+ {
+ if (!IsNighttime())
+ ret = 1023;
+ else
+ ret = 1052;
+ }
+ break;
+ case 256:
+ if (_flag_check(state, 0x989) == TRUE)
+ {
+ if (!IsNighttime())
+ ret = 1006;
+ else
+ ret = 1035;
+ }
+ break;
+ case 399:
+ if (_flag_check(state, 0x98A) == TRUE)
+ {
+ if (!IsNighttime())
+ ret = 1006;
+ else
+ ret = 1035;
+ }
+ break;
+ case 185:
+ if (_flag_check(state, 0x98B) == TRUE)
+ ret = 1001;
+ break;
+ }
+ return ret;
+}
+
+
+THUMB_FUNC void FUN_0205F154(struct ScriptState * state)
+{
+ _flag_set(state, 0x966);
+}
+
+THUMB_FUNC void FUN_0205F164(struct ScriptState * state)
+{
+ _flag_clear(state, 0x966);
+}
+
+THUMB_FUNC BOOL FUN_0205F174(struct ScriptState * state)
+{
+ return _flag_check(state, 0x966);
+}
+
+THUMB_FUNC BOOL FUN_0205F184(struct ScriptState * state)
+{
+ return _flag_check(state, 0x978);
+}
+
+THUMB_FUNC BOOL FUN_0205F194(struct ScriptState * state)
+{
+ return _flag_check(state, 0x992);
+}
+
+THUMB_FUNC BOOL FUN_0205F1A4(struct ScriptState * state)
+{
+ return _flag_check(state, 0x97D);
+}
+
+THUMB_FUNC BOOL FUN_0205F1B4(struct ScriptState * state)
+{
+ return _flag_check(state, 0x97E);
+}
+
+THUMB_FUNC void FUN_0205F1C4(struct ScriptState * state)
+{
+ _flag_set(state, 0x97C);
+}
+
+THUMB_FUNC void FUN_0205F1D4(struct ScriptState * state)
+{
+ _flag_clear(state, 0x97C);
+}
+
+THUMB_FUNC BOOL FUN_0205F1E4(struct ScriptState * state)
+{
+ return _flag_check(state, 0x97C);
+}
+
+THUMB_FUNC void FUN_0205F1F4(struct ScriptState * state)
+{
+ _flag_set(state, 0x967);
+}
+
+THUMB_FUNC void FUN_0205F204(struct ScriptState * state)
+{
+ _flag_clear(state, 0x967);
+}
+
+THUMB_FUNC BOOL FUN_0205F214(struct ScriptState * state)
+{
+ return _flag_check(state, 0x967);
+}
+
+THUMB_FUNC void FUN_0205F224(struct ScriptState * state)
+{
+ _flag_set(state, 0x979);
+}
+
+THUMB_FUNC void FUN_0205F234(struct ScriptState * state)
+{
+ _flag_clear(state, 0x979);
+}
+
+THUMB_FUNC BOOL FUN_0205F244(struct ScriptState * state)
+{
+ return _flag_check(state, 0x979);
+}
+
+THUMB_FUNC void FUN_0205F254(struct ScriptState * state)
+{
+ _flag_clear(state, 0x994);
+}
+
+THUMB_FUNC BOOL FUN_0205F264(struct ScriptState * state, u32 op)
+{
+ return _flag_op(state, op, 0x962);
+}
+
+THUMB_FUNC void FUN_0205F274(struct ScriptState * state)
+{
+ _flag_set(state, 0x97A);
+}
+
+THUMB_FUNC void FUN_0205F284(struct ScriptState * state)
+{
+ _flag_clear(state, 0x97A);
+}
+
+THUMB_FUNC BOOL FUN_0205F294(struct ScriptState * state)
+{
+ return _flag_check(state, 0x97A);
+}
+
+THUMB_FUNC void FUN_0205F2A4(struct ScriptState * state)
+{
+ _flag_set(state, 0x97B);
+}
+
+THUMB_FUNC void FUN_0205F2B4(struct ScriptState * state)
+{
+ _flag_clear(state, 0x97B);
+}
+
+THUMB_FUNC BOOL FUN_0205F2C4(struct ScriptState * state)
+{
+ return _flag_check(state, 0x97B);
+}
+
+THUMB_FUNC BOOL FUN_0205F2D4(struct ScriptState * state, u32 op)
+{
+ return _flag_op(state, op, 0x963);
+}
+
+THUMB_FUNC BOOL FUN_0205F2E4(struct ScriptState * state, u32 op, u16 flag_id)
+{
+ GF_ASSERT(flag_id < 69);
+ return _flag_op(state, op, 0x9B0 + flag_id);
+}
+
+THUMB_FUNC void FUN_0205F304(struct ScriptState * state)
+{
+ _flag_set(state, 0x98C);
+}
diff --git a/arm9/src/unk_0206015C.c b/arm9/src/unk_0206015C.c
index a217f52c..0bf3a15a 100644
--- a/arm9/src/unk_0206015C.c
+++ b/arm9/src/unk_0206015C.c
@@ -21,7 +21,7 @@ extern THUMB_FUNC void MOD06_02245190(u32);
extern THUMB_FUNC void MOD06_02245198(u8, u32);
extern THUMB_FUNC u32 MOD06_022451F0(u32);
-extern THUMB_FUNC void FUN_020054C8(u32);
+extern THUMB_FUNC void PlaySE(u32);
extern THUMB_FUNC void FUN_02049160(struct UnkStruct_0204639C*, u32);
extern THUMB_FUNC void FUN_0204AF84(struct UnkStruct_0204639C*);
extern THUMB_FUNC void FUN_0204AF3C(struct UnkStruct_0204639C *);
@@ -97,7 +97,7 @@ THUMB_FUNC BOOL FUN_02060194(struct UnkStruct_0204639C *unkStruct0)
MOD06_02244DC4(unkStruct1->unk0, unkAddr);
MOD06_02244EF8(unkStruct1->unk0);
unkStruct1->unkE = 0;
- FUN_020054C8(1657);
+ PlaySE(1657);
FUN_0204C1B4(unkStruct0, 0x3, 0x11, 0x0000FFFF, 0, 6, 1, 0xb);
unkStruct1->action = 5;
}
@@ -117,7 +117,7 @@ THUMB_FUNC BOOL FUN_02060194(struct UnkStruct_0204639C *unkStruct0)
MOD06_02245198(unkStruct1->unkD, unkStruct1->unk4);
unkStruct1->unk8 = MOD06_022451F0(unkStruct1->unk4);
- FUN_020054C8(1657);
+ PlaySE(1657);
FUN_0204C1B4(unkStruct0, 0x3, 0x10, 0x0000FFFF, 0, 6, 1, 0xb);
unkStruct1->action = 6;
break;
diff --git a/arm9/src/unk_020851B8.c b/arm9/src/unk_020851B8.c
new file mode 100644
index 00000000..922ca2e4
--- /dev/null
+++ b/arm9/src/unk_020851B8.c
@@ -0,0 +1,45 @@
+#include "global.h"
+#include "unk_020851B8.h"
+#include "constants/items.h"
+#include "heap.h"
+
+THUMB_FUNC struct UnkStruct_020851B8 *FUN_020851B8(u32 heap_id)
+{
+ struct UnkStruct_020851B8 *ptr = AllocFromHeap(heap_id, sizeof(struct UnkStruct_020851B8));
+ __builtin__clear(ptr, sizeof(struct UnkStruct_020851B8));
+ return ptr;
+}
+
+THUMB_FUNC void FUN_020851DC(struct UnkStruct_020851B8 *param0, u16 item_id, BOOL param2)
+{
+ u16 berry_id = item_id - FIRST_BERRY_IDX;
+ FUN_02085200(param0, berry_id);
+
+ if (param2 == TRUE)
+ {
+ param0->unk_8 = berry_id;
+ }
+}
+
+THUMB_FUNC void FUN_020851F8(struct UnkStruct_020851B8 *param0, u8 param1, u8 param2, u8 param3)
+{
+ param0->unk_9 = param1;
+ param0->unk_A = param2;
+ param0->unk_B = param3;
+}
+
+THUMB_FUNC void FUN_02085200(struct UnkStruct_020851B8 *param0, u16 berry_id)
+{
+ param0->flags[berry_id / 32] |= 1 << (berry_id % 32);
+}
+
+THUMB_FUNC u8 FUN_02085224(struct UnkStruct_020851B8 *param0, u16 berry_id)
+{
+ return param0->flags[berry_id / 32] & (1 << (berry_id % 32)) ? 1 : 0;
+}
+
+THUMB_FUNC void FUN_0208524C(struct UnkStruct_020851B8 *param0, u8 *param1, u8 *param2)
+{
+ *param1 = param0->unk_9;
+ *param2 = param0->unk_A;
+}
diff --git a/arm9/src/unk_02085338.c b/arm9/src/unk_02085338.c
new file mode 100644
index 00000000..b22b3974
--- /dev/null
+++ b/arm9/src/unk_02085338.c
@@ -0,0 +1,165 @@
+#include "global.h"
+#include "heap.h"
+#include "event_data.h"
+#include "unk_02085338.h"
+
+extern BOOL FUN_0205ED0C(struct ScriptState * state);
+
+THUMB_FUNC struct UnkStruct_02085338 * FUN_02085338(u8 r5, u8 r7, struct SaveBlock2 * sav2, u32 heap_id)
+{
+ struct UnkStruct_02085338 * ret = (struct UnkStruct_02085338 *) AllocFromHeap(heap_id, sizeof(struct UnkStruct_02085338));
+ ret->unk_00 = r5;
+ ret->unk_01 = r7;
+ ret->unk_0c = Sav2_Pokedex_get(sav2);
+ ret->unk_10 = FUN_02013B5C(sav2);
+ ret->unk_04 = (u8)FUN_0205ED0C(SavArray_Flags_get(sav2));
+ ret->unk_05 = 0;
+ ret->unk_02 = 1;
+ ret->unk_03 = 0;
+ ret->unk_08 = Options_GetFrame(Sav2_PlayerData_GetOptionsAddr(sav2));
+ if (r5 == 2)
+ {
+ MailMsg_init_withBank(&ret->unk_14, 3);
+ }
+ else
+ {
+ for (int i = 0; i < 2; i++)
+ {
+ ret->unk_1c[i] = 0xFFFF;
+ }
+ }
+ return ret;
+}
+
+THUMB_FUNC void FUN_020853A8(struct UnkStruct_02085338 * ptr)
+{
+ FreeToHeap(ptr);
+}
+
+THUMB_FUNC void FUN_020853B0(struct UnkStruct_02085338 * ptr, u16 a1)
+{
+ ptr->unk_1c[0] = a1;
+}
+
+THUMB_FUNC void FUN_020853B4(struct UnkStruct_02085338 * ptr, u16 a1, u16 a2)
+{
+ ptr->unk_1c[0] = a1;
+ ptr->unk_1c[1] = a2;
+}
+
+THUMB_FUNC void FUN_020853BC(struct UnkStruct_02085338 * ptr, const struct MailMessage * a1)
+{
+ ptr->unk_14 = *a1;
+}
+
+THUMB_FUNC void FUN_020853D0(struct UnkStruct_02085338 * ptr)
+{
+ ptr->unk_02 = 1;
+ ptr->unk_03 = 0;
+}
+
+THUMB_FUNC void FUN_020853DC(struct UnkStruct_02085338 * ptr)
+{
+ ptr->unk_05 = 1;
+}
+
+THUMB_FUNC u8 FUN_020853E4(struct UnkStruct_02085338 * ptr)
+{
+ return ptr->unk_02;
+}
+
+THUMB_FUNC u8 FUN_020853E8(struct UnkStruct_02085338 * ptr)
+{
+ return ptr->unk_03;
+}
+
+THUMB_FUNC u16 FUN_020853EC(struct UnkStruct_02085338 * ptr)
+{
+ return ptr->unk_1c[0];
+}
+
+THUMB_FUNC void FUN_020853F0(struct UnkStruct_02085338 * ptr, u16 * a1)
+{
+ a1[0] = ptr->unk_1c[0];
+ a1[1] = ptr->unk_1c[1];
+}
+
+THUMB_FUNC void FUN_020853FC(struct UnkStruct_02085338 * ptr, struct MailMessage * a1)
+{
+ return MailMsg_copy(a1, &ptr->unk_14);
+}
+
+THUMB_FUNC u8 FUN_0208540C(struct UnkStruct_02085338 * ptr)
+{
+ return ptr->unk_00;
+}
+
+THUMB_FUNC u8 FUN_02085410(struct UnkStruct_02085338 * ptr)
+{
+ return ptr->unk_01;
+}
+
+THUMB_FUNC u32 FUN_02085414(struct UnkStruct_02085338 * ptr)
+{
+ return ptr->unk_08;
+}
+
+THUMB_FUNC struct Pokedex * FUN_02085418(struct UnkStruct_02085338 * ptr)
+{
+ return ptr->unk_0c;
+}
+
+THUMB_FUNC struct UnkStruct_02013B28 * FUN_0208541C(struct UnkStruct_02085338 * ptr)
+{
+ return ptr->unk_10;
+}
+
+THUMB_FUNC u8 FUN_02085420(struct UnkStruct_02085338 * ptr)
+{
+ return ptr->unk_04;
+}
+
+THUMB_FUNC u8 FUN_02085424(struct UnkStruct_02085338 * ptr)
+{
+ return ptr->unk_05;
+}
+
+THUMB_FUNC void FUN_02085428(struct UnkStruct_02085338 * ptr, u16 * a1, struct MailMessage * a2)
+{
+ switch (ptr->unk_00)
+ {
+ case 0:
+ a1[0] = ptr->unk_1c[0];
+ break;
+ case 1:
+ a1[0] = ptr->unk_1c[0];
+ a1[1] = ptr->unk_1c[1];
+ break;
+ case 2:
+ *a2 = ptr->unk_14;
+ break;
+ }
+}
+
+THUMB_FUNC BOOL FUN_0208545C(struct UnkStruct_02085338 * ptr, const u16 * a1, const struct MailMessage * a2)
+{
+ switch (ptr->unk_00)
+ {
+ case 0:
+ return a1[0] == ptr->unk_1c[0];
+ case 1:
+ return a1[0] == ptr->unk_1c[0] && a1[1] == ptr->unk_1c[1];
+ case 2:
+ default:
+ return MailMsg_compare(&ptr->unk_14, a2);
+ }
+}
+
+THUMB_FUNC void FUN_020854A0(struct UnkStruct_02085338 * r5, u16 * r4, struct MailMessage * r6)
+{
+ r5->unk_03 = (u8)(!FUN_0208545C(r5, r4, r6) ? 1 : 0);
+ r5->unk_02 = 0;
+ for (int i = 0; i < 2; i++)
+ r5->unk_1c[i] = r4[i];
+ r5->unk_14 = *r6;
+}
diff --git a/arm9/src/unk_02088AAC.c b/arm9/src/unk_02088AAC.c
new file mode 100644
index 00000000..c0419e09
--- /dev/null
+++ b/arm9/src/unk_02088AAC.c
@@ -0,0 +1,185 @@
+#include "global.h"
+#include "unk_02088AAC.h"
+#include "heap.h"
+#include "overlay_manager.h"
+#include "unk_020851B8.h"
+
+extern BOOL MOD68_021D74E0(struct UnkStruct_02006234 *, u32 *);
+extern BOOL MOD68_021D75D8(struct UnkStruct_02006234 *, u32 *);
+extern BOOL MOD68_021D762C(struct UnkStruct_02006234 *, u32 *);
+extern BOOL MOD73_021D74F0(struct UnkStruct_02006234 *, u32 *);
+extern BOOL MOD73_021D758C(struct UnkStruct_02006234 *, u32 *);
+extern BOOL MOD73_021D7640(struct UnkStruct_02006234 *, u32 *);
+extern BOOL MOD75_021E6BA0(struct UnkStruct_02006234 *, u32 *);
+extern BOOL MOD75_021E6D6C(struct UnkStruct_02006234 *, u32 *);
+extern BOOL MOD75_021E6F00(struct UnkStruct_02006234 *, u32 *);
+
+extern BOOL FUN_0208898C(struct UnkStruct_02006234 **r0);
+
+THUMB_FUNC u32 FUN_02088AAC(struct UnkStruct_02088AAC *r0, u32 *r1)
+{
+ switch (*r1)
+ {
+ case 0:
+ *r1 = FUN_02088B4C(r0);
+ break;
+ case 1:
+ *r1 = FUN_02088BA8(r0);
+ break;
+ case 2:
+ *r1 = FUN_02088C3C(r0);
+ break;
+ case 3:
+ *r1 = FUN_02088CDC(r0);
+ break;
+ case 4:
+ return 1;
+ case 5:
+ return 4;
+ }
+
+ return 0;
+}
+
+THUMB_FUNC u32 FUN_02088AFC(struct UnkStruct_02088AAC *r0)
+{
+ FS_EXTERN_OVERLAY(MODULE_73);
+
+ const struct Unk21DBE18 OVERLAY_73_MANAGER = { .unk0 = MOD73_021D74F0,
+ .unk4 = MOD73_021D758C,
+ .unk8 = MOD73_021D7640,
+ .ovly = FS_OVERLAY_ID(MODULE_73) };
+ r0->ovly_data = OverlayManager_new(&OVERLAY_73_MANAGER, (s32 *)r0, r0->heap_id);
+
+ return 2;
+}
+
+THUMB_FUNC u32 FUN_02088B28(struct UnkStruct_02088AAC *r0)
+{
+ if (!FUN_0208898C(&r0->ovly_data))
+ {
+ return 2;
+ }
+
+ if (r0->unk20 == TRUE)
+ {
+ return 0;
+ }
+
+ return 3;
+}
+
+THUMB_FUNC u32 FUN_02088B48()
+{
+ return 4;
+}
+
+THUMB_FUNC u32 FUN_02088B4C(struct UnkStruct_02088AAC *r0)
+{
+ FS_EXTERN_OVERLAY(MODULE_75);
+
+ static const u8 UNK_020FD6F4[] = { 0x04, 0xFF };
+ const struct Unk21DBE18 OVERLAY_75_MANAGER = { .unk0 = MOD75_021E6BA0,
+ .unk4 = MOD75_021E6D6C,
+ .unk8 = MOD75_021E6F00,
+ .ovly = FS_OVERLAY_ID(MODULE_75) };
+ struct BagView *bag_view = CreateBagView(r0->unk10->bag, UNK_020FD6F4, r0->heap_id);
+
+ FUN_0206E314(bag_view, r0->unk10->sav2, (u8)((u8)r0->unk06 == 1 ? 5 : 4), r0->unk0C);
+
+ r0->ovly_data = OverlayManager_new(&OVERLAY_75_MANAGER, (s32 *)bag_view, r0->heap_id);
+ r0->ovly_param = bag_view;
+
+ return 1;
+}
+
+THUMB_FUNC u32 FUN_02088BA8(struct UnkStruct_02088AAC *r0)
+{
+ if (!FUN_0208898C(&r0->ovly_data))
+ {
+ return 1;
+ }
+
+ struct BagView *bag_view = BagView_New((u8)r0->heap_id);
+
+ memcpy(bag_view, r0->ovly_param, BagView_sizeof());
+ FreeToHeap(r0->ovly_param);
+
+ r0->ovly_param = NULL;
+ r0->item = FUN_0206E37C(bag_view);
+
+ FreeToHeap(bag_view);
+
+ switch (FUN_0206E384(bag_view))
+ {
+ case 1:
+ return 2;
+ case 5:
+ return 5;
+ default:
+ GF_AssertFail();
+ r0->item = FIRST_BERRY_IDX;
+ case 0:
+ case 2:
+ case 3:
+ case 4:
+ GF_ASSERT(Bag_TakeItem(r0->unk10->bag, (u16)r0->item, 1, r0->heap_id));
+ return 4;
+ }
+}
+
+THUMB_FUNC u32 FUN_02088C3C(struct UnkStruct_02088AAC *r0)
+{
+ FS_EXTERN_OVERLAY(MODULE_68);
+
+ struct Bag *bag = r0->unk10->bag;
+ const struct Unk21DBE18 OVERLAY_68_MANAGER = { .unk0 = MOD68_021D74E0,
+ .unk4 = MOD68_021D75D8,
+ .unk8 = MOD68_021D762C,
+ .ovly = FS_OVERLAY_ID(MODULE_68) };
+
+ r0->ovly_param = FUN_020851B8((u8)r0->heap_id);
+
+ FUN_020851DC(r0->ovly_param, (u16)r0->item, TRUE);
+
+ u8 berry_count = 0;
+ for (u8 berry_id = 0; berry_id < (u8)NUM_BERRIES; berry_id++)
+ {
+ u8 item_id = (u8)BerryToItemId(berry_id);
+ if (Bag_HasItem(bag, item_id, 1, r0->heap_id) == TRUE)
+ {
+ FUN_020851DC(r0->ovly_param, item_id, 0);
+
+ berry_count++;
+ }
+ }
+
+ u8 sp5;
+ u8 sp6;
+
+ FUN_0206F17C(r0->unk0C, 4, &sp6, &sp5);
+ FUN_020851F8(r0->ovly_param, sp5, sp6, (u8)(berry_count + 2));
+
+ r0->ovly_data = OverlayManager_new(&OVERLAY_68_MANAGER, (s32 *)r0->ovly_param, r0->heap_id);
+
+ return 3;
+}
+
+THUMB_FUNC u32 FUN_02088CDC(struct UnkStruct_02088AAC *r0)
+{
+ if (!FUN_0208898C(&r0->ovly_data))
+ {
+ return 3;
+ }
+
+ u8 sp0;
+ u8 sp1;
+
+ FUN_0208524C(r0->ovly_param, &sp0, &sp1);
+ FUN_0206F190(r0->unk0C, 4, sp1, sp0);
+ FreeToHeap(r0->ovly_param);
+
+ r0->ovly_param = NULL;
+
+ return 0;
+}