| version 1.1, 2003/12/08 00:55:31 | 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" | 
 |  |  | 
 |  |  | 
| static DWORD (*calc_ea_dst_tbl[0x100])(void); | UINT32 (*calc_ea_dst_tbl[0x100])(void); | 
| static DWORD (*calc_ea32_dst_tbl[0x100])(void); | UINT32 (*calc_ea32_dst_tbl[0x100])(void); | 
|  |  | 
|  |  | 
| DWORD |  | 
| calc_ea_dst(DWORD op) |  | 
| { |  | 
|  |  | 
| if (!CPU_INST_AS32) |  | 
| return ((*calc_ea_dst_tbl[op])() & 0xffff); |  | 
| return (*calc_ea32_dst_tbl[op])(); |  | 
| } |  | 
 |  |  | 
 |  |  | 
 | /* | /* | 
 | * common | * common | 
 | */ | */ | 
| DWORD | static UINT32 | 
 | ea_nop(void) | ea_nop(void) | 
 | { | { | 
 |  |  | 
| Line 65  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 73  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 101  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 129  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 157  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 185  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 213  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 271  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 313  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 321  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 329  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 337  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 345  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); | 
 | dst = 0;        /* compiler happy */ |  | 
 |  |  | 
 | base = op & 7; | base = op & 7; | 
 | idx = (op >> 3) & 7; | idx = (op >> 3) & 7; | 
 | scale = (op >> 6) & 3; | scale = (op >> 6) & 3; | 
 |  |  | 
 | switch (base) { | switch (base) { | 
 | case 0: case 1: case 2: case 3: case 6: case 7: | case 0: case 1: case 2: case 3: case 6: case 7: | 
 | CPU_INST_SEGREG_INDEX = DS_FIX; | CPU_INST_SEGREG_INDEX = DS_FIX; | 
| Line 372  ea32_sib(void) | Line 358  ea32_sib(void) | 
 | CPU_INST_SEGREG_INDEX = DS_FIX; | CPU_INST_SEGREG_INDEX = DS_FIX; | 
 | GET_PCDWORD(dst); | GET_PCDWORD(dst); | 
 | break; | break; | 
 |  |  | 
 |  | default: | 
 |  | dst = 0;        /* compiler happy */ | 
 |  | ia32_panic("ea32_sib: invalid base = %d", base); | 
 |  | break; | 
 | } | } | 
 | if (idx != 4) | if (idx != 4) | 
 | dst += CPU_REGS_DWORD(idx) << scale; | dst += CPU_REGS_DWORD(idx) << scale; | 
 | 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 396  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 404  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); | 
 | GET_PCBYTESD(adrs); |  | 
 |  |  | 
 | base = op & 7; | base = op & 7; | 
 | idx = (op >> 3) & 7; | idx = (op >> 3) & 7; | 
 | scale = (op >> 6) & 3; | scale = (op >> 6) & 3; | 
 |  |  | 
 |  | GET_PCBYTESD(adrs); | 
 |  |  | 
 | switch (base) { | switch (base) { | 
 | case 0: case 1: case 2: case 3: case 6: case 7: | case 0: case 1: case 2: case 3: case 6: case 7: | 
 | CPU_INST_SEGREG_INDEX = DS_FIX; | CPU_INST_SEGREG_INDEX = DS_FIX; | 
| Line 471  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); | 
 | GET_PCDWORD(adrs); |  | 
 |  |  | 
 | base = op & 7; | base = op & 7; | 
 | idx = (op >> 3) & 7; | idx = (op >> 3) & 7; | 
 | scale = (op >> 6) & 3; | scale = (op >> 6) & 3; | 
 |  |  | 
 |  | GET_PCDWORD(adrs); | 
 |  |  | 
 | switch (base) { | switch (base) { | 
 | case 0: case 1: case 2: case 3: case 6: case 7: | case 0: case 1: case 2: case 3: case 6: case 7: | 
 | CPU_INST_SEGREG_INDEX = DS_FIX; | CPU_INST_SEGREG_INDEX = DS_FIX; | 
| Line 568  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, |