-#include "osecpu.h"
+#include "osecpu.h"
int *keybuf, keybuf_r, keybuf_w, keybuf_c;
-int *vram, v_xsiz, v_ysiz;
+HOSECPU_Device_Window mainWindow;
//デバッグ用。プログラム中の随所で加算される変数
int di1_serial;
int HeavyOSECPUMain(int argc, char **argv)
{
- FILE *fp;
- unsigned char *jitbuf, *sysjit00, *sysjit;
- unsigned char *systmp0, *systmp1, *systmp2;
- unsigned char *opTbl;
- HOSECPU_LabelListTag *label;
- int tmpsiz, i;
- jmp_buf setjmpEnv;
+ FILE *fp;
+ unsigned char *jitbuf, *sysjit00, *sysjit;
+ unsigned char *systmp0, *systmp1, *systmp2;
+ unsigned char *opTbl;
+ HOSECPU_LabelListTag *label;
+ int tmpsiz, i;
+ jmp_buf setjmpEnv;
double tm0, tm1, tm2;
HOSECPU_PointerControlTag *ptrCtrl;
- unsigned char *syslib;
- int argDebug = 0, stacksiz = 1;
- const char *cp;
- HOSECPU_RuntimeEnvironment env;
+ unsigned char *syslib;
+ int argDebug = 0, stacksiz = 1;
+ const char *cp;
+ HOSECPU_RuntimeEnvironment env;
void(*jitfunc)(char *);
- unsigned char *jp;
-
- //グローバル変数初期化
- vram = NULL;
- di1_serial = 0;
-
- //実行環境初期化
- env.mainArgc = argc;
- env.mainArgv = (const char **)argv;
- env.appBin = malloc(APPSIZ1);
- env.executionLevel = JITC_LV_SLOWEST;
+ unsigned char *jp;
+
+ //Initialize mainWindow
+ mainWindow.vram = NULL;
+ mainWindow.xsize = 0;
+ mainWindow.ysize = 0;
+ di1_serial = 0;
+
+ //実行環境初期化
+ env.mainArgc = argc;
+ env.mainArgv = (const char **)argv;
+ env.appBin = malloc(APPSIZ1);
+ env.executionLevel = JITC_LV_SLOWEST;
jitbuf = mallocRWE(1024 * 1024); /* とりあえず1MBで */
//unsigned char *sysjit0 = mallocRWE(SJITSIZ1), *sysjit1 = sysjit0, *sysjit00 = sysjit0;
// syslib.oseのjitc結果を格納する領域を確保。
sysjit00 = mallocRWE(SJITSIZ1);
- sysjit = sysjit00;
+ sysjit = sysjit00;
// 現在の、jitc結果を格納するメモリへの書き込み位置のアドレス
- // sysjit: 現在のjitc書き込み位置
- // sysjit00: jitc結果の先頭
- //ワークメモリを三つくらいもらう
+ // sysjit: 現在のjitc書き込み位置
+ // sysjit00: jitc結果の先頭
+ //ワークメモリを三つくらいもらう
systmp0 = malloc(SYSTMP0SIZ); /* syslibのjitc用 */
systmp1 = malloc(SYSTMP1SIZ);
systmp2 = malloc(1024 * 1024);
-
- opTbl = malloc(256);
+
+ opTbl = malloc(256);
label = malloc(JITC_MAXLABELS * sizeof (HOSECPU_LabelListTag));
keybuf = malloc(KEYBUFSIZ * sizeof (int));
keybuf_r = keybuf_w = keybuf_c = 0;
ptrCtrl = malloc(PTRCTRLSIZ * sizeof (HOSECPU_PointerControlTag));
-
+
randStatInit((unsigned int)time(NULL));
for (i = 0; i < PTRCTRLSIZ; i++) {
ptrCtrl[i].liveSign = 0;
ptrCtrl[i].size = -1;
}
ptrCtrl[0].size = -2;
-
- /* syslibの読み込み */
- syslib = Init_LoadSysLib(argv[0], systmp0);
-
- sysjit = jitCompInit(sysjit);
- sysjit00 = sysjit;
+
+ /* syslibの読み込み */
+ syslib = Init_LoadSysLib(argv[0], systmp0);
+
+ sysjit = jitCompInit(sysjit);
+ sysjit00 = sysjit;
// labelはjitc0()内で初期化される。
i = jitc0(&sysjit, sysjit00 + SJITSIZ1, syslib + 32, syslib + SYSLIBSIZ1, JITC_LV_SLOWEST+9, label);
if (i != 0){
fputs("syslib-file JITC error.\n", stderr);
return 1;
}
-
+
// エラー時にデバッグ用に表示する変数を加算
di1_serial++;
-
- /* アプリバイナリの読み込み */
- LoadAppBin(&env);
-
- /* クロック初期化 */
+
+ /* アプリバイナリの読み込み */
+ LoadAppBin(&env);
+
+ /* クロック初期化 */
tm0 = clock() / (double)CLOCKS_PER_SEC;
-
+
if (env.appBin[2] == 0xf0) {
- // tek5圧縮がかかっている
+ // tek5圧縮がかかっている
#if (USE_TEK5 != 0)
env.appSize1 = tek5Decomp(env.appBin + 2, env.appBin + env.appSize0, systmp0) + 2;
#else
return 1;
}
}
- //デバッグモード指定
+ //デバッグモード指定
cp = searchArg(argc, (const char **)argv, "debug:", 0);
if (cp != NULL){
- argDebug = *cp - '0';
- }
- //スタックサイズ指定(MiB単位)
+ argDebug = *cp - '0';
+ }
+ //スタックサイズ指定(MiB単位)
cp = searchArg(argc, (const char **)argv, "stack:", 0);
if (cp != NULL){
- stacksiz = strtol(cp, NULL, 0);
- }
+ stacksiz = strtol(cp, NULL, 0);
+ }
jp = jitbuf; /* JIT-pointer */
-
+
/* フロントエンドコードをバックエンドコードに変換する */
if ((env.appBin[2] & 0xf0) != 0) {
systmp0[0] = env.appBin[0];
memcpy(systmp0, env.appBin, env.appSize1);
tmpsiz = env.appSize1;
}
-
+
if ((argDebug & 2) != 0) {
- /*変換後のバックエンドコードをファイルへ保存*/
+ /*変換後のバックエンドコードをファイルへ保存*/
fp = fopen("debug2.bin", "wb");
fwrite(systmp0, 1, tmpsiz, fp);
fclose(fp);
}
-
- //JITコンパイル
+
+ //JITコンパイル
i = jitc0(&jp, jitbuf + 1024 * 1024, systmp0, systmp0 + tmpsiz, env.executionLevel, label);
if (i == 1){
- fputs("app-file header error.\n", stderr);
+ fputs("app-file header error.\n", stderr);
return 1;
- }
+ }
if (i != 0){
- return 1;
- }
+ return 1;
+ }
di1_serial++;
-
+
int appsiz2 = jp - jitbuf;
-
+
unsigned char *p28 = jp;
jp = jitCompCallFunc(jp, &devFunc);
-
+
tm1 = clock() / (double)CLOCKS_PER_SEC;
-
+
/* レジスタ初期化 */
for (i = 0; i < 64; i++){
env.ireg[i] = 0;
- }
+ }
for (i = 0; i < 64; i++) {
env.preg[i].p = NULL;
env.preg[i].typ = -1;
env.preg[i].p0 = NULL;
env.preg[i].p1 = NULL;
}
-
+
env.buf0 = env.buf1 = NULL;
env.preg[0x28].p = p28;
env.preg[0x28].typ = 0; // TYP_CODE
env.autoSleep = 0;
env.setjmpEnv = &setjmpEnv;
env.lastConsoleChar = '\n';
-
+
env.label = label;
env.maxLabels = JITC_MAXLABELS;
env.jitbuf = jp;
env.jitbuf1 = jitbuf + 1024 * 1024;
env.errHndl = &errorHandler;
-
+
env.dbgr = 0;
if (searchArg(argc, (const char **)argv, "dbgr:1", 0) != NULL){
- env.dbgr = 1;
- }
-
+ env.dbgr = 1;
+ }
+
if ((argDebug & 1) != 0) {
fp = fopen("debug1.bin", "wb");
fwrite(jitbuf, 1, jp - jitbuf, fp);
fclose(fp);
}
-
+
/* JITコード実行 */
jitfunc = (void *)jitbuf;
if (setjmp(setjmpEnv) == 0){
(*jitfunc)(((char *)&env) + 128); /* サイズを節約するためにEBPを128バイトずらす */
- }
+ }
if (env.autoSleep != 0) {
- if (vram != NULL){
- drv_flshWin(v_xsiz, v_ysiz, 0, 0);
- }
+ if (mainWindow.vram != NULL){
+ drv_flshWin(mainWindow.xsize, mainWindow.ysize, 0, 0);
+ }
while (env.winClosed == 0){
drv_sleep(100);
- drv_flshWin(v_xsiz, v_ysiz, 0, 0);
- }
+ }
}
if (env.lastConsoleChar != '\n'){
putchar('\n');
- }
-
+ }
+
tm2 = clock() / (double)CLOCKS_PER_SEC;
-
+
/* 実行結果確認のためのレジスタダンプ */
if (searchArg(argc, (const char **)argv, "verbose:1", 0) != NULL) {
printf("time: JITC=%.3f[sec], exec=%.3f[sec]\n", tm1 - tm0, tm2 - tm1);
unsigned char *Init_LoadSysLib(char argv0[], unsigned char *tmpWorkMemory)
{
- unsigned char *syslib;
- FILE *fp;
- unsigned char *up;
- int appsize;
-
- /* syslibの読み込み */
+ unsigned char *syslib;
+ FILE *fp;
+ unsigned char *up;
+ int appsize;
+
+ /* syslibの読み込み */
syslib = malloc(SYSLIBSIZ1);
fp = fopen(SYSLIB_OSE, "rb");
if (fp == NULL) {
strcpy((char *)syslib + 1, argv0);
up = syslib + 1;
while (*up != '\0'){
- up++;
- }
+ up++;
+ }
while (*up != '/' && *up != 0x5c){
- up--;
- }
+ up--;
+ }
up++;
strcpy((char *)up, SYSLIB_OSE);
fp = fopen((char *)syslib + 1, "rb");
}
if (fp == NULL) {
fputs("syslib-file fopen error.\n", stderr);
- exit(EXIT_FAILURE);
+ exit(EXIT_FAILURE);
}
appsize = fread(syslib, 1, SYSLIBSIZ1 - 4, fp);
fclose(fp);
syslib[0] = 0x05;
syslib[1] = 0x1b;
}
-
+
fp = fopen("syslib_dbg.ose", "wb");
fwrite(syslib, 1, SYSLIBSIZ1, fp);
fclose(fp);
- return syslib;
+ return syslib;
}
void LoadAppBin(HOSECPU_RuntimeEnvironment *env)
{
- FILE *fp;
- const char *fileName;
+ FILE *fp;
+ const char *fileName;
/* アプリバイナリの読み込み */
if (env->mainArgc <= 1) {
- //アプリ名未指定なので何事もなく終了
- exit(EXIT_SUCCESS);
- }
+ //アプリ名未指定なので何事もなく終了
+ exit(EXIT_SUCCESS);
+ }
fileName = env->mainArgv[1];
- //アプリ名先頭に:n:をつけることでレベルnでの実行が可能?
+ //アプリ名先頭に:n:をつけることでレベルnでの実行が可能?
if (fileName[0] == ':' && fileName[2] == ':') {
env->executionLevel = fileName[1] - '0';
if (env->executionLevel < 0 || env->executionLevel > 9){
env->executionLevel = JITC_LV_SLOWEST;
- }
+ }
fileName += 3;
}
-
+
fp = fopen(fileName, "rb");
if (fp == NULL) {
fputs("app-file load error.\n", stderr);
exit(EXIT_FAILURE);
}
env->appSize0 = fread(env->appBin, 1, APPSIZ1 - 4, fp);
- env->appSize1 = env->appSize0;
+ env->appSize1 = env->appSize0;
fclose(fp);
-
+
if (env->appSize0 >= APPSIZ1 - 4) {
fputs("app-file too large.\n", stderr);
exit(EXIT_FAILURE);