+++ /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