From 0098f14e668ddf01495f7e86cc3e633305f9e95e Mon Sep 17 00:00:00 2001 From: mahlemiut Date: Mon, 30 Apr 2012 01:47:43 +0000 Subject: [PATCH] i386: fix for bt? instructions [Carl] --- src/emu/cpu/i386/i386.c | 3 ++- src/emu/cpu/i386/i386op16.c | 22 +++++++++++++--------- src/emu/cpu/i386/i386op32.c | 22 +++++++++++++--------- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/emu/cpu/i386/i386.c b/src/emu/cpu/i386/i386.c index 2d503681667..02493b07082 100644 --- a/src/emu/cpu/i386/i386.c +++ b/src/emu/cpu/i386/i386.c @@ -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; } diff --git a/src/emu/cpu/i386/i386op16.c b/src/emu/cpu/i386/i386op16.c index 9444c2a6c0d..635ae648b5b 100644 --- a/src/emu/cpu/i386/i386op16.c +++ b/src/emu/cpu/i386/i386op16.c @@ -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); } diff --git a/src/emu/cpu/i386/i386op32.c b/src/emu/cpu/i386/i386op32.c index a15c0828cd8..5133c20690d 100644 --- a/src/emu/cpu/i386/i386op32.c +++ b/src/emu/cpu/i386/i386op32.c @@ -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;