OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / z_tools / tolsrc_chn / bim2chn / bim2chn.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/z_tools/tolsrc_chn/bim2chn/bim2chn.c b/CHNOSProject/chnos/tolset_chn_000/z_tools/tolsrc_chn/bim2chn/bim2chn.c
new file mode 100644 (file)
index 0000000..e4c65ad
--- /dev/null
@@ -0,0 +1,180 @@
+#include <stdio.h>\r
+#include <stdlib.h>\r
+\r
+typedef unsigned char UCHAR;\r
+int getnum(const UCHAR *p);\r
+int get32(const UCHAR *p);\r
+void put32(UCHAR *p, int i);\r
+\r
+#define MAXSIZ 4 * 1024 * 1024\r
+\r
+int main(int argc, UCHAR **argv)\r
+{\r
+       UCHAR *fbuf = malloc(MAXSIZ);\r
+       int heap_siz, mmarea, fsiz, dsize, dofs, stksiz, wrksiz, entry, bsssiz;\r
+       int heap_adr, i;\r
+       FILE *fp;\r
+       static UCHAR sign[4] = "CHNP";\r
+\r
+       /* \83p\83\89\83\81\81[\83^\82Ì\8eæ\93¾ */\r
+       if (argc < 4) {\r
+               puts("usage>bim2chn appname.bim appname.chn heap-size [mmarea-size]");\r
+               return 1;\r
+       }\r
+       heap_siz = getnum(argv[3]);\r
+       mmarea = 0;\r
+       if (argc >= 5)\r
+               mmarea = getnum(argv[4]);\r
+\r
+       /* \83t\83@\83C\83\8b\93Ç\82Ý\8d\9e\82Ý */\r
+       fp = fopen(argv[1], "rb");\r
+       if (fp == NULL) {\r
+err_bim:\r
+               puts("bim file read error");\r
+               return 1;\r
+       }\r
+       fsiz = fread(fbuf, 1, MAXSIZ, fp);\r
+       fclose(fp);\r
+       if (fsiz >= MAXSIZ || fsiz < 0)\r
+               goto err_bim;\r
+\r
+       /* \83w\83b\83_\8am\94F */\r
+       if (get32(&fbuf[4]) != 0x24) {  /* \83t\83@\83C\83\8b\92\86\82Ì.text\83X\83^\81[\83g\83A\83h\83\8c\83X */\r
+err_form:\r
+               puts("bim file format error");\r
+               return 1;\r
+       }\r
+       if (get32(&fbuf[8]) != 0x24)    /* \83\81\83\82\83\8a\83\8d\81[\83h\8e\9e\82Ì.text\83X\83^\81[\83g\83A\83h\83\8c\83X */\r
+               goto err_form;\r
+       dsize  = get32(&fbuf[12]);      /* .data\83Z\83N\83V\83\87\83\93\83T\83C\83Y */\r
+       dofs   = get32(&fbuf[16]);      /* \83t\83@\83C\83\8b\82Ì\82Ç\82±\82É.data\83Z\83N\83V\83\87\83\93\82ª\82 \82é\82© */\r
+       stksiz = get32(&fbuf[20]);      /* \83X\83^\83b\83N\83T\83C\83Y */\r
+       entry  = get32(&fbuf[24]);      /* \83G\83\93\83g\83\8a\83|\83C\83\93\83g */\r
+       bsssiz = get32(&fbuf[28]);      /* bss\83T\83C\83Y */\r
+\r
+       /* \83w\83b\83_\90\90¬ */\r
+       heap_adr = stksiz + dsize + bsssiz;\r
+       heap_adr = (heap_adr + 0xf) & 0xfffffff0; /* 16\83o\83C\83g\92P\88Ê\82É\90Ø\82è\8fã\82° */\r
+       wrksiz = heap_adr + heap_siz;\r
+       wrksiz = (wrksiz + 0xfff) & 0xfffff000; /* 4KB\92P\88Ê\82É\90Ø\82è\8fã\82° */\r
+       put32(&fbuf[ 0], wrksiz);\r
+       for (i = 0; i < 4; i++)\r
+               fbuf[4 + i] = sign[i];\r
+       put32(&fbuf[ 8], mmarea);\r
+       put32(&fbuf[12], stksiz);\r
+       put32(&fbuf[16], dsize);\r
+       put32(&fbuf[20], dofs);\r
+       put32(&fbuf[24], 0xe9000000);\r
+       put32(&fbuf[28], entry - 0x20);\r
+       put32(&fbuf[32], heap_adr);\r
+\r
+       /* \83t\83@\83C\83\8b\8f\91\82«\8d\9e\82Ý */\r
+       fp = fopen(argv[2], "wb");\r
+       if (fp == NULL) {\r
+err_chn:\r
+               puts("chn file write error");\r
+               return 1;\r
+       }\r
+       i = fwrite(fbuf, 1, fsiz, fp);\r
+       fclose(fp);\r
+       if (fsiz != i)\r
+               goto err_chn;\r
+\r
+       return 0;\r
+}\r
+\r
+int getnum(const UCHAR *p)\r
+{\r
+       int i = 0, base = 10, sign = 1;\r
+       UCHAR c;\r
+       if (*p == '-') {\r
+               p++;\r
+               sign = -1;\r
+       }\r
+       if (*p == '0') {\r
+               p++;\r
+               base = 8;\r
+               c = *p;\r
+               if (c >= 'a')\r
+                       c -= 'a' - 'A';\r
+               if (c == 'X') {\r
+                       p++;\r
+                       base = 16;\r
+               }\r
+               if (c == 'O') {\r
+                       p++;\r
+                       base = 8;\r
+               }\r
+               if (c == 'B') {\r
+                       p++;\r
+                       base = 2;\r
+               }\r
+       }\r
+       for (;;) {\r
+               c = *p++;\r
+               if ('0' <= c && c <= '9')\r
+                       c -= '0'; \r
+               else if ('A' <= c && c <= 'F')\r
+                       c -= 'A' - 10;\r
+               else if ('a' <= c && c <= 'f')\r
+                       c -= 'a' - 10;\r
+               else\r
+                       break;\r
+               if (c >= base)\r
+                       break;\r
+               i = i * base + c;\r
+       }\r
+       if (c >= 'a')\r
+               c -= 'a' - 'A';\r
+       if (c == 'K')\r
+               i <<= 10;\r
+       if (c == 'M')\r
+               i <<= 20;\r
+       if (c == 'G')\r
+               i <<= 30;\r
+       return i * sign;\r
+}\r
+\r
+int get32(const UCHAR *p)\r
+{\r
+       return p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24;\r
+}\r
+\r
+void put32(UCHAR *p, int i)\r
+{\r
+       p[0] =  i        & 0xff;\r
+       p[1] = (i >>  8) & 0xff;\r
+       p[2] = (i >> 16) & 0xff;\r
+       p[3] = (i >> 24) & 0xff;\r
+       return;\r
+}\r
+\r
+/*\r
+\r
+memo\r
+\r
+[ .bim\83t\83@\83C\83\8b\82Ì\8d\\91¢ ]\r
+\r
++ 0 : .text\83T\83C\83Y\r
++ 4 : \83t\83@\83C\83\8b\92\86\82Ì.text\83X\83^\81[\83g\83A\83h\83\8c\83X\81i0x24\81j\r
++ 8 : \83\81\83\82\83\8a\83\8d\81[\83h\8e\9e\82Ì.text\83X\83^\81[\83g\83A\83h\83\8c\83X\81i0x24\81j\r
++12 : .data\83T\83C\83Y\r
++16 : \83t\83@\83C\83\8b\92\86\82Ì.data\83X\83^\81[\83g\83A\83h\83\8c\83X\r
++20 : \83\81\83\82\83\8a\83\8d\81[\83h\8e\9e\82Ì.data\83X\83^\81[\83g\83A\83h\83\8c\83X\r
++24 : \83G\83\93\83g\83\8a\83|\83C\83\93\83g\r
++28 : bss\97Ì\88æ\82Ì\83o\83C\83g\90\94\r
++36 : \83R\81[\83h\r
+\r
+[ .chn\83t\83@\83C\83\8b\82Ì\8d\\91¢ (.hrb\82Æ\83V\83O\83l\83`\83\83\88È\8aO\93¯\93\99)]\r
+\r
++ 0 : stack+.data+heap \82Ì\91å\82«\82³\81i4KB\82Ì\94{\90\94\81j\r
++ 4 : \83V\83O\83l\83`\83\83 "CHNP"\r
++ 8 : mmarea \82Ì\91å\82«\82³\81i4KB\82Ì\94{\90\94\81j\r
++12 : \83X\83^\83b\83N\8f\89\8aú\92l\81\95.data\93]\91\97\90æ\r
++16 : .data\82Ì\83T\83C\83Y\r
++20 : .data\82Ì\8f\89\8aú\92l\97ñ\82ª\83t\83@\83C\83\8b\82Ì\82Ç\82±\82É\82 \82é\82©\r
++24 : 0xe9000000\r
++28 : \83G\83\93\83g\83\8a\83A\83h\83\8c\83X-0x20\r
++32 : heap\97Ì\88æ\81imalloc\97Ì\88æ\81j\8aJ\8en\83A\83h\83\8c\83X\r
+\r
+*/\r