tools/bim2hrb
の編集
http://hrb.osask.jp/wiki/?tools/bim2hrb
[
リロード
|
差分
|
単語検索
|
一覧
] [
編集
|
バックアップ
|
添付
]
-- 雛形とするページ --
A
Akkie
Athlon64X2
Clover
DAsoran
Falcon
FormatRule
FrontPage
Genesis
Help
I
InterWikiName
InterWikiSandBox
InterWikiテクニカル
Jormungand
K
Kebo
Kor_Lee_Hee_Rak
Leaf
Linux
Linux/wako_memo
MOIZ99
MW
MenuBar
OSC
PG_MANA
ReadersOS
RecentDeleted
SKYDASH
SandBox
Sero
Sigle
Source
Triangle_Ld.
Zxcvbnm
advance
advance/CPU
advance/FDC
advance/FPU
advance/NotHariMain
advance/QEMUVGA
advance/RTC
advance/blike
advance/cpu_reset
advance/driver
advance/driver/01
advance/driver/02
advance/families
advance/filesystem
advance/fwrite
advance/hddboot
advance/he86
advance/hints
advance/ipl
advance/kernel
advance/keycode
advance/osselect
advance/smaller1
advance/startup
advnace/smaller2
anzy
aotatsu
banbi-
bluedwarf
bo
bugs
challengers
cybozulabsyouth11
deskmanta
esb02b
faq
faq/advance
faq/asm
faq/c00-03
faq/c04-07
faq/c08-15
faq/c16-23
faq/c24-31
faq/make
faq/others
faq/qemu
guide
guide03
guide05
guide07
hikarupsp
imp_log/0000
imp_log/0001
imp_log/0002
imp_log/0003
impressions
index
k
killer_elf
kota
lea
lea/10_memory
lea/4_color
lea/idea
lea/terms
links
logs
logs/osa_hrb/comments0000
logs/osa_hrb/rumors0000
masa
members
message
mistakes
moge32
moppoi5168
notice
osdevjp
populars
prog_index
projects
q_and_a
q_and_a_2
qa_log/0000
qa_log/0001
qa_log/0002
qa_log/0003
qa_log/0004
qa_log/0005
qa_log/0006
qa_log/0007
qa_log/0008
qa_log/0009
quark
rankings
rule
sakamoto
sasaki
spc09
spcc_30min_os
tatsu
tools
tools/bim2hrb
tools/bin2obj
tools/cc1
tools/edimg
tools/gas2nask
tools/makefont
tools/nask
tools/obj2bim
tools/sjisconv
uchan
uho
updates
violations
wako
white
win64-bit
x
ytakano
ヘルプ
リックス
質問します
整形ルール
本は買ったぞ!持ってるぞ!
練習用ページ
* 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
タイムスタンプを変更しない
* 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
テキスト整形のルールを表示する