mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 05:55:48 +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
|
PFAST486_STATE State
|
||||||
);
|
);
|
||||||
|
|
||||||
|
typedef
|
||||||
|
VOID
|
||||||
|
(NTAPI *FAST486_FPU_PROC)
|
||||||
|
(
|
||||||
|
PFAST486_STATE State
|
||||||
|
);
|
||||||
|
|
||||||
typedef union _FAST486_REG
|
typedef union _FAST486_REG
|
||||||
{
|
{
|
||||||
union
|
union
|
||||||
|
@ -473,6 +480,7 @@ struct _FAST486_STATE
|
||||||
FAST486_IO_WRITE_PROC IoWriteCallback;
|
FAST486_IO_WRITE_PROC IoWriteCallback;
|
||||||
FAST486_BOP_PROC BopCallback;
|
FAST486_BOP_PROC BopCallback;
|
||||||
FAST486_INT_ACK_PROC IntAckCallback;
|
FAST486_INT_ACK_PROC IntAckCallback;
|
||||||
|
FAST486_FPU_PROC FpuCallback;
|
||||||
FAST486_REG GeneralRegs[FAST486_NUM_GEN_REGS];
|
FAST486_REG GeneralRegs[FAST486_NUM_GEN_REGS];
|
||||||
FAST486_SEG_REG SegmentRegs[FAST486_NUM_SEG_REGS];
|
FAST486_SEG_REG SegmentRegs[FAST486_NUM_SEG_REGS];
|
||||||
FAST486_REG InstPtr, SavedInstPtr;
|
FAST486_REG InstPtr, SavedInstPtr;
|
||||||
|
@ -514,6 +522,7 @@ Fast486Initialize(PFAST486_STATE State,
|
||||||
FAST486_IO_WRITE_PROC IoWriteCallback,
|
FAST486_IO_WRITE_PROC IoWriteCallback,
|
||||||
FAST486_BOP_PROC BopCallback,
|
FAST486_BOP_PROC BopCallback,
|
||||||
FAST486_INT_ACK_PROC IntAckCallback,
|
FAST486_INT_ACK_PROC IntAckCallback,
|
||||||
|
FAST486_FPU_PROC FpuCallback,
|
||||||
PULONG Tlb);
|
PULONG Tlb);
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
|
|
@ -179,6 +179,12 @@ Fast486IntAckCallback(PFAST486_STATE State)
|
||||||
return 0x01;
|
return 0x01;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VOID NTAPI
|
||||||
|
Fast486FpuCallback(PFAST486_STATE State)
|
||||||
|
{
|
||||||
|
UNREFERENCED_PARAMETER(State);
|
||||||
|
}
|
||||||
|
|
||||||
/* PUBLIC FUNCTIONS ***********************************************************/
|
/* PUBLIC FUNCTIONS ***********************************************************/
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
@ -190,6 +196,7 @@ Fast486Initialize(PFAST486_STATE State,
|
||||||
FAST486_IO_WRITE_PROC IoWriteCallback,
|
FAST486_IO_WRITE_PROC IoWriteCallback,
|
||||||
FAST486_BOP_PROC BopCallback,
|
FAST486_BOP_PROC BopCallback,
|
||||||
FAST486_INT_ACK_PROC IntAckCallback,
|
FAST486_INT_ACK_PROC IntAckCallback,
|
||||||
|
FAST486_FPU_PROC FpuCallback,
|
||||||
PULONG Tlb)
|
PULONG Tlb)
|
||||||
{
|
{
|
||||||
/* Set the callbacks (or use default ones if some are NULL) */
|
/* 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->IoWriteCallback = (IoWriteCallback ? IoWriteCallback : Fast486IoWriteCallback );
|
||||||
State->BopCallback = (BopCallback ? BopCallback : Fast486BopCallback );
|
State->BopCallback = (BopCallback ? BopCallback : Fast486BopCallback );
|
||||||
State->IntAckCallback = (IntAckCallback ? IntAckCallback : Fast486IntAckCallback );
|
State->IntAckCallback = (IntAckCallback ? IntAckCallback : Fast486IntAckCallback );
|
||||||
|
State->FpuCallback = (FpuCallback ? FpuCallback : Fast486FpuCallback );
|
||||||
|
|
||||||
/* Set the TLB (if given) */
|
/* Set the TLB (if given) */
|
||||||
State->Tlb = Tlb;
|
State->Tlb = Tlb;
|
||||||
|
@ -220,6 +228,7 @@ Fast486Reset(PFAST486_STATE State)
|
||||||
FAST486_IO_WRITE_PROC IoWriteCallback = State->IoWriteCallback;
|
FAST486_IO_WRITE_PROC IoWriteCallback = State->IoWriteCallback;
|
||||||
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;
|
||||||
|
FAST486_FPU_PROC FpuCallback = State->FpuCallback;
|
||||||
PULONG Tlb = State->Tlb;
|
PULONG Tlb = State->Tlb;
|
||||||
|
|
||||||
/* Clear the entire structure */
|
/* Clear the entire structure */
|
||||||
|
@ -273,6 +282,7 @@ Fast486Reset(PFAST486_STATE State)
|
||||||
State->IoWriteCallback = IoWriteCallback;
|
State->IoWriteCallback = IoWriteCallback;
|
||||||
State->BopCallback = BopCallback;
|
State->BopCallback = BopCallback;
|
||||||
State->IntAckCallback = IntAckCallback;
|
State->IntAckCallback = IntAckCallback;
|
||||||
|
State->FpuCallback = FpuCallback;
|
||||||
State->Tlb = Tlb;
|
State->Tlb = Tlb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4125,8 +4125,16 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeWait)
|
||||||
|| (!State->FpuControl.Dm && State->FpuStatus.De)
|
|| (!State->FpuControl.Dm && State->FpuStatus.De)
|
||||||
|| (!State->FpuControl.Im && State->FpuStatus.Ie))
|
|| (!State->FpuControl.Im && State->FpuStatus.Ie))
|
||||||
{
|
{
|
||||||
/* Call the #MF handler */
|
if (State->ControlRegisters[FAST486_REG_CR0] & FAST486_CR0_NE)
|
||||||
Fast486Exception(State, FAST486_EXCEPTION_MF);
|
{
|
||||||
|
/* Call the #MF handler */
|
||||||
|
Fast486Exception(State, FAST486_EXCEPTION_MF);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Use the external interrupt */
|
||||||
|
State->FpuCallback(State);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -165,6 +165,7 @@ BOOLEAN CpuInitialize(VOID)
|
||||||
EmulatorWriteIo,
|
EmulatorWriteIo,
|
||||||
EmulatorBiosOperation,
|
EmulatorBiosOperation,
|
||||||
EmulatorIntAcknowledge,
|
EmulatorIntAcknowledge,
|
||||||
|
EmulatorFpu,
|
||||||
NULL /* TODO: Use a TLB */);
|
NULL /* TODO: Use a TLB */);
|
||||||
|
|
||||||
/* Initialize the software callback system and register the emulator BOPs */
|
/* Initialize the software callback system and register the emulator BOPs */
|
||||||
|
|
|
@ -212,6 +212,12 @@ UCHAR WINAPI EmulatorIntAcknowledge(PFAST486_STATE State)
|
||||||
return PicGetInterrupt();
|
return PicGetInterrupt();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VOID WINAPI EmulatorFpu(PFAST486_STATE State)
|
||||||
|
{
|
||||||
|
/* The FPU is wired to IRQ 13 */
|
||||||
|
PicInterruptRequest(13);
|
||||||
|
}
|
||||||
|
|
||||||
VOID EmulatorException(BYTE ExceptionNumber, LPWORD Stack)
|
VOID EmulatorException(BYTE ExceptionNumber, LPWORD Stack)
|
||||||
{
|
{
|
||||||
WORD CodeSegment, InstructionPointer;
|
WORD CodeSegment, InstructionPointer;
|
||||||
|
|
|
@ -92,6 +92,11 @@ UCHAR WINAPI EmulatorIntAcknowledge
|
||||||
PFAST486_STATE State
|
PFAST486_STATE State
|
||||||
);
|
);
|
||||||
|
|
||||||
|
VOID WINAPI EmulatorFpu
|
||||||
|
(
|
||||||
|
PFAST486_STATE State
|
||||||
|
);
|
||||||
|
|
||||||
VOID EmulatorException(BYTE ExceptionNumber, LPWORD Stack);
|
VOID EmulatorException(BYTE ExceptionNumber, LPWORD Stack);
|
||||||
|
|
||||||
VOID EmulatorTerminate(VOID);
|
VOID EmulatorTerminate(VOID);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue