X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=lib%2Fsoft386%2Fsoft386.c;h=feca57917d7ef0dffd4c38a3bb84e95eb6ef1119;hp=060ac2cea5d8ef12dcc952b4810b2b0914aa0a65;hb=0e8be812b029702f73006f7d778312741147ea91;hpb=3041ad03303b3e55d330a6f14053d6ea125b9eab diff --git a/lib/soft386/soft386.c b/lib/soft386/soft386.c index 060ac2cea5d..feca57917d7 100644 --- a/lib/soft386/soft386.c +++ b/lib/soft386/soft386.c @@ -56,8 +56,30 @@ Soft386ExecutionControl(PSOFT386_STATE State, INT Command) /* Main execution loop */ do { - /* If this is a new instruction, save the IP */ - if (State->PrefixFlags == 0) State->SavedInstPtr = State->InstPtr; + /* Check if this is a new instruction */ + if (State->PrefixFlags == 0) + { + State->SavedInstPtr = State->InstPtr; + + /* Check if interrupts are enabled and there is an interrupt pending */ + if (State->Flags.If && State->HardwareInt) + { + SOFT386_IDT_ENTRY IdtEntry; + + /* Get the interrupt vector */ + if (Soft386GetIntVector(State, State->PendingIntNum, &IdtEntry)) + { + /* Perform the interrupt */ + Soft386InterruptInternal(State, + IdtEntry.Selector, + MAKELONG(IdtEntry.Offset, IdtEntry.OffsetHigh), + IdtEntry.Type); + } + + /* Clear the interrupt pending flag */ + State->HardwareInt = FALSE; + } + } /* Perform an instruction fetch */ if (!Soft386FetchByte(State, &Opcode)) continue; @@ -273,27 +295,11 @@ Soft386Reset(PSOFT386_STATE State) VOID NTAPI -Soft386Interrupt(PSOFT386_STATE State, UCHAR Number, BOOLEAN Hardware) +Soft386Interrupt(PSOFT386_STATE State, UCHAR Number) { - SOFT386_IDT_ENTRY IdtEntry; - - if (Hardware) - { - /* Set the hardware interrupt flag */ - State->HardwareInt = TRUE; - } - - if (!Soft386GetIntVector(State, Number, &IdtEntry)) - { - /* An exception occurred, let the handler execute */ - return; - } - - /* Perform the interrupt */ - Soft386InterruptInternal(State, - IdtEntry.Selector, - MAKELONG(IdtEntry.Offset, IdtEntry.OffsetHigh), - IdtEntry.Type); + /* Set the hardware interrupt flag */ + State->HardwareInt = TRUE; + State->PendingIntNum = Number; } VOID