OSDN Git Service

syslibのエラーは出なくなったがアプリは動かない(pack error)
[heavyosecpu/HeavyOSECPU.git] / main.c
diff --git a/main.c b/main.c
index a5dcbf8..293622e 100644 (file)
--- a/main.c
+++ b/main.c
-#include "osecpu.h"\r
-\r
-int *keybuf, keybuf_r, keybuf_w, keybuf_c;\r
-HOSECPU_Device_Window mainWindow;\r
-//デバッグ用。プログラム中の随所で加算される変数\r
-int di1_serial;\r
-\r
-\r
-\r
-unsigned char *Init_LoadSysLib(char argv0[], unsigned char *tmpWorkMemory);\r
-void LoadAppBin(HOSECPU_RuntimeEnvironment *env);\r
-\r
-void putKeybuf(int i)\r
-{\r
-       if (keybuf_c < KEYBUFSIZ) {\r
-               keybuf[keybuf_w] = i;\r
-               keybuf_c++;\r
-               keybuf_w = (keybuf_w + 1) & (KEYBUFSIZ - 1);\r
-       }\r
-       return;\r
-}\r
-\r
-int HeavyOSECPUMain(int argc, char **argv)\r
-{\r
-       FILE *fp;\r
-       unsigned char *jitbuf, *sysjit00, *sysjit;\r
-       unsigned char *systmp0, *systmp1, *systmp2;\r
-       unsigned char *opTbl;\r
-       HOSECPU_LabelListTag *label;\r
-       int tmpsiz, i;\r
-       jmp_buf setjmpEnv;\r
-       double tm0, tm1, tm2;\r
-       HOSECPU_PointerControlTag *ptrCtrl;\r
-       unsigned char *syslib;\r
-       int argDebug = 0, stacksiz = 1;\r
-       const  char *cp;\r
-       HOSECPU_RuntimeEnvironment env;\r
-       void(*jitfunc)(char *);\r
-       unsigned char *jp;\r
-       \r
-       //Initialize mainWindow\r
-       mainWindow.vram = NULL;\r
-       mainWindow.xsize = 0;\r
-       mainWindow.ysize = 0;\r
-       di1_serial = 0;\r
-       \r
-       //実行環境初期化\r
-       env.mainArgc = argc;\r
-       env.mainArgv = (const char **)argv;\r
-       env.appBin = malloc(APPSIZ1);\r
-       env.executionLevel = JITC_LV_SLOWEST;\r
-       jitbuf = mallocRWE(1024 * 1024); /* とりあえず1MBで */\r
-       //unsigned char *sysjit0 = mallocRWE(SJITSIZ1), *sysjit1 = sysjit0, *sysjit00 = sysjit0;\r
-       // syslib.oseのjitc結果を格納する領域を確保。\r
-       sysjit00 = mallocRWE(SJITSIZ1);\r
-       sysjit = sysjit00;\r
-       // 現在の、jitc結果を格納するメモリへの書き込み位置のアドレス\r
-       // sysjit: 現在のjitc書き込み位置\r
-       // sysjit00: jitc結果の先頭\r
-       //ワークメモリを三つくらいもらう\r
-       systmp0 = malloc(SYSTMP0SIZ);   /* syslibのjitc用 */\r
-       systmp1 = malloc(SYSTMP1SIZ);\r
-       systmp2 = malloc(1024 * 1024);\r
-       \r
-       opTbl = malloc(256);\r
-       label = malloc(JITC_MAXLABELS * sizeof (HOSECPU_LabelListTag));\r
-       keybuf = malloc(KEYBUFSIZ * sizeof (int));\r
-       keybuf_r = keybuf_w = keybuf_c = 0;\r
-       ptrCtrl = malloc(PTRCTRLSIZ * sizeof (HOSECPU_PointerControlTag));\r
-       \r
-       randStatInit((unsigned int)time(NULL));\r
-       for (i = 0; i < PTRCTRLSIZ; i++) {\r
-               ptrCtrl[i].liveSign = 0;\r
-               ptrCtrl[i].size = -1;\r
-       }\r
-       ptrCtrl[0].size = -2;\r
-       \r
-       /* syslibの読み込み */\r
-       syslib = Init_LoadSysLib(argv[0], systmp0);\r
-       \r
-       sysjit = jitCompInit(sysjit);\r
-       sysjit00 = sysjit;\r
-       // labelはjitc0()内で初期化される。\r
-       i = jitc0(&sysjit, sysjit00 + SJITSIZ1, syslib + 32, syslib + SYSLIBSIZ1, JITC_LV_SLOWEST+9, label);\r
-       if (i != 0){\r
-               fputs("syslib-file JITC error.\n", stderr);\r
-               return 1;\r
-       }\r
-       \r
-       // エラー時にデバッグ用に表示する変数を加算\r
-       di1_serial++;\r
-       \r
-       /* アプリバイナリの読み込み */\r
-       LoadAppBin(&env);\r
-       \r
-       /* クロック初期化 */\r
-       tm0 = clock() / (double)CLOCKS_PER_SEC;\r
-       \r
-       if (env.appBin[2] == 0xf0) {\r
-               // tek5圧縮がかかっている\r
-#if (USE_TEK5 != 0)\r
-               env.appSize1 = tek5Decomp(env.appBin + 2, env.appBin + env.appSize0, systmp0) + 2;\r
-#else\r
-               env.appSize1 = -9;\r
-#endif\r
-               if (env.appSize1 < 0) {\r
-                       fputs("unsupported-format(tek5)\n", stderr);\r
-                       return 1;\r
-               }\r
-       }\r
-       //デバッグモード指定\r
-       cp = searchArg(argc, (const char **)argv, "debug:", 0);\r
-       if (cp != NULL){\r
-               argDebug = *cp - '0';\r
-       }\r
-       //スタックサイズ指定(MiB単位)\r
-       cp = searchArg(argc, (const char **)argv, "stack:", 0);\r
-       if (cp != NULL){\r
-               stacksiz = strtol(cp, NULL, 0);\r
-       }\r
-       jp = jitbuf; /* JIT-pointer */\r
-       \r
-       /* フロントエンドコードをバックエンドコードに変換する */\r
-       if ((env.appBin[2] & 0xf0) != 0) {\r
-               systmp0[0] = env.appBin[0];\r
-               systmp0[1] = env.appBin[1];\r
-               env.preg[2].p = systmp0 + 2;\r
-               env.preg[3].p = systmp0 + SYSTMP0SIZ;\r
-               env.preg[4].p = env.appBin + 2;\r
-               env.preg[5].p = env.appBin + env.appSize1;\r
-               env.preg[6].p = systmp1;\r
-               env.preg[7].p = systmp1 + SYSTMP1SIZ;\r
-               env.preg[10].p = systmp2;\r
-               int pxxFlag[64], typLabel[4096];\r
-               env.preg[0x0b].p = (void *)pxxFlag;\r
-               env.preg[0x0c].p = (void *)typLabel;\r
-               env.preg[0x0d].p = opTbl;\r
-               jitfunc = (void *)sysjit00;\r
-               (*jitfunc)(((char *)&env) + 128); /* サイズを節約するためにEBPを128バイトずらす */\r
-               if (env.ireg[0] != 0) {\r
-                       jp = env.preg[2].p - 1;\r
-                       fprintf(stderr, "unpack error: %02X (at %06X) (R00=%d)\n", *jp, jp - systmp0, env.ireg[0]);\r
-                       if ((argDebug & 2) != 0) {\r
-                               fp = fopen("debug2.bin", "wb");\r
-                               fwrite(systmp0, 1, jp - systmp0 + 16, fp);\r
-                               fclose(fp);\r
-                       }\r
-                       exit(1);\r
-               }\r
-               tmpsiz = env.preg[2].p - systmp0;\r
-       } else{\r
-               memcpy(systmp0, env.appBin, env.appSize1);\r
-               tmpsiz = env.appSize1;\r
-       }\r
-       \r
-       if ((argDebug & 2) != 0) {\r
-               /*変換後のバックエンドコードをファイルへ保存*/\r
-               fp = fopen("debug2.bin", "wb");\r
-               fwrite(systmp0, 1, tmpsiz, fp);\r
-               fclose(fp);\r
-       }\r
-       \r
-       //JITコンパイル\r
-       i = jitc0(&jp, jitbuf + 1024 * 1024, systmp0, systmp0 + tmpsiz, env.executionLevel, label);\r
-       if (i == 1){\r
-               fputs("app-file header error.\n", stderr);\r
-               return 1;\r
-       }\r
-       if (i != 0){\r
-               return 1;\r
-       }\r
-       di1_serial++;\r
-       \r
-       int appsiz2 = jp - jitbuf;\r
-       \r
-       unsigned char *p28 = jp;\r
-       jp = jitCompCallFunc(jp, &devFunc);\r
-       \r
-       tm1 = clock() / (double)CLOCKS_PER_SEC;\r
-       \r
-       /* レジスタ初期化 */\r
-       for (i = 0; i < 64; i++){\r
-               env.ireg[i] = 0;\r
-       }\r
-       for (i = 0; i < 64; i++) {\r
-               env.preg[i].p = NULL;\r
-               env.preg[i].typ = -1;\r
-               env.preg[i].p0 = NULL;\r
-               env.preg[i].p1 = NULL;\r
-       }\r
-       \r
-       env.buf0 = env.buf1 = NULL;\r
-       env.preg[0x28].p = p28;\r
-       env.preg[0x28].typ = 0; // TYP_CODE\r
-       env.preg[0x28].p0 = p28;\r
-       env.preg[0x28].p1 = p28 + 1;\r
-       //env.preg[0x00].p = malloc(1024 * 1024) + (1024 * 1024 - 32);\r
-       env.junkStack = malloc(stacksiz << 20);\r
-       env.junkStack1 = env.junkStack + (stacksiz << 20);\r
-       env.winClosed = 0;\r
-       env.autoSleep = 0;\r
-       env.setjmpEnv = &setjmpEnv;\r
-       env.lastConsoleChar = '\n';\r
-       \r
-       env.label = label;\r
-       env.maxLabels = JITC_MAXLABELS;\r
-       env.jitbuf = jp;\r
-       env.jitbuf1 = jitbuf + 1024 * 1024;\r
-       env.errHndl = &errorHandler;\r
-       \r
-       env.dbgr = 0;\r
-       if (searchArg(argc, (const char **)argv, "dbgr:1", 0) != NULL){\r
-               env.dbgr = 1;\r
-       }\r
-       \r
-       if ((argDebug & 1) != 0) {\r
-               fp = fopen("debug1.bin", "wb");\r
-               fwrite(jitbuf, 1, jp - jitbuf, fp);\r
-               fclose(fp);\r
-       }\r
-       \r
-       /* JITコード実行 */\r
-       jitfunc = (void *)jitbuf;\r
-       if (setjmp(setjmpEnv) == 0){\r
-               (*jitfunc)(((char *)&env) + 128); /* サイズを節約するためにEBPを128バイトずらす */\r
-       }\r
-       if (env.autoSleep != 0) {\r
-               if (mainWindow.vram != NULL){\r
-                       drv_flshWin(mainWindow.xsize, mainWindow.ysize, 0, 0);\r
-               }\r
-               while (env.winClosed == 0){\r
-                       drv_sleep(100);\r
-               }\r
-       }\r
-       if (env.lastConsoleChar != '\n'){\r
-               putchar('\n');\r
-       }\r
-       \r
-       tm2 = clock() / (double)CLOCKS_PER_SEC;\r
-       \r
-       /* 実行結果確認のためのレジスタダンプ */\r
-       if (searchArg(argc, (const char **)argv, "verbose:1", 0) != NULL) {\r
-               printf("time: JITC=%.3f[sec], exec=%.3f[sec]\n", tm1 - tm0, tm2 - tm1);\r
-               printf("size: OSECPU=%d, decomp=%d, tmp=%d, native=%d\n", env.appSize0, env.appSize1, tmpsiz, appsiz2);\r
-               printf("result:\n");\r
-               printf("R00:0x%08X  R01:0x%08X  R02:0x%08X  R03:0x%08X\n", env.ireg[0], env.ireg[1], env.ireg[2], env.ireg[3]);\r
-       }\r
-#if (USE_DEBUGGER != 0)\r
-       dbgrMain(&env);\r
-#endif\r
-       return 0;\r
-}\r
-\r
-unsigned char *Init_LoadSysLib(char argv0[], unsigned char *tmpWorkMemory)\r
-{\r
-       unsigned char *syslib;\r
-       FILE *fp;\r
-       unsigned char *up;\r
-       int appsize;\r
-       \r
-       /* syslibの読み込み */\r
-       syslib = malloc(SYSLIBSIZ1);\r
-       fp = fopen(SYSLIB_OSE, "rb");\r
-       if (fp == NULL) {\r
-               syslib[0] = '/';\r
-               strcpy((char *)syslib + 1, argv0);\r
-               up = syslib + 1;\r
-               while (*up != '\0'){\r
-                       up++;\r
-               }\r
-               while (*up != '/' && *up != 0x5c){\r
-                       up--;\r
-               }\r
-               up++;\r
-               strcpy((char *)up, SYSLIB_OSE);\r
-               fp = fopen((char *)syslib + 1, "rb");\r
-       }\r
-       if (fp == NULL) {\r
-               fputs("syslib-file fopen error.\n", stderr);\r
-               exit(EXIT_FAILURE);\r
-       }\r
-       appsize = fread(syslib, 1, SYSLIBSIZ1 - 4, fp);\r
-       fclose(fp);\r
-       if (appsize >= SYSLIBSIZ1 - 4) {\r
-               fputs("syslib-file too large.\n", stderr);\r
-               exit(EXIT_FAILURE);\r
-       }\r
-       if (syslib[0] == 0x05 && syslib[1] == 0xc1) {\r
-               // maklib のライブラリ形式である。\r
-               memcpy(tmpWorkMemory, syslib, appsize);\r
-               ComLib_main(tmpWorkMemory + 2, syslib + 2);\r
-               syslib[0] = 0x05;\r
-               syslib[1] = 0x1b;\r
-       }\r
-       \r
-       fp = fopen("syslib_dbg.ose", "wb");\r
-       fwrite(syslib, 1, SYSLIBSIZ1, fp);\r
-       fclose(fp);\r
-       return syslib;\r
-}\r
-\r
-void LoadAppBin(HOSECPU_RuntimeEnvironment *env)\r
-{\r
-       FILE *fp;\r
-       const char *fileName;\r
-       /* アプリバイナリの読み込み */\r
-       if (env->mainArgc <= 1) {\r
-               //アプリ名未指定なので何事もなく終了\r
-               exit(EXIT_SUCCESS);\r
-       }\r
-       fileName = env->mainArgv[1];\r
-       //アプリ名先頭に:n:をつけることでレベルnでの実行が可能?\r
-       if (fileName[0] == ':' && fileName[2] == ':') {\r
-               env->executionLevel = fileName[1] - '0';\r
-               if (env->executionLevel < 0 || env->executionLevel > 9){\r
-                       env->executionLevel = JITC_LV_SLOWEST;\r
-               }\r
-               fileName += 3;\r
-       }\r
-       \r
-       fp = fopen(fileName, "rb");\r
-       if (fp == NULL) {\r
-               fputs("app-file load error.\n", stderr);\r
-               exit(EXIT_FAILURE);\r
-       }\r
-       env->appSize0 = fread(env->appBin, 1, APPSIZ1 - 4, fp);\r
-       env->appSize1 = env->appSize0;\r
-       fclose(fp);\r
-       \r
-       if (env->appSize0 >= APPSIZ1 - 4) {\r
-               fputs("app-file too large.\n", stderr);\r
-               exit(EXIT_FAILURE);\r
-       }\r
-       if (env->appSize0 < 3) {\r
-               fputs("app-file header error.\n", stderr);\r
-               exit(EXIT_FAILURE);\r
-       }\r
-}\r
+#include "osecpu.h"
+
+int *keybuf, keybuf_r, keybuf_w, keybuf_c;
+HOSECPU_Device_Window mainWindow;
+//デバッグ用。プログラム中の随所で加算される変数
+int di1_serial;
+
+
+
+unsigned char *Init_LoadSysLib(char argv0[], unsigned char *tmpWorkMemory);
+void LoadAppBin(HOSECPU_RuntimeEnvironment *env);
+
+void putKeybuf(int i)
+{
+       if (keybuf_c < KEYBUFSIZ) {
+               keybuf[keybuf_w] = i;
+               keybuf_c++;
+               keybuf_w = (keybuf_w + 1) & (KEYBUFSIZ - 1);
+       }
+       return;
+}
+
+int HeavyOSECPUMain(int argc, char **argv)
+{
+       FILE *fp;
+       unsigned char *jitbuf, *sysjit00, *sysjit;
+       unsigned char *systmp0, *systmp1, *systmp2;
+       unsigned char *opTbl;
+       HOSECPU_LabelListTag *label;
+       int tmpsiz, i;
+       jmp_buf setjmpEnv;
+       double tm0, tm1, tm2;
+       HOSECPU_PointerControlTag *ptrCtrl;
+       unsigned char *syslib;
+       int argDebug = 0, stacksiz = 1;
+       const  char *cp;
+       HOSECPU_RuntimeEnvironment env;
+       void(*jitfunc)(char *);
+       unsigned char *jp;
+       
+       //Initialize mainWindow
+       mainWindow.vram = NULL;
+       mainWindow.xsize = 0;
+       mainWindow.ysize = 0;
+       di1_serial = 0;
+       
+       //実行環境初期化
+       env.mainArgc = argc;
+       env.mainArgv = (const char **)argv;
+       env.appBin = malloc(APPSIZ1);
+       env.executionLevel = JITC_LV_SLOWEST;
+       jitbuf = mallocRWE(1024 * 1024); /* とりあえず1MBで */
+       //unsigned char *sysjit0 = mallocRWE(SJITSIZ1), *sysjit1 = sysjit0, *sysjit00 = sysjit0;
+       // syslib.oseのjitc結果を格納する領域を確保。
+       sysjit00 = mallocRWE(SJITSIZ1);
+       sysjit = sysjit00;
+       // 現在の、jitc結果を格納するメモリへの書き込み位置のアドレス
+       // sysjit: 現在のjitc書き込み位置
+       // sysjit00: jitc結果の先頭
+       //ワークメモリを三つくらいもらう
+       systmp0 = malloc(SYSTMP0SIZ);   /* syslibのjitc用 */
+       systmp1 = malloc(SYSTMP1SIZ);
+       systmp2 = malloc(1024 * 1024);
+       
+       opTbl = malloc(256);
+       label = malloc(JITC_MAXLABELS * sizeof (HOSECPU_LabelListTag));
+       keybuf = malloc(KEYBUFSIZ * sizeof (int));
+       keybuf_r = keybuf_w = keybuf_c = 0;
+       ptrCtrl = malloc(PTRCTRLSIZ * sizeof (HOSECPU_PointerControlTag));
+       
+       randStatInit((unsigned int)time(NULL));
+       for (i = 0; i < PTRCTRLSIZ; i++) {
+               ptrCtrl[i].liveSign = 0;
+               ptrCtrl[i].size = -1;
+       }
+       ptrCtrl[0].size = -2;
+       
+       /* syslibの読み込み */
+       syslib = Init_LoadSysLib(argv[0], systmp0);
+       
+       sysjit = jitCompInit(sysjit);
+       sysjit00 = sysjit;
+       // labelはjitc0()内で初期化される。
+       i = jitc0(&sysjit, sysjit00 + SJITSIZ1, syslib + 32, syslib + SYSLIBSIZ1, JITC_LV_SLOWEST+9, label);
+       if (i != 0){
+               fputs("syslib-file JITC error.\n", stderr);
+               return 1;
+       }
+       
+       // エラー時にデバッグ用に表示する変数を加算
+       di1_serial++;
+       
+       /* アプリバイナリの読み込み */
+       LoadAppBin(&env);
+       
+       /* クロック初期化 */
+       tm0 = clock() / (double)CLOCKS_PER_SEC;
+       
+       if (env.appBin[2] == 0xf0) {
+               // tek5圧縮がかかっている
+#if (USE_TEK5 != 0)
+               env.appSize1 = tek5Decomp(env.appBin + 2, env.appBin + env.appSize0, systmp0) + 2;
+#else
+               env.appSize1 = -9;
+#endif
+               if (env.appSize1 < 0) {
+                       fputs("unsupported-format(tek5)\n", stderr);
+                       return 1;
+               }
+       }
+       //デバッグモード指定
+       cp = searchArg(argc, (const char **)argv, "debug:", 0);
+       if (cp != NULL){
+               argDebug = *cp - '0';
+       }
+       //スタックサイズ指定(MiB単位)
+       cp = searchArg(argc, (const char **)argv, "stack:", 0);
+       if (cp != NULL){
+               stacksiz = strtol(cp, NULL, 0);
+       }
+       jp = jitbuf; /* JIT-pointer */
+       
+       /* フロントエンドコードをバックエンドコードに変換する */
+       if ((env.appBin[2] & 0xf0) != 0) {
+               systmp0[0] = env.appBin[0];
+               systmp0[1] = env.appBin[1];
+               env.preg[2].p = systmp0 + 2;
+               env.preg[3].p = systmp0 + SYSTMP0SIZ;
+               env.preg[4].p = env.appBin + 2;
+               env.preg[5].p = env.appBin + env.appSize1;
+               env.preg[6].p = systmp1;
+               env.preg[7].p = systmp1 + SYSTMP1SIZ;
+               env.preg[10].p = systmp2;
+               int pxxFlag[64], typLabel[4096];
+               env.preg[0x0b].p = (void *)pxxFlag;
+               env.preg[0x0c].p = (void *)typLabel;
+               env.preg[0x0d].p = opTbl;
+               jitfunc = (void *)sysjit00;
+               (*jitfunc)(((char *)&env) + 128); /* サイズを節約するためにEBPを128バイトずらす */
+               if (env.ireg[0] != 0) {
+                       jp = env.preg[2].p - 1;
+                       fprintf(stderr, "unpack error: %02X (at %06X) (R00=%d)\n", *jp, jp - systmp0, env.ireg[0]);
+                       if ((argDebug & 2) != 0) {
+                               fp = fopen("debug2.bin", "wb");
+                               fwrite(systmp0, 1, jp - systmp0 + 16, fp);
+                               fclose(fp);
+                       }
+                       exit(1);
+               }
+               tmpsiz = env.preg[2].p - systmp0;
+       } else{
+               memcpy(systmp0, env.appBin, env.appSize1);
+               tmpsiz = env.appSize1;
+       }
+       
+       if ((argDebug & 2) != 0) {
+               /*変換後のバックエンドコードをファイルへ保存*/
+               fp = fopen("debug2.bin", "wb");
+               fwrite(systmp0, 1, tmpsiz, fp);
+               fclose(fp);
+       }
+       
+       //JITコンパイル
+       i = jitc0(&jp, jitbuf + 1024 * 1024, systmp0, systmp0 + tmpsiz, env.executionLevel, label);
+       if (i == 1){
+               fputs("app-file header error.\n", stderr);
+               return 1;
+       }
+       if (i != 0){
+               return 1;
+       }
+       di1_serial++;
+       
+       int appsiz2 = jp - jitbuf;
+       
+       unsigned char *p28 = jp;
+       jp = jitCompCallFunc(jp, &devFunc);
+       
+       tm1 = clock() / (double)CLOCKS_PER_SEC;
+       
+       /* レジスタ初期化 */
+       for (i = 0; i < 64; i++){
+               env.ireg[i] = 0;
+       }
+       for (i = 0; i < 64; i++) {
+               env.preg[i].p = NULL;
+               env.preg[i].typ = -1;
+               env.preg[i].p0 = NULL;
+               env.preg[i].p1 = NULL;
+       }
+       
+       env.buf0 = env.buf1 = NULL;
+       env.preg[0x28].p = p28;
+       env.preg[0x28].typ = 0; // TYP_CODE
+       env.preg[0x28].p0 = p28;
+       env.preg[0x28].p1 = p28 + 1;
+       //env.preg[0x00].p = malloc(1024 * 1024) + (1024 * 1024 - 32);
+       env.junkStack = malloc(stacksiz << 20);
+       env.junkStack1 = env.junkStack + (stacksiz << 20);
+       env.winClosed = 0;
+       env.autoSleep = 0;
+       env.setjmpEnv = &setjmpEnv;
+       env.lastConsoleChar = '\n';
+       
+       env.label = label;
+       env.maxLabels = JITC_MAXLABELS;
+       env.jitbuf = jp;
+       env.jitbuf1 = jitbuf + 1024 * 1024;
+       env.errHndl = &errorHandler;
+       
+       env.dbgr = 0;
+       if (searchArg(argc, (const char **)argv, "dbgr:1", 0) != NULL){
+               env.dbgr = 1;
+       }
+       
+       if ((argDebug & 1) != 0) {
+               fp = fopen("debug1.bin", "wb");
+               fwrite(jitbuf, 1, jp - jitbuf, fp);
+               fclose(fp);
+       }
+       
+       /* JITコード実行 */
+       jitfunc = (void *)jitbuf;
+       if (setjmp(setjmpEnv) == 0){
+               (*jitfunc)(((char *)&env) + 128); /* サイズを節約するためにEBPを128バイトずらす */
+       }
+       if (env.autoSleep != 0) {
+               if (mainWindow.vram != NULL){
+                       drv_flshWin(mainWindow.xsize, mainWindow.ysize, 0, 0);
+               }
+               while (env.winClosed == 0){
+                       drv_sleep(100);
+               }
+       }
+       if (env.lastConsoleChar != '\n'){
+               putchar('\n');
+       }
+       
+       tm2 = clock() / (double)CLOCKS_PER_SEC;
+       
+       /* 実行結果確認のためのレジスタダンプ */
+       if (searchArg(argc, (const char **)argv, "verbose:1", 0) != NULL) {
+               printf("time: JITC=%.3f[sec], exec=%.3f[sec]\n", tm1 - tm0, tm2 - tm1);
+               printf("size: OSECPU=%d, decomp=%d, tmp=%d, native=%d\n", env.appSize0, env.appSize1, tmpsiz, appsiz2);
+               printf("result:\n");
+               printf("R00:0x%08X  R01:0x%08X  R02:0x%08X  R03:0x%08X\n", env.ireg[0], env.ireg[1], env.ireg[2], env.ireg[3]);
+       }
+#if (USE_DEBUGGER != 0)
+       dbgrMain(&env);
+#endif
+       return 0;
+}
+
+unsigned char *Init_LoadSysLib(char argv0[], unsigned char *tmpWorkMemory)
+{
+       unsigned char *syslib;
+       FILE *fp;
+       unsigned char *up;
+       int appsize;
+       
+       /* syslibの読み込み */
+       syslib = malloc(SYSLIBSIZ1);
+       fp = fopen(SYSLIB_OSE, "rb");
+       if (fp == NULL) {
+               syslib[0] = '/';
+               strcpy((char *)syslib + 1, argv0);
+               up = syslib + 1;
+               while (*up != '\0'){
+                       up++;
+               }
+               while (*up != '/' && *up != 0x5c){
+                       up--;
+               }
+               up++;
+               strcpy((char *)up, SYSLIB_OSE);
+               fp = fopen((char *)syslib + 1, "rb");
+       }
+       if (fp == NULL) {
+               fputs("syslib-file fopen error.\n", stderr);
+               exit(EXIT_FAILURE);
+       }
+       appsize = fread(syslib, 1, SYSLIBSIZ1 - 4, fp);
+       fclose(fp);
+       if (appsize >= SYSLIBSIZ1 - 4) {
+               fputs("syslib-file too large.\n", stderr);
+               exit(EXIT_FAILURE);
+       }
+       if (syslib[0] == 0x05 && syslib[1] == 0xc1) {
+               // maklib のライブラリ形式である。
+               memcpy(tmpWorkMemory, syslib, appsize);
+               ComLib_main(tmpWorkMemory + 2, syslib + 2);
+               syslib[0] = 0x05;
+               syslib[1] = 0x1b;
+       }
+       
+       fp = fopen("syslib_dbg.ose", "wb");
+       fwrite(syslib, 1, SYSLIBSIZ1, fp);
+       fclose(fp);
+       return syslib;
+}
+
+void LoadAppBin(HOSECPU_RuntimeEnvironment *env)
+{
+       FILE *fp;
+       const char *fileName;
+       /* アプリバイナリの読み込み */
+       if (env->mainArgc <= 1) {
+               //アプリ名未指定なので何事もなく終了
+               exit(EXIT_SUCCESS);
+       }
+       fileName = env->mainArgv[1];
+       //アプリ名先頭に:n:をつけることでレベルnでの実行が可能?
+       if (fileName[0] == ':' && fileName[2] == ':') {
+               env->executionLevel = fileName[1] - '0';
+               if (env->executionLevel < 0 || env->executionLevel > 9){
+                       env->executionLevel = JITC_LV_SLOWEST;
+               }
+               fileName += 3;
+       }
+       
+       fp = fopen(fileName, "rb");
+       if (fp == NULL) {
+               fputs("app-file load error.\n", stderr);
+               exit(EXIT_FAILURE);
+       }
+       env->appSize0 = fread(env->appBin, 1, APPSIZ1 - 4, fp);
+       env->appSize1 = env->appSize0;
+       fclose(fp);
+       
+       if (env->appSize0 >= APPSIZ1 - 4) {
+               fputs("app-file too large.\n", stderr);
+               exit(EXIT_FAILURE);
+       }
+       if (env->appSize0 < 3) {
+               fputs("app-file header error.\n", stderr);
+               exit(EXIT_FAILURE);
+       }
+}