OSDN Git Service

ソースコードのUTF-8化。
[heavyosecpu/HeavyOSECPU.git] / main.c
1 #include "osecpu.h"
2
3 void putKeybuf(int i)
4 {
5         if (keybuf_c < KEYBUFSIZ) {
6                 keybuf[keybuf_w] = i;
7                 keybuf_c++;
8                 keybuf_w = (keybuf_w + 1) & (KEYBUFSIZ - 1);
9         }
10         return;
11 }
12
13 int osecpuMain(int argc, char **argv)
14 {
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;
25         jmp_buf setjmpEnv;
26         double tm0, tm1, tm2;
27         struct PtrCtrl *ptrCtrl = malloc(PTRCTRLSIZ * sizeof (struct PtrCtrl));
28
29         randStatInit((unsigned int)time(NULL));
30         for (i = 0; i < PTRCTRLSIZ; i++) {
31                 ptrCtrl[i].liveSign = 0;
32                 ptrCtrl[i].size = -1;
33         }
34         ptrCtrl[0].size = -2;
35
36         /* syslibの読み込み */
37         unsigned char *syslib = malloc(SYSLIBSIZ1);
38         int appsiz0, appsiz1;
39         FILE *fp = fopen(SYSLIB_OSE, "rb");
40         if (fp == NULL) {
41                 syslib[0] = '/';
42                 strcpy(syslib + 1, argv[0]);
43                 up = syslib + 1;
44                 while (*up != '¥0') up++;
45                 while (*up != '/' && *up != 0x5c) up--;
46                 up++;
47                 strcpy(up, SYSLIB_OSE);
48                 fp = fopen(syslib + 1, "rb");
49         }
50         if (fp == NULL) {
51                 fputs("syslib-file fopen error.¥n", stderr);
52                 return 1;
53         }
54         appsiz0 = fread(syslib, 1, SYSLIBSIZ1 - 4, fp);
55         fclose(fp);
56         if (appsiz0 >= SYSLIBSIZ1 - 4) {
57                 fputs("syslib-file too large.¥n", stderr);
58                 return 1;
59         }
60         if (syslib[0] == 0x05 && syslib[1] == 0xc1) {
61                 memcpy(systmp0, syslib, appsiz0);
62                 ComLib_main(systmp0 + 2, syslib + 2);
63                 syslib[0] = 0x05;
64                 syslib[1] = 0x1b;
65         }
66
67         sysjit1 = jitCompInit(sysjit1);
68         sysjit0 = sysjit1;
69         i = jitc0(&sysjit1, sysjit00 + SJITSIZ1, syslib + 32, syslib + SYSLIBSIZ1, JITC_LV_SLOWEST + 9, label);
70         if (i != 0) {
71                 fputs("syslib-file JITC error.¥n", stderr);
72                 return 1;
73         }
74         di1_serial++;
75
76         /* アプリバイナリの読み込み */
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;
83                 argv1 += 3;
84         }
85         fp = fopen(argv1, "rb");
86         if (fp == NULL) {
87                 fputs("app-file load error.¥n", stderr);
88                 return 1;
89         }
90         appsiz1 = appsiz0 = fread(appbin, 1, APPSIZ1 - 4, fp);
91         fclose(fp);
92         if (appsiz0 >= APPSIZ1 - 4) {
93                 fputs("app-file too large.¥n", stderr);
94                 return 1;
95         }
96         if (appsiz0 < 3) {
97         header_error:
98                 fputs("app-file header error.¥n", stderr);
99                 return 1;
100         }
101
102         tm0 = clock() / (double)CLOCKS_PER_SEC;
103
104         if (appbin[2] == 0xf0) {
105 #if (USE_TEK5 != 0)
106                 appsiz1 = tek5Decomp(appbin + 2, appbin + appsiz0, systmp0) + 2;
107 #else
108                 appsiz1 = -9;
109 #endif
110                 if (appsiz1 < 0) {
111                         fputs("unsupported-format(tek5)¥n", stderr);
112                         return 1;
113                 }
114         }
115
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);
121
122         struct Regs regs;
123         void(*jitfunc)(char *);
124         unsigned char *jp = jitbuf; /* JIT-pointer */
125
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 *)&regs) + 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);
149                                 fclose(fp);
150                         }
151                         exit(1);
152                 }
153                 tmpsiz = regs.preg[2].p - systmp0;
154         }
155         else {
156                 memcpy(systmp0, appbin, appsiz1);
157                 tmpsiz = appsiz1;
158         }
159
160         if ((argDebug & 2) != 0) {
161                 fp = fopen("debug2.bin", "wb");
162                 fwrite(systmp0, 1, tmpsiz, fp);
163                 fclose(fp);
164         }
165
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;
169         di1_serial++;
170
171         int appsiz2 = jp - jitbuf;
172
173         unsigned char *p28 = jp;
174         jp = jitCompCallFunc(jp, &devFunc);
175
176         tm1 = clock() / (double)CLOCKS_PER_SEC;
177
178         /* レジスタ初期化 */
179         for (i = 0; i < 64; i++)
180                 regs.ireg[i] = 0;
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;
186         }
187
188         regs.argc = argc;
189         regs.argv = argv;
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);
198         regs.winClosed = 0;
199         regs.autoSleep = 0;
200         regs.setjmpEnv = &setjmpEnv;
201         regs.lastConsoleChar = '¥n';
202
203         regs.label = label;
204         regs.maxLabels = JITC_MAXLABELS;
205         regs.jitbuf = jp;
206         regs.jitbuf1 = jitbuf + 1024 * 1024;
207         regs.errHndl = &errorHandler;
208         regs.dbgr = 0;
209         if (searchArg(argc, argv, "dbgr:1", 0) != NULL) regs.dbgr = 1;
210
211         if ((argDebug & 1) != 0) {
212                 fp = fopen("debug1.bin", "wb");
213                 fwrite(jitbuf, 1, jp - jitbuf, fp);
214                 fclose(fp);
215         }
216
217         /* JITコード実行 */
218         jitfunc = (void *)jitbuf;
219         if (setjmp(setjmpEnv) == 0)
220                 (*jitfunc)(((char *)&regs) + 128); /* サイズを節約するためにEBPを128バイトずらす */
221         if (regs.autoSleep != 0) {
222                 if (vram != NULL)
223                         drv_flshWin(v_xsiz, v_ysiz, 0, 0);
224                 while (regs.winClosed == 0)
225                         drv_sleep(100);
226         }
227         if (regs.lastConsoleChar != '¥n')
228                 putchar('¥n');
229
230         tm2 = clock() / (double)CLOCKS_PER_SEC;
231
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);
236                 printf("result:¥n");
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]);
238         }
239 #if (USE_DEBUGGER != 0)
240         dbgrMain(&regs);
241 #endif
242         return 0;
243 }
244
245 int main(int argc, char **argv)
246 {
247         // Program entry point
248
249         return osecpuMain(argc, argv);
250 }