Revisión | 988a9d6e99170bd0742231e7c954c10b95b6f6d0 (tree) |
---|---|
Tiempo | 2014-03-29 15:48:49 |
Autor | hikarupsp <hikarupsp@user...> |
Commiter | hikarupsp |
キーボード関連の構造体化
@@ -386,12 +386,11 @@ void devFunc(HOSECPU_RuntimeEnvironment *r) | ||
386 | 386 | r->label[i].opt = 0; |
387 | 387 | } |
388 | 388 | puc = r->preg[0x31].p; |
389 | - i = jitCompiler(r->jitbuf, r->jitbuf1, puc, puc + r->ireg[0x34], puc, r->label, r->maxLabels, r->ireg[0x32], di1_serial, JITC_NOSTARTUP + 0); | |
389 | + i = jitCompiler(r->jitbuf, r->jitbuf1, puc, puc + r->ireg[0x34], puc, r->label, r->maxLabels, r->ireg[0x32], 0, JITC_NOSTARTUP + 0); | |
390 | 390 | if (i == 0) { |
391 | - 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); | |
391 | + 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); | |
392 | 392 | if (i >= 0) { |
393 | - r->mapDi1s[r->debugInfo1][r->ireg[0x33]] = di1_serial; | |
394 | - di1_serial++; | |
393 | + r->mapDi1s[r->debugInfo1][r->ireg[0x33]] = 0; | |
395 | 394 | r->ireg[0x30] = 0; |
396 | 395 | r->preg[0x31].p = r->jitbuf; |
397 | 396 | r->preg[0x31].typ = 0; // TYP_CODE |
@@ -474,7 +473,7 @@ void devFunc(HOSECPU_RuntimeEnvironment *r) | ||
474 | 473 | longjmp(r->setjmpEnv, 1); |
475 | 474 | } |
476 | 475 | drv_sleep(r->ireg[0x32]); |
477 | - if ((r->ireg[0x31] & 2) != 0 && keybuf_c <= 0){ | |
476 | + if ((r->ireg[0x31] & 2) != 0 && mainKeyboard.c <= 0){ | |
478 | 477 | // opt2:キー入力があったので戻る |
479 | 478 | continue; |
480 | 479 | } |
@@ -501,9 +500,9 @@ void devFunc(HOSECPU_RuntimeEnvironment *r) | ||
501 | 500 | break; |
502 | 501 | } |
503 | 502 | r->ireg[0x30] |= -1; |
504 | - if (keybuf_c > 0) { | |
503 | + if (mainKeyboard.c > 0) { | |
505 | 504 | // 入力された文字がある |
506 | - r->ireg[0x30] = keybuf[keybuf_r]; | |
505 | + r->ireg[0x30] = mainKeyboard.buf[mainKeyboard.r]; | |
507 | 506 | if ((r->ireg[0x31] & 16) == 0){ |
508 | 507 | // shift, lockキー([C]マークのあるキー)の無効化 |
509 | 508 | r->ireg[0x30] &= 0x3e3effff; |
@@ -514,8 +513,8 @@ void devFunc(HOSECPU_RuntimeEnvironment *r) | ||
514 | 513 | } |
515 | 514 | if ((r->ireg[0x31] & 1) != 0) { |
516 | 515 | // peekでないならバッファを進める |
517 | - keybuf_c--; | |
518 | - keybuf_r = (keybuf_r + 1) & (KEYBUFSIZ - 1); | |
516 | + mainKeyboard.c--; | |
517 | + mainKeyboard.r = (mainKeyboard.r + 1) & (KEYBUFSIZ - 1); | |
519 | 518 | } |
520 | 519 | } |
521 | 520 | r->ireg[0x32] = r->ireg[0x33] = 0; |
@@ -1667,11 +1667,11 @@ int jitc0(unsigned char **qq, unsigned char *q1, const unsigned char *p0, const | ||
1667 | 1667 | } |
1668 | 1668 | |
1669 | 1669 | // ラベルのチェック |
1670 | - i = jitCompiler(q, q1, p0 + 2, p1, p0, label, JITC_MAXLABELS, level, di1_serial, 0); | |
1670 | + i = jitCompiler(q, q1, p0 + 2, p1, p0, label, JITC_MAXLABELS, level, 0, 0); | |
1671 | 1671 | if (i != 0){ |
1672 | 1672 | return 2; |
1673 | 1673 | } |
1674 | - i = jitCompiler(q, q1, p0 + 2, p1, p0, label, JITC_MAXLABELS, level, di1_serial, JITC_PHASE1 + 0); | |
1674 | + i = jitCompiler(q, q1, p0 + 2, p1, p0, label, JITC_MAXLABELS, level, 0, JITC_PHASE1 + 0); | |
1675 | 1675 | if (i < 0){ |
1676 | 1676 | return 2; |
1677 | 1677 | } |
@@ -1,27 +1,12 @@ | ||
1 | 1 | #include "osecpu.h" |
2 | 2 | |
3 | -int *keybuf, keybuf_r, keybuf_w, keybuf_c; | |
4 | 3 | HOSECPU_Device_Window mainWindow; |
5 | -//デバッグ用。プログラム中の随所で加算される変数 | |
6 | -int di1_serial; | |
4 | +HOSECPU_Device_Keyboard mainKeyboard; | |
7 | 5 | HOSECPU_RuntimeEnvironment *dbg_env; |
8 | 6 | |
9 | - | |
10 | - | |
11 | 7 | unsigned char *Init_LoadSysLib(char argv0[]); |
12 | 8 | void LoadAppBin(HOSECPU_RuntimeEnvironment *env); |
13 | 9 | |
14 | -void putKeybuf(int i) | |
15 | -{ | |
16 | - // TODO : あふれた場合のことを考慮すべき | |
17 | - if (keybuf_c < KEYBUFSIZ) { | |
18 | - keybuf[keybuf_w] = i; | |
19 | - keybuf_c++; | |
20 | - keybuf_w = (keybuf_w + 1) & (KEYBUFSIZ - 1); | |
21 | - } | |
22 | - return; | |
23 | -} | |
24 | - | |
25 | 10 | int HeavyOSECPUMain(int argc, char **argv) |
26 | 11 | { |
27 | 12 | HOSECPU_RuntimeEnvironment env; |
@@ -61,8 +46,10 @@ int HeavyOSECPUMain(int argc, char **argv) | ||
61 | 46 | mainWindow.xsize = 0; |
62 | 47 | mainWindow.ysize = 0; |
63 | 48 | // Initialize keyInputting |
64 | - keybuf = malloc(KEYBUFSIZ * sizeof(int)); | |
65 | - keybuf_r = keybuf_w = keybuf_c = 0; | |
49 | + mainKeyboard.buf = malloc(KEYBUFSIZ * sizeof(int)); | |
50 | + mainKeyboard.r = 0; | |
51 | + mainKeyboard.w = 0; | |
52 | + mainKeyboard.c = 0; | |
66 | 53 | // Initialize HOSECPU_RuntimeEnvironment |
67 | 54 | env.mainArgc = argc; |
68 | 55 | env.mainArgv = (const char **)argv; |
@@ -71,9 +58,7 @@ int HeavyOSECPUMain(int argc, char **argv) | ||
71 | 58 | env.appOSECPUBackendBin = malloc(APPBINSIZE); |
72 | 59 | // |
73 | 60 | env.appJITBin = mallocRWE(APPJITSIZE); |
74 | - fprintf(stderr, "appJITBin: %p\n", env.appJITBin); | |
75 | 61 | pAppJITBin = env.appJITBin; |
76 | - fprintf(stderr, "pAppJITBin: %p\n", pAppJITBin); | |
77 | 62 | env.syslibJITBin = mallocRWE(SYSLIBJITSIZE); |
78 | 63 | pSyslibJITBin = env.syslibJITBin; |
79 | 64 | // syslibJITBin image: |
@@ -115,6 +100,10 @@ int HeavyOSECPUMain(int argc, char **argv) | ||
115 | 100 | return 1; |
116 | 101 | } |
117 | 102 | |
103 | + // | |
104 | + // Load app | |
105 | + // | |
106 | + | |
118 | 107 | LoadAppBin(&env); |
119 | 108 | |
120 | 109 | tm0 = clock() / (double)CLOCKS_PER_SEC; |
@@ -123,13 +112,13 @@ int HeavyOSECPUMain(int argc, char **argv) | ||
123 | 112 | // tek5圧縮がかかっている |
124 | 113 | #if (USE_TEK5 != 0) |
125 | 114 | tekDecompTemp = malloc(TEKDECOMPTMPSIZE); |
126 | - env.appSize1 = tek5Decomp(env.appOSECPUBin + 2, env.appOSECPUBin + env.appSize0, tekDecompTemp); | |
115 | + env.appOSECPUBinSize = tek5Decomp(env.appOSECPUBin + 2, env.appOSECPUBin + APPBINSIZE, tekDecompTemp); | |
127 | 116 | free(tekDecompTemp); |
128 | - env.appSize1 += 2; | |
117 | + env.appOSECPUBinSize += 2; | |
129 | 118 | #else |
130 | - env.appSize1 = -9; | |
119 | + env.appOSECPUBinSize = -9; | |
131 | 120 | #endif |
132 | - if (env.appSize1 < 0) { | |
121 | + if (env.appOSECPUBinSize < 0) { | |
133 | 122 | fputs("unsupported-format(tek5)\n", stderr); |
134 | 123 | return 1; |
135 | 124 | } |
@@ -152,7 +141,7 @@ int HeavyOSECPUMain(int argc, char **argv) | ||
152 | 141 | env.preg[2].p = &env.appOSECPUBackendBin[2]; |
153 | 142 | env.preg[3].p = &env.appOSECPUBackendBin[APPBINSIZE]; |
154 | 143 | env.preg[4].p = &env.appOSECPUBin[2]; |
155 | - env.preg[5].p = &env.appOSECPUBin[env.appSize1]; | |
144 | + env.preg[5].p = &env.appOSECPUBin[env.appOSECPUBinSize]; | |
156 | 145 | env.preg[6].p = bufP06; |
157 | 146 | env.preg[7].p = bufP06 + DECODER_BUF06_SIZE; |
158 | 147 | env.preg[0x0A].p = (unsigned char *)bufP0A; |
@@ -172,8 +161,8 @@ int HeavyOSECPUMain(int argc, char **argv) | ||
172 | 161 | } |
173 | 162 | env.appOSECPUBackendBinSize = env.preg[2].p - env.appOSECPUBackendBin; |
174 | 163 | } else{ |
175 | - memcpy(env.appOSECPUBackendBin, env.appOSECPUBin, env.appSize1); | |
176 | - env.appOSECPUBackendBinSize = env.appSize1; | |
164 | + memcpy(env.appOSECPUBackendBin, env.appOSECPUBin, env.appOSECPUBinSize); | |
165 | + env.appOSECPUBackendBinSize = env.appOSECPUBinSize; | |
177 | 166 | } |
178 | 167 | |
179 | 168 | if ((argDebugMode & 2) != 0) { |
@@ -184,9 +173,7 @@ int HeavyOSECPUMain(int argc, char **argv) | ||
184 | 173 | } |
185 | 174 | |
186 | 175 | //JITコンパイル |
187 | - fprintf(stderr, "pAppJITBin: %p\n", pAppJITBin); | |
188 | 176 | i = jitc0(&pAppJITBin, env.appJITBin + APPJITSIZE, env.appOSECPUBackendBin, env.appOSECPUBackendBin + APPBINSIZE, env.executionLevel, label); |
189 | - fprintf(stderr, "pAppJITBin: %p\n", pAppJITBin); | |
190 | 177 | if (i == 1){ |
191 | 178 | fputs("app-file header error.\n", stderr); |
192 | 179 | return 1; |
@@ -194,9 +181,8 @@ int HeavyOSECPUMain(int argc, char **argv) | ||
194 | 181 | if (i != 0){ |
195 | 182 | return 1; |
196 | 183 | } |
197 | - di1_serial++; | |
198 | 184 | |
199 | - env.appJITBinSize = pAppJITBin - env.appOSECPUBackendBin; | |
185 | + env.appJITBinSize = pAppJITBin - env.appJITBin; | |
200 | 186 | |
201 | 187 | // 末尾にAPI関数呼び出しコードを追加 |
202 | 188 | appBinDevFuncBase = pAppJITBin; |
@@ -269,7 +255,7 @@ int HeavyOSECPUMain(int argc, char **argv) | ||
269 | 255 | /* 実行結果確認のためのレジスタダンプ */ |
270 | 256 | if (searchArg(argc, (const char **)argv, "verbose:1", 0) != NULL) { |
271 | 257 | printf("time: JITC=%.3f[sec], exec=%.3f[sec]\n", tm1 - tm0, tm2 - tm1); |
272 | - printf("size: OSECPU=%d, decomp=%d, tmp=%d, native=%d\n", env.appSize0, env.appSize1, env.appOSECPUBackendBinSize, env.appJITBinSize); | |
258 | + printf("size: OSECPU=%d, decomp=%d, native=%d\n", env.appOSECPUBinSize, env.appOSECPUBackendBinSize, env.appJITBinSize); | |
273 | 259 | printf("result:\n"); |
274 | 260 | 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]); |
275 | 261 | } |
@@ -357,16 +343,27 @@ void LoadAppBin(HOSECPU_RuntimeEnvironment *env) | ||
357 | 343 | fputs("app-file load error.\n", stderr); |
358 | 344 | exit(EXIT_FAILURE); |
359 | 345 | } |
360 | - env->appSize0 = fread(env->appOSECPUBin, 1, APPBINSIZE - 4, fp); | |
361 | - env->appSize1 = env->appSize0; | |
346 | + env->appOSECPUBinSize = fread(env->appOSECPUBin, 1, APPBINSIZE - 4, fp); | |
362 | 347 | fclose(fp); |
363 | 348 | |
364 | - if (env->appSize0 >= APPBINSIZE - 4) { | |
349 | + if (env->appOSECPUBinSize >= APPBINSIZE - 4) { | |
365 | 350 | fputs("app-file too large.\n", stderr); |
366 | 351 | exit(EXIT_FAILURE); |
367 | 352 | } |
368 | - if (env->appSize0 < 3) { | |
353 | + if (env->appOSECPUBinSize < 3) { | |
369 | 354 | fputs("app-file header error.\n", stderr); |
370 | 355 | exit(EXIT_FAILURE); |
371 | 356 | } |
372 | 357 | } |
358 | + | |
359 | +void putKeybuf(int i) | |
360 | +{ | |
361 | + // TODO : あふれた場合のことを考慮すべき | |
362 | + if (mainKeyboard.c < KEYBUFSIZ) { | |
363 | + mainKeyboard.buf[mainKeyboard.w] = i; | |
364 | + mainKeyboard.c++; | |
365 | + mainKeyboard.w = (mainKeyboard.w + 1) & (KEYBUFSIZ - 1); | |
366 | + } | |
367 | + return; | |
368 | +} | |
369 | + |
@@ -52,8 +52,8 @@ | ||
52 | 52 | #define SIGN1 0xe1 |
53 | 53 | |
54 | 54 | #define USE_DEBUGGER 1 // デバッグ機能を実行バイナリに含むか設定。デバッガ利用には dbgr:1 引数が実行時に必要。 |
55 | -#define ENABLE_DEBUG_CODE 1 // env.dbg_currentCodeに実行するコードを保存するデバッグコードを挿入する | |
56 | -#define ENABLE_DEBUG_CODE_ADDR 1 | |
55 | +#define ENABLE_DEBUG_CODE 0 // env.dbg_currentCodeに実行するコードを保存するデバッグコードを挿入する | |
56 | +#define ENABLE_DEBUG_CODE_ADDR 0 | |
57 | 57 | #define USE_TEK5 1 |
58 | 58 | |
59 | 59 |
@@ -160,6 +160,14 @@ struct Device_Window { | ||
160 | 160 | int xsize, ysize; |
161 | 161 | }; |
162 | 162 | |
163 | +typedef struct Device_Keyboard HOSECPU_Device_Keyboard; | |
164 | +struct Device_Keyboard { | |
165 | + int *buf; | |
166 | + int r; | |
167 | + int w; | |
168 | + int c; | |
169 | +}; | |
170 | + | |
163 | 171 | typedef struct Regs HOSECPU_RuntimeEnvironment; |
164 | 172 | struct Regs { |
165 | 173 | int ireg[64]; // 整数レジスタ (4 * 64) = 256 |
@@ -178,16 +186,17 @@ struct Regs { | ||
178 | 186 | /* Main environment */ |
179 | 187 | int mainArgc; // HOSECPU起動引数の個数 |
180 | 188 | const char **mainArgv; // HOSECPU起動引数リスト |
181 | - //unsigned char *appBin; // 実行するアプリの元バイナリ(渡されたファイルの内容そのもの) | |
189 | + // | |
182 | 190 | unsigned char *appOSECPUBin; // 実行するアプリの元バイナリ(渡されたファイルの内容そのもの) |
191 | + int appOSECPUBinSize; | |
183 | 192 | unsigned char *appOSECPUBackendBin; // 実行するアプリの元バイナリ(渡されたファイルの内容そのもの) |
184 | 193 | int appOSECPUBackendBinSize; |
185 | 194 | unsigned char *appJITBin; // 実行するアプリのJITコンパイルされたバイナリ(実行可能) |
186 | 195 | int appJITBinSize; |
196 | + // | |
187 | 197 | unsigned char *syslibOSECPUBin; // syslibの元バイナリ |
188 | 198 | unsigned char *syslibJITBin; // syslibのJITコンパイルされたバイナリ(実行可能) |
189 | - int appSize0; | |
190 | - int appSize1; | |
199 | + // | |
191 | 200 | int executionLevel; |
192 | 201 | |
193 | 202 | /* for-junkApi */ |
@@ -205,18 +214,16 @@ struct Regs { | ||
205 | 214 | // Grobal values |
206 | 215 | // |
207 | 216 | |
208 | -extern int *keybuf, keybuf_r, keybuf_w, keybuf_c; | |
217 | +extern HOSECPU_Device_Keyboard mainKeyboard; | |
209 | 218 | extern HOSECPU_Device_Window mainWindow; |
210 | -// di1_serial: デバッグ用。プログラム中の随所で加算される変数 | |
211 | -extern int di1_serial; | |
212 | 219 | |
213 | 220 | // |
214 | 221 | // Functions |
215 | 222 | // |
216 | 223 | |
217 | 224 | // @main.c |
218 | -void putKeybuf(int i); | |
219 | 225 | int HeavyOSECPUMain(int argc, char **argv); |
226 | +void putKeybuf(int i); | |
220 | 227 | |
221 | 228 | // @comlib.c |
222 | 229 | unsigned char *ComLib_main(const unsigned char *p, unsigned char *q); |