Diff for /np2/i386c/ia32/disasm.c between versions 1.6 and 1.11

version 1.6, 2004/02/20 16:09:04 version 1.11, 2011/01/15 17:33:32
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 332  static const char *opcode2_g9[8] = { Line 328  static const char *opcode2_g9[8] = {
         NULL, "cmpxchg8b", NULL, NULL, NULL, NULL, NULL, NULL          NULL, "cmpxchg8b", NULL, NULL, NULL, NULL, NULL, NULL
 };  };
   
   #if 0
 static const char *sep[2] = { " ", ", " };  static const char *sep[2] = { " ", ", " };
   #endif
   
 /*  
  * context  
  */  
 typedef struct {  
         UINT32 val;  
   
         UINT32 eip;  
         BOOL op32;  
         BOOL as32;  
   
         UINT32 baseaddr;  
         UINT8 opcode[3];  
         UINT8 modrm;  
         UINT8 sib;  
   
         BOOL useseg;  
         int seg;  
   
         UINT8 opbyte[32];  
         int nopbytes;  
   
         char str[256];  
         size_t remain;  
   
         char *next;  
         char *prefix;  
         char *op;  
         char *arg[3];  
         int narg;  
   
         char pad;  
 } disasm_context_t;  
   
   
 /*  /*
Line 417  disasm_codefetch_1(disasm_context_t *ctx Line 381  disasm_codefetch_1(disasm_context_t *ctx
         return 0;          return 0;
 }  }
   
   #if 0
 static int  static int
 disasm_codefetch_2(disasm_context_t *ctx)  disasm_codefetch_2(disasm_context_t *ctx)
 {  {
Line 666  ea(disasm_context_t *ctx) Line 631  ea(disasm_context_t *ctx)
   
         return 0;          return 0;
 }  }
   #endif
   
 /*  /*
  * 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 813  op(disasm_context_t *ctx) Line 779  op(disasm_context_t *ctx)
  * interface   * interface
  */   */
 int  int
 disasm(UINT32 *eip, char *buf, size_t size)  disasm(UINT32 *eip, disasm_context_t *ctx)
 {  {
         disasm_context_t ctx;  
         char tmp[32];  
         int rv;          int rv;
         int i;  
   
         memset(&ctx, 0, sizeof(ctx));          memset(ctx, 0, sizeof(disasm_context_t));
         ctx.remain = sizeof(ctx.str) - 1;          ctx->remain = sizeof(ctx->str) - 1;
         ctx.next = ctx.str;          ctx->next = ctx->str;
         ctx.prefix = 0;          ctx->prefix = 0;
         ctx.op = 0;          ctx->op = 0;
         ctx.arg[0] = 0;          ctx->arg[0] = 0;
         ctx.arg[1] = 0;          ctx->arg[1] = 0;
         ctx.arg[2] = 0;          ctx->arg[2] = 0;
   
         ctx.eip = *eip;          ctx->eip = *eip;
         ctx.op32 = CPU_INST_OP32;          ctx->op32 = CPU_INST_OP32;
         ctx.as32 = CPU_INST_AS32;          ctx->as32 = CPU_INST_AS32;
         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(ctx));                  memset(ctx, 0, sizeof(disasm_context_t));
                 return rv;                  return rv;
         }          }
           *eip = ctx->eip;
   
         *eip = ctx.eip;  
   
         memset(buf, 0, size);  
         for (i = 0; i < ctx.nopbytes; i++) {  
                 snprintf(tmp, sizeof(tmp), "%02x ", ctx.opbyte[i]);  
                 milstr_ncat(buf, tmp, size);  
         }  
   
         milstr_ncpy(tmp, "   ", sizeof(tmp));  
         for (; i < 8; i++) {  
                 milstr_ncat(buf, tmp, size);  
         }  
         milstr_ncat(buf, ctx.str, size);  
         return 0;          return 0;
 }  }

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


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