summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorcamthesaxman <cameronghall@cox.net>2017-07-08 12:16:19 -0500
committercamthesaxman <cameronghall@cox.net>2017-07-08 12:16:19 -0500
commit9a57e785576c658980e7cac5d3531181ccc64d42 (patch)
tree85f92ebb52ccbcd26b041f20cb2f3f2b82b0e74b /src
parent4aa1b44315ee26fa60015a99ccd51f900e5597fd (diff)
decompile sub_80A3740 - swap32
Diffstat (limited to 'src')
-rw-r--r--src/item.c153
-rw-r--r--src/item_menu.c237
2 files changed, 389 insertions, 1 deletions
diff --git a/src/item.c b/src/item.c
index a5ed99a82..33aa87768 100644
--- a/src/item.c
+++ b/src/item.c
@@ -129,6 +129,7 @@ bool8 CheckBagHasSpace(u16 itemId, u16 count)
return TRUE;
}
+#ifdef NONMATCHING
bool8 AddBagItem(u16 itemId, u16 count)
{
u8 i;
@@ -193,6 +194,158 @@ bool8 AddBagItem(u16 itemId, u16 count)
memcpy(gBagPockets[pocket].itemSlots, newItems, gBagPockets[pocket].capacity * sizeof(struct ItemSlot));
return TRUE;
}
+#else
+__attribute__((naked))
+bool8 AddBagItem(u16 itemId, u16 count)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r9\n\
+ mov r6, r8\n\
+ push {r6,r7}\n\
+ sub sp, 0x100\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ mov r8, r0\n\
+ lsls r1, 16\n\
+ lsrs r4, r1, 16\n\
+ bl ItemId_GetPocket\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ beq _080A9510\n\
+ mov r0, r8\n\
+ bl ItemId_GetPocket\n\
+ subs r0, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r6, r0, 24\n\
+ ldr r1, _080A94F8 @ =gBagPockets\n\
+ lsls r0, r6, 3\n\
+ adds r5, r0, r1\n\
+ ldr r1, [r5]\n\
+ ldrb r2, [r5, 0x4]\n\
+ lsls r2, 2\n\
+ mov r0, sp\n\
+ bl memcpy\n\
+ ldr r7, _080A94FC @ =0x000003e7\n\
+ cmp r6, 0x3\n\
+ beq _080A9468\n\
+ movs r7, 0x63\n\
+_080A9468:\n\
+ movs r1, 0\n\
+ ldrb r0, [r5, 0x4]\n\
+ cmp r1, r0\n\
+ bcs _080A94B2\n\
+ subs r0, r6, 0x2\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ mov r12, r0\n\
+_080A9478:\n\
+ lsls r0, r1, 2\n\
+ mov r2, sp\n\
+ adds r3, r2, r0\n\
+ ldrh r0, [r3]\n\
+ cmp r0, r8\n\
+ bne _080A94A6\n\
+ ldrh r2, [r3, 0x2]\n\
+ adds r0, r2, r4\n\
+ cmp r0, r7\n\
+ ble _080A9500\n\
+ mov r0, r12\n\
+ cmp r0, 0x1\n\
+ bls _080A9510\n\
+ subs r0, r7, r2\n\
+ subs r0, r4, r0\n\
+ lsls r0, 16\n\
+ lsrs r4, r0, 16\n\
+ strh r7, [r3, 0x2]\n\
+ ldr r2, _080A94F8 @ =gBagPockets\n\
+ mov r9, r2\n\
+ lsls r3, r6, 3\n\
+ cmp r4, 0\n\
+ beq _080A9516\n\
+_080A94A6:\n\
+ adds r0, r1, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r1, r0, 24\n\
+ ldrb r0, [r5, 0x4]\n\
+ cmp r1, r0\n\
+ bcc _080A9478\n\
+_080A94B2:\n\
+ ldr r2, _080A94F8 @ =gBagPockets\n\
+ mov r9, r2\n\
+ lsls r3, r6, 3\n\
+ cmp r4, 0\n\
+ beq _080A9516\n\
+ movs r1, 0\n\
+ adds r0, r3, r2\n\
+ ldrb r0, [r0, 0x4]\n\
+ cmp r1, r0\n\
+ bcs _080A94F2\n\
+ mov r6, r9\n\
+ adds r5, r3, r6\n\
+_080A94CA:\n\
+ lsls r0, r1, 2\n\
+ mov r6, sp\n\
+ adds r2, r6, r0\n\
+ ldrh r0, [r2]\n\
+ cmp r0, 0\n\
+ bne _080A94E6\n\
+ mov r0, r8\n\
+ strh r0, [r2]\n\
+ cmp r4, r7\n\
+ bls _080A9514\n\
+ subs r0, r4, r7\n\
+ lsls r0, 16\n\
+ lsrs r4, r0, 16\n\
+ strh r7, [r2, 0x2]\n\
+_080A94E6:\n\
+ adds r0, r1, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r1, r0, 24\n\
+ ldrb r2, [r5, 0x4]\n\
+ cmp r1, r2\n\
+ bcc _080A94CA\n\
+_080A94F2:\n\
+ cmp r4, 0\n\
+ beq _080A9516\n\
+ b _080A9510\n\
+ .align 2, 0\n\
+_080A94F8: .4byte gBagPockets\n\
+_080A94FC: .4byte 0x000003e7\n\
+_080A9500:\n\
+ strh r0, [r3, 0x2]\n\
+ ldr r0, _080A950C @ =gBagPockets\n\
+ lsls r1, r6, 3\n\
+ adds r1, r0\n\
+ b _080A951A\n\
+ .align 2, 0\n\
+_080A950C: .4byte gBagPockets\n\
+_080A9510:\n\
+ movs r0, 0\n\
+ b _080A9528\n\
+_080A9514:\n\
+ strh r4, [r2, 0x2]\n\
+_080A9516:\n\
+ mov r6, r9\n\
+ adds r1, r3, r6\n\
+_080A951A:\n\
+ ldr r0, [r1]\n\
+ ldrb r2, [r1, 0x4]\n\
+ lsls r2, 2\n\
+ mov r1, sp\n\
+ bl memcpy\n\
+ movs r0, 0x1\n\
+_080A9528:\n\
+ add sp, 0x100\n\
+ pop {r3,r4}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ pop {r4-r7}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .syntax divided\n");
+}
+#endif
bool8 RemoveBagItem(u16 itemId, u16 count)
{
diff --git a/src/item_menu.c b/src/item_menu.c
index bbb91296f..91853588b 100644
--- a/src/item_menu.c
+++ b/src/item_menu.c
@@ -8,6 +8,8 @@
#include "palette.h"
#include "rom4.h"
#include "sprite.h"
+#include "strings.h"
+#include "strings2.h"
#include "task.h"
#include "text.h"
#include "unknown_task.h"
@@ -22,38 +24,98 @@ struct UnknownStruct1
u8 unk3;
};
+extern u8 gUnknown_02038558;
extern s8 gUnknown_02038559;
extern u8 gUnknown_0203855A;
extern u8 gUnknown_0203855B;
extern u8 gUnknown_0203855C;
+extern u8 gUnknown_02038562;
+extern u8 gUnknown_02038564;
extern u8 gUnknown_03000700;
extern u8 gUnknown_03000701;
+extern const u8 *gUnknown_03000704;
extern struct UnknownStruct1 gUnknown_03005D10[];
extern struct ItemSlot *gUnknown_03005D24;
+extern bool8 gLinkOpen;
extern void gpu_pal_allocator_reset__manage_upper_four(void);
extern void sub_80F9020(void);
extern void sub_80F9988();
+extern void sub_809D104(u16 *, u16, u16, const u8 *, u16, u16, u16, u16);
extern const struct CompressedSpriteSheet gUnknown_083C1CC8;
extern const struct CompressedSpriteSheet gUnknown_083C1CD0;
extern const struct CompressedSpritePalette gUnknown_083C1CD8;
+const struct BagPocket gBagPockets[NUM_BAG_POCKETS] =
+{
+ // pointer to items, capacity
+ {gSaveBlock1.bagPocket_Items, 20},
+ {gSaveBlock1.bagPocket_PokeBalls, 16},
+ {gSaveBlock1.bagPocket_TMHM, 64},
+ {gSaveBlock1.bagPocket_Berries, 46},
+ {gSaveBlock1.bagPocket_KeyItems, 20},
+};
+
+void sub_80A5B78(u8);
+void sub_80A5F14(u8);
+void sub_80A5F80(u8);
+void sub_80A5FAC(u8);
+void ItemMenu_UseInBattle(u8);
+void sub_80A7124(u8);
+void ItemMenu_Give(u8);
+void sub_80A6178(u8);
+void sub_80A69E0(u8);
+
+const struct MenuAction2 gUnknown_083C1640[] =
+{
+ {OtherText_Use, sub_80A5B78},
+ {OtherText_Toss, sub_80A5F14},
+ {gOtherText_CancelNoTerminator, sub_80A5F80},
+ {OtherText_Register, sub_80A5FAC},
+ {OtherText_Use, ItemMenu_UseInBattle},
+ {gOtherText_CancelNoTerminator, sub_80A7124},
+ {OtherText_Give2, ItemMenu_Give},
+ {OtherText_CheckTag, sub_80A6178},
+ {gOtherText_CancelWithTerminator, NULL},
+ {OtherText_Confirm, sub_80A69E0},
+};
+
+extern const u8 gUnknown_083C1690[][6];
+/*
+const u8 gUnknown_083C1690[][6] =
+{
+ {0, 1, 6, 2, 0, 0},
+ {6, 1, 8, 2, 0, 0},
+ {0, 8, 6, 2, 0, 0},
+ {7, 0, 1, 8, 6, 2},
+ {0, 8, 3, 2, 0, 0},
+};
+*/
+
void sub_80A34E8(void);
bool8 sub_80A3520(void);
void sub_80A362C(void);
void sub_80A3740(void);
+void sub_80A396C(u16 *, u8, u8, u8);
void sub_80A39B8(u16 *, u8);
+void sub_80A39E4(u16 *, u8, u8, s8);
void sub_80A3AC0(u16 *, u8);
-void sub_80A3C34();
+void sub_80A3C34(struct ItemSlot *, u32);
void sub_80A3D08(void);
+void sub_80A3D24(u8);
void sub_80A3D40(void);
void sub_80A48E8();
void ItemListMenu_InitDescription();
+void ItemListMenu_ChangeDescription();
+void sub_80A4F68(u8);
+void sub_80A50C8(u8);
void ItemListMenu_InitMenu(void);
void sub_80A740C(void);
void sub_80A751C(void);
+void sub_80A7590(void);
void sub_80A7630(void);
+void sub_80A76A0(void);
void sub_80A770C(void);
void sub_80A7828(void);
void sub_80A78B8(void);
@@ -337,3 +399,176 @@ void ClearBag(void)
ClearItemSlots(gBagPockets[i].itemSlots, gBagPockets[i].capacity);
sub_80A3684();
}
+
+extern const u16 gUnknown_083C1704[];
+
+void sub_80A3740(void)
+{
+ u16 arr[2];
+
+ // TODO: This is a local array
+ memcpy(arr, gUnknown_083C1704, 4);
+ LoadPalette(&arr[1], 0xD1, sizeof(arr[1]));
+ LoadPalette(&arr[0], 0xD8, sizeof(arr[0]));
+}
+
+void sub_80A3770(void)
+{
+ if (gUnknown_03000701 == 0)
+ {
+ gUnknown_03000704 = gUnknown_083C1690[gUnknown_02038559];
+ if (gUnknown_02038559 != 3)
+ gUnknown_02038564 = 4;
+ else
+ gUnknown_02038564 = 6;
+ }
+}
+
+void sub_80A37C0(u8 taskId)
+{
+ gTasks[taskId].func = sub_80A50C8;
+ StartVerticalScrollIndicators(0);
+ StartVerticalScrollIndicators(1);
+ StartVerticalScrollIndicators(2);
+ StartVerticalScrollIndicators(3);
+}
+
+void sub_80A37F8(u8 taskId)
+{
+ u8 r5 = gUnknown_0203855A;
+
+ if (r5 < 16)
+ {
+ gUnknown_0203855A++;
+ sub_80A396C(gBGTilemapBuffers[2], r5, gUnknown_0203855A, 0x4F);
+ sub_80A39E4(gBGTilemapBuffers[2], gUnknown_02038559 + 1, gUnknown_0203855A / 2, gTasks[taskId].data[5]);
+ gUnknown_02038558 = 1;
+ sub_80A48E8(taskId, r5 / 2, gUnknown_0203855A / 2 - 1);
+ gUnknown_02038558 = 0;
+ return;
+ }
+
+ if (gLinkOpen == TRUE)
+ {
+ u32 val = gUnknown_03005D10[gUnknown_02038559].unk1 + gUnknown_03005D10[gUnknown_02038559].unk0;
+
+ ItemListMenu_ChangeDescription((s16)gUnknown_03005D24[val].itemId, gUnknown_02038562);
+ gUnknown_02038562++;
+ }
+ else
+ {
+ while (gUnknown_02038562 < 3)
+ {
+ u32 val = gUnknown_03005D10[gUnknown_02038559].unk1 + gUnknown_03005D10[gUnknown_02038559].unk0;
+
+ ItemListMenu_ChangeDescription((s16)gUnknown_03005D24[val].itemId, gUnknown_02038562);
+ gUnknown_02038562++;
+ }
+ }
+ if (gUnknown_02038562 == 3)
+ {
+ gUnknown_0203855A = 16;
+ gUnknown_0203855B = gUnknown_02038559 + 1;
+ sub_80A37C0(FindTaskIdByFunc(sub_80A4F68));
+ DestroyTask(taskId);
+ ItemListMenu_InitMenu();
+ sub_80F979C(2, 0);
+ sub_80F979C(3, 0);
+ }
+}
+
+void sub_80A3954(u16 *a)
+{
+ CpuCopy16(gUnknown_08E77004, a, 0x800);
+}
+
+void sub_80A396C(u16 *a, u8 b, u8 c, u8 d)
+{
+ u16 *dst = a + 14 + (b + 2) * 32;
+ u16 i;
+
+ while (c > b++)
+ {
+ for (i = 0; i < 15; i++)
+ dst[i] = d;
+ dst += 32;
+ }
+}
+
+void sub_80A39B8(u16 *a, u8 b)
+{
+ u8 var = b * 2;
+
+ sub_809D104(a, 4, 10, gUnknown_08E96EC8, 0, var, 8, 2);
+}
+
+void sub_80A39E4(u16 *a, u8 b, u8 c, s8 d)
+{
+ u16 r2 = b * 2;
+ u16 r7;
+
+ if (d == -1)
+ {
+ r7 = (b + 1) * 2;
+ if (b == 5)
+ r7 = 2;
+
+ sub_809D104(a, 4, 10, gUnknown_08E96EC8, 8 - c, r2, c, 2);
+ sub_809D104(a, c + 4, 10, gUnknown_08E96EC8, 0, r7, 8 - c, 2);
+ }
+ else if (d == 1)
+ {
+ r7 = (b - 1) * 2;
+ if (b == 1)
+ r7 = 10;
+
+ sub_809D104(a, 4, 10, gUnknown_08E96EC8, c, r7, 8 - c, 2);
+ sub_809D104(a, 12 - c, 10, gUnknown_08E96EC8, 0, r2, c, 2);
+ }
+}
+
+void sub_80A3AC0(u16 *a, u8 b)
+{
+ u8 i;
+
+ for (i = 0; i < 5; i++)
+ {
+ if (i == b)
+ a[0x125 + i] = 0x107D;
+ else
+ a[0x125 + i] = 0x107C;
+ }
+}
+
+void sub_80A3B04(u16 *a, s8 b)
+{
+ u8 taskId;
+
+ gUnknown_02038559 += b;
+ if (gUnknown_02038559 >= NUM_BAG_POCKETS)
+ gUnknown_02038559 = 0;
+ if (gUnknown_02038559 < 0)
+ gUnknown_02038559 = NUM_BAG_POCKETS - 1;
+ sub_80A76A0();
+ sub_80A7590();
+ gUnknown_03005D24 = gBagPockets[gUnknown_02038559].itemSlots;
+ sub_80A3D24(gUnknown_02038559);
+ gUnknown_0203855A = 0;
+ sub_80A3954(a);
+ sub_80A396C(a, 0, 16, 3);
+ sub_80A39B8(a, 0);
+ gUnknown_0203855B = 6;
+ gUnknown_02038562 = 0;
+ taskId = FindTaskIdByFunc(sub_80A37F8);
+ if (taskId == 0xFF)
+ taskId = CreateTask(sub_80A37F8, 8);
+ gTasks[taskId].data[5] = b;
+}
+
+void swap32(struct ItemSlot *a, struct ItemSlot *b)
+{
+ struct ItemSlot temp = *a;
+
+ *a = *b;
+ *b = temp;
+}