Diff for /np2/i386c/ia32/resolve.c between versions 1.5 and 1.10

version 1.5, 2004/01/27 15:53:56 version 1.10, 2011/01/15 17:17:23
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 32 Line 28
 #include "ia32.mcr"  #include "ia32.mcr"
   
   
 DWORD (*calc_ea_dst_tbl[0x100])(void);  UINT32 (*calc_ea_dst_tbl[0x100])(void);
 DWORD (*calc_ea32_dst_tbl[0x100])(void);  UINT32 (*calc_ea32_dst_tbl[0x100])(void);
   
 #if defined(DEBUG) || !defined(IA32_INLINE_CALC_EA)  
 DWORD  
 calc_ea_dst(DWORD op)  
 {  
   
         __ASSERT(op < 0x100);  
   
         if (!CPU_INST_AS32)  
                 return ((*calc_ea_dst_tbl[op])() & 0xffff);  
         return (*calc_ea32_dst_tbl[op])();  
 }  
 #endif  /* IA32_INLINE_CALC_EA */  
   
   
 /*  /*
  * common   * common
  */   */
 DWORD  static UINT32
 ea_nop(void)  ea_nop(void)
 {  {
   
Line 68  ea_nop(void) Line 51  ea_nop(void)
 /*  /*
  * ea_dest   * ea_dest
  */   */
 static DWORD  static UINT32
 ea_bx_si(void)  ea_bx_si(void)
 {  {
   
Line 76  ea_bx_si(void) Line 59  ea_bx_si(void)
         return (CPU_BX + CPU_SI);          return (CPU_BX + CPU_SI);
 }  }
   
 static DWORD  static UINT32
 ea_bx_si_disp8(void)  ea_bx_si_disp8(void)
 {  {
         SDWORD adrs;          UINT32 adrs;
   
         GET_PCBYTESD(adrs);          GET_PCBYTES(adrs);
         CPU_INST_SEGREG_INDEX = DS_FIX;          CPU_INST_SEGREG_INDEX = DS_FIX;
         return (adrs + CPU_BX + CPU_SI);          return (adrs + CPU_BX + CPU_SI);
 }  }
   
 static DWORD  static UINT32
 ea_bx_si_disp16(void)  ea_bx_si_disp16(void)
 {  {
         DWORD adrs;          UINT32 adrs;
   
         GET_PCWORD(adrs);          GET_PCWORD(adrs);
         CPU_INST_SEGREG_INDEX = DS_FIX;          CPU_INST_SEGREG_INDEX = DS_FIX;
         return (adrs + CPU_BX + CPU_SI);          return (adrs + CPU_BX + CPU_SI);
 }  }
   
 static DWORD  static UINT32
 ea_bx_di(void)  ea_bx_di(void)
 {  {
   
Line 104  ea_bx_di(void) Line 87  ea_bx_di(void)
         return (CPU_BX + CPU_DI);          return (CPU_BX + CPU_DI);
 }  }
   
 static DWORD  static UINT32
 ea_bx_di_disp8(void)  ea_bx_di_disp8(void)
 {  {
         SDWORD adrs;          UINT32 adrs;
   
         GET_PCBYTESD(adrs);          GET_PCBYTES(adrs);
         CPU_INST_SEGREG_INDEX = DS_FIX;          CPU_INST_SEGREG_INDEX = DS_FIX;
         return (adrs + CPU_BX + CPU_DI);          return (adrs + CPU_BX + CPU_DI);
 }  }
   
 static DWORD  static UINT32
 ea_bx_di_disp16(void)  ea_bx_di_disp16(void)
 {  {
         DWORD adrs;          UINT32 adrs;
   
         GET_PCWORD(adrs);          GET_PCWORD(adrs);
         CPU_INST_SEGREG_INDEX = DS_FIX;          CPU_INST_SEGREG_INDEX = DS_FIX;
         return (adrs + CPU_BX + CPU_DI);          return (adrs + CPU_BX + CPU_DI);
 }  }
   
 static DWORD  static UINT32
 ea_bp_si(void)  ea_bp_si(void)
 {  {
   
Line 132  ea_bp_si(void) Line 115  ea_bp_si(void)
         return (CPU_BP + CPU_SI);          return (CPU_BP + CPU_SI);
 }  }
   
 static DWORD  static UINT32
 ea_bp_si_disp8(void)  ea_bp_si_disp8(void)
 {  {
         SDWORD adrs;          UINT32 adrs;
   
         GET_PCBYTESD(adrs);          GET_PCBYTES(adrs);
         CPU_INST_SEGREG_INDEX = SS_FIX;          CPU_INST_SEGREG_INDEX = SS_FIX;
         return (adrs + CPU_BP + CPU_SI);          return (adrs + CPU_BP + CPU_SI);
 }  }
   
 static DWORD  static UINT32
 ea_bp_si_disp16(void)  ea_bp_si_disp16(void)
 {  {
         DWORD adrs;          UINT32 adrs;
   
         GET_PCWORD(adrs);          GET_PCWORD(adrs);
         CPU_INST_SEGREG_INDEX = SS_FIX;          CPU_INST_SEGREG_INDEX = SS_FIX;
         return (adrs + CPU_BP + CPU_SI);          return (adrs + CPU_BP + CPU_SI);
 }  }
   
 static DWORD  static UINT32
 ea_bp_di(void)  ea_bp_di(void)
 {  {
   
Line 160  ea_bp_di(void) Line 143  ea_bp_di(void)
         return (CPU_BP + CPU_DI);          return (CPU_BP + CPU_DI);
 }  }
   
 static DWORD  static UINT32
 ea_bp_di_disp8(void)  ea_bp_di_disp8(void)
 {  {
         SDWORD adrs;          UINT32 adrs;
   
         GET_PCBYTESD(adrs);          GET_PCBYTES(adrs);
         CPU_INST_SEGREG_INDEX = SS_FIX;          CPU_INST_SEGREG_INDEX = SS_FIX;
         return (adrs + CPU_BP + CPU_DI);          return (adrs + CPU_BP + CPU_DI);
 }  }
   
 static DWORD  static UINT32
 ea_bp_di_disp16(void)  ea_bp_di_disp16(void)
 {  {
         DWORD adrs;          UINT32 adrs;
   
         GET_PCWORD(adrs);          GET_PCWORD(adrs);
         CPU_INST_SEGREG_INDEX = SS_FIX;          CPU_INST_SEGREG_INDEX = SS_FIX;
         return (adrs + CPU_BP + CPU_DI);          return (adrs + CPU_BP + CPU_DI);
 }  }
   
 static DWORD  static UINT32
 ea_si(void)  ea_si(void)
 {  {
   
Line 188  ea_si(void) Line 171  ea_si(void)
         return CPU_SI;          return CPU_SI;
 }  }
   
 static DWORD  static UINT32
 ea_si_disp8(void)  ea_si_disp8(void)
 {  {
         SDWORD adrs;          UINT32 adrs;
   
         GET_PCBYTESD(adrs);          GET_PCBYTES(adrs);
         CPU_INST_SEGREG_INDEX = DS_FIX;          CPU_INST_SEGREG_INDEX = DS_FIX;
         return (adrs + CPU_SI);          return (adrs + CPU_SI);
 }  }
   
 static DWORD  static UINT32
 ea_si_disp16(void)  ea_si_disp16(void)
 {  {
         DWORD adrs;          UINT32 adrs;
   
         GET_PCWORD(adrs);          GET_PCWORD(adrs);
         CPU_INST_SEGREG_INDEX = DS_FIX;          CPU_INST_SEGREG_INDEX = DS_FIX;
         return (adrs + CPU_SI);          return (adrs + CPU_SI);
 }  }
   
 static DWORD  static UINT32
 ea_di(void)  ea_di(void)
 {  {
   
Line 216  ea_di(void) Line 199  ea_di(void)
         return CPU_DI;          return CPU_DI;
 }  }
   
 static DWORD  static UINT32
 ea_di_disp8(void)  ea_di_disp8(void)
 {  {
         SDWORD adrs;          UINT32 adrs;
   
         GET_PCBYTESD(adrs);          GET_PCBYTES(adrs);
         CPU_INST_SEGREG_INDEX = DS_FIX;          CPU_INST_SEGREG_INDEX = DS_FIX;
         return (adrs + CPU_DI);          return (adrs + CPU_DI);
 }  }
   
 static DWORD  static UINT32
 ea_di_disp16(void)  ea_di_disp16(void)
 {  {
         DWORD adrs;          UINT32 adrs;
   
         GET_PCWORD(adrs);          GET_PCWORD(adrs);
         CPU_INST_SEGREG_INDEX = DS_FIX;          CPU_INST_SEGREG_INDEX = DS_FIX;
         return (adrs + CPU_DI);          return (adrs + CPU_DI);
 }  }
   
 static DWORD  static UINT32
 ea_disp16(void)  ea_disp16(void)
 {  {
         DWORD adrs;          UINT32 adrs;
   
         GET_PCWORD(adrs);          GET_PCWORD(adrs);
         CPU_INST_SEGREG_INDEX = DS_FIX;          CPU_INST_SEGREG_INDEX = DS_FIX;
         return adrs;          return adrs;
 }  }
   
 static DWORD  static UINT32
 ea_bp_disp8(void)  ea_bp_disp8(void)
 {  {
         SDWORD adrs;          UINT32 adrs;
   
         GET_PCBYTESD(adrs);          GET_PCBYTES(adrs);
         CPU_INST_SEGREG_INDEX = SS_FIX;          CPU_INST_SEGREG_INDEX = SS_FIX;
         return (adrs + CPU_BP);          return (adrs + CPU_BP);
 }  }
   
 static DWORD  static UINT32
 ea_bp_disp16(void)  ea_bp_disp16(void)
 {  {
         DWORD adrs;          UINT32 adrs;
   
         GET_PCWORD(adrs);          GET_PCWORD(adrs);
         CPU_INST_SEGREG_INDEX = SS_FIX;          CPU_INST_SEGREG_INDEX = SS_FIX;
         return (adrs + CPU_BP);          return (adrs + CPU_BP);
 }  }
   
 static DWORD  static UINT32
 ea_bx(void)  ea_bx(void)
 {  {
   
Line 274  ea_bx(void) Line 257  ea_bx(void)
         return CPU_BX;          return CPU_BX;
 }  }
   
 static DWORD  static UINT32
 ea_bx_disp8(void)  ea_bx_disp8(void)
 {  {
         SDWORD adrs;          UINT32 adrs;
   
         GET_PCBYTESD(adrs);          GET_PCBYTES(adrs);
         CPU_INST_SEGREG_INDEX = DS_FIX;          CPU_INST_SEGREG_INDEX = DS_FIX;
         return (adrs + CPU_BX);          return (adrs + CPU_BX);
 }  }
   
 static DWORD  static UINT32
 ea_bx_disp16(void)  ea_bx_disp16(void)
 {  {
         DWORD adrs;          UINT32 adrs;
   
         GET_PCWORD(adrs);          GET_PCWORD(adrs);
         CPU_INST_SEGREG_INDEX = DS_FIX;          CPU_INST_SEGREG_INDEX = DS_FIX;
         return (adrs + CPU_BX);          return (adrs + CPU_BX);
 }  }
   
 static DWORD (*c_ea_dst_tbl[])(void) = {  static UINT32 (*c_ea_dst_tbl[])(void) = {
         ea_bx_si,               ea_bx_di,          ea_bx_si,               ea_bx_di,
         ea_bp_si,               ea_bp_di,          ea_bp_si,               ea_bp_di,
         ea_si,                  ea_di,          ea_si,                  ea_di,
Line 316  static DWORD (*c_ea_dst_tbl[])(void) = { Line 299  static DWORD (*c_ea_dst_tbl[])(void) = {
 /*  /*
  * ea_dest 32   * ea_dest 32
  */   */
 static DWORD  static UINT32
 ea32_eax(void)  ea32_eax(void)
 {  {
   
Line 324  ea32_eax(void) Line 307  ea32_eax(void)
         return CPU_EAX;          return CPU_EAX;
 }  }
   
 static DWORD  static UINT32
 ea32_ecx(void)  ea32_ecx(void)
 {  {
   
Line 332  ea32_ecx(void) Line 315  ea32_ecx(void)
         return CPU_ECX;          return CPU_ECX;
 }  }
   
 static DWORD  static UINT32
 ea32_edx(void)  ea32_edx(void)
 {  {
   
Line 340  ea32_edx(void) Line 323  ea32_edx(void)
         return CPU_EDX;          return CPU_EDX;
 }  }
   
 static DWORD  static UINT32
 ea32_ebx(void)  ea32_ebx(void)
 {  {
   
Line 348  ea32_ebx(void) Line 331  ea32_ebx(void)
         return CPU_EBX;          return CPU_EBX;
 }  }
   
 static DWORD  static UINT32
 ea32_sib(void)  ea32_sib(void)
 {  {
         DWORD op, dst;          UINT32 dst;
         DWORD base, idx, scale;          UINT32 op;
           UINT32 base, idx, scale;
   
         GET_PCBYTE(op);          GET_PCBYTE(op);
         base = op & 7;          base = op & 7;
Line 385  ea32_sib(void) Line 369  ea32_sib(void)
         return dst;          return dst;
 }  }
   
 static DWORD  static UINT32
 ea32_disp32(void)  ea32_disp32(void)
 {  {
         DWORD adrs;          UINT32 adrs;
   
         GET_PCDWORD(adrs);          GET_PCDWORD(adrs);
         CPU_INST_SEGREG_INDEX = DS_FIX;          CPU_INST_SEGREG_INDEX = DS_FIX;
         return adrs;          return adrs;
 }  }
   
 static DWORD  static UINT32
 ea32_esi(void)  ea32_esi(void)
 {  {
   
Line 403  ea32_esi(void) Line 387  ea32_esi(void)
         return CPU_ESI;          return CPU_ESI;
 }  }
   
 static DWORD  static UINT32
 ea32_edi(void)  ea32_edi(void)
 {  {
   
Line 411  ea32_edi(void) Line 395  ea32_edi(void)
         return CPU_EDI;          return CPU_EDI;
 }  }
   
 static DWORD  static UINT32
 ea32_eax_disp8(void)  ea32_eax_disp8(void)
 {  {
         SDWORD adrs;          SINT32 adrs;
   
         GET_PCBYTESD(adrs);          GET_PCBYTESD(adrs);
         CPU_INST_SEGREG_INDEX = DS_FIX;          CPU_INST_SEGREG_INDEX = DS_FIX;
         return adrs + CPU_EAX;          return adrs + CPU_EAX;
 }  }
   
 static DWORD  static UINT32
 ea32_ecx_disp8(void)  ea32_ecx_disp8(void)
 {  {
         SDWORD adrs;          SINT32 adrs;
   
         GET_PCBYTESD(adrs);          GET_PCBYTESD(adrs);
         CPU_INST_SEGREG_INDEX = DS_FIX;          CPU_INST_SEGREG_INDEX = DS_FIX;
         return adrs + CPU_ECX;          return adrs + CPU_ECX;
 }  }
   
 static DWORD  static UINT32
 ea32_edx_disp8(void)  ea32_edx_disp8(void)
 {  {
         SDWORD adrs;          SINT32 adrs;
   
         GET_PCBYTESD(adrs);          GET_PCBYTESD(adrs);
         CPU_INST_SEGREG_INDEX = DS_FIX;          CPU_INST_SEGREG_INDEX = DS_FIX;
         return adrs + CPU_EDX;          return adrs + CPU_EDX;
 }  }
   
 static DWORD  static UINT32
 ea32_ebx_disp8(void)  ea32_ebx_disp8(void)
 {  {
         SDWORD adrs;          SINT32 adrs;
   
         GET_PCBYTESD(adrs);          GET_PCBYTESD(adrs);
         CPU_INST_SEGREG_INDEX = DS_FIX;          CPU_INST_SEGREG_INDEX = DS_FIX;
         return adrs + CPU_EBX;          return adrs + CPU_EBX;
 }  }
   
 static DWORD  static UINT32
 ea32_sib_disp8(void)  ea32_sib_disp8(void)
 {  {
         SDWORD adrs;          SINT32 adrs;
         DWORD op;          UINT32 op;
         DWORD base, idx, scale;          UINT32 base, idx, scale;
   
         GET_PCBYTE(op);          GET_PCBYTE(op);
         base = op & 7;          base = op & 7;
Line 479  ea32_sib_disp8(void) Line 463  ea32_sib_disp8(void)
         return CPU_REGS_DWORD(base) + adrs;          return CPU_REGS_DWORD(base) + adrs;
 }  }
   
 static DWORD  static UINT32
 ea32_ebp_disp8(void)  ea32_ebp_disp8(void)
 {  {
         SDWORD adrs;          SINT32 adrs;
   
         GET_PCBYTESD(adrs);          GET_PCBYTESD(adrs);
         CPU_INST_SEGREG_INDEX = SS_FIX;          CPU_INST_SEGREG_INDEX = SS_FIX;
         return adrs + CPU_EBP;          return adrs + CPU_EBP;
 }  }
   
 static DWORD  static UINT32
 ea32_esi_disp8(void)  ea32_esi_disp8(void)
 {  {
         SDWORD adrs;          SINT32 adrs;
   
         GET_PCBYTESD(adrs);          GET_PCBYTESD(adrs);
         CPU_INST_SEGREG_INDEX = DS_FIX;          CPU_INST_SEGREG_INDEX = DS_FIX;
         return adrs + CPU_ESI;          return adrs + CPU_ESI;
 }  }
   
 static DWORD  static UINT32
 ea32_edi_disp8(void)  ea32_edi_disp8(void)
 {  {
         SDWORD adrs;          SINT32 adrs;
   
         GET_PCBYTESD(adrs);          GET_PCBYTESD(adrs);
         CPU_INST_SEGREG_INDEX = DS_FIX;          CPU_INST_SEGREG_INDEX = DS_FIX;
         return adrs + CPU_EDI;          return adrs + CPU_EDI;
 }  }
   
 static DWORD  static UINT32
 ea32_eax_disp32(void)  ea32_eax_disp32(void)
 {  {
         DWORD adrs;          UINT32 adrs;
   
         GET_PCDWORD(adrs);          GET_PCDWORD(adrs);
         CPU_INST_SEGREG_INDEX = DS_FIX;          CPU_INST_SEGREG_INDEX = DS_FIX;
         return adrs + CPU_EAX;          return adrs + CPU_EAX;
 }  }
   
 static DWORD  static UINT32
 ea32_ecx_disp32(void)  ea32_ecx_disp32(void)
 {  {
         DWORD adrs;          UINT32 adrs;
   
         GET_PCDWORD(adrs);          GET_PCDWORD(adrs);
         CPU_INST_SEGREG_INDEX = DS_FIX;          CPU_INST_SEGREG_INDEX = DS_FIX;
         return adrs + CPU_ECX;          return adrs + CPU_ECX;
 }  }
   
 static DWORD  static UINT32
 ea32_edx_disp32(void)  ea32_edx_disp32(void)
 {  {
         DWORD adrs;          UINT32 adrs;
   
         GET_PCDWORD(adrs);          GET_PCDWORD(adrs);
         CPU_INST_SEGREG_INDEX = DS_FIX;          CPU_INST_SEGREG_INDEX = DS_FIX;
         return adrs + CPU_EDX;          return adrs + CPU_EDX;
 }  }
   
 static DWORD  static UINT32
 ea32_ebx_disp32(void)  ea32_ebx_disp32(void)
 {  {
         DWORD adrs;          UINT32 adrs;
   
         GET_PCDWORD(adrs);          GET_PCDWORD(adrs);
         CPU_INST_SEGREG_INDEX = DS_FIX;          CPU_INST_SEGREG_INDEX = DS_FIX;
         return adrs + CPU_EBX;          return adrs + CPU_EBX;
 }  }
   
 static DWORD  static UINT32
 ea32_sib_disp32(void)  ea32_sib_disp32(void)
 {  {
         DWORD adrs;          UINT32 adrs;
         DWORD op;          UINT32 op;
         DWORD base, idx, scale;          UINT32 base, idx, scale;
   
         GET_PCBYTE(op);          GET_PCBYTE(op);
         base = op & 7;          base = op & 7;
Line 577  ea32_sib_disp32(void) Line 561  ea32_sib_disp32(void)
         return CPU_REGS_DWORD(base) + adrs;          return CPU_REGS_DWORD(base) + adrs;
 }  }
   
 static DWORD  static UINT32
 ea32_ebp_disp32(void)  ea32_ebp_disp32(void)
 {  {
         DWORD adrs;          UINT32 adrs;
   
         GET_PCDWORD(adrs);          GET_PCDWORD(adrs);
         CPU_INST_SEGREG_INDEX = SS_FIX;          CPU_INST_SEGREG_INDEX = SS_FIX;
         return adrs + CPU_EBP;          return adrs + CPU_EBP;
 }  }
   
 static DWORD  static UINT32
 ea32_esi_disp32(void)  ea32_esi_disp32(void)
 {  {
         DWORD adrs;          UINT32 adrs;
   
         GET_PCDWORD(adrs);          GET_PCDWORD(adrs);
         CPU_INST_SEGREG_INDEX = DS_FIX;          CPU_INST_SEGREG_INDEX = DS_FIX;
         return adrs + CPU_ESI;          return adrs + CPU_ESI;
 }  }
   
 static DWORD  static UINT32
 ea32_edi_disp32(void)  ea32_edi_disp32(void)
 {  {
         DWORD adrs;          UINT32 adrs;
   
         GET_PCDWORD(adrs);          GET_PCDWORD(adrs);
         CPU_INST_SEGREG_INDEX = DS_FIX;          CPU_INST_SEGREG_INDEX = DS_FIX;
         return adrs + CPU_EDI;          return adrs + CPU_EDI;
 }  }
   
 static DWORD (*c_ea32_dst_tbl[])(void) = {  static UINT32 (*c_ea32_dst_tbl[])(void) = {
         ea32_eax,               ea32_ecx,           ea32_eax,               ea32_ecx, 
         ea32_edx,               ea32_ebx,          ea32_edx,               ea32_ebx,
         ea32_sib,               ea32_disp32,          ea32_sib,               ea32_disp32,

Removed from v.1.5  
changed lines
  Added in v.1.10


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