From 978c08c15ca7df14c84bca36257a569af40bf867 Mon Sep 17 00:00:00 2001 From: Aleksandar Andrejevic Date: Tue, 3 Dec 2013 01:30:15 +0000 Subject: [PATCH] [FAST486] Implement the BOUND instruction. svn path=/branches/ntvdm/; revision=61205 --- lib/fast486/opcodes.c | 98 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 95 insertions(+), 3 deletions(-) diff --git a/lib/fast486/opcodes.c b/lib/fast486/opcodes.c index ecba01ac160..8ea6eda6b5e 100644 --- a/lib/fast486/opcodes.c +++ b/lib/fast486/opcodes.c @@ -3524,10 +3524,102 @@ FAST486_OPCODE_HANDLER(Fast486OpcodePopAll) FAST486_OPCODE_HANDLER(Fast486OpcodeBound) { - // TODO: NOT IMPLEMENTED - UNIMPLEMENTED; + BOOLEAN OperandSize, AddressSize; + FAST486_MOD_REG_RM ModRegRm; + FAST486_SEG_REGS Segment = FAST486_REG_DS; - return FALSE; + 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) -- 2.17.1