Revisión | 704f64422b7654fc918d74bd06f684e479bb926b (tree) |
---|---|
Tiempo | 2014-03-17 07:45:25 |
Autor | ttwilb <ttwilb@user...> |
Commiter | ttwilb |
読みやすく
@@ -1467,6 +1467,7 @@ unsigned char *jitCompCallFunc(unsigned char *dst, void *func) | ||
1467 | 1467 | return w.dst; |
1468 | 1468 | } |
1469 | 1469 | |
1470 | +// dst に errHndl() を呼ぶコードを置く。このコードの番地はerrfncにセットされる。 | |
1470 | 1471 | unsigned char *jitCompInit(unsigned char *dst) |
1471 | 1472 | { |
1472 | 1473 | errfnc = dst; |
@@ -23,14 +23,13 @@ void putKeybuf(int i) | ||
23 | 23 | int HeavyOSECPUMain(int argc, char **argv) |
24 | 24 | { |
25 | 25 | FILE *fp; |
26 | - unsigned char *jitbuf, *sysjit00, *sysjit; | |
26 | + unsigned char *jitbuf, *sysjit; | |
27 | 27 | unsigned char *systmp0, *systmp1, *systmp2; |
28 | 28 | unsigned char *opTbl; |
29 | 29 | HOSECPU_LabelListTag *label; |
30 | 30 | int tmpsiz, i; |
31 | 31 | double tm0, tm1, tm2; |
32 | 32 | HOSECPU_PointerControlTag *ptrCtrl; |
33 | - unsigned char *syslib; | |
34 | 33 | int argDebug = 0, stacksiz = 1; |
35 | 34 | const char *cp; |
36 | 35 | HOSECPU_RuntimeEnvironment env; |
@@ -48,11 +47,19 @@ int HeavyOSECPUMain(int argc, char **argv) | ||
48 | 47 | env.mainArgv = (const char **)argv; |
49 | 48 | env.appBin = malloc(APPSIZ1); |
50 | 49 | env.executionLevel = JITC_LV_SLOWEST; |
50 | + | |
51 | + if (env.mainArgc <= 1) | |
52 | + { | |
53 | + printf("Warning: file name is not set.\n"); | |
54 | + return 0; | |
55 | + } | |
56 | + | |
57 | + // JITコンパイラ用のバッファを確保 | |
51 | 58 | jitbuf = mallocRWE(1024 * 1024); /* とりあえず1MBで */ |
52 | - //unsigned char *sysjit0 = mallocRWE(SJITSIZ1), *sysjit1 = sysjit0, *sysjit00 = sysjit0; | |
59 | + | |
53 | 60 | // syslib.oseのjitc結果を格納する領域を確保。 |
54 | - sysjit00 = mallocRWE(SJITSIZ1); | |
55 | - sysjit = sysjit00; | |
61 | + sysjit = mallocRWE(SJITSIZ1 + 256); // jitCompInit() のための領域を多めにとる | |
62 | + | |
56 | 63 | // 現在の、jitc結果を格納するメモリへの書き込み位置のアドレス |
57 | 64 | // sysjit: 現在のjitc書き込み位置 |
58 | 65 | // sysjit00: jitc結果の先頭 |
@@ -75,19 +82,30 @@ int HeavyOSECPUMain(int argc, char **argv) | ||
75 | 82 | ptrCtrl[0].size = -2; |
76 | 83 | |
77 | 84 | /* syslibの読み込み */ |
78 | - syslib = Init_LoadSysLib(argv[0], systmp0); | |
79 | - | |
85 | + unsigned char const * const syslib = Init_LoadSysLib(argv[0], systmp0); | |
86 | + if ((argDebug & 4) != 0) | |
87 | + { | |
88 | + fp = fopen("debug4.bin", "wb"); | |
89 | + fwrite(syslib, 1, SYSLIBSIZ1, fp); | |
90 | + fclose(fp); | |
91 | + } | |
92 | + | |
93 | + // errHndl() を呼ぶコードを置く。このコードの番地はerrfncにセットされる。 | |
80 | 94 | sysjit = jitCompInit(sysjit); |
81 | - sysjit00 = sysjit; | |
95 | + unsigned char const * const sysjit00 = sysjit; | |
96 | + | |
82 | 97 | // labelはjitc0()内で初期化される。 |
83 | - i = jitc0(&sysjit, sysjit00 + SJITSIZ1, syslib + 32, syslib + SYSLIBSIZ1, JITC_LV_SLOWEST+9, label); | |
98 | + i = jitc0(&sysjit, sysjit00 + SJITSIZ1, syslib + 32, syslib + SYSLIBSIZ1, JITC_LV_SLOWEST + 9, label); | |
84 | 99 | if (i != 0){ |
85 | - fputs("syslib-file JITC error.\n", stderr); | |
100 | + switch (i) | |
101 | + { | |
102 | + case 1: fputs("syslib-file header error.\n", stderr); break; | |
103 | + default: fputs("syslib-file JITC error.\n", stderr); break; | |
104 | + } | |
86 | 105 | return 1; |
87 | 106 | } |
88 | 107 | |
89 | - // エラー時にデバッグ用に表示する変数を加算 | |
90 | - di1_serial++; | |
108 | + di1_serial = 1; | |
91 | 109 | |
92 | 110 | /* アプリバイナリの読み込み */ |
93 | 111 | LoadAppBin(&env); |
@@ -95,7 +113,7 @@ int HeavyOSECPUMain(int argc, char **argv) | ||
95 | 113 | /* クロック初期化 */ |
96 | 114 | tm0 = clock() / (double)CLOCKS_PER_SEC; |
97 | 115 | |
98 | - if (env.appBin[2] == 0xf0) { | |
116 | + if (env.appBin[2] == 0xf0) { // 最初の2byteはOSECPUのシグネチャである | |
99 | 117 | // tek5圧縮がかかっている |
100 | 118 | #if (USE_TEK5 != 0) |
101 | 119 | env.appSize1 = tek5Decomp(env.appBin + 2, env.appBin + env.appSize0, systmp0); |
@@ -107,6 +125,8 @@ int HeavyOSECPUMain(int argc, char **argv) | ||
107 | 125 | fputs("unsupported-format(tek5)\n", stderr); |
108 | 126 | return 1; |
109 | 127 | } |
128 | + | |
129 | + | |
110 | 130 | } |
111 | 131 | //デバッグモード指定 |
112 | 132 | cp = searchArg(argc, (const char **)argv, "debug:", 0); |
@@ -124,19 +144,19 @@ int HeavyOSECPUMain(int argc, char **argv) | ||
124 | 144 | |
125 | 145 | /* フロントエンドコードをバックエンドコードに変換する */ |
126 | 146 | if ((env.appBin[2] & 0xf0) != 0) { // 3バイト目が00なら処理しない |
127 | - systmp0[0] = env.appBin[0]; | |
128 | - systmp0[1] = env.appBin[1]; | |
129 | - env.preg[2].p = systmp0 + 2; | |
130 | - env.preg[3].p = systmp0 + SYSTMP0SIZ; | |
131 | - env.preg[4].p = env.appBin + 2; | |
132 | - env.preg[5].p = env.appBin + env.appSize1; | |
133 | - env.preg[6].p = systmp1; | |
134 | - env.preg[7].p = systmp1 + SYSTMP1SIZ; | |
135 | - env.preg[10].p = systmp2; | |
147 | + systmp0[0] = env.appBin[0]; // 05 | |
148 | + systmp0[1] = env.appBin[1]; // E1 | |
149 | + env.preg[2].p = systmp0 + 2; // P02 : バックエンドコードを書き出すアドレス | |
150 | + env.preg[3].p = systmp0 + SYSTMP0SIZ; // P03 : バックエンドコードを書き出すアドレスの最大値 | |
151 | + env.preg[4].p = env.appBin + 2; // P04 : フロントエンドコードが格納されたアドレス(シグネチャ除く) | |
152 | + env.preg[5].p = env.appBin + env.appSize1; // P05 : フロントエンドコードが存在するアドレスの最大値 | |
153 | + env.preg[6].p = systmp1; // P06 : テンポラリメモリを確保したアドレス | |
154 | + env.preg[7].p = systmp1 + SYSTMP1SIZ; // P07 : P06の最大値 | |
155 | + env.preg[10].p = systmp2; // P0A : また別のテンポラリ | |
136 | 156 | int pxxFlag[64], typLabel[4096]; |
137 | - env.preg[0x0b].p = (void *)pxxFlag; | |
138 | - env.preg[0x0c].p = (void *)typLabel; | |
139 | - env.preg[0x0d].p = opTbl; | |
157 | + env.preg[0x0b].p = (void *)pxxFlag; // P0B | |
158 | + env.preg[0x0c].p = (void *)typLabel; // P0C | |
159 | + env.preg[0x0d].p = opTbl; // P0D | |
140 | 160 | jitfunc = (void *)sysjit00; |
141 | 161 | (*jitfunc)(((char *)&env) + 128); /* サイズを節約するためにEBPを128バイトずらす */ |
142 | 162 | if (env.ireg[0] != 0) { |
@@ -256,20 +276,22 @@ int HeavyOSECPUMain(int argc, char **argv) | ||
256 | 276 | return env.appReturnCode; |
257 | 277 | } |
258 | 278 | |
279 | +/* | |
280 | + * argv0 : osecpu.exe の存在するパス | |
281 | + * tmpWprkMemory : SYSTMP0SIZ分確保されている | |
282 | + */ | |
259 | 283 | unsigned char *Init_LoadSysLib(char argv0[], unsigned char *tmpWorkMemory) |
260 | 284 | { |
261 | - unsigned char *syslib; | |
262 | 285 | FILE *fp; |
263 | 286 | unsigned char *up; |
264 | 287 | int appsize; |
265 | 288 | |
266 | 289 | /* syslibの読み込み */ |
267 | - syslib = malloc(SYSLIBSIZ1); | |
290 | + unsigned char *syslib = malloc(SYSLIBSIZ1); | |
268 | 291 | fp = fopen(SYSLIB_OSE, "rb"); |
269 | 292 | if (fp == NULL) { |
270 | - syslib[0] = '/'; | |
271 | - strcpy((char *)syslib + 1, argv0); | |
272 | - up = syslib + 1; | |
293 | + strcpy((char *)syslib, argv0); | |
294 | + up = syslib; | |
273 | 295 | while (*up != '\0'){ |
274 | 296 | up++; |
275 | 297 | } |
@@ -278,7 +300,7 @@ unsigned char *Init_LoadSysLib(char argv0[], unsigned char *tmpWorkMemory) | ||
278 | 300 | } |
279 | 301 | up++; |
280 | 302 | strcpy((char *)up, SYSLIB_OSE); |
281 | - fp = fopen((char *)syslib + 1, "rb"); | |
303 | + fp = fopen((char *)syslib, "rb"); | |
282 | 304 | } |
283 | 305 | if (fp == NULL) { |
284 | 306 | fputs("syslib-file fopen error.\n", stderr); |
@@ -297,10 +319,7 @@ unsigned char *Init_LoadSysLib(char argv0[], unsigned char *tmpWorkMemory) | ||
297 | 319 | syslib[0] = 0x05; |
298 | 320 | syslib[1] = 0x1b; |
299 | 321 | } |
300 | - | |
301 | - fp = fopen("syslib_dbg.ose", "wb"); | |
302 | - fwrite(syslib, 1, SYSLIBSIZ1, fp); | |
303 | - fclose(fp); | |
322 | + | |
304 | 323 | return syslib; |
305 | 324 | } |
306 | 325 |
@@ -309,10 +328,6 @@ void LoadAppBin(HOSECPU_RuntimeEnvironment *env) | ||
309 | 328 | FILE *fp; |
310 | 329 | const char *fileName; |
311 | 330 | /* アプリバイナリの読み込み */ |
312 | - if (env->mainArgc <= 1) { | |
313 | - //アプリ名未指定なので何事もなく終了 | |
314 | - exit(EXIT_SUCCESS); | |
315 | - } | |
316 | 331 | fileName = env->mainArgv[1]; |
317 | 332 | //アプリ名先頭に:n:をつけることでレベルnでの実行が可能? |
318 | 333 | if (fileName[0] == ':' && fileName[2] == ':') { |
@@ -1,226 +1,239 @@ | ||
1 | -#ifndef _HDLOAD_OSECPU | |
2 | -#define _HDLOAD_OSECPU 1 | |
3 | - | |
4 | -/* Visual Studio で fopen()やsprintf() などの古い関数を使用する時に出る警告を抑止する*/ | |
5 | -#define _CRT_SECURE_NO_WARNINGS 1 | |
6 | - | |
7 | -// | |
8 | -// Including stdc headers | |
9 | -// | |
10 | - | |
11 | -#include <stdio.h> | |
12 | -#include <string.h> | |
13 | -#include <limits.h> | |
14 | -#include <time.h> | |
15 | -#include <setjmp.h> | |
16 | -#include <stdlib.h> | |
17 | - | |
18 | - | |
19 | -// | |
20 | -// Compile options | |
21 | -// | |
22 | - | |
23 | -// Target architecture | |
24 | -// 1 : i386 | |
25 | -#define JITC_ARCNUM 0x0001 | |
26 | - | |
27 | -// Target operating system | |
28 | -// 1 : Windows 32bit | |
29 | -// 2 : Mac OSX 32bit | |
30 | -// 3 : blike for Linux | |
31 | -#ifdef _WIN32 | |
32 | -#define DRV_OSNUM 0x0001 | |
33 | -#endif | |
34 | -#ifdef __APPLE__ | |
35 | -#define DRV_OSNUM 0x0002 | |
36 | -#endif | |
37 | -#ifdef __linux__ | |
38 | -#define DRV_OSNUM 0x0003 | |
39 | -#endif | |
40 | -//#define DRV_OSNUM 0x0002 | |
41 | - | |
42 | -// Decoder (syslib.ose) setting | |
43 | -// syslib.ose is necessary to work OSECPU | |
44 | -#define SYSLIB_OSE "syslib.ose" | |
45 | - | |
46 | -// | |
47 | -// Define constant values | |
48 | -// | |
49 | - | |
50 | -// SIGN1: The 2nd signature of OSECPU Format(05 e1) | |
51 | -// It will be changed in OSECPU Rev.2 to "e2" (no adaptation in their binary layers) | |
52 | -#define SIGN1 0xe1 | |
53 | - | |
54 | -#define USE_DEBUGGER 1 | |
55 | -#define USE_TEK5 1 | |
56 | - | |
57 | -/* JITC mode flags */ | |
58 | -#define JITC_LV_SLOWEST 0 /* デバッグ支援は何でもやる */ | |
59 | -#define JITC_LV_SLOWER 1 /* エラーモジュールはレポートできるが、行番号は分からない、テストは過剰 */ | |
60 | -#define JITC_LV_SAFE 2 /* とにかく止まる、場所は不明、テストは必要最小限 */ | |
61 | -#define JITC_LV_FASTER 4 /* 情報は生成するがチェックをしない */ | |
62 | -#define JITC_LV_FASTEST 5 /* 情報すら生成しない */ | |
63 | -#define JITC_PHASE1 0x0001 | |
64 | -#define JITC_SKIPCHECK 0x0002 /* セキュリティチェックを省略する(高速危険モード) */ | |
65 | -#define JITC_NOSTARTUP 0x0004 | |
66 | -#define JITC_MAXLABELS 4096 | |
67 | -#define PTRCTRLSIZ 4096 | |
68 | - | |
69 | -#define APPSIZ1 1 * 1024 * 1024 /* 1MB for now */ | |
70 | -#define JITSIZ1 1 * 1024 * 1024 /* 1MB for now */ | |
71 | -#define SJITSIZ1 1 * 1024 * 1024 /* 1MB for now */ | |
72 | -#define SYSLIBSIZ1 1 * 1024 * 1024 /* 1MB for now */ | |
73 | -#define SYSTMP0SIZ 1 * 1024 * 1024 /* 1MB for now */ | |
74 | -#define SYSTMP1SIZ 2 * 1024 * 1024 /* 1MB for now */ | |
75 | - | |
76 | -#define KEYBUFSIZ 4096 | |
77 | - | |
78 | -#define KEY_ENTER '\n' | |
79 | -#define KEY_ESC 27 | |
80 | -#define KEY_BACKSPACE 8 | |
81 | -#define KEY_TAB 9 | |
82 | -#define KEY_PAGEUP 0x1020 | |
83 | -#define KEY_PAGEDWN 0x1021 | |
84 | -#define KEY_END 0x1022 | |
85 | -#define KEY_HOME 0x1023 | |
86 | -#define KEY_LEFT 0x1024 | |
87 | -#define KEY_UP 0x1025 | |
88 | -#define KEY_RIGHT 0x1026 | |
89 | -#define KEY_DOWN 0x1027 | |
90 | -#define KEY_INS 0x1028 | |
91 | -#define KEY_DEL 0x1029 | |
92 | - | |
93 | -// | |
94 | -// HOSECPU structures | |
95 | -// | |
96 | -typedef struct PtrCtrl HOSECPU_PointerControlTag; | |
97 | -struct PtrCtrl { | |
98 | - int liveSign; | |
99 | - int size, typ; | |
100 | - unsigned char *p0; | |
101 | -}; | |
102 | - | |
103 | -typedef struct Ptr HOSECPU_PointerRegisterEntry; | |
104 | -struct Ptr { /* 32バイト(=256bit!) */ | |
105 | - unsigned char *p; | |
106 | - int typ; | |
107 | - unsigned char *p0, *p1; | |
108 | - int liveSign; | |
109 | - HOSECPU_PointerControlTag *pls; | |
110 | - int flags, dummy; /* read/writeなど */ | |
111 | -}; | |
112 | - | |
113 | -typedef struct LabelTable HOSECPU_LabelListTag; | |
114 | -struct LabelTable { | |
115 | - unsigned char *p, *p1; | |
116 | - int opt; | |
117 | - /* | |
118 | - * default = -1 | |
119 | - * TYP_CODE = 0 | |
120 | - * T_UINT8 = 3 | |
121 | - * | |
122 | - * 将来的には UInt8, SInt32, Flt64, UInt8, VPtr が使えるようになる http://osecpu.osask.jp/wiki/?page0053 | |
123 | - */ | |
124 | - int typ; | |
125 | -}; | |
126 | - | |
127 | -typedef struct Device_Window HOSECPU_Device_Window; | |
128 | -struct Device_Window { | |
129 | - int *vram; | |
130 | - int xsize, ysize; | |
131 | -}; | |
132 | - | |
133 | -typedef struct Regs HOSECPU_RuntimeEnvironment; | |
134 | -struct Regs { | |
135 | - int ireg[64]; /* 32bit整数レジスタ */ | |
136 | - HOSECPU_PointerRegisterEntry preg[64]; /* ポインタレジスタ */ | |
137 | - // | |
138 | - int debugInfo0, debugInfo1, dmy[2]; /* 2304 */ | |
139 | - HOSECPU_PointerControlTag *ptrCtrl; /* 2320 */ | |
140 | - char winClosed, autoSleep; | |
141 | - jmp_buf setjmpEnv; | |
142 | - int appReturnCode; // アプリ自体の終了コード | |
143 | - | |
144 | - /* Main environment */ | |
145 | - int mainArgc; // HOSECPU起動引数の個数 | |
146 | - const char **mainArgv; // HOSECPU起動引数リスト | |
147 | - unsigned char *appBin; // 実行するアプリのバイナリ | |
148 | - int appSize0; | |
149 | - int appSize1; | |
150 | - int executionLevel; | |
151 | - | |
152 | - /* for-junkApi */ | |
153 | - unsigned char *buf0, *buf1, *junkStack, lastConsoleChar, *junkStack1; | |
154 | - | |
155 | - HOSECPU_LabelListTag *label; | |
156 | - int maxLabels; | |
157 | - unsigned char *jitbuf, *jitbuf1; | |
158 | - void(*errHndl)(HOSECPU_RuntimeEnvironment *); | |
159 | - char dbgr; | |
160 | - int mapDi1s[16][16]; | |
161 | -}; | |
162 | - | |
163 | -// | |
164 | -// Grobal values | |
165 | -// | |
166 | - | |
167 | -extern int *keybuf, keybuf_r, keybuf_w, keybuf_c; | |
168 | -extern HOSECPU_Device_Window mainWindow; | |
169 | -// di1_serial: デバッグ用。プログラム中の随所で加算される変数 | |
170 | -extern int di1_serial; | |
171 | - | |
172 | -// | |
173 | -// Functions | |
174 | -// | |
175 | - | |
176 | -// @main.c | |
177 | -void putKeybuf(int i); | |
178 | -int HeavyOSECPUMain(int argc, char **argv); | |
179 | - | |
180 | -// @comlib.c | |
181 | -unsigned char *ComLib_main(const unsigned char *p, unsigned char *q); | |
182 | -// @dpndenv.c | |
183 | -// OSに依存する関数群を定義する。 | |
184 | -void *mallocRWE(int bytes); // 実行権付きメモリのmalloc. | |
185 | -void drv_openWin(int x, int y, unsigned char *buf, char *winClosed); | |
186 | -void drv_flshWin(int sx, int sy, int x0, int y0); | |
187 | -void drv_sleep(int msec); | |
188 | - | |
189 | -// @function.c | |
190 | -void dbgrMain(HOSECPU_RuntimeEnvironment *r); | |
191 | -const char *searchArg(int argc, const char **argv, const char *tag, int i); // コマンドライン引数処理. | |
192 | -void devFunc(HOSECPU_RuntimeEnvironment *r); // junkApiを処理する関数 | |
193 | - | |
194 | -// @jitc.c | |
195 | -int jitc0(unsigned char **qq, unsigned char *q1, const unsigned char *p0, const unsigned char *p1, int level, HOSECPU_LabelListTag *label); | |
196 | -int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *src, const unsigned char *src1, const unsigned char *src0, HOSECPU_LabelListTag *label, int maxLabels, int level, int debugInfo1, int flags); | |
197 | -unsigned char *jitCompCallFunc(unsigned char *dst, void *func); | |
198 | -unsigned char *jitCompInit(unsigned char *dst); | |
199 | -void errorHandler(HOSECPU_RuntimeEnvironment *r); | |
200 | - | |
201 | -// @randmt.c | |
202 | -void randStatInit(unsigned int seed); | |
203 | -void randStatNext(); | |
204 | -unsigned int randGetNextUInt32(void); | |
205 | - | |
206 | -// @screen.c | |
207 | -static int iColor1[] = { | |
208 | - 0x000000, 0xff0000, 0x00ff00, 0xffff00, | |
209 | - 0x0000ff, 0xff00ff, 0x00ffff, 0xffffff | |
210 | -}; | |
211 | -void putOsaskChar(int c, HOSECPU_RuntimeEnvironment *r); | |
212 | -void checkString(HOSECPU_RuntimeEnvironment *r, int rxx, int pxx); | |
213 | -void checkRect(HOSECPU_RuntimeEnvironment *r, int rxx); | |
214 | -int loadColor(HOSECPU_RuntimeEnvironment *r, int rxx); | |
215 | - | |
216 | -// @usetek.c | |
217 | -#if (USE_TEK5 != 0) | |
218 | -#include "tek.h" | |
219 | -int appackSub2(const UCHAR **pp, char *pif); | |
220 | -int appackSub3u(const UCHAR **pp, char *pif); | |
221 | -int tek5Decomp(UCHAR *buf, UCHAR *buf1, UCHAR *tmp); | |
222 | -#endif | |
223 | - | |
224 | - | |
225 | -#endif | |
226 | - | |
1 | +#ifndef _HDLOAD_OSECPU | |
2 | +#define _HDLOAD_OSECPU 1 | |
3 | + | |
4 | +/* Visual Studio で fopen()やsprintf() などの古い関数を使用する時に出る警告を抑止する*/ | |
5 | +#define _CRT_SECURE_NO_WARNINGS 1 | |
6 | + | |
7 | +// | |
8 | +// Including stdc headers | |
9 | +// | |
10 | + | |
11 | +#include <stdio.h> | |
12 | +#include <string.h> | |
13 | +#include <limits.h> | |
14 | +#include <time.h> | |
15 | +#include <setjmp.h> | |
16 | +#include <stdlib.h> | |
17 | + | |
18 | + | |
19 | +// | |
20 | +// Compile options | |
21 | +// | |
22 | + | |
23 | +// Target architecture | |
24 | +// 1 : i386 | |
25 | +#define JITC_ARCNUM 0x0001 | |
26 | + | |
27 | +// Target operating system | |
28 | +// 1 : Windows 32bit | |
29 | +// 2 : Mac OSX 32bit | |
30 | +// 3 : blike for Linux | |
31 | +#ifdef _WIN32 | |
32 | +#define DRV_OSNUM 0x0001 | |
33 | +#endif | |
34 | +#ifdef __APPLE__ | |
35 | +#define DRV_OSNUM 0x0002 | |
36 | +#endif | |
37 | +#ifdef __linux__ | |
38 | +#define DRV_OSNUM 0x0003 | |
39 | +#endif | |
40 | +//#define DRV_OSNUM 0x0002 | |
41 | + | |
42 | +// Decoder (syslib.ose) setting | |
43 | +// syslib.ose is necessary to work OSECPU | |
44 | +#define SYSLIB_OSE "syslib.ose" | |
45 | + | |
46 | +// | |
47 | +// Define constant values | |
48 | +// | |
49 | + | |
50 | +// SIGN1: The 2nd signature of OSECPU Format(05 e1) | |
51 | +// It will be changed in OSECPU Rev.2 to "e2" (no adaptation in their binary layers) | |
52 | +#define SIGN1 0xe1 | |
53 | + | |
54 | +#define USE_DEBUGGER 1 | |
55 | +#define USE_TEK5 1 | |
56 | + | |
57 | +/* JITC mode flags */ | |
58 | +#define JITC_LV_SLOWEST 0 /* デバッグ支援は何でもやる */ | |
59 | +#define JITC_LV_SLOWER 1 /* エラーモジュールはレポートできるが、行番号は分からない、テストは過剰 */ | |
60 | +#define JITC_LV_SAFE 2 /* とにかく止まる、場所は不明、テストは必要最小限 */ | |
61 | +#define JITC_LV_FASTER 4 /* 情報は生成するがチェックをしない */ | |
62 | +#define JITC_LV_FASTEST 5 /* 情報すら生成しない */ | |
63 | +#define JITC_PHASE1 0x0001 | |
64 | +#define JITC_SKIPCHECK 0x0002 /* セキュリティチェックを省略する(高速危険モード) */ | |
65 | +#define JITC_NOSTARTUP 0x0004 | |
66 | +#define JITC_MAXLABELS 4096 | |
67 | +#define PTRCTRLSIZ 4096 | |
68 | + | |
69 | +#define APPSIZ1 1 * 1024 * 1024 /* 1MB for now */ | |
70 | +#define JITSIZ1 1 * 1024 * 1024 /* 1MB for now */ | |
71 | +#define SJITSIZ1 1 * 1024 * 1024 /* 1MB for now */ | |
72 | +#define SYSLIBSIZ1 1 * 1024 * 1024 /* 1MB for now */ | |
73 | +#define SYSTMP0SIZ 1 * 1024 * 1024 /* 1MB for now */ | |
74 | +#define SYSTMP1SIZ 2 * 1024 * 1024 /* 1MB for now */ | |
75 | + | |
76 | +#define KEYBUFSIZ 4096 | |
77 | + | |
78 | +#define KEY_ENTER '\n' | |
79 | +#define KEY_ESC 27 | |
80 | +#define KEY_BACKSPACE 8 | |
81 | +#define KEY_TAB 9 | |
82 | +#define KEY_PAGEUP 0x1020 | |
83 | +#define KEY_PAGEDWN 0x1021 | |
84 | +#define KEY_END 0x1022 | |
85 | +#define KEY_HOME 0x1023 | |
86 | +#define KEY_LEFT 0x1024 | |
87 | +#define KEY_UP 0x1025 | |
88 | +#define KEY_RIGHT 0x1026 | |
89 | +#define KEY_DOWN 0x1027 | |
90 | +#define KEY_INS 0x1028 | |
91 | +#define KEY_DEL 0x1029 | |
92 | + | |
93 | +// | |
94 | +// HOSECPU structures | |
95 | +// | |
96 | +typedef struct PtrCtrl HOSECPU_PointerControlTag; | |
97 | +struct PtrCtrl { | |
98 | + int liveSign; | |
99 | + int size, typ; | |
100 | + unsigned char *p0; | |
101 | +}; | |
102 | + | |
103 | +// Ptr | |
104 | +typedef struct Ptr HOSECPU_PointerRegisterEntry; | |
105 | +struct Ptr { /* 32バイト(=256bit!) */ | |
106 | + unsigned char *p; | |
107 | + | |
108 | + /* static char *typName[] = { | |
109 | + "T_CODE", "T_VPTR", "T_SINT8", "T_UINT8", | |
110 | + "T_SINT16", "T_UINT16", "T_SINT32", "T_UINT32", | |
111 | + "T_SINT4", "T_UINT4", "T_SINT2", "T_UINT2", | |
112 | + "T_SINT1", "T_UINT1", "T_SINT12", "T_UINT12", | |
113 | + "T_SINT20", "T_UINT20", "T_SINT24", "T_UINT24", | |
114 | + "T_SINT28", "T_UINT28" | |
115 | + } ; */ | |
116 | + int typ; | |
117 | + unsigned char *p0, *p1; | |
118 | + int liveSign; | |
119 | + HOSECPU_PointerControlTag *pls; | |
120 | + int flags, dummy; /* read/writeなど */ | |
121 | +}; | |
122 | + | |
123 | +// LabelTable | |
124 | +typedef struct LabelTable HOSECPU_LabelListTag; | |
125 | +struct LabelTable { | |
126 | + unsigned char *p, *p1; | |
127 | + int opt; | |
128 | + /* | |
129 | + * default = -1 | |
130 | + * TYP_CODE = 0 | |
131 | + * T_UINT8 = 3 | |
132 | + * | |
133 | + * 将来的には UInt8, SInt32, Flt64, UInt8, VPtr が使えるようになる http://osecpu.osask.jp/wiki/?page0053 | |
134 | + */ | |
135 | + int typ; | |
136 | +}; | |
137 | + | |
138 | +// Device_Window | |
139 | +typedef struct Device_Window HOSECPU_Device_Window; | |
140 | +struct Device_Window { | |
141 | + int *vram; // 初期値 : NULL | |
142 | + int xsize, ysize; // 初期値 : 0, 0 | |
143 | +}; | |
144 | + | |
145 | +// Regs + env | |
146 | +typedef struct Regs HOSECPU_RuntimeEnvironment; | |
147 | +struct Regs{ | |
148 | + int ireg[64]; /* 32bit整数レジスタ */ | |
149 | + HOSECPU_PointerRegisterEntry preg[64]; /* ポインタレジスタ */ | |
150 | + // | |
151 | + int debugInfo0, debugInfo1, dmy[2]; /* 2304 */ | |
152 | + HOSECPU_PointerControlTag *ptrCtrl; /* 2320 */ | |
153 | + char winClosed, autoSleep; | |
154 | + jmp_buf setjmpEnv; | |
155 | + int appReturnCode; // アプリ自体の終了コード | |
156 | + | |
157 | + /* Main environment */ | |
158 | + int mainArgc; // HOSECPU起動引数の個数 | |
159 | + const char **mainArgv; // HOSECPU起動引数リスト | |
160 | + unsigned char *appBin; // 実行するアプリのバイナリ | |
161 | + int appSize0; // アプリバイナリ読み込み時のサイズ(定数) | |
162 | + int appSize1; // アプリのフロントエンドコードのサイズ(tek解凍後) | |
163 | + int executionLevel; | |
164 | + | |
165 | + /* for-junkApi */ | |
166 | + unsigned char *buf0, *buf1, *junkStack, lastConsoleChar, *junkStack1; | |
167 | + | |
168 | + HOSECPU_LabelListTag *label; | |
169 | + int maxLabels; | |
170 | + unsigned char *jitbuf, *jitbuf1; | |
171 | + void(*errHndl)(HOSECPU_RuntimeEnvironment *); | |
172 | + char dbgr; | |
173 | + int mapDi1s[16][16]; | |
174 | +}; | |
175 | + | |
176 | +// | |
177 | +// Grobal values | |
178 | +// | |
179 | + | |
180 | +extern int *keybuf, keybuf_r, keybuf_w, keybuf_c; | |
181 | +extern HOSECPU_Device_Window mainWindow; | |
182 | +// di1_serial: デバッグ用。プログラム中の随所で加算される変数 | |
183 | +extern int di1_serial; | |
184 | + | |
185 | +// | |
186 | +// Functions | |
187 | +// | |
188 | + | |
189 | +// @main.c | |
190 | +void putKeybuf(int i); | |
191 | +int HeavyOSECPUMain(int argc, char **argv); | |
192 | + | |
193 | +// @comlib.c | |
194 | +unsigned char *ComLib_main(const unsigned char *p, unsigned char *q); | |
195 | +// @dpndenv.c | |
196 | +// OSに依存する関数群を定義する。 | |
197 | +void *mallocRWE(int bytes); // 実行権付きメモリのmalloc. | |
198 | +void drv_openWin(int x, int y, unsigned char *buf, char *winClosed); | |
199 | +void drv_flshWin(int sx, int sy, int x0, int y0); | |
200 | +void drv_sleep(int msec); | |
201 | + | |
202 | +// @function.c | |
203 | +void dbgrMain(HOSECPU_RuntimeEnvironment *r); | |
204 | +const char *searchArg(int argc, const char **argv, const char *tag, int i); // コマンドライン引数処理. | |
205 | +void devFunc(HOSECPU_RuntimeEnvironment *r); // junkApiを処理する関数 | |
206 | + | |
207 | +// @jitc.c | |
208 | +int jitc0(unsigned char **qq, unsigned char *q1, const unsigned char *p0, const unsigned char *p1, int level, HOSECPU_LabelListTag *label); | |
209 | +int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *src, const unsigned char *src1, const unsigned char *src0, HOSECPU_LabelListTag *label, int maxLabels, int level, int debugInfo1, int flags); | |
210 | +unsigned char *jitCompCallFunc(unsigned char *dst, void *func); | |
211 | +unsigned char *jitCompInit(unsigned char *dst); | |
212 | +void errorHandler(HOSECPU_RuntimeEnvironment *r); | |
213 | + | |
214 | +// @randmt.c | |
215 | +void randStatInit(unsigned int seed); | |
216 | +void randStatNext(); | |
217 | +unsigned int randGetNextUInt32(void); | |
218 | + | |
219 | +// @screen.c | |
220 | +static int iColor1[] = { | |
221 | + 0x000000, 0xff0000, 0x00ff00, 0xffff00, | |
222 | + 0x0000ff, 0xff00ff, 0x00ffff, 0xffffff | |
223 | +}; | |
224 | +void putOsaskChar(int c, HOSECPU_RuntimeEnvironment *r); | |
225 | +void checkString(HOSECPU_RuntimeEnvironment *r, int rxx, int pxx); | |
226 | +void checkRect(HOSECPU_RuntimeEnvironment *r, int rxx); | |
227 | +int loadColor(HOSECPU_RuntimeEnvironment *r, int rxx); | |
228 | + | |
229 | +// @usetek.c | |
230 | +#if (USE_TEK5 != 0) | |
231 | +#include "tek.h" | |
232 | +int appackSub2(const UCHAR **pp, char *pif); | |
233 | +int appackSub3u(const UCHAR **pp, char *pif); | |
234 | +int tek5Decomp(UCHAR *buf, UCHAR *buf1, UCHAR *tmp); | |
235 | +#endif | |
236 | + | |
237 | + | |
238 | +#endif | |
239 | + |