OSDN Git Service

aebe28c70811ff046223941b05edae4ca971cb8b
[heavyosecpu/HeavyOSECPU.git] / osecpu.h
1 #ifndef _HDLOAD_OSECPU\r
2 #define _HDLOAD_OSECPU 1\r
3 \r
4 /* Visual Studio で fopen()やsprintf() などの古い関数を使用する時に出る警告を抑止する*/\r
5 #define _CRT_SECURE_NO_WARNINGS 1\r
6 \r
7 //\r
8 // Including stdc headers\r
9 //\r
10 \r
11 #include <stdio.h>\r
12 #include <string.h>\r
13 #include <limits.h>\r
14 #include <time.h>\r
15 #include <setjmp.h>\r
16 #include <stdlib.h>\r
17 \r
18 \r
19 //\r
20 // Compile options\r
21 //\r
22 \r
23 // Target architecture\r
24 // 1 : i386\r
25 #define JITC_ARCNUM 0x0001\r
26 \r
27 // Target operating system\r
28 // 1 : Windows 32bit\r
29 // 2 : Mac OSX 32bit\r
30 // 3 : blike for Linux\r
31 #ifdef _WIN32\r
32 #define DRV_OSNUM                       0x0001\r
33 #endif\r
34 #ifdef __APPLE__\r
35 #define DRV_OSNUM                       0x0002\r
36 #endif\r
37 #ifdef __linux__\r
38 #define DRV_OSNUM                       0x0003\r
39 #endif\r
40 //#define DRV_OSNUM 0x0002\r
41 \r
42 // Decoder (syslib.ose) setting\r
43 // syslib.ose is necessary to work OSECPU\r
44 #define SYSLIB_OSE      "syslib.ose"\r
45 \r
46 //\r
47 // Define constant values\r
48 //\r
49 \r
50 // SIGN1: The 2nd signature of OSECPU Format(05 e1)\r
51 // It will be changed in OSECPU Rev.2 to "e2" (no adaptation in their binary layers)\r
52 #define SIGN1           0xe1\r
53 \r
54 #define USE_DEBUGGER    1\r
55 #define USE_TEK5                1\r
56 \r
57 /* JITC mode flags */\r
58 #define JITC_LV_SLOWEST         0       /* デバッグ支援は何でもやる */\r
59 #define JITC_LV_SLOWER          1       /* エラーモジュールはレポートできるが、行番号は分からない、テストは過剰 */\r
60 #define JITC_LV_SAFE            2       /* とにかく止まる、場所は不明、テストは必要最小限 */\r
61 #define JITC_LV_FASTER          4       /* 情報は生成するがチェックをしない */\r
62 #define JITC_LV_FASTEST         5       /* 情報すら生成しない */\r
63 #define JITC_PHASE1                     0x0001\r
64 #define JITC_SKIPCHECK          0x0002  /* セキュリティチェックを省略する(高速危険モード) */\r
65 #define JITC_NOSTARTUP          0x0004\r
66 #define JITC_MAXLABELS          4096\r
67 #define PTRCTRLSIZ                      4096\r
68 \r
69 #define APPSIZ1         1 * 1024 * 1024 /* 1MB for now */\r
70 #define APPJITSIZE  1 * 1024 * 1024 /* 1MB for now */\r
71 #define SYSJITSIZ1      2 * 1024 * 1024 /* 1MB for now */\r
72 #define SYSLIBSIZ1      1 * 1024 * 1024 /* 1MB for now */\r
73 #define SYSTMP0SIZ      1 * 1024 * 1024 /* 1MB for now */\r
74 #define SYSTMP1SIZ      2 * 1024 * 1024 /* 1MB for now */\r
75 \r
76 #define KEYBUFSIZ               4096\r
77 \r
78 #define KEY_ENTER               '\n'\r
79 #define KEY_ESC                 27\r
80 #define KEY_BACKSPACE   8\r
81 #define KEY_TAB                 9\r
82 #define KEY_PAGEUP              0x1020\r
83 #define KEY_PAGEDWN             0x1021\r
84 #define KEY_END                 0x1022\r
85 #define KEY_HOME                0x1023\r
86 #define KEY_LEFT                0x1024\r
87 #define KEY_UP                  0x1025\r
88 #define KEY_RIGHT               0x1026\r
89 #define KEY_DOWN                0x1027\r
90 #define KEY_INS                 0x1028\r
91 #define KEY_DEL                 0x1029\r
92 \r
93 //\r
94 // HOSECPU structures\r
95 //\r
96 typedef struct PtrCtrl HOSECPU_PointerControlTag;\r
97 struct PtrCtrl {\r
98         int liveSign;\r
99         int size, typ;\r
100         unsigned char *p0;\r
101 };\r
102 \r
103 typedef struct Ptr HOSECPU_PointerRegisterEntry;\r
104 struct Ptr {\r
105         // 32バイト(=256bit!)\r
106         unsigned char *p;\r
107         \r
108         /* static char *typName[] = {\r
109                 "T_CODE", "T_VPTR", "T_SINT8", "T_UINT8",\r
110                 "T_SINT16", "T_UINT16", "T_SINT32", "T_UINT32",\r
111                 "T_SINT4", "T_UINT4", "T_SINT2", "T_UINT2",\r
112                 "T_SINT1", "T_UINT1", "T_SINT12", "T_UINT12",\r
113                 "T_SINT20", "T_UINT20", "T_SINT24", "T_UINT24",\r
114                 "T_SINT28", "T_UINT28"\r
115         } ; */\r
116         int typ;\r
117         unsigned char *p0, *p1;\r
118         int liveSign;\r
119         HOSECPU_PointerControlTag *pls;\r
120         int flags, dummy;       /* read/writeなど */\r
121 };\r
122 \r
123 typedef struct LabelTable HOSECPU_LabelListTag;\r
124 struct LabelTable {\r
125         unsigned char *p, *p1;\r
126         int opt;\r
127         /*\r
128          * default = -1\r
129          * TYP_CODE = 0\r
130          * T_UINT8 = 3\r
131          *\r
132          * 将来的には UInt8, SInt32, Flt64, UInt8, VPtr が使えるようになる http://osecpu.osask.jp/wiki/?page0053\r
133          */\r
134         int typ;\r
135 };\r
136 \r
137 typedef struct Device_Window HOSECPU_Device_Window;\r
138 struct Device_Window {\r
139     int *vram;\r
140     int xsize, ysize;\r
141 };\r
142 \r
143 typedef struct Regs HOSECPU_RuntimeEnvironment;\r
144 struct Regs {\r
145         int ireg[64];                                                           // 整数レジスタ (4 * 64) = 256\r
146         HOSECPU_PointerRegisterEntry preg[64];          // ポインタレジスタ (32 * 64) = 2048\r
147     //\r
148         int debugInfo0;                                                         // 2304\r
149         int debugInfo1;                                                         // 2308\r
150     int dbg_currentCode;                        // 2312\r
151         int dmy;                                                                        // 2316\r
152         //\r
153         HOSECPU_PointerControlTag *ptrCtrl;         // 2320\r
154         char winClosed, autoSleep;\r
155         jmp_buf setjmpEnv;\r
156     int appReturnCode;      // アプリ自体の終了コード\r
157     \r
158     /* Main environment */\r
159     int mainArgc;           // HOSECPU起動引数の個数\r
160     const char **mainArgv;  // HOSECPU起動引数リスト\r
161     unsigned char *appBin;  // 実行するアプリのバイナリ\r
162     int appSize0;\r
163     int appSize1;\r
164     int executionLevel;\r
165     \r
166         /* for-junkApi */\r
167         unsigned char *buf0, *buf1, *junkStack, lastConsoleChar, *junkStack1;\r
168     \r
169         HOSECPU_LabelListTag *label;\r
170         int maxLabels;\r
171         unsigned char *jitbuf, *jitbuf1;\r
172         void(*errHndl)(HOSECPU_RuntimeEnvironment *);\r
173         char dbgr;\r
174         int mapDi1s[16][16];\r
175 };\r
176 \r
177 //\r
178 // Grobal values\r
179 //\r
180 \r
181 extern int *keybuf, keybuf_r, keybuf_w, keybuf_c;\r
182 extern HOSECPU_Device_Window mainWindow;\r
183 // di1_serial: デバッグ用。プログラム中の随所で加算される変数\r
184 extern int di1_serial;\r
185 \r
186 //\r
187 // Functions\r
188 //\r
189 \r
190 // @main.c\r
191 void putKeybuf(int i);\r
192 int HeavyOSECPUMain(int argc, char **argv);\r
193 \r
194 // @comlib.c\r
195 unsigned char *ComLib_main(const unsigned char *p, unsigned char *q);\r
196 // @dpndenv.c\r
197 // OSに依存する関数群を定義する。\r
198 void *mallocRWE(int bytes); // 実行権付きメモリのmalloc.\r
199 void drv_openWin(int x, int y, unsigned char *buf, char *winClosed);\r
200 void drv_flshWin(int sx, int sy, int x0, int y0);\r
201 void drv_sleep(int msec);\r
202 \r
203 // @function.c\r
204 void dbgrMain(HOSECPU_RuntimeEnvironment *r);\r
205 const char *searchArg(int argc, const char **argv, const char *tag, int i); // コマンドライン引数処理.\r
206 void devFunc(HOSECPU_RuntimeEnvironment *r); // junkApiを処理する関数\r
207 \r
208 // @jitc.c\r
209 void errorHandler(HOSECPU_RuntimeEnvironment *r);\r
210 void PRegCopy(HOSECPU_PointerRegisterEntry *dst, HOSECPU_PointerRegisterEntry *src);\r
211 // @jitcx86.c\r
212 int jitc0(unsigned char **qq, unsigned char *q1, const unsigned char *p0, const unsigned char *p1, int level, HOSECPU_LabelListTag *label);\r
213 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);\r
214 unsigned char *jitCompCallFunc(unsigned char *dst, void *func);\r
215 unsigned char *jitCompInit(unsigned char *dst);\r
216 void jitcRunBinary(void (*bin)(char *), HOSECPU_RuntimeEnvironment *env);\r
217 \r
218 // @randmt.c\r
219 void randStatInit(unsigned int seed);\r
220 void randStatNext();\r
221 unsigned int randGetNextUInt32(void);\r
222 \r
223 // @screen.c\r
224 static int iColor1[] = {\r
225         0x000000, 0xff0000, 0x00ff00, 0xffff00,\r
226         0x0000ff, 0xff00ff, 0x00ffff, 0xffffff\r
227 };\r
228 void putOsaskChar(int c, HOSECPU_RuntimeEnvironment *r);\r
229 void checkString(HOSECPU_RuntimeEnvironment *r, int rxx, int pxx);\r
230 void checkRect(HOSECPU_RuntimeEnvironment *r, int rxx);\r
231 int loadColor(HOSECPU_RuntimeEnvironment *r, int rxx);\r
232 \r
233 // @usetek.c\r
234 #if (USE_TEK5 != 0)\r
235 #include "tek.h"\r
236 int appackSub2(const UCHAR **pp, char *pif);\r
237 int appackSub3u(const UCHAR **pp, char *pif);\r
238 int tek5Decomp(UCHAR *buf, UCHAR *buf1, UCHAR *tmp);\r
239 #endif\r
240 \r
241 \r
242 #endif\r