diff options
Diffstat (limited to 'src/libultra_code_O2/osMempakAddrCRC.c')
| -rw-r--r-- | src/libultra_code_O2/osMempakAddrCRC.c | 65 |
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; +} |
