-#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"\r
+\r
+int *keybuf, keybuf_r, keybuf_w, keybuf_c;\r
+HOSECPU_Device_Window mainWindow;\r
+//デバッグ用。プログラム中の随所で加算される変数\r
+int di1_serial;\r
+HOSECPU_RuntimeEnvironment *dbg_env;\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
+ // TODO : あふれた場合のことを考慮すべき\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
+ HOSECPU_RuntimeEnvironment env;\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
+ double tm0, tm1, tm2;\r
+ HOSECPU_PointerControlTag *ptrCtrl;\r
+ unsigned char *syslib;\r
+ int argDebug = 0, stacksiz = 1;\r
+ const char *cp;\r
+ void(*jitfunc)(char *);\r
+ unsigned char *jp;\r
+ \r
+ // For debug\r
+ dbg_env = &env;\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(APPJITSIZE); /* とりあえず1MBで */\r
+ // syslib.oseのjitc結果を格納する領域を確保。\r
+ sysjit00 = mallocRWE(SYSJITSIZ1);\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 + SYSJITSIZ1, 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);\r
+ env.appSize1 += 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
+\r
+ // jitbufは先頭。 jpは現在位置\r
+ jp = jitbuf; /* JIT-pointer */\r
+ \r
+ /* フロントエンドコードをバックエンドコードに変換する */\r
+ if ((env.appBin[2] & 0xf0) != 0) { // 3バイト目が00なら処理しない\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
+ jitcRunBinary(jitfunc, &env);\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
+\r
+ // p28にapiをコールするアドレスを設定\r
+ env.preg[0x28].p = p28; // p28には、devFuncをコールするコードが書かれている\r
+ env.preg[0x28].typ = 0; // TYP_CODE\r
+ env.preg[0x28].p0 = p28; // アドレス演算できる範囲を制限\r
+ env.preg[0x28].p1 = p28 + 1; // アドレス演算できる範囲を制限\r
+\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.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
+ env.appReturnCode = 0;\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(env.setjmpEnv) == 0){\r
+ jitcRunBinary(jitfunc, &env);\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 env.appReturnCode;\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