[NTVDM] : Implement getMSW and setMSW for getting and setting the Machine Status...
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Mon, 18 Nov 2013 20:25:10 +0000 (20:25 +0000)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Mon, 18 Nov 2013 20:25:10 +0000 (20:25 +0000)
[FAST486]: MSW = Machine Status Word

svn path=/branches/ntvdm/; revision=61044

lib/fast486/opgroups.c
subsystems/ntvdm/registers.c

index 9883310..232eb25 100644 (file)
@@ -1803,7 +1803,7 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeGroup0F01)
         /* SMSW */
         case 4:
         {
-            /* Store the lower 16 bits of CR0 */
+            /* Store the lower 16 bits (Machine Status Word) of CR0 */
             return Fast486WriteModrmWordOperands(State,
                                                  &ModRegRm,
                                                  FALSE,
@@ -1813,7 +1813,7 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeGroup0F01)
         /* LMSW */
         case 6:
         {
-            USHORT MasterStatusWord, Dummy;
+            USHORT MachineStatusWord, Dummy;
 
             /* This is a privileged instruction */
             if (Fast486GetCurrentPrivLevel(State) != 0)
@@ -1822,8 +1822,8 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeGroup0F01)
                 return FALSE;
             }
 
-            /* Read the new master status word */
-            if (!Fast486ReadModrmWordOperands(State, &ModRegRm, &Dummy, &MasterStatusWord))
+            /* Read the new Machine Status Word */
+            if (!Fast486ReadModrmWordOperands(State, &ModRegRm, &Dummy, &MachineStatusWord))
             {
                 /* Exception occurred */
                 return FALSE;
@@ -1831,7 +1831,7 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeGroup0F01)
 
             /* This instruction cannot be used to return to real mode */
             if ((State->ControlRegisters[FAST486_REG_CR0] & FAST486_CR0_PE)
-                && !(MasterStatusWord & FAST486_CR0_PE))
+                && !(MachineStatusWord & FAST486_CR0_PE))
             {
                 Fast486Exception(State, FAST486_EXCEPTION_GP);
                 return FALSE;
@@ -1839,7 +1839,7 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeGroup0F01)
 
             /* Set the lowest 4 bits */
             State->ControlRegisters[FAST486_REG_CR0] &= 0xFFFFFFF0;
-            State->ControlRegisters[FAST486_REG_CR0] |= MasterStatusWord & 0x0F;
+            State->ControlRegisters[FAST486_REG_CR0] |= MachineStatusWord & 0x0F;
 
             return TRUE;
         }
index 6481332..c8ab49c 100644 (file)
@@ -661,14 +661,16 @@ USHORT
 CDECL
 getMSW(VOID)
 {
-    return 0; // UNIMPLEMENTED
+    return LOWORD(EmulatorContext.ControlRegisters[FAST486_REG_CR0]);
 }
 
 VOID
 CDECL
 setMSW(USHORT Value)
 {
-    // UNIMPLEMENTED
+    /* Set the lowest word (8 bits) */
+    EmulatorContext.ControlRegisters[FAST486_REG_CR0] &= 0xFFFF0000;
+    EmulatorContext.ControlRegisters[FAST486_REG_CR0] |= Value & 0xFFFF;
 }
 
 /* EOF */