[FAST486]
authorAleksandar Andrejevic <aandrejevic@reactos.org>
Sat, 2 May 2015 16:09:00 +0000 (16:09 +0000)
committerAleksandar Andrejevic <aandrejevic@reactos.org>
Sat, 2 May 2015 16:09:00 +0000 (16:09 +0000)
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

index 859009c..87dce03 100644 (file)
@@ -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)