X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;ds=sidebyside;f=main.c;h=293622e434d671ae878ccc5805c8240751abce68;hb=1e67a042b88d3bfebb9335dddacc5e2b71df2846;hp=1849d16a05ce4cbe2cf0ad39fffb04a84fd60eac;hpb=a603aa3bfbf5f089ab7402bfb6f4e47d839467e7;p=heavyosecpu%2FHeavyOSECPU.git diff --git a/main.c b/main.c index 1849d16..293622e 100644 --- a/main.c +++ b/main.c @@ -1,4 +1,11 @@ -#include "osecpu.h" +#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); @@ -15,82 +22,82 @@ void putKeybuf(int i) 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; + 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; + unsigned char *syslib; + int argDebug = 0, stacksiz = 1; + const char *cp; + HOSECPU_RuntimeEnvironment env; void(*jitfunc)(char *); - unsigned char *jp; - - //実行環境初期化 - env.mainArgc = argc; - env.mainArgv = (const char **)argv; - env.appBin = malloc(APPSIZ1); - env.executionLevel = JITC_LV_SLOWEST; + 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); - // 現在の、jitc結果を格納するメモリへの書き込み位置のアドレス - // sysjit: 現在のjitc書き込み位置 - // sysjit00: jitc結果の先頭 sysjit = sysjit00; - //ワークメモリを三つくらいもらう + // 現在の、jitc結果を格納するメモリへの書き込み位置のアドレス + // sysjit: 現在のjitc書き込み位置 + // sysjit00: jitc結果の先頭 + //ワークメモリを三つくらいもらう systmp0 = malloc(SYSTMP0SIZ); /* syslibのjitc用 */ systmp1 = malloc(SYSTMP1SIZ); systmp2 = malloc(1024 * 1024); - - opTbl = malloc(256); + + 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); - - // jitc.cのerrHndl()をCALLするネィティブコードを挿入。 - // sysjitの値は次の書き込み位置へずらされる。 - // 元々のsysjitはsysjit00へ保存されている。 + + /* syslibの読み込み */ + syslib = Init_LoadSysLib(argv[0], systmp0); + sysjit = jitCompInit(sysjit); - - // sysjit (アドレス変数)は下の関数の実行で変更される(だから参照渡し) - // もちろんsysjitの値は次の書き込み位置へずらされる。 + sysjit00 = sysjit; // labelはjitc0()内で初期化される。 - i = jitc0(&sysjit, sysjit00 + SJITSIZ1, syslib + 32, syslib + SYSLIBSIZ1, JITC_LV_FASTEST, label); + 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); - - /* クロック初期化 */ + + /* アプリバイナリの読み込み */ + LoadAppBin(&env); + + /* クロック初期化 */ tm0 = clock() / (double)CLOCKS_PER_SEC; - + if (env.appBin[2] == 0xf0) { - // tek5圧縮がかかっている + // tek5圧縮がかかっている #if (USE_TEK5 != 0) env.appSize1 = tek5Decomp(env.appBin + 2, env.appBin + env.appSize0, systmp0) + 2; #else @@ -101,18 +108,18 @@ int HeavyOSECPUMain(int argc, char **argv) return 1; } } - //デバッグモード指定 + //デバッグモード指定 cp = searchArg(argc, (const char **)argv, "debug:", 0); if (cp != NULL){ - argDebug = *cp - '0'; - } - //スタックサイズ指定 + argDebug = *cp - '0'; + } + //スタックサイズ指定(MiB単位) cp = searchArg(argc, (const char **)argv, "stack:", 0); if (cp != NULL){ - stacksiz = strtol(cp, NULL, 0); - } + stacksiz = strtol(cp, NULL, 0); + } jp = jitbuf; /* JIT-pointer */ - + /* フロントエンドコードをバックエンドコードに変換する */ if ((env.appBin[2] & 0xf0) != 0) { systmp0[0] = env.appBin[0]; @@ -128,7 +135,7 @@ int HeavyOSECPUMain(int argc, char **argv) env.preg[0x0b].p = (void *)pxxFlag; env.preg[0x0c].p = (void *)typLabel; env.preg[0x0d].p = opTbl; - jitfunc = (void *)sysjit; + jitfunc = (void *)sysjit00; (*jitfunc)(((char *)&env) + 128); /* サイズを節約するためにEBPを128バイトずらす */ if (env.ireg[0] != 0) { jp = env.preg[2].p - 1; @@ -145,91 +152,92 @@ int HeavyOSECPUMain(int argc, char **argv) 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); + fputs("app-file header error.\n", stderr); return 1; - } + } if (i != 0){ - return 1; - } + 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.argc = argc; - env.argv = (const char **)argv; + 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.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; - } - + 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 (vram != NULL){ - drv_flshWin(v_xsiz, v_ysiz, 0, 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); @@ -245,12 +253,12 @@ int HeavyOSECPUMain(int argc, char **argv) unsigned char *Init_LoadSysLib(char argv0[], unsigned char *tmpWorkMemory) { - unsigned char *syslib; - FILE *fp; - unsigned char *up; - int appsize; - - /* syslibの読み込み */ + unsigned char *syslib; + FILE *fp; + unsigned char *up; + int appsize; + + /* syslibの読み込み */ syslib = malloc(SYSLIBSIZ1); fp = fopen(SYSLIB_OSE, "rb"); if (fp == NULL) { @@ -258,18 +266,18 @@ unsigned char *Init_LoadSysLib(char argv0[], unsigned char *tmpWorkMemory) strcpy((char *)syslib + 1, argv0); up = syslib + 1; while (*up != '\0'){ - up++; - } + up++; + } while (*up != '/' && *up != 0x5c){ - up--; - } + 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); + exit(EXIT_FAILURE); } appsize = fread(syslib, 1, SYSLIBSIZ1 - 4, fp); fclose(fp); @@ -278,49 +286,47 @@ unsigned char *Init_LoadSysLib(char argv0[], unsigned char *tmpWorkMemory) exit(EXIT_FAILURE); } if (syslib[0] == 0x05 && syslib[1] == 0xc1) { - // 一体この部分ではなにをやっているのだろう? - // OSECPUに0x05, 0x1bという命令はないが... ヘッダ? - // どうせ初めからの32バイトは無視されるのだろうに... + // 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; + return syslib; } void LoadAppBin(HOSECPU_RuntimeEnvironment *env) { - FILE *fp; - const char *fileName; + FILE *fp; + const char *fileName; /* アプリバイナリの読み込み */ if (env->mainArgc <= 1) { - //アプリ名未指定なので何事もなく終了 - exit(EXIT_SUCCESS); - } + //アプリ名未指定なので何事もなく終了 + exit(EXIT_SUCCESS); + } fileName = env->mainArgv[1]; - //アプリ名先頭に:n:をつけることでレベルnでの実行が可能? + //アプリ名先頭に: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; + env->appSize1 = env->appSize0; fclose(fp); - + if (env->appSize0 >= APPSIZ1 - 4) { fputs("app-file too large.\n", stderr); exit(EXIT_FAILURE);