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

View file

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

View file

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

View file

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

View file

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

View file

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