Author: aandrejevic
Date: Sat May 2 16:09:00 2015
New Revision: 67512
URL:
http://svn.reactos.org/svn/reactos?rev=67512&view=rev
Log:
[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).
Modified:
trunk/reactos/lib/fast486/opcodes.c
Modified: trunk/reactos/lib/fast486/opcodes.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/fast486/opcodes.c?rev=…
==============================================================================
--- trunk/reactos/lib/fast486/opcodes.c [iso-8859-1] (original)
+++ trunk/reactos/lib/fast486/opcodes.c [iso-8859-1] Sat May 2 16:09:00 2015
@@ -3832,13 +3832,16 @@
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 @@
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)