OSDN Git Service

HeavyOSECPUMainの各変数名を適切なものへ変更。
[heavyosecpu/HeavyOSECPU.git] / main.c
diff --git a/main.c b/main.c
index f24bb70..ac28a92 100644 (file)
--- a/main.c
+++ b/main.c
@@ -8,7 +8,7 @@ HOSECPU_RuntimeEnvironment *dbg_env;
 \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
@@ -25,84 +25,106 @@ void putKeybuf(int i)
 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
@@ -113,61 +135,58 @@ int HeavyOSECPUMain(int argc, char **argv)
                }\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
@@ -177,10 +196,11 @@ int HeavyOSECPUMain(int argc, char **argv)
        }\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
@@ -196,24 +216,24 @@ int HeavyOSECPUMain(int argc, char **argv)
        }\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
@@ -222,16 +242,15 @@ int HeavyOSECPUMain(int argc, char **argv)
                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
@@ -250,7 +269,7 @@ int HeavyOSECPUMain(int argc, char **argv)
        /* 実行結果確認のためのレジスタダンプ */\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
@@ -258,17 +277,20 @@ int HeavyOSECPUMain(int argc, char **argv)
        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
@@ -288,22 +310,25 @@ unsigned char *Init_LoadSysLib(char argv0[], unsigned char *tmpWorkMemory)
                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
@@ -332,11 +357,11 @@ void LoadAppBin(HOSECPU_RuntimeEnvironment *env)
                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