mirror of
https://github.com/holub/mame
synced 2025-04-25 09:50:04 +03:00
i386: fix for bt? instructions [Carl]
This commit is contained in:
parent
bf53bd7a6b
commit
0098f14e66
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user