summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm9/arm9.lcf2
-rw-r--r--arm9/asm/MATH.s25
-rw-r--r--arm9/asm/MATH_crc.s256
-rw-r--r--arm9/asm/MATH_dgt.s47
-rw-r--r--arm9/lib/include/MATH_crc.h38
-rw-r--r--arm9/lib/include/MATH_dgt.h45
-rw-r--r--arm9/lib/include/MATH_pop.h8
-rw-r--r--arm9/lib/include/dgt.h37
-rw-r--r--arm9/lib/include/math.h9
-rw-r--r--arm9/lib/src/MATH_crc.c150
-rw-r--r--arm9/lib/src/MATH_dgt.c16
-rw-r--r--arm9/lib/src/MATH_pop.c12
12 files changed, 316 insertions, 329 deletions
diff --git a/arm9/arm9.lcf b/arm9/arm9.lcf
index a37ac0d3..68298cf4 100644
--- a/arm9/arm9.lcf
+++ b/arm9/arm9.lcf
@@ -539,7 +539,7 @@ SECTIONS {
CTRDG_flash_MX29L010.o (.text)
CTRDG_flash_MX29L512.o (.text)
CTRDG_task.o (.text)
- MATH.o (.text)
+ MATH_pop.o (.text)
MATH_dgt.o (.text)
MATH_crc.o (.text)
STD_string.o (.text)
diff --git a/arm9/asm/MATH.s b/arm9/asm/MATH.s
deleted file mode 100644
index 8e127de0..00000000
--- a/arm9/asm/MATH.s
+++ /dev/null
@@ -1,25 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- arm_func_start MATH_CountPopulation
-MATH_CountPopulation: ; 0x020DDC5C
- ldr r1, _020DDC94 ; =0x55555555
- ldr r2, _020DDC98 ; =0x33333333
- and r1, r1, r0, lsr #0x1
- sub r0, r0, r1
- and r1, r0, r2
- and r0, r2, r0, lsr #0x2
- add r1, r1, r0
- ldr r0, _020DDC9C ; =0x0F0F0F0F
- add r1, r1, r1, lsr #0x4
- and r0, r1, r0
- add r0, r0, r0, lsr #0x8
- add r0, r0, r0, lsr #0x10
- and r0, r0, #0xff
- bx lr
- .balign 4
-_020DDC94: .word 0x55555555
-_020DDC98: .word 0x33333333
-_020DDC9C: .word 0x0F0F0F0F
diff --git a/arm9/asm/MATH_crc.s b/arm9/asm/MATH_crc.s
deleted file mode 100644
index 2b9b8f26..00000000
--- a/arm9/asm/MATH_crc.s
+++ /dev/null
@@ -1,256 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- arm_func_start MATH_CalcCRC32
-MATH_CalcCRC32: ; 0x020DDD28
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- mov lr, r1
- mvn r12, #0x0
- mov r3, r2
- add r1, sp, #0x0
- mov r2, lr
- str r12, [sp, #0x0]
- bl MATHi_CRC32UpdateRev
-_020DDD4C: ; 0x020DDD4C
- ldr r0, [sp, #0x0]
- mvn r0, r0
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
-
- arm_func_start MATH_CalcCRC16CCITT
-MATH_CalcCRC16CCITT: ; 0x020DDD60
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- ldr ip, _020DDD94 ; =0x0000FFFF
- mov lr, r1
- mov r3, r2
- add r1, sp, #0x0
- mov r2, lr
- strh r12, [sp, #0x0]
- bl MATHi_CRC16Update
- ldrh r0, [sp, #0x0]
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
- .balign 4
-_020DDD94: .word 0x0000FFFF
-
- arm_func_start MATH_CalcCRC16
-MATH_CalcCRC16: ; 0x020DDD98
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- mov lr, r1
- mov r12, #0x0
- mov r3, r2
- add r1, sp, #0x0
- mov r2, lr
- strh r12, [sp, #0x0]
- bl MATHi_CRC16UpdateRev
- ldrh r0, [sp, #0x0]
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
-
- arm_func_start MATH_CalcCRC8
-MATH_CalcCRC8: ; 0x020DDDCC
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- mov lr, r1
- mov r12, #0x0
- mov r3, r2
- add r1, sp, #0x0
- mov r2, lr
- strb r12, [sp, #0x0]
- bl MATHi_CRC8Update
-_020DDDF0: ; 0x020DDDF0
- ldrb r0, [sp, #0x0]
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
-
- arm_func_start MATHi_CRC32UpdateRev
-MATHi_CRC32UpdateRev:
- stmdb sp!, {r4,lr}
- cmp r3, #0x0
- ldr r4, [r1, #0x0]
- mov lr, #0x0
- bls _020DDE38
-_020DDE14:
- ldrb r12, [r2, #0x0]
- add lr, lr, #0x1
- cmp lr, r3
- eor r12, r4, r12
- and r12, r12, #0xff
- ldr r12, [r0, r12, lsl #0x2]
- add r2, r2, #0x1
- eor r4, r12, r4, lsr #0x8
- blo _020DDE14
-_020DDE38:
- str r4, [r1, #0x0]
- ldmia sp!, {r4,lr}
- bx lr
-
- arm_func_start MATHi_CRC32InitTableRev
-MATHi_CRC32InitTableRev: ; 0x020DDE44
- stmdb sp!, {r4,lr}
- mov lr, #0x0
- mov r3, lr
-_020DDE50:
- mov r4, lr
- mov r12, r3
-_020DDE58:
- ands r2, r4, #0x1
- eorne r4, r1, r4, lsr #0x1
- add r12, r12, #0x1
- moveq r4, r4, lsr #0x1
- cmp r12, #0x8
- blo _020DDE58
- str r4, [r0, lr, lsl #0x2]
- add lr, lr, #0x1
- cmp lr, #0x100
- blo _020DDE50
- ldmia sp!, {r4,lr}
- bx lr
-
- arm_func_start MATHi_CRC16UpdateRev
-MATHi_CRC16UpdateRev: ; 0x020DDE88
- stmdb sp!, {r4,lr}
- cmp r3, #0x0
- ldrh r4, [r1, #0x0]
- mov lr, #0x0
- bls _020DDEC4
-_020DDE9C:
- ldrb r12, [r2, #0x0]
- add lr, lr, #0x1
- cmp lr, r3
- eor r12, r4, r12
- and r12, r12, #0xff
- mov r12, r12, lsl #0x1
- ldrh r12, [r0, r12]
- add r2, r2, #0x1
- eor r4, r12, r4, lsr #0x8
- blo _020DDE9C
-_020DDEC4:
- strh r4, [r1, #0x0]
- ldmia sp!, {r4,lr}
- bx lr
-
- arm_func_start MATHi_CRC16Update
-MATHi_CRC16Update: ; 0x020DDED0
- stmdb sp!, {r4,lr}
- cmp r3, #0x0
- ldrh r4, [r1, #0x0]
- mov lr, #0x0
- bls _020DDF0C
-_020DDEE4:
- ldrb r12, [r2, #0x0]
- add lr, lr, #0x1
- cmp lr, r3
- eor r12, r12, r4, lsr #0x8
- and r12, r12, #0xff
- mov r12, r12, lsl #0x1
- ldrh r12, [r0, r12]
- add r2, r2, #0x1
- eor r4, r12, r4, lsl #0x8
- blo _020DDEE4
-_020DDF0C:
- strh r4, [r1, #0x0]
- ldmia sp!, {r4,lr}
- bx lr
-
- arm_func_start MATHi_CRC16InitTableRev
-MATHi_CRC16InitTableRev: ; 0x020DDF18
- stmdb sp!, {r4,lr}
- mov lr, #0x0
- mov r3, lr
-_020DDF24:
- mov r4, lr
- mov r12, r3
-_020DDF2C:
- ands r2, r4, #0x1
- eorne r4, r1, r4, lsr #0x1
- add r12, r12, #0x1
- moveq r4, r4, lsr #0x1
- cmp r12, #0x8
- blo _020DDF2C
- mov r2, lr, lsl #0x1
- add lr, lr, #0x1
- strh r4, [r0, r2]
- cmp lr, #0x100
- blo _020DDF24
- ldmia sp!, {r4,lr}
- bx lr
-
- arm_func_start MATHi_CRC16InitTable
-MATHi_CRC16InitTable: ; 0x020DDF60
- stmdb sp!, {r4-r5,lr}
- sub sp, sp, #0x4
- mov r4, #0x0
- mov r12, r4
- mov r3, r4
-_020DDF74:
- mov r5, r12
- mov lr, r3
-_020DDF7C:
- ands r2, r5, #0x8000
- eorne r5, r1, r5, lsl #0x1
- add lr, lr, #0x1
- moveq r5, r5, lsl #0x1
- cmp lr, #0x8
- blo _020DDF7C
- mov r2, r4, lsl #0x1
- add r4, r4, #0x1
- strh r5, [r0, r2]
- cmp r4, #0x100
- add r12, r12, #0x100
- blo _020DDF74
- add sp, sp, #0x4
- ldmia sp!, {r4-r5,lr}
- bx lr
-
- arm_func_start MATHi_CRC8Update
-MATHi_CRC8Update:
- stmdb sp!, {r4,lr}
- cmp r3, #0x0
- ldrb r4, [r1, #0x0]
- mov lr, #0x0
- bls _020DDFEC
-_020DDFCC:
- ldrb r12, [r2, #0x0]
- add lr, lr, #0x1
- cmp lr, r3
- eor r12, r4, r12
- and r12, r12, #0xff
- add r2, r2, #0x1
- ldrb r4, [r0, r12]
- blo _020DDFCC
-_020DDFEC:
- strb r4, [r1, #0x0]
- ldmia sp!, {r4,lr}
- bx lr
-
- arm_func_start MATHi_CRC8InitTable
-MATHi_CRC8InitTable: ; 0x020DDFF8
- stmdb sp!, {r4,lr}
- mov lr, #0x0
- mov r3, lr
-_020DE004:
- mov r4, lr
- mov r12, r3
-_020DE00C:
- ands r2, r4, #0x80
- eorne r4, r1, r4, lsl #0x1
- add r12, r12, #0x1
- moveq r4, r4, lsl #0x1
- cmp r12, #0x8
- blo _020DE00C
- strb r4, [r0, lr]
- add lr, lr, #0x1
- cmp lr, #0x100
- blo _020DE004
- ldmia sp!, {r4,lr}
- bx lr
diff --git a/arm9/asm/MATH_dgt.s b/arm9/asm/MATH_dgt.s
deleted file mode 100644
index 12d05588..00000000
--- a/arm9/asm/MATH_dgt.s
+++ /dev/null
@@ -1,47 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- arm_func_start MATH_CalcSHA1
-MATH_CalcSHA1: ; 0x020DDCA0
- stmdb sp!, {r4-r6,lr}
- sub sp, sp, #0x68
- mov r6, r0
- add r0, sp, #0x0
- mov r5, r1
- mov r4, r2
- bl DGT_Hash2Reset
-_020DDCBC: ; 0x020DDCBC
- add r0, sp, #0x0
- mov r1, r5
- mov r2, r4
- bl DGT_Hash2SetSource
-_020DDCCC: ; 0x020DDCCC
- add r0, sp, #0x0
- mov r1, r6
- bl DGT_Hash2GetDigest
- add sp, sp, #0x68
- ldmia sp!, {r4-r6,lr}
- bx lr
-
- arm_func_start MATH_CalcMD5
-MATH_CalcMD5: ; 0x020DDCE4
- stmdb sp!, {r4-r6,lr}
- sub sp, sp, #0x58
- mov r6, r0
- add r0, sp, #0x0
- mov r5, r1
- mov r4, r2
- bl DGT_Hash1Reset
-_020DDD00: ; 0x020DDD00
- add r0, sp, #0x0
- mov r1, r5
- mov r2, r4
- bl DGT_Hash1SetSource
- add r1, sp, #0x0
- mov r0, r6
- bl DGT_Hash1GetDigest_R
- add sp, sp, #0x58
- ldmia sp!, {r4-r6,lr}
- bx lr
diff --git a/arm9/lib/include/MATH_crc.h b/arm9/lib/include/MATH_crc.h
new file mode 100644
index 00000000..800b738b
--- /dev/null
+++ b/arm9/lib/include/MATH_crc.h
@@ -0,0 +1,38 @@
+#ifndef GUARD_MATH_CRC_H
+#define GUARD_MATH_CRC_H
+
+#include "types.h"
+
+typedef u8 MATHCRC8Context;
+typedef u16 MATHCRC16Context;
+typedef u32 MATHCRC32Context;
+
+struct MATHCRC8Table {
+ u8 table[256];
+};
+
+struct MATHCRC16Table {
+ u16 table[256];
+};
+
+struct MATHCRC32Table {
+ u32 table[256];
+};
+
+u32 MATH_CalcCRC32(const struct MATHCRC32Table *table, const void *data, u32 dataLength);
+void MATHi_CRC32UpdateRev(const struct MATHCRC32Table *table, MATHCRC32Context *context, const void *input, u32 length);
+u16 MATH_CalcCRC16CCITT(const struct MATHCRC16Table *table, const void *data, u32 dataLength);
+void MATHi_CRC16Update(const struct MATHCRC16Table *table, MATHCRC16Context *context, const void *input, u32 length);
+u16 MATH_CalcCRC16(const struct MATHCRC16Table *table, const void *data, u32 dataLength);
+void MATHi_CRC16UpdateRev(const struct MATHCRC16Table *table, MATHCRC16Context *context, const void *input, u32 length);
+u8 MATH_CalcCRC8(const struct MATHCRC8Table *table, const void *data, u32 dataLength);
+void MATHi_CRC8Update(const struct MATHCRC8Table *table, MATHCRC8Context *context, const void *input, u32 length);
+void MATHi_CRC32InitTableRev(struct MATHCRC32Table *table, u32 poly);
+void MATHi_CRC16UpdateRev(const struct MATHCRC16Table *table, MATHCRC16Context *context, const void *input, u32 length);
+void MATHi_CRC16Update(const struct MATHCRC16Table *table, MATHCRC16Context *context, const void *input, u32 length);
+void MATHi_CRC16InitTableRev(struct MATHCRC16Table *table, u16 poly);
+void MATHi_CRC16InitTable(struct MATHCRC16Table *table, u16 poly);
+void MATHi_CRC8Update(const struct MATHCRC8Table *table, MATHCRC8Context *context, const void *input, u32 length);
+void MATHi_CRC8InitTable(struct MATHCRC8Table *table, u8 poly);
+
+#endif
diff --git a/arm9/lib/include/MATH_dgt.h b/arm9/lib/include/MATH_dgt.h
new file mode 100644
index 00000000..9eb3d2ef
--- /dev/null
+++ b/arm9/lib/include/MATH_dgt.h
@@ -0,0 +1,45 @@
+#ifndef GUARD_MATH_DGT_H
+#define GUARD_MATH_DGT_H
+
+#include "dgt.h"
+#include "types.h"
+
+typedef struct DGTHash1Context MATHMD5Context;
+typedef struct DGTHash2Context MATHSHA1Context;
+
+static inline void MATH_MD5Init(MATHMD5Context *context) {
+ DGT_Hash1Reset(context);
+}
+
+static inline void MATH_MD5Update(MATHMD5Context *context, const void *input, u32 length) {
+ DGT_Hash1SetSource(context, (u8*)input, length);
+}
+
+static inline void MATH_MD5GetHash(MATHMD5Context *context, void *digest) {
+ DGT_Hash1GetDigest_R((u8*)digest, context);
+}
+
+static inline void MATH_MD5GetDigest(MATHMD5Context *context, void *digest) {
+ MATH_MD5GetHash(context, digest);
+}
+
+static inline void MATH_SHA1Init(MATHSHA1Context *context) {
+ DGT_Hash2Reset(context);
+}
+
+static inline void MATH_SHA1Update(MATHSHA1Context *context, const void *input, u32 length) {
+ DGT_Hash2SetSource(context, (u8*)input, length);
+}
+
+static inline void MATH_SHA1GetHash(MATHSHA1Context *context, void *digest) {
+ DGT_Hash2GetDigest(context, (u8*)digest);
+}
+
+static inline void MATH_SHA1GetDigest(MATHSHA1Context *context, void *digest) {
+ MATH_SHA1GetHash(context, digest);
+}
+
+void MATH_CalcMD5(void *digest, const void *data, u32 dataLength);
+void MATH_CalcSHA1(void *digest, const void *data, u32 dataLength);
+
+#endif
diff --git a/arm9/lib/include/MATH_pop.h b/arm9/lib/include/MATH_pop.h
new file mode 100644
index 00000000..89dab0c0
--- /dev/null
+++ b/arm9/lib/include/MATH_pop.h
@@ -0,0 +1,8 @@
+#ifndef GUARD_MATH_POP_H
+#define GUARD_MATH_POP_H
+
+#include "types.h"
+
+u8 MATH_CountPopulation(u32);
+
+#endif
diff --git a/arm9/lib/include/dgt.h b/arm9/lib/include/dgt.h
new file mode 100644
index 00000000..a764e85a
--- /dev/null
+++ b/arm9/lib/include/dgt.h
@@ -0,0 +1,37 @@
+#ifndef GUARD_DGT_H
+#define GUARD_DGT_H
+
+#include "types.h"
+
+struct DGTHash1Context {
+ union {
+ struct {
+ unsigned long a, b, c, d;
+ };
+ unsigned long state[4];
+ };
+ unsigned long long length;
+ union {
+ unsigned long buffer32[16];
+ unsigned char buffer8[64];
+ };
+};
+
+struct DGTHash2Context {
+ unsigned long Intermediate_Hash[5];
+ unsigned long Length_Low;
+ unsigned long Length_High;
+ int Message_Block_Index;
+ unsigned char Message_Block[64];
+ int Computed;
+ int Corrupted;
+};
+
+void DGT_Hash1Reset(struct DGTHash1Context *context);
+void DGT_Hash1SetSource(struct DGTHash1Context *context, u8 *input, u32 length);
+void DGT_Hash1GetDigest_R(u8 *digest, struct DGTHash1Context *context);
+void DGT_Hash2Reset(struct DGTHash2Context *context);
+void DGT_Hash2SetSource(struct DGTHash2Context *context, u8 *input, u32 length);
+void DGT_Hash2GetDigest(struct DGTHash2Context *context, u8 *digest);
+
+#endif
diff --git a/arm9/lib/include/math.h b/arm9/lib/include/math.h
new file mode 100644
index 00000000..085aa24f
--- /dev/null
+++ b/arm9/lib/include/math.h
@@ -0,0 +1,9 @@
+#ifndef GUARD_MATH_H
+#define GUARD_MATH_H
+
+#include "dgt.h"
+#include "MATH_pop.h"
+#include "MATH_crc.h"
+#include "MATH_dgt.h"
+
+#endif
diff --git a/arm9/lib/src/MATH_crc.c b/arm9/lib/src/MATH_crc.c
new file mode 100644
index 00000000..ec0ccad0
--- /dev/null
+++ b/arm9/lib/src/MATH_crc.c
@@ -0,0 +1,150 @@
+#include "global.h"
+#include "MATH_crc.h"
+
+ARM_FUNC void MATHi_CRC8InitTable(struct MATHCRC8Table *table, u8 poly) {
+ u32 r, i, j;
+ u8 *t = table->table;
+
+ for (i = 0; i < 256; i++) {
+ r = i;
+ for (j = 0; j < 8; j++) {
+ if (r & 0x80) {
+ r = (r << 1) ^ poly;
+ }
+ else {
+ r <<= 1;
+ }
+ }
+ t[i] = r;
+ }
+}
+
+ARM_FUNC void MATHi_CRC8Update(const struct MATHCRC8Table *table, MATHCRC8Context *context, const void *input, u32 length) {
+ u32 r, i;
+ const u8* t = table->table;
+ u8* data = (u8*)input;
+
+ r = *context;
+ for (i = 0; i < length; i++) {
+ r = t[(r ^ *data) & 0xff];
+ data++;
+ }
+ *context = r;
+}
+
+ARM_FUNC void MATHi_CRC16InitTable(struct MATHCRC16Table *table, u16 poly) {
+ u32 r, i, j;
+ u16 *t = table->table;
+
+ for (i = 0; i < 256; i++) {
+ r = i << 8;
+ for (j = 0; j < 8; j++) {
+ if (r & 0x8000) {
+ r = (r << 1) ^ poly;
+ }
+ else {
+ r <<= 1;
+ }
+ }
+ t[i] = r;
+ }
+}
+
+ARM_FUNC void MATHi_CRC16InitTableRev(struct MATHCRC16Table *table, u16 poly) {
+ u32 r, i, j;
+ u16 *t = table->table;
+
+ for (i = 0; i < 256; i++) {
+ r = i;
+ for (j = 0; j < 8; j++) {
+ if (r & 1) {
+ r = (r >> 1) ^ poly;
+ }
+ else {
+ r >>= 1;
+ }
+ }
+ t[i] = r;
+ }
+}
+
+ARM_FUNC void MATHi_CRC16Update(const struct MATHCRC16Table *table, MATHCRC16Context *context, const void *input, u32 length) {
+ u32 r, i;
+ const u16* t = table->table;
+ u8* data = (u8*)input;
+
+ r = *context;
+ for (i = 0; i < length; i++) {
+ r = (r << 8) ^ t[((r >> 8) ^ *data) & 0xff];
+ data++;
+ }
+ *context = r;
+}
+
+ARM_FUNC void MATHi_CRC16UpdateRev(const struct MATHCRC16Table *table, MATHCRC16Context *context, const void *input, u32 length) {
+ u32 r, i;
+ const u16* t = table->table;
+ u8* data = (u8*)input;
+
+ r = *context;
+ for (i = 0; i < length; i++) {
+ r = (r >> 8) ^ t[(r ^ *data) & 0xff];
+ data++;
+ }
+ *context = r;
+}
+
+ARM_FUNC void MATHi_CRC32InitTableRev(struct MATHCRC32Table *table, u32 poly) {
+ u32 r, i, j;
+ u32 *t = table->table;
+
+ for (i = 0; i < 256; i++) {
+ r = i;
+ for (j = 0; j < 8; j++) {
+ if (r & 1) {
+ r = (r >> 1) ^ poly;
+ }
+ else {
+ r >>= 1;
+ }
+ }
+ t[i] = r;
+ }
+}
+
+ARM_FUNC void MATHi_CRC32UpdateRev(const struct MATHCRC32Table *table, MATHCRC32Context *context, const void *input, u32 length) {
+ u32 r, i;
+ const u32* t = table->table;
+ u8* data = (u8*)input;
+
+ r = *context;
+ for (i = 0; i < length; i++) {
+ r = (r >> 8) ^ t[(r ^ *data) & 0xff];
+ data++;
+ }
+ *context = r;
+}
+
+ARM_FUNC u8 MATH_CalcCRC8(const struct MATHCRC8Table *table, const void *data, u32 dataLength) {
+ MATHCRC8Context ctx = 0;
+ MATHi_CRC8Update(table, &ctx, data, dataLength);
+ return ctx;
+}
+
+ARM_FUNC u16 MATH_CalcCRC16(const struct MATHCRC16Table *table, const void *data, u32 dataLength) {
+ MATHCRC16Context ctx = 0;
+ MATHi_CRC16UpdateRev(table, &ctx, data, dataLength);
+ return ctx;
+}
+
+ARM_FUNC u16 MATH_CalcCRC16CCITT(const struct MATHCRC16Table *table, const void *data, u32 dataLength) {
+ MATHCRC16Context ctx = 0xffff;
+ MATHi_CRC16Update(table, &ctx, data, dataLength);
+ return ctx;
+}
+
+ARM_FUNC u32 MATH_CalcCRC32(const struct MATHCRC32Table *table, const void *data, u32 dataLength) {
+ MATHCRC32Context ctx = ~0;
+ MATHi_CRC32UpdateRev(table, &ctx, data, dataLength);
+ return ~ctx;
+}
diff --git a/arm9/lib/src/MATH_dgt.c b/arm9/lib/src/MATH_dgt.c
new file mode 100644
index 00000000..6bb90d99
--- /dev/null
+++ b/arm9/lib/src/MATH_dgt.c
@@ -0,0 +1,16 @@
+#include "global.h"
+#include "MATH_dgt.h"
+
+ARM_FUNC void MATH_CalcMD5(void *digest, const void *data, u32 dataLength) {
+ MATHMD5Context context;
+ MATH_MD5Init(&context);
+ MATH_MD5Update(&context, data, dataLength);
+ MATH_MD5GetHash(&context, digest);
+}
+
+ARM_FUNC void MATH_CalcSHA1(void *digest, const void *data, u32 dataLength) {
+ MATHSHA1Context context;
+ MATH_SHA1Init(&context);
+ MATH_SHA1Update(&context, data, dataLength);
+ MATH_SHA1GetHash(&context, digest);
+}
diff --git a/arm9/lib/src/MATH_pop.c b/arm9/lib/src/MATH_pop.c
new file mode 100644
index 00000000..18582494
--- /dev/null
+++ b/arm9/lib/src/MATH_pop.c
@@ -0,0 +1,12 @@
+#include "global.h"
+#include "MATH_pop.h"
+
+ARM_FUNC u8 MATH_CountPopulation(u32 x) {
+ x -= (x >> 1) & 0x55555555;
+ x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
+ x += x >> 4;
+ x &= 0x0f0f0f0f;
+ x += x >> 8;
+ x += x >> 16;
+ return (u8)x;
+}