i386: fix for bt? instructions [Carl]

This commit is contained in:
mahlemiut 2012-04-30 01:47:43 +00:00
parent bf53bd7a6b
commit 0098f14e66
3 changed files with 28 additions and 19 deletions

View File

@ -335,11 +335,12 @@ static void modrm_to_EA(i386_state *cpustate,UINT8 mod_rm, UINT32* out_ea, UINT8
}
}
static UINT32 GetNonTranslatedEA(i386_state *cpustate,UINT8 modrm)
static UINT32 GetNonTranslatedEA(i386_state *cpustate,UINT8 modrm,UINT8 *seg)
{
UINT8 segment;
UINT32 ea;
modrm_to_EA(cpustate, modrm, &ea, &segment );
if(seg) *seg = segment;
return ea;
}

View File

@ -365,10 +365,11 @@ static void I386OP(bt_rm16_r16)(i386_state *cpustate) // Opcode 0x0f a3
CYCLES(cpustate,CYCLES_BT_REG_REG);
} else {
UINT32 ea = GetEA(cpustate,modrm,0);
UINT8 segment;
UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
UINT16 bit = LOAD_REG16(modrm);
ea += 2*(bit/16);
ea = (cpustate->address_size)?ea:(ea&0xffff);
ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),0);
bit %= 16;
UINT16 dst = READ16(cpustate,ea);
@ -397,10 +398,11 @@ static void I386OP(btc_rm16_r16)(i386_state *cpustate) // Opcode 0x0f bb
STORE_RM16(modrm, dst);
CYCLES(cpustate,CYCLES_BTC_REG_REG);
} else {
UINT32 ea = GetEA(cpustate,modrm,1);
UINT8 segment;
UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
UINT16 bit = LOAD_REG16(modrm);
ea += 2*(bit/16);
ea = (cpustate->address_size)?ea:(ea&0xffff);
ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),1);
bit %= 16;
UINT16 dst = READ16(cpustate,ea);
@ -431,10 +433,11 @@ static void I386OP(btr_rm16_r16)(i386_state *cpustate) // Opcode 0x0f b3
STORE_RM16(modrm, dst);
CYCLES(cpustate,CYCLES_BTR_REG_REG);
} else {
UINT32 ea = GetEA(cpustate,modrm,1);
UINT8 segment;
UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
UINT16 bit = LOAD_REG16(modrm);
ea += 2*(bit/16);
ea = (cpustate->address_size)?ea:(ea&0xffff);
ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),1);
bit %= 16;
UINT16 dst = READ16(cpustate,ea);
@ -465,10 +468,11 @@ static void I386OP(bts_rm16_r16)(i386_state *cpustate) // Opcode 0x0f ab
STORE_RM16(modrm, dst);
CYCLES(cpustate,CYCLES_BTS_REG_REG);
} else {
UINT32 ea = GetEA(cpustate,modrm,1);
UINT8 segment;
UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
UINT16 bit = LOAD_REG16(modrm);
ea += 2*(bit/16);
ea = (cpustate->address_size)?ea:(ea&0xffff);
ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),1);
bit %= 16;
UINT16 dst = READ16(cpustate,ea);
@ -1161,7 +1165,7 @@ static void I386OP(jmp_abs16)(i386_state *cpustate) // Opcode 0xea
static void I386OP(lea16)(i386_state *cpustate) // Opcode 0x8d
{
UINT8 modrm = FETCH(cpustate);
UINT32 ea = GetNonTranslatedEA(cpustate,modrm);
UINT32 ea = GetNonTranslatedEA(cpustate,modrm,NULL);
STORE_REG16(modrm, ea);
CYCLES(cpustate,CYCLES_LEA);
}

View File

@ -341,10 +341,11 @@ static void I386OP(bt_rm32_r32)(i386_state *cpustate) // Opcode 0x0f a3
CYCLES(cpustate,CYCLES_BT_REG_REG);
} else {
UINT32 ea = GetEA(cpustate,modrm,0);
UINT8 segment;
UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
UINT32 bit = LOAD_REG32(modrm);
ea += 4*(bit/32);
ea = (cpustate->address_size)?ea:(ea&0xffff);
ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),0);
bit %= 32;
UINT32 dst = READ32(cpustate,ea);
@ -373,10 +374,11 @@ static void I386OP(btc_rm32_r32)(i386_state *cpustate) // Opcode 0x0f bb
STORE_RM32(modrm, dst);
CYCLES(cpustate,CYCLES_BTC_REG_REG);
} else {
UINT32 ea = GetEA(cpustate,modrm,1);
UINT8 segment;
UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
UINT32 bit = LOAD_REG32(modrm);
ea += 4*(bit/32);
ea = (cpustate->address_size)?ea:(ea&0xffff);
ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),1);
bit %= 32;
UINT32 dst = READ32(cpustate,ea);
@ -407,10 +409,11 @@ static void I386OP(btr_rm32_r32)(i386_state *cpustate) // Opcode 0x0f b3
STORE_RM32(modrm, dst);
CYCLES(cpustate,CYCLES_BTR_REG_REG);
} else {
UINT32 ea = GetEA(cpustate,modrm,1);
UINT8 segment;
UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
UINT32 bit = LOAD_REG32(modrm);
ea += 4*(bit/32);
ea = (cpustate->address_size)?ea:(ea&0xffff);
ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),1);
bit %= 32;
UINT32 dst = READ32(cpustate,ea);
@ -441,10 +444,11 @@ static void I386OP(bts_rm32_r32)(i386_state *cpustate) // Opcode 0x0f ab
STORE_RM32(modrm, dst);
CYCLES(cpustate,CYCLES_BTS_REG_REG);
} else {
UINT32 ea = GetEA(cpustate,modrm,1);
UINT8 segment;
UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
UINT32 bit = LOAD_REG32(modrm);
ea += 4*(bit/32);
ea = (cpustate->address_size)?ea:(ea&0xffff);
ea = i386_translate(cpustate,segment,(cpustate->address_size)?ea:(ea&0xffff),1);
bit %= 32;
UINT32 dst = READ32(cpustate,ea);
@ -1002,7 +1006,7 @@ static void I386OP(jmp_abs32)(i386_state *cpustate) // Opcode 0xea
static void I386OP(lea32)(i386_state *cpustate) // Opcode 0x8d
{
UINT8 modrm = FETCH(cpustate);
UINT32 ea = GetNonTranslatedEA(cpustate,modrm);
UINT32 ea = GetNonTranslatedEA(cpustate,modrm,NULL);
if (!cpustate->address_size)
{
ea &= 0xffff;