Diff for /np2/i386c/ia32/cpu.c between versions 1.11 and 1.28

version 1.11, 2004/02/13 14:52:35 version 1.28, 2012/01/08 11:36:05
Line 1 Line 1
 /*      $Id$    */  
   
 /*  /*
  * Copyright (c) 2002-2003 NONAKA Kimihiro   * Copyright (c) 2002-2003 NONAKA Kimihiro
  * All rights reserved.   * All rights reserved.
Line 12 Line 10
  * 2. Redistributions in binary form must reproduce the above copyright   * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the   *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.   *    documentation and/or other materials provided with the distribution.
  * 3. The name of the author may not be used to endorse or promote products  
  *    derived from this software without specific prior written permission.  
  *   *
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR   * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES   * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
Line 28 Line 24
  */   */
   
 #include "compiler.h"  #include "compiler.h"
   #include "dosio.h"
 #include "cpu.h"  #include "cpu.h"
 #include "ia32.mcr"  #include "ia32.mcr"
   
 #include "inst_table.h"  #include "inst_table.h"
   
   #if defined(ENABLE_TRAP)
   #include "steptrap.h"
   #endif
   
   
 sigjmp_buf exec_1step_jmpbuf;  sigjmp_buf exec_1step_jmpbuf;
   
   #if defined(IA32_INSTRUCTION_TRACE)
   typedef struct {
           CPU_REGS                regs;
           disasm_context_t        disasm;
   
           BYTE                    op[MAX_PREFIX + 2];
           int                     opbytes;
   } ia32_context_t;
   
   #define NCTX    1024
   
   ia32_context_t ctx[NCTX];
   int ctx_index = 0;
   
   int cpu_inst_trace = 0;
   #endif
   
   #if defined(DEBUG)
   int cpu_debug_rep_cont = 0;
   CPU_REGS cpu_debug_rep_regs;
   #endif
   
   
 void  void
 exec_1step(void)  exec_1step(void)
 {  {
         int prefix;          int prefix;
         BYTE op;          UINT32 op;
   
         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(ENABLE_TRAP)
           steptrap(CPU_CS, CPU_EIP);
   #endif
   
   #if defined(IA32_INSTRUCTION_TRACE)
           ctx[ctx_index].regs = CPU_STATSAVE.cpu_regs;
           if (cpu_inst_trace) {
                   disasm_context_t *d = &ctx[ctx_index].disasm;
                   UINT32 eip = CPU_EIP;
                   int rv;
   
                   rv = disasm(&eip, d);
                   if (rv == 0) {
                           char buf[256];
                           char tmp[32];
                           int len = d->nopbytes > 8 ? 8 : d->nopbytes;
                           int i;
   
                           buf[0] = '\0';
                           for (i = 0; i < len; i++) {
                                   snprintf(tmp, sizeof(tmp), "%02x ", d->opbyte[i]);
                                   milstr_ncat(buf, tmp, sizeof(buf));
                           }
                           for (; i < 8; i++) {
                                   milstr_ncat(buf, "   ", sizeof(buf));
                           }
                           VERBOSE(("%04x:%08x: %s%s", CPU_CS, CPU_EIP, buf, d->str));
   
                           buf[0] = '\0';
                           for (; i < d->nopbytes; i++) {
                                   snprintf(tmp, sizeof(tmp), "%02x ", d->opbyte[i]);
                                   milstr_ncat(buf, tmp, sizeof(buf));
                                   if ((i % 8) == 7) {
                                           VERBOSE(("             : %s", buf));
                                           buf[0] = '\0';
                                   }
                           }
                           if ((i % 8) != 0) {
                                   VERBOSE(("             : %s", buf));
                           }
                   }
           }
           ctx[ctx_index].opbytes = 0;
   #endif
   
         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)
                   ctx[ctx_index].op[prefix] = op;
                   ctx[ctx_index].opbytes++;
   #endif
   
                 /* prefix */                  /* prefix */
                 if (insttable_info[op] & INST_PREFIX) {                  if (insttable_info[op] & INST_PREFIX) {
Line 59  exec_1step(void) Line 132  exec_1step(void)
                 EXCEPTION(UD_EXCEPTION, 0);                  EXCEPTION(UD_EXCEPTION, 0);
         }          }
   
   #if defined(IA32_INSTRUCTION_TRACE)
           if (op == 0x0f) {
                   BYTE op2;
                   op2 = cpu_codefetch(CPU_EIP);
                   ctx[ctx_index].op[prefix + 1] = op2;
                   ctx[ctx_index].opbytes++;
           }
           ctx_index = (ctx_index + 1) % NELEMENTS(ctx);
   #endif
   
         /* 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) {
   #if defined(DEBUG)
                   cpu_debug_rep_cont = 0;
   #endif
                 (*insttable_1byte[CPU_INST_OP32][op])();                  (*insttable_1byte[CPU_INST_OP32][op])();
                 return;                  return;
         }          }
   
         /* rep */          /* rep */
         CPU_WORKCLOCK(5);          CPU_WORKCLOCK(5);
   #if defined(DEBUG)
           if (!cpu_debug_rep_cont) {
                   cpu_debug_rep_cont = 1;
                   cpu_debug_rep_regs = CPU_STATSAVE.cpu_regs;
           }
   #endif
         if (!CPU_INST_AS32) {          if (!CPU_INST_AS32) {
                 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) {
   #if defined(DEBUG)
                                                   cpu_debug_rep_cont = 0;
   #endif
                                                   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) {
   #if defined(DEBUG)
                                                   cpu_debug_rep_cont = 0;
   #endif
                                                   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) {
   #if defined(DEBUG)
                                                   cpu_debug_rep_cont = 0;
   #endif
                                                   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) {
   #if defined(DEBUG)
                                                   cpu_debug_rep_cont = 0;
   #endif
                                                   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) {
   #if defined(DEBUG)
                                                   cpu_debug_rep_cont = 0;
   #endif
                                                   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) {
   #if defined(DEBUG)
                                                   cpu_debug_rep_cont = 0;
   #endif
                                                   break;
                                           }
                                           if (CPU_REMCLOCK <= 0) {
                                                   CPU_EIP = CPU_PREV_EIP;
                                                   break;
                                           }
                                   }
                         }                          }
                 }                  }
         }          }

Removed from v.1.11  
changed lines
  Added in v.1.28


RetroPC.NET-CVS <cvs@retropc.net>