mirror of
https://github.com/reactos/reactos.git
synced 2025-06-27 10:09:46 +00:00
[FAST486]
Implement FLDENV and FRSTOR. svn path=/trunk/; revision=66134
This commit is contained in:
parent
4c848e9a69
commit
6af9d3e24c
1 changed files with 89 additions and 10 deletions
|
@ -919,6 +919,49 @@ Fast486FpuArithmeticOperation(PFAST486_STATE State,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline BOOLEAN FASTCALL
|
||||||
|
Fast486FpuLoadEnvironment(PFAST486_STATE State,
|
||||||
|
INT Segment,
|
||||||
|
ULONG Address,
|
||||||
|
BOOLEAN Size)
|
||||||
|
{
|
||||||
|
UCHAR Buffer[28];
|
||||||
|
|
||||||
|
if (!Fast486ReadMemory(State, Segment, Address, FALSE, Buffer, (Size + 1) * 14))
|
||||||
|
{
|
||||||
|
/* Exception occurred */
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if this is a 32-bit save or a 16-bit save */
|
||||||
|
if (Size)
|
||||||
|
{
|
||||||
|
PULONG Data = (PULONG)Buffer;
|
||||||
|
|
||||||
|
State->FpuControl.Value = (USHORT)Data[0];
|
||||||
|
State->FpuStatus.Value = (USHORT)Data[1];
|
||||||
|
State->FpuTag = (USHORT)Data[2];
|
||||||
|
State->FpuLastInstPtr.Long = Data[3];
|
||||||
|
State->FpuLastCodeSel = (USHORT)Data[4];
|
||||||
|
State->FpuLastOpPtr.Long = Data[5];
|
||||||
|
State->FpuLastDataSel = (USHORT)Data[6];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PUSHORT Data = (PUSHORT)Buffer;
|
||||||
|
|
||||||
|
State->FpuControl.Value = Data[0];
|
||||||
|
State->FpuStatus.Value = Data[1];
|
||||||
|
State->FpuTag = Data[2];
|
||||||
|
State->FpuLastInstPtr.LowWord = Data[3];
|
||||||
|
State->FpuLastCodeSel = Data[4];
|
||||||
|
State->FpuLastOpPtr.LowWord = Data[5];
|
||||||
|
State->FpuLastDataSel = Data[6];
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static inline BOOLEAN FASTCALL
|
static inline BOOLEAN FASTCALL
|
||||||
Fast486FpuSaveEnvironment(PFAST486_STATE State,
|
Fast486FpuSaveEnvironment(PFAST486_STATE State,
|
||||||
INT Segment,
|
INT Segment,
|
||||||
|
@ -1136,9 +1179,11 @@ FAST486_OPCODE_HANDLER(Fast486FpuOpcodeD9)
|
||||||
/* FLDENV */
|
/* FLDENV */
|
||||||
case 4:
|
case 4:
|
||||||
{
|
{
|
||||||
// TODO: NOT IMPLEMENTED
|
Fast486FpuLoadEnvironment(State,
|
||||||
UNIMPLEMENTED;
|
(State->PrefixFlags & FAST486_PREFIX_SEG)
|
||||||
|
? FAST486_REG_DS : State->SegmentOverride,
|
||||||
|
ModRegRm.MemoryAddress,
|
||||||
|
OperandSize);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1698,8 +1743,47 @@ FAST486_OPCODE_HANDLER(Fast486FpuOpcodeDD)
|
||||||
/* FRSTOR */
|
/* FRSTOR */
|
||||||
case 4:
|
case 4:
|
||||||
{
|
{
|
||||||
// TODO: NOT IMPLEMENTED
|
INT i;
|
||||||
UNIMPLEMENTED;
|
UCHAR AllRegs[80];
|
||||||
|
|
||||||
|
/* Save the environment */
|
||||||
|
if (!Fast486FpuLoadEnvironment(State,
|
||||||
|
(State->PrefixFlags & FAST486_PREFIX_SEG)
|
||||||
|
? FAST486_REG_DS : State->SegmentOverride,
|
||||||
|
ModRegRm.MemoryAddress,
|
||||||
|
OperandSize))
|
||||||
|
{
|
||||||
|
/* Exception occurred */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Load the registers */
|
||||||
|
if (!Fast486ReadMemory(State,
|
||||||
|
(State->PrefixFlags & FAST486_PREFIX_SEG)
|
||||||
|
? FAST486_REG_DS : State->SegmentOverride,
|
||||||
|
ModRegRm.MemoryAddress + (OperandSize + 1) * 14,
|
||||||
|
FALSE,
|
||||||
|
AllRegs,
|
||||||
|
sizeof(AllRegs)))
|
||||||
|
{
|
||||||
|
/* Exception occurred */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < FAST486_NUM_FPU_REGS; i++)
|
||||||
|
{
|
||||||
|
State->FpuRegisters[i].Mantissa = *((PULONGLONG)&AllRegs[i * 10]);
|
||||||
|
State->FpuRegisters[i].Exponent = *((PUSHORT)&AllRegs[(i * 10) + sizeof(ULONGLONG)]) & 0x7FFF;
|
||||||
|
|
||||||
|
if (*((PUSHORT)&AllRegs[(i * 10) + sizeof(ULONGLONG)]) & 0x8000)
|
||||||
|
{
|
||||||
|
State->FpuRegisters[i].Sign = TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
State->FpuRegisters[i].Sign = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1710,8 +1794,6 @@ FAST486_OPCODE_HANDLER(Fast486FpuOpcodeDD)
|
||||||
INT i;
|
INT i;
|
||||||
UCHAR AllRegs[80];
|
UCHAR AllRegs[80];
|
||||||
|
|
||||||
FPU_SAVE_LAST_INST();
|
|
||||||
|
|
||||||
/* Save the environment */
|
/* Save the environment */
|
||||||
if (!Fast486FpuSaveEnvironment(State,
|
if (!Fast486FpuSaveEnvironment(State,
|
||||||
(State->PrefixFlags & FAST486_PREFIX_SEG)
|
(State->PrefixFlags & FAST486_PREFIX_SEG)
|
||||||
|
@ -1748,9 +1830,6 @@ FAST486_OPCODE_HANDLER(Fast486FpuOpcodeDD)
|
||||||
/* FSTSW */
|
/* FSTSW */
|
||||||
case 7:
|
case 7:
|
||||||
{
|
{
|
||||||
FPU_SAVE_LAST_INST();
|
|
||||||
FPU_SAVE_LAST_OPERAND();
|
|
||||||
|
|
||||||
Fast486WriteModrmWordOperands(State, &ModRegRm, FALSE, State->FpuStatus.Value);
|
Fast486WriteModrmWordOperands(State, &ModRegRm, FALSE, State->FpuStatus.Value);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue