Revisión | 53a2ae5571cc5991f74e3f18144e32a7b0d88606 (tree) |
---|---|
Tiempo | 2014-03-10 10:08:07 |
Autor | ttwilb <ttwilb@user...> |
Commiter | ttwilb |
VisualStudioでの警告抑制とコメント付加
@@ -1412,7 +1412,10 @@ unsigned char *jitCompCallFunc(unsigned char *dst, void *func) | ||
1412 | 1412 | jitCompPutByte1(w.dst, 0x55); /* PUSH(EBP); */ |
1413 | 1413 | jitCompPutByte1(w.dst, 0xe8); /* CALL(func); */ |
1414 | 1414 | int j = ((unsigned char *)func) - (w.dst + 4); |
1415 | + | |
1416 | + //この関数の中では結局w->dstしか参照していない | |
1415 | 1417 | jitCompPutImm32(&w, j); |
1418 | + | |
1416 | 1419 | jitCompPutByte1(w.dst, 0x58); /* POP(EAX); */ /* (win32では不要なのだけど、MacOSには必要らしい) */ |
1417 | 1420 | jitCompPutByte1(w.dst, 0x58); /* POP(EAX); */ |
1418 | 1421 | jitCompPutByte1(w.dst, 0x61); /* POPAD(); */ |
@@ -1543,6 +1546,15 @@ void errHndl(struct Regs *r) | ||
1543 | 1546 | // ここに帰ってきてはいけない. |
1544 | 1547 | } |
1545 | 1548 | |
1549 | +/* | |
1550 | + * qq : 出力バイナリの書き込み位置のアドレスへの参照(書き込み位置を呼び出しに反映させるため参照渡しにする) | |
1551 | + * q1 : 出力バイナリの書き込み位置のアドレスの最大値 | |
1552 | + * p0 : (*.ose)バイナリの読み込み位置のアドレス(ヘッダ部除去済) | |
1553 | + * p1 : (*.ose)バイナリの読み込み位置の取りうる最大値 | |
1554 | + * (ただし、「確保したメモリ」の最大値なのでこれより手前にゴミデータが入っているかもしれない) | |
1555 | + * ret=1 : ヘッダのエラー | |
1556 | + * ret=2 : jitコンパイルエラー | |
1557 | + */ | |
1546 | 1558 | int jitc0(unsigned char **qq, unsigned char *q1, const unsigned char *p0, const unsigned char *p1, int level, struct LabelTable *label) |
1547 | 1559 | { |
1548 | 1560 | unsigned char *q = *qq; |
@@ -14,7 +14,14 @@ int osecpuMain(int argc, char **argv) | ||
14 | 14 | { |
15 | 15 | unsigned char *appbin = malloc(APPSIZ1), *up; |
16 | 16 | unsigned char *jitbuf = mallocRWE(1024 * 1024); /* とりあえず1MBで */ |
17 | - unsigned char *sysjit0 = mallocRWE(SJITSIZ1), *sysjit1 = sysjit0, *sysjit00 = sysjit0; | |
17 | + //unsigned char *sysjit0 = mallocRWE(SJITSIZ1), *sysjit1 = sysjit0, *sysjit00 = sysjit0; | |
18 | + | |
19 | + // syslib.oseのjitc結果を格納する領域を確保。 | |
20 | + unsigned char *sysjit00 = mallocRWE(SJITSIZ1); | |
21 | + | |
22 | + // 現在の、jitc結果を格納するメモリへの書き込み位置のアドレス | |
23 | + unsigned char *sysjit = sysjit00; | |
24 | + | |
18 | 25 | unsigned char *systmp0 = malloc(SYSTMP0SIZ); |
19 | 26 | unsigned char *systmp1 = malloc(SYSTMP1SIZ); |
20 | 27 | unsigned char *systmp2 = malloc(1024 * 1024), *opTbl = malloc(256); |
@@ -58,19 +65,32 @@ int osecpuMain(int argc, char **argv) | ||
58 | 65 | return 1; |
59 | 66 | } |
60 | 67 | if (syslib[0] == 0x05 && syslib[1] == 0xc1) { |
68 | + | |
69 | + // 一体この部分ではなにをやっているのだろう? | |
70 | + // OSECPUに0x05, 0x1bという命令はないが... ヘッダ? | |
71 | + // どうせ初めからの32バイトは無視されるのだろうに... | |
72 | + | |
61 | 73 | memcpy(systmp0, syslib, appsiz0); |
62 | 74 | ComLib_main(systmp0 + 2, syslib + 2); |
63 | 75 | syslib[0] = 0x05; |
64 | 76 | syslib[1] = 0x1b; |
65 | 77 | } |
66 | 78 | |
67 | - sysjit1 = jitCompInit(sysjit1); | |
68 | - sysjit0 = sysjit1; | |
69 | - i = jitc0(&sysjit1, sysjit00 + SJITSIZ1, syslib + 32, syslib + SYSLIBSIZ1, JITC_LV_SLOWEST + 9, label); | |
79 | + // jutc.cのerrHndl()をCALLするネィティブコードを挿入。 | |
80 | + // sysjitの値は次の書き込み位置へずらされる。 | |
81 | + // 元々のsysjitはsysjit00へ保存されている。 | |
82 | + sysjit = jitCompInit(sysjit); | |
83 | + | |
84 | + // sysjit (アドレス変数)は下の関数の実行で変更される(だから参照渡し) | |
85 | + // もちろんsysjitの値は次の書き込み位置へずらされる。 | |
86 | + // labelはjitc0()内で初期化される。 | |
87 | + i = jitc0(&sysjit, sysjit00 + SJITSIZ1, syslib + 32, syslib + SYSLIBSIZ1, JITC_LV_FASTEST, label); | |
70 | 88 | if (i != 0) { |
71 | 89 | fputs("syslib-file JITC error.¥n", stderr); |
72 | 90 | return 1; |
73 | 91 | } |
92 | + | |
93 | + // エラー時にデバッグ用に表示する変数を加算 | |
74 | 94 | di1_serial++; |
75 | 95 | |
76 | 96 | /* アプリバイナリの読み込み */ |
@@ -138,7 +158,7 @@ int osecpuMain(int argc, char **argv) | ||
138 | 158 | regs.preg[0x0b].p = (void *)pxxFlag; |
139 | 159 | regs.preg[0x0c].p = (void *)typLabel; |
140 | 160 | regs.preg[0x0d].p = opTbl; |
141 | - jitfunc = (void *)sysjit0; | |
161 | + jitfunc = (void *)sysjit; | |
142 | 162 | (*jitfunc)(((char *)®s) + 128); /* サイズを節約するためにEBPを128バイトずらす */ |
143 | 163 | if (regs.ireg[0] != 0) { |
144 | 164 | jp = regs.preg[2].p - 1; |
@@ -3,6 +3,10 @@ | ||
3 | 3 | |
4 | 4 | // プロジェクトのすべてのファイルで読み込むヘッダ |
5 | 5 | |
6 | + | |
7 | +/* Visual Studio で fopen()やsprintf() などの古い関数を使用する時に出る警告を抑止する*/ | |
8 | +#define _CRT_SECURE_NO_WARNINGS 1 | |
9 | + | |
6 | 10 | #include <stdio.h> |
7 | 11 | #include <string.h> |
8 | 12 | #include <limits.h> |
@@ -69,6 +73,8 @@ struct Regs { | ||
69 | 73 | |
70 | 74 | static int *keybuf, keybuf_r, keybuf_w, keybuf_c; |
71 | 75 | static int *vram = NULL, v_xsiz, v_ysiz; |
76 | + | |
77 | +//デバッグ用。プログラム中の随所で加算される変数 | |
72 | 78 | static int di1_serial = 0; |
73 | 79 | |
74 | 80 | // main.c |
@@ -5,7 +5,6 @@ | ||
5 | 5 | * このファイルを編集することでコンパイルの仕方を変更できます |
6 | 6 | */ |
7 | 7 | |
8 | - | |
9 | 8 | /* |
10 | 9 | * CPUのアーキテクチャ |
11 | 10 | * 1 : i386 |