Diff for /np2/i386c/ia32/disasm.c between versions 1.8 and 1.13

version 1.8, 2004/07/29 13:06:08 version 1.13, 2012/02/07 09:11:10
Line 1 Line 1
 /*      $Id$    */  
   
 /*  /*
  * Copyright (c) 2004 NONAKA Kimihiro   * Copyright (c) 2004 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 33 Line 29
   
   
 /*  /*
  * register strings  
  */  
 const char *reg8_str[8] = {  
         "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh"  
 };  
   
 const char *reg16_str[8] = {   
         "ax", "cx", "dx", "bx", "sp", "bp", "si", "di"  
 };  
   
 const char *reg32_str[8] = {   
         "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"  
 };  
   
 const char *sreg_str[6] = {  
         "es", "cs", "ss", "ds", "fs", "gs"  
 };  
   
 /*  
  * opcode strings   * opcode strings
  */   */
 static const char *opcode_1byte[2][256] = {  static const char *opcode_1byte[2][256] = {
Line 641  ea(disasm_context_t *ctx) Line 618  ea(disasm_context_t *ctx)
  * get opcode   * get opcode
  */   */
 static int  static int
 op(disasm_context_t *ctx)  get_opcode(disasm_context_t *ctx)
 {  {
         const char *opcode;          const char *opcode;
         UINT8 op[3];          UINT8 op[3];
Line 656  op(disasm_context_t *ctx) Line 633  op(disasm_context_t *ctx)
                         return rv;                          return rv;
   
                 op[0] = (UINT8)(ctx->val & 0xff);                  op[0] = (UINT8)(ctx->val & 0xff);
                 if (insttable_info[op[0]] & INST_PREFIX) {                  if (!(insttable_info[op[0]] & INST_PREFIX))
                         if (ctx->prefix == 0)                          break;
                                 ctx->prefix = ctx->next;  
                   if (ctx->prefix == 0)
                         switch (op[0]) {                          ctx->prefix = ctx->next;
                         case 0x26:      /* ES: */  
                         case 0x2e:      /* CS: */                  switch (op[0]) {
                         case 0x36:      /* SS: */                  case 0x26:      /* ES: */
                         case 0x3e:      /* DS: */                  case 0x2e:      /* CS: */
                                 ctx->useseg = TRUE;                  case 0x36:      /* SS: */
                                 ctx->seg = (op[0] >> 3) & 3;                  case 0x3e:      /* DS: */
                                 break;                          ctx->useseg = TRUE;
                           ctx->seg = (op[0] >> 3) & 3;
                         case 0x64:      /* FS: */                          break;
                         case 0x65:      /* GS: */  
                                 ctx->useseg = TRUE;                  case 0x64:      /* FS: */
                                 ctx->seg = (op[0] - 0x64) + 4;                  case 0x65:      /* GS: */
                                 break;                          ctx->useseg = TRUE;
                           ctx->seg = (op[0] - 0x64) + 4;
                         case 0x66:      /* OPSize: */                          break;
                                 ctx->op32 = !CPU_INST_OP32;  
                                 break;                  case 0x66:      /* OPSize: */
                           ctx->op32 = !CPU_STATSAVE.cpu_inst_default.op_32;
                         case 0x67:      /* AddrSize: */                          break;
                                 ctx->as32 = !CPU_INST_AS32;  
                                 break;                  case 0x67:      /* AddrSize: */
                         }                          ctx->as32 = !CPU_STATSAVE.cpu_inst_default.as_32;
                         continue;                          break;
                 }                  }
                 break;  
         }          }
         if (prefix == MAX_PREFIX)          if (prefix == MAX_PREFIX)
                 return 1;                  return 1;
Line 797  disasm(UINT32 *eip, disasm_context_t *ct Line 773  disasm(UINT32 *eip, disasm_context_t *ct
         ctx->arg[2] = 0;          ctx->arg[2] = 0;
   
         ctx->eip = *eip;          ctx->eip = *eip;
         ctx->op32 = CPU_INST_OP32;          ctx->op32 = CPU_STATSAVE.cpu_inst_default.op_32;
         ctx->as32 = CPU_INST_AS32;          ctx->as32 = CPU_STATSAVE.cpu_inst_default.as_32;
         ctx->seg = -1;          ctx->seg = -1;
   
         ctx->baseaddr = ctx->eip;          ctx->baseaddr = ctx->eip;
         ctx->pad = ' ';          ctx->pad = ' ';
   
         rv = op(ctx);          rv = get_opcode(ctx);
         if (rv) {          if (rv) {
                 memset(ctx, 0, sizeof(disasm_context_t));                  memset(ctx, 0, sizeof(disasm_context_t));
                 return rv;                  return rv;
Line 813  disasm(UINT32 *eip, disasm_context_t *ct Line 789  disasm(UINT32 *eip, disasm_context_t *ct
   
         return 0;          return 0;
 }  }
   
   char *
   cpu_disasm2str(UINT32 eip)
   {
           static char output[2048];
           disasm_context_t d;
           UINT32 eip2 = eip;
           int rv;
   
           output[0] = '\0';
           rv = disasm(&eip2, &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));
                   }
                   snprintf(output, sizeof(output), "%04x:%08x: %s%s",
                       CPU_CS, eip, buf, d.str);
   
                   if (i < d.nopbytes) {
                           char t[256];
                           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) {
                                           snprintf(t, sizeof(t),
                                               "\n             : %s", buf);
                                           milstr_ncat(output, t, sizeof(output));
                                           buf[0] = '\0';
                                   }
                           }
                           if ((i % 8) != 0) {
                                   snprintf(t, sizeof(t),
                                       "\n             : %s", buf);
                                   milstr_ncat(output, t, sizeof(output));
                           }
                   }
           }
           return output;
   }

Removed from v.1.8  
changed lines
  Added in v.1.13


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