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)