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;
+}