Author: aandrejevic Date: Tue Dec 3 01:30:15 2013 New Revision: 61205
URL: http://svn.reactos.org/svn/reactos?rev=61205&view=rev Log: [FAST486] Implement the BOUND instruction.
Modified: branches/ntvdm/lib/fast486/opcodes.c
Modified: branches/ntvdm/lib/fast486/opcodes.c URL: http://svn.reactos.org/svn/reactos/branches/ntvdm/lib/fast486/opcodes.c?rev=... ============================================================================== --- branches/ntvdm/lib/fast486/opcodes.c [iso-8859-1] (original) +++ branches/ntvdm/lib/fast486/opcodes.c [iso-8859-1] Tue Dec 3 01:30:15 2013 @@ -3524,10 +3524,102 @@
FAST486_OPCODE_HANDLER(Fast486OpcodeBound) { - // TODO: NOT IMPLEMENTED - UNIMPLEMENTED; - - return FALSE; + BOOLEAN OperandSize, AddressSize; + FAST486_MOD_REG_RM ModRegRm; + FAST486_SEG_REGS Segment = FAST486_REG_DS; + + OperandSize = AddressSize = State->SegmentRegs[FAST486_REG_CS].Size; + + NO_LOCK_PREFIX(); + TOGGLE_OPSIZE(OperandSize); + TOGGLE_ADSIZE(AddressSize); + + if (!Fast486ParseModRegRm(State, AddressSize, &ModRegRm)) + { + /* Exception occurred */ + return FALSE; + } + + if (!ModRegRm.Memory) + { + /* Invalid */ + Fast486Exception(State, FAST486_EXCEPTION_UD); + return FALSE; + } + + /* Check for the segment override */ + if (State->PrefixFlags & FAST486_PREFIX_SEG) + { + /* Use the override segment instead */ + Segment = State->SegmentOverride; + } + + if (OperandSize) + { + LONG Index, LowerBound, UpperBound; + + /* Read the operands */ + if (!Fast486ReadModrmDwordOperands(State, + &ModRegRm, + (PULONG)&Index, + (PULONG)&LowerBound)) + { + /* Exception occurred */ + return FALSE; + } + + if (!Fast486ReadMemory(State, + Segment, + ModRegRm.MemoryAddress + sizeof(ULONG), + FALSE, + &UpperBound, + sizeof(ULONG))) + { + /* Exception occurred */ + return FALSE; + } + + if ((Index < LowerBound) || (Index > UpperBound)) + { + /* Out of bounds */ + Fast486Exception(State, FAST486_EXCEPTION_BR); + return FALSE; + } + } + else + { + SHORT Index, LowerBound, UpperBound; + + /* Read the operands */ + if (!Fast486ReadModrmWordOperands(State, + &ModRegRm, + (PUSHORT)&Index, + (PUSHORT)&LowerBound)) + { + /* Exception occurred */ + return FALSE; + } + + if (!Fast486ReadMemory(State, + Segment, + ModRegRm.MemoryAddress + sizeof(USHORT), + FALSE, + &UpperBound, + sizeof(USHORT))) + { + /* Exception occurred */ + return FALSE; + } + + if ((Index < LowerBound) || (Index > UpperBound)) + { + /* Out of bounds */ + Fast486Exception(State, FAST486_EXCEPTION_BR); + return FALSE; + } + } + + return TRUE; }
FAST486_OPCODE_HANDLER(Fast486OpcodeArpl)