diff --git a/src/menu/pauseMenu.c b/src/menu/pauseMenu.c index 8e0cfadff..940ed7875 100644 --- a/src/menu/pauseMenu.c +++ b/src/menu/pauseMenu.c @@ -1232,26 +1232,14 @@ bool32 sub_080A5F24(void) { return result; } -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 index; - DoubleReturnValue ret; + union SplitDWord divRem; switch (item) { case ITEM_BOTTLE1: @@ -1281,9 +1269,9 @@ void sub_080A5F48(Item item, u32 offset) { 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; + divRem = DivAndMod(ammoCount, 10); + onesDigit = divRem.HALF.HI; + tensDigit = divRem.HALF.LO; if (tensDigit >= 10) tensDigit = 9; diff --git a/src/ui.c b/src/ui.c index ac66ddcf7..8c529f575 100644 --- a/src/ui.c +++ b/src/ui.c @@ -113,18 +113,26 @@ void sub_0801C25C(void) { } } -void sub_0801C2F0(u32 param_1, u32 param_2) { - u32 uVar1; - register u32 rem asm("r1"); - param_1 = param_1 * 0x20 + 0x6010000; +void sub_0801C2F0(u32 dest, u32 param_2) { + u32 tensDigit; +#ifdef NON_MATCHING + u32 onesDigit; + union SplitDWord divRem; +#else + FORCE_REGISTER(u32 onesDigit, r1); + FORCE_REGISTER(union SplitDWord divRem, r0); +#endif - uVar1 = Div(param_2, 10); - if (uVar1 > 9) { - uVar1 = 9; - } + dest = dest * 0x20 + 0x6010000; + divRem = DivAndMod(param_2, 10); + onesDigit = divRem.HALF_U.HI; + tensDigit = divRem.HALF_U.LO; + + if (tensDigit >= 10) + tensDigit = 9; - DmaCopy32(3, (gUnk_085C4620 + uVar1 * 8), param_1, 0x8 * 4); - DmaCopy32(3, (gUnk_085C4620 + (rem + 10) * 8), param_1 + 0x20, 0x8 * 4); + DmaCopy32(3, gUnk_085C4620 + tensDigit * 0x8, dest, 0x8 * 4); + DmaCopy32(3, gUnk_085C4620 + (onesDigit + 10) * 0x8, dest + 0x20, 0x8 * 4); } void DrawUI(void) { @@ -277,7 +285,11 @@ void RenderDigits(u32 iconVramIndex, u32 count, u32 isTextYellow, u32 digits) { u32 digit; vu32* ptr; vu32* ptr2; - register u32 r1 asm("r1"); +#ifdef NON_MATCHING + union SplitDWord divRem; +#else + FORCE_REGISTER(union SplitDWord divRem, r0); +#endif puVar4 = RupeeKeyDigits; if (isTextYellow == 0) { @@ -287,13 +299,15 @@ void RenderDigits(u32 iconVramIndex, u32 count, u32 isTextYellow, u32 digits) { iVar2 = iVar3 + 0x600c000; switch (digits) { case 3: - digit = Div(count, 100); - count = r1; + divRem = DivAndMod(count, 100); + digit = divRem.HALF_U.LO; + count = divRem.HALF_U.HI; DmaCopy32(3, puVar4 + digit * 0x40, iVar2, 0x10 * 4); iVar2 += 0x40; case 2: - digit = Div(count, 10); - count = r1; + divRem = DivAndMod(count, 10); + digit = divRem.HALF_U.LO; + count = divRem.HALF_U.HI; DmaCopy32(3, puVar4 + digit * 0x40, iVar2, 0x10 * 4); iVar2 += 0x40; } @@ -440,21 +454,14 @@ void EraseChargeBar(void) { } } -typedef union { - u32 values[2]; - u64 raw; -} returnValues; - -typedef u64 DivRem(u32, u32); - void DrawChargeBar(void) { bool32 tmp1; u16* BufferPos; - returnValues ret; // these names are almost certainly inaccurate u32 chargeTime; u32 chargeState; u32 chargeFrame; + union SplitDWord divRem; tmp1 = FALSE; if (!(gHUD.hideFlags & HUD_HIDE_CHARGE_BAR)) @@ -476,10 +483,9 @@ void DrawChargeBar(void) { gHUD.unk_6 = 1; 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]; + divRem = DivAndMod(chargeTime, 4); + chargeState = divRem.HALF_U.LO; + chargeFrame = divRem.HALF_U.HI; BufferPos[0] = 0xf016; BufferPos[11] = 0xf416;