mirror of
https://github.com/reactos/reactos.git
synced 2025-07-15 21:34:02 +00:00
[FAST486]
Check for interrupts at the end of a cycle, to avoid confusing debug output. svn path=/branches/ntvdm/; revision=60956
This commit is contained in:
parent
b781febbfe
commit
92d4dd2b64
1 changed files with 37 additions and 42 deletions
|
@ -55,42 +55,7 @@ Fast486ExecutionControl(PFAST486_STATE State, INT Command)
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
/* Check if this is a new instruction */
|
/* Check if this is a new instruction */
|
||||||
if (State->PrefixFlags == 0)
|
if (State->PrefixFlags == 0) State->SavedInstPtr = State->InstPtr;
|
||||||
{
|
|
||||||
State->SavedInstPtr = State->InstPtr;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check if there is an interrupt to execute, or a hardware interrupt signal
|
|
||||||
* while interrupts are enabled.
|
|
||||||
*/
|
|
||||||
if (State->IntStatus == FAST486_INT_EXECUTE)
|
|
||||||
{
|
|
||||||
FAST486_IDT_ENTRY IdtEntry;
|
|
||||||
|
|
||||||
/* Get the interrupt vector */
|
|
||||||
if (Fast486GetIntVector(State, State->PendingIntNum, &IdtEntry))
|
|
||||||
{
|
|
||||||
/* Perform the interrupt */
|
|
||||||
Fast486InterruptInternal(State,
|
|
||||||
IdtEntry.Selector,
|
|
||||||
MAKELONG(IdtEntry.Offset, IdtEntry.OffsetHigh),
|
|
||||||
IdtEntry.Type);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Clear the interrupt status */
|
|
||||||
State->IntStatus = FAST486_INT_NONE;
|
|
||||||
}
|
|
||||||
else if (State->Flags.If
|
|
||||||
&& (State->IntAckCallback != NULL)
|
|
||||||
&& (State->IntStatus == FAST486_INT_SIGNAL))
|
|
||||||
{
|
|
||||||
/* Acknowledge the interrupt to get the number */
|
|
||||||
State->PendingIntNum = State->IntAckCallback(State);
|
|
||||||
|
|
||||||
/* Set the interrupt status to execute on the next instruction */
|
|
||||||
State->IntStatus = FAST486_INT_EXECUTE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Perform an instruction fetch */
|
/* Perform an instruction fetch */
|
||||||
if (!Fast486FetchByte(State, &Opcode)) continue;
|
if (!Fast486FetchByte(State, &Opcode)) continue;
|
||||||
|
@ -108,16 +73,46 @@ Fast486ExecutionControl(PFAST486_STATE State, INT Command)
|
||||||
Fast486Exception(State, FAST486_EXCEPTION_UD);
|
Fast486Exception(State, FAST486_EXCEPTION_UD);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Fast486OpcodeHandlers[Opcode] != Fast486OpcodePrefix)
|
if (Fast486OpcodeHandlers[Opcode] == Fast486OpcodePrefix)
|
||||||
{
|
|
||||||
/* A non-prefix opcode has been executed, reset the prefix flags */
|
|
||||||
State->PrefixFlags = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
/* This is a prefix, go to the next instruction immediately */
|
/* This is a prefix, go to the next instruction immediately */
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* A non-prefix opcode has been executed, reset the prefix flags */
|
||||||
|
State->PrefixFlags = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check if there is an interrupt to execute, or a hardware interrupt signal
|
||||||
|
* while interrupts are enabled.
|
||||||
|
*/
|
||||||
|
if (State->IntStatus == FAST486_INT_EXECUTE)
|
||||||
|
{
|
||||||
|
FAST486_IDT_ENTRY IdtEntry;
|
||||||
|
|
||||||
|
/* Get the interrupt vector */
|
||||||
|
if (Fast486GetIntVector(State, State->PendingIntNum, &IdtEntry))
|
||||||
|
{
|
||||||
|
/* Perform the interrupt */
|
||||||
|
Fast486InterruptInternal(State,
|
||||||
|
IdtEntry.Selector,
|
||||||
|
MAKELONG(IdtEntry.Offset, IdtEntry.OffsetHigh),
|
||||||
|
IdtEntry.Type);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clear the interrupt status */
|
||||||
|
State->IntStatus = FAST486_INT_NONE;
|
||||||
|
}
|
||||||
|
else if (State->Flags.If
|
||||||
|
&& (State->IntAckCallback != NULL)
|
||||||
|
&& (State->IntStatus == FAST486_INT_SIGNAL))
|
||||||
|
{
|
||||||
|
/* Acknowledge the interrupt to get the number */
|
||||||
|
State->PendingIntNum = State->IntAckCallback(State);
|
||||||
|
|
||||||
|
/* Set the interrupt status to execute on the next instruction */
|
||||||
|
State->IntStatus = FAST486_INT_EXECUTE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
while ((Command == FAST486_CONTINUE)
|
while ((Command == FAST486_CONTINUE)
|
||||||
|| (Command == FAST486_STEP_OVER && ProcedureCallCount > 0)
|
|| (Command == FAST486_STEP_OVER && ProcedureCallCount > 0)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue