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
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
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
}\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
}\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
#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
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
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
return 1;\r
}\r
\r
+ //\r
+ // Load app\r
+ //\r
+ \r
LoadAppBin(&env);\r
\r
tm0 = clock() / (double)CLOCKS_PER_SEC;\r
// 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
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
}\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
}\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
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
/* 実行結果確認のためのレジスタダンプ */\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
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
#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
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
/* 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
// 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