OSDN Git Service

キーボード関連の構造体化 master
authorhikarupsp <hikarupsp@users.sourceforge.jp>
Sat, 29 Mar 2014 06:48:49 +0000 (15:48 +0900)
committerhikarupsp <hikarupsp@users.sourceforge.jp>
Sat, 29 Mar 2014 06:48:49 +0000 (15:48 +0900)
function.c
jitcx86.c
main.c
osecpu.h

index 2a5765e..26fa032 100644 (file)
@@ -386,12 +386,11 @@ void devFunc(HOSECPU_RuntimeEnvironment *r)
                                r->label[i].opt = 0;\r
                        }\r
                        puc = r->preg[0x31].p;\r
-                       i = jitCompiler(r->jitbuf, r->jitbuf1, puc, puc + r->ireg[0x34], puc, r->label, r->maxLabels, r->ireg[0x32], di1_serial, JITC_NOSTARTUP + 0);\r
+                       i = jitCompiler(r->jitbuf, r->jitbuf1, puc, puc + r->ireg[0x34], puc, r->label, r->maxLabels, r->ireg[0x32], 0, JITC_NOSTARTUP + 0);\r
                        if (i == 0) {\r
-                               i = jitCompiler(r->jitbuf, r->jitbuf1, puc, puc + r->ireg[0x34], puc, r->label, r->maxLabels, r->ireg[0x32], di1_serial, JITC_NOSTARTUP + JITC_PHASE1 + 0);\r
+                               i = jitCompiler(r->jitbuf, r->jitbuf1, puc, puc + r->ireg[0x34], puc, r->label, r->maxLabels, r->ireg[0x32], 0, JITC_NOSTARTUP + JITC_PHASE1 + 0);\r
                                if (i >= 0) {\r
-                                       r->mapDi1s[r->debugInfo1][r->ireg[0x33]] = di1_serial;\r
-                                       di1_serial++;\r
+                                       r->mapDi1s[r->debugInfo1][r->ireg[0x33]] = 0;\r
                                        r->ireg[0x30] = 0;\r
                                        r->preg[0x31].p = r->jitbuf;\r
                                        r->preg[0x31].typ = 0; // TYP_CODE\r
@@ -474,7 +473,7 @@ void devFunc(HOSECPU_RuntimeEnvironment *r)
                                        longjmp(r->setjmpEnv, 1);\r
                                }\r
                                drv_sleep(r->ireg[0x32]);\r
-                               if ((r->ireg[0x31] & 2) != 0 && keybuf_c <= 0){\r
+                               if ((r->ireg[0x31] & 2) != 0 && mainKeyboard.c <= 0){\r
                                        // opt2:キー入力があったので戻る\r
                                        continue;\r
                                }\r
@@ -501,9 +500,9 @@ void devFunc(HOSECPU_RuntimeEnvironment *r)
                                break;\r
                        }\r
                        r->ireg[0x30] |= -1;\r
-                       if (keybuf_c > 0) {\r
+                       if (mainKeyboard.c > 0) {\r
                                // 入力された文字がある\r
-                               r->ireg[0x30] = keybuf[keybuf_r];\r
+                               r->ireg[0x30] = mainKeyboard.buf[mainKeyboard.r];\r
                                if ((r->ireg[0x31] & 16) == 0){\r
                                        // shift, lockキー([C]マークのあるキー)の無効化\r
                                        r->ireg[0x30] &= 0x3e3effff;\r
@@ -514,8 +513,8 @@ void devFunc(HOSECPU_RuntimeEnvironment *r)
                                }\r
                                if ((r->ireg[0x31] & 1) != 0) {\r
                                        // peekでないならバッファを進める\r
-                                       keybuf_c--;\r
-                                       keybuf_r = (keybuf_r + 1) & (KEYBUFSIZ - 1);\r
+                                       mainKeyboard.c--;\r
+                                       mainKeyboard.r = (mainKeyboard.r + 1) & (KEYBUFSIZ - 1);\r
                                }\r
                        }\r
                        r->ireg[0x32] = r->ireg[0x33] = 0;\r
index 900b754..4de0bf0 100644 (file)
--- a/jitcx86.c
+++ b/jitcx86.c
@@ -1667,11 +1667,11 @@ int jitc0(unsigned char **qq, unsigned char *q1, const unsigned char *p0, const
        }\r
        \r
        // ラベルのチェック\r
-       i = jitCompiler(q, q1, p0 + 2, p1, p0, label, JITC_MAXLABELS, level, di1_serial, 0);\r
+       i = jitCompiler(q, q1, p0 + 2, p1, p0, label, JITC_MAXLABELS, level, 0, 0);\r
        if (i != 0){\r
                return 2;\r
        }\r
-       i = jitCompiler(q, q1, p0 + 2, p1, p0, label, JITC_MAXLABELS, level, di1_serial, JITC_PHASE1 + 0);\r
+       i = jitCompiler(q, q1, p0 + 2, p1, p0, label, JITC_MAXLABELS, level, 0, JITC_PHASE1 + 0);\r
        if (i < 0){\r
                return 2;\r
        }\r
diff --git a/main.c b/main.c
index ac28a92..8f2f353 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1,27 +1,12 @@
 #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_Device_Keyboard mainKeyboard;\r
 HOSECPU_RuntimeEnvironment *dbg_env;\r
 \r
-\r
-\r
 unsigned char *Init_LoadSysLib(char argv0[]);\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
@@ -61,8 +46,10 @@ int HeavyOSECPUMain(int argc, char **argv)
        mainWindow.xsize = 0;\r
        mainWindow.ysize = 0;\r
        // Initialize keyInputting\r
-       keybuf = malloc(KEYBUFSIZ * sizeof(int));\r
-       keybuf_r = keybuf_w = keybuf_c = 0;\r
+       mainKeyboard.buf = malloc(KEYBUFSIZ * sizeof(int));\r
+       mainKeyboard.r = 0;\r
+       mainKeyboard.w = 0;\r
+       mainKeyboard.c = 0;\r
        // Initialize HOSECPU_RuntimeEnvironment\r
        env.mainArgc = argc;\r
        env.mainArgv = (const char **)argv;\r
@@ -71,9 +58,7 @@ int HeavyOSECPUMain(int argc, char **argv)
        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
@@ -115,6 +100,10 @@ int HeavyOSECPUMain(int argc, char **argv)
                return 1;\r
        }\r
        \r
+       //\r
+       // Load app\r
+       //\r
+       \r
        LoadAppBin(&env);\r
        \r
        tm0 = clock() / (double)CLOCKS_PER_SEC;\r
@@ -123,13 +112,13 @@ int HeavyOSECPUMain(int argc, char **argv)
                // tek5圧縮がかかっている\r
 #if (USE_TEK5 != 0)\r
                tekDecompTemp = malloc(TEKDECOMPTMPSIZE);\r
-               env.appSize1 = tek5Decomp(env.appOSECPUBin + 2, env.appOSECPUBin + env.appSize0, tekDecompTemp);\r
+               env.appOSECPUBinSize = tek5Decomp(env.appOSECPUBin + 2, env.appOSECPUBin + APPBINSIZE, tekDecompTemp);\r
                free(tekDecompTemp);\r
-               env.appSize1 += 2;\r
+               env.appOSECPUBinSize += 2;\r
 #else\r
-               env.appSize1 = -9;\r
+               env.appOSECPUBinSize = -9;\r
 #endif\r
-               if (env.appSize1 < 0) {\r
+               if (env.appOSECPUBinSize < 0) {\r
                        fputs("unsupported-format(tek5)\n", stderr);\r
                        return 1;\r
                }\r
@@ -152,7 +141,7 @@ int HeavyOSECPUMain(int argc, char **argv)
                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[5].p = &env.appOSECPUBin[env.appOSECPUBinSize];\r
                env.preg[6].p = bufP06;\r
                env.preg[7].p = bufP06 + DECODER_BUF06_SIZE;\r
                env.preg[0x0A].p = (unsigned char *)bufP0A;\r
@@ -172,8 +161,8 @@ int HeavyOSECPUMain(int argc, char **argv)
                }\r
                env.appOSECPUBackendBinSize = env.preg[2].p - env.appOSECPUBackendBin;\r
        } else{\r
-               memcpy(env.appOSECPUBackendBin, env.appOSECPUBin, env.appSize1);\r
-               env.appOSECPUBackendBinSize = env.appSize1;\r
+               memcpy(env.appOSECPUBackendBin, env.appOSECPUBin, env.appOSECPUBinSize);\r
+               env.appOSECPUBackendBinSize = env.appOSECPUBinSize;\r
        }\r
        \r
        if ((argDebugMode & 2) != 0) {\r
@@ -184,9 +173,7 @@ int HeavyOSECPUMain(int argc, char **argv)
        }\r
        \r
        //JITコンパイル\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
