--- /dev/null
+#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