mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 01:15:09 +00:00
[FAST486][NTVDM]
Use an external interrupt for the FPU when the NE bit of CR0 is cleared. svn path=/trunk/; revision=65961
This commit is contained in:
parent
c765ca5556
commit
44c816e20c
6 changed files with 41 additions and 2 deletions
|
@ -227,6 +227,13 @@ UCHAR
|
|||
PFAST486_STATE State
|
||||
);
|
||||
|
||||
typedef
|
||||
VOID
|
||||
(NTAPI *FAST486_FPU_PROC)
|
||||
(
|
||||
PFAST486_STATE State
|
||||
);
|
||||
|
||||
typedef union _FAST486_REG
|
||||
{
|
||||
union
|
||||
|
@ -473,6 +480,7 @@ struct _FAST486_STATE
|
|||
FAST486_IO_WRITE_PROC IoWriteCallback;
|
||||
FAST486_BOP_PROC BopCallback;
|
||||
FAST486_INT_ACK_PROC IntAckCallback;
|
||||
FAST486_FPU_PROC FpuCallback;
|
||||
FAST486_REG GeneralRegs[FAST486_NUM_GEN_REGS];
|
||||
FAST486_SEG_REG SegmentRegs[FAST486_NUM_SEG_REGS];
|
||||
FAST486_REG InstPtr, SavedInstPtr;
|
||||
|
@ -514,6 +522,7 @@ Fast486Initialize(PFAST486_STATE State,
|
|||
FAST486_IO_WRITE_PROC IoWriteCallback,
|
||||
FAST486_BOP_PROC BopCallback,
|
||||
FAST486_INT_ACK_PROC IntAckCallback,
|
||||
FAST486_FPU_PROC FpuCallback,
|
||||
PULONG Tlb);
|
||||
|
||||
VOID
|
||||
|
|
|
@ -179,6 +179,12 @@ Fast486IntAckCallback(PFAST486_STATE State)
|
|||
return 0x01;
|
||||
}
|
||||
|
||||
static VOID NTAPI
|
||||
Fast486FpuCallback(PFAST486_STATE State)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(State);
|
||||
}
|
||||
|
||||
/* PUBLIC FUNCTIONS ***********************************************************/
|
||||
|
||||
VOID
|
||||
|
@ -190,6 +196,7 @@ Fast486Initialize(PFAST486_STATE State,
|
|||
FAST486_IO_WRITE_PROC IoWriteCallback,
|
||||
FAST486_BOP_PROC BopCallback,
|
||||
FAST486_INT_ACK_PROC IntAckCallback,
|
||||
FAST486_FPU_PROC FpuCallback,
|
||||
PULONG Tlb)
|
||||
{
|
||||
/* Set the callbacks (or use default ones if some are NULL) */
|
||||
|
@ -199,6 +206,7 @@ Fast486Initialize(PFAST486_STATE State,
|
|||
State->IoWriteCallback = (IoWriteCallback ? IoWriteCallback : Fast486IoWriteCallback );
|
||||
State->BopCallback = (BopCallback ? BopCallback : Fast486BopCallback );
|
||||
State->IntAckCallback = (IntAckCallback ? IntAckCallback : Fast486IntAckCallback );
|
||||
State->FpuCallback = (FpuCallback ? FpuCallback : Fast486FpuCallback );
|
||||
|
||||
/* Set the TLB (if given) */
|
||||
State->Tlb = Tlb;
|
||||
|
@ -220,6 +228,7 @@ Fast486Reset(PFAST486_STATE State)
|
|||
FAST486_IO_WRITE_PROC IoWriteCallback = State->IoWriteCallback;
|
||||
FAST486_BOP_PROC BopCallback = State->BopCallback;
|
||||
FAST486_INT_ACK_PROC IntAckCallback = State->IntAckCallback;
|
||||
FAST486_FPU_PROC FpuCallback = State->FpuCallback;
|
||||
PULONG Tlb = State->Tlb;
|
||||
|
||||
/* Clear the entire structure */
|
||||
|
@ -273,6 +282,7 @@ Fast486Reset(PFAST486_STATE State)
|
|||
State->IoWriteCallback = IoWriteCallback;
|
||||
State->BopCallback = BopCallback;
|
||||
State->IntAckCallback = IntAckCallback;
|
||||
State->FpuCallback = FpuCallback;
|
||||
State->Tlb = Tlb;
|
||||
}
|
||||
|
||||
|
|
|
@ -4125,8 +4125,16 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeWait)
|
|||
|| (!State->FpuControl.Dm && State->FpuStatus.De)
|
||||
|| (!State->FpuControl.Im && State->FpuStatus.Ie))
|
||||
{
|
||||
/* Call the #MF handler */
|
||||
Fast486Exception(State, FAST486_EXCEPTION_MF);
|
||||
if (State->ControlRegisters[FAST486_REG_CR0] & FAST486_CR0_NE)
|
||||
{
|
||||
/* Call the #MF handler */
|
||||
Fast486Exception(State, FAST486_EXCEPTION_MF);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Use the external interrupt */
|
||||
State->FpuCallback(State);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -165,6 +165,7 @@ BOOLEAN CpuInitialize(VOID)
|
|||
EmulatorWriteIo,
|
||||
EmulatorBiosOperation,
|
||||
EmulatorIntAcknowledge,
|
||||
EmulatorFpu,
|
||||
NULL /* TODO: Use a TLB */);
|
||||
|
||||
/* Initialize the software callback system and register the emulator BOPs */
|
||||
|
|
|
@ -212,6 +212,12 @@ UCHAR WINAPI EmulatorIntAcknowledge(PFAST486_STATE State)
|
|||
return PicGetInterrupt();
|
||||
}
|
||||
|
||||
VOID WINAPI EmulatorFpu(PFAST486_STATE State)
|
||||
{
|
||||
/* The FPU is wired to IRQ 13 */
|
||||
PicInterruptRequest(13);
|
||||
}
|
||||
|
||||
VOID EmulatorException(BYTE ExceptionNumber, LPWORD Stack)
|
||||
{
|
||||
WORD CodeSegment, InstructionPointer;
|
||||
|
|
|
@ -92,6 +92,11 @@ UCHAR WINAPI EmulatorIntAcknowledge
|
|||
PFAST486_STATE State
|
||||
);
|
||||
|
||||
VOID WINAPI EmulatorFpu
|
||||
(
|
||||
PFAST486_STATE State
|
||||
);
|
||||
|
||||
VOID EmulatorException(BYTE ExceptionNumber, LPWORD Stack);
|
||||
|
||||
VOID EmulatorTerminate(VOID);
|
||||
|
|
Loading…
Reference in a new issue