mirror of
https://github.com/reactos/reactos.git
synced 2025-04-17 19:27:00 +00:00
[FAST486]
Start implementing the FPU. Stubplement the FPU opcode handlers. svn path=/branches/ntvdm/; revision=61141
This commit is contained in:
parent
4fb7f6e1d7
commit
81c27b5b19
5 changed files with 220 additions and 9 deletions
|
@ -34,6 +34,7 @@
|
||||||
#define FAST486_NUM_SEG_REGS 6
|
#define FAST486_NUM_SEG_REGS 6
|
||||||
#define FAST486_NUM_CTRL_REGS 3
|
#define FAST486_NUM_CTRL_REGS 3
|
||||||
#define FAST486_NUM_DBG_REGS 6
|
#define FAST486_NUM_DBG_REGS 6
|
||||||
|
#define FAST486_NUM_FPU_REGS 8
|
||||||
|
|
||||||
#define FAST486_CR0_PE (1 << 0)
|
#define FAST486_CR0_PE (1 << 0)
|
||||||
#define FAST486_CR0_MP (1 << 1)
|
#define FAST486_CR0_MP (1 << 1)
|
||||||
|
@ -376,6 +377,55 @@ typedef struct _FAST486_TSS
|
||||||
ULONG IopbOffset;
|
ULONG IopbOffset;
|
||||||
} FAST486_TSS, *PFAST486_TSS;
|
} FAST486_TSS, *PFAST486_TSS;
|
||||||
|
|
||||||
|
typedef struct _FAST486_FPU_DATA_REG
|
||||||
|
{
|
||||||
|
ULONGLONG Mantissa;
|
||||||
|
USHORT Exponent;
|
||||||
|
} FAST486_FPU_DATA_REG, *PFAST486_FPU_DATA_REG;
|
||||||
|
|
||||||
|
typedef union _FAST486_FPU_STATUS_REG
|
||||||
|
{
|
||||||
|
USHORT Value;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
ULONG Ie : 1;
|
||||||
|
ULONG De : 1;
|
||||||
|
ULONG Ze : 1;
|
||||||
|
ULONG Oe : 1;
|
||||||
|
ULONG Ue : 1;
|
||||||
|
ULONG Pe : 1;
|
||||||
|
ULONG Sf : 1;
|
||||||
|
ULONG Es : 1;
|
||||||
|
ULONG Code0 : 1;
|
||||||
|
ULONG Code1 : 1;
|
||||||
|
ULONG Code2 : 1;
|
||||||
|
ULONG Top : 3;
|
||||||
|
ULONG Code3 : 1;
|
||||||
|
ULONG Busy : 1;
|
||||||
|
};
|
||||||
|
} FAST486_FPU_STATUS_REG, *PFAST486_FPU_STATUS_REG;
|
||||||
|
|
||||||
|
typedef union _FAST486_FPU_CONTROL_REG
|
||||||
|
{
|
||||||
|
USHORT Value;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
ULONG Im : 1;
|
||||||
|
ULONG Dm : 1;
|
||||||
|
ULONG Zm : 1;
|
||||||
|
ULONG Om : 1;
|
||||||
|
ULONG Um : 1;
|
||||||
|
ULONG Pm : 1;
|
||||||
|
ULONG Reserved : 2;
|
||||||
|
ULONG Pc : 2;
|
||||||
|
ULONG Rc : 2;
|
||||||
|
ULONG Inf : 1;
|
||||||
|
// ULONG Reserved1 : 3;
|
||||||
|
};
|
||||||
|
} FAST486_FPU_CONTROL_REG, *PFAST486_FPU_CONTROL_REG;
|
||||||
|
|
||||||
struct _FAST486_STATE
|
struct _FAST486_STATE
|
||||||
{
|
{
|
||||||
FAST486_MEM_READ_PROC MemReadCallback;
|
FAST486_MEM_READ_PROC MemReadCallback;
|
||||||
|
@ -399,6 +449,10 @@ struct _FAST486_STATE
|
||||||
FAST486_INT_STATUS IntStatus;
|
FAST486_INT_STATUS IntStatus;
|
||||||
UCHAR PendingIntNum;
|
UCHAR PendingIntNum;
|
||||||
PULONG Tlb;
|
PULONG Tlb;
|
||||||
|
FAST486_FPU_DATA_REG FpuRegisters[FAST486_NUM_FPU_REGS];
|
||||||
|
FAST486_FPU_STATUS_REG FpuStatus;
|
||||||
|
FAST486_FPU_CONTROL_REG FpuControl;
|
||||||
|
USHORT FpuTag;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* FUNCTIONS ******************************************************************/
|
/* FUNCTIONS ******************************************************************/
|
||||||
|
|
|
@ -6,6 +6,7 @@ list(APPEND SOURCE
|
||||||
opcodes.c
|
opcodes.c
|
||||||
opgroups.c
|
opgroups.c
|
||||||
extraops.c
|
extraops.c
|
||||||
common.c)
|
common.c
|
||||||
|
fpu.c)
|
||||||
|
|
||||||
add_library(fast486 ${SOURCE})
|
add_library(fast486 ${SOURCE})
|
||||||
|
|
100
lib/fast486/fpu.c
Normal file
100
lib/fast486/fpu.c
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
/*
|
||||||
|
* Fast486 386/486 CPU Emulation Library
|
||||||
|
* fpu.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2013 Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES *******************************************************************/
|
||||||
|
|
||||||
|
#include <windef.h>
|
||||||
|
|
||||||
|
// #define NDEBUG
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include <fast486.h>
|
||||||
|
#include "common.h"
|
||||||
|
#include "opcodes.h"
|
||||||
|
#include "fpu.h"
|
||||||
|
|
||||||
|
/* PUBLIC FUNCTIONS ***********************************************************/
|
||||||
|
|
||||||
|
FAST486_OPCODE_HANDLER(Fast486FpuOpcodeD8)
|
||||||
|
{
|
||||||
|
// TODO: NOT IMPLEMENTED
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
Fast486Exception(State, FAST486_EXCEPTION_UD);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
FAST486_OPCODE_HANDLER(Fast486FpuOpcodeD9)
|
||||||
|
{
|
||||||
|
// TODO: NOT IMPLEMENTED
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
Fast486Exception(State, FAST486_EXCEPTION_UD);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
FAST486_OPCODE_HANDLER(Fast486FpuOpcodeDA)
|
||||||
|
{
|
||||||
|
// TODO: NOT IMPLEMENTED
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
Fast486Exception(State, FAST486_EXCEPTION_UD);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
FAST486_OPCODE_HANDLER(Fast486FpuOpcodeDB)
|
||||||
|
{
|
||||||
|
// TODO: NOT IMPLEMENTED
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
Fast486Exception(State, FAST486_EXCEPTION_UD);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
FAST486_OPCODE_HANDLER(Fast486FpuOpcodeDC)
|
||||||
|
{
|
||||||
|
// TODO: NOT IMPLEMENTED
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
Fast486Exception(State, FAST486_EXCEPTION_UD);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
FAST486_OPCODE_HANDLER(Fast486FpuOpcodeDD)
|
||||||
|
{
|
||||||
|
// TODO: NOT IMPLEMENTED
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
Fast486Exception(State, FAST486_EXCEPTION_UD);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
FAST486_OPCODE_HANDLER(Fast486FpuOpcodeDE)
|
||||||
|
{
|
||||||
|
// TODO: NOT IMPLEMENTED
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
Fast486Exception(State, FAST486_EXCEPTION_UD);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
FAST486_OPCODE_HANDLER(Fast486FpuOpcodeDF)
|
||||||
|
{
|
||||||
|
// TODO: NOT IMPLEMENTED
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
Fast486Exception(State, FAST486_EXCEPTION_UD);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* EOF */
|
55
lib/fast486/fpu.h
Normal file
55
lib/fast486/fpu.h
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
* Fast486 386/486 CPU Emulation Library
|
||||||
|
* fpu.h
|
||||||
|
*
|
||||||
|
* Copyright (C) 2013 Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _FPU_H_
|
||||||
|
#define _FPU_H_
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/* DEFINES ********************************************************************/
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
FPU_SINGLE_PRECISION = 0,
|
||||||
|
FPU_DOUBLE_PRECISION = 2,
|
||||||
|
FPU_DOUBLE_EXT_PRECISION = 3
|
||||||
|
};
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
FPU_TAG_VALID = 0,
|
||||||
|
FPU_TAG_ZERO = 1,
|
||||||
|
FPU_TAG_SPECIAL = 2,
|
||||||
|
FPU_TAG_EMPTY = 3
|
||||||
|
};
|
||||||
|
|
||||||
|
FAST486_OPCODE_HANDLER(Fast486FpuOpcodeD8);
|
||||||
|
FAST486_OPCODE_HANDLER(Fast486FpuOpcodeD9);
|
||||||
|
FAST486_OPCODE_HANDLER(Fast486FpuOpcodeDA);
|
||||||
|
FAST486_OPCODE_HANDLER(Fast486FpuOpcodeDB);
|
||||||
|
FAST486_OPCODE_HANDLER(Fast486FpuOpcodeDC);
|
||||||
|
FAST486_OPCODE_HANDLER(Fast486FpuOpcodeDD);
|
||||||
|
FAST486_OPCODE_HANDLER(Fast486FpuOpcodeDE);
|
||||||
|
FAST486_OPCODE_HANDLER(Fast486FpuOpcodeDF);
|
||||||
|
|
||||||
|
#endif // _FPU_H_
|
||||||
|
|
||||||
|
/* EOF */
|
|
@ -31,6 +31,7 @@
|
||||||
#include "opgroups.h"
|
#include "opgroups.h"
|
||||||
#include "extraops.h"
|
#include "extraops.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "fpu.h"
|
||||||
|
|
||||||
/* PUBLIC VARIABLES ***********************************************************/
|
/* PUBLIC VARIABLES ***********************************************************/
|
||||||
|
|
||||||
|
@ -253,14 +254,14 @@ Fast486OpcodeHandlers[FAST486_NUM_OPCODE_HANDLERS] =
|
||||||
Fast486OpcodeAad,
|
Fast486OpcodeAad,
|
||||||
Fast486OpcodeSalc,
|
Fast486OpcodeSalc,
|
||||||
Fast486OpcodeXlat,
|
Fast486OpcodeXlat,
|
||||||
NULL, // TODO: OPCODE 0xD8 NOT SUPPORTED
|
Fast486FpuOpcodeD8,
|
||||||
NULL, // TODO: OPCODE 0xD9 NOT SUPPORTED
|
Fast486FpuOpcodeD9,
|
||||||
NULL, // TODO: OPCODE 0xDA NOT SUPPORTED
|
Fast486FpuOpcodeDA,
|
||||||
NULL, // TODO: OPCODE 0xDB NOT SUPPORTED
|
Fast486FpuOpcodeDB,
|
||||||
NULL, // TODO: OPCODE 0xDC NOT SUPPORTED
|
Fast486FpuOpcodeDC,
|
||||||
NULL, // TODO: OPCODE 0xDD NOT SUPPORTED
|
Fast486FpuOpcodeDD,
|
||||||
NULL, // TODO: OPCODE 0xDE NOT SUPPORTED
|
Fast486FpuOpcodeDE,
|
||||||
NULL, // TODO: OPCODE 0xDF NOT SUPPORTED
|
Fast486FpuOpcodeDF,
|
||||||
Fast486OpcodeLoop,
|
Fast486OpcodeLoop,
|
||||||
Fast486OpcodeLoop,
|
Fast486OpcodeLoop,
|
||||||
Fast486OpcodeLoop,
|
Fast486OpcodeLoop,
|
||||||
|
|
Loading…
Reference in a new issue