summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/menu/pauseMenu.c20
-rw-r--r--src/ui.c60
2 files changed, 37 insertions, 43 deletions
diff --git a/src/menu/pauseMenu.c b/src/menu/pauseMenu.c
index 8e0cfadf..940ed787 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 ac66ddcf..8c529f57 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;