int HeavyOSECPUMain(int argc, char **argv)
{
FILE *fp;
- unsigned char *jitbuf, *sysjit00, *sysjit;
+ unsigned char *jitbuf, *sysjit;
unsigned char *systmp0, *systmp1, *systmp2;
unsigned char *opTbl;
HOSECPU_LabelListTag *label;
int tmpsiz, i;
double tm0, tm1, tm2;
HOSECPU_PointerControlTag *ptrCtrl;
- unsigned char *syslib;
int argDebug = 0, stacksiz = 1;
const char *cp;
HOSECPU_RuntimeEnvironment env;
env.mainArgv = (const char **)argv;
env.appBin = malloc(APPSIZ1);
env.executionLevel = JITC_LV_SLOWEST;
+
+ if (env.mainArgc <= 1)
+ {
+ printf("Warning: file name is not set.\n");
+ return 0;
+ }
+
+ // JITコンパイラ用のバッファを確保
jitbuf = mallocRWE(1024 * 1024); /* とりあえず1MBで */
- //unsigned char *sysjit0 = mallocRWE(SJITSIZ1), *sysjit1 = sysjit0, *sysjit00 = sysjit0;
+
// syslib.oseのjitc結果を格納する領域を確保。
- sysjit00 = mallocRWE(SJITSIZ1);
- sysjit = sysjit00;
+ sysjit = mallocRWE(SJITSIZ1 + 256); // jitCompInit() のための領域を多めにとる
+
// 現在の、jitc結果を格納するメモリへの書き込み位置のアドレス
// sysjit: 現在のjitc書き込み位置
// sysjit00: jitc結果の先頭
ptrCtrl[0].size = -2;
/* syslibの読み込み */
- syslib = Init_LoadSysLib(argv[0], systmp0);
-
+ unsigned char const * const syslib = Init_LoadSysLib(argv[0], systmp0);
+ if ((argDebug & 4) != 0)
+ {
+ fp = fopen("debug4.bin", "wb");
+ fwrite(syslib, 1, SYSLIBSIZ1, fp);
+ fclose(fp);
+ }
+
+ // errHndl() を呼ぶコードを置く。このコードの番地はerrfncにセットされる。
sysjit = jitCompInit(sysjit);
- sysjit00 = sysjit;
+ unsigned char const * const sysjit00 = sysjit;
+
// labelはjitc0()内で初期化される。
- i = jitc0(&sysjit, sysjit00 + SJITSIZ1, syslib + 32, syslib + SYSLIBSIZ1, JITC_LV_SLOWEST+9, label);
+ i = jitc0(&sysjit, sysjit00 + SJITSIZ1, syslib + 32, syslib + SYSLIBSIZ1, JITC_LV_SLOWEST + 9, label);
if (i != 0){
- fputs("syslib-file JITC error.\n", stderr);
+ switch (i)
+ {
+ case 1: fputs("syslib-file header error.\n", stderr); break;
+ default: fputs("syslib-file JITC error.\n", stderr); break;
+ }
return 1;
}
- // エラー時にデバッグ用に表示する変数を加算
- di1_serial++;
+ di1_serial = 1;
/* アプリバイナリの読み込み */
LoadAppBin(&env);
/* クロック初期化 */
tm0 = clock() / (double)CLOCKS_PER_SEC;
- if (env.appBin[2] == 0xf0) {
+ if (env.appBin[2] == 0xf0) { // 最初の2byteはOSECPUのシグネチャである
// tek5圧縮がかかっている
#if (USE_TEK5 != 0)
env.appSize1 = tek5Decomp(env.appBin + 2, env.appBin + env.appSize0, systmp0);
fputs("unsupported-format(tek5)\n", stderr);
return 1;
}
+
+
}
//デバッグモード指定
cp = searchArg(argc, (const char **)argv, "debug:", 0);
/* フロントエンドコードをバックエンドコードに変換する */
if ((env.appBin[2] & 0xf0) != 0) { // 3バイト目が00なら処理しない
- systmp0[0] = env.appBin[0];
- systmp0[1] = env.appBin[1];
- env.preg[2].p = systmp0 + 2;
- env.preg[3].p = systmp0 + SYSTMP0SIZ;
- env.preg[4].p = env.appBin + 2;
- env.preg[5].p = env.appBin + env.appSize1;
- env.preg[6].p = systmp1;
- env.preg[7].p = systmp1 + SYSTMP1SIZ;
- env.preg[10].p = systmp2;
+ systmp0[0] = env.appBin[0]; // 05
+ systmp0[1] = env.appBin[1]; // E1
+ env.preg[2].p = systmp0 + 2; // P02 : バックエンドコードを書き出すアドレス
+ env.preg[3].p = systmp0 + SYSTMP0SIZ; // P03 : バックエンドコードを書き出すアドレスの最大値
+ env.preg[4].p = env.appBin + 2; // P04 : フロントエンドコードが格納されたアドレス(シグネチャ除く)
+ env.preg[5].p = env.appBin + env.appSize1; // P05 : フロントエンドコードが存在するアドレスの最大値
+ env.preg[6].p = systmp1; // P06 : テンポラリメモリを確保したアドレス
+ env.preg[7].p = systmp1 + SYSTMP1SIZ; // P07 : P06の最大値
+ env.preg[10].p = systmp2; // P0A : また別のテンポラリ
int pxxFlag[64], typLabel[4096];
- env.preg[0x0b].p = (void *)pxxFlag;
- env.preg[0x0c].p = (void *)typLabel;
- env.preg[0x0d].p = opTbl;
+ env.preg[0x0b].p = (void *)pxxFlag; // P0B
+ env.preg[0x0c].p = (void *)typLabel; // P0C
+ env.preg[0x0d].p = opTbl; // P0D
jitfunc = (void *)sysjit00;
(*jitfunc)(((char *)&env) + 128); /* サイズを節約するためにEBPを128バイトずらす */
if (env.ireg[0] != 0) {
return env.appReturnCode;
}
+/*
+ * argv0 : osecpu.exe の存在するパス
+ * tmpWprkMemory : SYSTMP0SIZ分確保されている
+ */
unsigned char *Init_LoadSysLib(char argv0[], unsigned char *tmpWorkMemory)
{
- unsigned char *syslib;
FILE *fp;
unsigned char *up;
int appsize;
/* syslibの読み込み */
- syslib = malloc(SYSLIBSIZ1);
+ unsigned char *syslib = malloc(SYSLIBSIZ1);
fp = fopen(SYSLIB_OSE, "rb");
if (fp == NULL) {
- syslib[0] = '/';
- strcpy((char *)syslib + 1, argv0);
- up = syslib + 1;
+ strcpy((char *)syslib, argv0);
+ up = syslib;
while (*up != '\0'){
up++;
}
}
up++;
strcpy((char *)up, SYSLIB_OSE);
- fp = fopen((char *)syslib + 1, "rb");
+ fp = fopen((char *)syslib, "rb");
}
if (fp == NULL) {
fputs("syslib-file fopen error.\n", stderr);
syslib[0] = 0x05;
syslib[1] = 0x1b;
}
-
- fp = fopen("syslib_dbg.ose", "wb");
- fwrite(syslib, 1, SYSLIBSIZ1, fp);
- fclose(fp);
+
return syslib;
}
FILE *fp;
const char *fileName;
/* アプリバイナリの読み込み */
- if (env->mainArgc <= 1) {
- //アプリ名未指定なので何事もなく終了
- exit(EXIT_SUCCESS);
- }
fileName = env->mainArgv[1];
//アプリ名先頭に:n:をつけることでレベルnでの実行が可能?
if (fileName[0] == ':' && fileName[2] == ':') {
-#ifndef _HDLOAD_OSECPU\r
-#define _HDLOAD_OSECPU 1\r
-\r
-/* Visual Studio で fopen()やsprintf() などの古い関数を使用する時に出る警告を抑止する*/\r
-#define _CRT_SECURE_NO_WARNINGS 1\r
-\r
-//\r
-// Including stdc headers\r
-//\r
-\r
-#include <stdio.h>\r
-#include <string.h>\r
-#include <limits.h>\r
-#include <time.h>\r
-#include <setjmp.h>\r
-#include <stdlib.h>\r
-\r
-\r
-//\r
-// Compile options\r
-//\r
-\r
-// Target architecture\r
-// 1 : i386\r
-#define JITC_ARCNUM 0x0001\r
-\r
-// Target operating system\r
-// 1 : Windows 32bit\r
-// 2 : Mac OSX 32bit\r
-// 3 : blike for Linux\r
-#ifdef _WIN32\r
-#define DRV_OSNUM 0x0001\r
-#endif\r
-#ifdef __APPLE__\r
-#define DRV_OSNUM 0x0002\r
-#endif\r
-#ifdef __linux__\r
-#define DRV_OSNUM 0x0003\r
-#endif\r
-//#define DRV_OSNUM 0x0002\r
-\r
-// Decoder (syslib.ose) setting\r
-// syslib.ose is necessary to work OSECPU\r
-#define SYSLIB_OSE "syslib.ose"\r
-\r
-//\r
-// Define constant values\r
-//\r
-\r
-// SIGN1: The 2nd signature of OSECPU Format(05 e1)\r
-// It will be changed in OSECPU Rev.2 to "e2" (no adaptation in their binary layers)\r
-#define SIGN1 0xe1\r
-\r
-#define USE_DEBUGGER 1\r
-#define USE_TEK5 1\r
-\r
-/* JITC mode flags */\r
-#define JITC_LV_SLOWEST 0 /* デバッグ支援は何でもやる */\r
-#define JITC_LV_SLOWER 1 /* エラーモジュールはレポートできるが、行番号は分からない、テストは過剰 */\r
-#define JITC_LV_SAFE 2 /* とにかく止まる、場所は不明、テストは必要最小限 */\r
-#define JITC_LV_FASTER 4 /* 情報は生成するがチェックをしない */\r
-#define JITC_LV_FASTEST 5 /* 情報すら生成しない */\r
-#define JITC_PHASE1 0x0001\r
-#define JITC_SKIPCHECK 0x0002 /* セキュリティチェックを省略する(高速危険モード) */\r
-#define JITC_NOSTARTUP 0x0004\r
-#define JITC_MAXLABELS 4096\r
-#define PTRCTRLSIZ 4096\r
-\r
-#define APPSIZ1 1 * 1024 * 1024 /* 1MB for now */\r
-#define JITSIZ1 1 * 1024 * 1024 /* 1MB for now */\r
-#define SJITSIZ1 1 * 1024 * 1024 /* 1MB for now */\r
-#define SYSLIBSIZ1 1 * 1024 * 1024 /* 1MB for now */\r
-#define SYSTMP0SIZ 1 * 1024 * 1024 /* 1MB for now */\r
-#define SYSTMP1SIZ 2 * 1024 * 1024 /* 1MB for now */\r
-\r
-#define KEYBUFSIZ 4096\r
-\r
-#define KEY_ENTER '\n'\r
-#define KEY_ESC 27\r
-#define KEY_BACKSPACE 8\r
-#define KEY_TAB 9\r
-#define KEY_PAGEUP 0x1020\r
-#define KEY_PAGEDWN 0x1021\r
-#define KEY_END 0x1022\r
-#define KEY_HOME 0x1023\r
-#define KEY_LEFT 0x1024\r
-#define KEY_UP 0x1025\r
-#define KEY_RIGHT 0x1026\r
-#define KEY_DOWN 0x1027\r
-#define KEY_INS 0x1028\r
-#define KEY_DEL 0x1029\r
-\r
-//\r
-// HOSECPU structures\r
-//\r
-typedef struct PtrCtrl HOSECPU_PointerControlTag;\r
-struct PtrCtrl {\r
- int liveSign;\r
- int size, typ;\r
- unsigned char *p0;\r
-};\r
-\r
-typedef struct Ptr HOSECPU_PointerRegisterEntry;\r
-struct Ptr { /* 32バイト(=256bit!) */\r
- unsigned char *p;\r
- int typ;\r
- unsigned char *p0, *p1;\r
- int liveSign;\r
- HOSECPU_PointerControlTag *pls;\r
- int flags, dummy; /* read/writeなど */\r
-};\r
-\r
-typedef struct LabelTable HOSECPU_LabelListTag;\r
-struct LabelTable {\r
- unsigned char *p, *p1;\r
- int opt;\r
- /*\r
- * default = -1\r
- * TYP_CODE = 0\r
- * T_UINT8 = 3\r
- *\r
- * 将来的には UInt8, SInt32, Flt64, UInt8, VPtr が使えるようになる http://osecpu.osask.jp/wiki/?page0053\r
- */\r
- int typ;\r
-};\r
-\r
-typedef struct Device_Window HOSECPU_Device_Window;\r
-struct Device_Window {\r
- int *vram;\r
- int xsize, ysize;\r
-};\r
-\r
-typedef struct Regs HOSECPU_RuntimeEnvironment;\r
-struct Regs {\r
- int ireg[64]; /* 32bit整数レジスタ */\r
- HOSECPU_PointerRegisterEntry preg[64]; /* ポインタレジスタ */\r
- //\r
- int debugInfo0, debugInfo1, dmy[2]; /* 2304 */\r
- HOSECPU_PointerControlTag *ptrCtrl; /* 2320 */\r
- char winClosed, autoSleep;\r
- jmp_buf setjmpEnv;\r
- int appReturnCode; // アプリ自体の終了コード\r
- \r
- /* Main environment */\r
- int mainArgc; // HOSECPU起動引数の個数\r
- const char **mainArgv; // HOSECPU起動引数リスト\r
- unsigned char *appBin; // 実行するアプリのバイナリ\r
- int appSize0;\r
- int appSize1;\r
- int executionLevel;\r
- \r
- /* for-junkApi */\r
- unsigned char *buf0, *buf1, *junkStack, lastConsoleChar, *junkStack1;\r
- \r
- HOSECPU_LabelListTag *label;\r
- int maxLabels;\r
- unsigned char *jitbuf, *jitbuf1;\r
- void(*errHndl)(HOSECPU_RuntimeEnvironment *);\r
- char dbgr;\r
- int mapDi1s[16][16];\r
-};\r
-\r
-//\r
-// Grobal values\r
-//\r
-\r
-extern int *keybuf, keybuf_r, keybuf_w, keybuf_c;\r
-extern HOSECPU_Device_Window mainWindow;\r
-// di1_serial: デバッグ用。プログラム中の随所で加算される変数\r
-extern int di1_serial;\r
-\r
-//\r
-// Functions\r
-//\r
-\r
-// @main.c\r
-void putKeybuf(int i);\r
-int HeavyOSECPUMain(int argc, char **argv);\r
-\r
-// @comlib.c\r
-unsigned char *ComLib_main(const unsigned char *p, unsigned char *q);\r
-// @dpndenv.c\r
-// OSに依存する関数群を定義する。\r
-void *mallocRWE(int bytes); // 実行権付きメモリのmalloc.\r
-void drv_openWin(int x, int y, unsigned char *buf, char *winClosed);\r
-void drv_flshWin(int sx, int sy, int x0, int y0);\r
-void drv_sleep(int msec);\r
-\r
-// @function.c\r
-void dbgrMain(HOSECPU_RuntimeEnvironment *r);\r
-const char *searchArg(int argc, const char **argv, const char *tag, int i); // コマンドライン引数処理.\r
-void devFunc(HOSECPU_RuntimeEnvironment *r); // junkApiを処理する関数\r
-\r
-// @jitc.c\r
-int jitc0(unsigned char **qq, unsigned char *q1, const unsigned char *p0, const unsigned char *p1, int level, HOSECPU_LabelListTag *label);\r
-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
-unsigned char *jitCompCallFunc(unsigned char *dst, void *func);\r
-unsigned char *jitCompInit(unsigned char *dst);\r
-void errorHandler(HOSECPU_RuntimeEnvironment *r);\r
-\r
-// @randmt.c\r
-void randStatInit(unsigned int seed);\r
-void randStatNext();\r
-unsigned int randGetNextUInt32(void);\r
-\r
-// @screen.c\r
-static int iColor1[] = {\r
- 0x000000, 0xff0000, 0x00ff00, 0xffff00,\r
- 0x0000ff, 0xff00ff, 0x00ffff, 0xffffff\r
-};\r
-void putOsaskChar(int c, HOSECPU_RuntimeEnvironment *r);\r
-void checkString(HOSECPU_RuntimeEnvironment *r, int rxx, int pxx);\r
-void checkRect(HOSECPU_RuntimeEnvironment *r, int rxx);\r
-int loadColor(HOSECPU_RuntimeEnvironment *r, int rxx);\r
-\r
-// @usetek.c\r
-#if (USE_TEK5 != 0)\r
-#include "tek.h"\r
-int appackSub2(const UCHAR **pp, char *pif);\r
-int appackSub3u(const UCHAR **pp, char *pif);\r
-int tek5Decomp(UCHAR *buf, UCHAR *buf1, UCHAR *tmp);\r
-#endif\r
-\r
-\r
-#endif\r
-\r
+#ifndef _HDLOAD_OSECPU
+#define _HDLOAD_OSECPU 1
+
+/* Visual Studio で fopen()やsprintf() などの古い関数を使用する時に出る警告を抑止する*/
+#define _CRT_SECURE_NO_WARNINGS 1
+
+//
+// Including stdc headers
+//
+
+#include <stdio.h>
+#include <string.h>
+#include <limits.h>
+#include <time.h>
+#include <setjmp.h>
+#include <stdlib.h>
+
+
+//
+// Compile options
+//
+
+// Target architecture
+// 1 : i386
+#define JITC_ARCNUM 0x0001
+
+// Target operating system
+// 1 : Windows 32bit
+// 2 : Mac OSX 32bit
+// 3 : blike for Linux
+#ifdef _WIN32
+#define DRV_OSNUM 0x0001
+#endif
+#ifdef __APPLE__
+#define DRV_OSNUM 0x0002
+#endif
+#ifdef __linux__
+#define DRV_OSNUM 0x0003
+#endif
+//#define DRV_OSNUM 0x0002
+
+// Decoder (syslib.ose) setting
+// syslib.ose is necessary to work OSECPU
+#define SYSLIB_OSE "syslib.ose"
+
+//
+// Define constant values
+//
+
+// SIGN1: The 2nd signature of OSECPU Format(05 e1)
+// It will be changed in OSECPU Rev.2 to "e2" (no adaptation in their binary layers)
+#define SIGN1 0xe1
+
+#define USE_DEBUGGER 1
+#define USE_TEK5 1
+
+/* JITC mode flags */
+#define JITC_LV_SLOWEST 0 /* デバッグ支援は何でもやる */
+#define JITC_LV_SLOWER 1 /* エラーモジュールはレポートできるが、行番号は分からない、テストは過剰 */
+#define JITC_LV_SAFE 2 /* とにかく止まる、場所は不明、テストは必要最小限 */
+#define JITC_LV_FASTER 4 /* 情報は生成するがチェックをしない */
+#define JITC_LV_FASTEST 5 /* 情報すら生成しない */
+#define JITC_PHASE1 0x0001
+#define JITC_SKIPCHECK 0x0002 /* セキュリティチェックを省略する(高速危険モード) */
+#define JITC_NOSTARTUP 0x0004
+#define JITC_MAXLABELS 4096
+#define PTRCTRLSIZ 4096
+
+#define APPSIZ1 1 * 1024 * 1024 /* 1MB for now */
+#define JITSIZ1 1 * 1024 * 1024 /* 1MB for now */
+#define SJITSIZ1 1 * 1024 * 1024 /* 1MB for now */
+#define SYSLIBSIZ1 1 * 1024 * 1024 /* 1MB for now */
+#define SYSTMP0SIZ 1 * 1024 * 1024 /* 1MB for now */
+#define SYSTMP1SIZ 2 * 1024 * 1024 /* 1MB for now */
+
+#define KEYBUFSIZ 4096
+
+#define KEY_ENTER '\n'
+#define KEY_ESC 27
+#define KEY_BACKSPACE 8
+#define KEY_TAB 9
+#define KEY_PAGEUP 0x1020
+#define KEY_PAGEDWN 0x1021
+#define KEY_END 0x1022
+#define KEY_HOME 0x1023
+#define KEY_LEFT 0x1024
+#define KEY_UP 0x1025
+#define KEY_RIGHT 0x1026
+#define KEY_DOWN 0x1027
+#define KEY_INS 0x1028
+#define KEY_DEL 0x1029
+
+//
+// HOSECPU structures
+//
+typedef struct PtrCtrl HOSECPU_PointerControlTag;
+struct PtrCtrl {
+ int liveSign;
+ int size, typ;
+ unsigned char *p0;
+};
+
+// Ptr
+typedef struct Ptr HOSECPU_PointerRegisterEntry;
+struct Ptr { /* 32バイト(=256bit!) */
+ unsigned char *p;
+
+ /* static char *typName[] = {
+ "T_CODE", "T_VPTR", "T_SINT8", "T_UINT8",
+ "T_SINT16", "T_UINT16", "T_SINT32", "T_UINT32",
+ "T_SINT4", "T_UINT4", "T_SINT2", "T_UINT2",
+ "T_SINT1", "T_UINT1", "T_SINT12", "T_UINT12",
+ "T_SINT20", "T_UINT20", "T_SINT24", "T_UINT24",
+ "T_SINT28", "T_UINT28"
+ } ; */
+ int typ;
+ unsigned char *p0, *p1;
+ int liveSign;
+ HOSECPU_PointerControlTag *pls;
+ int flags, dummy; /* read/writeなど */
+};
+
+// LabelTable
+typedef struct LabelTable HOSECPU_LabelListTag;
+struct LabelTable {
+ unsigned char *p, *p1;
+ int opt;
+ /*
+ * default = -1
+ * TYP_CODE = 0
+ * T_UINT8 = 3
+ *
+ * 将来的には UInt8, SInt32, Flt64, UInt8, VPtr が使えるようになる http://osecpu.osask.jp/wiki/?page0053
+ */
+ int typ;
+};
+
+// Device_Window
+typedef struct Device_Window HOSECPU_Device_Window;
+struct Device_Window {
+ int *vram; // 初期値 : NULL
+ int xsize, ysize; // 初期値 : 0, 0
+};
+
+// Regs + env
+typedef struct Regs HOSECPU_RuntimeEnvironment;
+struct Regs{
+ int ireg[64]; /* 32bit整数レジスタ */
+ HOSECPU_PointerRegisterEntry preg[64]; /* ポインタレジスタ */
+ //
+ int debugInfo0, debugInfo1, dmy[2]; /* 2304 */
+ HOSECPU_PointerControlTag *ptrCtrl; /* 2320 */
+ char winClosed, autoSleep;
+ jmp_buf setjmpEnv;
+ int appReturnCode; // アプリ自体の終了コード
+
+ /* Main environment */
+ int mainArgc; // HOSECPU起動引数の個数
+ const char **mainArgv; // HOSECPU起動引数リスト
+ unsigned char *appBin; // 実行するアプリのバイナリ
+ int appSize0; // アプリバイナリ読み込み時のサイズ(定数)
+ int appSize1; // アプリのフロントエンドコードのサイズ(tek解凍後)
+ int executionLevel;
+
+ /* for-junkApi */
+ unsigned char *buf0, *buf1, *junkStack, lastConsoleChar, *junkStack1;
+
+ HOSECPU_LabelListTag *label;
+ int maxLabels;
+ unsigned char *jitbuf, *jitbuf1;
+ void(*errHndl)(HOSECPU_RuntimeEnvironment *);
+ char dbgr;
+ int mapDi1s[16][16];
+};
+
+//
+// Grobal values
+//
+
+extern int *keybuf, keybuf_r, keybuf_w, keybuf_c;
+extern HOSECPU_Device_Window mainWindow;
+// di1_serial: デバッグ用。プログラム中の随所で加算される変数
+extern int di1_serial;
+
+//
+// Functions
+//
+
+// @main.c
+void putKeybuf(int i);
+int HeavyOSECPUMain(int argc, char **argv);
+
+// @comlib.c
+unsigned char *ComLib_main(const unsigned char *p, unsigned char *q);
+// @dpndenv.c
+// OSに依存する関数群を定義する。
+void *mallocRWE(int bytes); // 実行権付きメモリのmalloc.
+void drv_openWin(int x, int y, unsigned char *buf, char *winClosed);
+void drv_flshWin(int sx, int sy, int x0, int y0);
+void drv_sleep(int msec);
+
+// @function.c
+void dbgrMain(HOSECPU_RuntimeEnvironment *r);
+const char *searchArg(int argc, const char **argv, const char *tag, int i); // コマンドライン引数処理.
+void devFunc(HOSECPU_RuntimeEnvironment *r); // junkApiを処理する関数
+
+// @jitc.c
+int jitc0(unsigned char **qq, unsigned char *q1, const unsigned char *p0, const unsigned char *p1, int level, HOSECPU_LabelListTag *label);
+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);
+unsigned char *jitCompCallFunc(unsigned char *dst, void *func);
+unsigned char *jitCompInit(unsigned char *dst);
+void errorHandler(HOSECPU_RuntimeEnvironment *r);
+
+// @randmt.c
+void randStatInit(unsigned int seed);
+void randStatNext();
+unsigned int randGetNextUInt32(void);
+
+// @screen.c
+static int iColor1[] = {
+ 0x000000, 0xff0000, 0x00ff00, 0xffff00,
+ 0x0000ff, 0xff00ff, 0x00ffff, 0xffffff
+};
+void putOsaskChar(int c, HOSECPU_RuntimeEnvironment *r);
+void checkString(HOSECPU_RuntimeEnvironment *r, int rxx, int pxx);
+void checkRect(HOSECPU_RuntimeEnvironment *r, int rxx);
+int loadColor(HOSECPU_RuntimeEnvironment *r, int rxx);
+
+// @usetek.c
+#if (USE_TEK5 != 0)
+#include "tek.h"
+int appackSub2(const UCHAR **pp, char *pif);
+int appackSub3u(const UCHAR **pp, char *pif);
+int tek5Decomp(UCHAR *buf, UCHAR *buf1, UCHAR *tmp);
+#endif
+
+
+#endif
+