summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarcus Huderle <huderlem@gmail.com>2018-07-24 17:34:20 -0500
committerMarcus Huderle <huderlem@gmail.com>2018-07-24 18:50:44 -0500
commite76b56b000739b418f04d286764652b101bbd8a8 (patch)
treed624952e8e95e602611a9aee2364a9e1e674bfac /src
parent8ca8d353ee520be31ca35aae1aae2ea2b9b4ffd8 (diff)
Merge pokemon_storage_system 4 and 5
Diffstat (limited to 'src')
-rw-r--r--src/pokemon_storage_system_3.c61
-rw-r--r--src/pokemon_storage_system_4.c755
-rw-r--r--src/pokemon_storage_system_5.c775
3 files changed, 785 insertions, 806 deletions
diff --git a/src/pokemon_storage_system_3.c b/src/pokemon_storage_system_3.c
index da26c6fc5..cbac7a504 100644
--- a/src/pokemon_storage_system_3.c
+++ b/src/pokemon_storage_system_3.c
@@ -23,6 +23,35 @@ static void PSS_DestroyMonIconSprite(struct Sprite *sprite);
// .rodata
const struct OamData gOamData_83B6F2C;
+const struct SpriteTemplate gSpriteTemplate_83B6F14 = {
+ 0x000f,
+ 0xdac0,
+ &gOamData_83B6F2C,
+ gDummySpriteAnimTable,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ SpriteCallbackDummy
+};
+
+const struct OamData gOamData_83B6F2C = {
+ .size = 2
+};
+
+const union AffineAnimCmd gSpriteAffineAnim_83B6F34[] = {
+ AFFINEANIMCMD_FRAME(-2, -2, 0, 120),
+ AFFINEANIMCMD_END
+};
+
+const union AffineAnimCmd gSpriteAffineAnim_83B6F44[] = {
+ AFFINEANIMCMD_FRAME(16, 16, 0, 0),
+ AFFINEANIMCMD_FRAME(16, 16, 0, 15),
+ AFFINEANIMCMD_END
+};
+
+const union AffineAnimCmd *const gSpriteAffineAnimTable_83B6F5C[] = {
+ gSpriteAffineAnim_83B6F34,
+ gSpriteAffineAnim_83B6F44
+};
// .text
@@ -481,8 +510,6 @@ bool8 sub_809971C(void)
return TRUE;
}
-const union AffineAnimCmd *const gSpriteAffineAnimTable_83B6F5C[];
-
void sub_809981C(u8 mode, u8 idx)
{
switch (mode)
@@ -599,15 +626,7 @@ static void PSS_ForgetSpeciesIcon(u16 a0)
static struct Sprite *PSS_SpawnMonIconSprite(u16 species, u32 personality, s16 x, s16 y, u8 priority, u8 subpriority)
{
- struct SpriteTemplate template = {
- 0x000f,
- 0xdac0,
- &gOamData_83B6F2C,
- gDummySpriteAnimTable,
- NULL,
- gDummySpriteAffineAnimTable,
- SpriteCallbackDummy
- };
+ struct SpriteTemplate template = gSpriteTemplate_83B6F14;
u16 tileNum;
u8 spriteId;
@@ -633,23 +652,3 @@ static void PSS_DestroyMonIconSprite(struct Sprite *sprite)
PSS_ForgetSpeciesIcon(sprite->data[0]);
DestroySprite(sprite);
}
-
-const struct OamData gOamData_83B6F2C = {
- .size = 2
-};
-
-const union AffineAnimCmd gSpriteAffineAnim_83B6F34[] = {
- AFFINEANIMCMD_FRAME(-2, -2, 0, 120),
- AFFINEANIMCMD_END
-};
-
-const union AffineAnimCmd gSpriteAffineAnim_83B6F44[] = {
- AFFINEANIMCMD_FRAME(16, 16, 0, 0),
- AFFINEANIMCMD_FRAME(16, 16, 0, 15),
- AFFINEANIMCMD_END
-};
-
-const union AffineAnimCmd *const gSpriteAffineAnimTable_83B6F5C[] = {
- gSpriteAffineAnim_83B6F34,
- gSpriteAffineAnim_83B6F44
-};
diff --git a/src/pokemon_storage_system_4.c b/src/pokemon_storage_system_4.c
index 2d156c159..43aef277a 100644
--- a/src/pokemon_storage_system_4.c
+++ b/src/pokemon_storage_system_4.c
@@ -37,6 +37,7 @@ EWRAM_DATA u8 gUnknown_020384E7 = 0;
EWRAM_DATA u8 gUnknown_020384E8 = 0;
EWRAM_DATA u8 gUnknown_020384E9 = 0;
EWRAM_DATA u8 gUnknown_020384EA = 0;
+EWRAM_DATA struct UnkStruct_2000020 *gUnknown_020384EC = NULL;
// Static ROM declarations
@@ -76,6 +77,9 @@ bool8 sub_809CAB0(void);
void sub_809CC04(void);
void sub_809CD88(void);
s8 sub_809CE4C(u8 a0);
+void sub_809CA8C(void);
+void sub_809D0BC(struct UnkStruct_2000028*);
+void sub_809D1C4(struct UnkStruct_2000028*);
// .rodata
@@ -325,6 +329,14 @@ bool8 (*const gUnknown_083BBBC8[])(void) = {
sub_809B1D8,
sub_809B24C
};
+
+extern const struct SpriteSheet gHandCursorSpriteSheets[3];
+extern const struct SpritePalette gHandCursorSpritePalettes[3];
+extern const struct SpriteTemplate gSpriteTemplate_83BBC70;
+extern const struct SpriteTemplate gSpriteTemplate_83BBC88;
+extern const u8 *const gUnknown_083BBCA0[];
+extern struct PokemonStorageSystemFunc gUnknown_083BBBD4[];
+
// .text
void sub_8099BF8(u8 boxId)
@@ -2847,3 +2859,746 @@ NAKED u8 sub_809C664(void)
"\tbx r1");
}
#endif
+
+u8 sub_809C85C(void)
+{
+ u8 retVal;
+ s8 var0;
+ register s8 var1 asm("r5"); // FAKEMATCHING: r5 and r6 become swapped without this register hack
+
+ gPokemonStorageSystemPtr->unk_11df = 0;
+ gPokemonStorageSystemPtr->unk_11de = 0;
+ gPokemonStorageSystemPtr->unk_11e3 = 0;
+
+ if (!(gMain.newAndRepeatedKeys & DPAD_UP))
+ {
+ if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ retVal = 1;
+ var0 = 0;
+ var1 = 2;
+ }
+ else
+ {
+ if (gMain.heldKeys & DPAD_LEFT)
+ return 10;
+ if (gMain.heldKeys & DPAD_RIGHT)
+ return 9;
+ if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR)
+ {
+ if (gMain.heldKeys & L_BUTTON)
+ return 10;
+ if (gMain.heldKeys & R_BUTTON)
+ return 9;
+ }
+
+ if (gMain.newKeys & A_BUTTON)
+ {
+ sub_809A860(0);
+ sub_809CA8C();
+ return 7;
+ }
+
+ if (gMain.newKeys & B_BUTTON)
+ return 16;
+
+ if (gMain.newKeys & SELECT_BUTTON)
+ {
+ sub_809CD88();
+ return 0;
+ }
+
+ retVal = 0;
+ }
+ }
+ else
+ {
+ retVal = 1;
+ var0 = 3;
+ var1 = 0;
+ gPokemonStorageSystemPtr->unk_11e3 = 1;
+ }
+
+ if (retVal)
+ {
+ if (var0 != 2)
+ sub_809A860(0);
+ sub_809AF18(var0, var1);
+ return retVal;
+ }
+
+ return retVal;
+}
+
+#ifdef NONMATCHING
+u8 sub_809C944(void)
+{
+ u8 r6;
+ s8 var0 = gUnknown_020384E4;
+ s8 var1 = gUnknown_020384E5;
+
+ gPokemonStorageSystemPtr->unk_11df = 0;
+ gPokemonStorageSystemPtr->unk_11de = 0;
+ gPokemonStorageSystemPtr->unk_11e3 = 0;
+
+ if (!(gMain.newAndRepeatedKeys & DPAD_UP))
+ {
+ if (gMain.newAndRepeatedKeys & (DPAD_DOWN | START_BUTTON))
+ {
+ r6 = 1;
+ var0 = 2;
+ var1 = 0;
+ gPokemonStorageSystemPtr->unk_11e3 = 1;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_LEFT)
+ {
+ r6 = 1;
+ var1 -= 1;
+ if (var1 < 0)
+ {
+ gPokemonStorageSystemPtr->unk_11df = -1;
+ var1 = 1;
+ }
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
+ {
+ r6 = 1;
+ var1 += 1;
+ if (var1 > 1)
+ {
+ gPokemonStorageSystemPtr->unk_11df = 1;
+ var1 = 0;
+ }
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ return var1 == 0 ? 5 : 4;
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ return 16;
+ }
+ else if (gMain.newKeys & SELECT_BUTTON)
+ {
+ sub_809CD88();
+ return 0;
+ }
+ else
+ {
+ r6 = 0;
+ }
+ }
+ else
+ {
+ r6 = 1;
+ var0 = 0;
+ gPokemonStorageSystemPtr->unk_11de = -1;
+ var1 = !gUnknown_020384E5 ? 24 : 29;
+ gPokemonStorageSystemPtr->unk_11e3 = 1;
+ }
+
+ if (r6)
+ {
+ sub_809AF18(var0, var1);
+ }
+
+ return r6;
+}
+#else
+NAKED
+u8 sub_809C944(void)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ ldr r0, _0809C988 @ =gUnknown_020384E4\n\
+ ldrb r0, [r0]\n\
+ mov r12, r0\n\
+ ldr r7, _0809C98C @ =gUnknown_020384E5\n\
+ ldrb r3, [r7]\n\
+ ldr r0, _0809C990 @ =gPokemonStorageSystemPtr\n\
+ ldr r1, [r0]\n\
+ ldr r0, _0809C994 @ =0x000011df\n\
+ adds r5, r1, r0\n\
+ movs r0, 0\n\
+ strb r0, [r5]\n\
+ ldr r2, _0809C998 @ =0x000011de\n\
+ adds r4, r1, r2\n\
+ strb r0, [r4]\n\
+ adds r2, 0x5\n\
+ adds r1, r2\n\
+ strb r0, [r1]\n\
+ ldr r6, _0809C99C @ =gMain\n\
+ ldrh r2, [r6, 0x30]\n\
+ movs r0, 0x40\n\
+ ands r0, r2\n\
+ cmp r0, 0\n\
+ bne _0809CA14\n\
+ movs r0, 0x88\n\
+ ands r0, r2\n\
+ cmp r0, 0\n\
+ beq _0809C9A0\n\
+ movs r6, 0x1\n\
+ movs r0, 0x2\n\
+ mov r12, r0\n\
+ movs r3, 0\n\
+ b _0809CA2A\n\
+ .align 2, 0\n\
+_0809C988: .4byte gUnknown_020384E4\n\
+_0809C98C: .4byte gUnknown_020384E5\n\
+_0809C990: .4byte gPokemonStorageSystemPtr\n\
+_0809C994: .4byte 0x000011df\n\
+_0809C998: .4byte 0x000011de\n\
+_0809C99C: .4byte gMain\n\
+_0809C9A0:\n\
+ movs r0, 0x20\n\
+ ands r0, r2\n\
+ cmp r0, 0\n\
+ beq _0809C9C0\n\
+ movs r6, 0x1\n\
+ lsls r0, r3, 24\n\
+ movs r1, 0xFF\n\
+ lsls r1, 24\n\
+ adds r0, r1\n\
+ lsrs r3, r0, 24\n\
+ cmp r0, 0\n\
+ bge _0809CA2C\n\
+ movs r0, 0xFF\n\
+ strb r0, [r5]\n\
+ movs r3, 0x1\n\
+ b _0809CA2C\n\
+_0809C9C0:\n\
+ movs r0, 0x10\n\
+ ands r0, r2\n\
+ cmp r0, 0\n\
+ beq _0809C9E0\n\
+ movs r6, 0x1\n\
+ lsls r0, r3, 24\n\
+ movs r2, 0x80\n\
+ lsls r2, 17\n\
+ adds r0, r2\n\
+ lsrs r3, r0, 24\n\
+ asrs r0, 24\n\
+ cmp r0, 0x1\n\
+ ble _0809CA2C\n\
+ strb r6, [r5]\n\
+ movs r3, 0\n\
+ b _0809CA2C\n\
+_0809C9E0:\n\
+ ldrh r1, [r6, 0x2E]\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0809C9F4\n\
+ movs r0, 0x4\n\
+ cmp r3, 0\n\
+ bne _0809CA3A\n\
+ movs r0, 0x5\n\
+ b _0809CA3A\n\
+_0809C9F4:\n\
+ movs r0, 0x2\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0809CA00\n\
+ movs r0, 0x10\n\
+ b _0809CA3A\n\
+_0809CA00:\n\
+ movs r0, 0x4\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0809CA10\n\
+ bl sub_809CD88\n\
+ movs r0, 0\n\
+ b _0809CA3A\n\
+_0809CA10:\n\
+ movs r6, 0\n\
+ b _0809CA38\n\
+_0809CA14:\n\
+ movs r6, 0x1\n\
+ movs r0, 0\n\
+ mov r12, r0\n\
+ movs r0, 0xFF\n\
+ strb r0, [r4]\n\
+ movs r0, 0\n\
+ ldrsb r0, [r7, r0]\n\
+ movs r3, 0x1D\n\
+ cmp r0, 0\n\
+ bne _0809CA2A\n\
+ movs r3, 0x18\n\
+_0809CA2A:\n\
+ strb r6, [r1]\n\
+_0809CA2C:\n\
+ cmp r6, 0\n\
+ beq _0809CA38\n\
+ mov r0, r12\n\
+ adds r1, r3, 0\n\
+ bl sub_809AF18\n\
+_0809CA38:\n\
+ adds r0, r6, 0\n\
+_0809CA3A:\n\
+ pop {r4-r7}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .syntax divided\n");
+}
+#endif // NONMATCHING
+
+u8 sub_809CA40(void)
+{
+ u16 i = 0;
+ while (gUnknown_083BBBD4[i].func != NULL)
+ {
+ if (gUnknown_083BBBD4[i].unk4 == gUnknown_020384E4)
+ return gUnknown_083BBBD4[i].func();
+ i++;
+ }
+
+ return 0;
+}
+
+void sub_809CA8C(void)
+{
+ sub_809CDCC();
+ sub_809CDEC(9);
+ sub_809CDEC(10);
+ sub_809CDEC(11);
+ sub_809CDEC(0);
+}
+
+#if DEBUG
+u8 debug_sub_80AA40C(void)
+{
+ if (sub_809AB8C())
+ {
+ sub_809CDCC();
+ sub_809CDEC(32);
+ sub_809CDEC(6);
+ return 1;
+ }
+
+ return 0;
+}
+#endif
+
+bool8 sub_809CAB0(void)
+{
+ u16 var0;
+
+#if DEBUG
+ if (unk_2038790)
+ return debug_sub_80AA40C();
+#endif
+
+ sub_809CDCC();
+ var0 = sub_809AB8C();
+
+ switch (gPokemonStorageSystemPtr->unk_0005)
+ {
+ case 1:
+ if (var0)
+ sub_809CDEC(1);
+ else
+ return 0;
+ break;
+ case 0:
+ if (var0)
+ sub_809CDEC(2);
+ else
+ return 0;
+ break;
+ case 2:
+ if (gUnknown_020384E6)
+ {
+ if (var0)
+ sub_809CDEC(4);
+ else
+ sub_809CDEC(5);
+ }
+ else
+ {
+ if (var0)
+ sub_809CDEC(3);
+ else
+ return 0;
+ }
+ break;
+ default:
+ return 0;
+ }
+
+ sub_809CDEC(6);
+ if (gPokemonStorageSystemPtr->unk_0005 == 2)
+ {
+ if (!gUnknown_020384E4)
+ sub_809CDEC(2);
+ else
+ sub_809CDEC(1);
+ }
+
+ sub_809CDEC(8);
+ sub_809CDEC(7);
+ sub_809CDEC(0);
+ return 1;
+}
+
+void sub_809CB74(struct Sprite *sprite)
+{
+ sprite->pos1.x = gPokemonStorageSystemPtr->unk_11c0->pos1.x;
+ sprite->pos1.y = gPokemonStorageSystemPtr->unk_11c0->pos1.y + 20;
+}
+
+void sub_809CB94(struct Pokemon *mon)
+{
+ if (gUnknown_020384E4 == 1)
+ {
+ mon->box = gPlayerParty[gUnknown_020384E5].box;
+ }
+ else
+ {
+ u8 boxId = get_preferred_box();
+ mon->box = gPokemonStorage.boxes[boxId][gUnknown_020384E5];
+ }
+}
+
+void sub_809CC04(void)
+{
+ u16 x, y;
+ u8 spriteId;
+ int priority, subpriority;
+ struct SpriteSheet spriteSheets[3];
+ struct SpritePalette spritePalettes[3];
+
+ memcpy(spriteSheets, gHandCursorSpriteSheets, 24);
+ memcpy(spritePalettes, gHandCursorSpritePalettes, 24);
+ LoadSpriteSheets(spriteSheets);
+ LoadSpritePalettes(spritePalettes);
+ gPokemonStorageSystemPtr->unk_11e4[0] = IndexOfSpritePaletteTag(0xDAC6);
+ gPokemonStorageSystemPtr->unk_11e4[1] = IndexOfSpritePaletteTag(0xDAD1);
+
+ sub_809AACC(gUnknown_020384E4, gUnknown_020384E5, &x, &y);
+ spriteId = CreateSprite(&gSpriteTemplate_83BBC70, x, y, 6);
+ if (spriteId != MAX_SPRITES)
+ {
+ gPokemonStorageSystemPtr->unk_11c0 = &gSprites[spriteId];
+ gPokemonStorageSystemPtr->unk_11c0->oam.paletteNum = gPokemonStorageSystemPtr->unk_11e4[gUnknown_020384E9];
+ if (gUnknown_020384E6)
+ StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 3);
+ }
+ else
+ {
+ gPokemonStorageSystemPtr->unk_11c0 = NULL;
+ }
+
+ if (gUnknown_020384E4 == 1)
+ {
+ subpriority = 12;
+ priority = 1;
+ }
+ else
+ {
+ subpriority = 20;
+ priority = 2;
+ }
+
+ spriteId = CreateSprite(&gSpriteTemplate_83BBC88, 0, 0, subpriority);
+ if (spriteId != MAX_SPRITES)
+ {
+ gPokemonStorageSystemPtr->unk_11c4 = &gSprites[spriteId];
+ gPokemonStorageSystemPtr->unk_11c4->oam.priority = priority;
+ if (gUnknown_020384E4)
+ gPokemonStorageSystemPtr->unk_11c4->invisible = 1;
+ }
+ else
+ {
+ gPokemonStorageSystemPtr->unk_11c4 = NULL;
+ }
+}
+
+void sub_809CD88(void)
+{
+ gUnknown_020384E9 = !gUnknown_020384E9;
+ gPokemonStorageSystemPtr->unk_11c0->oam.paletteNum = gPokemonStorageSystemPtr->unk_11e4[gUnknown_020384E9];
+}
+
+void sub_809CDCC(void)
+{
+ gPokemonStorageSystemPtr->unk_11b8 = 0;
+ gPokemonStorageSystemPtr->unk_11b9 = 0;
+}
+
+void sub_809CDEC(u8 arg0)
+{
+ u8 width;
+ u8 var0;
+
+ if (gPokemonStorageSystemPtr->unk_11b8 < 7)
+ {
+ struct StorageText *storageText = &gPokemonStorageSystemPtr->unk_1180[gPokemonStorageSystemPtr->unk_11b8];
+ storageText->text = gUnknown_083BBCA0[arg0];
+ storageText->textId = arg0;
+ width = GetStringWidthInMenuWindow(storageText->text);
+ var0 = (width + 7) / 8;
+ if (var0 > gPokemonStorageSystemPtr->unk_11b9)
+ gPokemonStorageSystemPtr->unk_11b9 = var0;
+
+ gPokemonStorageSystemPtr->unk_11b8++;
+ }
+}
+
+s8 sub_809CE4C(u8 arg0)
+{
+ if (arg0 >= gPokemonStorageSystemPtr->unk_11b8)
+ return -1;
+ else
+ return gPokemonStorageSystemPtr->unk_1180[arg0].textId;
+}
+
+void sub_809CE84(void)
+{
+ gPokemonStorageSystemPtr->unk_11bc = 14 - gPokemonStorageSystemPtr->unk_11b8 * 2;
+ gPokemonStorageSystemPtr->unk_11ba = 28 - gPokemonStorageSystemPtr->unk_11b9;
+ Menu_DrawStdWindowFrame(gPokemonStorageSystemPtr->unk_11ba, gPokemonStorageSystemPtr->unk_11bc, 29, 15);
+ Menu_PrintItems(
+ gPokemonStorageSystemPtr->unk_11ba + 1,
+ gPokemonStorageSystemPtr->unk_11bc + 1,
+ gPokemonStorageSystemPtr->unk_11b8,
+ gPokemonStorageSystemPtr->unk_1180);
+ InitMenu(
+ 0,
+ gPokemonStorageSystemPtr->unk_11ba + 1,
+ gPokemonStorageSystemPtr->unk_11bc + 1,
+ gPokemonStorageSystemPtr->unk_11b8,
+ 0,
+ gPokemonStorageSystemPtr->unk_11b9);
+}
+
+#ifdef NONMATCHING // r4 and r5 are swapped throughout the entire function.
+s16 sub_809CF30(void)
+{
+ int textId = -2;
+
+ if (!(gMain.newKeys & A_BUTTON))
+ {
+ if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(5);
+ textId++;
+ }
+
+ if (gMain.newKeys & DPAD_UP)
+ {
+ PlaySE(5);
+ Menu_MoveCursor(-1);
+ }
+ else if (gMain.newKeys & DPAD_DOWN)
+ {
+ PlaySE(5);
+ Menu_MoveCursor(1);
+ }
+ }
+ else
+ {
+ textId = Menu_GetCursorPos();
+ }
+
+ if (textId != -2)
+ {
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(
+ gPokemonStorageSystemPtr->unk_11ba,
+ gPokemonStorageSystemPtr->unk_11bc,
+ 29,
+ 15);
+ }
+
+ if (textId >= 0)
+ {
+ textId = gPokemonStorageSystemPtr->unk_1180[textId].textId;
+ }
+
+ return textId;
+}
+#else
+NAKED
+s16 sub_809CF30(void)
+{
+ asm(".syntax unified\n\
+ push {r4,r5,lr}\n\
+ movs r5, 0x2\n\
+ negs r5, r5\n\
+ ldr r4, _0809CF6C @ =gMain\n\
+ ldrh r1, [r4, 0x2E]\n\
+ movs r0, 0x1\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _0809CF86\n\
+ movs r0, 0x2\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0809CF52\n\
+ movs r0, 0x5\n\
+ bl PlaySE\n\
+ adds r5, 0x1\n\
+_0809CF52:\n\
+ ldrh r1, [r4, 0x2E]\n\
+ movs r0, 0x40\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0809CF70\n\
+ movs r0, 0x5\n\
+ bl PlaySE\n\
+ movs r0, 0x1\n\
+ negs r0, r0\n\
+ bl Menu_MoveCursor\n\
+ b _0809CF8E\n\
+ .align 2, 0\n\
+_0809CF6C: .4byte gMain\n\
+_0809CF70:\n\
+ movs r0, 0x80\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ beq _0809CF8E\n\
+ movs r0, 0x5\n\
+ bl PlaySE\n\
+ movs r0, 0x1\n\
+ bl Menu_MoveCursor\n\
+ b _0809CF8E\n\
+_0809CF86:\n\
+ bl Menu_GetCursorPos\n\
+ lsls r0, 24\n\
+ lsrs r5, r0, 24\n\
+_0809CF8E:\n\
+ movs r0, 0x2\n\
+ negs r0, r0\n\
+ cmp r5, r0\n\
+ beq _0809CFB2\n\
+ bl Menu_DestroyCursor\n\
+ ldr r0, _0809CFD0 @ =gPokemonStorageSystemPtr\n\
+ ldr r1, [r0]\n\
+ ldr r2, _0809CFD4 @ =0x000011ba\n\
+ adds r0, r1, r2\n\
+ ldrb r0, [r0]\n\
+ adds r2, 0x2\n\
+ adds r1, r2\n\
+ ldrb r1, [r1]\n\
+ movs r2, 0x1D\n\
+ movs r3, 0xF\n\
+ bl Menu_EraseWindowRect\n\
+_0809CFB2:\n\
+ cmp r5, 0\n\
+ blt _0809CFC4\n\
+ ldr r0, _0809CFD0 @ =gPokemonStorageSystemPtr\n\
+ ldr r0, [r0]\n\
+ lsls r1, r5, 3\n\
+ ldr r2, _0809CFD8 @ =0x00001184\n\
+ adds r0, r2\n\
+ adds r0, r1\n\
+ ldr r5, [r0]\n\
+_0809CFC4:\n\
+ lsls r0, r5, 16\n\
+ asrs r0, 16\n\
+ pop {r4,r5}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .align 2, 0\n\
+_0809CFD0: .4byte gPokemonStorageSystemPtr\n\
+_0809CFD4: .4byte 0x000011ba\n\
+_0809CFD8: .4byte 0x00001184\n\
+ .syntax divided\n");
+}
+#endif // NONMATCHING
+
+void sub_809CFDC(struct UnkStruct_2000020 *arg0, struct UnkStruct_2000028 *arg1, u8 arg2)
+{
+ gUnknown_020384EC = arg0;
+ arg0->unk_00 = arg1;
+ arg0->unk_05 = arg2;
+ arg0->unk_04 = 0;
+}
+
+void sub_809CFF0(void)
+{
+ u16 i;
+ struct UnkStruct_2000028 *unkStruct;
+
+ if (gUnknown_020384EC->unk_04)
+ {
+ for (i = 0; i < gUnknown_020384EC->unk_04; i++)
+ {
+ unkStruct = &gUnknown_020384EC->unk_00[i];
+ unkStruct->unk_0c(unkStruct);
+ }
+
+ gUnknown_020384EC->unk_04 = 0;
+ }
+}
+
+bool8 sub_809D034(u8 *dest, u16 dLeft, u16 dTop, const u8 *src, u16 sLeft, u16 sTop, u16 width, u16 height)
+{
+ struct UnkStruct_2000028 *unkStruct;
+
+ if (gUnknown_020384EC->unk_04 >= gUnknown_020384EC->unk_05)
+ return FALSE;
+
+ unkStruct = &gUnknown_020384EC->unk_00[gUnknown_020384EC->unk_04++];
+ unkStruct->unk_08 = width * 2;
+ unkStruct->unk_04 = dest + (dTop * 64) + (dLeft * 2);
+ unkStruct->unk_00 = src + (sTop * 64) + (sLeft * 2);
+ unkStruct->unk_0a = height;
+ unkStruct->unk_0c = sub_809D0BC;
+ return TRUE;
+}
+
+void sub_809D0BC(struct UnkStruct_2000028 *unkStruct)
+{
+ u32 i;
+ const u8 *src = unkStruct->unk_00;
+ u8 *dest = unkStruct->unk_04;
+ int height = unkStruct->unk_0a;
+ int width = unkStruct->unk_08;
+ for (i = 0; i < height; i++)
+ {
+ CpuSet(src, dest, (width / 2) & 0x1FFFFF);
+ dest += 64;
+ src += 64;
+ }
+}
+
+void sub_809D104(u8 *dest, u16 dLeft, u16 dTop, const u8 *src, u16 sLeft, u16 sTop, u16 width, u16 height)
+{
+ const u8 *from = src + (sTop * 64) + (sLeft * 2);
+ u8 *to = dest + (dTop * 64) + (dLeft * 2);
+ u8 *end = dest + (dTop + height) * 64;
+ int width2 = width * 2;
+ while (to < end)
+ {
+ CpuSet(from, to, (width2 / 2) & 0x1FFFFF);
+ to += 64;
+ from += 64;
+ }
+}
+
+bool8 sub_809D16C(void *dest, u16 dLeft, u16 dTop, u16 width, u16 height)
+{
+ struct UnkStruct_2000028 *unkStruct;
+
+ if (gUnknown_020384EC->unk_04 >= gUnknown_020384EC->unk_05)
+ return FALSE;
+
+ unkStruct = &gUnknown_020384EC->unk_00[gUnknown_020384EC->unk_04++];
+ unkStruct->unk_08 = width * 2;
+ unkStruct->unk_04 = dest + ((dTop * 32) + dLeft) * 2;
+ unkStruct->unk_0a = height;
+ unkStruct->unk_0c = sub_809D1C4;
+ return TRUE;
+}
+
+void sub_809D1C4(struct UnkStruct_2000028 *unkStruct)
+{
+ u16 i;
+
+ for (i = 0; i < unkStruct->unk_0a; i++)
+ {
+ Dma3FillLarge_(0, unkStruct->unk_04, unkStruct->unk_08, 16);
+ unkStruct->unk_04 += 64;
+ }
+}
diff --git a/src/pokemon_storage_system_5.c b/src/pokemon_storage_system_5.c
deleted file mode 100644
index 8848800ab..000000000
--- a/src/pokemon_storage_system_5.c
+++ /dev/null
@@ -1,775 +0,0 @@
-#include "global.h"
-#include "main.h"
-#include "menu.h"
-#include "pokemon_storage_system.h"
-#include "sound.h"
-
-EWRAM_DATA struct UnkStruct_2000020 *gUnknown_020384EC = NULL;
-
-extern s8 gUnknown_020384E4;
-extern s8 gUnknown_020384E5;
-extern bool8 gUnknown_020384E6;
-extern u8 gUnknown_020384E9;
-
-#if DEBUG
-extern u8 unk_2038790;
-#endif
-
-extern const struct SpriteSheet gHandCursorSpriteSheets[3];
-extern const struct SpritePalette gHandCursorSpritePalettes[3];
-extern const struct SpriteTemplate gSpriteTemplate_83BBC70;
-extern const struct SpriteTemplate gSpriteTemplate_83BBC88;
-extern const u8 *const gUnknown_083BBCA0[];
-
-extern struct PokemonStorageSystemFunc gUnknown_083BBBD4[];
-
-void sub_809AF18(u8 a0, u8 a1);
-void sub_809CA8C(void);
-void sub_809CD88(void);
-u16 sub_809AB8C(void);
-void sub_809AACC(u8 a0, u8 a1, u16 *a2, u16 *a3);
-void sub_809D0BC(struct UnkStruct_2000028*);
-void sub_809D1C4(struct UnkStruct_2000028*);
-
-u8 sub_809C85C(void)
-{
- u8 retVal;
- s8 var0;
- register s8 var1 asm("r5"); // FAKEMATCHING: r5 and r6 become swapped without this register hack
-
- gPokemonStorageSystemPtr->unk_11df = 0;
- gPokemonStorageSystemPtr->unk_11de = 0;
- gPokemonStorageSystemPtr->unk_11e3 = 0;
-
- if (!(gMain.newAndRepeatedKeys & DPAD_UP))
- {
- if (gMain.newAndRepeatedKeys & DPAD_DOWN)
- {
- retVal = 1;
- var0 = 0;
- var1 = 2;
- }
- else
- {
- if (gMain.heldKeys & DPAD_LEFT)
- return 10;
- if (gMain.heldKeys & DPAD_RIGHT)
- return 9;
- if (gSaveBlock2.optionsButtonMode == OPTIONS_BUTTON_MODE_LR)
- {
- if (gMain.heldKeys & L_BUTTON)
- return 10;
- if (gMain.heldKeys & R_BUTTON)
- return 9;
- }
-
- if (gMain.newKeys & A_BUTTON)
- {
- sub_809A860(0);
- sub_809CA8C();
- return 7;
- }
-
- if (gMain.newKeys & B_BUTTON)
- return 16;
-
- if (gMain.newKeys & SELECT_BUTTON)
- {
- sub_809CD88();
- return 0;
- }
-
- retVal = 0;
- }
- }
- else
- {
- retVal = 1;
- var0 = 3;
- var1 = 0;
- gPokemonStorageSystemPtr->unk_11e3 = 1;
- }
-
- if (retVal)
- {
- if (var0 != 2)
- sub_809A860(0);
- sub_809AF18(var0, var1);
- return retVal;
- }
-
- return retVal;
-}
-
-#ifdef NONMATCHING
-u8 sub_809C944(void)
-{
- u8 r6;
- s8 var0 = gUnknown_020384E4;
- s8 var1 = gUnknown_020384E5;
-
- gPokemonStorageSystemPtr->unk_11df = 0;
- gPokemonStorageSystemPtr->unk_11de = 0;
- gPokemonStorageSystemPtr->unk_11e3 = 0;
-
- if (!(gMain.newAndRepeatedKeys & DPAD_UP))
- {
- if (gMain.newAndRepeatedKeys & (DPAD_DOWN | START_BUTTON))
- {
- r6 = 1;
- var0 = 2;
- var1 = 0;
- gPokemonStorageSystemPtr->unk_11e3 = 1;
- }
- else if (gMain.newAndRepeatedKeys & DPAD_LEFT)
- {
- r6 = 1;
- var1 -= 1;
- if (var1 < 0)
- {
- gPokemonStorageSystemPtr->unk_11df = -1;
- var1 = 1;
- }
- }
- else if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
- {
- r6 = 1;
- var1 += 1;
- if (var1 > 1)
- {
- gPokemonStorageSystemPtr->unk_11df = 1;
- var1 = 0;
- }
- }
- else if (gMain.newKeys & A_BUTTON)
- {
- return var1 == 0 ? 5 : 4;
- }
- else if (gMain.newKeys & B_BUTTON)
- {
- return 16;
- }
- else if (gMain.newKeys & SELECT_BUTTON)
- {
- sub_809CD88();
- return 0;
- }
- else
- {
- r6 = 0;
- }
- }
- else
- {
- r6 = 1;
- var0 = 0;
- gPokemonStorageSystemPtr->unk_11de = -1;
- var1 = !gUnknown_020384E5 ? 24 : 29;
- gPokemonStorageSystemPtr->unk_11e3 = 1;
- }
-
- if (r6)
- {
- sub_809AF18(var0, var1);
- }
-
- return r6;
-}
-#else
-NAKED
-u8 sub_809C944(void)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- ldr r0, _0809C988 @ =gUnknown_020384E4\n\
- ldrb r0, [r0]\n\
- mov r12, r0\n\
- ldr r7, _0809C98C @ =gUnknown_020384E5\n\
- ldrb r3, [r7]\n\
- ldr r0, _0809C990 @ =gPokemonStorageSystemPtr\n\
- ldr r1, [r0]\n\
- ldr r0, _0809C994 @ =0x000011df\n\
- adds r5, r1, r0\n\
- movs r0, 0\n\
- strb r0, [r5]\n\
- ldr r2, _0809C998 @ =0x000011de\n\
- adds r4, r1, r2\n\
- strb r0, [r4]\n\
- adds r2, 0x5\n\
- adds r1, r2\n\
- strb r0, [r1]\n\
- ldr r6, _0809C99C @ =gMain\n\
- ldrh r2, [r6, 0x30]\n\
- movs r0, 0x40\n\
- ands r0, r2\n\
- cmp r0, 0\n\
- bne _0809CA14\n\
- movs r0, 0x88\n\
- ands r0, r2\n\
- cmp r0, 0\n\
- beq _0809C9A0\n\
- movs r6, 0x1\n\
- movs r0, 0x2\n\
- mov r12, r0\n\
- movs r3, 0\n\
- b _0809CA2A\n\
- .align 2, 0\n\
-_0809C988: .4byte gUnknown_020384E4\n\
-_0809C98C: .4byte gUnknown_020384E5\n\
-_0809C990: .4byte gPokemonStorageSystemPtr\n\
-_0809C994: .4byte 0x000011df\n\
-_0809C998: .4byte 0x000011de\n\
-_0809C99C: .4byte gMain\n\
-_0809C9A0:\n\
- movs r0, 0x20\n\
- ands r0, r2\n\
- cmp r0, 0\n\
- beq _0809C9C0\n\
- movs r6, 0x1\n\
- lsls r0, r3, 24\n\
- movs r1, 0xFF\n\
- lsls r1, 24\n\
- adds r0, r1\n\
- lsrs r3, r0, 24\n\
- cmp r0, 0\n\
- bge _0809CA2C\n\
- movs r0, 0xFF\n\
- strb r0, [r5]\n\
- movs r3, 0x1\n\
- b _0809CA2C\n\
-_0809C9C0:\n\
- movs r0, 0x10\n\
- ands r0, r2\n\
- cmp r0, 0\n\
- beq _0809C9E0\n\
- movs r6, 0x1\n\
- lsls r0, r3, 24\n\
- movs r2, 0x80\n\
- lsls r2, 17\n\
- adds r0, r2\n\
- lsrs r3, r0, 24\n\
- asrs r0, 24\n\
- cmp r0, 0x1\n\
- ble _0809CA2C\n\
- strb r6, [r5]\n\
- movs r3, 0\n\
- b _0809CA2C\n\
-_0809C9E0:\n\
- ldrh r1, [r6, 0x2E]\n\
- movs r0, 0x1\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0809C9F4\n\
- movs r0, 0x4\n\
- cmp r3, 0\n\
- bne _0809CA3A\n\
- movs r0, 0x5\n\
- b _0809CA3A\n\
-_0809C9F4:\n\
- movs r0, 0x2\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0809CA00\n\
- movs r0, 0x10\n\
- b _0809CA3A\n\
-_0809CA00:\n\
- movs r0, 0x4\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0809CA10\n\
- bl sub_809CD88\n\
- movs r0, 0\n\
- b _0809CA3A\n\
-_0809CA10:\n\
- movs r6, 0\n\
- b _0809CA38\n\
-_0809CA14:\n\
- movs r6, 0x1\n\
- movs r0, 0\n\
- mov r12, r0\n\
- movs r0, 0xFF\n\
- strb r0, [r4]\n\
- movs r0, 0\n\
- ldrsb r0, [r7, r0]\n\
- movs r3, 0x1D\n\
- cmp r0, 0\n\
- bne _0809CA2A\n\
- movs r3, 0x18\n\
-_0809CA2A:\n\
- strb r6, [r1]\n\
-_0809CA2C:\n\
- cmp r6, 0\n\
- beq _0809CA38\n\
- mov r0, r12\n\
- adds r1, r3, 0\n\
- bl sub_809AF18\n\
-_0809CA38:\n\
- adds r0, r6, 0\n\
-_0809CA3A:\n\
- pop {r4-r7}\n\
- pop {r1}\n\
- bx r1\n\
- .syntax divided\n");
-}
-#endif // NONMATCHING
-
-u8 sub_809CA40(void)
-{
- u16 i = 0;
- while (gUnknown_083BBBD4[i].func != NULL)
- {
- if (gUnknown_083BBBD4[i].unk4 == gUnknown_020384E4)
- return gUnknown_083BBBD4[i].func();
- i++;
- }
-
- return 0;
-}
-
-void sub_809CA8C(void)
-{
- sub_809CDCC();
- sub_809CDEC(9);
- sub_809CDEC(10);
- sub_809CDEC(11);
- sub_809CDEC(0);
-}
-
-#if DEBUG
-u8 debug_sub_80AA40C(void)
-{
- if (sub_809AB8C())
- {
- sub_809CDCC();
- sub_809CDEC(32);
- sub_809CDEC(6);
- return 1;
- }
-
- return 0;
-}
-#endif
-
-bool8 sub_809CAB0(void)
-{
- u16 var0;
-
-#if DEBUG
- if (unk_2038790)
- return debug_sub_80AA40C();
-#endif
-
- sub_809CDCC();
- var0 = sub_809AB8C();
-
- switch (gPokemonStorageSystemPtr->unk_0005)
- {
- case 1:
- if (var0)
- sub_809CDEC(1);
- else
- return 0;
- break;
- case 0:
- if (var0)
- sub_809CDEC(2);
- else
- return 0;
- break;
- case 2:
- if (gUnknown_020384E6)
- {
- if (var0)
- sub_809CDEC(4);
- else
- sub_809CDEC(5);
- }
- else
- {
- if (var0)
- sub_809CDEC(3);
- else
- return 0;
- }
- break;
- default:
- return 0;
- }
-
- sub_809CDEC(6);
- if (gPokemonStorageSystemPtr->unk_0005 == 2)
- {
- if (!gUnknown_020384E4)
- sub_809CDEC(2);
- else
- sub_809CDEC(1);
- }
-
- sub_809CDEC(8);
- sub_809CDEC(7);
- sub_809CDEC(0);
- return 1;
-}
-
-void sub_809CB74(struct Sprite *sprite)
-{
- sprite->pos1.x = gPokemonStorageSystemPtr->unk_11c0->pos1.x;
- sprite->pos1.y = gPokemonStorageSystemPtr->unk_11c0->pos1.y + 20;
-}
-
-void sub_809CB94(struct Pokemon *mon)
-{
- if (gUnknown_020384E4 == 1)
- {
- mon->box = gPlayerParty[gUnknown_020384E5].box;
- }
- else
- {
- u8 boxId = get_preferred_box();
- mon->box = gPokemonStorage.boxes[boxId][gUnknown_020384E5];
- }
-}
-
-void sub_809CC04(void)
-{
- u16 x, y;
- u8 spriteId;
- int priority, subpriority;
- struct SpriteSheet spriteSheets[3];
- struct SpritePalette spritePalettes[3];
-
- memcpy(spriteSheets, gHandCursorSpriteSheets, 24);
- memcpy(spritePalettes, gHandCursorSpritePalettes, 24);
- LoadSpriteSheets(spriteSheets);
- LoadSpritePalettes(spritePalettes);
- gPokemonStorageSystemPtr->unk_11e4[0] = IndexOfSpritePaletteTag(0xDAC6);
- gPokemonStorageSystemPtr->unk_11e4[1] = IndexOfSpritePaletteTag(0xDAD1);
-
- sub_809AACC(gUnknown_020384E4, gUnknown_020384E5, &x, &y);
- spriteId = CreateSprite(&gSpriteTemplate_83BBC70, x, y, 6);
- if (spriteId != MAX_SPRITES)
- {
- gPokemonStorageSystemPtr->unk_11c0 = &gSprites[spriteId];
- gPokemonStorageSystemPtr->unk_11c0->oam.paletteNum = gPokemonStorageSystemPtr->unk_11e4[gUnknown_020384E9];
- if (gUnknown_020384E6)
- StartSpriteAnim(gPokemonStorageSystemPtr->unk_11c0, 3);
- }
- else
- {
- gPokemonStorageSystemPtr->unk_11c0 = NULL;
- }
-
- if (gUnknown_020384E4 == 1)
- {
- subpriority = 12;
- priority = 1;
- }
- else
- {
- subpriority = 20;
- priority = 2;
- }
-
- spriteId = CreateSprite(&gSpriteTemplate_83BBC88, 0, 0, subpriority);
- if (spriteId != MAX_SPRITES)
- {
- gPokemonStorageSystemPtr->unk_11c4 = &gSprites[spriteId];
- gPokemonStorageSystemPtr->unk_11c4->oam.priority = priority;
- if (gUnknown_020384E4)
- gPokemonStorageSystemPtr->unk_11c4->invisible = 1;
- }
- else
- {
- gPokemonStorageSystemPtr->unk_11c4 = NULL;
- }
-}
-
-void sub_809CD88(void)
-{
- gUnknown_020384E9 = !gUnknown_020384E9;
- gPokemonStorageSystemPtr->unk_11c0->oam.paletteNum = gPokemonStorageSystemPtr->unk_11e4[gUnknown_020384E9];
-}
-
-void sub_809CDCC(void)
-{
- gPokemonStorageSystemPtr->unk_11b8 = 0;
- gPokemonStorageSystemPtr->unk_11b9 = 0;
-}
-
-void sub_809CDEC(u8 arg0)
-{
- u8 width;
- u8 var0;
-
- if (gPokemonStorageSystemPtr->unk_11b8 < 7)
- {
- struct StorageText *storageText = &gPokemonStorageSystemPtr->unk_1180[gPokemonStorageSystemPtr->unk_11b8];
- storageText->text = gUnknown_083BBCA0[arg0];
- storageText->textId = arg0;
- width = GetStringWidthInMenuWindow(storageText->text);
- var0 = (width + 7) / 8;
- if (var0 > gPokemonStorageSystemPtr->unk_11b9)
- gPokemonStorageSystemPtr->unk_11b9 = var0;
-
- gPokemonStorageSystemPtr->unk_11b8++;
- }
-}
-
-s8 sub_809CE4C(u8 arg0)
-{
- if (arg0 >= gPokemonStorageSystemPtr->unk_11b8)
- return -1;
- else
- return gPokemonStorageSystemPtr->unk_1180[arg0].textId;
-}
-
-void sub_809CE84(void)
-{
- gPokemonStorageSystemPtr->unk_11bc = 14 - gPokemonStorageSystemPtr->unk_11b8 * 2;
- gPokemonStorageSystemPtr->unk_11ba = 28 - gPokemonStorageSystemPtr->unk_11b9;
- Menu_DrawStdWindowFrame(gPokemonStorageSystemPtr->unk_11ba, gPokemonStorageSystemPtr->unk_11bc, 29, 15);
- Menu_PrintItems(
- gPokemonStorageSystemPtr->unk_11ba + 1,
- gPokemonStorageSystemPtr->unk_11bc + 1,
- gPokemonStorageSystemPtr->unk_11b8,
- gPokemonStorageSystemPtr->unk_1180);
- InitMenu(
- 0,
- gPokemonStorageSystemPtr->unk_11ba + 1,
- gPokemonStorageSystemPtr->unk_11bc + 1,
- gPokemonStorageSystemPtr->unk_11b8,
- 0,
- gPokemonStorageSystemPtr->unk_11b9);
-}
-
-#ifdef NONMATCHING // r4 and r5 are swapped throughout the entire function.
-s16 sub_809CF30(void)
-{
- int textId = -2;
-
- if (!(gMain.newKeys & A_BUTTON))
- {
- if (gMain.newKeys & B_BUTTON)
- {
- PlaySE(5);
- textId++;
- }
-
- if (gMain.newKeys & DPAD_UP)
- {
- PlaySE(5);
- Menu_MoveCursor(-1);
- }
- else if (gMain.newKeys & DPAD_DOWN)
- {
- PlaySE(5);
- Menu_MoveCursor(1);
- }
- }
- else
- {
- textId = Menu_GetCursorPos();
- }
-
- if (textId != -2)
- {
- Menu_DestroyCursor();
- Menu_EraseWindowRect(
- gPokemonStorageSystemPtr->unk_11ba,
- gPokemonStorageSystemPtr->unk_11bc,
- 29,
- 15);
- }
-
- if (textId >= 0)
- {
- textId = gPokemonStorageSystemPtr->unk_1180[textId].textId;
- }
-
- return textId;
-}
-#else
-NAKED
-s16 sub_809CF30(void)
-{
- asm(".syntax unified\n\
- push {r4,r5,lr}\n\
- movs r5, 0x2\n\
- negs r5, r5\n\
- ldr r4, _0809CF6C @ =gMain\n\
- ldrh r1, [r4, 0x2E]\n\
- movs r0, 0x1\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- bne _0809CF86\n\
- movs r0, 0x2\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0809CF52\n\
- movs r0, 0x5\n\
- bl PlaySE\n\
- adds r5, 0x1\n\
-_0809CF52:\n\
- ldrh r1, [r4, 0x2E]\n\
- movs r0, 0x40\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0809CF70\n\
- movs r0, 0x5\n\
- bl PlaySE\n\
- movs r0, 0x1\n\
- negs r0, r0\n\
- bl Menu_MoveCursor\n\
- b _0809CF8E\n\
- .align 2, 0\n\
-_0809CF6C: .4byte gMain\n\
-_0809CF70:\n\
- movs r0, 0x80\n\
- ands r0, r1\n\
- cmp r0, 0\n\
- beq _0809CF8E\n\
- movs r0, 0x5\n\
- bl PlaySE\n\
- movs r0, 0x1\n\
- bl Menu_MoveCursor\n\
- b _0809CF8E\n\
-_0809CF86:\n\
- bl Menu_GetCursorPos\n\
- lsls r0, 24\n\
- lsrs r5, r0, 24\n\
-_0809CF8E:\n\
- movs r0, 0x2\n\
- negs r0, r0\n\
- cmp r5, r0\n\
- beq _0809CFB2\n\
- bl Menu_DestroyCursor\n\
- ldr r0, _0809CFD0 @ =gPokemonStorageSystemPtr\n\
- ldr r1, [r0]\n\
- ldr r2, _0809CFD4 @ =0x000011ba\n\
- adds r0, r1, r2\n\
- ldrb r0, [r0]\n\
- adds r2, 0x2\n\
- adds r1, r2\n\
- ldrb r1, [r1]\n\
- movs r2, 0x1D\n\
- movs r3, 0xF\n\
- bl Menu_EraseWindowRect\n\
-_0809CFB2:\n\
- cmp r5, 0\n\
- blt _0809CFC4\n\
- ldr r0, _0809CFD0 @ =gPokemonStorageSystemPtr\n\
- ldr r0, [r0]\n\
- lsls r1, r5, 3\n\
- ldr r2, _0809CFD8 @ =0x00001184\n\
- adds r0, r2\n\
- adds r0, r1\n\
- ldr r5, [r0]\n\
-_0809CFC4:\n\
- lsls r0, r5, 16\n\
- asrs r0, 16\n\
- pop {r4,r5}\n\
- pop {r1}\n\
- bx r1\n\
- .align 2, 0\n\
-_0809CFD0: .4byte gPokemonStorageSystemPtr\n\
-_0809CFD4: .4byte 0x000011ba\n\
-_0809CFD8: .4byte 0x00001184\n\
- .syntax divided\n");
-}
-#endif // NONMATCHING
-
-void sub_809CFDC(struct UnkStruct_2000020 *arg0, struct UnkStruct_2000028 *arg1, u8 arg2)
-{
- gUnknown_020384EC = arg0;
- arg0->unk_00 = arg1;
- arg0->unk_05 = arg2;
- arg0->unk_04 = 0;
-}
-
-void sub_809CFF0(void)
-{
- u16 i;
- struct UnkStruct_2000028 *unkStruct;
-
- if (gUnknown_020384EC->unk_04)
- {
- for (i = 0; i < gUnknown_020384EC->unk_04; i++)
- {
- unkStruct = &gUnknown_020384EC->unk_00[i];
- unkStruct->unk_0c(unkStruct);
- }
-
- gUnknown_020384EC->unk_04 = 0;
- }
-}
-
-bool8 sub_809D034(u8 *dest, u16 dLeft, u16 dTop, const u8 *src, u16 sLeft, u16 sTop, u16 width, u16 height)
-{
- struct UnkStruct_2000028 *unkStruct;
-
- if (gUnknown_020384EC->unk_04 >= gUnknown_020384EC->unk_05)
- return FALSE;
-
- unkStruct = &gUnknown_020384EC->unk_00[gUnknown_020384EC->unk_04++];
- unkStruct->unk_08 = width * 2;
- unkStruct->unk_04 = dest + (dTop * 64) + (dLeft * 2);
- unkStruct->unk_00 = src + (sTop * 64) + (sLeft * 2);
- unkStruct->unk_0a = height;
- unkStruct->unk_0c = sub_809D0BC;
- return TRUE;
-}
-
-void sub_809D0BC(struct UnkStruct_2000028 *unkStruct)
-{
- u32 i;
- const u8 *src = unkStruct->unk_00;
- u8 *dest = unkStruct->unk_04;
- int height = unkStruct->unk_0a;
- int width = unkStruct->unk_08;
- for (i = 0; i < height; i++)
- {
- CpuSet(src, dest, (width / 2) & 0x1FFFFF);
- dest += 64;
- src += 64;
- }
-}
-
-void sub_809D104(u8 *dest, u16 dLeft, u16 dTop, const u8 *src, u16 sLeft, u16 sTop, u16 width, u16 height)
-{
- const u8 *from = src + (sTop * 64) + (sLeft * 2);
- u8 *to = dest + (dTop * 64) + (dLeft * 2);
- u8 *end = dest + (dTop + height) * 64;
- int width2 = width * 2;
- while (to < end)
- {
- CpuSet(from, to, (width2 / 2) & 0x1FFFFF);
- to += 64;
- from += 64;
- }
-}
-
-bool8 sub_809D16C(void *dest, u16 dLeft, u16 dTop, u16 width, u16 height)
-{
- struct UnkStruct_2000028 *unkStruct;
-
- if (gUnknown_020384EC->unk_04 >= gUnknown_020384EC->unk_05)
- return FALSE;
-
- unkStruct = &gUnknown_020384EC->unk_00[gUnknown_020384EC->unk_04++];
- unkStruct->unk_08 = width * 2;
- unkStruct->unk_04 = dest + ((dTop * 32) + dLeft) * 2;
- unkStruct->unk_0a = height;
- unkStruct->unk_0c = sub_809D1C4;
- return TRUE;
-}
-
-void sub_809D1C4(struct UnkStruct_2000028 *unkStruct)
-{
- u16 i;
-
- for (i = 0; i < unkStruct->unk_0a; i++)
- {
- Dma3FillLarge_(0, unkStruct->unk_04, unkStruct->unk_08, 16);
- unkStruct->unk_04 += 64;
- }
-}