summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsceptillion <33798691+sceptillion@users.noreply.github.com>2017-12-11 10:14:59 -0800
committersceptillion <33798691+sceptillion@users.noreply.github.com>2017-12-11 10:14:59 -0800
commit87ef770ca23875a9b4777bff7b07c2093a1df1b2 (patch)
tree23e4dbf13078674c809b46083871c62e4c7c732b
parent041c0891d8516a4c6a60652347ce77de996edb1d (diff)
decompile util
-rw-r--r--asm/util.s156
-rw-r--r--include/util.h10
-rw-r--r--ld_script.txt2
-rw-r--r--src/util.c87
4 files changed, 98 insertions, 157 deletions
diff --git a/asm/util.s b/asm/util.s
deleted file mode 100644
index 3b3f95a..0000000
--- a/asm/util.s
+++ /dev/null
@@ -1,156 +0,0 @@
- .include "constants/gba_constants.inc"
- .include "asm/macros.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start ReverseString
-ReverseString:
- push {r4,r5,lr}
- adds r3, r0, 0
- subs r4, r1, 0x1
- adds r2, r3, r4
- movs r5, 0
- cmp r5, r4
- bge _08004566
-_08004552:
- ldrb r1, [r3]
- ldrb r0, [r2]
- strb r0, [r3]
- adds r3, 0x1
- strb r1, [r2]
- subs r2, 0x1
- adds r5, 0x1
- subs r4, 0x1
- cmp r5, r4
- blt _08004552
-_08004566:
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end ReverseString
-
- thumb_func_start ConvertToDecimal
-ConvertToDecimal:
- push {r4-r7,lr}
- adds r4, r1, 0
- cmp r4, 0
- ble _08004578
- movs r7, 0x1
- b _0800457E
-_08004578:
- negs r4, r4
- movs r7, 0x1
- negs r7, r7
-_0800457E:
- cmp r2, 0
- ble _080045A0
- adds r6, r0, 0
- adds r5, r2, 0
-_08004586:
- adds r0, r4, 0
- movs r1, 0xA
- bl __modsi3
- stm r6!, {r0}
- adds r0, r4, 0
- movs r1, 0xA
- bl __divsi3
- adds r4, r0, 0
- subs r5, 0x1
- cmp r5, 0
- bne _08004586
-_080045A0:
- adds r0, r7, 0
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end ConvertToDecimal
-
- thumb_func_start ConvertFromDecimal
-ConvertFromDecimal:
- push {r4,r5,lr}
- adds r4, r0, 0
- adds r5, r1, 0
- ldm r4!, {r1}
- movs r3, 0xA
- cmp r2, 0x1
- ble _080045CA
- subs r2, 0x1
-_080045B8:
- ldm r4!, {r0}
- muls r0, r3
- adds r1, r0
- subs r2, 0x1
- lsls r0, r3, 2
- adds r0, r3
- lsls r3, r0, 1
- cmp r2, 0
- bne _080045B8
-_080045CA:
- adds r0, r1, 0
- cmp r5, 0
- bge _080045D2
- negs r0, r0
-_080045D2:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end ConvertFromDecimal
-
- thumb_func_start ConvertFromBCD
-ConvertFromBCD:
- push {r4,lr}
- adds r1, r0, 0
- movs r2, 0x1
- movs r3, 0
- cmp r1, 0
- ble _080045FA
- movs r4, 0xF
-_080045E6:
- adds r0, r1, 0
- ands r0, r4
- muls r0, r2
- adds r3, r0
- lsls r0, r2, 2
- adds r0, r2
- lsls r2, r0, 1
- asrs r1, 4
- cmp r1, 0
- bgt _080045E6
-_080045FA:
- adds r0, r3, 0
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end ConvertFromBCD
-
- thumb_func_start ConvertToBCD
-ConvertToBCD:
- push {r4-r6,lr}
- adds r4, r0, 0
- movs r5, 0
- movs r6, 0
- cmp r4, 0
- ble _0800462C
-_08004610:
- adds r0, r4, 0
- movs r1, 0xA
- bl __modsi3
- lsls r0, r5
- adds r6, r0
- adds r5, 0x4
- adds r0, r4, 0
- movs r1, 0xA
- bl __divsi3
- adds r4, r0, 0
- cmp r4, 0
- bgt _08004610
-_0800462C:
- adds r0, r6, 0
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end ConvertToBCD
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/include/util.h b/include/util.h
new file mode 100644
index 0000000..3da2beb
--- /dev/null
+++ b/include/util.h
@@ -0,0 +1,10 @@
+#ifndef GUARD_UTIL_H
+#define GUARD_UTIL_H
+
+void ReverseString(u8 *s, s32 len);
+s32 ConvertToDecimal(s32 *decimal, s32 n, s32 len);
+s32 ConvertFromDecimal(s32 *decimal, s32 sign, s32 len);
+s32 ConvertFromBCD(s32 bcd);
+s32 ConvertToBCD(s32 n);
+
+#endif // GUARD_UTIL_H
diff --git a/ld_script.txt b/ld_script.txt
index 07163b1..14d1053 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -38,7 +38,7 @@ SECTIONS {
asm/memory.o(.text);
asm/code_80035F0.o(.text);
src/other_random.o(.text);
- asm/util.o(.text);
+ src/util.o(.text);
asm/bg_palette_buffer.o(.text);
asm/code_80047E8.o(.text);
src/random.o(.text);
diff --git a/src/util.c b/src/util.c
new file mode 100644
index 0000000..0c9c2dd
--- /dev/null
+++ b/src/util.c
@@ -0,0 +1,87 @@
+#include "global.h"
+#include "util.h"
+
+void ReverseString(u8 *s, s32 len)
+{
+ u8 *l = s;
+ s32 right = len - 1;
+ u8 *r = s + right;
+ s32 left = 0;
+
+ while (left < right)
+ {
+ u8 temp = *l;
+ *l++ = *r;
+ *r-- = temp;
+ left++;
+ right--;
+ }
+}
+
+s32 ConvertToDecimal(s32 *decimal, s32 n, s32 len)
+{
+ s32 sign;
+ s32 i;
+
+ if (n > 0)
+ {
+ sign = 1;
+ }
+ else
+ {
+ n = -n;
+ sign = -1;
+ }
+
+ for (i = 0; i < len; i++)
+ {
+ decimal[i] = n % 10;
+ n /= 10;
+ }
+
+ return sign;
+}
+
+s32 ConvertFromDecimal(s32 *decimal, s32 sign, s32 len)
+{
+ s32 i;
+ s32 powerOfTen;
+ s32 n = *decimal++;
+
+ for (i = 1, powerOfTen = 10; i < len; i++, powerOfTen *= 10)
+ {
+ n += *decimal++ * powerOfTen;
+ }
+
+ return (sign < 0) ? -n : n;
+}
+
+s32 ConvertFromBCD(s32 bcd)
+{
+ s32 powerOfTen = 1;
+ s32 n = 0;
+
+ while (bcd > 0)
+ {
+ n += (bcd & 0xF) * powerOfTen;
+ powerOfTen *= 10;
+ bcd >>= 4;
+ }
+
+ return n;
+}
+
+s32 ConvertToBCD(s32 n)
+{
+ s32 shift = 0;
+ s32 bcd = 0;
+
+ while (n > 0)
+ {
+ bcd += (n % 10) << shift;
+ shift += 4;
+ n /= 10;
+ }
+
+ return bcd;
+}