mirror of
https://github.com/reactos/reactos.git
synced 2024-08-13 14:47:31 +00:00
[FAST486]
Implement the HLT instruction. Remove the IdleCallback, since it's unused and probably won't be used. (The load reduction will be implemented in NTVDM instead.) svn path=/trunk/; revision=64823
This commit is contained in:
parent
50e22a432f
commit
c46f3aa372
|
@ -207,13 +207,6 @@ VOID
|
||||||
UCHAR DataSize
|
UCHAR DataSize
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef
|
|
||||||
VOID
|
|
||||||
(NTAPI *FAST486_IDLE_PROC)
|
|
||||||
(
|
|
||||||
PFAST486_STATE State
|
|
||||||
);
|
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
VOID
|
VOID
|
||||||
(NTAPI *FAST486_BOP_PROC)
|
(NTAPI *FAST486_BOP_PROC)
|
||||||
|
@ -474,7 +467,6 @@ struct _FAST486_STATE
|
||||||
FAST486_MEM_WRITE_PROC MemWriteCallback;
|
FAST486_MEM_WRITE_PROC MemWriteCallback;
|
||||||
FAST486_IO_READ_PROC IoReadCallback;
|
FAST486_IO_READ_PROC IoReadCallback;
|
||||||
FAST486_IO_WRITE_PROC IoWriteCallback;
|
FAST486_IO_WRITE_PROC IoWriteCallback;
|
||||||
FAST486_IDLE_PROC IdleCallback;
|
|
||||||
FAST486_BOP_PROC BopCallback;
|
FAST486_BOP_PROC BopCallback;
|
||||||
FAST486_INT_ACK_PROC IntAckCallback;
|
FAST486_INT_ACK_PROC IntAckCallback;
|
||||||
FAST486_REG GeneralRegs[FAST486_NUM_GEN_REGS];
|
FAST486_REG GeneralRegs[FAST486_NUM_GEN_REGS];
|
||||||
|
@ -490,6 +482,7 @@ struct _FAST486_STATE
|
||||||
ULONG ExceptionCount;
|
ULONG ExceptionCount;
|
||||||
ULONG PrefixFlags;
|
ULONG PrefixFlags;
|
||||||
FAST486_SEG_REGS SegmentOverride;
|
FAST486_SEG_REGS SegmentOverride;
|
||||||
|
BOOLEAN Halted;
|
||||||
FAST486_INT_STATUS IntStatus;
|
FAST486_INT_STATUS IntStatus;
|
||||||
UCHAR PendingIntNum;
|
UCHAR PendingIntNum;
|
||||||
PULONG Tlb;
|
PULONG Tlb;
|
||||||
|
@ -510,7 +503,6 @@ Fast486Initialize(PFAST486_STATE State,
|
||||||
FAST486_MEM_WRITE_PROC MemWriteCallback,
|
FAST486_MEM_WRITE_PROC MemWriteCallback,
|
||||||
FAST486_IO_READ_PROC IoReadCallback,
|
FAST486_IO_READ_PROC IoReadCallback,
|
||||||
FAST486_IO_WRITE_PROC IoWriteCallback,
|
FAST486_IO_WRITE_PROC IoWriteCallback,
|
||||||
FAST486_IDLE_PROC IdleCallback,
|
|
||||||
FAST486_BOP_PROC BopCallback,
|
FAST486_BOP_PROC BopCallback,
|
||||||
FAST486_INT_ACK_PROC IntAckCallback,
|
FAST486_INT_ACK_PROC IntAckCallback,
|
||||||
PULONG Tlb);
|
PULONG Tlb);
|
||||||
|
|
|
@ -55,35 +55,41 @@ Fast486ExecutionControl(PFAST486_STATE State, FAST486_EXEC_CMD Command)
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
NextInst:
|
NextInst:
|
||||||
/* Check if this is a new instruction */
|
if (!State->Halted)
|
||||||
if (State->PrefixFlags == 0) State->SavedInstPtr = State->InstPtr;
|
|
||||||
|
|
||||||
/* Perform an instruction fetch */
|
|
||||||
if (!Fast486FetchByte(State, &Opcode))
|
|
||||||
{
|
{
|
||||||
/* Exception occurred */
|
/* Check if this is a new instruction */
|
||||||
|
if (State->PrefixFlags == 0) State->SavedInstPtr = State->InstPtr;
|
||||||
|
|
||||||
|
/* Perform an instruction fetch */
|
||||||
|
if (!Fast486FetchByte(State, &Opcode))
|
||||||
|
{
|
||||||
|
/* Exception occurred */
|
||||||
|
State->PrefixFlags = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Check for CALL/RET to update ProcedureCallCount.
|
||||||
|
|
||||||
|
/* Call the opcode handler */
|
||||||
|
CurrentHandler = Fast486OpcodeHandlers[Opcode];
|
||||||
|
CurrentHandler(State, Opcode);
|
||||||
|
|
||||||
|
/* If this is a prefix, go to the next instruction immediately */
|
||||||
|
if (CurrentHandler == Fast486OpcodePrefix) goto NextInst;
|
||||||
|
|
||||||
|
/* A non-prefix opcode has been executed, reset the prefix flags */
|
||||||
State->PrefixFlags = 0;
|
State->PrefixFlags = 0;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Check for CALL/RET to update ProcedureCallCount.
|
|
||||||
|
|
||||||
/* Call the opcode handler */
|
|
||||||
CurrentHandler = Fast486OpcodeHandlers[Opcode];
|
|
||||||
CurrentHandler(State, Opcode);
|
|
||||||
|
|
||||||
/* If this is a prefix, go to the next instruction immediately */
|
|
||||||
if (CurrentHandler == Fast486OpcodePrefix) goto NextInst;
|
|
||||||
|
|
||||||
/* 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
|
* Check if there is an interrupt to execute, or a hardware interrupt signal
|
||||||
* while interrupts are enabled.
|
* while interrupts are enabled.
|
||||||
*/
|
*/
|
||||||
if (State->Flags.Tf)
|
if (State->Flags.Tf)
|
||||||
{
|
{
|
||||||
|
/* No longer halted */
|
||||||
|
State->Halted = FALSE;
|
||||||
|
|
||||||
/* Perform the interrupt */
|
/* Perform the interrupt */
|
||||||
Fast486PerformInterrupt(State, 0x01);
|
Fast486PerformInterrupt(State, 0x01);
|
||||||
|
|
||||||
|
@ -163,13 +169,6 @@ Fast486IoWriteCallback(PFAST486_STATE State, ULONG Port, PVOID Buffer, ULONG Dat
|
||||||
UNREFERENCED_PARAMETER(DataSize);
|
UNREFERENCED_PARAMETER(DataSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VOID
|
|
||||||
NTAPI
|
|
||||||
Fast486IdleCallback(PFAST486_STATE State)
|
|
||||||
{
|
|
||||||
UNREFERENCED_PARAMETER(State);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VOID
|
static VOID
|
||||||
NTAPI
|
NTAPI
|
||||||
Fast486BopCallback(PFAST486_STATE State, UCHAR BopCode)
|
Fast486BopCallback(PFAST486_STATE State, UCHAR BopCode)
|
||||||
|
@ -197,7 +196,6 @@ Fast486Initialize(PFAST486_STATE State,
|
||||||
FAST486_MEM_WRITE_PROC MemWriteCallback,
|
FAST486_MEM_WRITE_PROC MemWriteCallback,
|
||||||
FAST486_IO_READ_PROC IoReadCallback,
|
FAST486_IO_READ_PROC IoReadCallback,
|
||||||
FAST486_IO_WRITE_PROC IoWriteCallback,
|
FAST486_IO_WRITE_PROC IoWriteCallback,
|
||||||
FAST486_IDLE_PROC IdleCallback,
|
|
||||||
FAST486_BOP_PROC BopCallback,
|
FAST486_BOP_PROC BopCallback,
|
||||||
FAST486_INT_ACK_PROC IntAckCallback,
|
FAST486_INT_ACK_PROC IntAckCallback,
|
||||||
PULONG Tlb)
|
PULONG Tlb)
|
||||||
|
@ -207,7 +205,6 @@ Fast486Initialize(PFAST486_STATE State,
|
||||||
State->MemWriteCallback = (MemWriteCallback ? MemWriteCallback : Fast486MemWriteCallback);
|
State->MemWriteCallback = (MemWriteCallback ? MemWriteCallback : Fast486MemWriteCallback);
|
||||||
State->IoReadCallback = (IoReadCallback ? IoReadCallback : Fast486IoReadCallback );
|
State->IoReadCallback = (IoReadCallback ? IoReadCallback : Fast486IoReadCallback );
|
||||||
State->IoWriteCallback = (IoWriteCallback ? IoWriteCallback : Fast486IoWriteCallback );
|
State->IoWriteCallback = (IoWriteCallback ? IoWriteCallback : Fast486IoWriteCallback );
|
||||||
State->IdleCallback = (IdleCallback ? IdleCallback : Fast486IdleCallback );
|
|
||||||
State->BopCallback = (BopCallback ? BopCallback : Fast486BopCallback );
|
State->BopCallback = (BopCallback ? BopCallback : Fast486BopCallback );
|
||||||
State->IntAckCallback = (IntAckCallback ? IntAckCallback : Fast486IntAckCallback );
|
State->IntAckCallback = (IntAckCallback ? IntAckCallback : Fast486IntAckCallback );
|
||||||
|
|
||||||
|
@ -229,7 +226,6 @@ Fast486Reset(PFAST486_STATE State)
|
||||||
FAST486_MEM_WRITE_PROC MemWriteCallback = State->MemWriteCallback;
|
FAST486_MEM_WRITE_PROC MemWriteCallback = State->MemWriteCallback;
|
||||||
FAST486_IO_READ_PROC IoReadCallback = State->IoReadCallback;
|
FAST486_IO_READ_PROC IoReadCallback = State->IoReadCallback;
|
||||||
FAST486_IO_WRITE_PROC IoWriteCallback = State->IoWriteCallback;
|
FAST486_IO_WRITE_PROC IoWriteCallback = State->IoWriteCallback;
|
||||||
FAST486_IDLE_PROC IdleCallback = State->IdleCallback;
|
|
||||||
FAST486_BOP_PROC BopCallback = State->BopCallback;
|
FAST486_BOP_PROC BopCallback = State->BopCallback;
|
||||||
FAST486_INT_ACK_PROC IntAckCallback = State->IntAckCallback;
|
FAST486_INT_ACK_PROC IntAckCallback = State->IntAckCallback;
|
||||||
PULONG Tlb = State->Tlb;
|
PULONG Tlb = State->Tlb;
|
||||||
|
@ -283,7 +279,6 @@ Fast486Reset(PFAST486_STATE State)
|
||||||
State->MemWriteCallback = MemWriteCallback;
|
State->MemWriteCallback = MemWriteCallback;
|
||||||
State->IoReadCallback = IoReadCallback;
|
State->IoReadCallback = IoReadCallback;
|
||||||
State->IoWriteCallback = IoWriteCallback;
|
State->IoWriteCallback = IoWriteCallback;
|
||||||
State->IdleCallback = IdleCallback;
|
|
||||||
State->BopCallback = BopCallback;
|
State->BopCallback = BopCallback;
|
||||||
State->IntAckCallback = IntAckCallback;
|
State->IntAckCallback = IntAckCallback;
|
||||||
State->Tlb = Tlb;
|
State->Tlb = Tlb;
|
||||||
|
|
|
@ -574,12 +574,6 @@ FAST486_OPCODE_HANDLER(Fast486OpcodePopReg)
|
||||||
|
|
||||||
FAST486_OPCODE_HANDLER(Fast486OpcodeNop)
|
FAST486_OPCODE_HANDLER(Fast486OpcodeNop)
|
||||||
{
|
{
|
||||||
if (State->PrefixFlags & FAST486_PREFIX_REP)
|
|
||||||
{
|
|
||||||
/* Idle cycle */
|
|
||||||
State->IdleCallback(State);
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -895,7 +889,7 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeHalt)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Halt */
|
/* Halt */
|
||||||
// TODO: Halt the CPU until an interrupt occurs, using IdleCallback if needed.
|
State->Halted = TRUE;
|
||||||
|
|
||||||
/* Return success */
|
/* Return success */
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
|
@ -163,7 +163,6 @@ BOOLEAN CpuInitialize(VOID)
|
||||||
EmulatorWriteMemory,
|
EmulatorWriteMemory,
|
||||||
EmulatorReadIo,
|
EmulatorReadIo,
|
||||||
EmulatorWriteIo,
|
EmulatorWriteIo,
|
||||||
NULL,
|
|
||||||
EmulatorBiosOperation,
|
EmulatorBiosOperation,
|
||||||
EmulatorIntAcknowledge,
|
EmulatorIntAcknowledge,
|
||||||
NULL /* TODO: Use a TLB */);
|
NULL /* TODO: Use a TLB */);
|
||||||
|
|
Loading…
Reference in a new issue