OSDN Git Service

syslibのエラーは出なくなったがアプリは動かない(pack error)
[heavyosecpu/HeavyOSECPU.git] / main.c
diff --git a/main.c b/main.c
index 1849d16..293622e 100644 (file)
--- 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);