summaryrefslogtreecommitdiff
path: root/src/libultra_code_O2/osMempakAddrCRC.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libultra_code_O2/osMempakAddrCRC.c')
-rw-r--r--src/libultra_code_O2/osMempakAddrCRC.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/libultra_code_O2/osMempakAddrCRC.c b/src/libultra_code_O2/osMempakAddrCRC.c
new file mode 100644
index 000000000..c902651ba
--- /dev/null
+++ b/src/libultra_code_O2/osMempakAddrCRC.c
@@ -0,0 +1,65 @@
+#include "global.h"
+
+// Valid addr up to 0x7FF
+// It's the address of a block of 0x20 bytes in the mempak
+// So that means the whole mempak has a 16-bit address space
+u8 __osContAddressCrc(u16 addr) {
+ u32 addr32 = addr;
+ u32 ret = 0;
+ u32 bit;
+ s32 i;
+
+ for (bit = 0x400; bit; bit /= 2) {
+ ret *= 2;
+ if (addr32 & bit) {
+ if (ret & 0x20) {
+ ret ^= 0x14;
+ } else {
+ ++ret;
+ }
+ } else {
+ if (ret & 0x20) {
+ ret ^= 0x15;
+ }
+ }
+ }
+ for (i = 0; i < 5; ++i) {
+ ret <<= 1;
+ if (ret & 0x20) {
+ ret ^= 0x15;
+ }
+ }
+ return ret & 0x1f;
+}
+
+u8 __osContDataCrc(u8* data) {
+ s32 ret;
+ u32 bit;
+ u32 byte;
+
+ ret = 0;
+ for (byte = 0x20; byte; --byte, ++data) {
+ for (bit = 0x80; bit; bit /= 2) {
+ ret *= 2;
+ if ((*data & bit) != 0) {
+ if ((ret & 0x100) != 0) {
+ ret ^= 0x84;
+ } else {
+ ++ret;
+ }
+ } else {
+ if (ret & 0x100) {
+ ret ^= 0x85;
+ }
+ }
+ }
+ }
+ do {
+ ret *= 2;
+ if (ret & 0x100) {
+ ret ^= 0x85;
+ }
+ ++byte;
+ } while (byte < 8U);
+ return ret;
+}