#if (ENABLE_DEBUG_CODE != 0)\r
printf("Last opcode may be 0x%02X (Backend).\n", r->dbg_currentCode);\r
#endif\r
+ \r
+#if (ENABLE_DEBUG_CODE_ADDR != 0)\r
+ printf("At backend code bin +0x%04X.\n", r->dbg_currentCodeAddress);\r
+#endif\r
+ \r
#if (USE_DEBUGGER != 0)\r
dbgrMain(r);\r
#endif\r
-
-#ifndef HeavyOSECPU_jitc_h
-#define HeavyOSECPU_jitc_h
-
-
-
-// Error flags
-#define JITC_ERR_MASK 255
-#define JITC_ERR_PHASE0ONLY 256
-#define JITC_ERR_REGNUM (1 | JITC_ERR_PHASE0ONLY)
-#define JITC_ERR_DST1 (2 | JITC_ERR_PHASE0ONLY)
-#define JITC_ERR_OPECODE (3 | JITC_ERR_PHASE0ONLY)
-#define JITC_ERR_LABELNUM (4 | JITC_ERR_PHASE0ONLY)
-#define JITC_ERR_LABELREDEF (5 | JITC_ERR_PHASE0ONLY)
-#define JITC_ERR_PREFIX (6 | JITC_ERR_PHASE0ONLY)
-#define JITC_ERR_LABELNODEF 7
-#define JITC_ERR_LABELTYP 8
-#define JITC_ERR_IDIOM 9
-#define JITC_ERR_PREGNUM (10 | JITC_ERR_PHASE0ONLY)
-#define JITC_ERR_SRC1 (11 | JITC_ERR_PHASE0ONLY)
-#define JITC_ERR_BADTYPE (12 | JITC_ERR_PHASE0ONLY)
-#define JITC_ERR_PREFIXFAR (13 | JITC_ERR_PHASE0ONLY)
-#define JITC_ERR_INTERNAL 99
-
-// Byte operations
-#define jitCompPutByte1(p, c0) *p++ = c0
-#define jitCompPutByte2(p, c0, c1) *p++ = c0; *p++ = c1
-#define jitCompPutByte3(p, c0, c1, c2) *p++ = c0; *p++ = c1; *p++ = c2
-#define jitCompPutByte4(p, c0, c1, c2, c3) *p++ = c0; *p++ = c1; *p++ = c2; *p++ = c3
-
-//
-// functions (jitc internal)
-//
-
-// @jitc.c
-void errorHandler(HOSECPU_RuntimeEnvironment *r);
-int jitCompCmdLen(const unsigned char *src);
-
-// @jitcx86.c
-#if (JITC_ARCNUM == 0x0001)
-//
-// for x86-32bit
-//
-#define IA32_REG0_EAX 0
-#define IA32_REG1_ECX 1
-#define IA32_REG2_EDX 2
-#define IA32_REG3_EBX 3
-#define IA32_REG4_ESP 4
-#define IA32_REG5_EBP 5
-#define IA32_REG6_ESI 6
-#define IA32_REG7_EDI 7
-//
-#define IA32_MOD_R_M(mod, reg, rm) ((mod << 6) | reg << 3 | rm)
-//
-#define IA32_OP_MOD_INDEXONLY 0
-#define IA32_OP_MOD_INDEX_AND_DISP_BYTE 1
-#define IA32_OP_MOD_INDEX_AND_DISP_FULL 2
-#define IA32_OP_MOD_REGISTER 3
-//
-#define IA32_OP_RM32_MOD00_ADDR_DISP32 5
-//
-#define envOffset_DBGINFO0 (2304 + 0)
-#define envOffset_DBGINFO1 (2304 + 4)
-#define envOffset_DBGCURRENTCODE (2304 + 8)
-#define envOffset_PTRCTRL (2320)
-#define PRegOffset(regid) (256 + 32 * regid)
-//
-#define jitCompPutImm32(p, i) jitCompPutByte4(p, ((i) & 0xff), (((i) >> 8) & 0xff), (((i) >> 16) & 0xff), (((i) >> 24) & 0xff))
-//
-#define jitCompPutOp_ADD_GReg_Imm8(p, dReg, i) jitCompPutByte3(p, 0x83, 0xc0 | dReg, i); /* ADD(reg0, imm8); == [1000 0011] [11000 reg] imm8 */
-#define jitCompPutOp_XOR_GReg_GReg(p, d, s) jitCompPutByte2(w.dst, 0x31, 0xc0 | (s) << 3 | (d));
-#define jitCompPutOp_MOV_GReg_Imm32(p, dReg, i) jitCompPutByte1(p, 0xb8 | dReg); jitCompPutImm32(p, i); /* MOV(reg0, imm32); == [1011 1 reg] imm32 */
-#define jitCompPutOp_PUSHAD(p) jitCompPutByte1(p, 0x60);
-#define jitCompPutOp_POPAD(p) jitCompPutByte1(p, 0x61);
-#define jitCompPutOp_PUSH_GReg(p, reg) jitCompPutByte1(p, 0x50 | (reg));
-#define jitCompPutOp_PUSH_Imm8(p, i) jitCompPutByte2(p, 0x6a, i);
-#define jitCompPutOp_POP_GReg(p, reg) jitCompPutByte1(p, 0x58 | (reg));
-#define jitCompPutOp_CALL_Relative(p, diff) jitCompPutByte1(p, 0xe8); jitCompPutImm32(p, diff); /*次の命令との相対オフセットだけ相対コールする*/
-#define jitCompPutOp_JMPnear(p, diff) jitCompPutByte1(p, 0xe9); jitCompPutImm32(p, diff); /*次の命令との相対オフセットだけ相対ジャンプする*/
-#define jitCompPutOp_JMPshort(p, diff) jitCompPutByte2(p, 0xeb, diff & 0xff);/*次の命令との相対オフセットだけ相対ジャンプする*/
-#define jitCompPutOp_INT3(p) jitCompPutByte1(p, 0xCC);
-//
-#define jitCompPutOp_MOV_EAX_ZERO(p) jitCompPutOp_XOR_GReg_GReg(p, IA32_REG0_EAX, IA32_REG0_EAX);
-//
-#define DEBUGCode(work, code) jitCompPutOp_MOV_GReg_Imm32((work)->dst, IA32_REG0_EAX, code); jitCompPutOp_MOV_EBPDisp_GReg(work, envOffset_DBGCURRENTCODE, IA32_REG0_EAX);
-// Optimization settings
-// 他のCPUへ移植する人へ:
-// 以下の定数は最適化のためのものなので、すべて0として簡単に移植しても問題ありません
-#define jitCompA0001_USE_R3F_CMPJMP 1*1
-#define jitCompA0001_USE_R3F_IMM32 1*1
-#define jitCompA0001_USE_R3F_IMM8 1*1
-#define jitCompA0001_USE_R3F_INCDEC 1*1
-#define jitCompA0001_OPTIMIZE_JMP 1*1
-#define jitCompA0001_OPTIMIZE_MOV 1*1 /* 1にすると速度低下する? */
-#define jitCompA0001_OPTIMIZE_CMP 1*1
-#define jitCompA0001_OPTIMIZE_ALIGN 8 /* 0-8を想定 */
-#define jitCompA0001_EBP128 128 // 0にもできる
-
-struct JitCompWork {
- unsigned char *dst, *dst0;
- int err, maxLabels;
-#if (jitCompA0001_USE_R3F_IMM32 != 0)
- int r3f;
-#endif
- char prefix; //CND命令の値を記録(初期値=0)
-};
-
-// @jitcx86a.c
-int jitCompGetImm32(const unsigned char *src);
-int jitCompGetLabelNum(struct JitCompWork *w, const unsigned char *src);
-void jitCompPutModRM_Disp_BaseEBP(struct JitCompWork *w, int disp, int opReg);
-void jitCompPutOp_MOV_EBPDisp_GReg(struct JitCompWork *w, int disp, int reg32);
-void jitCompPutOp_MOV_GReg_EBPDisp(struct JitCompWork *w, int reg32, int disp);
-void jitCompA0001_movEaxRxx(struct JitCompWork *w, int rxx);
-void jitCompA0001_movRxxEax(struct JitCompWork *w, int rxx);
-void jitCompA0001_fixPrefix(struct JitCompWork *w);
-void jitCompA0001_checkCompPtr(struct JitCompWork *w, int p0, int p1);
-void jitCompA000_loadRegCacheAll(struct JitCompWork *w);
-void jitCompA000_storeRegCacheAll(struct JitCompWork *w);
-void jitCompA000_loadRegCacheEcx(struct JitCompWork *w);
-void jitCompA000_storeRegCacheEcx(struct JitCompWork *w);
-void jitCompA000_loadRegCacheEdx(struct JitCompWork *w);
-void jitCompA000_storeRegCacheEdx(struct JitCompWork *w);
-int jitCompA000_selectRegCache(int rxx, int reg);
-void jitCompA000_loadPRegCacheAll(struct JitCompWork *w);
-void jitCompA000_storePRegCacheAll(struct JitCompWork *w);
-int jitCompA000_selectPRegCache(int pxx, int reg);
-int jitCompA000_convTyp(int t);
-int jitCompA000_dataWidth(int t);
-void jitCompA0001_checkType0(struct JitCompWork *w, int pxx, int typ, int ac);
-void jitCompA0001_checkType(struct JitCompWork *w, int pxx, int typ, int ac);
-void jitCompA0001_checkLimit(struct JitCompWork *w, int reg, int pxx);
-
-// @jitcx86.c
-extern unsigned char *errfnc;
-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 func3c(char *ebp, int opt, int r1, int p1, int lenR, int lenP, int r0, int p0);
-void func3d(char *ebp, int opt, int r1, int p1, int lenR, int lenP, int r0, int p0);
-void funcf4(char *ebp, int pxx, int typ, int len);
-void funcf5(char *ebp, int pxx, int typ, int len);
-void funcf6(char *ebp, int pxx, int typ, int len);
-void funcf7(char *ebp, int pxx, int typ, int len);
-void errHndl(HOSECPU_RuntimeEnvironment *r);
-int jitc0(unsigned char **qq, unsigned char *q1, const unsigned char *p0, const unsigned char *p1, int level, HOSECPU_LabelListTag *label);
-#if (USE_DEBUGGER != 0)
-int dbgrGetRegNum(const char *p);
-void dbgrMain(HOSECPU_RuntimeEnvironment *r);
-#endif
-
-
-
-
-#endif
-
-#endif
+\r
+#ifndef HeavyOSECPU_jitc_h\r
+#define HeavyOSECPU_jitc_h\r
+\r
+\r
+\r
+// Error flags\r
+#define JITC_ERR_MASK 255\r
+#define JITC_ERR_PHASE0ONLY 256\r
+#define JITC_ERR_REGNUM (1 | JITC_ERR_PHASE0ONLY)\r
+#define JITC_ERR_DST1 (2 | JITC_ERR_PHASE0ONLY)\r
+#define JITC_ERR_OPECODE (3 | JITC_ERR_PHASE0ONLY)\r
+#define JITC_ERR_LABELNUM (4 | JITC_ERR_PHASE0ONLY)\r
+#define JITC_ERR_LABELREDEF (5 | JITC_ERR_PHASE0ONLY)\r
+#define JITC_ERR_PREFIX (6 | JITC_ERR_PHASE0ONLY)\r
+#define JITC_ERR_LABELNODEF 7\r
+#define JITC_ERR_LABELTYP 8\r
+#define JITC_ERR_IDIOM 9\r
+#define JITC_ERR_PREGNUM (10 | JITC_ERR_PHASE0ONLY)\r
+#define JITC_ERR_SRC1 (11 | JITC_ERR_PHASE0ONLY)\r
+#define JITC_ERR_BADTYPE (12 | JITC_ERR_PHASE0ONLY)\r
+#define JITC_ERR_PREFIXFAR (13 | JITC_ERR_PHASE0ONLY)\r
+#define JITC_ERR_INTERNAL 99\r
+\r
+// Byte operations\r
+#define jitCompPutByte1(p, c0) *p++ = c0\r
+#define jitCompPutByte2(p, c0, c1) *p++ = c0; *p++ = c1\r
+#define jitCompPutByte3(p, c0, c1, c2) *p++ = c0; *p++ = c1; *p++ = c2\r
+#define jitCompPutByte4(p, c0, c1, c2, c3) *p++ = c0; *p++ = c1; *p++ = c2; *p++ = c3\r
+\r
+//\r
+// functions (jitc internal)\r
+//\r
+\r
+// @jitc.c\r
+void errorHandler(HOSECPU_RuntimeEnvironment *r);\r
+int jitCompCmdLen(const unsigned char *src);\r
+\r
+// @jitcx86.c\r
+#if (JITC_ARCNUM == 0x0001)\r
+//\r
+// for x86-32bit\r
+//\r
+#define IA32_REG0_EAX 0\r
+#define IA32_REG1_ECX 1\r
+#define IA32_REG2_EDX 2\r
+#define IA32_REG3_EBX 3\r
+#define IA32_REG4_ESP 4\r
+#define IA32_REG5_EBP 5\r
+#define IA32_REG6_ESI 6\r
+#define IA32_REG7_EDI 7\r
+//\r
+#define IA32_MOD_R_M(mod, reg, rm) ((mod << 6) | reg << 3 | rm)\r
+//\r
+#define IA32_OP_MOD_INDEXONLY 0\r
+#define IA32_OP_MOD_INDEX_AND_DISP_BYTE 1\r
+#define IA32_OP_MOD_INDEX_AND_DISP_FULL 2\r
+#define IA32_OP_MOD_REGISTER 3\r
+//\r
+#define IA32_OP_RM32_MOD00_ADDR_DISP32 5\r
+//\r
+#define envOffset_DBGINFO0 (2304 + 0)\r
+#define envOffset_DBGINFO1 (2304 + 4)\r
+#define envOffset_DBGCURRENTCODE (2304 + 8)\r
+#define envOffset_DBGCURRENTCODEADDR (2304 + 12)\r
+#define envOffset_PTRCTRL (2320)\r
+#define PRegOffset(regid) (256 + 32 * regid)\r
+//\r
+#define jitCompPutImm32(p, i) jitCompPutByte4(p, ((i) & 0xff), (((i) >> 8) & 0xff), (((i) >> 16) & 0xff), (((i) >> 24) & 0xff))\r
+//\r
+#define jitCompPutOp_ADD_GReg_Imm8(p, dReg, i) jitCompPutByte3(p, 0x83, 0xc0 | dReg, i); /* ADD(reg0, imm8); == [1000 0011] [11000 reg] imm8 */\r
+#define jitCompPutOp_XOR_GReg_GReg(p, d, s) jitCompPutByte2(w.dst, 0x31, 0xc0 | (s) << 3 | (d));\r
+#define jitCompPutOp_MOV_GReg_Imm32(p, dReg, i) jitCompPutByte1(p, 0xb8 | dReg); jitCompPutImm32(p, i); /* MOV(reg0, imm32); == [1011 1 reg] imm32 */\r
+#define jitCompPutOp_PUSHAD(p) jitCompPutByte1(p, 0x60);\r
+#define jitCompPutOp_POPAD(p) jitCompPutByte1(p, 0x61);\r
+#define jitCompPutOp_PUSH_GReg(p, reg) jitCompPutByte1(p, 0x50 | (reg));\r
+#define jitCompPutOp_PUSH_Imm8(p, i) jitCompPutByte2(p, 0x6a, i);\r
+#define jitCompPutOp_POP_GReg(p, reg) jitCompPutByte1(p, 0x58 | (reg));\r
+#define jitCompPutOp_CALL_Relative(p, diff) jitCompPutByte1(p, 0xe8); jitCompPutImm32(p, diff); /*次の命令との相対オフセットだけ相対コールする*/\r
+#define jitCompPutOp_JMPnear(p, diff) jitCompPutByte1(p, 0xe9); jitCompPutImm32(p, diff); /*次の命令との相対オフセットだけ相対ジャンプする*/\r
+#define jitCompPutOp_JMPshort(p, diff) jitCompPutByte2(p, 0xeb, diff & 0xff);/*次の命令との相対オフセットだけ相対ジャンプする*/\r
+#define jitCompPutOp_INT3(p) jitCompPutByte1(p, 0xCC);\r
+//\r
+#define jitCompPutOp_MOV_EAX_ZERO(p) jitCompPutOp_XOR_GReg_GReg(p, IA32_REG0_EAX, IA32_REG0_EAX);\r
+//\r
+#define DEBUGCode(work, code) jitCompPutOp_MOV_GReg_Imm32((work)->dst, IA32_REG0_EAX, code); jitCompPutOp_MOV_EBPDisp_GReg(work, envOffset_DBGCURRENTCODE, IA32_REG0_EAX);\r
+#define DEBUGCodeAddress(work, addr) jitCompPutOp_MOV_GReg_Imm32((work)->dst, IA32_REG0_EAX, addr); jitCompPutOp_MOV_EBPDisp_GReg(work, envOffset_DBGCURRENTCODEADDR, IA32_REG0_EAX);\r
+// Optimization settings\r
+// 他のCPUへ移植する人へ:\r
+// 以下の定数は最適化のためのものなので、すべて0として簡単に移植しても問題ありません\r
+#define jitCompA0001_USE_R3F_CMPJMP 1*1\r
+#define jitCompA0001_USE_R3F_IMM32 1*1\r
+#define jitCompA0001_USE_R3F_IMM8 1*1\r
+#define jitCompA0001_USE_R3F_INCDEC 1*1\r
+#define jitCompA0001_OPTIMIZE_JMP 1*1\r
+#define jitCompA0001_OPTIMIZE_MOV 1*1 /* 1にすると速度低下する? */\r
+#define jitCompA0001_OPTIMIZE_CMP 1*1\r
+#define jitCompA0001_OPTIMIZE_ALIGN 8 /* 0-8を想定 */\r
+#define jitCompA0001_EBP128 128 // 0にもできる\r
+\r
+struct JitCompWork {\r
+ unsigned char *dst, *dst0;\r
+ int err, maxLabels;\r
+#if (jitCompA0001_USE_R3F_IMM32 != 0)\r
+ int r3f;\r
+#endif\r
+ char prefix; //CND命令の値を記録(初期値=0)\r
+};\r
+\r
+// @jitcx86a.c\r
+int jitCompGetImm32(const unsigned char *src);\r
+int jitCompGetLabelNum(struct JitCompWork *w, const unsigned char *src);\r
+void jitCompPutModRM_Disp_BaseEBP(struct JitCompWork *w, int disp, int opReg);\r
+void jitCompPutOp_MOV_EBPDisp_GReg(struct JitCompWork *w, int disp, int reg32);\r
+void jitCompPutOp_MOV_GReg_EBPDisp(struct JitCompWork *w, int reg32, int disp);\r
+void jitCompA0001_movEaxRxx(struct JitCompWork *w, int rxx);\r
+void jitCompA0001_movRxxEax(struct JitCompWork *w, int rxx);\r
+void jitCompA0001_fixPrefix(struct JitCompWork *w);\r
+void jitCompA0001_checkCompPtr(struct JitCompWork *w, int p0, int p1);\r
+void jitCompA000_loadRegCacheAll(struct JitCompWork *w);\r
+void jitCompA000_storeRegCacheAll(struct JitCompWork *w);\r
+void jitCompA000_loadRegCacheEcx(struct JitCompWork *w);\r
+void jitCompA000_storeRegCacheEcx(struct JitCompWork *w);\r
+void jitCompA000_loadRegCacheEdx(struct JitCompWork *w);\r
+void jitCompA000_storeRegCacheEdx(struct JitCompWork *w);\r
+int jitCompA000_selectRegCache(int rxx, int reg);\r
+void jitCompA000_loadPRegCacheAll(struct JitCompWork *w);\r
+void jitCompA000_storePRegCacheAll(struct JitCompWork *w);\r
+int jitCompA000_selectPRegCache(int pxx, int reg);\r
+int jitCompA000_convTyp(int t);\r
+int jitCompA000_dataWidth(int t);\r
+void jitCompA0001_checkType0(struct JitCompWork *w, int pxx, int typ, int ac);\r
+void jitCompA0001_checkType(struct JitCompWork *w, int pxx, int typ, int ac);\r
+void jitCompA0001_checkLimit(struct JitCompWork *w, int reg, int pxx);\r
+\r
+// @jitcx86.c\r
+extern unsigned char *errfnc;\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 func3c(char *ebp, int opt, int r1, int p1, int lenR, int lenP, int r0, int p0);\r
+void func3d(char *ebp, int opt, int r1, int p1, int lenR, int lenP, int r0, int p0);\r
+void funcf4(char *ebp, int pxx, int typ, int len);\r
+void funcf5(char *ebp, int pxx, int typ, int len);\r
+void funcf6(char *ebp, int pxx, int typ, int len);\r
+void funcf7(char *ebp, int pxx, int typ, int len);\r
+void errHndl(HOSECPU_RuntimeEnvironment *r);\r
+int jitc0(unsigned char **qq, unsigned char *q1, const unsigned char *p0, const unsigned char *p1, int level, HOSECPU_LabelListTag *label);\r
+#if (USE_DEBUGGER != 0)\r
+int dbgrGetRegNum(const char *p);\r
+void dbgrMain(HOSECPU_RuntimeEnvironment *r);\r
+#endif\r
+\r
+\r
+\r
+\r
+#endif\r
+\r
+#endif\r
}\r
#if ENABLE_DEBUG_CODE != 0\r
if(*src != 0x00 && *src != 0x01 && *src != 0x34){\r
-\r
DEBUGCode(&w, *src);\r
}\r
#endif\r
+#if ENABLE_DEBUG_CODE != 0\r
+ if(*src != 0x00 && *src != 0x01 && *src != 0x34){\r
+ DEBUGCodeAddress(&w, (unsigned int)(src - src0));\r
+ }\r
+#endif\r
+ if((unsigned int)(src - src0) == 0xEB){\r
+ // 特定のバックエンドコードアドレスにブレークポイントを仕込みたい場合はこうする\r
+ jitCompPutOp_INT3(w.dst);\r
+ }\r
prefix_continue:\r
// CND命令コンパイル後ここに戻る\r
switch (*src) {\r
\r
unsigned char *jitCompInit(unsigned char *dst)\r
{\r
+ // エラーハンドル関数呼び出しコードを先頭に追加し、それをerrfncにする。\r
errfnc = dst;\r
return jitCompCallFunc(dst, &errHndl);\r
}\r
label[i].opt = 0;\r
}\r
\r
- // 以下のjitCompile()呼び出しでは第二引数をq1-2にした方がよいのではないか?\r
- i = jitCompiler(q, q1, p0 + 2, p1, p0, label, JITC_MAXLABELS, level, di1_serial, 0); // ラベルのチェック \r
+ // ラベルのチェック\r
+ i = jitCompiler(q, q1, p0 + 2, p1, p0, label, JITC_MAXLABELS, level, di1_serial, 0);\r
if (i != 0){\r
return 2;\r
}\r
\r
\r
\r
-unsigned char *Init_LoadSysLib(char argv0[], unsigned char *tmpWorkMemory);\r
+unsigned char *Init_LoadSysLib(char argv0[]);\r
void LoadAppBin(HOSECPU_RuntimeEnvironment *env);\r
\r
void putKeybuf(int i)\r
int HeavyOSECPUMain(int argc, char **argv)\r
{\r
HOSECPU_RuntimeEnvironment env;\r
- FILE *fp;\r
- unsigned char *jitbuf, *sysjit00, *sysjit;\r
- unsigned char *systmp0, *systmp1, *systmp2;\r
- unsigned char *opTbl;\r
+ unsigned char *pAppJITBin;\r
+ unsigned char *appBinDevFuncBase;\r
+ unsigned char *pSyslibJITBin;\r
+ unsigned char *syslibJITBinBase;\r
HOSECPU_LabelListTag *label;\r
- int tmpsiz, i;\r
- double tm0, tm1, tm2;\r
HOSECPU_PointerControlTag *ptrCtrl;\r
- unsigned char *syslib;\r
- int argDebug = 0, stacksiz = 1;\r
- const char *cp;\r
- void(*jitfunc)(char *);\r
- unsigned char *jp;\r
+ // For decoder work\r
+ unsigned char *bufP06; // P06 UINT8 >=2M\r
+ unsigned int *bufP0A; // P0A UINT32 16K\r
+ int *pxxFlag; // P0B SINT32 64\r
+ int *typLabel; // P0C SINT32 4K\r
+ unsigned char *opTbl; // P0D UINT8 256\r
+ // For tek decomp\r
+ unsigned char *tekDecompTemp;\r
+ // time counter\r
+ double tm0, tm1, tm2;\r
+ // options from arguments\r
+ int argDebugMode = 0;\r
+ int argStackSize = 1;\r
+ //\r
+ int i;\r
+ const char *s;\r
+ unsigned char *p;\r
+ FILE *fp;\r
+ \r
+ //\r
+ // Initialize\r
+ //\r
\r
// For debug\r
dbg_env = &env;\r
- \r
// Initialize mainWindow\r
mainWindow.vram = NULL;\r
mainWindow.xsize = 0;\r
mainWindow.ysize = 0;\r
- di1_serial = 0;\r
- \r
- // 実行環境初期化\r
+ // Initialize keyInputting\r
+ keybuf = malloc(KEYBUFSIZ * sizeof(int));\r
+ keybuf_r = keybuf_w = keybuf_c = 0;\r
+ // Initialize HOSECPU_RuntimeEnvironment\r
env.mainArgc = argc;\r
env.mainArgv = (const char **)argv;\r
- env.appBin = malloc(APPSIZ1);\r
+ //\r
+ env.appOSECPUBin = malloc(APPBINSIZE);\r
+ env.appOSECPUBackendBin = malloc(APPBINSIZE);\r
+ //\r
+ env.appJITBin = mallocRWE(APPJITSIZE);\r
+ fprintf(stderr, "appJITBin: %p\n", env.appJITBin);\r
+ pAppJITBin = env.appJITBin;\r
+ fprintf(stderr, "pAppJITBin: %p\n", pAppJITBin);\r
+ env.syslibJITBin = mallocRWE(SYSLIBJITSIZE);\r
+ pSyslibJITBin = env.syslibJITBin;\r
+ // syslibJITBin image:\r
+ // env.syslibJITBin + - - - -\r
+ // | errHndl\r
+ // syslibJITBinBase + - - - -\r
+ // | syslib\r
+ //\r
env.executionLevel = JITC_LV_SLOWEST;\r
- jitbuf = mallocRWE(APPJITSIZE); /* とりあえず1MBで */\r
- // syslib.oseのjitc結果を格納する領域を確保。\r
- sysjit00 = mallocRWE(SYSJITSIZ1);\r
- sysjit = sysjit00;\r
- // 現在の、jitc結果を格納するメモリへの書き込み位置のアドレス\r
- // sysjit: 現在のjitc書き込み位置\r
- // sysjit00: jitc結果の先頭\r
- //ワークメモリを三つくらいもらう\r
- systmp0 = malloc(SYSTMP0SIZ); /* syslibのjitc用 */\r
- systmp1 = malloc(SYSTMP1SIZ);\r
- systmp2 = malloc(1024 * 1024);\r
- \r
+ // For decoder work\r
+ bufP06 = malloc(DECODER_BUF06_SIZE);\r
+ bufP0A = malloc(DECODER_BUF0A_SIZE);\r
+ pxxFlag = malloc(64 * 4);\r
+ typLabel = malloc(4096 * 4);\r
opTbl = malloc(256);\r
+ //\r
label = malloc(JITC_MAXLABELS * sizeof (HOSECPU_LabelListTag));\r
- keybuf = malloc(KEYBUFSIZ * sizeof (int));\r
- keybuf_r = keybuf_w = keybuf_c = 0;\r
ptrCtrl = malloc(PTRCTRLSIZ * sizeof (HOSECPU_PointerControlTag));\r
- \r
- randStatInit((unsigned int)time(NULL));\r
for (i = 0; i < PTRCTRLSIZ; i++) {\r
ptrCtrl[i].liveSign = 0;\r
ptrCtrl[i].size = -1;\r
}\r
ptrCtrl[0].size = -2;\r
+ //\r
+ randStatInit((unsigned int)time(NULL));\r
\r
- /* syslibの読み込み */\r
- syslib = Init_LoadSysLib(argv[0], systmp0);\r
+ //\r
+ // Load syslib\r
+ //\r
+ \r
+ env.syslibOSECPUBin = Init_LoadSysLib(argv[0]);\r
\r
- sysjit = jitCompInit(sysjit);\r
- sysjit00 = sysjit;\r
+ pSyslibJITBin = jitCompInit(pSyslibJITBin);\r
+ syslibJITBinBase = pSyslibJITBin;\r
// labelはjitc0()内で初期化される。\r
- i = jitc0(&sysjit, sysjit00 + SYSJITSIZ1, syslib + 32, syslib + SYSLIBSIZ1, JITC_LV_SLOWEST+9, label);\r
+ i = jitc0(&pSyslibJITBin, env.syslibJITBin + SYSLIBJITSIZE, env.syslibOSECPUBin + 32, env.syslibOSECPUBin + SYSLIBBINSIZE, JITC_LV_SLOWEST + 9, label);\r
if (i != 0){\r
fputs("syslib-file JITC error.\n", stderr);\r
return 1;\r
}\r
\r
- // エラー時にデバッグ用に表示する変数を加算\r
- di1_serial++;\r
- \r
- /* アプリバイナリの読み込み */\r
LoadAppBin(&env);\r
\r
- /* クロック初期化 */\r
tm0 = clock() / (double)CLOCKS_PER_SEC;\r
\r
- if (env.appBin[2] == 0xf0) {\r
+ if (env.appOSECPUBin[2] == 0xf0) {\r
// tek5圧縮がかかっている\r
#if (USE_TEK5 != 0)\r
- env.appSize1 = tek5Decomp(env.appBin + 2, env.appBin + env.appSize0, systmp0);\r
+ tekDecompTemp = malloc(TEKDECOMPTMPSIZE);\r
+ env.appSize1 = tek5Decomp(env.appOSECPUBin + 2, env.appOSECPUBin + env.appSize0, tekDecompTemp);\r
+ free(tekDecompTemp);\r
env.appSize1 += 2;\r
#else\r
env.appSize1 = -9;\r
}\r
}\r
//デバッグモード指定\r
- cp = searchArg(argc, (const char **)argv, "debug:", 0);\r
- if (cp != NULL){\r
- argDebug = *cp - '0';\r
+ s = searchArg(argc, (const char **)argv, "debug:", 0);\r
+ if (s != NULL){\r
+ argDebugMode = *s - '0';\r
}\r
//スタックサイズ指定(MiB単位)\r
- cp = searchArg(argc, (const char **)argv, "stack:", 0);\r
- if (cp != NULL){\r
- stacksiz = strtol(cp, NULL, 0);\r
+ s = searchArg(argc, (const char **)argv, "stack:", 0);\r
+ if (s != NULL){\r
+ argStackSize = strtol(s, NULL, 0);\r
}\r
-\r
- // jitbufは先頭。 jpは現在位置\r
- jp = jitbuf; /* JIT-pointer */\r
\r
/* フロントエンドコードをバックエンドコードに変換する */\r
- if ((env.appBin[2] & 0xf0) != 0) { // 3バイト目が00なら処理しない\r
- systmp0[0] = env.appBin[0];\r
- systmp0[1] = env.appBin[1];\r
- env.preg[2].p = systmp0 + 2;\r
- env.preg[3].p = systmp0 + SYSTMP0SIZ;\r
- env.preg[4].p = env.appBin + 2;\r
- env.preg[5].p = env.appBin + env.appSize1;\r
- env.preg[6].p = systmp1;\r
- env.preg[7].p = systmp1 + SYSTMP1SIZ;\r
- env.preg[10].p = systmp2;\r
- int pxxFlag[64], typLabel[4096];\r
- env.preg[0x0b].p = (void *)pxxFlag;\r
- env.preg[0x0c].p = (void *)typLabel;\r
- env.preg[0x0d].p = opTbl;\r
- jitfunc = (void *)sysjit00;\r
- jitcRunBinary(jitfunc, &env);\r
+ if ((env.appOSECPUBin[2] & 0xf0) != 0) { // 3バイト目が00なら処理しない\r
+ env.appOSECPUBackendBin[0] = env.appOSECPUBin[0];\r
+ env.appOSECPUBackendBin[1] = env.appOSECPUBin[1];\r
+ env.preg[2].p = &env.appOSECPUBackendBin[2];\r
+ env.preg[3].p = &env.appOSECPUBackendBin[APPBINSIZE];\r
+ env.preg[4].p = &env.appOSECPUBin[2];\r
+ env.preg[5].p = &env.appOSECPUBin[env.appSize1];\r
+ env.preg[6].p = bufP06;\r
+ env.preg[7].p = bufP06 + DECODER_BUF06_SIZE;\r
+ env.preg[0x0A].p = (unsigned char *)bufP0A;\r
+ env.preg[0x0B].p = (void *)pxxFlag;\r
+ env.preg[0x0C].p = (void *)typLabel;\r
+ env.preg[0x0D].p = opTbl;\r
+ jitcRunBinary((void *)syslibJITBinBase, &env);\r
if (env.ireg[0] != 0) {\r
- jp = env.preg[2].p - 1;\r
- fprintf(stderr, "unpack error: %02X (at %06X) (R00=%d)\n", *jp, jp - systmp0, env.ireg[0]);\r
- if ((argDebug & 2) != 0) {\r
+ p = env.preg[2].p - 1;\r
+ fprintf(stderr, "unpack error: %02X (at %06X) (R00=%d)\n", *p, p - env.appOSECPUBackendBin, env.ireg[0]);\r
+ if ((argDebugMode & 2) != 0) {\r
fp = fopen("debug2.bin", "wb");\r
- fwrite(systmp0, 1, jp - systmp0 + 16, fp);\r
+ fwrite(env.appOSECPUBackendBin, 1, p - env.appOSECPUBackendBin + 16, fp);\r
fclose(fp);\r
}\r
exit(1);\r
}\r
- tmpsiz = env.preg[2].p - systmp0;\r
+ env.appOSECPUBackendBinSize = env.preg[2].p - env.appOSECPUBackendBin;\r
} else{\r
- memcpy(systmp0, env.appBin, env.appSize1);\r
- tmpsiz = env.appSize1;\r
+ memcpy(env.appOSECPUBackendBin, env.appOSECPUBin, env.appSize1);\r
+ env.appOSECPUBackendBinSize = env.appSize1;\r
}\r
\r
- if ((argDebug & 2) != 0) {\r
+ if ((argDebugMode & 2) != 0) {\r
/*変換後のバックエンドコードをファイルへ保存*/\r
fp = fopen("debug2.bin", "wb");\r
- fwrite(systmp0, 1, tmpsiz, fp);\r
+ fwrite(env.appOSECPUBackendBin, 1, env.appOSECPUBackendBinSize, fp);\r
fclose(fp);\r
}\r
\r
//JITコンパイル\r
- i = jitc0(&jp, jitbuf + 1024 * 1024, systmp0, systmp0 + tmpsiz, env.executionLevel, label);\r
+ fprintf(stderr, "pAppJITBin: %p\n", pAppJITBin);\r
+ i = jitc0(&pAppJITBin, env.appJITBin + APPJITSIZE, env.appOSECPUBackendBin, env.appOSECPUBackendBin + APPBINSIZE, env.executionLevel, label);\r
+ fprintf(stderr, "pAppJITBin: %p\n", pAppJITBin);\r
if (i == 1){\r
fputs("app-file header error.\n", stderr);\r
return 1;\r
}\r
di1_serial++;\r
\r
- int appsiz2 = jp - jitbuf;\r
+ env.appJITBinSize = pAppJITBin - env.appOSECPUBackendBin;\r
\r
- unsigned char *p28 = jp;\r
- jp = jitCompCallFunc(jp, &devFunc);\r
+ // 末尾にAPI関数呼び出しコードを追加\r
+ appBinDevFuncBase = pAppJITBin;\r
+ pAppJITBin = jitCompCallFunc(pAppJITBin, &devFunc);\r
\r
tm1 = clock() / (double)CLOCKS_PER_SEC;\r
\r
}\r
\r
env.buf0 = env.buf1 = NULL;\r
-\r
+ \r
// p28にapiをコールするアドレスを設定\r
- env.preg[0x28].p = p28; // p28には、devFuncをコールするコードが書かれている\r
+ env.preg[0x28].p = appBinDevFuncBase; // appBinDevFuncBaseには、devFuncをコールするコードが書かれている\r
env.preg[0x28].typ = 0; // TYP_CODE\r
- env.preg[0x28].p0 = p28; // アドレス演算できる範囲を制限\r
- env.preg[0x28].p1 = p28 + 1; // アドレス演算できる範囲を制限\r
-\r
+ env.preg[0x28].p0 = appBinDevFuncBase; // アドレス演算できる範囲を制限\r
+ env.preg[0x28].p1 = appBinDevFuncBase + 1; // アドレス演算できる範囲を制限\r
+ \r
//env.preg[0x00].p = malloc(1024 * 1024) + (1024 * 1024 - 32);\r
- env.junkStack = malloc(stacksiz << 20);\r
- env.junkStack1 = env.junkStack + (stacksiz << 20);\r
+ env.junkStack = malloc(argStackSize << 20);\r
+ env.junkStack1 = env.junkStack + (argStackSize << 20);\r
env.winClosed = 0;\r
env.autoSleep = 0;\r
env.lastConsoleChar = '\n';\r
\r
env.label = label;\r
env.maxLabels = JITC_MAXLABELS;\r
- env.jitbuf = jp;\r
- env.jitbuf1 = jitbuf + 1024 * 1024;\r
+ env.jitbuf = pAppJITBin;\r
+ env.jitbuf1 = env.appJITBin + APPJITSIZE;\r
env.errHndl = &errorHandler;\r
env.appReturnCode = 0;\r
\r
env.dbgr = 1;\r
}\r
\r
- if ((argDebug & 1) != 0) {\r
+ if ((argDebugMode & 1) != 0) {\r
fp = fopen("debug1.bin", "wb");\r
- fwrite(jitbuf, 1, jp - jitbuf, fp);\r
+ fwrite(env.appJITBin, 1, pAppJITBin - env.appJITBin, fp);\r
fclose(fp);\r
}\r
\r
/* JITコード実行 */\r
- jitfunc = (void *)jitbuf;\r
if (setjmp(env.setjmpEnv) == 0){\r
- jitcRunBinary(jitfunc, &env);\r
+ jitcRunBinary((void *)env.appJITBin, &env);\r
}\r
if (env.autoSleep != 0) {\r
if (mainWindow.vram != NULL){\r
/* 実行結果確認のためのレジスタダンプ */\r
if (searchArg(argc, (const char **)argv, "verbose:1", 0) != NULL) {\r
printf("time: JITC=%.3f[sec], exec=%.3f[sec]\n", tm1 - tm0, tm2 - tm1);\r
- printf("size: OSECPU=%d, decomp=%d, tmp=%d, native=%d\n", env.appSize0, env.appSize1, tmpsiz, appsiz2);\r
+ printf("size: OSECPU=%d, decomp=%d, tmp=%d, native=%d\n", env.appSize0, env.appSize1, env.appOSECPUBackendBinSize, env.appJITBinSize);\r
printf("result:\n");\r
printf("R00:0x%08X R01:0x%08X R02:0x%08X R03:0x%08X\n", env.ireg[0], env.ireg[1], env.ireg[2], env.ireg[3]);\r
}\r
dbgrMain(&env);\r
#endif\r
return env.appReturnCode;\r
+ \r
+ return 0;\r
}\r
\r
-unsigned char *Init_LoadSysLib(char argv0[], unsigned char *tmpWorkMemory)\r
+unsigned char *Init_LoadSysLib(char argv0[])\r
{\r
unsigned char *syslib;\r
FILE *fp;\r
unsigned char *up;\r
int appsize;\r
+ unsigned char *tmpWorkMemory;\r
\r
/* syslibの読み込み */\r
- syslib = malloc(SYSLIBSIZ1);\r
+ syslib = malloc(SYSLIBBINSIZE);\r
fp = fopen(SYSLIB_OSE, "rb");\r
if (fp == NULL) {\r
syslib[0] = '/';\r
fputs("syslib-file fopen error.\n", stderr);\r
exit(EXIT_FAILURE);\r
}\r
- appsize = fread(syslib, 1, SYSLIBSIZ1 - 4, fp);\r
+ appsize = fread(syslib, 1, SYSLIBBINSIZE - 4, fp);\r
fclose(fp);\r
- if (appsize >= SYSLIBSIZ1 - 4) {\r
+ if (appsize >= SYSLIBBINSIZE - 4) {\r
fputs("syslib-file too large.\n", stderr);\r
exit(EXIT_FAILURE);\r
}\r
if (syslib[0] == 0x05 && syslib[1] == 0xc1) {\r
// maklib のライブラリ形式である。\r
+ tmpWorkMemory = malloc(SYSLIBDECOMPTMPSIZE);\r
memcpy(tmpWorkMemory, syslib, appsize);\r
ComLib_main(tmpWorkMemory + 2, syslib + 2);\r
+ free(tmpWorkMemory);\r
+ //\r
syslib[0] = 0x05;\r
syslib[1] = 0x1b;\r
}\r
\r
fp = fopen("syslib_dbg.ose", "wb");\r
- fwrite(syslib, 1, SYSLIBSIZ1, fp);\r
+ fwrite(syslib, 1, SYSLIBBINSIZE, fp);\r
fclose(fp);\r
return syslib;\r
}\r
fputs("app-file load error.\n", stderr);\r
exit(EXIT_FAILURE);\r
}\r
- env->appSize0 = fread(env->appBin, 1, APPSIZ1 - 4, fp);\r
+ env->appSize0 = fread(env->appOSECPUBin, 1, APPBINSIZE - 4, fp);\r
env->appSize1 = env->appSize0;\r
fclose(fp);\r
\r
- if (env->appSize0 >= APPSIZ1 - 4) {\r
+ if (env->appSize0 >= APPBINSIZE - 4) {\r
fputs("app-file too large.\n", stderr);\r
exit(EXIT_FAILURE);\r
}\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 // デバッグ機能を実行バイナリに含むか設定。デバッガ利用には dbgr:1 引数が実行時に必要。\r
-#define ENABLE_DEBUG_CODE 1 // env.dbg_currentCodeに実行するコードを保存するデバッグコードを挿入する\r
+#define USE_DEBUGGER 1 // デバッグ機能を実行バイナリに含むか設定。デバッガ利用には dbgr:1 引数が実行時に必要。\r
+#define ENABLE_DEBUG_CODE 1 // env.dbg_currentCodeに実行するコードを保存するデバッグコードを挿入する\r
+#define ENABLE_DEBUG_CODE_ADDR 1\r
#define USE_TEK5 1\r
\r
\r
#define JITC_LV_SAFE 2 /* とにかく止まる、場所は不明、テストは必要最小限 */\r
#define JITC_LV_FASTER 4 /* 情報は生成するがチェックをしない */\r
#define JITC_LV_FASTEST 5 /* 情報すら生成しない */\r
+\r
#define JITC_PHASE1 0x0001\r
#define JITC_SKIPCHECK 0x0002 /* セキュリティチェックを省略する(高速危険モード) */\r
#define JITC_NOSTARTUP 0x0004\r
+\r
#define JITC_MAXLABELS 4096\r
#define PTRCTRLSIZ 4096\r
\r
-#define APPSIZ1 1 * 1024 * 1024 /* 1MB for now */\r
-#define APPJITSIZE 1 * 1024 * 1024 /* 1MB for now */\r
-#define SYSJITSIZ1 2 * 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
+#define APPBINSIZE 1 * 1024 * 1024 /* 1MB for now */\r
+#define APPJITSIZE 1 * 1024 * 1024 /* 1MB for now */\r
+#define SYSLIBBINSIZE 1 * 1024 * 1024 /* 1MB for now */\r
+#define SYSLIBJITSIZE 2 * 1024 * 1024 /* 2MB for now */\r
+#define SYSLIBDECOMPTMPSIZE 1 * 1024 * 1024 /* 1MB for now */\r
+#define TEKDECOMPTMPSIZE 1 * 1024 * 1024 /* 1MB for now */\r
+#define SYSTMP1SIZ 2 * 1024 * 1024 /* 2MB for now */\r
+\r
+#define DECODER_BUF06_SIZE 2 * 1024 * 1024\r
+#define DECODER_BUF0A_SIZE 1 * 1024 * 1024 // too large?\r
\r
#define KEYBUFSIZ 4096\r
\r
int debugInfo0; // 2304\r
int debugInfo1; // 2308\r
int dbg_currentCode; // 2312\r
- int dmy; // 2316\r
+ int dbg_currentCodeAddress; // 2316\r
//\r
HOSECPU_PointerControlTag *ptrCtrl; // 2320\r
char winClosed, autoSleep;\r
/* Main environment */\r
int mainArgc; // HOSECPU起動引数の個数\r
const char **mainArgv; // HOSECPU起動引数リスト\r
- unsigned char *appBin; // 実行するアプリのバイナリ\r
+ //unsigned char *appBin; // 実行するアプリの元バイナリ(渡されたファイルの内容そのもの)\r
+ unsigned char *appOSECPUBin; // 実行するアプリの元バイナリ(渡されたファイルの内容そのもの)\r
+ unsigned char *appOSECPUBackendBin; // 実行するアプリの元バイナリ(渡されたファイルの内容そのもの)\r
+ int appOSECPUBackendBinSize;\r
+ unsigned char *appJITBin; // 実行するアプリのJITコンパイルされたバイナリ(実行可能)\r
+ int appJITBinSize;\r
+ unsigned char *syslibOSECPUBin; // syslibの元バイナリ\r
+ unsigned char *syslibJITBin; // syslibのJITコンパイルされたバイナリ(実行可能)\r
int appSize0;\r
int appSize1;\r
int executionLevel;\r