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; UINT8 segment;
UINT32 ea; UINT32 ea;
modrm_to_EA(cpustate, modrm, &ea, &segment ); modrm_to_EA(cpustate, modrm, &ea, &segment );
if(seg) *seg = segment;
return ea; 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); CYCLES(cpustate,CYCLES_BT_REG_REG);
} else { } else {
UINT32 ea = GetEA(cpustate,modrm,0); UINT8 segment;
UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
UINT16 bit = LOAD_REG16(modrm); UINT16 bit = LOAD_REG16(modrm);
ea += 2*(bit/16); 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; bit %= 16;
UINT16 dst = READ16(cpustate,ea); 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); STORE_RM16(modrm, dst);
CYCLES(cpustate,CYCLES_BTC_REG_REG); CYCLES(cpustate,CYCLES_BTC_REG_REG);
} else { } else {
UINT32 ea = GetEA(cpustate,modrm,1); UINT8 segment;
UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
UINT16 bit = LOAD_REG16(modrm); UINT16 bit = LOAD_REG16(modrm);
ea += 2*(bit/16); 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; bit %= 16;
UINT16 dst = READ16(cpustate,ea); 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); STORE_RM16(modrm, dst);
CYCLES(cpustate,CYCLES_BTR_REG_REG); CYCLES(cpustate,CYCLES_BTR_REG_REG);
} else { } else {
UINT32 ea = GetEA(cpustate,modrm,1); UINT8 segment;
UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
UINT16 bit = LOAD_REG16(modrm); UINT16 bit = LOAD_REG16(modrm);
ea += 2*(bit/16); 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; bit %= 16;
UINT16 dst = READ16(cpustate,ea); 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); STORE_RM16(modrm, dst);
CYCLES(cpustate,CYCLES_BTS_REG_REG); CYCLES(cpustate,CYCLES_BTS_REG_REG);
} else { } else {
UINT32 ea = GetEA(cpustate,modrm,1); UINT8 segment;
UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
UINT16 bit = LOAD_REG16(modrm); UINT16 bit = LOAD_REG16(modrm);
ea += 2*(bit/16); 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; bit %= 16;
UINT16 dst = READ16(cpustate,ea); 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 static void I386OP(lea16)(i386_state *cpustate) // Opcode 0x8d
{ {
UINT8 modrm = FETCH(cpustate); UINT8 modrm = FETCH(cpustate);
UINT32 ea = GetNonTranslatedEA(cpustate,modrm); UINT32 ea = GetNonTranslatedEA(cpustate,modrm,NULL);
STORE_REG16(modrm, ea); STORE_REG16(modrm, ea);
CYCLES(cpustate,CYCLES_LEA); 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); CYCLES(cpustate,CYCLES_BT_REG_REG);
} else { } else {
UINT32 ea = GetEA(cpustate,modrm,0); UINT8 segment;
UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
UINT32 bit = LOAD_REG32(modrm); UINT32 bit = LOAD_REG32(modrm);
ea += 4*(bit/32); 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; bit %= 32;
UINT32 dst = READ32(cpustate,ea); 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); STORE_RM32(modrm, dst);
CYCLES(cpustate,CYCLES_BTC_REG_REG); CYCLES(cpustate,CYCLES_BTC_REG_REG);
} else { } else {
UINT32 ea = GetEA(cpustate,modrm,1); UINT8 segment;
UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
UINT32 bit = LOAD_REG32(modrm); UINT32 bit = LOAD_REG32(modrm);
ea += 4*(bit/32); 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; bit %= 32;
UINT32 dst = READ32(cpustate,ea); 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); STORE_RM32(modrm, dst);
CYCLES(cpustate,CYCLES_BTR_REG_REG); CYCLES(cpustate,CYCLES_BTR_REG_REG);
} else { } else {
UINT32 ea = GetEA(cpustate,modrm,1); UINT8 segment;
UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
UINT32 bit = LOAD_REG32(modrm); UINT32 bit = LOAD_REG32(modrm);
ea += 4*(bit/32); 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; bit %= 32;
UINT32 dst = READ32(cpustate,ea); 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); STORE_RM32(modrm, dst);
CYCLES(cpustate,CYCLES_BTS_REG_REG); CYCLES(cpustate,CYCLES_BTS_REG_REG);
} else { } else {
UINT32 ea = GetEA(cpustate,modrm,1); UINT8 segment;
UINT32 ea = GetNonTranslatedEA(cpustate,modrm,&segment);
UINT32 bit = LOAD_REG32(modrm); UINT32 bit = LOAD_REG32(modrm);
ea += 4*(bit/32); 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; bit %= 32;
UINT32 dst = READ32(cpustate,ea); 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 static void I386OP(lea32)(i386_state *cpustate) // Opcode 0x8d
{ {
UINT8 modrm = FETCH(cpustate); UINT8 modrm = FETCH(cpustate);
UINT32 ea = GetNonTranslatedEA(cpustate,modrm); UINT32 ea = GetNonTranslatedEA(cpustate,modrm,NULL);
if (!cpustate->address_size) if (!cpustate->address_size)
{ {
ea &= 0xffff; ea &= 0xffff;