3 unsigned char *Init_LoadSysLib(char argv0[], unsigned char *tmpWorkMemory);
4 void LoadAppBin(HOSECPU_RuntimeEnvironment *env);
8 if (keybuf_c < KEYBUFSIZ) {
11 keybuf_w = (keybuf_w + 1) & (KEYBUFSIZ - 1);
16 int HeavyOSECPUMain(int argc, char **argv)
20 unsigned char *jitbuf, *sysjit00, *sysjit;
21 unsigned char *systmp0, *systmp1, *systmp2;
23 HOSECPU_LabelListTag *label;
27 HOSECPU_PointerControlTag *ptrCtrl;
28 unsigned char *syslib;
29 int argDebug = 0, stacksiz = 1;
31 HOSECPU_RuntimeEnvironment env;
32 void(*jitfunc)(char *);
37 env.mainArgv = (const char **)argv;
38 env.appBin = malloc(APPSIZ1);
39 env.executionLevel = JITC_LV_SLOWEST;
40 jitbuf = mallocRWE(1024 * 1024); /* とりあえず1MBで */
41 //unsigned char *sysjit0 = mallocRWE(SJITSIZ1), *sysjit1 = sysjit0, *sysjit00 = sysjit0;
42 // syslib.oseのjitc結果を格納する領域を確保。
43 sysjit00 = mallocRWE(SJITSIZ1);
44 // 現在の、jitc結果を格納するメモリへの書き込み位置のアドレス
45 // sysjit: 現在のjitc書き込み位置
46 // sysjit00: jitc結果の先頭
49 systmp0 = malloc(SYSTMP0SIZ); /* syslibのjitc用 */
50 systmp1 = malloc(SYSTMP1SIZ);
51 systmp2 = malloc(1024 * 1024);
54 label = malloc(JITC_MAXLABELS * sizeof (HOSECPU_LabelListTag));
55 keybuf = malloc(KEYBUFSIZ * sizeof (int));
56 keybuf_r = keybuf_w = keybuf_c = 0;
57 ptrCtrl = malloc(PTRCTRLSIZ * sizeof (HOSECPU_PointerControlTag));
59 randStatInit((unsigned int)time(NULL));
60 for (i = 0; i < PTRCTRLSIZ; i++) {
61 ptrCtrl[i].liveSign = 0;
67 syslib = Init_LoadSysLib(argv[0], systmp0);
69 // jitc.cのerrHndl()をCALLするネィティブコードを挿入。
70 // sysjitの値は次の書き込み位置へずらされる。
71 // 元々のsysjitはsysjit00へ保存されている。
72 sysjit = jitCompInit(sysjit);
74 // sysjit (アドレス変数)は下の関数の実行で変更される(だから参照渡し)
75 // もちろんsysjitの値は次の書き込み位置へずらされる。
76 // labelはjitc0()内で初期化される。
77 i = jitc0(&sysjit, sysjit00 + SJITSIZ1, syslib + 32, syslib + SYSLIBSIZ1, JITC_LV_FASTEST, label);
79 fputs("syslib-file JITC error.\n", stderr);
83 // エラー時にデバッグ用に表示する変数を加算
90 tm0 = clock() / (double)CLOCKS_PER_SEC;
92 if (env.appBin[2] == 0xf0) {
95 env.appSize1 = tek5Decomp(env.appBin + 2, env.appBin + env.appSize0, systmp0) + 2;
99 if (env.appSize1 < 0) {
100 fputs("unsupported-format(tek5)\n", stderr);
105 cp = searchArg(argc, (const char **)argv, "debug:", 0);
107 argDebug = *cp - '0';
110 cp = searchArg(argc, (const char **)argv, "stack:", 0);
112 stacksiz = strtol(cp, NULL, 0);
114 jp = jitbuf; /* JIT-pointer */
116 /* フロントエンドコードをバックエンドコードに変換する */
117 if ((env.appBin[2] & 0xf0) != 0) {
118 systmp0[0] = env.appBin[0];
119 systmp0[1] = env.appBin[1];
120 env.preg[2].p = systmp0 + 2;
121 env.preg[3].p = systmp0 + SYSTMP0SIZ;
122 env.preg[4].p = env.appBin + 2;
123 env.preg[5].p = env.appBin + env.appSize1;
124 env.preg[6].p = systmp1;
125 env.preg[7].p = systmp1 + SYSTMP1SIZ;
126 env.preg[10].p = systmp2;
127 int pxxFlag[64], typLabel[4096];
128 env.preg[0x0b].p = (void *)pxxFlag;
129 env.preg[0x0c].p = (void *)typLabel;
130 env.preg[0x0d].p = opTbl;
131 jitfunc = (void *)sysjit;
132 (*jitfunc)(((char *)&env) + 128); /* サイズを節約するためにEBPを128バイトずらす */
133 if (env.ireg[0] != 0) {
134 jp = env.preg[2].p - 1;
135 fprintf(stderr, "unpack error: %02X (at %06X) (R00=%d)\n", *jp, jp - systmp0, env.ireg[0]);
136 if ((argDebug & 2) != 0) {
137 fp = fopen("debug2.bin", "wb");
138 fwrite(systmp0, 1, jp - systmp0 + 16, fp);
143 tmpsiz = env.preg[2].p - systmp0;
145 memcpy(systmp0, env.appBin, env.appSize1);
146 tmpsiz = env.appSize1;
149 if ((argDebug & 2) != 0) {
150 fp = fopen("debug2.bin", "wb");
151 fwrite(systmp0, 1, tmpsiz, fp);
155 i = jitc0(&jp, jitbuf + 1024 * 1024, systmp0, systmp0 + tmpsiz, env.executionLevel, label);
157 fputs("app-file header error.\n", stderr);
165 int appsiz2 = jp - jitbuf;
167 unsigned char *p28 = jp;
168 jp = jitCompCallFunc(jp, &devFunc);
170 tm1 = clock() / (double)CLOCKS_PER_SEC;
173 for (i = 0; i < 64; i++){
176 for (i = 0; i < 64; i++) {
177 env.preg[i].p = NULL;
178 env.preg[i].typ = -1;
179 env.preg[i].p0 = NULL;
180 env.preg[i].p1 = NULL;
184 env.argv = (const char **)argv;
185 env.buf0 = env.buf1 = NULL;
186 env.preg[0x28].p = p28;
187 env.preg[0x28].typ = 0; // TYP_CODE
188 env.preg[0x28].p0 = p28;
189 env.preg[0x28].p1 = p28 + 1;
190 // env.preg[0x00].p = malloc(1024 * 1024) + (1024 * 1024 - 32);
191 env.junkStack = malloc(stacksiz << 20);
192 env.junkStack1 = env.junkStack + (stacksiz << 20);
195 env.setjmpEnv = &setjmpEnv;
196 env.lastConsoleChar = '\n';
199 env.maxLabels = JITC_MAXLABELS;
201 env.jitbuf1 = jitbuf + 1024 * 1024;
202 env.errHndl = &errorHandler;
204 if (searchArg(argc, (const char **)argv, "dbgr:1", 0) != NULL){
208 if ((argDebug & 1) != 0) {
209 fp = fopen("debug1.bin", "wb");
210 fwrite(jitbuf, 1, jp - jitbuf, fp);
215 jitfunc = (void *)jitbuf;
216 if (setjmp(setjmpEnv) == 0){
217 (*jitfunc)(((char *)&env) + 128); /* サイズを節約するためにEBPを128バイトずらす */
219 if (env.autoSleep != 0) {
221 drv_flshWin(v_xsiz, v_ysiz, 0, 0);
223 while (env.winClosed == 0){
227 if (env.lastConsoleChar != '\n'){
231 tm2 = clock() / (double)CLOCKS_PER_SEC;
233 /* 実行結果確認のためのレジスタダンプ */
234 if (searchArg(argc, (const char **)argv, "verbose:1", 0) != NULL) {
235 printf("time: JITC=%.3f[sec], exec=%.3f[sec]\n", tm1 - tm0, tm2 - tm1);
236 printf("size: OSECPU=%d, decomp=%d, tmp=%d, native=%d\n", env.appSize0, env.appSize1, tmpsiz, appsiz2);
238 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]);
240 #if (USE_DEBUGGER != 0)
246 unsigned char *Init_LoadSysLib(char argv0[], unsigned char *tmpWorkMemory)
248 unsigned char *syslib;
254 syslib = malloc(SYSLIBSIZ1);
255 fp = fopen(SYSLIB_OSE, "rb");
258 strcpy((char *)syslib + 1, argv0);
263 while (*up != '/' && *up != 0x5c){
267 strcpy((char *)up, SYSLIB_OSE);
268 fp = fopen((char *)syslib + 1, "rb");
271 fputs("syslib-file fopen error.\n", stderr);
274 appsize = fread(syslib, 1, SYSLIBSIZ1 - 4, fp);
276 if (appsize >= SYSLIBSIZ1 - 4) {
277 fputs("syslib-file too large.\n", stderr);
280 if (syslib[0] == 0x05 && syslib[1] == 0xc1) {
281 // 一体この部分ではなにをやっているのだろう?
282 // OSECPUに0x05, 0x1bという命令はないが... ヘッダ?
283 // どうせ初めからの32バイトは無視されるのだろうに...
284 memcpy(tmpWorkMemory, syslib, appsize);
285 ComLib_main(tmpWorkMemory + 2, syslib + 2);
290 fp = fopen("syslib_dbg.ose", "wb");
291 fwrite(syslib, 1, SYSLIBSIZ1, fp);
296 void LoadAppBin(HOSECPU_RuntimeEnvironment *env)
299 const char *fileName;
301 if (env->mainArgc <= 1) {
305 fileName = env->mainArgv[1];
306 //アプリ名先頭に:n:をつけることでレベルnでの実行が可能?
307 if (fileName[0] == ':' && fileName[2] == ':') {
308 env->executionLevel = fileName[1] - '0';
309 if (env->executionLevel < 0 || env->executionLevel > 9){
310 env->executionLevel = JITC_LV_SLOWEST;
315 fp = fopen(fileName, "rb");
317 fputs("app-file load error.\n", stderr);
320 env->appSize0 = fread(env->appBin, 1, APPSIZ1 - 4, fp);
321 env->appSize1 = env->appSize0;
324 if (env->appSize0 >= APPSIZ1 - 4) {
325 fputs("app-file too large.\n", stderr);
328 if (env->appSize0 < 3) {
329 fputs("app-file header error.\n", stderr);