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

リロード   新規 編集 差分 添付   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS