| version 1.13, 2004/03/05 14:17:35 | version 1.21, 2005/02/04 05:32:24 | 
| Line 28 | Line 28 | 
 | */ | */ | 
 |  |  | 
 | #include "compiler.h" | #include "compiler.h" | 
 |  | #include "dosio.h" | 
 | #include "cpu.h" | #include "cpu.h" | 
 | #include "ia32.mcr" | #include "ia32.mcr" | 
 |  |  | 
| Line 54  int cpu_inst_trace = 0; | Line 55  int cpu_inst_trace = 0; | 
 | #endif | #endif | 
 |  |  | 
 |  |  | 
 |  | // #define      IPTRACE                 (1 << 14) | 
 |  |  | 
 |  | #if defined(TRACE) && IPTRACE | 
 |  | static  UINT    trpos = 0; | 
 |  | static  UINT32  trcs[IPTRACE]; | 
 |  | static  UINT32  treip[IPTRACE]; | 
 |  |  | 
 |  | void iptrace_out(void) { | 
 |  |  | 
 |  | FILEH   fh; | 
 |  | UINT    s; | 
 |  | UINT32  cs; | 
 |  | UINT32  eip; | 
 |  | char    buf[32]; | 
 |  |  | 
 |  | s = trpos; | 
 |  | if (s > IPTRACE) { | 
 |  | s -= IPTRACE; | 
 |  | } | 
 |  | else { | 
 |  | s = 0; | 
 |  | } | 
 |  | fh = file_create_c("his.txt"); | 
 |  | while(s < trpos) { | 
 |  | cs = trcs[s & (IPTRACE - 1)]; | 
 |  | eip = treip[s & (IPTRACE - 1)]; | 
 |  | s++; | 
 |  | SPRINTF(buf, "%.4x:%.8x\r\n", cs, eip); | 
 |  | file_write(fh, buf, strlen(buf)); | 
 |  | } | 
 |  | file_close(fh); | 
 |  | } | 
 |  | #endif | 
 |  |  | 
 |  |  | 
 | void | void | 
 | exec_1step(void) | exec_1step(void) | 
 | { | { | 
| Line 63  exec_1step(void) | Line 99  exec_1step(void) | 
 | CPU_PREV_EIP = CPU_EIP; | CPU_PREV_EIP = CPU_EIP; | 
 | CPU_STATSAVE.cpu_inst = CPU_STATSAVE.cpu_inst_default; | CPU_STATSAVE.cpu_inst = CPU_STATSAVE.cpu_inst_default; | 
 |  |  | 
 |  | #if defined(TRACE) && IPTRACE | 
 |  | if (CPU_CS == 0x000c) { | 
 |  | trcs[trpos & (IPTRACE - 1)] = CPU_CS; | 
 |  | treip[trpos & (IPTRACE - 1)] = CPU_EIP; | 
 |  | trpos++; | 
 |  | } | 
 |  | #endif | 
 |  |  | 
 | #if defined(IA32_INSTRUCTION_TRACE) | #if defined(IA32_INSTRUCTION_TRACE) | 
 | ctx[ctx_index].regs = CPU_STATSAVE.cpu_regs; | ctx[ctx_index].regs = CPU_STATSAVE.cpu_regs; | 
 | if (cpu_inst_trace) { | if (cpu_inst_trace) { | 
| Line 103  exec_1step(void) | Line 147  exec_1step(void) | 
 | } | } | 
 | ctx[ctx_index].opbytes = 0; | ctx[ctx_index].opbytes = 0; | 
 | #endif | #endif | 
 |  |  | 
 |  | #if defined(IA32_SUPPORT_DEBUG_REGISTER) | 
 |  | if (CPU_STAT_BP && !(CPU_EFLAG & RF_FLAG)) { | 
 |  | int i; | 
 |  | for (i = 0; i < CPU_DEBUG_REG_INDEX_NUM; i++) { | 
 |  | if ((CPU_STAT_BP & (1 << i)) | 
 |  | && (CPU_DR7_GET_RW(i) == CPU_DR7_RW_CODE) | 
 |  | && (CPU_DR(i) == CPU_EIP) | 
 |  | && (CPU_DR7_GET_LEN(i) == 0)) { | 
 |  | CPU_DR6 |= CPU_DR6_B(i); | 
 |  | EXCEPTION(DB_EXCEPTION, 0); | 
 |  | } | 
 |  | } | 
 |  | } | 
 |  | #endif  /* IA32_SUPPORT_DEBUG_REGISTER */ | 
 |  |  | 
 | for (prefix = 0; prefix < MAX_PREFIX; prefix++) { | for (prefix = 0; prefix < MAX_PREFIX; prefix++) { | 
 | GET_PCBYTE(op); | GET_PCBYTE(op); | 
 | #if defined(IA32_INSTRUCTION_TRACE) | #if defined(IA32_INSTRUCTION_TRACE) | 
| Line 134  exec_1step(void) | Line 194  exec_1step(void) | 
 | /* normal / rep, but not use */ | /* normal / rep, but not use */ | 
 | if (!(insttable_info[op] & INST_STRING) || !CPU_INST_REPUSE) { | if (!(insttable_info[op] & INST_STRING) || !CPU_INST_REPUSE) { | 
 | (*insttable_1byte[CPU_INST_OP32][op])(); | (*insttable_1byte[CPU_INST_OP32][op])(); | 
 |  | #if defined(IA32_SUPPORT_DEBUG_REGISTER) | 
 |  | goto check_break_point; | 
 |  | #else | 
 | return; | return; | 
 |  | #endif | 
 | } | } | 
 |  |  | 
 | /* rep */ | /* rep */ | 
| Line 143  exec_1step(void) | Line 207  exec_1step(void) | 
 | if (CPU_CX != 0) { | if (CPU_CX != 0) { | 
 | if (!(insttable_info[op] & REP_CHECKZF)) { | if (!(insttable_info[op] & REP_CHECKZF)) { | 
 | /* rep */ | /* rep */ | 
| do { | for (;;) { | 
 | (*insttable_1byte[CPU_INST_OP32][op])(); | (*insttable_1byte[CPU_INST_OP32][op])(); | 
| } while (--CPU_CX); | if (--CPU_CX == 0) | 
|  | break; | 
|  | if (CPU_REMCLOCK <= 0) { | 
|  | CPU_EIP = CPU_PREV_EIP; | 
|  | break; | 
|  | } | 
|  | } | 
 | } else if (CPU_INST_REPUSE != 0xf2) { | } else if (CPU_INST_REPUSE != 0xf2) { | 
 | /* repe */ | /* repe */ | 
| do { | for (;;) { | 
 | (*insttable_1byte[CPU_INST_OP32][op])(); | (*insttable_1byte[CPU_INST_OP32][op])(); | 
| } while (--CPU_CX && (CPU_FLAGL & Z_FLAG)); | if (--CPU_CX == 0 || CC_NZ) | 
|  | break; | 
|  | if (CPU_REMCLOCK <= 0) { | 
|  | CPU_EIP = CPU_PREV_EIP; | 
|  | break; | 
|  | } | 
|  | } | 
 | } else { | } else { | 
 | /* repne */ | /* repne */ | 
| do { | for (;;) { | 
 | (*insttable_1byte[CPU_INST_OP32][op])(); | (*insttable_1byte[CPU_INST_OP32][op])(); | 
| } while (--CPU_CX && !(CPU_FLAGL & Z_FLAG)); | if (--CPU_CX == 0 || CC_Z) | 
|  | break; | 
|  | if (CPU_REMCLOCK <= 0) { | 
|  | CPU_EIP = CPU_PREV_EIP; | 
|  | break; | 
|  | } | 
|  | } | 
 | } | } | 
 | } | } | 
 | } else { | } else { | 
 | if (CPU_ECX != 0) { | if (CPU_ECX != 0) { | 
 | if (!(insttable_info[op] & REP_CHECKZF)) { | if (!(insttable_info[op] & REP_CHECKZF)) { | 
 | /* rep */ | /* rep */ | 
| do { | for (;;) { | 
 | (*insttable_1byte[CPU_INST_OP32][op])(); | (*insttable_1byte[CPU_INST_OP32][op])(); | 
| } while (--CPU_ECX); | if (--CPU_ECX == 0) | 
|  | break; | 
|  | if (CPU_REMCLOCK <= 0) { | 
|  | CPU_EIP = CPU_PREV_EIP; | 
|  | break; | 
|  | } | 
|  | } | 
 | } else if (CPU_INST_REPUSE != 0xf2) { | } else if (CPU_INST_REPUSE != 0xf2) { | 
 | /* repe */ | /* repe */ | 
| do { | for (;;) { | 
 | (*insttable_1byte[CPU_INST_OP32][op])(); | (*insttable_1byte[CPU_INST_OP32][op])(); | 
| } while (--CPU_ECX && (CPU_FLAGL & Z_FLAG)); | if (--CPU_ECX == 0 || CC_NZ) | 
|  | break; | 
|  | if (CPU_REMCLOCK <= 0) { | 
|  | CPU_EIP = CPU_PREV_EIP; | 
|  | break; | 
|  | } | 
|  | } | 
 | } else { | } else { | 
 | /* repne */ | /* repne */ | 
| do { | for (;;) { | 
 | (*insttable_1byte[CPU_INST_OP32][op])(); | (*insttable_1byte[CPU_INST_OP32][op])(); | 
| } while (--CPU_ECX && !(CPU_FLAGL & Z_FLAG)); | if (--CPU_ECX == 0 || CC_Z) | 
|  | break; | 
|  | if (CPU_REMCLOCK <= 0) { | 
|  | CPU_EIP = CPU_PREV_EIP; | 
|  | break; | 
|  | } | 
|  | } | 
 | } | } | 
 | } | } | 
 | } | } | 
 |  |  | 
 |  | #if defined(IA32_SUPPORT_DEBUG_REGISTER) | 
 |  | check_break_point: | 
 |  | if (CPU_TRAP || (CPU_STAT_BP_EVENT & ~CPU_STAT_BP_EVENT_RF)) { | 
 |  | UINT8 orig = CPU_STAT_BP_EVENT & ~CPU_STAT_BP_EVENT_RF; | 
 |  |  | 
 |  | CPU_STAT_BP_EVENT &= CPU_STAT_BP_EVENT_RF; | 
 |  |  | 
 |  | CPU_DR6 |= (orig & 0xf); | 
 |  | if (orig & CPU_STAT_BP_EVENT_TASK) { | 
 |  | CPU_DR6 |= CPU_DR6_BT; | 
 |  | } | 
 |  | if (CPU_TRAP) { | 
 |  | CPU_DR6 |= CPU_DR6_BS; | 
 |  | } | 
 |  | INTERRUPT(DB_EXCEPTION, TRUE, FALSE, 0); | 
 |  | } | 
 |  | if (CPU_EFLAG & RF_FLAG) { | 
 |  | if (CPU_STAT_BP_EVENT & CPU_STAT_BP_EVENT_RF) { | 
 |  | /* after IRETD or task switch */ | 
 |  | CPU_STAT_BP_EVENT &= ~CPU_STAT_BP_EVENT_RF; | 
 |  | } else { | 
 |  | CPU_EFLAG &= ~RF_FLAG; | 
 |  | } | 
 |  | } | 
 |  | #endif  /* IA32_SUPPORT_DEBUG_REGISTER */ | 
 | } | } |