|
|
| 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, |