• R/O
  • HTTP
  • SSH
  • HTTPS

HeavyOSECPU: Commit


Commit MetaInfo

Revisión4d5d6fa61ff576ba035ee4bd882e8476f2ceeb2b (tree)
Tiempo2014-03-16 21:04:29
Autorhikarupsp <hikarupsp@user...>
Commiterhikarupsp

Log Message

アライメントエラーはポインタレジスタ構造体をコピーする際のmovdqaのせいだと判明。
応急処置をして、Macでも動作するようになった。

Cambiar Resumen

Diferencia incremental

--- a/jitc.c
+++ b/jitc.c
@@ -1,69 +1,82 @@
1-#include "osecpu.h"
2-#include "jitc.h"
3-
4-//
5-// JITC common functions (architecture not dependent)
6-//
7-
8-void errorHandler(HOSECPU_RuntimeEnvironment *r)
9-{
10- puts("security error! abort...");
11- printf("debugInfo0=%d, debugInfo1=%d\n", r->debugInfo0, r->debugInfo1);
12-#if (USE_DEBUGGER != 0)
13- dbgrMain(r);
14-#endif
15- exit(1);
16-}
17-
18-int jitCompCmdLen(const unsigned char *src)
19-{
20- //BCode命令長を取得する
21- int i = 1;
22-
23- if (0x01 <= *src && *src < 0x04){
24- // LB, LIMM, PLIMM
25- i = 6;
26- } else if (*src == 0x04){
27- // CND
28- i = 2;
29- } else if (0x08 <= *src && *src < 0x0d){
30- // LMEM, SMEM, ??, ??, ??
31- i = 8 + src[7] * 4;
32- } else if (0x0e <= *src && *src < 0x10){
33- // PADD, PDIF
34- i = 8;
35- } else if (0x10 <= *src && *src < 0x1c){
36- // CP/OR, XOR, AND, ADD, SUB, MUL, SHL, SAR, DIV, MOD,
37- i = 4;
38- } else if (0x1c <= *src && *src < 0x1f){
39- // ??, ??, PCP
40- i = 3;
41- } else if (*src == 0x1f){
42- // ??
43- i = 11;
44- } else if(0x20 <= *src && *src < 0x2e){
45- // CMPE, CMPNE, CMPL, CMPGE, CMPLE, CMPG, TSTZ, TSTNZ,
46- // PCMPE, PCMPNE, PCMPL, PCMPGE, PCMPLE, PCMPG,
47- i = 4;
48- } else if (*src == 0x2f){
49- // ??
50- i = 4 + src[1];
51- } else if (0x30 <= *src && *src < 0x34){
52- // ??, ??, MALLOC, ??
53- i = 4;
54- } else if (0x3c <= *src && *src < 0x3e){
55- // ??, ??
56- i = 7;
57- } else if (*src == 0xfe){
58- // REMARK
59- i = 2 + src[1];
60- }
61-
62- return i;
63-}
64-
65-
66-
67-
68-
69-
1+#include "osecpu.h"
2+#include "jitc.h"
3+
4+//
5+// JITC common functions (architecture not dependent)
6+//
7+
8+void errorHandler(HOSECPU_RuntimeEnvironment *r)
9+{
10+ puts("security error! abort...");
11+ printf("debugInfo0=%d, debugInfo1=%d\n", r->debugInfo0, r->debugInfo1);
12+#if (USE_DEBUGGER != 0)
13+ dbgrMain(r);
14+#endif
15+ exit(1);
16+}
17+
18+int jitCompCmdLen(const unsigned char *src)
19+{
20+ //BCode命令長を取得する
21+ int i = 1;
22+
23+ if (0x01 <= *src && *src < 0x04){
24+ // LB, LIMM, PLIMM
25+ i = 6;
26+ } else if (*src == 0x04){
27+ // CND
28+ i = 2;
29+ } else if (0x08 <= *src && *src < 0x0d){
30+ // LMEM, SMEM, ??, ??, ??
31+ i = 8 + src[7] * 4;
32+ } else if (0x0e <= *src && *src < 0x10){
33+ // PADD, PDIF
34+ i = 8;
35+ } else if (0x10 <= *src && *src < 0x1c){
36+ // CP/OR, XOR, AND, ADD, SUB, MUL, SHL, SAR, DIV, MOD,
37+ i = 4;
38+ } else if (0x1c <= *src && *src < 0x1f){
39+ // ??, ??, PCP
40+ i = 3;
41+ } else if (*src == 0x1f){
42+ // ??
43+ i = 11;
44+ } else if(0x20 <= *src && *src < 0x2e){
45+ // CMPE, CMPNE, CMPL, CMPGE, CMPLE, CMPG, TSTZ, TSTNZ,
46+ // PCMPE, PCMPNE, PCMPL, PCMPGE, PCMPLE, PCMPG,
47+ i = 4;
48+ } else if (*src == 0x2f){
49+ // ??
50+ i = 4 + src[1];
51+ } else if (0x30 <= *src && *src < 0x34){
52+ // ??, ??, MALLOC, ??
53+ i = 4;
54+ } else if (0x3c <= *src && *src < 0x3e){
55+ // ??, ??
56+ i = 7;
57+ } else if (*src == 0xfe){
58+ // REMARK
59+ i = 2 + src[1];
60+ }
61+
62+ return i;
63+}
64+
65+void PRegCopy(HOSECPU_PointerRegisterEntry *dst, HOSECPU_PointerRegisterEntry *src)
66+{
67+ // なんか直接代入するとMacではアライメントエラーで落ちるのです...
68+ // dst = src;
69+
70+ dst->p = src->p;
71+ dst->typ = src->typ;
72+ dst->p0 = src->p0;
73+ dst->p1 = src->p1;
74+ dst->liveSign = src->liveSign;
75+ dst->pls = src->pls;
76+ dst->flags = src->flags;
77+ dst->dummy = src->dummy;
78+}
79+
80+
81+
82+
--- a/jitc.h
+++ b/jitc.h
@@ -59,10 +59,11 @@ int jitCompCmdLen(const unsigned char *src);
5959 //
6060 #define IA32_OP_RM32_MOD00_ADDR_DISP32 5
6161 //
62-#define envOffset_DBGINFO0 (2304 + 0)
63-#define envOffset_DBGINFO1 (2304 + 4)
64-#define envOffset_PTRCTRL (2320)
65-#define PRegOffset(regid) (256 + 32 * regid)
62+#define envOffset_DBGINFO0 (2304 + 0)
63+#define envOffset_DBGINFO1 (2304 + 4)
64+#define envOffset_DBGCURRENTCODE (2304 + 8)
65+#define envOffset_PTRCTRL (2320)
66+#define PRegOffset(regid) (256 + 32 * regid)
6667 //
6768 #define jitCompPutImm32(p, i) jitCompPutByte4(p, ((i) & 0xff), (((i) >> 8) & 0xff), (((i) >> 16) & 0xff), (((i) >> 24) & 0xff))
6869 //
@@ -77,9 +78,11 @@ int jitCompCmdLen(const unsigned char *src);
7778 #define jitCompPutOp_CALL_Relative(p, diff) jitCompPutByte1(p, 0xe8); jitCompPutImm32(p, diff); /*次の命令との相対オフセットだけ相対コールする*/
7879 #define jitCompPutOp_JMPnear(p, diff) jitCompPutByte1(p, 0xe9); jitCompPutImm32(p, diff); /*次の命令との相対オフセットだけ相対ジャンプする*/
7980 #define jitCompPutOp_JMPshort(p, diff) jitCompPutByte2(p, 0xeb, diff & 0xff);/*次の命令との相対オフセットだけ相対ジャンプする*/
81+#define jitCompPutOp_INT3(p) jitCompPutByte1(p, 0xCC);
8082 //
8183 #define jitCompPutOp_MOV_EAX_ZERO(p) jitCompPutOp_XOR_GReg_GReg(p, IA32_REG0_EAX, IA32_REG0_EAX);
82-
84+//
85+#define DEBUGCode(work, code) jitCompPutOp_MOV_GReg_Imm32((work)->dst, IA32_REG0_EAX, code); jitCompPutOp_MOV_EBPDisp_GReg(work, envOffset_DBGCURRENTCODE, IA32_REG0_EAX);
8386 // Optimization settings
8487 // 他のCPUへ移植する人へ:
8588 // 以下の定数は最適化のためのものなので、すべて0として簡単に移植しても問題ありません
--- a/jitcx86.c
+++ b/jitcx86.c
@@ -54,6 +54,9 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr
5454 timecount -= 64;
5555 /* 未完成(timeoutチェックコードを入れる) */
5656 }
57+ if(*src != 0x00 && *src != 0x01 && *src != 0x34){
58+ DEBUGCode(&w, *src);
59+ }
5760 prefix_continue:
5861 // CND命令コンパイル後ここに戻る
5962 switch (*src) {
@@ -72,45 +75,52 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr
7275 // ・timecount++し、timecountのチェックをする。
7376 // ・ラベル位置を登録する。
7477 // ・割り込みがある場合、このタイミングで割り込みを発生させる。
78+ // Encode:
79+ // 0 1 2345
80+ // 01 opt imm32
7581 //
76- // 1 2 3 456
77- // LB 01 opt imm32
78- //
79- if (enter0 == NULL && (src[6] == 0x3c /* 多数のレジスタをスタックに退避 */ || (src[6] == 0xfe/* REMARK */ && src[7] == 0x01 && src[9] == 0x3c))) { //beginFunc()中のLB
82+ if (enter0 == NULL && (src[6] == 0x3c /* 多数のレジスタをスタックに退避 */ || (src[6] == 0xfe/* REMARK */ && src[7] == 0x01 && src[9] == 0x3c))) {
83+ //beginFunc()中のLB
8084 // LB命令の後に0x3C命令・・・beginFunc()
81- enter0 = w.dst + 1;
85+ enter0 = w.dst;
8286 jitCompPutOp_JMPnear(w.dst, 0);
8387 }
88+
8489 if (src[6] == 0x34) {
85- // LBの次の命令がDATA ・・・DAT_SA0(label, typ32, length) ・・・メモリ確保命令
86- tmp_ucp = w.dst;
87- i = jitCompGetImm32(&src[7]); // type32 を取得
90+ // 後続命令はDATA
91+ // なので、DATA部分をJMPですっとばすコードを生成
92+ // DAT_SA0(label, typ32, length) ・・・メモリ確保命令
93+
94+ i = jitCompGetImm32(&src[6 + 1]); // type32 を取得
8895 j = 32;
96+
8997 if (i != 1) {
9098 i = jitCompA000_convTyp(i);
9199 j = 0;
92- switch (i) {
93- case 2:
94- case 3:
100+ switch (i >> 1) {
101+ case 1:
95102 j = 1;
96103 break;
97- case 4:
98- case 5:
104+ case 2:
99105 j = 2;
100106 break;
101- case 6:
102- case 7:
107+ case 3:
103108 j = 4;
104109 break;
105110 }
106111 }
107- j *= jitCompGetImm32(&src[11]);
112+ // jはデータサイズになる
113+ j *= jitCompGetImm32(&src[6 + 5]); // len32
108114 if (j <= 0){
109115 w.err = JITC_ERR_BADTYPE;
110116 }
117+ // DATA部分を飛び越すジャンプ
118+ tmp_ucp = w.dst;
111119 jitCompPutOp_JMPnear(w.dst, j);
120+
112121 #if (jitCompA0001_OPTIMIZE_JMP != 0)
113- if (j <= 127 - jitCompA0001_OPTIMIZE_ALIGN) {
122+ if (j < 127 - jitCompA0001_OPTIMIZE_ALIGN) {
123+ //飛び先が十分近いので
114124 // 今書いたのはなかったことにして、
115125 w.dst -= 5;
116126 // よりサイズの小さな書き方にする
@@ -120,25 +130,23 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr
120130 }
121131 #if (jitCompA0001_OPTIMIZE_ALIGN != 0)
122132 // アラインを jitCompA0001_OPTIMIZE_ALIGNにそろえる
123- for (;;) {
124- i = ((int)w.dst) & (jitCompA0001_OPTIMIZE_ALIGN - 1); /* ALIGNで割ったあまりを計算 */
125- if (i == 0){
126- // Already alligned.
127- break;
128- }
129- i = jitCompA0001_OPTIMIZE_ALIGN - i;
130- if (i == 1) { jitCompPutByte1(w.dst, 0x90); j += i; } /* NOP(); */
131- if (i == 2) { jitCompPutByte2(w.dst, 0x89, 0xc0); j += i; } /* MOV(EAX, EAX); */
132- if (i == 3) { jitCompPutByte3(w.dst, 0x8d, 0x76, 0x00); j += i; } /* LEA(ESI, [ESI+0]); */
133- if (i == 4) { jitCompPutByte4(w.dst, 0x8d, 0x74, 0x26, 0x00); j += i; } /* LEA(ESI, [ESI*1+0]); */
134- if (i == 5) { jitCompPutByte1(w.dst, 0x0d); jitCompPutImm32(w.dst, 0); j += i; } /* OR(EAX, 0); */
135- if (i == 6) { jitCompPutByte2(w.dst, 0x8d, 0xb6); jitCompPutImm32(w.dst, 0); j += i; } /* LEA(ESI, [ESI+0]); */
136- if (i >= 7) { jitCompPutByte3(w.dst, 0x8d, 0xb4, 0x26); jitCompPutImm32(w.dst, 0); j += 7; } /* LEA(ESI, [ESI*1+0]); */
137- }
133+
134+ i = ((int)w.dst + 1) & (jitCompA0001_OPTIMIZE_ALIGN - 1); /* ALIGNで割ったあまりを計算 */
135+ i = jitCompA0001_OPTIMIZE_ALIGN - i;
136+ if (i == 1) { jitCompPutByte1(w.dst, 0x90); j += i; } /* NOP(); */
137+ if (i == 2) { jitCompPutByte2(w.dst, 0x89, 0xc0); j += i; } /* MOV(EAX, EAX); */
138+ if (i == 3) { jitCompPutByte3(w.dst, 0x8d, 0x76, 0x00); j += i; } /* LEA(ESI, [ESI+0]); */
139+ if (i == 4) { jitCompPutByte4(w.dst, 0x8d, 0x74, 0x26, 0x00); j += i; } /* LEA(ESI, [ESI*1+0]); */
140+ if (i == 5) { jitCompPutByte1(w.dst, 0x0d); jitCompPutImm32(w.dst, 0); j += i; } /* OR(EAX, 0); */
141+ if (i == 6) { jitCompPutByte2(w.dst, 0x8d, 0xb6); jitCompPutImm32(w.dst, 0); j += i; } /* LEA(ESI, [ESI+0]); */
142+ if (i == 7) { jitCompPutByte3(w.dst, 0x8d, 0xb4, 0x26); jitCompPutImm32(w.dst, 0); j += 7; } /* LEA(ESI, [ESI*1+0]); */
138143 #endif
139144 if (src[6] == 0x34) {
145+ // 後続命令はDATA
146+ // パディングに合わせて一個前の相対ジャンプを修正
140147 tmp_ucp[1] = j & 0xff;
141148 if (*tmp_ucp == 0xe9) {
149+ // Near jump so imm is DWORD
142150 tmp_ucp[2] = (j >> 8) & 0xff;
143151 tmp_ucp[3] = (j >> 16) & 0xff;
144152 tmp_ucp[4] = (j >> 24) & 0xff;
@@ -167,7 +175,8 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr
167175
168176 case 0x02:
169177 // LIMM : 定数即値代入命令(6byte)
170- // 1 2 3456
178+ // Encode:
179+ // 0 1 2345
171180 // 02 reg0R imm32
172181 //
173182 // reg3F は条件比較慣用句指定用&演算命令即値慣用句指定用。よってCND命令の直後では使用できない。
@@ -209,8 +218,8 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr
209218
210219 case 0x03: /* 未完成(plsまで対応) */
211220 // PLIMM : ラベル番号代入命令(6byte)
212- //
213- // 1 2 3456
221+ // Encode:
222+ // 0 1 2345
214223 // 03 PXX imm32
215224 //
216225 // ・P28 はAPI用
@@ -305,7 +314,7 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr
305314 case 0x04:
306315 // CND (prefix)
307316 // 与えられたRxxの最下位ビットが1であれば後続の命令を実行、そうでなければ飛ばす。
308- //
317+
309318 if (src[1] >= 0x40){
310319 // R00-R3F 以外のレジスタは比較対象にできない
311320 w.err = JITC_ERR_REGNUM;
@@ -1181,13 +1190,21 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr
11811190 break;
11821191
11831192 case 0x34: /* data (暫定) */
1193+ // 0 1234 5678 9
1194+ // 34 typ32 len32 data...
1195+ // len32 is NOT byte size!
1196+
11841197 cmp0reg = -1;
11851198 if (w.prefix != 0) {
11861199 w.err = JITC_ERR_PREFIX;
11871200 goto err_w;
11881201 }
1189- int k = jitCompGetImm32(&src[1]), tmpData, bitCount, dataWidth = jitCompA000_dataWidth(k);
1202+ int k, tmpData, bitCount, dataWidth;
1203+ // kはtyp32
1204+ k = jitCompGetImm32(&src[1]);
1205+ dataWidth = jitCompA000_dataWidth(k);
11901206 if (lastlabel >= 0 && label[lastlabel].typ == 0){
1207+ //直前のラベルタイプを設定
11911208 label[lastlabel].typ = k;
11921209 }
11931210 if (k != 1) {
@@ -1197,24 +1214,31 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr
11971214 goto err_w;
11981215 }
11991216 }
1217+ // jはlen32
12001218 j = jitCompGetImm32(&src[5]);
12011219 oldsrc = src;
12021220 src += 9;
1221+
1222+ // srcはdata本体を指す
12031223 if (k != 1) {
1224+ // 一般データ
12041225 bitCount = 7;
12051226 while (j > 0) {
12061227 if (src >= src1) {
1228+ // バイトコードを末端を超えて読もうとした
12071229 w.err = JITC_ERR_SRC1;
12081230 src = oldsrc;
12091231 goto err_w;
12101232 }
12111233 if (w.dst + 256 > dst1) {
1234+ // 書き込み先の残り容量が256Bytesを切った
12121235 w.err = JITC_ERR_DST1;
12131236 src = oldsrc;
12141237 goto err_w;
12151238 }
12161239 tmpData = 0;
12171240 for (k = 0; k < dataWidth; k++) {
1241+ // dataWidthビットごとに切り出してtmpDataに入れる
12181242 tmpData = tmpData << 1 | ((*src >> bitCount) & 1);
12191243 bitCount--;
12201244 if (bitCount < 0) {
@@ -1223,27 +1247,34 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr
12231247 }
12241248 }
12251249 if ((i & 1) == 0 && dataWidth <= 31 && (tmpData >> (dataWidth - 1)) != 0) {
1250+ // 符号あり型で、かつtmpDataの符号ビットが1なので、マイナスにする
12261251 tmpData -= 1 << dataWidth;
12271252 }
12281253 if (i == 2 || i == 3) {
1254+ // BYTE
12291255 jitCompPutByte1(w.dst, tmpData & 0xff);
12301256 }
12311257 if (i == 4 || i == 5) {
1258+ // WORD
12321259 jitCompPutByte2(w.dst, tmpData & 0xff, (tmpData >> 8) & 0xff);
12331260 }
12341261 if (i == 6 || i == 7) {
1262+ // DWORD
12351263 jitCompPutByte4(w.dst, tmpData & 0xff, (tmpData >> 8) & 0xff, (tmpData >> 16) & 0xff, (tmpData >> 24) & 0xff);
12361264 }
12371265 j--;
12381266 }
12391267 } else{
1268+ // VPtr型
12401269 while (j > 0) {
12411270 if (src >= src1) {
1271+ // バイトコードを末端を超えて読もうとした
12421272 w.err = JITC_ERR_SRC1;
12431273 src = oldsrc;
12441274 goto err_w;
12451275 }
12461276 if (w.dst + 256 > dst1) {
1277+ // 書き込み先の残り容量が256Bytesを切った
12471278 w.err = JITC_ERR_DST1;
12481279 src = oldsrc;
12491280 goto err_w;
@@ -1251,7 +1282,9 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr
12511282 i = jitCompGetImm32(src);
12521283 src += 4;
12531284 if ((flags & JITC_PHASE1) != 0 && w.err == 0) {
1285+ // Only in phase1
12541286 if (label[i].opt == 0) {
1287+ // ローカルラベルはだめです...
12551288 w.err = JITC_ERR_LABELNODEF;
12561289 goto err_w;
12571290 }
@@ -1346,6 +1379,11 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr
13461379 if (w.err != 0) {
13471380 goto err_w;
13481381 }
1382+
1383+ if(*src != 0x00 && *src != 0x01 && *src != 0x34){
1384+ DEBUGCode(&w, 315315);
1385+ }
1386+
13491387 src += jitCompCmdLen(src);
13501388 }
13511389 if (enter0 != NULL) {
@@ -1457,11 +1495,15 @@ void func3c(char *ebp, int opt, int r1, int p1, int lenR, int lenP, int r0, int
14571495 pp = (void *)r->junkStack;
14581496 r->junkStack += p1 * 32;
14591497 for (i = 0; i < p1; i++){
1460- pp[i] = r->preg[i];
1498+ //pp[i] = r->preg[i];
1499+ PRegCopy(&pp[i], &r->preg[i]);
1500+ //
14611501 }
14621502 pp = (void *)r->junkStack;
14631503 r->junkStack += 32;
1464- *pp = r->preg[0x30];
1504+ //*pp = r->preg[0x30];
1505+ PRegCopy(pp, &r->preg[0x30]);
1506+ //
14651507 pi = (void *)r->junkStack;
14661508 r->junkStack += 4;
14671509 *pi = opt << 16 | r1 << 8 | p1;
@@ -1481,13 +1523,20 @@ void func3d(char *ebp, int opt, int r1, int p1, int lenR, int lenP, int r0, int
14811523 r->junkStack -= 4;
14821524 r->junkStack -= 32;
14831525 HOSECPU_PointerRegisterEntry *pp = (void *)r->junkStack;
1484- r->preg[0x30] = *pp;
1526+
1527+ //r->preg[0x30] = *pp;
1528+ PRegCopy(&r->preg[0x30], pp);
1529+ //
14851530 r->junkStack -= p1 * 32; pp = (void *)r->junkStack;
1486- for (i = 0; i < p1; i++)
1487- r->preg[i] = pp[i];
1531+ for (i = 0; i < p1; i++){
1532+ //r->preg[i] = pp[i];
1533+ PRegCopy(&r->preg[i], &pp[i]);
1534+ //
1535+ }
14881536 r->junkStack -= r1 * 4; int *pi = (void *)r->junkStack;
1489- for (i = 0; i < r1; i++)
1537+ for (i = 0; i < r1; i++){
14901538 r->ireg[i] = pi[i];
1539+ }
14911540 return;
14921541 }
14931542
--- a/jitcx86a.c
+++ b/jitcx86a.c
@@ -197,9 +197,17 @@ int jitCompA000_selectPRegCache(int pxx, int reg)
197197
198198 int jitCompA000_convTyp(int t)
199199 {
200+ // 指定されたタイプのデータ幅を返す。
201+ // unsigned なら奇数(1bit目がOn)
202+ // retv = 1 : VPtr
203+ // retv = 2 or 3: BYTE ( 8, 4, 2, 1 bit)
204+ // retv = 4 or 5: WORD (16, 12 bit)
205+ // retv = 6 or 7: DWORD(32, 20, 24, 28 bit)
206+ // -1はエラー
200207 int r = -1;
201208
202209 if (1 <= t && t <= 7){
210+ // 1 - 7はそのままでOK
203211 r = t;
204212 } else if (8 <= t && t <= 13){
205213 r = 2 | (t & 1);
@@ -213,6 +221,7 @@ int jitCompA000_convTyp(int t)
213221
214222 int jitCompA000_dataWidth(int t)
215223 {
224+ // 指定されたタイプのビット数を返す
216225 int r = -1;
217226 if (t == 0x0001) r = 256;
218227 t >>= 1;
--- a/main.c
+++ b/main.c
@@ -4,6 +4,7 @@ int *keybuf, keybuf_r, keybuf_w, keybuf_c;
44 HOSECPU_Device_Window mainWindow;
55 //デバッグ用。プログラム中の随所で加算される変数
66 int di1_serial;
7+HOSECPU_RuntimeEnvironment *dbg_env;
78
89
910
@@ -22,6 +23,7 @@ void putKeybuf(int i)
2223
2324 int HeavyOSECPUMain(int argc, char **argv)
2425 {
26+ HOSECPU_RuntimeEnvironment env;
2527 FILE *fp;
2628 unsigned char *jitbuf, *sysjit00, *sysjit;
2729 unsigned char *systmp0, *systmp1, *systmp2;
@@ -33,25 +35,26 @@ int HeavyOSECPUMain(int argc, char **argv)
3335 unsigned char *syslib;
3436 int argDebug = 0, stacksiz = 1;
3537 const char *cp;
36- HOSECPU_RuntimeEnvironment env;
3738 void(*jitfunc)(char *);
3839 unsigned char *jp;
3940
40- //Initialize mainWindow
41+ // For debug
42+ dbg_env = &env;
43+
44+ // Initialize mainWindow
4145 mainWindow.vram = NULL;
4246 mainWindow.xsize = 0;
4347 mainWindow.ysize = 0;
4448 di1_serial = 0;
4549
46- //実行環境初期化
50+ // 実行環境初期化
4751 env.mainArgc = argc;
4852 env.mainArgv = (const char **)argv;
4953 env.appBin = malloc(APPSIZ1);
5054 env.executionLevel = JITC_LV_SLOWEST;
51- jitbuf = mallocRWE(1024 * 1024); /* とりあえず1MBで */
52- //unsigned char *sysjit0 = mallocRWE(SJITSIZ1), *sysjit1 = sysjit0, *sysjit00 = sysjit0;
55+ jitbuf = mallocRWE(APPJITSIZE); /* とりあえず1MBで */
5356 // syslib.oseのjitc結果を格納する領域を確保。
54- sysjit00 = mallocRWE(SJITSIZ1);
57+ sysjit00 = mallocRWE(SYSJITSIZ1);
5558 sysjit = sysjit00;
5659 // 現在の、jitc結果を格納するメモリへの書き込み位置のアドレス
5760 // sysjit: 現在のjitc書き込み位置
@@ -80,7 +83,7 @@ int HeavyOSECPUMain(int argc, char **argv)
8083 sysjit = jitCompInit(sysjit);
8184 sysjit00 = sysjit;
8285 // labelはjitc0()内で初期化される。
83- i = jitc0(&sysjit, sysjit00 + SJITSIZ1, syslib + 32, syslib + SYSLIBSIZ1, JITC_LV_SLOWEST+9, label);
86+ i = jitc0(&sysjit, sysjit00 + SYSJITSIZ1, syslib + 32, syslib + SYSLIBSIZ1, JITC_LV_SLOWEST+9, label);
8487 if (i != 0){
8588 fputs("syslib-file JITC error.\n", stderr);
8689 return 1;
--- a/osecpu.h
+++ b/osecpu.h
@@ -67,8 +67,8 @@
6767 #define PTRCTRLSIZ 4096
6868
6969 #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 */
70+#define APPJITSIZE 1 * 1024 * 1024 /* 1MB for now */
71+#define SYSJITSIZ1 2 * 1024 * 1024 /* 1MB for now */
7272 #define SYSLIBSIZ1 1 * 1024 * 1024 /* 1MB for now */
7373 #define SYSTMP0SIZ 1 * 1024 * 1024 /* 1MB for now */
7474 #define SYSTMP1SIZ 2 * 1024 * 1024 /* 1MB for now */
@@ -138,7 +138,8 @@ struct Regs {
138138 //
139139 int debugInfo0; // 2304
140140 int debugInfo1; // 2308
141- int dmy[2]; // 2312, 2316
141+ int dbg_currentCode; // 2312
142+ int dmy; // 2316
142143 //
143144 HOSECPU_PointerControlTag *ptrCtrl; // 2320
144145 char winClosed, autoSleep;
@@ -197,7 +198,7 @@ void devFunc(HOSECPU_RuntimeEnvironment *r); // junkApiを処理する関数
197198
198199 // @jitc.c
199200 void errorHandler(HOSECPU_RuntimeEnvironment *r);
200-
201+void PRegCopy(HOSECPU_PointerRegisterEntry *dst, HOSECPU_PointerRegisterEntry *src);
201202 // @jitcx86.c
202203 int jitc0(unsigned char **qq, unsigned char *q1, const unsigned char *p0, const unsigned char *p1, int level, HOSECPU_LabelListTag *label);
203204 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);
Show on old repository browser