@@ -194,9 +181,8 @@ int HeavyOSECPUMain(int argc, char **argv)
        if (i != 0){\r
                return 1;\r
        }\r
-       di1_serial++;\r
        \r
-       env.appJITBinSize = pAppJITBin - env.appOSECPUBackendBin;\r
+       env.appJITBinSize = pAppJITBin - env.appJITBin;\r
        \r
        // 末尾にAPI関数呼び出しコードを追加\r
        appBinDevFuncBase = pAppJITBin;\r
@@ -269,7 +255,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, env.appOSECPUBackendBinSize, env.appJITBinSize);\r
+               printf("size: OSECPU=%d, decomp=%d, native=%d\n", env.appOSECPUBinSize, 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
@@ -357,16 +343,27 @@ void LoadAppBin(HOSECPU_RuntimeEnvironment *env)
                fputs("app-file load error.\n", stderr);\r
                exit(EXIT_FAILURE);\r
        }\r
-       env->appSize0 = fread(env->appOSECPUBin, 1, APPBINSIZE - 4, fp);\r
-       env->appSize1 = env->appSize0;\r
+       env->appOSECPUBinSize = fread(env->appOSECPUBin, 1, APPBINSIZE - 4, fp);\r
        fclose(fp);\r
        \r
-       if (env->appSize0 >= APPBINSIZE - 4) {\r
+       if (env->appOSECPUBinSize >= APPBINSIZE - 4) {\r
                fputs("app-file too large.\n", stderr);\r
                exit(EXIT_FAILURE);\r
        }\r
-       if (env->appSize0 < 3) {\r
+       if (env->appOSECPUBinSize < 3) {\r
                fputs("app-file header error.\n", stderr);\r
                exit(EXIT_FAILURE);\r
        }\r
 }\r
+\r
+void putKeybuf(int i)\r
+{\r
+       // TODO : あふれた場合のことを考慮すべき\r
+       if (mainKeyboard.c < KEYBUFSIZ) {\r
+               mainKeyboard.buf[mainKeyboard.w] = i;\r
+               mainKeyboard.c++;\r
+               mainKeyboard.w = (mainKeyboard.w + 1) & (KEYBUFSIZ - 1);\r
+       }\r
+       return;\r
+}\r
+\r
index 82d67fc..a1dc631 100644 (file)
--- a/osecpu.h
+++ b/osecpu.h
@@ -52,8 +52,8 @@
 #define SIGN1          0xe1\r
 \r
 #define USE_DEBUGGER   1                       // デバッグ機能を実行バイナリに含むか設定。デバッガ利用には dbgr:1 引数が実行時に必要。\r
-#define ENABLE_DEBUG_CODE   1          // env.dbg_currentCodeに実行するコードを保存するデバッグコードを挿入する\r
-#define ENABLE_DEBUG_CODE_ADDR 1\r
+#define ENABLE_DEBUG_CODE   0          // env.dbg_currentCodeに実行するコードを保存するデバッグコードを挿入する\r
+#define ENABLE_DEBUG_CODE_ADDR 0\r
 #define USE_TEK5               1\r
 \r
 \r
@@ -160,6 +160,14 @@ struct Device_Window {
     int xsize, ysize;\r
 };\r
 \r
+typedef struct Device_Keyboard HOSECPU_Device_Keyboard;\r
+struct Device_Keyboard {\r
+    int *buf;\r
+    int r;\r
+       int w;\r
+       int c;\r
+};\r
+\r
 typedef struct Regs HOSECPU_RuntimeEnvironment;\r
 struct Regs {\r
        int ireg[64];                                                           // 整数レジスタ (4 * 64) = 256\r
@@ -178,16 +186,17 @@ struct Regs {
     /* Main environment */\r
     int mainArgc;           // HOSECPU起動引数の個数\r
     const char **mainArgv;  // HOSECPU起動引数リスト\r
-    //unsigned char *appBin;  // 実行するアプリの元バイナリ(渡されたファイルの内容そのもの)\r
+       //\r
     unsigned char *appOSECPUBin;  // 実行するアプリの元バイナリ(渡されたファイルの内容そのもの)\r
+       int appOSECPUBinSize;\r
        unsigned char *appOSECPUBackendBin;  // 実行するアプリの元バイナリ(渡されたファイルの内容そのもの)\r
        int appOSECPUBackendBinSize;\r
        unsigned char *appJITBin;  // 実行するアプリのJITコンパイルされたバイナリ(実行可能)\r
        int appJITBinSize;\r
+       //\r
     unsigned char *syslibOSECPUBin;  // syslibの元バイナリ\r
     unsigned char *syslibJITBin;  // syslibのJITコンパイルされたバイナリ(実行可能)\r
-    int appSize0;\r
-    int appSize1;\r
+    //\r
     int executionLevel;\r
     \r
        /* for-junkApi */\r
@@ -205,18 +214,16 @@ struct Regs {
 // Grobal values\r
 //\r
 \r
-extern int *keybuf, keybuf_r, keybuf_w, keybuf_c;\r
+extern HOSECPU_Device_Keyboard mainKeyboard;\r
 extern HOSECPU_Device_Window mainWindow;\r
-// di1_serial: デバッグ用。プログラム中の随所で加算される変数\r
-extern int di1_serial;\r
 \r
 //\r
 // Functions\r
 //\r
 \r
 // @main.c\r
-void putKeybuf(int i);\r
 int HeavyOSECPUMain(int argc, char **argv);\r
+void putKeybuf(int i);\r
 \r
 // @comlib.c\r
 unsigned char *ComLib_main(const unsigned char *p, unsigned char *q);\r