From 1a3f9e05d33ca8c5010f8f35669299a8b760dd49 Mon Sep 17 00:00:00 2001 From: Lemeon <66488505+ThothWhatsThis@users.noreply.github.com> Date: Sun, 21 Jan 2024 22:07:40 +0100 Subject: [PATCH] Patch 1 (#692) * True Match sub_080A5F48 matched sub_080A5F48 using typecast on Div. * True Match DrawChargeBar Matched DrawChargeBar using typecast on Div * Update ui.c changed gUnk_0200AF00 to gHUD. this change is not yet in the repo, which the nonmatch website uses * Update ui.c changes to how my code looks * Update ui.c ; * Update pauseMenu.c * Update ui.c * Update ui.c whitespace... * Update pauseMenu.c fighting with the lint system * Update ui.c that should be the right format now --- src/menu/pauseMenu.c | 61 +++++++++++++++++++-------------- src/ui.c | 81 +++++++++++++++++++++++++------------------- 2 files changed, 82 insertions(+), 60 deletions(-) diff --git a/src/menu/pauseMenu.c b/src/menu/pauseMenu.c index 3877c6893..8e0cfadff 100644 --- a/src/menu/pauseMenu.c +++ b/src/menu/pauseMenu.c @@ -1232,15 +1232,26 @@ bool32 sub_080A5F24(void) { return result; } -void sub_080A5F48(Item item, u32 param_2) { - extern u32 gSprite_082E68F4[]; - u32 ammoCount; - u32 tensDigit; - u8* puVar2; - u32 temp1; +typedef union { + struct { + s32 v1; + s32 v2; + } values; + u64 raw; +} DoubleReturnValue; + +void sub_080A5F48(Item item, u32 offset) { + // this funcitons signature allows the div function to return a u64 (2x 32 bit registers) + // with the result in one register and the remainder in the other + typedef u64 DivRem(u32, u32); + + s32 ammoCount; + s32 onesDigit; + s32 tensDigit; + void* dest; u16* temp2; - u32 temp3; - register u32 rem asm("r1"); + u32 index; + DoubleReturnValue ret; switch (item) { case ITEM_BOTTLE1: @@ -1248,17 +1259,14 @@ void sub_080A5F48(Item item, u32 param_2) { case ITEM_BOTTLE3: case ITEM_BOTTLE4: item = gSave.stats.bottles[item - ITEM_BOTTLE1]; - break; - default: - break; } - temp1 = param_2 * 0x20 + 0x6010000; - temp3 = gSpriteAnimations_322[item]->index; - temp2 = &gMoreSpritePtrs[1][temp3 * 2]; - DmaCopy32(3, &gMoreSpritePtrs[2][temp2[1] * 0x10], temp1, 0x40 * 4); - ammoCount = -1; + dest = OBJ_VRAM0 + (offset * 0x20); + index = gSpriteAnimations_322[item]->index; + temp2 = &gMoreSpritePtrs[1][index * 2]; + DmaCopy32(3, &gMoreSpritePtrs[2][temp2[1] * 0x10], dest, 0x40 * 4); + ammoCount = -1; switch (item) { case 7: case 8: @@ -1270,15 +1278,18 @@ void sub_080A5F48(Item item, u32 param_2) { break; } - if (-1 < (int)ammoCount) { - tensDigit = Div(ammoCount, 10); - item = rem; - if ((int)tensDigit >= 10) { - tensDigit = 9; - } - DmaCopy32(3, gUnk_085C4620 + tensDigit * 0x8, temp1, 0x8 * 4); - DmaCopy32(3, gUnk_085C4620 + (item + 10) * 0x8, temp1 + 0x20, 0x8 * 4); - } + if (ammoCount < 0) + return; + + ret.raw = ((DivRem*)Div)(ammoCount, 10); // by casting to DivRem, we can recover the remainder from the Div call + onesDigit = ret.values.v2; + tensDigit = ret.values.v1; + + if (tensDigit >= 10) + tensDigit = 9; + + DmaCopy32(3, gUnk_085C4620 + tensDigit * 0x8, dest, 0x8 * 4); + DmaCopy32(3, gUnk_085C4620 + (onesDigit + 10) * 0x8, dest + 0x20, 0x8 * 4); } void PauseMenu_Screen_7(void) { diff --git a/src/ui.c b/src/ui.c index e1c17292e..ac66ddcf7 100644 --- a/src/ui.c +++ b/src/ui.c @@ -440,43 +440,52 @@ void EraseChargeBar(void) { } } +typedef union { + u32 values[2]; + u64 raw; +} returnValues; + +typedef u64 DivRem(u32, u32); + void DrawChargeBar(void) { bool32 tmp1; - u16* ptr1; - u32 tmp2; - u32 tmp3; - register u32 rem asm("r1"); - u32 tmp5; + u16* BufferPos; + returnValues ret; + // these names are almost certainly inaccurate + u32 chargeTime; + u32 chargeState; + u32 chargeFrame; tmp1 = FALSE; - if ((gHUD.hideFlags & HUD_HIDE_CHARGE_BAR) == 0) { + if (!(gHUD.hideFlags & HUD_HIDE_CHARGE_BAR)) tmp1 = gPlayerState.chargeState.action != 0; + if (!tmp1) { + EraseChargeBar(); + return; } + if (gHUD.maxHealth > 10 * 4) + BufferPos = &gBG0Buffer[0x60]; + else + BufferPos = &gBG0Buffer[0x40]; - if (!tmp1) - return EraseChargeBar(); - - if (gHUD.maxHealth > 10 * 4) { - ptr1 = &gBG0Buffer[0x60]; - } else { - ptr1 = &gBG0Buffer[0x40]; - } + chargeTime = Div(gPlayerState.chargeState.chargeTimer + 19, 20); + if (chargeTime > 40) + chargeTime = 40; - tmp2 = Div(gPlayerState.chargeState.chargeTimer + 19, 20); - if (tmp2 > 40) { - tmp2 = 40; - } - if (gHUD.unk_6 == 0 || gHUD.unk_7 != tmp2) { + if (gHUD.unk_6 == 0 || gHUD.unk_7 != chargeTime) { gHUD.unk_6 = 1; - gHUD.unk_7 = tmp2; - tmp3 = Div(tmp2, 4); - tmp5 = rem; - ptr1[0] = 0xf016; - ptr1[11] = 0xf416; - DmaSet(3, gUnk_080C8F54 + (10 - tmp3), ptr1 + 1, 0x8000000a); - if (tmp5 != 0) { - ptr1[tmp3 + 1] = ((tmp5 + 0x17U) & 0x3ff) | 0xf000; - } + gHUD.unk_7 = chargeTime; + + // this calls Div and returns the result in ret.values[0] and the remainder in ret.values[1] + ret.raw = ((DivRem*)&Div)(chargeTime, 4); + chargeState = ret.values[0]; + chargeFrame = ret.values[1]; + + BufferPos[0] = 0xf016; + BufferPos[11] = 0xf416; + DmaSet(3, &gUnk_080C8F54[10 - chargeState], BufferPos + 1, 0x8000000a); + if (chargeFrame != 0) + BufferPos[chargeState + 1] = ((chargeFrame + 0x17U) & 0x3ff) | 0xf000; gScreen.bg0.updated = 1; } @@ -484,18 +493,20 @@ void DrawChargeBar(void) { case 4: case 5: gHUD.unk_9 += (gPlayerState.chargeState.action == 4) ? 2 : 1; - tmp3 = gHUD.unk_9 >> 4 & 3; + chargeState = gHUD.unk_9 >> 4 & 3; break; default: - tmp3 = 0; + chargeState = 0; break; } - if (tmp3 != gHUD.unk_8) { - gHUD.unk_8 = tmp3; - ptr1 = (u16*)0x600c2c0; - DmaSet(3, gUnk_080C8F7C[tmp3], ptr1, 0x84000030); - } + if (chargeState == gHUD.unk_8) + return; + + gHUD.unk_8 = chargeState; + + BufferPos = (u16*)(VRAM + 0xc2c0); + DmaSet(3, gUnk_080C8F7C[chargeState], BufferPos, 0x84000030); } void DrawKeys(void) {