From 8998a96d565320610b4e58d38da6f4afcf387608 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Mon, 18 Nov 2013 20:25:10 +0000 Subject: [PATCH] [NTVDM] : Implement getMSW and setMSW for getting and setting the Machine Status Word (lower word of CR0). [FAST486]: MSW = Machine Status Word svn path=/branches/ntvdm/; revision=61044 --- lib/fast486/opgroups.c | 12 ++++++------ subsystems/ntvdm/registers.c | 6 ++++-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/fast486/opgroups.c b/lib/fast486/opgroups.c index 98833107bb5..232eb25a5bf 100644 --- a/lib/fast486/opgroups.c +++ b/lib/fast486/opgroups.c @@ -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; } diff --git a/subsystems/ntvdm/registers.c b/subsystems/ntvdm/registers.c index 648133254c3..c8ab49cdf5e 100644 --- a/subsystems/ntvdm/registers.c +++ b/subsystems/ntvdm/registers.c @@ -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 */