i386.cpp: XADD instructions must set flags based on sum result (nw)

This is required by winxp setup.
This commit is contained in:
yz70s 2018-08-04 10:20:35 +02:00
parent 19b5a17807
commit 676e372c6e

View File

@ -152,14 +152,16 @@ void i386_device::i486_xadd_rm8_r8() // Opcode 0x0f c0
if( modrm >= 0xc0 ) {
uint8_t dst = LOAD_RM8(modrm);
uint8_t src = LOAD_REG8(modrm);
uint8_t sum = ADD8(dst, src);
STORE_REG8(modrm, dst);
STORE_RM8(modrm, dst + src);
STORE_RM8(modrm, sum);
CYCLES(CYCLES_XADD_REG_REG);
} else {
uint32_t ea = GetEA(modrm,1);
uint8_t dst = READ8(ea);
uint8_t src = LOAD_REG8(modrm);
WRITE8(ea, dst + src);
uint8_t sum = ADD8(dst, src);
WRITE8(ea, sum);
STORE_REG8(modrm, dst);
CYCLES(CYCLES_XADD_REG_MEM);
}
@ -171,14 +173,16 @@ void i386_device::i486_xadd_rm16_r16() // Opcode 0x0f c1
if( modrm >= 0xc0 ) {
uint16_t dst = LOAD_RM16(modrm);
uint16_t src = LOAD_REG16(modrm);
uint16_t sum = ADD16(dst, src);
STORE_REG16(modrm, dst);
STORE_RM16(modrm, dst + src);
STORE_RM16(modrm, sum);
CYCLES(CYCLES_XADD_REG_REG);
} else {
uint32_t ea = GetEA(modrm,1);
uint16_t dst = READ16(ea);
uint16_t src = LOAD_REG16(modrm);
WRITE16(ea, dst + src);
uint16_t sum = ADD16(dst, src);
WRITE16(ea, sum);
STORE_REG16(modrm, dst);
CYCLES(CYCLES_XADD_REG_MEM);
}
@ -190,14 +194,16 @@ void i386_device::i486_xadd_rm32_r32() // Opcode 0x0f c1
if( modrm >= 0xc0 ) {
uint32_t dst = LOAD_RM32(modrm);
uint32_t src = LOAD_REG32(modrm);
uint32_t sum = ADD32(dst, src);
STORE_REG32(modrm, dst);
STORE_RM32(modrm, dst + src);
STORE_RM32(modrm, sum);
CYCLES(CYCLES_XADD_REG_REG);
} else {
uint32_t ea = GetEA(modrm,1);
uint32_t dst = READ32(ea);
uint32_t src = LOAD_REG32(modrm);
WRITE32(ea, dst + src);
uint32_t sum = ADD32(dst, src);
WRITE32(ea, sum);
STORE_REG32(modrm, dst);
CYCLES(CYCLES_XADD_REG_MEM);
}