[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:
Aleksandar Andrejevic 2015-01-03 15:16:41 +00:00
parent c765ca5556
commit 44c816e20c
6 changed files with 41 additions and 2 deletions

View file

@ -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

View file

@ -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;
}

View file

@ -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

View file

@ -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 */

View file

@ -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;

View file

@ -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);