From 1c70293fb81702aa334e4ec4960ac6aff6a5117a Mon Sep 17 00:00:00 2001 From: Kermalis <29823718+Kermalis@users.noreply.github.com> Date: Sat, 30 Nov 2024 21:14:52 -0500 Subject: [PATCH 1/4] Match sub_8037810 --- asm/code_8098BDC.s | 2 +- asm/event_flag.s | 2 +- asm/handleaction.s | 2 + asm/other_menus1.s | 112 ------------------------------- data/data.s | 9 ++- include/code_8099360.h | 4 -- include/ground_script.h | 34 ++++------ include/main_menu1.h | 5 +- include/memory.h | 12 +--- include/other_menus1.h | 4 +- include/structs/dungeon_entity.h | 9 +-- include/structs/menu.h | 4 +- include/structs/str_text.h | 1 - src/code_800DAC0.c | 2 +- src/code_800ED38.c | 2 +- src/code_800F958.c | 6 +- src/code_8094F88.c | 6 +- src/code_8099360.c | 2 +- src/code_809D148.c | 4 +- src/debug_menu1.c | 2 +- src/friend_rescue.c | 34 +++++----- src/ground_script.c | 4 +- src/ground_script_1.c | 49 ++++++++------ src/ground_script_2.c | 1 - src/load_screen.c | 4 +- src/main_menu1.c | 4 +- src/main_menu2.c | 2 +- src/memory.c | 85 +++++++++++------------ src/moves.c | 6 +- src/other_menus1.c | 36 ++++++++-- src/other_menus2.c | 18 ++--- src/rescue_password_menu.c | 8 +-- src/save.c | 2 +- src/save_menu.c | 2 +- src/thank_you_wonder_mail.c | 12 ++-- src/trade_items_menu.c | 2 +- src/unk_menu_203B360.c | 2 +- src/wonder_mail.c | 12 ++-- src/wonder_mail_2.c | 2 +- src/wonder_mail_6.c | 2 +- src/wonder_mail_main_menu.c | 12 ++-- sym_ewram.txt | 7 +- 42 files changed, 210 insertions(+), 320 deletions(-) diff --git a/asm/code_8098BDC.s b/asm/code_8098BDC.s index 4f0c27dfc..aeefbc895 100644 --- a/asm/code_8098BDC.s +++ b/asm/code_8098BDC.s @@ -253,7 +253,7 @@ _080992CC: .4byte gUnknown_203B49C _080992D0: .4byte gUnknown_203B49D _080992D4: .4byte gUnknown_20398C4 _080992D8: .4byte gUnknown_2039950 -_080992DC: .4byte gUnknown_20398D8 +_080992DC: .4byte gUnknown_20398C8 + 0x10 thumb_func_end sub_809927C thumb_func_start sub_80992E0 diff --git a/asm/event_flag.s b/asm/event_flag.s index a0fa0af68..04365908c 100644 --- a/asm/event_flag.s +++ b/asm/event_flag.s @@ -279,7 +279,7 @@ _0800177A: bx r1 thumb_func_end GetScriptVarValue -@ https://decomp.me/scratch/xF3HH +@ https://decomp.me/scratch/5F0gW [100% - DizzyEggg] thumb_func_start GetScriptVarArrayValue GetScriptVarArrayValue: push {r4,r5,lr} diff --git a/asm/handleaction.s b/asm/handleaction.s index c27916321..799142db7 100644 --- a/asm/handleaction.s +++ b/asm/handleaction.s @@ -5,6 +5,8 @@ .text +@ https://decomp.me/scratch/QRjxB - more up to date but incomplete +@ https://decomp.me/scratch/aOcQq - more complete but using outdated definitions thumb_func_start HandleAction HandleAction: push {r4-r7,lr} diff --git a/asm/other_menus1.s b/asm/other_menus1.s index 1f9ca157c..137b08e48 100644 --- a/asm/other_menus1.s +++ b/asm/other_menus1.s @@ -5,118 +5,6 @@ .text - thumb_func_start sub_8037810 -sub_8037810: - push {r4-r6,lr} - ldr r6, _080378FC - ldr r0, [r6] - movs r5, 0xDE - lsls r5, 1 - adds r0, r5 - movs r1, 0 - movs r2, 0x8 - bl MemoryFill8 - ldr r0, [r6] - movs r4, 0xE2 - lsls r4, 1 - adds r0, r4 - movs r1, 0 - movs r2, 0x8 - bl MemoryFill8 - ldr r0, [r6] - adds r5, r0, r5 - movs r1, 0 - movs r2, 0 - str r1, [r5] - str r2, [r5, 0x4] - adds r4, r0, r4 - str r1, [r4] - str r2, [r4, 0x4] - movs r2, 0xE6 - lsls r2, 1 - adds r0, r2 - movs r1, 0 - movs r2, 0x30 - bl MemoryFill8 - ldr r0, [r6] - movs r3, 0xFE - lsls r3, 1 - adds r0, r3 - movs r1, 0 - movs r2, 0x30 - bl MemoryFill8 - ldr r0, [r6] - movs r1, 0x8B - lsls r1, 2 - adds r0, r1 - movs r1, 0 - movs r2, 0x30 - bl MemoryFill8 - ldr r0, [r6] - movs r2, 0x97 - lsls r2, 2 - adds r0, r2 - movs r1, 0 - movs r2, 0x30 - bl MemoryFill8 - ldr r0, [r6] - movs r3, 0xA3 - lsls r3, 2 - adds r0, r3 - movs r1, 0 - movs r2, 0x30 - bl MemoryFill8 - ldr r0, [r6] - movs r1, 0xC5 - lsls r1, 2 - adds r0, r1 - movs r1, 0 - movs r2, 0x30 - bl MemoryFill8 - ldr r0, [r6] - movs r2, 0xAF - lsls r2, 2 - adds r0, r2 - movs r1, 0 - movs r2, 0x58 - bl MemoryFill8 - ldr r0, [r6] - movs r3, 0xD1 - lsls r3, 2 - adds r0, r3 - movs r1, 0 - movs r2, 0x58 - bl MemoryFill8 - ldr r0, [r6] - movs r1, 0xE7 - lsls r1, 2 - adds r0, r1 - movs r1, 0 - movs r2, 0xB4 - bl MemoryFill8 - ldr r0, [r6] - movs r2, 0x8A - lsls r2, 3 - adds r0, r2 - movs r1, 0 - movs r2, 0xB4 - bl MemoryFill8 - ldr r2, [r6] - movs r3, 0xB1 - lsls r3, 2 - adds r0, r2, r3 - movs r1, 0 - strh r1, [r0] - adds r3, 0x88 - adds r0, r2, r3 - strh r1, [r0] - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080378FC: .4byte sUnknown_203B35C - thumb_func_end sub_8037810 - thumb_func_start sub_8037900 sub_8037900: push {r4,lr} diff --git a/data/data.s b/data/data.s index c3228d809..cf35c536a 100644 --- a/data/data.s +++ b/data/data.s @@ -1012,7 +1012,14 @@ gUnknown_80B7DF8: .global gVectorDirections gVectorDirections: @ 80B7E3C - .4byte 0, 1, 1, 1, 1, 0, 1, -1, 0, -1, -1, -1, -1, 0, -1, 1 + .4byte 0, 1 @N + .4byte 1, 1 @NE + .4byte 1, 0 @E + .4byte 1, -1 @SE + .4byte 0, -1 @S + .4byte -1, -1 @SW + .4byte -1, 0 @W + .4byte -1, 1 @NW @ ??? .string "pksdir0\0" diff --git a/include/code_8099360.h b/include/code_8099360.h index 0c766c621..6be07ecec 100644 --- a/include/code_8099360.h +++ b/include/code_8099360.h @@ -8,10 +8,6 @@ void sub_80993C0(bool8); void sub_80993D8(void); void sub_80993E4(void); -// UNUSED -void sub_80993F0(void); -// ------ - void sub_8099648(void); void nullsub_103(void); void sub_809965C(void); diff --git a/include/ground_script.h b/include/ground_script.h index 50fb4d18d..2a7207bda 100644 --- a/include/ground_script.h +++ b/include/ground_script.h @@ -3,8 +3,9 @@ #include "structs/str_position.h" -typedef struct ScriptCommand { - // size: 0x10 +// size: 0x10 +typedef struct ScriptCommand +{ /* 0x0 */ u8 op; /* 0x1 */ u8 argByte; /* 0x2 */ s16 argShort; @@ -13,49 +14,45 @@ typedef struct ScriptCommand { /* 0xC */ const u8* argPtr; } ScriptCommand; +// size: 0xC typedef struct ScriptInfoSmall { - // size: 0xC (3 padding) /* 0x0 */ const ScriptCommand *ptr; /* 0x4 */ s16 state; /* 0x6 */ s16 group; /* 0x8 */ s8 sector; } ScriptInfoSmall; +// size: 0xC typedef struct ScriptInfo { - // size: 0xC (1 padding) /* 0x0 */ const ScriptCommand *ptr; /* 0x4 */ const ScriptCommand *ptr2; /* 0x8 */ s16 group; /* 0xA */ s8 sector; } ScriptInfo; +// size: 0x4 typedef union ScriptUnion1632 { s32 raw; s16 arr[2]; } ScriptUnion1632; +// size: 0x60 typedef struct ScriptData { - // size: 0x60 /* 0x00 */ s16 state; /* 0x02 */ s16 savedState; /* 0x04 */ ScriptInfo script; - // padding /* 0x10 */ ScriptInfo savedScript; - // padding /* 0x1C */ const ScriptCommand *curPtr; /* 0x20 */ u8 curScriptOp; - // padding - /* 0x22 */ u16 unk22; + /* 0x22 */ s16 unk22; /* 0x24 */ u16 unk24; /* 0x26 */ s8 unk26; - // padding /* 0x28 */ s16 branchDiscriminant; /* 0x2A */ s16 unk2A; - /* 0x2C */ u16 unk2C; - // padding + /* 0x2C */ s16 unk2C; /* 0x30 */ s32 unk30; /* 0x34 */ PixelPos pos1; /* 0x3C */ PixelPos pos2; @@ -63,7 +60,6 @@ typedef struct ScriptData /* 0x48 */ s32 unk48; /* 0x4C */ u8 unk4C; /* 0x4D */ u8 unk4D; - // padding // ultimately accessed as ldrb, doesn't work as array of u32-sized structs, needs union /* 0x50 */ union { u8 buf[16]; @@ -71,11 +67,10 @@ typedef struct ScriptData } localVars; } ScriptData; +// size: 0x54 typedef struct CallbackData { - // size: 0x54 /* 0x00 */ u16 maybeId; - // padding // All callbacks take the parentObject as first parameter /* 0x04 */ s16 (*getIndex)(void*); // id related /* 0x08 */ void (*getSize)(void*, PixelPos *out); @@ -87,28 +82,27 @@ typedef struct CallbackData /* 0x20 */ void (*setPositionBounds)(void*, PixelPos *from, PixelPos *to); /* 0x24 */ bool8 (*moveReal)(void*, PixelPos*); /* 0x28 */ void (*setPosHeight)(void*, u32 height); - /* 0x2C */ void (*setDirection)(void*, s8 dir); // direction must be signed char! + /* 0x2C */ s32 (*setDirection)(void*, s8 dir); // direction must be signed char! /* 0x30 */ void (*setEventIndex)(void*, u16); /* 0x34 */ void (*livesOnlyNullsub)(void*, u16); /* 0x38 */ void (*func38)(void*, s16, u32); /* 0x3C */ void (*setFlags)(void*, u32 bits); /* 0x40 */ void (*clearFlags)(void*, u32 bits); /* 0x44 */ void (*func44_livesOnlySpriteRelated)(void*, u32); - /* 0x48 */ void (*moveRelative)(void*, PixelPos*); + /* 0x48 */ s32 (*moveRelative)(void*, PixelPos*); /* 0x4C */ bool8 (*func4C_spriteRelatedCheck)(void*); /* 0x50 */ bool8 (*func50_spriteRelated)(void*); } CallbackData; +// size: 0xE4 typedef struct Action { - // size: 0xE4 /* 0x00 */ const struct CallbackData *callbacks; /* 0x04 */ void *parentObject; // struct GroundObject * /* 0x08 */ s16 unk8[2]; // id? /* 0x0C */ ScriptUnion1632 unkC; /* 0x10 */ s16 group; /* 0x12 */ s8 sector; - // padding /* 0x14 */ const ScriptCommand *predefinedScripts[4]; /* 0x24 */ ScriptData scriptData; /* 0x84 */ ScriptData scriptData2; @@ -203,7 +197,7 @@ void InitScriptData(ScriptData *a0); u8 GroundScriptCheckLockCondition(Action *param_1, s16 param_2); void InitAction2(Action *action); void GetFunctionScript(Action *param_1, ScriptInfoSmall *script, s16 index); -bool8 GroundScriptLockCond(Action *param_1, s16 index, u32 param_3); +bool8 GroundScriptLockCond(Action *param_1, s16 index, s32 param_3); bool8 ActionResetScriptData(Action *param_1, const DebugLocation *unused); bool8 GroundScript_ExecutePP(Action *, s32 *, ScriptInfoSmall *, const DebugLocation *unused); const ScriptCommand *FindLabel(Action *action, s32 r1); diff --git a/include/main_menu1.h b/include/main_menu1.h index a314abd50..0c183a4cd 100644 --- a/include/main_menu1.h +++ b/include/main_menu1.h @@ -7,10 +7,7 @@ // size: 0x8 typedef struct unkStruct_8035D94 { - union { - u8 itemIndex_u8; - u32 itemIndex_u32; - } itemIndex; + u8 itemIndex; s32 numItems; } unkStruct_8035D94; diff --git a/include/memory.h b/include/memory.h index 48bba1793..e8a4fff91 100644 --- a/include/memory.h +++ b/include/memory.h @@ -66,17 +66,11 @@ extern s32 gHeapCount; void InitHeap(void); -void MemoryClear8(u8 *dest, s32 size); +void MemoryClear8(void *dest, s32 size); void MemoryClear16(u16 *dest, s32 size); -void MemoryClear32(u32 *dest, s32 size); -void MemoryFill8(u8 *dest, u8 value, s32 size); +void MemoryFill8(void *dest, u8 value, s32 size); void MemoryFill16(u16 *dest, u16 value, s32 size); -void MemoryFill32(u32 *dest, u32 value, s32 size); -void MemoryCopy8(u8 *dest, u8 *src, s32 size); -void MemoryCopy16(u16 *dest, u16 *src, s32 size); -void MemoryCopy32(u32 *dest, u32 *src, s32 size); -void MemoryCopy8(u8 *dest, u8 *src, s32 size); -void MemoryCopy16(u16 *dest, u16 *src, s32 size); +void MemoryCopy8(void *dest, void *src, s32 size); void MemoryCopy32(u32 *dest, u32 *src, s32 size); void InitHeapInternal(void); diff --git a/include/other_menus1.h b/include/other_menus1.h index 92e216809..871a46715 100644 --- a/include/other_menus1.h +++ b/include/other_menus1.h @@ -28,8 +28,8 @@ typedef struct unkStruct_203B35C PokemonStruct1 unk2BC; unkStruct_203B480 unk314; PokemonStruct1 unk344; - u8 unk39C[180]; - u8 unk450[180]; + u8 unk39C[0xB4]; // unkStruct_803B344? + u8 unk450[0xB4]; // unkStruct_803B344? } unkStruct_203B35C; void sub_8036FDC(s32); diff --git a/include/structs/dungeon_entity.h b/include/structs/dungeon_entity.h index 73c900c3d..f5a15d904 100644 --- a/include/structs/dungeon_entity.h +++ b/include/structs/dungeon_entity.h @@ -194,13 +194,8 @@ typedef struct Moves // size: 0x208 typedef struct EntityInfo { - // This has different purposes for Pokémon, items, and traps. - // Pokemon: MovementFlag - // Items: ItemFlag - // Traps: TrapType - /* 0x0 */ u16 flags; - /* 0x2 */ s16 id; // Pokémon species or item ID. - // Everything from here on only applies to Pokémon. + /* 0x0 */ u16 flags; // MovementFlag + /* 0x2 */ s16 id; // Pokémon species. /* 0x4 */ s16 apparentID; // Shows a different Pokémon when using Transform. /* 0x6 */ bool8 isNotTeamMember; /* 0x7 */ bool8 isTeamLeader; diff --git a/include/structs/menu.h b/include/structs/menu.h index 3d64a5760..90034c950 100644 --- a/include/structs/menu.h +++ b/include/structs/menu.h @@ -25,11 +25,11 @@ typedef struct MenuInputStruct s32 unk0; u16 unk4; s16 unk6; - DungeonPos unk8; // Maybe DungeonPos + DungeonPos unk8; s16 unkC; // Maybe DungeonPos s16 unkE; u32 unk10; - DungeonPos unk14; // Maybe DungeonPos + DungeonPos unk14; /* 0x18 */ s16 menuIndex; s16 unk1A; s16 unk1C; diff --git a/include/structs/str_text.h b/include/structs/str_text.h index 3c2a576f2..32a4d2d2a 100644 --- a/include/structs/str_text.h +++ b/include/structs/str_text.h @@ -44,7 +44,6 @@ typedef struct UnkTextStruct2_sub } unk0; } UnkTextStruct2_sub; - typedef struct UnkTextStruct2_sub2 { u8 f0; diff --git a/src/code_800DAC0.c b/src/code_800DAC0.c index cd6c262aa..58710a317 100644 --- a/src/code_800DAC0.c +++ b/src/code_800DAC0.c @@ -46,7 +46,7 @@ void sub_800DAC0(u32 fileSelection) sub_800DB7C(); } gUnknown_203B0CC = MemoryAlloc(sizeof(struct unkStruct_203B0CC), 0xb); - MemoryClear8((u8 *)gUnknown_203B0CC, sizeof(struct unkStruct_203B0CC)); + MemoryClear8(gUnknown_203B0CC, sizeof(struct unkStruct_203B0CC)); gUnknown_203B0CC->fileSelection = fileSelection; for(index = 0, preload = &gUnknown_203B0CC->unk0[index]; index < 0x20; index++, preload++) { diff --git a/src/code_800ED38.c b/src/code_800ED38.c index 450577dd2..872d54077 100644 --- a/src/code_800ED38.c +++ b/src/code_800ED38.c @@ -37,7 +37,7 @@ void sub_800ED38(s32 r0) if(gUnknown_203B0D0 == 0) { gUnknown_203B0D0 = MemoryAlloc(sizeof(struct unkStruct_203B0D0), 0xB); - MemoryClear8((u8 *)gUnknown_203B0D0, sizeof(struct unkStruct_203B0D0)); + MemoryClear8(gUnknown_203B0D0, sizeof(struct unkStruct_203B0D0)); } gUnknown_203B0D0->unk0 = r0; } diff --git a/src/code_800F958.c b/src/code_800F958.c index c928442bc..212267bdf 100644 --- a/src/code_800F958.c +++ b/src/code_800F958.c @@ -46,14 +46,14 @@ void DeletePokemonDungeonSprite(s32 id) { DungeonPokemonSprite *dSprite; - if(gDungeonPokemonSprites == NULL) + if (gDungeonPokemonSprites == NULL) return; dSprite = GetDungeonPokemonSprite(id); - if(dSprite == NULL) + if (dSprite == NULL) return; - MemoryClear8((u8 *)dSprite, sizeof(DungeonPokemonSprite)); + MemoryClear8(dSprite, sizeof(DungeonPokemonSprite)); } void sub_800F958(s32 dungeonSpriteID, DungeonPos *pos, diff --git a/src/code_8094F88.c b/src/code_8094F88.c index 6faf9805f..2da05ce3c 100644 --- a/src/code_8094F88.c +++ b/src/code_8094F88.c @@ -60,8 +60,8 @@ void sub_8095118(void) s32 index; unkStruct_203B480 *unused; - MemoryFill8((u8*)gUnknown_203B480,0, 0x20 * sizeof(unkStruct_203B480)); - MemoryFill8((u8*)gUnknown_203B484,0, sizeof(unkStruct_203B484)); + MemoryFill8(gUnknown_203B480, 0, 0x20 * sizeof(unkStruct_203B480)); + MemoryFill8(gUnknown_203B484, 0, sizeof(unkStruct_203B484)); for(index = 0; index < 0x20; index++){ // NOTE: we use a temp variable here to force the match @@ -138,7 +138,7 @@ void DeleteMailAtIndex(u8 index) { unkStruct_203B480 *unused; - MemoryFill8((u8*)&gUnknown_203B480[index],0,sizeof(unkStruct_203B480)); + MemoryFill8(&gUnknown_203B480[index], 0, sizeof(unkStruct_203B480)); unused = &gUnknown_203B480[index]; gUnknown_203B480[index].mailType = 0; unused = &gUnknown_203B480[index]; diff --git a/src/code_8099360.c b/src/code_8099360.c index c9f43c45e..12fcf5170 100644 --- a/src/code_8099360.c +++ b/src/code_8099360.c @@ -62,7 +62,7 @@ void sub_80993E4(void) { */ void sub_8099648(void); -NAKED void sub_80993F0(void) +UNUSED static NAKED void sub_80993F0(void) { asm_unified(" .text\n" " push {r4-r7,lr}\n" diff --git a/src/code_809D148.c b/src/code_809D148.c index 2224a7472..bff257538 100644 --- a/src/code_809D148.c +++ b/src/code_809D148.c @@ -245,7 +245,7 @@ void sub_809D220(s32 r0, s32 r1, s32 r2) gUnknown_20399E8.unk4 = r1; } -bool32 sub_809D234(void) +bool8 sub_809D234(void) { return gUnknown_20399E8.unk8 != 0; } @@ -392,7 +392,7 @@ extern s16 gUnknown_2039A34; extern u8 gAnyScriptLocked; extern u8 gScriptLocks[]; extern u8 gScriptLockConds[]; -extern u32 gUnlockBranchLabels[]; +extern s32 gUnlockBranchLabels[]; void sub_809D4B0(void) { diff --git a/src/debug_menu1.c b/src/debug_menu1.c index 0bc5193a2..b5cc92c45 100644 --- a/src/debug_menu1.c +++ b/src/debug_menu1.c @@ -43,7 +43,7 @@ void CreateDebugMenu(void) if (sDebugMenu == NULL) { sDebugMenu = MemoryAlloc(sizeof(struct DebugMenu), 8); - MemoryFill8((u8 *)sDebugMenu, 0, sizeof(struct DebugMenu)); + MemoryFill8(sDebugMenu, 0, sizeof(struct DebugMenu)); } for (i = 0; i < 4; i++) diff --git a/src/friend_rescue.c b/src/friend_rescue.c index 7cf839a8b..79dd3f639 100644 --- a/src/friend_rescue.c +++ b/src/friend_rescue.c @@ -319,7 +319,7 @@ u32 CreateFriendRescueMenu(void) ResetUnusedInputStruct(); xxx_call_save_unk_text_struct_800641C(NULL, TRUE, TRUE); gUnknown_203B33C = MemoryAlloc(sizeof(WonderMailStruct_203B33C), 8); - MemoryFill8((u8 *) gUnknown_203B33C, 0, sizeof(WonderMailStruct_203B33C)); + MemoryFill8(gUnknown_203B33C, 0, sizeof(WonderMailStruct_203B33C)); gUnknown_203B33C->unk530 = 0; gUnknown_203B33C->unk218 = -1; gUnknown_203B33C->speciesNum = -1; @@ -954,13 +954,13 @@ void sub_8032828(void) #endif //NONMATCHING switch (gUnknown_203B33C->unk40) { case 0x3: - MemoryFill8((u8*)&gUnknown_203B33C->unk48, 0, sizeof(unkStruct_203B480)); - MemoryFill8((u8*)&gUnknown_203B33C->unk78, 0, sizeof(unkStruct_203B480)); + MemoryFill8(&gUnknown_203B33C->unk48, 0, sizeof(unkStruct_203B480)); + MemoryFill8(&gUnknown_203B33C->unk78, 0, sizeof(unkStruct_203B480)); gUnknown_203B33C->status = sub_8037D64(gUnknown_203B33C->unk40, &gUnknown_203B33C->unk48, &gUnknown_203B33C->unk78); break; case 0x2: - MemoryFill8((u8*)&gUnknown_203B33C->unk48, 0, sizeof(unkStruct_203B480)); - MemoryFill8((u8*)&gUnknown_203B33C->unk78, 0, sizeof(unkStruct_203B480)); + MemoryFill8(&gUnknown_203B33C->unk48, 0, sizeof(unkStruct_203B480)); + MemoryFill8(&gUnknown_203B33C->unk78, 0, sizeof(unkStruct_203B480)); #ifdef NONMATCHING // Regswaps gUnknown_203B33C->unk48 = *GetMailatIndex(gUnknown_203B33C->unk218); @@ -973,13 +973,13 @@ void sub_8032828(void) gUnknown_203B33C->status = sub_8037D64(gUnknown_203B33C->unk40, &gUnknown_203B33C->unk48, &gUnknown_203B33C->unk78); break; case 0x5: - MemoryFill8((u8*)&gUnknown_203B33C->unkA8, 0, sizeof(WonderMailStruct_203B2C0_sub)); - MemoryFill8((u8*)&gUnknown_203B33C->unk130, 0, sizeof(WonderMailStruct_203B2C0_sub)); + MemoryFill8(&gUnknown_203B33C->unkA8, 0, sizeof(WonderMailStruct_203B2C0_sub)); + MemoryFill8(&gUnknown_203B33C->unk130, 0, sizeof(WonderMailStruct_203B2C0_sub)); gUnknown_203B33C->status = sub_8037D64(gUnknown_203B33C->unk40, &gUnknown_203B33C->unkA8, &gUnknown_203B33C->unk130); break; case 0x4: - MemoryFill8((u8*)&gUnknown_203B33C->unkA8, 0, sizeof(WonderMailStruct_203B2C0_sub)); - MemoryFill8((u8*)&gUnknown_203B33C->unk130, 0, sizeof(WonderMailStruct_203B2C0_sub)); + MemoryFill8(&gUnknown_203B33C->unkA8, 0, sizeof(WonderMailStruct_203B2C0_sub)); + MemoryFill8(&gUnknown_203B33C->unk130, 0, sizeof(WonderMailStruct_203B2C0_sub)); gUnknown_203B33C->unkA8.pokemon.speciesNum = 0; gUnknown_203B33C->unk130.pokemon.speciesNum = 0; gUnknown_203B33C->unkA8.mail = *GetMailatIndex(gUnknown_203B33C->unk218); @@ -1093,13 +1093,13 @@ void sub_8032828(void) if (gUnknown_203B33C->status == 0) { switch (gUnknown_203B33C->unk40) { case 0x6: - MemoryFill8((u8*)&gUnknown_203B33C->unk1B8, 0, 0x30); + MemoryFill8(&gUnknown_203B33C->unk1B8, 0, 0x30); gUnknown_203B33C->unk1B8 = *GetMailatIndex(gUnknown_203B33C->unk218); gUnknown_203B33C->status = sub_8037D64(gUnknown_203B33C->unk40, &gUnknown_203B33C->unk1B8, &gUnknown_203B33C->unk1E8); break; case 0x7: - MemoryFill8((u8*)&gUnknown_203B33C->unk1B8, 0, 0x30); - MemoryFill8((u8*)&gUnknown_203B33C->unk1E8, 0, 0x30); + MemoryFill8(&gUnknown_203B33C->unk1B8, 0, 0x30); + MemoryFill8(&gUnknown_203B33C->unk1E8, 0, 0x30); gUnknown_203B33C->status = sub_8037D64(gUnknown_203B33C->unk40, &gUnknown_203B33C->unk1B8, &gUnknown_203B33C->unk1E8); break; } @@ -1654,7 +1654,7 @@ void sub_8033DBC(void) unkStruct_203B480 *mail2; return_var = sub_80154F0(); - MemoryFill8((u8 *)&mail, 0, sizeof(unkStruct_203B480)); + MemoryFill8(&mail, 0, sizeof(unkStruct_203B480)); switch(return_var) { case 3: @@ -1704,7 +1704,7 @@ void sub_8033DBC(void) sub_80951FC(&mail); mail2 = GetMailatIndex(GetMailIndex(1, mail.unk10.unk10)); mail2->mailType = 7; - MemoryFill8((u8 *)gUnknown_203B484, 0, sizeof(unkStruct_203B484)); + MemoryFill8(gUnknown_203B484, 0, sizeof(unkStruct_203B484)); SetFriendRescueMenuState(0x40); break; case 24: @@ -2269,7 +2269,7 @@ void sub_8034848(void) s32 temp; if(sub_80144A4(&temp) == 0) { - MemoryFill8((u8 *)&gUnknown_203B33C->item, 0 , sizeof(Item)); + MemoryFill8(&gUnknown_203B33C->item, 0 , sizeof(Item)); gUnknown_203B33C->item.id = ITEM_NOTHING; gUnknown_203B33C->item.quantity = 1; gUnknown_203B33C->item.flags = 0; @@ -2299,7 +2299,7 @@ void sub_80348C4(void) s32 temp; if(sub_80144A4(&temp) == 0) { - MemoryFill8((u8 *)&gUnknown_203B33C->item, 0 , sizeof(Item)); + MemoryFill8(&gUnknown_203B33C->item, 0 , sizeof(Item)); gUnknown_203B33C->item.id = ITEM_NOTHING; gUnknown_203B33C->item.quantity = 1; gUnknown_203B33C->item.flags = 0; @@ -2550,7 +2550,7 @@ void sub_8034D74(void) unkStruct_203B480 *mail2; return_var = sub_80154F0(); - MemoryFill8((u8 *)&mail, 0, sizeof(unkStruct_203B480)); + MemoryFill8(&mail, 0, sizeof(unkStruct_203B480)); switch(return_var) { case 3: diff --git a/src/ground_script.c b/src/ground_script.c index a79bdcd18..7cbcaf21e 100644 --- a/src/ground_script.c +++ b/src/ground_script.c @@ -4,7 +4,7 @@ extern u8 gAnyScriptLocked; extern u8 gScriptLocks[]; -extern u32 gUnlockBranchLabels[]; +extern s32 gUnlockBranchLabels[]; extern u8 gScriptLockConds[]; extern u32 gUnknown_8116588; @@ -352,7 +352,7 @@ void GroundScriptLock(s16 index, s32 r1) gAnyScriptLocked = 1; } -bool8 GroundScriptLockCond(Action *param_1, s16 index, u32 param_3) +bool8 GroundScriptLockCond(Action *param_1, s16 index, s32 param_3) { s32 index_s32; diff --git a/src/ground_script_1.c b/src/ground_script_1.c index b9a536db1..833861c03 100644 --- a/src/ground_script_1.c +++ b/src/ground_script_1.c @@ -16,6 +16,13 @@ #include "ground_main.h" #include "code_80A26CC.h" +// Size: unknown +typedef struct UnkAction3D +{ + u8 fill0[0x4C]; + u8 unk4C[10]; +} UnkAction3D; + void GroundMap_Select(s16); void GroundMap_SelectDungeon(s16, DungeonLocation*, u8); void GroundMap_ExecuteEnter(s16); @@ -45,9 +52,9 @@ void FatalError(void* loc, char* fmt, ...) __attribute__((noreturn)); // Beware of the declarations without specified arguments, returning u32 or s32, these were quickly hacked in to get the code to compile and link // The return values are almost certainly NOT correct and will need to be rechecked when moving to header files char sub_8002984(s32, u8); -u32 VecDirection8Radial(); -u32 SizedDeltaDirection4(); -u8 SizedDeltaDirection8(PixelPos*, PixelPos*, PixelPos*, PixelPos*); +s8 VecDirection8Radial(PixelPos*); +s8 SizedDeltaDirection4(PixelPos*, PixelPos*, PixelPos*, PixelPos*); +s8 SizedDeltaDirection8(PixelPos*, PixelPos*, PixelPos*, PixelPos*); bool8 sub_8021700(s32); bool8 sub_802FCF0(void); @@ -60,7 +67,7 @@ void sub_80975A8(s16, bool8); void sub_8098D1C(s32, u32, s32); void sub_8098E18(s32, s32); u32 sub_80999E8(); -u32 sub_80999FC(); +void sub_80999FC(s32); u32 sub_8099A10(); u32 sub_8099A34(); u32 sub_8099A48(); @@ -105,7 +112,7 @@ void sub_80A87AC(s32, s32); void sub_80A8BD8(s16, s32*); u32 sub_80A8C2C(); u32 sub_80A8C98(); -char *sub_80A8D54(s16); +UnkAction3D *sub_80A8D54(s16); s16 sub_80A8FD8(s32, PixelPos*); s16 sub_80A8F9C(s32, PixelPos*); u32 sub_80A9050(); @@ -114,14 +121,14 @@ s16 sub_80AC448(s16, PixelPos*); s32 sub_80AC49C(s16, PixelPos*); s16 sub_80AD360(s16, PixelPos*); s16 sub_80AD3B4(s16, PixelPos*); -u32 GroundLink_GetPos(); -u32 GroundLink_GetArea(); +u32 GroundLink_GetPos(s32, PixelPos *); +u32 GroundLink_GetArea(s32, PixelPos *, PixelPos *, PixelPos *); void DeleteGroundEvents(void); void DeleteGroundLives(void); void DeleteGroundObjects(void); void DeleteGroundEffects(void); -u32 sub_80A14E8(u32, u8, u32, u32); +s32 sub_80A14E8(Action *, u8, s32, s32); s16 HandleAction(void *, DebugLocation *); extern int gFormatArgs[10]; @@ -131,7 +138,7 @@ extern s16 gUnknown_2039A32; extern s16 gUnknown_2039A34; extern struct { const char *unk0; s32 unk4; } gChoices[9]; -extern char gUnknown_2039D98[12]; +extern u8 gUnknown_2039D98[12]; extern int gNumChoices; extern PixelPos gUnknown_81164DC; @@ -549,8 +556,8 @@ s32 ExecuteScriptCommand(Action *action) { action->callbacks->getSize(action->parentObject, &pos2); sub_80A8FD8(ret, &pos3); sub_80A8F9C(ret, &pos4); - if ((tmp = (s8)SizedDeltaDirection8(&pos3, &pos4, &pos1, &pos2)) != -1 || - (tmp = (s8)SizedDeltaDirection4(&pos1, &gUnknown_81164DC, &pos3, &gUnknown_81164DC)) != -1) { + if ((tmp = SizedDeltaDirection8(&pos3, &pos4, &pos1, &pos2)) != -1 || + (tmp = SizedDeltaDirection4(&pos1, &gUnknown_81164DC, &pos3, &gUnknown_81164DC)) != -1) { sub_80A9090(ret, tmp); } } @@ -761,11 +768,11 @@ s32 ExecuteScriptCommand(Action *action) { return 2; } case 0x3d: { - struct { u8 pad[0x4c]; u8 unk4C[10]; } *unk; // unknown struct + UnkAction3D *unk; int i; if ((s16)curCmd.arg1 != -1) { - unk = (void*)sub_80A8D54(curCmd.arg1); - if (unk) { + unk = sub_80A8D54(curCmd.arg1); + if (unk != NULL) { for (i = 0; i < 10; i++) { gUnknown_2039D98[i] = unk->unk4C[i]; } @@ -1615,7 +1622,7 @@ s32 ExecuteScriptCommand(Action *action) { GroundLink_GetPos((s16)curCmd.arg1, &pos2); pos3.x = pos2.x - pos.x; pos3.y = pos2.y - pos.y; - val = (s8)VecDirection8Radial(&pos3); + val = VecDirection8Radial(&pos3); break; } case 0xc8: { @@ -1626,9 +1633,9 @@ s32 ExecuteScriptCommand(Action *action) { action->callbacks->getSize(action->parentObject, &pos2); sub_80A8FD8(tmp, &pos3); sub_80A8F9C(tmp, &pos4); - val = (s8)SizedDeltaDirection8(&pos1, &pos2, &pos3, &pos4); + val = SizedDeltaDirection8(&pos1, &pos2, &pos3, &pos4); if (val == -1) { - val = (s8)SizedDeltaDirection4(&pos1, &gUnknown_81164DC, &pos3, &gUnknown_81164DC); + val = SizedDeltaDirection4(&pos1, &gUnknown_81164DC, &pos3, &gUnknown_81164DC); } } else { val = -1; @@ -1642,9 +1649,9 @@ s32 ExecuteScriptCommand(Action *action) { action->callbacks->getHitboxCenter(action->parentObject, &pos1); action->callbacks->getSize(action->parentObject, &pos2); sub_80A8FD8(tmp, &pos3); - val = (s8)SizedDeltaDirection8(&pos1, &pos2, &pos3, &gUnknown_81164DC); + val = SizedDeltaDirection8(&pos1, &pos2, &pos3, &gUnknown_81164DC); if (val == -1) { - val = (s8)SizedDeltaDirection4(&pos1, &gUnknown_81164DC, &pos3, &gUnknown_81164DC); + val = SizedDeltaDirection4(&pos1, &gUnknown_81164DC, &pos3, &gUnknown_81164DC); } } else { val = -1; @@ -1831,9 +1838,9 @@ s32 ExecuteScriptCommand(Action *action) { } } -UNUSED u32 sub_80A1440(u32 r0, u32 r1, u32 r2) +UNUSED u32 sub_80A1440(s32 r0, s32 r1, s32 r2) { - return sub_80A14E8(0, r0, r1, r2); + return sub_80A14E8(NULL, r0, r1, r2); } UNUSED bool8 GroundScript_ExecuteTrigger(s16 r0) diff --git a/src/ground_script_2.c b/src/ground_script_2.c index a5b63f7d8..229b1c653 100644 --- a/src/ground_script_2.c +++ b/src/ground_script_2.c @@ -6,7 +6,6 @@ extern u8 gAnyScriptLocked; extern u8 gScriptLocks[]; -extern u32 gUnlockBranchLabels[]; extern u8 gScriptLockConds[]; extern u8 gUnknown_8116848[]; diff --git a/src/load_screen.c b/src/load_screen.c index cd2094511..2bc1ca63e 100644 --- a/src/load_screen.c +++ b/src/load_screen.c @@ -155,8 +155,8 @@ void CreateLoadScreen(u32 currMenu) int index; if (gLoadScreen == NULL) { - gLoadScreen = MemoryAlloc(sizeof(struct LoadScreen),8); - MemoryFill8((u8 *)gLoadScreen,0,sizeof(struct LoadScreen)); + gLoadScreen = MemoryAlloc(sizeof(struct LoadScreen), 8); + MemoryFill8(gLoadScreen, 0, sizeof(struct LoadScreen)); } gLoadScreen->currMenu = currMenu; for(index = 0; index < 4; index++){ diff --git a/src/main_menu1.c b/src/main_menu1.c index 521af94bb..e85e2ed7a 100644 --- a/src/main_menu1.c +++ b/src/main_menu1.c @@ -46,7 +46,7 @@ void InitMainMenu(void) { if (sMainMenu == NULL) { sMainMenu = MemoryAlloc(sizeof(MainMenu1Work), 8); - MemoryFill8((u8 *)sMainMenu, 0, sizeof(MainMenu1Work)); + MemoryFill8(sMainMenu, 0, sizeof(MainMenu1Work)); } sMainMenu->currMenu = MENU_NO_SCREEN_CHANGE; @@ -369,7 +369,7 @@ unkStruct_8035D94 *sub_8035D94(void) void sub_8035DA0(void) { - sMainMenu->unk30.itemIndex.itemIndex_u8 = ITEM_NOTHING; + sMainMenu->unk30.itemIndex = ITEM_NOTHING; sMainMenu->unk30.numItems = 0; } diff --git a/src/main_menu2.c b/src/main_menu2.c index 19efb509e..492aaae74 100644 --- a/src/main_menu2.c +++ b/src/main_menu2.c @@ -28,7 +28,7 @@ void DrawMainMenu(void) if (sUnknown_203B34C == NULL) { sUnknown_203B34C = MemoryAlloc(sizeof(MainMenu2Work), 8); - MemoryFill8((u8 *)sUnknown_203B34C, 0, sizeof(MainMenu2Work)); + MemoryFill8(sUnknown_203B34C, 0, sizeof(MainMenu2Work)); } for (i = 0; i < 4; i++) diff --git a/src/memory.c b/src/memory.c index 0a63bfd33..723fe6ff7 100644 --- a/src/memory.c +++ b/src/memory.c @@ -17,68 +17,69 @@ void InitHeap(void) InitHeapInternal(); } -void MemoryClear8(u8 *dest, s32 size) +void MemoryClear8(void *dest, s32 size) { - while (size > 0) - { + u8 *cur = dest; + + while (size > 0) { size -= 1; - *dest++ = 0; + *cur++ = 0; } } void MemoryClear16(u16 *dest, s32 size) { - while (size > 0) - { + while (size > 0) { size -= 2; *dest++ = 0; } } -void MemoryClear32(u32 *dest, s32 size) + +UNUSED static void MemoryClear32(u32 *dest, s32 size) { CpuClear(dest, size); } -void MemoryFill8(u8 *dest, u8 value, s32 size) +void MemoryFill8(void *dest, u8 value, s32 size) { - while (size > 0) - { + u8 *cur = dest; + + while (size > 0) { size -= 1; - *dest++ = value; + *cur++ = value; } } void MemoryFill16(u16 *dest, u16 value, s32 size) { - while (size > 0) - { + while (size > 0) { size -= 2; *dest++ = value; } } -void MemoryFill32(u32 *dest, u32 value, s32 size) +UNUSED static void MemoryFill32(u32 *dest, u32 value, s32 size) { - while (size > 0) - { + while (size > 0) { size -= 4; *dest++ = value; } } -void MemoryCopy8(u8 *dest, u8 *src, s32 size) +void MemoryCopy8(void *dest, void *src, s32 size) { - while (size > 0) - { + u8 *dCur = dest; + u8 *sCur = src; + + while (size > 0) { size -= 1; - *dest++ = *src++; + *dCur++ = *sCur++; } } -void MemoryCopy16(u16 *dest, u16 *src, s32 size) +UNUSED static void MemoryCopy16(u16 *dest, u16 *src, s32 size) { - while (size > 0) - { + while (size > 0) { size -= 2; *dest++ = *src++; } @@ -86,8 +87,7 @@ void MemoryCopy16(u16 *dest, u16 *src, s32 size) void MemoryCopy32(u32 *dest, u32 *src, s32 size) { - while (size > 0) - { + while (size > 0) { size -= 4; *dest++ = *src++; } @@ -149,31 +149,22 @@ u8 xxx_memory_attr_related(u32 r0) { u32 temp; u32 return_var; - if(r0 == 0) - { - return 0; - } - if((r0 & 8) != 0) - { - return 4; - } - temp = r0 & 7; - if(temp == 7) - { - return_var = 1;; - } - else if(temp == 1) - { + if (r0 == 0) + return 0; + + if (r0 & 8) + return 4; + + temp = r0 & 7; // Doesn't match with switch statement + if (temp == 7) + return_var = 1; + else if (temp == 1) return_var = 2; - } - else if(temp == 3) - { + else if (temp == 3) return_var = 3; - } else - { return_var = 5; - } + return return_var; -} +} \ No newline at end of file diff --git a/src/moves.c b/src/moves.c index 51575a94a..49daea427 100644 --- a/src/moves.c +++ b/src/moves.c @@ -708,21 +708,21 @@ bool8 IsMoveEnabled(s32 index, Move *moves) bool8 sub_8093318(s32 param_1, Move *moves) { Move dest_struct[MAX_MON_MOVES * 2]; - MemoryCopy8((void *)dest_struct, (void *)moves, sizeof(Move) * MAX_MON_MOVES * 2); + MemoryCopy8(dest_struct, moves, sizeof(dest_struct)); return TryLinkMovesAfter(param_1, dest_struct); } bool8 sub_809333C(s32 param_1, Move *moves) { Move dest_struct[MAX_MON_MOVES * 2]; - MemoryCopy8((void *)dest_struct, (void *)moves, sizeof(Move) * MAX_MON_MOVES * 2); + MemoryCopy8(dest_struct, moves, sizeof(dest_struct)); return UnlinkMovesAfter(param_1, dest_struct); } UNUSED static bool8 sub_8093360(s32 param_1, Move *moves) { Move dest_struct[MAX_MON_MOVES * 2]; - MemoryCopy8((void *)dest_struct, (void *)moves, sizeof(Move) * MAX_MON_MOVES * 2); + MemoryCopy8(dest_struct, moves, sizeof(dest_struct)); return sub_80933D8(param_1, dest_struct); } diff --git a/src/other_menus1.c b/src/other_menus1.c index 9d29f3ec5..e35f85e6f 100644 --- a/src/other_menus1.c +++ b/src/other_menus1.c @@ -19,12 +19,11 @@ #include "text1.h" // TODO: MAKE STATIC WHEN other_menus1.s IS DED -EWRAM_DATA_2 unkStruct_203B35C *sUnknown_203B35C = {0}; +/*static*/ EWRAM_DATA_2 unkStruct_203B35C *sUnknown_203B35C = {0}; #include "data/other_menus1.h" // other_menus1.s -extern void sub_8037810(void); extern void sub_8037900(void); // text.s extern void xxx_call_update_bg_vram(); @@ -36,6 +35,7 @@ static void sub_8037400(void); static void sub_80376CC(void); static void sub_8037748(void); static u32 sub_8037798(void); +static void sub_8037810(void); void sub_8036FDC(s32 param_1) { @@ -48,7 +48,7 @@ void sub_8036FDC(s32 param_1) if (sUnknown_203B35C == NULL) { sUnknown_203B35C = MemoryAlloc(sizeof(unkStruct_203B35C), 8); - MemoryFill8((u8 *)sUnknown_203B35C, 0, sizeof(unkStruct_203B35C)); + MemoryFill8(sUnknown_203B35C, 0, sizeof(unkStruct_203B35C)); } sUnknown_203B35C->unk0 = param_1; @@ -57,7 +57,7 @@ void sub_8036FDC(s32 param_1) for (index1 = 0; index1 < 2; index1++) { sUnknown_203B35C->unk1BC[index1].numItems = 0; - sUnknown_203B35C->unk1BC[index1].itemIndex.itemIndex_u8 = ITEM_NOTHING; + sUnknown_203B35C->unk1BC[index1].itemIndex = ITEM_NOTHING; } for (index2 = 0; index2 < 4; index2++) @@ -206,8 +206,8 @@ static void sub_80371B8(void) if (sUnknown_203B35C->linkStatus != COMMS_GOOD && sUnknown_203B35C->unk0 == 0) { item = sub_8035D94(); - if (item->itemIndex.itemIndex_u8 != ITEM_NOTHING && item->numItems != 0) - gTeamInventoryRef->teamStorage[item->itemIndex.itemIndex_u8] += item->numItems; + if (item->itemIndex != ITEM_NOTHING && item->numItems != 0) + gTeamInventoryRef->teamStorage[item->itemIndex] += item->numItems; } } } @@ -432,3 +432,27 @@ static u32 sub_8037798(void) } return nextMenu; } + +static void sub_8037810(void) +{ + unkStruct_8035D94 blank = {0, 0}; + + MemoryFill8(&sUnknown_203B35C->unk1BC[0], 0, sizeof(unkStruct_8035D94)); + MemoryFill8(&sUnknown_203B35C->unk1BC[1], 0, sizeof(unkStruct_8035D94)); + sUnknown_203B35C->unk1BC[0] = blank; + sUnknown_203B35C->unk1BC[1] = blank; + + MemoryFill8(&sUnknown_203B35C->unk1CC, 0, sizeof(unkStruct_203B480)); + MemoryFill8(&sUnknown_203B35C->unk1FC, 0, sizeof(unkStruct_203B480)); + MemoryFill8(&sUnknown_203B35C->unk22C, 0, sizeof(unkStruct_203B480)); + MemoryFill8(&sUnknown_203B35C->unk25C, 0, sizeof(unkStruct_203B480)); + MemoryFill8(&sUnknown_203B35C->unk28C, 0, sizeof(unkStruct_203B480)); + MemoryFill8(&sUnknown_203B35C->unk314, 0, sizeof(unkStruct_203B480)); + MemoryFill8(&sUnknown_203B35C->unk2BC, 0, sizeof(PokemonStruct1)); + MemoryFill8(&sUnknown_203B35C->unk344, 0, sizeof(PokemonStruct1)); + MemoryFill8(sUnknown_203B35C->unk39C, 0, 0xb4); // unkStruct_803B344? + MemoryFill8(sUnknown_203B35C->unk450, 0, 0xb4); // unkStruct_803B344? + + sUnknown_203B35C->unk2BC.speciesNum = 0; + sUnknown_203B35C->unk344.speciesNum = 0; +} \ No newline at end of file diff --git a/src/other_menus2.c b/src/other_menus2.c index 682631fc9..1265bb67f 100644 --- a/src/other_menus2.c +++ b/src/other_menus2.c @@ -191,15 +191,15 @@ static void sub_8037E38(unkStruct_8035D94 *param_1,unkStruct_8035D94 *param_2) r4 = sub_800D588() == 0 ? param_2 : param_1; r3 = sub_800D588() == 0 ? param_1 : param_2; - if ((r4->itemIndex).itemIndex_u8 == (r3->itemIndex).itemIndex_u8) { - load = gTeamInventoryRef->teamStorage[r4->itemIndex.itemIndex_u8]; + if (r4->itemIndex == r3->itemIndex) { + load = gTeamInventoryRef->teamStorage[r4->itemIndex]; load += r3->numItems; - gTeamInventoryRef->teamStorage[r4->itemIndex.itemIndex_u8] = load; + gTeamInventoryRef->teamStorage[r4->itemIndex] = load; } else { - load = gTeamInventoryRef->teamStorage[r3->itemIndex.itemIndex_u8]; + load = gTeamInventoryRef->teamStorage[r3->itemIndex]; load += r3->numItems; - gTeamInventoryRef->teamStorage[r3->itemIndex.itemIndex_u8] = load; + gTeamInventoryRef->teamStorage[r3->itemIndex] = load; } } @@ -246,7 +246,7 @@ static void sub_8037EBC(WonderMailStruct_203B2C0_sub *param_1, WonderMailStruct } else { - MemoryFill8((u8 *)gUnknown_203B484, 0, sizeof(unkStruct_203B484)); + MemoryFill8(gUnknown_203B484, 0, sizeof(unkStruct_203B484)); gUnknown_203B484->unk4.speciesNum = MONSTER_NONE; } } @@ -303,8 +303,8 @@ static s32 sub_8038014(unkStruct_8035D94 *param_1,unkStruct_8035D94 *param_2) r4 = sub_800D588() == 0 ? param_2 : param_1; r3 = sub_800D588() == 0 ? param_1 : param_2; - if ((r4->itemIndex).itemIndex_u8 == (r3->itemIndex).itemIndex_u8) { - r2 = gTeamInventoryRef->teamStorage[r4->itemIndex.itemIndex_u8]; + if (r4->itemIndex == r3->itemIndex) { + r2 = gTeamInventoryRef->teamStorage[r4->itemIndex]; r2 += r3->numItems; if (r2 > 999) { linkStatus = COMMS_NO_ROOM_STORAGE; @@ -313,7 +313,7 @@ static s32 sub_8038014(unkStruct_8035D94 *param_1,unkStruct_8035D94 *param_2) linkStatus = COMMS_GOOD; } else { - r2 = gTeamInventoryRef->teamStorage[r3->itemIndex.itemIndex_u8]; + r2 = gTeamInventoryRef->teamStorage[r3->itemIndex]; r2 += r3->numItems; if (r2 > 999) { linkStatus = COMMS_NO_ROOM_STORAGE; diff --git a/src/rescue_password_menu.c b/src/rescue_password_menu.c index fd353aeb1..2567650d0 100644 --- a/src/rescue_password_menu.c +++ b/src/rescue_password_menu.c @@ -262,7 +262,7 @@ void CreateRescuePasswordMenu(u32 currMenu) if(gRescuePasswordMenu == NULL) { gRescuePasswordMenu = MemoryAlloc(sizeof(struct RescuePasswordMenu), 8); - MemoryFill8((u8 *)gRescuePasswordMenu, 0, sizeof(struct RescuePasswordMenu)); + MemoryFill8(gRescuePasswordMenu, 0, sizeof(struct RescuePasswordMenu)); } for(counter = 0; counter < 4; counter++) @@ -296,7 +296,7 @@ void CreateRescuePasswordMenu(u32 currMenu) break; case MENU_DISPLAY_RESCUE_PASSWORD: temp = GetMailatIndex(0x1F); - MemoryFill8((u8 *)temp, 0, sizeof(unkStruct_203B480)); + MemoryFill8(temp, 0, sizeof(unkStruct_203B480)); temp->mailType = 2; temp->item.id = ITEM_NOTHING; sub_8031D70(0x1F, 0); @@ -359,7 +359,7 @@ s32 UpdateRescuePasswordMenu(void) case 3: case 5: iVar7 = sub_80154F0(); - MemoryFill8((u8 *)&mail, 0, sizeof(unkStruct_203B480)); + MemoryFill8(&mail, 0, sizeof(unkStruct_203B480)); switch(iVar7) { case 1: @@ -426,7 +426,7 @@ s32 UpdateRescuePasswordMenu(void) sub_80951FC(&mail); mailPtr1 = GetMailatIndex(GetMailIndex(1, mail.unk10.unk10)); mailPtr1->mailType = WONDER_MAIL_TYPE_OKD; - MemoryFill8((u8 *)&gUnknown_203B484, 0, sizeof(unkStruct_203B484)); + MemoryFill8(&gUnknown_203B484, 0, sizeof(unkStruct_203B484)); break; case PASSWORD_ENTRY_NOT_THANK_YOU_MAIL: nextMenu = PASSWORD_ENTRY_NOT_THANK_YOU_MAIL; diff --git a/src/save.c b/src/save.c index b1d07b944..f8c84a9e1 100644 --- a/src/save.c +++ b/src/save.c @@ -405,7 +405,7 @@ u32 sub_8012240(void) { s32 status; struct unk_struct *r5 = MemoryAlloc(sizeof(struct unk_struct), 5); - MemoryFill8((u8 *)r5, 0xFF, 0x4); + MemoryFill8(r5, 0xFF, 0x4); sub_8011830(); status = WriteFlashData(0x1F, (u8 *)r5, sizeof(struct unk_struct)); xxx_call_start_bg_music(); diff --git a/src/save_menu.c b/src/save_menu.c index 72fef8bb1..8bf7559fb 100644 --- a/src/save_menu.c +++ b/src/save_menu.c @@ -127,7 +127,7 @@ void CreateSaveMenu(s32 currMenu) if (sUnknown_203B364 == NULL) { sUnknown_203B364 = MemoryAlloc(sizeof(SaveMenuWork),8); - MemoryFill8((u8 *)sUnknown_203B364,0,sizeof(SaveMenuWork)); + MemoryFill8(sUnknown_203B364,0,sizeof(SaveMenuWork)); } for(index = 0; index < 4; index++){ sUnknown_203B364->unk148[index] = gUnknown_80E6F20; diff --git a/src/thank_you_wonder_mail.c b/src/thank_you_wonder_mail.c index 8d32621aa..3105d2c4e 100644 --- a/src/thank_you_wonder_mail.c +++ b/src/thank_you_wonder_mail.c @@ -241,7 +241,7 @@ u32 CreateThankYouMailPelipper(void) ResetUnusedInputStruct(); xxx_call_save_unk_text_struct_800641C(NULL, TRUE, TRUE); sUnknown_203B2C4 = MemoryAlloc(sizeof(WonderMailStruct_203B2C4), 8); - MemoryFill8((u8 *)sUnknown_203B2C4, 0, sizeof(WonderMailStruct_203B2C4)); + MemoryFill8(sUnknown_203B2C4, 0, sizeof(WonderMailStruct_203B2C4)); CopyYellowMonsterNametoBuffer(gSpeakerNameBuffer, MONSTER_PELIPPER); monName = GetMonSpecies(MONSTER_PELIPPER); @@ -483,7 +483,7 @@ void DisplayThankYouMailCommsOutcome(void) if (sub_80144A4(&auStack20) != 0) { return; } - MemoryFill8((u8 *)&sUnknown_203B2C4->unk41C, 0, sizeof(Item)); + MemoryFill8(&sUnknown_203B2C4->unk41C, 0, sizeof(Item)); sUnknown_203B2C4->unk41C.id = ITEM_NOTHING; sUnknown_203B2C4->unk41C.quantity = 1; sUnknown_203B2C4->unk41C.flags = 0; @@ -799,7 +799,7 @@ void HandleThankYouMailPasswordMenu(void) unkStruct_203B480 mail1; return_var = sub_80154F0(); - MemoryFill8((u8 *)&mail1, 0, sizeof(unkStruct_203B480)); + MemoryFill8(&mail1, 0, sizeof(unkStruct_203B480)); switch(return_var) { case 3: @@ -1306,13 +1306,13 @@ void UpdateThankYouMailText(void) switch(sUnknown_203B2C4->unk40) { case 6: - MemoryFill8((u8 *)&sUnknown_203B2C4->unk1B8,0, sizeof(unkStruct_203B480)); + MemoryFill8(&sUnknown_203B2C4->unk1B8,0, sizeof(unkStruct_203B480)); sUnknown_203B2C4->unk1B8 = *GetMailatIndex(sUnknown_203B2C4->mailIndex); sUnknown_203B2C4->linkError = sub_8037D64(sUnknown_203B2C4->unk40,&sUnknown_203B2C4->unk1B8,&sUnknown_203B2C4->unk1E8); break; case 7: - MemoryFill8((u8 *)&sUnknown_203B2C4->unk1B8,0, sizeof(unkStruct_203B480)); - MemoryFill8((u8 *)&sUnknown_203B2C4->unk1E8,0, sizeof(unkStruct_203B480)); + MemoryFill8(&sUnknown_203B2C4->unk1B8,0, sizeof(unkStruct_203B480)); + MemoryFill8(&sUnknown_203B2C4->unk1E8,0, sizeof(unkStruct_203B480)); sUnknown_203B2C4->linkError = sub_8037D64(sUnknown_203B2C4->unk40,&sUnknown_203B2C4->unk1B8,&sUnknown_203B2C4->unk1E8); break; } diff --git a/src/trade_items_menu.c b/src/trade_items_menu.c index 9c9629a4e..e0a8b4434 100644 --- a/src/trade_items_menu.c +++ b/src/trade_items_menu.c @@ -52,7 +52,7 @@ s32 CreateTradeItemsMenu(void) ResetUnusedInputStruct(); xxx_call_save_unk_text_struct_800641C(NULL, TRUE, TRUE); sTradeItemsMenu = MemoryAlloc(sizeof(struct TradeItemsMenu), 8); - MemoryFill8((u8 *)sTradeItemsMenu, 0, sizeof(struct TradeItemsMenu)); + MemoryFill8(sTradeItemsMenu, 0, sizeof(struct TradeItemsMenu)); sub_8035C1C(); sub_8035DA0(); sTradeItemsMenu->fallbackState = 0x13; diff --git a/src/unk_menu_203B360.c b/src/unk_menu_203B360.c index 3568787ed..a9bcb5e2c 100644 --- a/src/unk_menu_203B360.c +++ b/src/unk_menu_203B360.c @@ -64,7 +64,7 @@ void sub_80382E4(s32 currMenu) if (sUnknown_203B360 == NULL) { sUnknown_203B360 = MemoryAlloc(sizeof(unkStruct_203B360), 8); - MemoryFill8((u8 *)sUnknown_203B360, 0, sizeof(unkStruct_203B360)); + MemoryFill8(sUnknown_203B360, 0, sizeof(unkStruct_203B360)); } for(index = 0; index < 4; index++){ sUnknown_203B360->unk148[index] = gUnknown_80E6E7C; diff --git a/src/wonder_mail.c b/src/wonder_mail.c index 760e60656..2cb73970f 100644 --- a/src/wonder_mail.c +++ b/src/wonder_mail.c @@ -191,7 +191,7 @@ u32 sub_8027F88(void) ResetUnusedInputStruct(); xxx_call_save_unk_text_struct_800641C(NULL, TRUE, TRUE); sUnknown_203B2C0 = MemoryAlloc(sizeof(WonderMailStruct_203B2C0), 8); - MemoryFill8((u8 *)sUnknown_203B2C0, 0, sizeof(WonderMailStruct_203B2C0)); + MemoryFill8(sUnknown_203B2C0, 0, sizeof(WonderMailStruct_203B2C0)); sUnknown_203B2C0->unk53C = 0; sUnknown_203B2C0->mailIndex = -1; sUnknown_203B2C0->speciesNum = -1; @@ -518,13 +518,13 @@ void sub_8028348(void) switch(sUnknown_203B2C0->unk40) { case 3: - MemoryFill8((u8 *)&sUnknown_203B2C0->unk48, 0, sizeof(unkStruct_203B480)); - MemoryFill8((u8 *)&sUnknown_203B2C0->unk78, 0, sizeof(unkStruct_203B480)); + MemoryFill8(&sUnknown_203B2C0->unk48, 0, sizeof(unkStruct_203B480)); + MemoryFill8(&sUnknown_203B2C0->unk78, 0, sizeof(unkStruct_203B480)); sUnknown_203B2C0->linkError = sub_8037D64(sUnknown_203B2C0->unk40, &sUnknown_203B2C0->unk48, &sUnknown_203B2C0->unk78); break; case 4: - MemoryFill8((u8 *)&sUnknown_203B2C0->unkA8, 0, sizeof(WonderMailStruct_203B2C0_sub)); - MemoryFill8((u8 *)&sUnknown_203B2C0->unk130, 0, sizeof(WonderMailStruct_203B2C0_sub)); + MemoryFill8(&sUnknown_203B2C0->unkA8, 0, sizeof(WonderMailStruct_203B2C0_sub)); + MemoryFill8(&sUnknown_203B2C0->unk130, 0, sizeof(WonderMailStruct_203B2C0_sub)); sUnknown_203B2C0->unkA8.pokemon.speciesNum = 0; sUnknown_203B2C0->unk130.pokemon.speciesNum = 0; sUnknown_203B2C0->unkA8.mail = *GetMailatIndex(sUnknown_203B2C0->mailIndex); @@ -1359,7 +1359,7 @@ void sub_80293F4(void) unkStruct_203B480 mail; return_var = sub_80154F0(); - MemoryFill8((u8 *)&mail, 0, sizeof(unkStruct_203B480)); + MemoryFill8(&mail, 0, sizeof(unkStruct_203B480)); switch(return_var) { case 3: diff --git a/src/wonder_mail_2.c b/src/wonder_mail_2.c index 1c42ffa9d..15cfa3802 100644 --- a/src/wonder_mail_2.c +++ b/src/wonder_mail_2.c @@ -81,7 +81,7 @@ s32 sub_802B2D4(void) ResetUnusedInputStruct(); xxx_call_save_unk_text_struct_800641C(NULL, TRUE, TRUE); sUnknown_203B2C8 = MemoryAlloc(sizeof(struct unkStruct_203B2C8),8); - MemoryFill8((u8 *)sUnknown_203B2C8,0,sizeof(struct unkStruct_203B2C8)); + MemoryFill8(sUnknown_203B2C8,0,sizeof(struct unkStruct_203B2C8)); sUnknown_203B2C8->unk1 = -1; CopyYellowMonsterNametoBuffer(gSpeakerNameBuffer, MONSTER_PELIPPER); faceFile = GetDialogueSpriteDataPtr(MONSTER_PELIPPER); diff --git a/src/wonder_mail_6.c b/src/wonder_mail_6.c index beaa90e3c..104460d7b 100644 --- a/src/wonder_mail_6.c +++ b/src/wonder_mail_6.c @@ -105,7 +105,7 @@ bool8 sub_8030F58(u32 wonderMailType) xxx_call_save_unk_text_struct_800641C(NULL, TRUE, TRUE); if (gUnknown_203B328 == NULL) { gUnknown_203B328 = MemoryAlloc(sizeof(struct unkStruct_203B328),8); - MemoryFill8((u8 *)gUnknown_203B328,0,sizeof(struct unkStruct_203B328)); + MemoryFill8(gUnknown_203B328,0,sizeof(struct unkStruct_203B328)); } gUnknown_203B328->wonderMailType = wonderMailType; file = GetDialogueSpriteDataPtr(MONSTER_PELIPPER); diff --git a/src/wonder_mail_main_menu.c b/src/wonder_mail_main_menu.c index a327a8453..1f6ec67d6 100644 --- a/src/wonder_mail_main_menu.c +++ b/src/wonder_mail_main_menu.c @@ -100,7 +100,7 @@ bool8 CreateWonderMailMenu(void) xxx_call_save_unk_text_struct_800641C(NULL, TRUE, TRUE); gUnknown_203B3E8 = MemoryAlloc(sizeof(struct unkStruct_203B3E8), 8); - MemoryFill8((u8 *)gUnknown_203B3E8, 0, sizeof(struct unkStruct_203B3E8)); + MemoryFill8(gUnknown_203B3E8, 0, sizeof(struct unkStruct_203B3E8)); for(index = 0; index < PASSWORD_BUFFER_SIZE; index++){ gUnknown_203B3E8->PasswordEntryBuffer[index] = 0; @@ -522,18 +522,18 @@ void WonderMailMainMenuCallback(void) switch(gUnknown_203B3E8->unk24C) { case 9: - MemoryFill8((u8 *)&gUnknown_203B3E8->unk254,0,0xb4); + MemoryFill8(&gUnknown_203B3E8->unk254,0,0xb4); temp = sub_803B344(gUnknown_203B3E8->unk3BC); if(temp->unk14 != NULL){ - MemoryCopy8((u8 *)&gUnknown_203B3E8->unk254.unk14,temp->unk14,0x28); - MemoryCopy8((u8 *)&gUnknown_203B3E8->unk254.unk3C,temp->unk18,0x78); + MemoryCopy8(&gUnknown_203B3E8->unk254.unk14,temp->unk14,0x28); + MemoryCopy8(&gUnknown_203B3E8->unk254.unk3C,temp->unk18,0x78); } gUnknown_203B3E8->unk254.mail = temp->mail; gUnknown_203B3E8->wonderMailStatus = sub_8037D64(gUnknown_203B3E8->unk24C,&gUnknown_203B3E8->unk254,&gUnknown_203B3E8->unk308); break; case 10: - MemoryFill8((u8 *)&gUnknown_203B3E8->unk254,0,0xb4); - MemoryFill8((u8 *)&gUnknown_203B3E8->unk308,0,0xb4); + MemoryFill8(&gUnknown_203B3E8->unk254,0,0xb4); + MemoryFill8(&gUnknown_203B3E8->unk308,0,0xb4); gUnknown_203B3E8->wonderMailStatus = sub_8037D64(gUnknown_203B3E8->unk24C,&gUnknown_203B3E8->unk254,&gUnknown_203B3E8->unk308); break; } diff --git a/sym_ewram.txt b/sym_ewram.txt index 65a583a91..c463cecf4 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -364,11 +364,8 @@ gLevelCurrentData: /* 20384F0 (GetPokemonLevelData) */ .include "src/ground_main.o" .space 0x2 -gUnknown_20398C8: /* 20398C8 (sub_80991E0 - sub_8099220) */ - .space 0x10 - -gUnknown_20398D8: /* 20398D8 (sub_809927C) */ - .space 0x78 +gUnknown_20398C8: /* 20398C8 (sub_80991E0 - sub_809927C) */ + .space 0x88 /* This should be a "struct WonderMailStruct_203B2C0_sub", at least I think so due to its size. Kermalis */ gUnknown_2039950: /* 2039950 (xxx_script_related_8098468 - sub_809927C) */ .space 0x8 From 62a0165014312ef7b1d9afc503dc74db8286ab52 Mon Sep 17 00:00:00 2001 From: Kermalis <29823718+Kermalis@users.noreply.github.com> Date: Sat, 30 Nov 2024 21:20:11 -0500 Subject: [PATCH 2/4] Finish other_menus1.s --- asm/other_menus1.s | 160 ---------------------------------------- ld_script.txt | 1 - src/data/other_menus1.h | 12 +-- src/other_menus1.c | 44 +++++++++++ 4 files changed, 50 insertions(+), 167 deletions(-) delete mode 100644 asm/other_menus1.s diff --git a/asm/other_menus1.s b/asm/other_menus1.s deleted file mode 100644 index 137b08e48..000000000 --- a/asm/other_menus1.s +++ /dev/null @@ -1,160 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start sub_8037900 -sub_8037900: - push {r4,lr} - sub sp, 0x10 - ldr r4, _08037928 - ldr r0, [r4] - movs r1, 0xAE - lsls r1, 1 - adds r0, r1 - movs r1, 0 - bl sub_8035CC0 - ldr r0, [r4] - ldr r0, [r0] - cmp r0, 0xA - bls _0803791E - b _08037A14 -_0803791E: - lsls r0, 2 - ldr r1, _0803792C - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_08037928: .4byte sUnknown_203B35C -_0803792C: .4byte _08037930 - .align 2, 0 -_08037930: - .4byte _0803795C - .4byte _0803795C - .4byte _0803797C - .4byte _0803797C - .4byte _0803799C - .4byte _0803799C - .4byte _080379BC - .4byte _080379BC - .4byte _08037A14 - .4byte _080379F0 - .4byte _080379F0 -_0803795C: - ldr r0, _08037970 - ldr r1, [r0] - adds r0, r1, 0 - adds r0, 0x1C - movs r2, 0xAE - lsls r2, 1 - adds r1, r2 - ldr r3, _08037974 - ldr r2, _08037978 - b _080379CE - .align 2, 0 -_08037970: .4byte sUnknown_203B35C -_08037974: .4byte sUnknown_80E6554 -_08037978: .4byte sUnknown_80E656C -_0803797C: - ldr r0, _08037990 - ldr r1, [r0] - adds r0, r1, 0 - adds r0, 0x1C - movs r2, 0xAE - lsls r2, 1 - adds r1, r2 - ldr r3, _08037994 - ldr r2, _08037998 - b _080379CE - .align 2, 0 -_08037990: .4byte sUnknown_203B35C -_08037994: .4byte sUnknown_80E6554 -_08037998: .4byte sUnknown_80E65D8 -_0803799C: - ldr r0, _080379B0 - ldr r1, [r0] - adds r0, r1, 0 - adds r0, 0x1C - movs r2, 0xAE - lsls r2, 1 - adds r1, r2 - ldr r3, _080379B4 - ldr r2, _080379B8 - b _080379CE - .align 2, 0 -_080379B0: .4byte sUnknown_203B35C -_080379B4: .4byte sUnknown_80E6554 -_080379B8: .4byte sUnknown_80E661C -_080379BC: - ldr r0, _080379E4 - ldr r1, [r0] - adds r0, r1, 0 - adds r0, 0x1C - movs r2, 0xAE - lsls r2, 1 - adds r1, r2 - ldr r3, _080379E8 - ldr r2, _080379EC -_080379CE: - str r2, [sp] - movs r4, 0 - str r4, [sp, 0x4] - movs r2, 0x6 - str r2, [sp, 0x8] - str r4, [sp, 0xC] - movs r2, 0 - bl SetMenuItems - b _08037A14 - .align 2, 0 -_080379E4: .4byte sUnknown_203B35C -_080379E8: .4byte sUnknown_80E6554 -_080379EC: .4byte sUnknown_80E665C -_080379F0: - ldr r0, _08037A38 - ldr r1, [r0] - adds r0, r1, 0 - adds r0, 0x1C - movs r2, 0xAE - lsls r2, 1 - adds r1, r2 - ldr r3, _08037A3C - ldr r2, _08037A40 - str r2, [sp] - movs r4, 0 - str r4, [sp, 0x4] - movs r2, 0x6 - str r2, [sp, 0x8] - str r4, [sp, 0xC] - movs r2, 0 - bl SetMenuItems -_08037A14: - ldr r4, _08037A38 - ldr r0, [r4] - adds r0, 0x1C - movs r1, 0 - movs r2, 0x1 - bl sub_8035CF4 - bl sub_80373C4 - ldr r0, [r4] - adds r0, 0x1C - bl sub_80130A8 - add sp, 0x10 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08037A38: .4byte sUnknown_203B35C -_08037A3C: .4byte sUnknown_80E6554 -_08037A40: .4byte sUnknown_80E667C - thumb_func_end sub_8037900 - - thumb_func_start nullsub_202 -nullsub_202: - bx lr - thumb_func_end nullsub_202 - - - .align 2, 0 \ No newline at end of file diff --git a/ld_script.txt b/ld_script.txt index 802b0bb46..b34e93867 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -180,7 +180,6 @@ SECTIONS { src/main_menu2.o(.text); src/trade_items_menu.o(.text); src/other_menus1.o(.text); - asm/other_menus1.o(.text); asm/other_menus2.o(.text); src/other_menus2.o(.text); src/adventure_log_menu.o(.text); diff --git a/src/data/other_menus1.h b/src/data/other_menus1.h index 9bfdee4bc..2a2421f6a 100644 --- a/src/data/other_menus1.h +++ b/src/data/other_menus1.h @@ -6,7 +6,7 @@ static const UnkTextStruct2 sUnknown_80E653C = { 0, 0, NULL }; -const UnkTextStruct2 sUnknown_80E6554 = { // TODO: MAKE STATIC WHEN other_menus1.s IS DED +static const UnkTextStruct2 sUnknown_80E6554 = { 0, 0, 0, 0, 3, 3, 8, @@ -15,35 +15,35 @@ const UnkTextStruct2 sUnknown_80E6554 = { // TODO: MAKE STATIC WHEN other_menus1 NULL }; -const MenuItem sUnknown_80E656C[] = { // TODO: MAKE STATIC WHEN other_menus1.s IS DED +static const MenuItem sUnknown_80E656C[] = { {_("{CENTER_ALIGN}{COLOR RED}Caution!{RESET} "), 5}, {_("{CENTER_ALIGN}Item transmitting!"), 5}, {_("{CENTER_ALIGN}Don't turn the power off!"), 5}, {NULL, 3}, }; -const MenuItem sUnknown_80E65D8[] = { // TODO: MAKE STATIC WHEN other_menus1.s IS DED +static const MenuItem sUnknown_80E65D8[] = { {_("{CENTER_ALIGN}{COLOR RED}Caution!{RESET} "), 5}, {_("{CENTER_ALIGN}Thank-You Mail in transmission!"), 5}, {_("{CENTER_ALIGN}Don't turn the power off!"), 5}, {NULL, 3}, }; -const MenuItem sUnknown_80E661C[] = { // TODO: MAKE STATIC WHEN other_menus1.s IS DED +static const MenuItem sUnknown_80E661C[] = { {_("{CENTER_ALIGN}{COLOR RED}Caution!{RESET} "), 5}, {_("{CENTER_ALIGN}A-OK Mail in transmission!"), 5}, {_("{CENTER_ALIGN}Don't turn the power off!"), 5}, {NULL, 3}, }; -const MenuItem sUnknown_80E665C[] = { // TODO: MAKE STATIC WHEN other_menus1.s IS DED +static const MenuItem sUnknown_80E665C[] = { {_("{CENTER_ALIGN}{COLOR RED}Caution!{RESET} "), 5}, {_("{CENTER_ALIGN}Thank-You Mail in transmission!"), 5}, {_("{CENTER_ALIGN}Don't turn the power off!"), 5}, {NULL, 3}, }; -const MenuItem sUnknown_80E667C[] = { // TODO: MAKE STATIC WHEN other_menus1.s IS DED +static const MenuItem sUnknown_80E667C[] = { {_("{CENTER_ALIGN}{COLOR RED}Caution!{RESET} "), 5}, {_("{CENTER_ALIGN}Wonder Mail in transmission!"), 5}, {_("{CENTER_ALIGN}Don't turn the power off!"), 5}, diff --git a/src/other_menus1.c b/src/other_menus1.c index e35f85e6f..f50f6c5f2 100644 --- a/src/other_menus1.c +++ b/src/other_menus1.c @@ -455,4 +455,48 @@ static void sub_8037810(void) sUnknown_203B35C->unk2BC.speciesNum = 0; sUnknown_203B35C->unk344.speciesNum = 0; +} + +void sub_8037900(void) +{ + sub_8035CC0(sUnknown_203B35C->unk15C, 0); + + switch (sUnknown_203B35C->unk0) { + case 0: + case 1: { + SetMenuItems(sUnknown_203B35C->unk1C, sUnknown_203B35C->unk15C, 0, &sUnknown_80E6554, sUnknown_80E656C, FALSE, 6, FALSE); + break; + } + case 2: + case 3: { + SetMenuItems(sUnknown_203B35C->unk1C, sUnknown_203B35C->unk15C, 0, &sUnknown_80E6554, sUnknown_80E65D8, FALSE, 6, FALSE); + break; + } + case 4: + case 5: { + SetMenuItems(sUnknown_203B35C->unk1C, sUnknown_203B35C->unk15C, 0, &sUnknown_80E6554, sUnknown_80E661C, FALSE, 6, FALSE); + break; + } + case 6: + case 7: { + SetMenuItems(sUnknown_203B35C->unk1C, sUnknown_203B35C->unk15C, 0, &sUnknown_80E6554, sUnknown_80E665C, FALSE, 6, FALSE); + break; + } + case 8: { + break; + } + case 9: + case 10: { + SetMenuItems(sUnknown_203B35C->unk1C, sUnknown_203B35C->unk15C, 0, &sUnknown_80E6554, sUnknown_80E667C, FALSE, 6, FALSE); + break; + } + } + + sub_8035CF4(sUnknown_203B35C->unk1C, 0, TRUE); + sub_80373C4(); + sub_80130A8(sUnknown_203B35C->unk1C); +} + +UNUSED static void nullsub_202(void) +{ } \ No newline at end of file From 0d8af0446cc798ce8e54ec2132673d6958cd5b80 Mon Sep 17 00:00:00 2001 From: Kermalis <29823718+Kermalis@users.noreply.github.com> Date: Sat, 30 Nov 2024 23:51:57 -0500 Subject: [PATCH 3/4] other_menus2.s --- asm/other_menus2.s | 242 ------------------------------------ include/other_menus2.h | 3 +- ld_script.txt | 1 - src/data/other_menus2.h | 11 +- src/friend_rescue.c | 1 - src/other_menus1.c | 14 +-- src/other_menus2.c | 224 ++++++++++++++++++++++++++++----- src/thank_you_wonder_mail.c | 1 - src/trade_items_menu.c | 2 - src/unk_menu_203B360.c | 1 + src/wonder_mail.c | 1 - src/wonder_mail_main_menu.c | 1 - 12 files changed, 205 insertions(+), 297 deletions(-) delete mode 100644 asm/other_menus2.s diff --git a/asm/other_menus2.s b/asm/other_menus2.s deleted file mode 100644 index f55d8d251..000000000 --- a/asm/other_menus2.s +++ /dev/null @@ -1,242 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start sub_8037A48 -sub_8037A48: - push {r4-r6,lr} - sub sp, 0x28 - movs r6, 0x1 - movs r0, 0 - mov r1, sp - movs r2, 0x14 - bl sub_800D670 - add r4, sp, 0x14 - movs r0, 0x1 - adds r1, r4, 0 - movs r2, 0x14 - bl sub_800D670 - ldr r1, _08037AAC - movs r3, 0x8 - adds r2, r1, 0 - adds r0, r2, 0x4 -_08037A6C: - str r3, [r0] - subs r0, 0x4 - cmp r0, r1 - bge _08037A6C - ldr r0, [sp, 0x10] - str r0, [r2] - ldr r0, [r4, 0x10] - str r0, [r2, 0x4] - ldr r5, _08037AB0 - mov r0, sp - adds r1, r5, 0 - bl strcmp - cmp r0, 0 - beq _08037A8C - movs r0, 0x1 -_08037A8C: - lsls r0, 24 - cmp r0, 0 - bne _08037AA6 - adds r0, r4, 0 - adds r1, r5, 0 - bl strcmp - cmp r0, 0 - beq _08037AA0 - movs r0, 0x1 -_08037AA0: - lsls r0, 24 - cmp r0, 0 - beq _08037AB4 -_08037AA6: - movs r0, 0 - b _08037B1E - .align 2, 0 -_08037AAC: .4byte gUnknown_202EC40 -_08037AB0: .4byte gUnknown_80E6E50 -_08037AB4: - ldr r1, [sp, 0x10] - cmp r1, 0 - bne _08037AC0 - ldr r0, [r4, 0x10] - cmp r0, 0x1 - beq _08037B1C -_08037AC0: - cmp r1, 0x1 - bne _08037ACA - ldr r0, [r4, 0x10] - cmp r0, 0 - beq _08037B1C -_08037ACA: - cmp r1, 0x2 - bne _08037AD4 - ldr r0, [r4, 0x10] - cmp r0, 0x3 - beq _08037B1C -_08037AD4: - cmp r1, 0x3 - bne _08037ADE - ldr r0, [r4, 0x10] - cmp r0, 0x2 - beq _08037B1C -_08037ADE: - cmp r1, 0x9 - bne _08037AE8 - ldr r0, [r4, 0x10] - cmp r0, 0xA - beq _08037B1C -_08037AE8: - cmp r1, 0xA - bne _08037AF2 - ldr r0, [r4, 0x10] - cmp r0, 0x9 - beq _08037B1C -_08037AF2: - cmp r1, 0x4 - bne _08037AFC - ldr r0, [r4, 0x10] - cmp r0, 0x5 - beq _08037B1C -_08037AFC: - cmp r1, 0x5 - bne _08037B06 - ldr r0, [r4, 0x10] - cmp r0, 0x4 - beq _08037B1C -_08037B06: - cmp r1, 0x6 - bne _08037B10 - ldr r0, [r4, 0x10] - cmp r0, 0x7 - beq _08037B1C -_08037B10: - cmp r1, 0x7 - bne _08037B1A - ldr r0, [r4, 0x10] - cmp r0, 0x6 - beq _08037B1C -_08037B1A: - movs r6, 0 -_08037B1C: - adds r0, r6, 0 -_08037B1E: - add sp, 0x28 - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end sub_8037A48 - - thumb_func_start sub_8037B28 -sub_8037B28: - push {r4,r5,lr} - sub sp, 0x14 - adds r4, r0, 0 - movs r5, 0 - bl sub_800D414 - ldr r0, _08037B58 - str r5, [r0] - ldr r5, _08037B5C - mov r0, sp - movs r1, 0 - movs r2, 0x14 - bl MemoryFill8 - mov r0, sp - adds r1, r5, 0 - bl strcpy - str r4, [sp, 0x10] - mov r0, sp - movs r1, 0x14 - bl sub_800D59C - b _08037B7A - .align 2, 0 -_08037B58: .4byte gUnknown_202EC38 -_08037B5C: .4byte gUnknown_80E6E50 -_08037B60: - cmp r5, 0x3 - beq _08037BCC - cmp r5, 0x4 - beq _08037BD8 - cmp r5, 0x5 - beq _08037BF0 - ldr r2, _08037BC0 - ldr r1, [r2] - ldr r0, _08037BC4 - cmp r1, r0 - bgt _08037BE4 - adds r0, r1, 0x1 - str r0, [r2] -_08037B7A: - movs r4, 0 -_08037B7C: - bl sub_80373C4 - bl sub_8012AE8 - cmp r0, 0x3 - bgt _08037B8C - cmp r0, 0x2 - bge _08037BF0 -_08037B8C: - adds r4, 0x1 - cmp r4, 0 - ble _08037B7C - bl sub_800D33C - adds r5, r0, 0 - bl sub_800D570 - cmp r5, 0x2 - bne _08037B60 - bl sub_800D600 - lsls r0, 24 - cmp r0, 0 - beq _08037BFC - bl sub_8037A48 - lsls r0, 24 - cmp r0, 0 - bne _08037BC8 - movs r4, 0x4 - bl sub_800D520 - bl sub_800D510 - b _08037C06 - .align 2, 0 -_08037BC0: .4byte gUnknown_202EC38 -_08037BC4: .4byte 0x00000707 -_08037BC8: - movs r4, 0 - b _08037C06 -_08037BCC: - bl sub_800D520 - bl sub_800D510 - movs r0, 0x2 - b _08037C08 -_08037BD8: - bl sub_800D520 - bl sub_800D510 - movs r0, 0x3 - b _08037C08 -_08037BE4: - bl sub_800D520 - bl sub_800D510 - movs r0, 0xF - b _08037C08 -_08037BF0: - bl sub_800D520 - bl sub_800D510 - movs r0, 0x1 - b _08037C08 -_08037BFC: - movs r4, 0x5 - bl sub_800D520 - bl sub_800D510 -_08037C06: - adds r0, r4, 0 -_08037C08: - add sp, 0x14 - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_8037B28 - - .align 2,0 diff --git a/include/other_menus2.h b/include/other_menus2.h index fa5eaf91e..30c033114 100644 --- a/include/other_menus2.h +++ b/include/other_menus2.h @@ -1,7 +1,8 @@ #ifndef GUARD_OTHER_MENUS2_H #define GUARD_OTHER_MENUS2_H -u32 sub_8037C10(bool8); +s32 sub_8037B28(s32); +s32 sub_8037C10(bool8); s32 sub_8037D64(u32 mode, void *, void *); s32 sub_80381F4(u32 mode, void *, void *); diff --git a/ld_script.txt b/ld_script.txt index b34e93867..153414996 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -180,7 +180,6 @@ SECTIONS { src/main_menu2.o(.text); src/trade_items_menu.o(.text); src/other_menus1.o(.text); - asm/other_menus2.o(.text); src/other_menus2.o(.text); src/adventure_log_menu.o(.text); src/unk_menu_203B360.o(.text); diff --git a/src/data/other_menus2.h b/src/data/other_menus2.h index a57e02e7c..73ec2f35e 100644 --- a/src/data/other_menus2.h +++ b/src/data/other_menus2.h @@ -1,7 +1,6 @@ -ALIGNED(4) const u8 gUnknown_80E6E50[] = _("CHUNSOFT"); // TODO: MAKE STATIC WHEN other_menus2.s IS DED +ALIGNED(4) static const u8 sChunsoft[] = _("CHUNSOFT"); -// TODO: These belongs to files after -ALIGNED(4) static const u8 fill1[] = _("pksdir0"); -ALIGNED(4) static const u8 fill2[] = _("pksdir0"); -ALIGNED(4) static const u8 fill3[] = _("pksdir0"); -ALIGNED(4) static const u8 fill4[] = _("pksdir0"); \ No newline at end of file +// TODO: These belong to files after. Two of the .c files were stripped away? They were before unk_menu_203B360.c +ALIGNED(4) static const u8 fill1[] = _("pksdir0"); // adventure_log_menu.c +ALIGNED(4) static const u8 fill2[] = _("pksdir0"); // ?.c +ALIGNED(4) static const u8 fill3[] = _("pksdir0"); // ?.c \ No newline at end of file diff --git a/src/friend_rescue.c b/src/friend_rescue.c index 79dd3f639..6716654fa 100644 --- a/src/friend_rescue.c +++ b/src/friend_rescue.c @@ -306,7 +306,6 @@ extern void sub_8031E10(void); extern u8 sub_800D588(void); extern u32 sub_8023CE8(void); extern bool8 sub_8031D70(u32 mailIndex, s32); -extern s32 sub_8037B28(u32); extern u32 GetDungeonTeamRankPts(DungeonLocation *, u32); extern void sprintfStatic(char *buffer, const char *text, ...); diff --git a/src/other_menus1.c b/src/other_menus1.c index f50f6c5f2..e5fa64de4 100644 --- a/src/other_menus1.c +++ b/src/other_menus1.c @@ -18,17 +18,12 @@ #include "sprite.h" #include "text1.h" -// TODO: MAKE STATIC WHEN other_menus1.s IS DED -/*static*/ EWRAM_DATA_2 unkStruct_203B35C *sUnknown_203B35C = {0}; +static EWRAM_DATA_2 unkStruct_203B35C *sUnknown_203B35C = {0}; #include "data/other_menus1.h" -// other_menus1.s -extern void sub_8037900(void); // text.s -extern void xxx_call_update_bg_vram(); -// other_menus2.s -extern s32 sub_8037B28(u32); +extern void xxx_call_update_bg_vram(); // egg's PR should remove this static void sub_80371B8(void); static void sub_8037400(void); @@ -36,6 +31,7 @@ static void sub_80376CC(void); static void sub_8037748(void); static u32 sub_8037798(void); static void sub_8037810(void); +static void sub_8037900(void); void sub_8036FDC(s32 param_1) { @@ -104,7 +100,7 @@ UNUSED static u32 sub_80370F0(void) sub_80371B8(); break; case 2: - if (sUnknown_203B35C->unk0 < 2 && sUnknown_203B35C->linkStatus == COMMS_GOOD && !sub_8037C10(FALSE)) + if (sUnknown_203B35C->unk0 < 2 && sUnknown_203B35C->linkStatus == COMMS_GOOD && sub_8037C10(FALSE) == 0) return 41; // TODO: what screen is this? if (!sub_80130A8(&sUnknown_203B35C->unk1C[0])) @@ -133,7 +129,7 @@ static void sub_80371B8(void) sub_8037400(); if (sUnknown_203B35C->unk0 < 2 && sUnknown_203B35C->linkStatus == COMMS_GOOD) { - if (sub_8037C10(FALSE)) { + if (sub_8037C10(FALSE) != 0) { sub_80376CC(); sub_8035CC0(sUnknown_203B35C->unk15C, 0); // Success! diff --git a/src/other_menus2.c b/src/other_menus2.c index 1265bb67f..fcbaffe3e 100644 --- a/src/other_menus2.c +++ b/src/other_menus2.c @@ -11,10 +11,16 @@ #include "save.h" #include "structs/str_dungeon.h" +typedef struct unkStruct_800D670 +{ + u8 buffer[16]; + u32 unk10; +} unkStruct_800D670; + // rescue_password_menu.c extern s32 gCommsTimeout; // Counts to 100 and then errors if other player hasn't connected -extern u32 gUnknown_202EC40[2]; +extern s32 gUnknown_202EC40[2]; extern s32 gUnknown_202EC48; extern struct UnkStruct_203B184 *gUnknown_203B184; @@ -30,44 +36,199 @@ extern void sub_800D570(void); extern u8 sub_800D588(void); extern void sub_800D59C(s32 *, u32); extern u8 sub_800D600(void); -extern void sub_800D670(u32, s32 *, u32); +extern void sub_800D670(s32 idx, void *dst, s32 size); extern void sub_800D68C(u32); -u32 sub_8037C10(bool8 a0) +// Inline needed for 8-bit return cast +static inline bool8 IsNotChunsoft(unkStruct_800D670 *unk) { - u32 ret; + return strcmp(unk->buffer, sChunsoft) != 0; +} - if (a0) - { +bool8 sub_8037A48(void) +{ + bool8 found; + unkStruct_800D670 stack; + unkStruct_800D670 stack_1; + s32 i; + + found = TRUE; + sub_800D670(0, &stack, sizeof(unkStruct_800D670)); + sub_800D670(1, &stack_1, sizeof(unkStruct_800D670)); + + for (i = 0; i < 2; i++) + gUnknown_202EC40[i] = 8; + + gUnknown_202EC40[0] = stack.unk10; + gUnknown_202EC40[1] = stack_1.unk10; + + if (IsNotChunsoft(&stack) || IsNotChunsoft(&stack_1)) + return FALSE; + + if ((stack.unk10 == 0 && stack_1.unk10 == 1) + || (stack.unk10 == 1 && stack_1.unk10 == 0)) { + //found = TRUE; + } + else if ((stack.unk10 == 2 && stack_1.unk10 == 3) + || (stack.unk10 == 3 && stack_1.unk10 == 2)) { + //found = TRUE; + } + else if ((stack.unk10 == 9 && stack_1.unk10 == 10) + || (stack.unk10 == 10 && stack_1.unk10 == 9)) { + //found = TRUE; + } + else if ((stack.unk10 == 4 && stack_1.unk10 == 5) + || (stack.unk10 == 5 && stack_1.unk10 == 4)) { + //found = TRUE; + } + else if ((stack.unk10 == 6 && stack_1.unk10 == 7) + || (stack.unk10 == 7 && stack_1.unk10 == 6)) { + //found = TRUE; + } + else { + found = FALSE; + } + + return found; +} + +// https://decomp.me/scratch/IJ9zV (inverted loop, try to match without gotos...) +NAKED s32 sub_8037B28(s32 mode) +{ + asm_unified("push {r4,r5,lr}\n" +" sub sp, 0x14\n" +" adds r4, r0, 0\n" +" movs r5, 0\n" +" bl sub_800D414\n" +" ldr r0, _08037B58\n" +" str r5, [r0]\n" +" ldr r5, _08037B5C\n" +" mov r0, sp\n" +" movs r1, 0\n" +" movs r2, 0x14\n" +" bl MemoryFill8\n" +" mov r0, sp\n" +" adds r1, r5, 0\n" +" bl strcpy\n" +" str r4, [sp, 0x10]\n" +" mov r0, sp\n" +" movs r1, 0x14\n" +" bl sub_800D59C\n" +" b _08037B7A\n" +" .align 2, 0\n" +"_08037B58: .4byte gUnknown_202EC38\n" +"_08037B5C: .4byte sChunsoft\n" +"_08037B60:\n" +" cmp r5, 0x3\n" +" beq _08037BCC\n" +" cmp r5, 0x4\n" +" beq _08037BD8\n" +" cmp r5, 0x5\n" +" beq _08037BF0\n" +" ldr r2, _08037BC0\n" +" ldr r1, [r2]\n" +" ldr r0, _08037BC4\n" +" cmp r1, r0\n" +" bgt _08037BE4\n" +" adds r0, r1, 0x1\n" +" str r0, [r2]\n" +"_08037B7A:\n" +" movs r4, 0\n" +"_08037B7C:\n" +" bl sub_80373C4\n" +" bl sub_8012AE8\n" +" cmp r0, 0x3\n" +" bgt _08037B8C\n" +" cmp r0, 0x2\n" +" bge _08037BF0\n" +"_08037B8C:\n" +" adds r4, 0x1\n" +" cmp r4, 0\n" +" ble _08037B7C\n" +" bl sub_800D33C\n" +" adds r5, r0, 0\n" +" bl sub_800D570\n" +" cmp r5, 0x2\n" +" bne _08037B60\n" +" bl sub_800D600\n" +" lsls r0, 24\n" +" cmp r0, 0\n" +" beq _08037BFC\n" +" bl sub_8037A48\n" +" lsls r0, 24\n" +" cmp r0, 0\n" +" bne _08037BC8\n" +" movs r4, 0x4\n" +" bl sub_800D520\n" +" bl sub_800D510\n" +" b _08037C06\n" +" .align 2, 0\n" +"_08037BC0: .4byte gUnknown_202EC38\n" +"_08037BC4: .4byte 0x00000707\n" +"_08037BC8:\n" +" movs r4, 0\n" +" b _08037C06\n" +"_08037BCC:\n" +" bl sub_800D520\n" +" bl sub_800D510\n" +" movs r0, 0x2\n" +" b _08037C08\n" +"_08037BD8:\n" +" bl sub_800D520\n" +" bl sub_800D510\n" +" movs r0, 0x3\n" +" b _08037C08\n" +"_08037BE4:\n" +" bl sub_800D520\n" +" bl sub_800D510\n" +" movs r0, 0xF\n" +" b _08037C08\n" +"_08037BF0:\n" +" bl sub_800D520\n" +" bl sub_800D510\n" +" movs r0, 0x1\n" +" b _08037C08\n" +"_08037BFC:\n" +" movs r4, 0x5\n" +" bl sub_800D520\n" +" bl sub_800D510\n" +"_08037C06:\n" +" adds r0, r4, 0\n" +"_08037C08:\n" +" add sp, 0x14\n" +" pop {r4,r5}\n" +" pop {r1}\n" +" bx r1"); +} + +s32 sub_8037C10(bool8 a0) +{ + s32 ret; + + if (a0) { if (sub_800D588()) - { ret = gUnknown_202EC40[0]; - } else - { ret = gUnknown_202EC40[1]; - } } - else if (sub_800D588()) - { - ret = gUnknown_202EC40[1]; - } - else - { - ret = gUnknown_202EC40[0]; + else { + if (sub_800D588()) + ret = gUnknown_202EC40[1]; + else + ret = gUnknown_202EC40[0]; } + return ret; } static void sub_8037C44(s32 mode, void *data) { - s32 index; + s32 i; - for(index = 0; index < 2; index++) - { - sub_800D68C(index); - } - switch(mode) { + for (i = 0; i < 2; i++) + sub_800D68C(i); + + switch (mode) { case 0: case 1: sub_800D59C(data, sizeof(unkStruct_8035D94)); @@ -84,15 +245,14 @@ static void sub_8037C44(s32 mode, void *data) break; case 9: case 10: - sub_800D59C(data, 0xb4); + sub_800D59C(data, 0xB4); break; } } static void sub_8037CC4(s32 mode, void *param_2, void *param_3) { - switch(mode) - { + switch (mode) { case 0: case 1: sub_800D670(0, param_2, sizeof(unkStruct_8035D94)); @@ -112,13 +272,13 @@ static void sub_8037CC4(s32 mode, void *param_2, void *param_3) break; case 9: case 10: - sub_800D670(0, param_2, 180); - sub_800D670(1, param_3, 180); + sub_800D670(0, param_2, 0xB4); + sub_800D670(1, param_3, 0xB4); break; } } -// TODO: same as sub_80381F4 +// TODO: same as sub_80381F4. Try to fix this fakematch https://decomp.me/scratch/vkGqo s32 sub_8037D64(u32 mode, void *param_2, void *param_3) { u32 iVar2; @@ -171,8 +331,8 @@ static s32 sub_8037DF0(void) s32 iStack_c; linkStatus = COMMS_GOOD; - sub_800D670(0,&iStack_10,4); - sub_800D670(1,&iStack_c,4); + sub_800D670(0, &iStack_10, 4); + sub_800D670(1, &iStack_c, 4); if ((iStack_10 != 0) || (iStack_c != 0)) { linkStatus = (!sub_800D588()) ? iStack_c : iStack_10; if (linkStatus == COMMS_GOOD) { @@ -432,7 +592,7 @@ UNUSED static s32 sub_80381E8(u32 mode, void * param_2, void * param_3) return sub_803815C(mode, param_2, param_3); } -// TODO: clean this up +// TODO: clean this up... fix fakematch without gotos. see above funcs https://decomp.me/scratch/JGv2m s32 sub_80381F4(u32 mode, void *param_2, void *param_3) { u32 iVar2; diff --git a/src/thank_you_wonder_mail.c b/src/thank_you_wonder_mail.c index 3105d2c4e..88904ca54 100644 --- a/src/thank_you_wonder_mail.c +++ b/src/thank_you_wonder_mail.c @@ -221,7 +221,6 @@ extern void sub_802A828(); extern void sub_802A850(); extern void sub_8031E10(); extern void SetThankYouMailMenuState(u32); -extern s32 sub_8037B28(u32); extern u8 sub_800D588(void); extern u32 GetDungeonTeamRankPts(DungeonLocation *, u32); extern void sub_8031D70(u8, u32); diff --git a/src/trade_items_menu.c b/src/trade_items_menu.c index e0a8b4434..c1d971154 100644 --- a/src/trade_items_menu.c +++ b/src/trade_items_menu.c @@ -21,8 +21,6 @@ static EWRAM_DATA_2 struct TradeItemsMenu *sTradeItemsMenu = {0}; #include "data/trade_items_menu.h" -extern s32 sub_8037B28(u32); - void sub_8036F74(void); void sub_8036F30(); void TradeItem_AddItem(); diff --git a/src/unk_menu_203B360.c b/src/unk_menu_203B360.c index a9bcb5e2c..2a14e3a93 100644 --- a/src/unk_menu_203B360.c +++ b/src/unk_menu_203B360.c @@ -1,4 +1,5 @@ #include "global.h" +#include "globaldata.h" #include "constants/main_menu.h" #include "input.h" #include "main_menu1.h" diff --git a/src/wonder_mail.c b/src/wonder_mail.c index 2cb73970f..ff60e808a 100644 --- a/src/wonder_mail.c +++ b/src/wonder_mail.c @@ -39,7 +39,6 @@ extern u32 sub_8031DCC(); extern void sub_8031E10(); extern void sub_8031E00(); extern void sub_8031E10(void); -extern s32 sub_8037B28(u32); extern void sub_8031D70(u8, u32); extern u32 sub_8023CE8(void); extern void sub_8030F58(u32); diff --git a/src/wonder_mail_main_menu.c b/src/wonder_mail_main_menu.c index 1f6ec67d6..a095bbe58 100644 --- a/src/wonder_mail_main_menu.c +++ b/src/wonder_mail_main_menu.c @@ -74,7 +74,6 @@ extern void SetWonderMailMainMenuState(u8); extern void sub_8031E10(void); extern u8 sub_800D588(void); extern void sub_802EF48(void); -extern s32 sub_8037B28(u32); void PrintWonderMailMainMenuError(u32); void HandleWonderMailMainScreen(void); From d3652cf59b1fb899a6415e97e609cd83afd0afc5 Mon Sep 17 00:00:00 2001 From: Kermalis <29823718+Kermalis@users.noreply.github.com> Date: Wed, 4 Dec 2024 02:47:10 -0500 Subject: [PATCH 4/4] SpriteOAM memes --- asm/code_80130A8.s | 2 + include/code_800DAC0.h | 2 +- include/ground_sprite.h | 11 -- include/other_menus1.h | 6 +- include/sprite.h | 3 +- include/structs/menu.h | 2 +- include/{ => structs}/sprite_oam.h | 26 ++- include/structs/sprite_oam_temp.h | 293 +++++++++++++++++++++++++++++ src/code_8012A18_1.c | 2 +- src/code_803E724.c | 6 +- src/code_805D8C8_1.c | 4 +- src/code_8069E0C.c | 2 +- src/code_808333C.c | 2 +- src/dungeon_message.c | 8 +- src/menu_input.c | 7 +- src/other_menus1.c | 2 +- src/save_menu.c | 2 +- src/sprite.c | 4 +- src/string_format.c | 12 +- src/unk_menu_203B360.c | 2 +- 20 files changed, 352 insertions(+), 46 deletions(-) rename include/{ => structs}/sprite_oam.h (77%) create mode 100644 include/structs/sprite_oam_temp.h diff --git a/asm/code_80130A8.s b/asm/code_80130A8.s index afa6f039d..b5ff8020e 100644 --- a/asm/code_80130A8.s +++ b/asm/code_80130A8.s @@ -5,6 +5,7 @@ .text +@ SpriteOAM memes. Same as sub_8013F84 except instead of a 0x60 it's a 0x80 thumb_func_start sub_8013E54 sub_8013E54: push {r4-r6,lr} @@ -152,6 +153,7 @@ _08013F7C: .4byte 0x00003fff _08013F80: .4byte 0x00000fff thumb_func_end sub_8013E54 +@ SpriteOAM memes https://decomp.me/scratch/GROyH thumb_func_start sub_8013F84 sub_8013F84: push {r4-r6,lr} diff --git a/include/code_800DAC0.h b/include/code_800DAC0.h index efe6a6844..1f7f2288e 100644 --- a/include/code_800DAC0.h +++ b/include/code_800DAC0.h @@ -1,7 +1,7 @@ #ifndef GUARD_CODE_800DAC0_H #define GUARD_CODE_800DAC0_H -#include "ground_sprite.h" +#include "structs/sprite_oam.h" #include "structs/str_position.h" typedef struct unkStruct_80416E0 diff --git a/include/ground_sprite.h b/include/ground_sprite.h index 56ed89169..fdaf41da7 100644 --- a/include/ground_sprite.h +++ b/include/ground_sprite.h @@ -1,17 +1,6 @@ #ifndef GUARD_GROUND_SPRITE_H #define GUARD_GROUND_SPRITE_H -// size: 0xC -typedef struct unkStruct_2039DB0 -{ - u16 unk0; - s16 unk2; - u16 unk4; - u16 unk6; - u16 unk8; - u16 unkA; -} unkStruct_2039DB0; - // size: 0xC typedef struct unkStruct_3001B7C_sub0 { diff --git a/include/other_menus1.h b/include/other_menus1.h index 871a46715..9155b4c1e 100644 --- a/include/other_menus1.h +++ b/include/other_menus1.h @@ -1,12 +1,12 @@ #ifndef GUARD_OTHER_MENUS1_H #define GUARD_OTHER_MENUS1_H +#include "structs/menu.h" +#include "structs/sprite_oam.h" +#include "structs/str_text.h" #include "code_8094F88.h" #include "main_menu1.h" -#include "structs/menu.h" #include "pokemon.h" -#include "sprite_oam.h" -#include "structs/str_text.h" // size: 0x504 typedef struct unkStruct_203B35C diff --git a/include/sprite.h b/include/sprite.h index c5369d187..931d07408 100644 --- a/include/sprite.h +++ b/include/sprite.h @@ -2,9 +2,8 @@ #define GUARD_SPRITE_H #include "structs/axdata.h" -#include "ground_sprite.h" +#include "structs/sprite_oam.h" #include "structs/str_position.h" -#include "sprite_oam.h" // size: 0x8 typedef struct UnkSpriteLink diff --git a/include/structs/menu.h b/include/structs/menu.h index 90034c950..6a2ae4bcd 100644 --- a/include/structs/menu.h +++ b/include/structs/menu.h @@ -1,7 +1,7 @@ #ifndef GUARD_MENU_H #define GUARD_MENU_H -#include "sprite_oam.h" +#include "structs/sprite_oam.h" #include "structs/str_text.h" #include "structs/str_position.h" diff --git a/include/sprite_oam.h b/include/structs/sprite_oam.h similarity index 77% rename from include/sprite_oam.h rename to include/structs/sprite_oam.h index 06e2c20fb..7867e3a0e 100644 --- a/include/sprite_oam.h +++ b/include/structs/sprite_oam.h @@ -1,6 +1,18 @@ #ifndef GUARD_SPRITE_OAM_H #define GUARD_SPRITE_OAM_H +// size: 0xC +// This is probably used for blue/gold rescue team to convert from GBA OAM to their platform's OAM in AddSprite() +typedef struct unkStruct_2039DB0 +{ + u16 unk0; // SpriteOAM attrib1 mask + s16 unk2; // SpriteOAM attrib2 mask + u16 unk4; // SpriteOAM attrib3 mask + u16 unk6; // SpriteOAM attrib1 value + u16 unk8; // SpriteOAM attrib2 value + u16 unkA; // SpriteOAM attrib3 value +} unkStruct_2039DB0; + // size: 0x8. Similar to struct OamData but unk6 is not copied to OAM typedef struct SpriteOAM { @@ -10,7 +22,7 @@ typedef struct SpriteOAM /* 0x2 */ u16 attrib2; // tileNum:10 priority:2 paletteNum:4 /* 0x4 */ u16 attrib3; - // unk6_0:1 unk6_1:1 unk6_2:2? unk6_4:12 + // unk6_0:1 unk6_1:1 unk6_2:1 unk6_3:1 unk6_4:12 u16 unk6; } SpriteOAM; @@ -86,6 +98,18 @@ typedef struct SpriteOAM #define SPRITEOAM_SHIFT_UNK6_1 1 #define SPRITEOAM_MASK_UNK6_1 (SPRITEOAM_MAX_UNK6_1 << SPRITEOAM_SHIFT_UNK6_1) // ~ 0xFFFD +#define SPRITEOAM_MAX_UNK6_2 1 +#define SPRITEOAM_SHIFT_UNK6_2 2 +#define SPRITEOAM_MASK_UNK6_2 (SPRITEOAM_MAX_UNK6_2 << SPRITEOAM_SHIFT_UNK6_2) // ~ 0xFFFB + +/* Not seen yet +#define SPRITEOAM_MAX_UNK6_3 1 +#define SPRITEOAM_SHIFT_UNK6_3 3 +#define SPRITEOAM_MASK_UNK6_3 (SPRITEOAM_MAX_UNK6_3 << SPRITEOAM_SHIFT_UNK6_3) // ~ 0xFFF7 +*/ + +// Seems to be the "working" Y coord. Gets copied to attrib1's Y coord in `AddSprite()`. +// kermalis is too lazy to rename it atm since we're still figuring things out #define SPRITEOAM_MAX_UNK6_4 0xFFF #define SPRITEOAM_SHIFT_UNK6_4 4 #define SPRITEOAM_MASK_UNK6_4 (SPRITEOAM_MAX_UNK6_4 << SPRITEOAM_SHIFT_UNK6_4) // ~ 0xF diff --git a/include/structs/sprite_oam_temp.h b/include/structs/sprite_oam_temp.h new file mode 100644 index 000000000..7f014c53a --- /dev/null +++ b/include/structs/sprite_oam_temp.h @@ -0,0 +1,293 @@ +#ifndef GUARD_SPRITE_OAM_TEMP_H +#define GUARD_SPRITE_OAM_TEMP_H + +#include "sprite_oam.h" + +// This file is here for temporary decomp notes about SpriteOAM. It can be deleted later when we figure it out. +// SpriteOAM initialization is handled by inlines. Potentially has inlines for other scenarios [for example: AddSprite()] + +// There is lots of testing done and evidence that it most likely is not handled by macros. +// Some funcs (such as sub_8039174) can be fakematched with "{} while(0);" contexts and a temp var. Note that it's not a "do {} while(0)" but just a "{} while(0)". +// However, that does not work for most funcs, and does not produce some of the register preloading we get with inlines. +// Also, the inlines I (kermalis) have tested with DO produce the behavior we see in all of the funcs. It just doesn't match 100% yet. + +// Most of the special work seems to be done on the first two u16 of SpriteOAM. +// They are usually loaded/stored separately from the second half of the struct. +// There doesn't seem to be a logical reason for SpriteOAM to be split into two substructs, but the evidence points to it. +// AddSprite() still hasn't been matched (I'm writing this Dec 4 2024), because it suggests SpriteOAM is actually two separate substructs. +// "volatile u32/u16" was the first thing we tried, but it produces horrible asm and doesn't make sense for Chunsoft to have used it in this context. +// The main breakthrough came from producing 99% similar asm through attrib1/attrib2 being a substruct. + +// Proposed struct definition: +typedef struct SpriteOAM2_Sub1 +{ + u16 attrib1; + u16 attrib2; +} SpriteOAM2_Sub1; + +typedef struct SpriteOAM2_Sub2 +{ + u16 attrib3; + u16 unk6; +} SpriteOAM2_Sub2; + +typedef struct SpriteOAM2 +{ + SpriteOAM2_Sub1 unk0; + SpriteOAM2_Sub2 unk2; +} SpriteOAM2; +// (It's called SpriteOAM2 temporarily to avoid conflicts with the current one) + +// There seem to be 3 ways of handling SpriteOAM that I have found so far. +// #1 - When a SpriteOAM is initialized on the stack, certain inlines set its fields. This produces heavily inefficient asm but that's what they did. +// #2 - When a SpriteOAM is initialized from ram, it uses different inlines that produce way better asm. They're still known to be inlines because of the register preloading. +// #3 - Sometimes neither of the above 2's inlines are used for attrib1. It appears to be a third set of inlines (didn't attempt yet, feel free to). + +// For type #3, way more testing needs to be done. +// The thing is, in all 3 scenarios, an identical order of operations is usually applied. +// The asm being nearly identical each time also makes it unlikely to be done manually without some macros or inlines. +// And this is why we haven't "real" matched many (any?) SpriteOAM funcs in the years this decomp has existed. + +// Here are some helpful decomp.me links with examples. +// Type #1 - Main func (sub_8013F84) - Initializes a SpriteOAM on the stack [https://decomp.me/scratch/KYLmA] +// Type #2 - Complex fast init func (sub_8052FB8) - Loop func that initializes many SpriteOAM from ram [https://decomp.me/scratch/RX3cp] +// Type #3 - Fast init func (sub_8039174) - Initializes a SpriteOAM from ram [https://decomp.me/scratch/4qs37] + + + +// Type #1 attrib1 inlines: + +static inline void SetAttrib1(SpriteOAM2_Sub1 *sub, u32 attrib1) +{ + SpriteOAM2_Sub1 nSub = *sub; + nSub.attrib1 = attrib1; + *sub = nSub; + // The only issue with this is the fact that the "ldr" happens before the "0xFFFF0000" mask is loaded. + // The only way we have gotten the mask to load before the "ldr" is with something like this: + // *sub = (SpriteOAM2_Sub){ value, sub->attrib2 }; + // However, that produces bad asm. So the solution is to somehow make it a one liner like the above, while still loading from the entire "*sub" somehow. + // This func can also be changed to simply return a SpriteOAM2_Sub1 instead of replacing the value. + + // BTW, making a "{} while(0)" macro for this actually folds the constants together unlike this... which is more efficient asm. Not what we want for matching lol. + // Matching this will be a huge deal! +} + +static inline void SetAffineMode1(SpriteOAM2 *s, u32 mode1) +{ + u32 valueM = mode1 & SPRITEOAM_MAX_AFFINEMODE1; + u32 value = valueM << SPRITEOAM_SHIFT_AFFINEMODE1; + + SetAttrib1(&s->unk0, s->unk0.attrib1 & (u16)~SPRITEOAM_MASK_AFFINEMODE1); + SetAttrib1(&s->unk0, s->unk0.attrib1 | value); +} +static inline void SetAffineMode2(SpriteOAM2 *s, u32 mode2) +{ + u32 valueM = mode2 & SPRITEOAM_MAX_AFFINEMODE2; + u32 value = valueM << SPRITEOAM_SHIFT_AFFINEMODE2; + + SetAttrib1(&s->unk0, s->unk0.attrib1 & (u16)~SPRITEOAM_MASK_AFFINEMODE2); + SetAttrib1(&s->unk0, s->unk0.attrib1 | value); +} +static inline void SetObjMode(SpriteOAM2 *s, u32 mode) +{ + u32 valueM = mode & SPRITEOAM_MAX_OBJMODE; + u32 value = valueM << SPRITEOAM_SHIFT_OBJMODE; + + SetAttrib1(&s->unk0, s->unk0.attrib1 & (u16)~SPRITEOAM_MASK_OBJMODE); + SetAttrib1(&s->unk0, s->unk0.attrib1 | value); +} +static inline void SetMosaic(SpriteOAM2 *s, u32 mosaic) +{ + u32 valueM = mosaic & SPRITEOAM_MAX_MOSAIC; + u32 value = valueM << SPRITEOAM_SHIFT_MOSAIC; + + SetAttrib1(&s->unk0, s->unk0.attrib1 & (u16)~SPRITEOAM_MASK_MOSAIC); + SetAttrib1(&s->unk0, s->unk0.attrib1 | value); +} +static inline void SetBPP(SpriteOAM2 *s, u32 bpp) +{ + u32 valueM = bpp & SPRITEOAM_MAX_BPP; + u32 value = valueM << SPRITEOAM_SHIFT_BPP; + + SetAttrib1(&s->unk0, s->unk0.attrib1 & (u16)~SPRITEOAM_MASK_BPP); + SetAttrib1(&s->unk0, s->unk0.attrib1 | value); +} +static inline void SetShape(SpriteOAM2 *s, u32 shape) +{ + u32 valueM = shape & SPRITEOAM_MAX_SHAPE; + u32 value = valueM << SPRITEOAM_SHIFT_SHAPE; + + SetAttrib1(&s->unk0, s->unk0.attrib1 & (u16)~SPRITEOAM_MASK_SHAPE); + SetAttrib1(&s->unk0, s->unk0.attrib1 | value); +} + +// Type #2 attrib1 inlines: + +static inline void FastSetAffineMode1(SpriteOAM2 *s, u32 mode1) +{ + u32 value; + + value = mode1 & SPRITEOAM_MAX_AFFINEMODE1; + s->unk0.attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE1; + s->unk0.attrib1 |= value << SPRITEOAM_SHIFT_AFFINEMODE1; +} +static inline void FastSetAffineMode2(SpriteOAM2 *s, u32 mode2) +{ + u32 value; + + value = mode2 & SPRITEOAM_MAX_AFFINEMODE2; + s->unk0.attrib1 &= ~SPRITEOAM_MASK_AFFINEMODE2; + s->unk0.attrib1 |= value << SPRITEOAM_SHIFT_AFFINEMODE2; +} +static inline void FastSetObjMode(SpriteOAM2 *s, u32 mode) +{ + u32 value; + + value = mode & SPRITEOAM_MAX_OBJMODE; + s->unk0.attrib1 &= ~SPRITEOAM_MASK_OBJMODE; + s->unk0.attrib1 |= value << SPRITEOAM_SHIFT_OBJMODE; +} +static inline void FastSetMosaic(SpriteOAM2 *s, u32 mosaic) +{ + u32 value; + + value = mosaic & SPRITEOAM_MAX_MOSAIC; + s->unk0.attrib1 &= ~SPRITEOAM_MASK_MOSAIC; + s->unk0.attrib1 |= value << SPRITEOAM_SHIFT_MOSAIC; +} +static inline void FastSetBPP(SpriteOAM2 *s, u32 bpp) +{ + u32 value; + + value = bpp & SPRITEOAM_MAX_BPP; + s->unk0.attrib1 &= ~SPRITEOAM_MASK_BPP; + s->unk0.attrib1 |= value << SPRITEOAM_SHIFT_BPP; +} +static inline void FastSetShape(SpriteOAM2 *s, u32 shape) +{ + u32 value; + + value = shape & SPRITEOAM_MAX_SHAPE; + s->unk0.attrib1 &= ~SPRITEOAM_MASK_SHAPE; + s->unk0.attrib1 |= value << SPRITEOAM_SHIFT_SHAPE; +} + +// attrib2 inlines: +// These pretty much match in every scenario. +// Trying to macro-ify or make a sub-inline will remove some register preloading we rely on. + +static inline void SetX(SpriteOAM2 *s, u32 x) +{ + u32 value; + u32 valueS; + + value = x & SPRITEOAM_MAX_X; + valueS = value << SPRITEOAM_SHIFT_X; + s->unk0.attrib2 &= ~SPRITEOAM_MASK_X; + s->unk0.attrib2 |= valueS; +} + +static inline void SetMatrixNum(SpriteOAM2 *s, u32 matNum) +{ + u32 value; + u32 valueS; + + value = matNum & SPRITEOAM_MAX_MATRIXNUM; + valueS = value << SPRITEOAM_SHIFT_MATRIXNUM; + s->unk0.attrib2 &= ~SPRITEOAM_MASK_MATRIXNUM; + s->unk0.attrib2 |= valueS; +} + +static inline void SetSize(SpriteOAM2 *s, u32 size) +{ + u32 value; + u32 valueS; + + value = size & SPRITEOAM_MAX_SIZE; + valueS = value << SPRITEOAM_SHIFT_SIZE; + s->unk0.attrib2 &= ~SPRITEOAM_MASK_SIZE; + s->unk0.attrib2 |= valueS; +} + +// attrib3 inline: +// For some reason this one is all combined. Also matches pretty much every time. +// It's possible the attrib1 ones are also combined like this, but not the attrib2 ones since they're called out of order or not at all. +// And just like the attrib2 inlines, attempting to macro or inline further results in removed preloading. + +static inline void SetAttrib3(SpriteOAM2 *s, u32 tileNum, u32 prio, u32 palNum) +{ + u32 value; + u32 valueS; + + value = tileNum & SPRITEOAM_MAX_TILENUM; + valueS = value << SPRITEOAM_SHIFT_TILENUM; + s->unk2.attrib3 &= ~SPRITEOAM_MASK_TILENUM; + s->unk2.attrib3 |= valueS; + + value = prio & SPRITEOAM_MAX_PRIORITY; + valueS = value << SPRITEOAM_SHIFT_PRIORITY; + s->unk2.attrib3 &= ~SPRITEOAM_MASK_PRIORITY; + s->unk2.attrib3 |= valueS; + + value = palNum & SPRITEOAM_MAX_PALETTENUM; + valueS = value << SPRITEOAM_SHIFT_PALETTENUM; + s->unk2.attrib3 &= ~SPRITEOAM_MASK_PALETTENUM; + s->unk2.attrib3 |= valueS; +} + +// unk6 inlines: +// Basically same situation as attrib2 inlines. Can't be altered past this or combined, and matches like this. + +static inline void SetUnk6_0(SpriteOAM2 *s, u32 part0) +{ + u32 value; + u32 valueS; + + value = part0 & SPRITEOAM_MAX_UNK6_0; + valueS = value << SPRITEOAM_SHIFT_UNK6_0; + s->unk2.unk6 &= ~SPRITEOAM_MASK_UNK6_0; + s->unk2.unk6 |= valueS; +} +static inline void SetUnk6_1(SpriteOAM2 *s, u32 part1) +{ + u32 value; + u32 valueS; + + value = part1 & SPRITEOAM_MAX_UNK6_1; + valueS = value << SPRITEOAM_SHIFT_UNK6_1; + s->unk2.unk6 &= ~SPRITEOAM_MASK_UNK6_1; + s->unk2.unk6 |= valueS; +} +static inline void SetUnk6_2(SpriteOAM2 *s, u32 part2) +{ + u32 value; + u32 valueS; + + value = part2 & SPRITEOAM_MAX_UNK6_2; + valueS = value << SPRITEOAM_SHIFT_UNK6_2; + s->unk2.unk6 &= ~SPRITEOAM_MASK_UNK6_2; + s->unk2.unk6 |= valueS; +} +// Not seen yet +/*static inline void SetUnk6_3(SpriteOAM2 *s, u32 part3) +{ + u32 value; + u32 valueS; + + value = part3 & SPRITEOAM_MAX_UNK6_3; + valueS = value << SPRITEOAM_SHIFT_UNK6_3; + s->unk2.unk6 &= ~SPRITEOAM_MASK_UNK6_3; + s->unk2.unk6 |= valueS; +}*/ +static inline void SetUnk6_4(SpriteOAM2 *s, u32 part4) +{ + u32 value; + u32 valueS; + + value = part4 & SPRITEOAM_MAX_UNK6_4; + valueS = value << SPRITEOAM_SHIFT_UNK6_4; + s->unk2.unk6 &= ~SPRITEOAM_MASK_UNK6_4; + s->unk2.unk6 |= valueS; +} + +#endif // GUARD_SPRITE_OAM_TEMP_H \ No newline at end of file diff --git a/src/code_8012A18_1.c b/src/code_8012A18_1.c index cc7070598..b73c00b26 100644 --- a/src/code_8012A18_1.c +++ b/src/code_8012A18_1.c @@ -1,6 +1,6 @@ #include "global.h" #include "code_8012A18_1.h" -#include "sprite_oam.h" +#include "structs/sprite_oam.h" #include "text_util.h" #include "text2.h" diff --git a/src/code_803E724.c b/src/code_803E724.c index 265015a1e..2f80e0cc0 100644 --- a/src/code_803E724.c +++ b/src/code_803E724.c @@ -410,9 +410,9 @@ void sub_803EDF0(void) gUnknown_202EDDC.attrib3 &= ~SPRITEOAM_MASK_PALETTENUM; gUnknown_202EDDC.attrib3 |= palNum; - gUnknown_202EDDC.unk6 &= 0xFFFE; - gUnknown_202EDDC.unk6 &= 0xFFFD; - gUnknown_202EDDC.unk6 &= 0xFFFB; + gUnknown_202EDDC.unk6 &= ~SPRITEOAM_MASK_UNK6_0; + gUnknown_202EDDC.unk6 &= ~SPRITEOAM_MASK_UNK6_1; + gUnknown_202EDDC.unk6 &= ~SPRITEOAM_MASK_UNK6_2; AddSprite(&gUnknown_202EDDC, 0x100, NULL, NULL); } diff --git a/src/code_805D8C8_1.c b/src/code_805D8C8_1.c index 1fb12e6c4..706417e83 100644 --- a/src/code_805D8C8_1.c +++ b/src/code_805D8C8_1.c @@ -626,9 +626,9 @@ struct UnkStruct_8106AE8 extern const struct UnkStruct_8106AE8 gUnknown_8106AE8[]; #ifdef NONMATCHING -// Not even close in terms of matching, but functionally equivalent. Sprite OAM memes break the stack here. +// Sprite OAM memes. https://decomp.me/scratch/Jm4oC // Creates arrow sprites which are used when in rotate or diagonal modes. -static void TryCreateModeArrows(Entity *leader) // https://decomp.me/scratch/gFX1S +static void TryCreateModeArrows(Entity *leader) { UnkDungeonGlobal_unk181E8_sub *unkPtr = &gDungeon->unk181e8; diff --git a/src/code_8069E0C.c b/src/code_8069E0C.c index ffe3ae31e..8401382e9 100644 --- a/src/code_8069E0C.c +++ b/src/code_8069E0C.c @@ -2310,7 +2310,7 @@ void sub_806C51C(Entity *entity) finalYSprite = ySprite + spriteStructPtr->y; finalYSprite &= SPRITEOAM_MAX_UNK6_4; finalYSprite <<= SPRITEOAM_SHIFT_UNK6_4; - spriteStructPtr->sprite.unk6 &= 0xF; + spriteStructPtr->sprite.unk6 &= ~SPRITEOAM_MASK_UNK6_4; spriteStructPtr->sprite.unk6 |= finalYSprite; AddSprite(&spriteStructPtr->sprite, 0, NULL, NULL); diff --git a/src/code_808333C.c b/src/code_808333C.c index 068a3e1e1..863723cfe 100644 --- a/src/code_808333C.c +++ b/src/code_808333C.c @@ -19,7 +19,7 @@ bool8 sub_8083568(s32 inX, s32 inY, u8 index) finalYSprite = y + gUnknown_202ED28[0][index].y; finalYSprite &= SPRITEOAM_MAX_UNK6_4; finalYSprite <<= SPRITEOAM_SHIFT_UNK6_4; - gUnknown_202ED28[0][index].sprite.unk6 &= 0xF; + gUnknown_202ED28[0][index].sprite.unk6 &= ~SPRITEOAM_MASK_UNK6_4; gUnknown_202ED28[0][index].sprite.unk6 |= finalYSprite; AddSprite(&gUnknown_202ED28[0][index].sprite, 0, NULL, NULL); diff --git a/src/dungeon_message.c b/src/dungeon_message.c index 610caeb7f..f36fdac1b 100644 --- a/src/dungeon_message.c +++ b/src/dungeon_message.c @@ -796,7 +796,7 @@ void sub_8052FB8(const u8 *str) sUnknown_202F1F0.attrib3 |= palNum; unk6 = 0x78 << SPRITEOAM_SHIFT_UNK6_4; - sUnknown_202F1F0.unk6 &= mask; + sUnknown_202F1F0.unk6 &= mask; // ~SPRITEOAM_MASK_UNK6_4 sUnknown_202F1F0.unk6 |= unk6; sUnknown_202F1F0.attrib2 &= ~SPRITEOAM_MASK_X; @@ -1103,13 +1103,13 @@ static void CreateMessageLogArrow(bool8 upArrow, s32 y) sMessageLogArrowSpriteOAM.attrib2 &= ~SPRITEOAM_MASK_MATRIXNUM; sMessageLogArrowSpriteOAM.attrib2 |= matrixNum; - mask = 0xF; - yMask = 0xFFF; + mask = 0xF; // ~SPRITEOAM_MASK_UNK6_4 + yMask = SPRITEOAM_MAX_UNK6_4; ySprite = (yMask & (unkStr->unk2 * 8 + y)) << 4; sMessageLogArrowSpriteOAM.unk6 &= mask; sMessageLogArrowSpriteOAM.unk6 |= ySprite; - xSprite = 0x1FF & ((unkStr->unk0 * 8) + 92); + xSprite = SPRITEOAM_MAX_X & ((unkStr->unk0 * 8) + 92); sMessageLogArrowSpriteOAM.attrib2 &= ~SPRITEOAM_MASK_X; sMessageLogArrowSpriteOAM.attrib2 |= xSprite; diff --git a/src/menu_input.c b/src/menu_input.c index 76e07ac0e..35fdbf979 100644 --- a/src/menu_input.c +++ b/src/menu_input.c @@ -616,7 +616,7 @@ void AddMenuCursorSprite_(MenuInputStruct *a0, u8 *a1) UpdateMenuCursorSpriteCoords(a0); if (!(a0->unk24 & 8)) { - #ifdef NONMATCHING // SpriteOAM memes https://decomp.me/scratch/T9aXl TODO: Match like sub_8039174 with multiple vars and while(0) + #ifdef NONMATCHING // SpriteOAM memes https://decomp.me/scratch/T9aXl u32 tmp, tmp2; #else register u32 tmp asm("r0"), tmp2 asm("r1"); @@ -688,12 +688,11 @@ void nullsub_34(MenuInputStructSub *a0, s32 a1) { } -// Maybe DungeonPos static void sub_801332C(DungeonPos *a0) { SpriteOAM sp = {}; SpriteOAM* ptr; - #ifdef NONMATCHING // SpriteOAM memes https://decomp.me/scratch/zeLxS TODO: Match like sub_8039174 with multiple vars and while(0) + #ifdef NONMATCHING // SpriteOAM memes https://decomp.me/scratch/zeLxS u32 r0, r1, r2; #else register u32 r0 asm("r0"); @@ -762,7 +761,7 @@ static void sub_801332C(DungeonPos *a0) static void sub_8013470(MenuInputStruct *a0) { SpriteOAM sp = {}; - #ifdef NONMATCHING // SpriteOAM memes https://decomp.me/scratch/70Ieb TODO: Match like sub_8039174 with multiple vars and while(0) + #ifdef NONMATCHING // SpriteOAM memes https://decomp.me/scratch/70Ieb SpriteOAM *ptr; u32 r0, r1, r5; #else diff --git a/src/other_menus1.c b/src/other_menus1.c index e5fa64de4..1285186c7 100644 --- a/src/other_menus1.c +++ b/src/other_menus1.c @@ -333,7 +333,7 @@ static void sub_8037400(void) static void sub_80376CC(void) { -#ifdef NONMATCHING // SpriteOAM memes. TODO: Match like sub_8039174 with multiple vars and while(0) +#ifdef NONMATCHING // SpriteOAM memes u32 r0; u32 r2; #else diff --git a/src/save_menu.c b/src/save_menu.c index 8bf7559fb..bb5e87815 100644 --- a/src/save_menu.c +++ b/src/save_menu.c @@ -266,7 +266,7 @@ s32 UpdateSaveMenu(void) void sub_8038830(void) { -#ifdef NONMATCHING // SpriteOAM memes. TODO: Match like sub_8039174 with multiple vars and while(0) +#ifdef NONMATCHING // SpriteOAM memes u32 r0; u32 r2; #else diff --git a/src/sprite.c b/src/sprite.c index 0b54ca523..32ebc13d5 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -149,7 +149,7 @@ void ResetSprites(bool8 a0) void sub_8004E8C(unkStruct_2039DB0 *a0) { a0->unk0 = 0xFFFF; - a0->unk2 = -1; + a0->unk2 = 0xFFFF; a0->unk4 = 0xFFFF; a0->unk6 = 0; a0->unk8 = 0; @@ -557,7 +557,7 @@ void AddSprite(SpriteOAM *a0, s32 a1, UnkSpriteMem *a2, unkStruct_2039DB0 *a3) spr->unk6 = a0->unk6; } - yPos = spr->unk6 / 16; + yPos = spr->unk6 >> SPRITEOAM_SHIFT_UNK6_4; nullsub_3(yPos, 0); yPos &= SPRITEOAM_MAX_Y; spr->attrib1 &= ~SPRITEOAM_MASK_Y; diff --git a/src/string_format.c b/src/string_format.c index 522ec0052..d28b81e20 100644 --- a/src/string_format.c +++ b/src/string_format.c @@ -517,21 +517,21 @@ void DrawDialogueBoxString(void) sDialogueBoxArrowSprite.attrib3 |= palNum; if (sUnknownTextFlags & 0x10) { - u32 var = 0x780; - sDialogueBoxArrowSprite.unk6 &= 0xF; + u32 var = (0x78 & SPRITEOAM_MAX_UNK6_4) << SPRITEOAM_SHIFT_UNK6_4; + sDialogueBoxArrowSprite.unk6 &= ~SPRITEOAM_MASK_UNK6_4; sDialogueBoxArrowSprite.unk6 |= var; sDialogueBoxArrowSprite.attrib2 &= ~SPRITEOAM_MASK_X; - sDialogueBoxArrowSprite.attrib2 |= 0x70; + sDialogueBoxArrowSprite.attrib2 |= (0x70 & SPRITEOAM_MAX_X) << SPRITEOAM_SHIFT_X; } else { s16 x; - u32 var = ((gUnknown_202E748.unkA + 1) & 0xFFF) << 4; - sDialogueBoxArrowSprite.unk6 &= 0xF; + u32 var = ((gUnknown_202E748.unkA + 1) & SPRITEOAM_MAX_UNK6_4) << SPRITEOAM_SHIFT_UNK6_4; + sDialogueBoxArrowSprite.unk6 &= ~SPRITEOAM_MASK_UNK6_4; sDialogueBoxArrowSprite.unk6 |= var; x = gUnknown_202E748.unk8; sDialogueBoxArrowSprite.attrib2 &= ~SPRITEOAM_MASK_X; - sDialogueBoxArrowSprite.attrib2 |= x & 0x1FF; + sDialogueBoxArrowSprite.attrib2 |= (x & SPRITEOAM_MAX_X) << SPRITEOAM_SHIFT_X; } AddSprite(&sDialogueBoxArrowSprite, 0x100, NULL, NULL); diff --git a/src/unk_menu_203B360.c b/src/unk_menu_203B360.c index 2a14e3a93..833aa84ef 100644 --- a/src/unk_menu_203B360.c +++ b/src/unk_menu_203B360.c @@ -127,7 +127,7 @@ u32 sub_80383D4(void) void sub_8038440(void) { -#ifdef NONMATCHING // SpriteOAM memes. TODO: Match like sub_8039174 with multiple vars and while(0) +#ifdef NONMATCHING // SpriteOAM memes u32 r0; u32 r2; #else