Mercurial > hg > Members > kono > os9 > sbc09
diff src/os9/crc.c @ 57:2088fd998865
sbc09 directry clean up
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 23 Jul 2018 16:07:12 +0900 |
parents | os9/crc.c@9a224bd9b45f |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/os9/crc.c Mon Jul 23 16:07:12 2018 +0900 @@ -0,0 +1,49 @@ +#include <stdio.h> + +#include "os9.h" + +int os9_crc(OS9_MODULE_t *mod) +{ + int i; + u_char crc[3] = {0xff, 0xff, 0xff}; + u_char *ptr = (u_char *) mod; + u_char a; + + for (i = 0; i < INT(mod->size); i++) + { + a = *(ptr++); + + a ^= crc[0]; + crc[0] = crc[1]; + crc[1] = crc[2]; + crc[1] ^= (a >> 7); + crc[2] = (a << 1); + crc[1] ^= (a >> 2); + crc[2] ^= (a << 6); + a ^= (a << 1); + a ^= (a << 2); + a ^= (a << 4); + if (a & 0x80) { + crc[0] ^= 0x80; + crc[2] ^= 0x21; + } + } + if ((crc[0] == OS9_CRC0) && + (crc[1] == OS9_CRC1) && + (crc[2] == OS9_CRC2)) + return 1; + + return 0; +} + +int os9_header(OS9_MODULE_t *mod) +{ + u_char tmp = 0x00; + u_char *ptr = (u_char *) mod; + int i; + + for (i = 0; i < OS9_HEADER_SIZE; i++) + tmp ^= *(ptr++); + + return tmp; +}