5 if (keybuf_c < KEYBUFSIZ) {
8 keybuf_w = (keybuf_w + 1) & (KEYBUFSIZ - 1);
13 int osecpuMain(int argc, char **argv)
15 unsigned char *appbin = malloc(APPSIZ1), *up;
16 unsigned char *jitbuf = mallocRWE(1024 * 1024); /* とりあえず1MBで */
17 unsigned char *sysjit0 = mallocRWE(SJITSIZ1), *sysjit1 = sysjit0, *sysjit00 = sysjit0;
18 unsigned char *systmp0 = malloc(SYSTMP0SIZ);
19 unsigned char *systmp1 = malloc(SYSTMP1SIZ);
20 unsigned char *systmp2 = malloc(1024 * 1024), *opTbl = malloc(256);
21 struct LabelTable *label = malloc(JITC_MAXLABELS * sizeof (struct LabelTable));
22 int level = JITC_LV_SLOWEST, tmpsiz, i;
23 keybuf = malloc(KEYBUFSIZ * sizeof (int));
24 keybuf_r = keybuf_w = keybuf_c = 0;
27 struct PtrCtrl *ptrCtrl = malloc(PTRCTRLSIZ * sizeof (struct PtrCtrl));
29 randStatInit((unsigned int)time(NULL));
30 for (i = 0; i < PTRCTRLSIZ; i++) {
31 ptrCtrl[i].liveSign = 0;
37 unsigned char *syslib = malloc(SYSLIBSIZ1);
39 FILE *fp = fopen(SYSLIB_OSE, "rb");
42 strcpy(syslib + 1, argv[0]);
44 while (*up != '¥0') up++;
45 while (*up != '/' && *up != 0x5c) up--;
47 strcpy(up, SYSLIB_OSE);
48 fp = fopen(syslib + 1, "rb");
51 fputs("syslib-file fopen error.¥n", stderr);
54 appsiz0 = fread(syslib, 1, SYSLIBSIZ1 - 4, fp);
56 if (appsiz0 >= SYSLIBSIZ1 - 4) {
57 fputs("syslib-file too large.¥n", stderr);
60 if (syslib[0] == 0x05 && syslib[1] == 0xc1) {
61 memcpy(systmp0, syslib, appsiz0);
62 ComLib_main(systmp0 + 2, syslib + 2);
67 sysjit1 = jitCompInit(sysjit1);
69 i = jitc0(&sysjit1, sysjit00 + SJITSIZ1, syslib + 32, syslib + SYSLIBSIZ1, JITC_LV_SLOWEST + 9, label);
71 fputs("syslib-file JITC error.¥n", stderr);
77 if (argc <= 1) { return 0; }
78 const unsigned char *argv1 = argv[1];
79 if (argv1[0] == ':' && argv1[2] == ':') {
80 level = argv1[1] - '0';
81 if (level < 0 || level > 9)
82 level = JITC_LV_SLOWEST;
85 fp = fopen(argv1, "rb");
87 fputs("app-file load error.¥n", stderr);
90 appsiz1 = appsiz0 = fread(appbin, 1, APPSIZ1 - 4, fp);
92 if (appsiz0 >= APPSIZ1 - 4) {
93 fputs("app-file too large.¥n", stderr);
98 fputs("app-file header error.¥n", stderr);
102 tm0 = clock() / (double)CLOCKS_PER_SEC;
104 if (appbin[2] == 0xf0) {
106 appsiz1 = tek5Decomp(appbin + 2, appbin + appsiz0, systmp0) + 2;
111 fputs("unsupported-format(tek5)¥n", stderr);
116 int argDebug = 0, stacksiz = 1;
117 const unsigned char *cp = searchArg(argc, argv, "debug:", 0);
118 if (cp != NULL) argDebug = *cp - '0';
119 cp = searchArg(argc, argv, "stack:", 0);
120 if (cp != NULL) stacksiz = strtol(cp, NULL, 0);
123 void(*jitfunc)(char *);
124 unsigned char *jp = jitbuf; /* JIT-pointer */
126 /* フロントエンドコードをバックエンドコードに変換する */
127 if ((appbin[2] & 0xf0) != 0) {
128 systmp0[0] = appbin[0];
129 systmp0[1] = appbin[1];
130 regs.preg[2].p = systmp0 + 2;
131 regs.preg[3].p = systmp0 + SYSTMP0SIZ;
132 regs.preg[4].p = appbin + 2;
133 regs.preg[5].p = appbin + appsiz1;
134 regs.preg[6].p = systmp1;
135 regs.preg[7].p = systmp1 + SYSTMP1SIZ;
136 regs.preg[10].p = systmp2;
137 int pxxFlag[64], typLabel[4096];
138 regs.preg[0x0b].p = (void *)pxxFlag;
139 regs.preg[0x0c].p = (void *)typLabel;
140 regs.preg[0x0d].p = opTbl;
141 jitfunc = (void *)sysjit0;
142 (*jitfunc)(((char *)®s) + 128); /* サイズを節約するためにEBPを128バイトずらす */
143 if (regs.ireg[0] != 0) {
144 jp = regs.preg[2].p - 1;
145 fprintf(stderr, "unpack error: %02X (at %06X) (R00=%d)¥n", *jp, jp - systmp0, regs.ireg[0]);
146 if ((argDebug & 2) != 0) {
147 fp = fopen("debug2.bin", "wb");
148 fwrite(systmp0, 1, jp - systmp0 + 16, fp);
153 tmpsiz = regs.preg[2].p - systmp0;
156 memcpy(systmp0, appbin, appsiz1);
160 if ((argDebug & 2) != 0) {
161 fp = fopen("debug2.bin", "wb");
162 fwrite(systmp0, 1, tmpsiz, fp);
166 i = jitc0(&jp, jitbuf + 1024 * 1024, systmp0, systmp0 + tmpsiz, level, label);
167 if (i == 1) goto header_error;
168 if (i != 0) return 1;
171 int appsiz2 = jp - jitbuf;
173 unsigned char *p28 = jp;
174 jp = jitCompCallFunc(jp, &devFunc);
176 tm1 = clock() / (double)CLOCKS_PER_SEC;
179 for (i = 0; i < 64; i++)
181 for (i = 0; i < 64; i++) {
182 regs.preg[i].p = NULL;
183 regs.preg[i].typ = -1;
184 regs.preg[i].p0 = NULL;
185 regs.preg[i].p1 = NULL;
190 regs.buf0 = regs.buf1 = NULL;
191 regs.preg[0x28].p = p28;
192 regs.preg[0x28].typ = 0; // TYP_CODE
193 regs.preg[0x28].p0 = p28;
194 regs.preg[0x28].p1 = p28 + 1;
195 // regs.preg[0x00].p = malloc(1024 * 1024) + (1024 * 1024 - 32);
196 regs.junkStack = malloc(stacksiz << 20);
197 regs.junkStack1 = regs.junkStack + (stacksiz << 20);
200 regs.setjmpEnv = &setjmpEnv;
201 regs.lastConsoleChar = '¥n';
204 regs.maxLabels = JITC_MAXLABELS;
206 regs.jitbuf1 = jitbuf + 1024 * 1024;
207 regs.errHndl = &errorHandler;
209 if (searchArg(argc, argv, "dbgr:1", 0) != NULL) regs.dbgr = 1;
211 if ((argDebug & 1) != 0) {
212 fp = fopen("debug1.bin", "wb");
213 fwrite(jitbuf, 1, jp - jitbuf, fp);
218 jitfunc = (void *)jitbuf;
219 if (setjmp(setjmpEnv) == 0)
220 (*jitfunc)(((char *)®s) + 128); /* サイズを節約するためにEBPを128バイトずらす */
221 if (regs.autoSleep != 0) {
223 drv_flshWin(v_xsiz, v_ysiz, 0, 0);
224 while (regs.winClosed == 0)
227 if (regs.lastConsoleChar != '¥n')
230 tm2 = clock() / (double)CLOCKS_PER_SEC;
232 /* 実行結果確認のためのレジスタダンプ */
233 if (searchArg(argc, argv, "verbose:1", 0) != NULL) {
234 printf("time: JITC=%.3f[sec], exec=%.3f[sec]¥n", tm1 - tm0, tm2 - tm1);
235 printf("size: OSECPU=%d, decomp=%d, tmp=%d, native=%d¥n", appsiz0, appsiz1, tmpsiz, appsiz2);
237 printf("R00:0x%08X R01:0x%08X R02:0x%08X R03:0x%08X¥n", regs.ireg[0], regs.ireg[1], regs.ireg[2], regs.ireg[3]);
239 #if (USE_DEBUGGER != 0)
245 int main(int argc, char **argv)
247 // Program entry point
249 return osecpuMain(argc, argv);