From 60a7ff2e92c85e1215d5bf2dbc4b78fa3a1609fc Mon Sep 17 00:00:00 2001 From: Aleksandar Andrejevic Date: Sat, 21 Sep 2013 02:33:01 +0000 Subject: [PATCH] [SOFT386] Implement the PUSHF instruction. svn path=/branches/ntvdm/; revision=60261 --- lib/soft386/opcodes.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/lib/soft386/opcodes.c b/lib/soft386/opcodes.c index 3632f4024e5..13d0480aa6e 100644 --- a/lib/soft386/opcodes.c +++ b/lib/soft386/opcodes.c @@ -4132,10 +4132,32 @@ SOFT386_OPCODE_HANDLER(Soft386OpcodeWait) SOFT386_OPCODE_HANDLER(Soft386OpcodePushFlags) { - // TODO: NOT IMPLEMENTED - UNIMPLEMENTED; + BOOLEAN Size = State->SegmentRegs[SOFT386_REG_CS].Size; - return FALSE; + if (State->PrefixFlags & SOFT386_PREFIX_LOCK) + { + /* Invalid prefix */ + Soft386Exception(State, SOFT386_EXCEPTION_UD); + return FALSE; + } + + if (State->PrefixFlags & SOFT386_PREFIX_OPSIZE) + { + /* This OPSIZE prefix toggles the size */ + Size = !Size; + } + + /* Check for VM86 mode when IOPL is not 3 */ + if (State->Flags.Vm && (State->Flags.Iopl != 3)) + { + /* Call the VM86 monitor */ + Soft386ExceptionWithErrorCode(State, SOFT386_EXCEPTION_GP, 0); + return FALSE; + } + + /* Push the flags */ + if (Size) return Soft386StackPush(State, State->Flags.Long); + else return Soft386StackPush(State, LOWORD(State->Flags.Long)); } SOFT386_OPCODE_HANDLER(Soft386OpcodePopFlags)