* bim2hrbについてのページ -(by [[K]], 2006.03.24) -.hrb生成ツール -.bimを加工して.hrbを生成する。具体的にはヘッダを作り直しているだけ。 *** ソースプログラム(実際とはちょっと違うけど動作はほぼ同じ) #include <stdio.h> #include <stdlib.h> int getnum(char *p); int get32(unsigned char *p); void put32(char *p, int i); #define MAXSIZ 4 * 1024 * 1024 int main(int argc, char **argv) { char *fbuf = malloc(MAXSIZ); int heap_siz, mmarea, fsiz, dsize, dofs, stksiz, wrksiz, entry, bsssiz, heap_adr, i; FILE *fp; static char sign[4] = "Hari"; /* パラメータの取得 */ if (argc < 4) { puts("usage>bim2hrb appname.bim appname.hrb heap-size [mmarea-size]"); return 1; } heap_siz = getnum(argv[3]); mmarea = 0; if (argc >= 5) { mmarea = getnum(argv[4]); } /* ファイル読み込み */ fp = fopen(argv[1], "rb"); if (fp == 0) { err_bim: puts("bim file read error"); return 1; } fsiz = fread(fbuf, 1, MAXSIZ, fp); fclose(fp); if (fsiz >= MAXSIZ || fsiz < 0) { goto err_bim; } /* ヘッダ確認 */ if (get32(&fbuf[4]) != 0x24) { /* ファイル中の.textスタートアドレス */ err_form: puts("bim file format error"); return 1; } if (get32(&fbuf[8]) != 0x24) { /* メモリロード時の.textスタートアドレス */ goto err_form; } dsize = get32(&fbuf[12]); /* .dataセクションサイズ */ dofs = get32(&fbuf[16]); /* ファイルのどこに.dataセクションがあるか */ stksiz = get32(&fbuf[20]); /* スタックサイズ */ entry = get32(&fbuf[24]); /* エントリポイント */ bsssiz = get32(&fbuf[28]); /* bssサイズ */ /* ヘッダ生成 */ heap_adr = stksiz + dsize + bsssiz; heap_adr = (heap_adr + 0xf) & 0xfffffff0; /* 16バイト単位に切り上げ */ wrksiz = heap_adr + heap_siz; wrksiz = (wrksiz + 0xfff) & 0xfffff000; /* 4KB単位に切り上げ */ put32(&fbuf[ 0], wrksiz); for (i = 0; i < 4; i++) { fbuf[4 + i] = sign[i]; } put32(&fbuf[ 8], mmarea); put32(&fbuf[12], stksiz); put32(&fbuf[16], dsize); put32(&fbuf[20], dofs); put32(&fbuf[24], 0xe9000000); put32(&fbuf[28], entry - 0x20); put32(&fbuf[32], heap_adr); /* ファイル書き込み */ fp = fopen(argv[2], "wb"); if (fp == 0) { err_hrb: puts("hrb file write error"); return 1; } i = fwrite(fbuf, 1, fsiz, fp); fclose(fp); if (fsiz != i) { goto err_hrb; } return 0; } int getnum(char *p) { int i = strtol(p, &p, 0); unsigned char c = *p; if (c >= 'a') { c -= 'a' - 'A'; } if (c == 'K') { i <<= 10; } if (c == 'M') { i <<= 20; } if (c == 'G') { i <<= 30; } return i; } int get32(unsigned char *p) { return p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24; } void put32(char *p, int i) { p[0] = i & 0xff; p[1] = (i >> 8) & 0xff; p[2] = (i >> 16) & 0xff; p[3] = (i >> 24) & 0xff; return; } *** メモ [ .bimファイルの構造 ] + 0 : .textサイズ + 4 : ファイル中の.textスタートアドレス(0x24) + 8 : メモリロード時の.textスタートアドレス(0x24) +12 : .dataサイズ +16 : ファイル中の.dataスタートアドレス +20 : メモリロード時の.dataスタートアドレス +24 : エントリポイント +28 : bss領域のバイト数 +36 : コード [ .hrbファイルの構造 ] + 0 : stack+.data+heap の大きさ(4KBの倍数) + 4 : シグネチャ "Hari" + 8 : mmarea の大きさ(4KBの倍数) +12 : スタック初期値&.data転送先 +16 : .dataのサイズ +20 : .dataの初期値列がファイルのどこにあるか +24 : 0xe9000000 +28 : エントリアドレス-0x20 +32 : heap領域(malloc領域)開始アドレス +36 : コード -.bimについては[[tools/obj2bim]]を参照。 * こめんと欄 #comment OasvPM <a href="http://jsbbcrxahpgd.com/">jsbbcrxahpgd</a>, [url=http://neaqkjpdyxen.com/]neaqkjpdyxen[/url], [link=http://ouathpfplxja.com/]ouathpfplxja[/link], http://iwqlniylrebi.com/