From a4901dfae522feca1fba3858a720e3ae687113db Mon Sep 17 00:00:00 2001 From: Aleksandar Andrejevic Date: Sat, 2 May 2015 16:09:00 +0000 Subject: [PATCH] [FAST486] When storing a segment selector, the operand size attribute is only ignored when writing to memory (where it's treated as if it's always 16-bit). svn path=/trunk/; revision=67512 --- reactos/lib/fast486/opcodes.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/reactos/lib/fast486/opcodes.c b/reactos/lib/fast486/opcodes.c index 859009c3a9b..87dce030b45 100644 --- a/reactos/lib/fast486/opcodes.c +++ b/reactos/lib/fast486/opcodes.c @@ -3832,13 +3832,16 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeMovModrm) FAST486_OPCODE_HANDLER(Fast486OpcodeMovStoreSeg) { - BOOLEAN AddressSize = State->SegmentRegs[FAST486_REG_CS].Size; + BOOLEAN OperandSize, AddressSize; FAST486_MOD_REG_RM ModRegRm; /* Make sure this is the right instruction */ ASSERT(Opcode == 0x8C); + OperandSize = AddressSize = State->SegmentRegs[FAST486_REG_CS].Size; + TOGGLE_ADSIZE(AddressSize); + TOGGLE_OPSIZE(OperandSize); /* Get the operands */ if (!Fast486ParseModRegRm(State, AddressSize, &ModRegRm)) @@ -3854,10 +3857,21 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeMovStoreSeg) return; } - Fast486WriteModrmWordOperands(State, - &ModRegRm, - FALSE, - State->SegmentRegs[ModRegRm.Register].Selector); + /* When the other operand is a memory location, always use 16-bit */ + if (OperandSize && !ModRegRm.Memory) + { + Fast486WriteModrmDwordOperands(State, + &ModRegRm, + FALSE, + State->SegmentRegs[ModRegRm.Register].Selector); + } + else + { + Fast486WriteModrmWordOperands(State, + &ModRegRm, + FALSE, + State->SegmentRegs[ModRegRm.Register].Selector); + } } FAST486_OPCODE_HANDLER(Fast486OpcodeLea)