UCHAR Number,
PFAST486_IDT_ENTRY IdtEntry)
{
- ULONG FarPointer;
-
/* Check for protected mode */
if (State->ControlRegisters[FAST486_REG_CR0] & FAST486_CR0_PE)
{
else
{
/* Read from the real-mode IVT */
+ ULONG FarPointer;
/* Paging is always disabled in real mode */
State->MemReadCallback(State,
USHORT SegmentSelector = IdtEntry->Selector;
ULONG Offset = MAKELONG(IdtEntry->Offset, IdtEntry->OffsetHigh);
ULONG GateType = IdtEntry->Type;
+ BOOLEAN GateSize = (GateType == FAST486_IDT_INT_GATE_32) ||
+ (GateType == FAST486_IDT_TRAP_GATE_32);
- BOOLEAN GateSize = (GateType == FAST486_IDT_INT_GATE_32)
- || (GateType == FAST486_IDT_TRAP_GATE_32);
BOOLEAN Success = FALSE;
ULONG OldPrefixFlags = State->PrefixFlags;
ULONG Source, Destination, Result;
if (!Fast486ReadModrmDwordOperands(State,
- &ModRegRm,
- &Source,
- &Destination))
+ &ModRegRm,
+ &Source,
+ &Destination))
{
/* Exception occurred */
return FALSE;
/* Find the largest exponent */
TempResult.Exponent = max(FirstOperand->Exponent, SecondOperand->Exponent);
- /* Adjust the first operand to it */
+ /* Adjust the first operand to it... */
if (FirstAdjusted.Exponent < TempResult.Exponent)
{
FirstAdjusted.Mantissa >>= (TempResult.Exponent - FirstAdjusted.Exponent);
Fast486OpcodeOutByte, /* 0xEE */
Fast486OpcodeOut, /* 0xEF */
Fast486OpcodePrefix, /* 0xF0 */
- Fast486OpcodeInvalid, /* 0xF1 */ // Invalid opcode
+ Fast486OpcodeInvalid, /* 0xF1 */ // Invalid opcode -- ICEBP/INT01 opcode
Fast486OpcodePrefix, /* 0xF2 */
Fast486OpcodePrefix, /* 0xF3 */
Fast486OpcodeHalt, /* 0xF4 */
FAST486_OPCODE_HANDLER(Fast486OpcodeInvalid)
{
- /* This is not a valid opcode */
+ /*
+ * This is not a valid opcode.
+ * Well, not totally: see http://www.rcollins.org/secrets/opcodes/ICEBP.html
+ * for more details.
+ */
+ DPRINT1("FAST486 -- Calling ICEBP opcode\n");
Fast486Exception(State, FAST486_EXCEPTION_UD);
return FALSE;
}
FAST486_OPCODE_HANDLER(Fast486OpcodeSalc)
{
+ /*
+ * See: http://www.rcollins.org/secrets/opcodes/SALC.html
+ * for more information.
+ */
+
/* Make sure this is the right instruction */
ASSERT(Opcode == 0xD6);