diff --git a/lib/fast486/common.c b/lib/fast486/common.c index 42b7b962204..d41c7c8257b 100644 --- a/lib/fast486/common.c +++ b/lib/fast486/common.c @@ -240,6 +240,14 @@ Fast486InterruptInternal(PFAST486_STATE State, if (!Fast486StackPush(State, OldEsp)) return FALSE; } } + else + { + if (State->SegmentRegs[FAST486_REG_CS].Size) + { + /* Set OPSIZE, because INT always pushes 16-bit values in real mode */ + State->PrefixFlags |= FAST486_PREFIX_OPSIZE; + } + } /* Push EFLAGS */ if (!Fast486StackPush(State, State->Flags.Long)) return FALSE; diff --git a/lib/fast486/common.inl b/lib/fast486/common.inl index a6ad252c346..1297b246dd0 100644 --- a/lib/fast486/common.inl +++ b/lib/fast486/common.inl @@ -730,6 +730,17 @@ Fast486ParseModRegRm(PFAST486_STATE State, } } + if ((SibByte & 0x07) == FAST486_REG_ESP) + { + /* Check if there is no segment override */ + if (!(State->PrefixFlags & FAST486_PREFIX_SEG)) + { + /* Add a SS: prefix */ + State->PrefixFlags |= FAST486_PREFIX_SEG; + State->SegmentOverride = FAST486_REG_SS; + } + } + /* Calculate the address */ ModRegRm->MemoryAddress = Base + Index * Scale; }