\r
\r
\r
-unsigned char *Init_LoadSysLib(char argv0[], unsigned char *tmpWorkMemory);\r
+unsigned char *Init_LoadSysLib(char argv0[]);\r
void LoadAppBin(HOSECPU_RuntimeEnvironment *env);\r
\r
void putKeybuf(int i)\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
+ unsigned char *pAppJITBin;\r
+ unsigned char *appBinDevFuncBase;\r
+ unsigned char *pSyslibJITBin;\r
+ unsigned char *syslibJITBinBase;\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
+ // For decoder work\r
+ unsigned char *bufP06; // P06 UINT8 >=2M\r
+ unsigned int *bufP0A; // P0A UINT32 16K\r
+ int *pxxFlag; // P0B SINT32 64\r
+ int *typLabel; // P0C SINT32 4K\r
+ unsigned char *opTbl; // P0D UINT8 256\r
+ // For tek decomp\r
+ unsigned char *tekDecompTemp;\r
+ // time counter\r
+ double tm0, tm1, tm2;\r
+ // options from arguments\r
+ int argDebugMode = 0;\r
+ int argStackSize = 1;\r
+ //\r
+ int i;\r
+ const char *s;\r
+ unsigned char *p;\r
+ FILE *fp;\r
+ \r
+ //\r
+ // Initialize\r
+ //\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
+ // Initialize keyInputting\r
+ keybuf = malloc(KEYBUFSIZ * sizeof(int));\r
+ keybuf_r = keybuf_w = keybuf_c = 0;\r
+ // Initialize HOSECPU_RuntimeEnvironment\r
env.mainArgc = argc;\r
env.mainArgv = (const char **)argv;\r
- env.appBin = malloc(APPSIZ1);\r
+ //\r
+ env.appOSECPUBin = malloc(APPBINSIZE);\r
+ env.appOSECPUBackendBin = malloc(APPBINSIZE);\r
+ //\r
+ env.appJITBin = mallocRWE(APPJITSIZE);\r
+ fprintf(stderr, "appJITBin: %p\n", env.appJITBin);\r
+ pAppJITBin = env.appJITBin;\r
+ fprintf(stderr, "pAppJITBin: %p\n", pAppJITBin);\r
+ env.syslibJITBin = mallocRWE(SYSLIBJITSIZE);\r
+ pSyslibJITBin = env.syslibJITBin;\r
+ // syslibJITBin image:\r
+ // env.syslibJITBin + - - - -\r
+ // | errHndl\r
+ // syslibJITBinBase + - - - -\r
+ // | syslib\r
+ //\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
+ // For decoder work\r
+ bufP06 = malloc(DECODER_BUF06_SIZE);\r
+ bufP0A = malloc(DECODER_BUF0A_SIZE);\r
+ pxxFlag = malloc(64 * 4);\r
+ typLabel = malloc(4096 * 4);\r
opTbl = malloc(256);\r
+ //\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
+ randStatInit((unsigned int)time(NULL));\r
\r
- /* syslibの読み込み */\r
- syslib = Init_LoadSysLib(argv[0], systmp0);\r
+ //\r
+ // Load syslib\r
+ //\r
+ \r
+ env.syslibOSECPUBin = Init_LoadSysLib(argv[0]);\r
\r
- sysjit = jitCompInit(sysjit);\r
- sysjit00 = sysjit;\r
+ pSyslibJITBin = jitCompInit(pSyslibJITBin);\r
+ syslibJITBinBase = pSyslibJITBin;\r
// labelはjitc0()内で初期化される。\r
- i = jitc0(&sysjit, sysjit00 + SYSJITSIZ1, syslib + 32, syslib + SYSLIBSIZ1, JITC_LV_SLOWEST+9, label);\r
+ i = jitc0(&pSyslibJITBin, env.syslibJITBin + SYSLIBJITSIZE, env.syslibOSECPUBin + 32, env.syslibOSECPUBin + SYSLIBBINSIZE, 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
+ if (env.appOSECPUBin[2] == 0xf0) {\r
// tek5圧縮がかかっている\r
#if (USE_TEK5 != 0)\r
- env.appSize1 = tek5Decomp(env.appBin + 2, env.appBin + env.appSize0, systmp0);\r
+ tekDecompTemp = malloc(TEKDECOMPTMPSIZE);\r
+ env.appSize1 = tek5Decomp(env.appOSECPUBin + 2, env.appOSECPUBin + env.appSize0, tekDecompTemp);\r
+ free(tekDecompTemp);\r
env.appSize1 += 2;\r
#else\r
env.appSize1 = -9;\r
}\r
}\r
//デバッグモード指定\r
- cp = searchArg(argc, (const char **)argv, "debug:", 0);\r
- if (cp != NULL){\r
- argDebug = *cp - '0';\r
+ s = searchArg(argc, (const char **)argv, "debug:", 0);\r
+ if (s != NULL){\r
+ argDebugMode = *s - '0';\r
}\r
//スタックサイズ指定(MiB単位)\r
- cp = searchArg(argc, (const char **)argv, "stack:", 0);\r
- if (cp != NULL){\r
- stacksiz = strtol(cp, NULL, 0);\r
+ s = searchArg(argc, (const char **)argv, "stack:", 0);\r
+ if (s != NULL){\r
+ argStackSize = strtol(s, 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.appOSECPUBin[2] & 0xf0) != 0) { // 3バイト目が00なら処理しない\r
+ env.appOSECPUBackendBin[0] = env.appOSECPUBin[0];\r
+ env.appOSECPUBackendBin[1] = env.appOSECPUBin[1];\r
+ env.preg[2].p = &env.appOSECPUBackendBin[2];\r
+ env.preg[3].p = &env.appOSECPUBackendBin[APPBINSIZE];\r
+ env.preg[4].p = &env.appOSECPUBin[2];\r
+ env.preg[5].p = &env.appOSECPUBin[env.appSize1];\r
+ env.preg[6].p = bufP06;\r
+ env.preg[7].p = bufP06 + DECODER_BUF06_SIZE;\r
+ env.preg[0x0A].p = (unsigned char *)bufP0A;\r
+ env.preg[0x0B].p = (void *)pxxFlag;\r
+ env.preg[0x0C].p = (void *)typLabel;\r
+ env.preg[0x0D].p = opTbl;\r
+ jitcRunBinary((void *)syslibJITBinBase, &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
+ p = env.preg[2].p - 1;\r
+ fprintf(stderr, "unpack error: %02X (at %06X) (R00=%d)\n", *p, p - env.appOSECPUBackendBin, env.ireg[0]);\r
+ if ((argDebugMode & 2) != 0) {\r
fp = fopen("debug2.bin", "wb");\r
- fwrite(systmp0, 1, jp - systmp0 + 16, fp);\r
+ fwrite(env.appOSECPUBackendBin, 1, p - env.appOSECPUBackendBin + 16, fp);\r
fclose(fp);\r
}\r
exit(1);\r
}\r
- tmpsiz = env.preg[2].p - systmp0;\r
+ env.appOSECPUBackendBinSize = env.preg[2].p - env.appOSECPUBackendBin;\r
} else{\r
- memcpy(systmp0, env.appBin, env.appSize1);\r
- tmpsiz = env.appSize1;\r
+ memcpy(env.appOSECPUBackendBin, env.appOSECPUBin, env.appSize1);\r
+ env.appOSECPUBackendBinSize = env.appSize1;\r
}\r
\r
- if ((argDebug & 2) != 0) {\r
+ if ((argDebugMode & 2) != 0) {\r
/*変換後のバックエンドコードをファイルへ保存*/\r
fp = fopen("debug2.bin", "wb");\r
- fwrite(systmp0, 1, tmpsiz, fp);\r
+ fwrite(env.appOSECPUBackendBin, 1, env.appOSECPUBackendBinSize, fp);\r
fclose(fp);\r
}\r
\r
//JITコンパイル\r
- i = jitc0(&jp, jitbuf + 1024 * 1024, systmp0, systmp0 + tmpsiz, env.executionLevel, label);\r
+ fprintf(stderr, "pAppJITBin: %p\n", pAppJITBin);\r
+ i = jitc0(&pAppJITBin, env.appJITBin + APPJITSIZE, env.appOSECPUBackendBin, env.appOSECPUBackendBin + APPBINSIZE, env.executionLevel, label);\r
+ fprintf(stderr, "pAppJITBin: %p\n", pAppJITBin);\r
if (i == 1){\r
fputs("app-file header error.\n", stderr);\r
return 1;\r
}\r
di1_serial++;\r
\r
- int appsiz2 = jp - jitbuf;\r
+ env.appJITBinSize = pAppJITBin - env.appOSECPUBackendBin;\r
\r
- unsigned char *p28 = jp;\r
- jp = jitCompCallFunc(jp, &devFunc);\r
+ // 末尾にAPI関数呼び出しコードを追加\r
+ appBinDevFuncBase = pAppJITBin;\r
+ pAppJITBin = jitCompCallFunc(pAppJITBin, &devFunc);\r
\r
tm1 = clock() / (double)CLOCKS_PER_SEC;\r
\r
}\r
\r
env.buf0 = env.buf1 = NULL;\r
-\r
+ \r
// p28にapiをコールするアドレスを設定\r
- env.preg[0x28].p = p28; // p28には、devFuncをコールするコードが書かれている\r
+ env.preg[0x28].p = appBinDevFuncBase; // appBinDevFuncBaseには、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[0x28].p0 = appBinDevFuncBase; // アドレス演算できる範囲を制限\r
+ env.preg[0x28].p1 = appBinDevFuncBase + 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.junkStack = malloc(argStackSize << 20);\r
+ env.junkStack1 = env.junkStack + (argStackSize << 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.jitbuf = pAppJITBin;\r
+ env.jitbuf1 = env.appJITBin + APPJITSIZE;\r
env.errHndl = &errorHandler;\r
env.appReturnCode = 0;\r
\r
env.dbgr = 1;\r
}\r
\r
- if ((argDebug & 1) != 0) {\r
+ if ((argDebugMode & 1) != 0) {\r
fp = fopen("debug1.bin", "wb");\r
- fwrite(jitbuf, 1, jp - jitbuf, fp);\r
+ fwrite(env.appJITBin, 1, pAppJITBin - env.appJITBin, fp);\r
fclose(fp);\r
}\r
\r
/* JITコード実行 */\r
- jitfunc = (void *)jitbuf;\r
if (setjmp(env.setjmpEnv) == 0){\r
- jitcRunBinary(jitfunc, &env);\r
+ jitcRunBinary((void *)env.appJITBin, &env);\r
}\r
if (env.autoSleep != 0) {\r
if (mainWindow.vram != NULL){\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("size: OSECPU=%d, decomp=%d, tmp=%d, native=%d\n", env.appSize0, env.appSize1, env.appOSECPUBackendBinSize, env.appJITBinSize);\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
dbgrMain(&env);\r
#endif\r
return env.appReturnCode;\r
+ \r
+ return 0;\r
}\r
\r
-unsigned char *Init_LoadSysLib(char argv0[], unsigned char *tmpWorkMemory)\r
+unsigned char *Init_LoadSysLib(char argv0[])\r
{\r
unsigned char *syslib;\r
FILE *fp;\r
unsigned char *up;\r
int appsize;\r
+ unsigned char *tmpWorkMemory;\r
\r
/* syslibの読み込み */\r
- syslib = malloc(SYSLIBSIZ1);\r
+ syslib = malloc(SYSLIBBINSIZE);\r
fp = fopen(SYSLIB_OSE, "rb");\r
if (fp == NULL) {\r
syslib[0] = '/';\r
fputs("syslib-file fopen error.\n", stderr);\r
exit(EXIT_FAILURE);\r
}\r
- appsize = fread(syslib, 1, SYSLIBSIZ1 - 4, fp);\r
+ appsize = fread(syslib, 1, SYSLIBBINSIZE - 4, fp);\r
fclose(fp);\r
- if (appsize >= SYSLIBSIZ1 - 4) {\r
+ if (appsize >= SYSLIBBINSIZE - 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
+ tmpWorkMemory = malloc(SYSLIBDECOMPTMPSIZE);\r
memcpy(tmpWorkMemory, syslib, appsize);\r
ComLib_main(tmpWorkMemory + 2, syslib + 2);\r
+ free(tmpWorkMemory);\r
+ //\r
syslib[0] = 0x05;\r
syslib[1] = 0x1b;\r
}\r
\r
fp = fopen("syslib_dbg.ose", "wb");\r
- fwrite(syslib, 1, SYSLIBSIZ1, fp);\r
+ fwrite(syslib, 1, SYSLIBBINSIZE, fp);\r
fclose(fp);\r
return syslib;\r
}\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->appSize0 = fread(env->appOSECPUBin, 1, APPBINSIZE - 4, fp);\r
env->appSize1 = env->appSize0;\r
fclose(fp);\r
\r
- if (env->appSize0 >= APPSIZ1 - 4) {\r
+ if (env->appSize0 >= APPBINSIZE - 4) {\r
fputs("app-file too large.\n", stderr);\r
exit(EXIT_FAILURE);\r
}\r