X-Git-Url: http://git.osdn.net/view?p=heavyosecpu%2FHeavyOSECPU.git;a=blobdiff_plain;f=main.c;fp=main.c;h=f24bb70ae097c922bc5a77a9a45700b44d2ad022;hp=9cc56e605a9605f93b7c2e288baf6998de8520c3;hb=c19693980dcaa2dee811608bc5eb5728c0d952cb;hpb=510d4ffcf1db0884690d9b90d7b001ea9ad9416f diff --git a/main.c b/main.c index 9cc56e6..f24bb70 100644 --- a/main.c +++ b/main.c @@ -1,346 +1,347 @@ -#include "osecpu.h" - -int *keybuf, keybuf_r, keybuf_w, keybuf_c; -HOSECPU_Device_Window mainWindow; -//デバッグ用。プログラム中の随所で加算される変数 -int di1_serial; -HOSECPU_RuntimeEnvironment *dbg_env; - - - -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) -{ - HOSECPU_RuntimeEnvironment env; - FILE *fp; - unsigned char *jitbuf, *sysjit00, *sysjit; - unsigned char *systmp0, *systmp1, *systmp2; - unsigned char *opTbl; - HOSECPU_LabelListTag *label; - int tmpsiz, i; - double tm0, tm1, tm2; - HOSECPU_PointerControlTag *ptrCtrl; - unsigned char *syslib; - int argDebug = 0, stacksiz = 1; - const char *cp; - void(*jitfunc)(char *); - unsigned char *jp; - - // For debug - dbg_env = &env; - - // 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(APPJITSIZE); /* とりあえず1MBで */ - // syslib.oseのjitc結果を格納する領域を確保。 - sysjit00 = mallocRWE(SYSJITSIZ1); - 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 + SYSJITSIZ1, 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); - env.appSize1 += 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); - } - - // jitbufは先頭。 jpは現在位置 - jp = jitbuf; /* JIT-pointer */ - - /* フロントエンドコードをバックエンドコードに変換する */ - if ((env.appBin[2] & 0xf0) != 0) { // 3バイト目が00なら処理しない - 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; - jitcRunBinary(jitfunc, &env); - 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; - - // p28にapiをコールするアドレスを設定 - env.preg[0x28].p = p28; // p28には、devFuncをコールするコードが書かれている - 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.lastConsoleChar = '\n'; - - env.label = label; - env.maxLabels = JITC_MAXLABELS; - env.jitbuf = jp; - env.jitbuf1 = jitbuf + 1024 * 1024; - env.errHndl = &errorHandler; - env.appReturnCode = 0; - - 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(env.setjmpEnv) == 0){ - jitcRunBinary(jitfunc, &env); - } - 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 env.appReturnCode; -} - -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); - } -} +#include "osecpu.h" + +int *keybuf, keybuf_r, keybuf_w, keybuf_c; +HOSECPU_Device_Window mainWindow; +//デバッグ用。プログラム中の随所で加算される変数 +int di1_serial; +HOSECPU_RuntimeEnvironment *dbg_env; + + + +unsigned char *Init_LoadSysLib(char argv0[], unsigned char *tmpWorkMemory); +void LoadAppBin(HOSECPU_RuntimeEnvironment *env); + +void putKeybuf(int i) +{ + // TODO : あふれた場合のことを考慮すべき + if (keybuf_c < KEYBUFSIZ) { + keybuf[keybuf_w] = i; + keybuf_c++; + keybuf_w = (keybuf_w + 1) & (KEYBUFSIZ - 1); + } + return; +} + +int HeavyOSECPUMain(int argc, char **argv) +{ + HOSECPU_RuntimeEnvironment env; + FILE *fp; + unsigned char *jitbuf, *sysjit00, *sysjit; + unsigned char *systmp0, *systmp1, *systmp2; + unsigned char *opTbl; + HOSECPU_LabelListTag *label; + int tmpsiz, i; + double tm0, tm1, tm2; + HOSECPU_PointerControlTag *ptrCtrl; + unsigned char *syslib; + int argDebug = 0, stacksiz = 1; + const char *cp; + void(*jitfunc)(char *); + unsigned char *jp; + + // For debug + dbg_env = &env; + + // 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(APPJITSIZE); /* とりあえず1MBで */ + // syslib.oseのjitc結果を格納する領域を確保。 + sysjit00 = mallocRWE(SYSJITSIZ1); + 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 + SYSJITSIZ1, 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); + env.appSize1 += 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); + } + + // jitbufは先頭。 jpは現在位置 + jp = jitbuf; /* JIT-pointer */ + + /* フロントエンドコードをバックエンドコードに変換する */ + if ((env.appBin[2] & 0xf0) != 0) { // 3バイト目が00なら処理しない + 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; + jitcRunBinary(jitfunc, &env); + 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; + + // p28にapiをコールするアドレスを設定 + env.preg[0x28].p = p28; // p28には、devFuncをコールするコードが書かれている + 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.lastConsoleChar = '\n'; + + env.label = label; + env.maxLabels = JITC_MAXLABELS; + env.jitbuf = jp; + env.jitbuf1 = jitbuf + 1024 * 1024; + env.errHndl = &errorHandler; + env.appReturnCode = 0; + + 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(env.setjmpEnv) == 0){ + jitcRunBinary(jitfunc, &env); + } + 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 env.appReturnCode; +} + +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); + } +}