add_definitions(-DUSE_SHARED_DLL)
add_definitions(-DUSE_SHARED_UI_DLL)
add_definitions(-DUSE_SHARED_DEVICES_DLL)
- set(I386_CPPS
- libcpu_newdev/i386.cpp
- libcpu_newdev/libcpu_i386/i386_real.cpp
- libcpu_newdev/libcpu_i386/i386op16_real.cpp
- libcpu_newdev/libcpu_i386/i386dasm.cpp
- )
+# set(I386_CPPS
+# libcpu_newdev/i386.cpp
+# libcpu_newdev/libcpu_i386/i386_real.cpp
+# libcpu_newdev/libcpu_i386/i386op16_real.cpp
+# libcpu_newdev/libcpu_i386/i386dasm.cpp
+# )
set(MC6809_CPPS
mc6809.cpp
)
if(FLAG_USE_I286)
set(VMFILES ${VMFILES} i286.cpp)
endif()
-if(FLAG_USE_I386_VARIANTS)
- set(VMFILES ${VMFILES} ${I386_CPPS})
-endif()
if(FLAG_USE_Z80)
set(VMFILES ${VMFILES} z80.cpp)
endif()
add_definitions(-D_FM16BETA)
add_definitions(-DHAS_I286)
set(RESOURCE ${CMAKE_SOURCE_DIR}/../../src/qt/common/qrc/fm16beta.qrc)
- set(FLAG_USE_I386_VARIANTS OFF)
set(FLAG_USE_I286 ON)
elseif(BUILD_FM16BETA_86)
set(EXEC_TARGET emufm16beta_86)
add_definitions(-D_FM16BETA)
add_definitions(-DHAS_I86)
- set(FLAG_USE_I386_VARIANTS OFF)
set(FLAG_USE_I286 ON)
set(RESOURCE ${CMAKE_SOURCE_DIR}/../../src/qt/common/qrc/fm16beta.qrc)
endif()
add_definitions(-D_FMR50)
add_definitions(-DHAS_I286)
set(RESOURCE ${CMAKE_SOURCE_DIR}/../../src/qt/common/qrc/fmr50.qrc)
- set(FLAG_USE_I386_VARIANTS OFF)
set(FLAG_USE_I286 ON)
elseif(BUILD_FMR50_386)
set(EXEC_TARGET emufmr50_386)
add_definitions(-D_FMR50)
add_definitions(-DHAS_I386)
- set(FLAG_USE_I386_VARIANTS ON)
set(FLAG_USE_I286 OFF)
set(RESOURCE ${CMAKE_SOURCE_DIR}/../../src/qt/common/qrc/fmr50.qrc)
elseif(BUILD_FMR50_486)
set(EXEC_TARGET emufmr50_486)
add_definitions(-D_FMR50)
add_definitions(-DHAS_I486)
- set(FLAG_USE_I386_VARIANTS ON)
set(FLAG_USE_I286 OFF)
set(RESOURCE ${CMAKE_SOURCE_DIR}/../../src/qt/common/qrc/fmr50.qrc)
elseif(BUILD_FMR250)
set(EXEC_TARGET emufmr250)
add_definitions(-D_FMR50)
add_definitions(-DHAS_PENTIUM)
- set(FLAG_USE_I386_VARIANTS ON)
set(FLAG_USE_I286 OFF)
set(RESOURCE ${CMAKE_SOURCE_DIR}/../../src/qt/common/qrc/fmr50.qrc)
elseif(BUILD_FMR60)
set(EXEC_TARGET emufmr60)
add_definitions(-D_FMR60)
add_definitions(-DHAS_I286)
- set(FLAG_USE_I386_VARIANTS OFF)
set(FLAG_USE_I286 ON)
set(VMFILES_LIB ${VMFILES_LIB} hd63484.cpp)
set(RESOURCE ${CMAKE_SOURCE_DIR}/../../src/qt/common/qrc/fmr60.qrc)
set(EXEC_TARGET emufmr70)
add_definitions(-D_FMR60)
add_definitions(-DHAS_I386)
- set(FLAG_USE_I386_VARIANTS ON)
set(FLAG_USE_I286 OFF)
set(RESOURCE ${CMAKE_SOURCE_DIR}/../../src/qt/common/qrc/fmr60.qrc)
elseif(BUILD_FMR80)
set(EXEC_TARGET emufmr80)
add_definitions(-D_FMR60)
add_definitions(-DHAS_I486)
- set(FLAG_USE_I386_VARIANTS ON)
set(FLAG_USE_I286 OFF)
set(RESOURCE ${CMAKE_SOURCE_DIR}/../../src/qt/common/qrc/fmr60.qrc)
elseif(BUILD_FMR280)
set(EXEC_TARGET emufmr280)
add_definitions(-D_FMR60)
add_definitions(-DHAS_PENTIUM)
- set(FLAG_USE_I386_VARIANTS ON)
set(FLAG_USE_I286 OFF)
set(RESOURCE ${CMAKE_SOURCE_DIR}/../../src/qt/common/qrc/fmr60.qrc)
endif()
not.cpp
${VMFILES_LIB}
)
- set(FLAG_USE_I386_VARIANTS OFF)
set(FLAG_USE_I286 ON)
# set(FLAG_USE_I86 ON)
set(RESOURCE ${CMAKE_SOURCE_DIR}/../../src/qt/common/qrc/pc9801.qrc)
not.cpp
${VMFILES_LIB}
)
- set(FLAG_USE_I386_VARIANTS OFF)
set(FLAG_USE_I286 ON)
# set(FLAG_USE_I86 ON)
set(RESOURCE ${CMAKE_SOURCE_DIR}/../../src/qt/common/qrc/pc9801e.qrc)
pcm1bit.cpp
${VMFILES_LIB}
)
- set(FLAG_USE_I386_VARIANTS OFF)
set(FLAG_USE_I286 ON)
# set(FLAG_USE_I86 ON)
set(RESOURCE ${CMAKE_SOURCE_DIR}/../../src/qt/common/qrc/pc9801u.qrc)
pcm1bit.cpp
${VMFILES_LIB}
)
- set(FLAG_USE_I386_VARIANTS OFF)
set(FLAG_USE_I286 ON)
# set(FLAG_USE_I86 ON)
set(RESOURCE ${CMAKE_SOURCE_DIR}/../../src/qt/common/qrc/pc9801vm.qrc)
pcm1bit.cpp
${VMFILES_LIB}
)
- set(FLAG_USE_I386_VARIANTS OFF)
set(FLAG_USE_I286 ON)
# set(FLAG_USE_I86 ON)
set(RESOURCE ${CMAKE_SOURCE_DIR}/../../src/qt/common/qrc/pc9801vx.qrc)
pcm1bit.cpp
${VMFILES_LIB}
)
- set(FLAG_USE_I386_VARIANTS OFF)
set(FLAG_USE_I286 ON)
# set(FLAG_USE_I86 ON)
set(RESOURCE ${CMAKE_SOURCE_DIR}/../../src/qt/common/qrc/pc98xa.qrc)
pcm1bit.cpp
${VMFILES_LIB}
)
- set(FLAG_USE_I386_VARIANTS OFF)
set(FLAG_USE_I286 ON)
# set(FLAG_USE_I86 ON)
set(RESOURCE ${CMAKE_SOURCE_DIR}/../../src/qt/common/qrc/pc98xl.qrc)
pcm1bit.cpp
${VMFILES_LIB}
)
- set(FLAG_USE_I386_VARIANTS OFF)
set(FLAG_USE_I286 ON)
# set(FLAG_USE_I86 ON)
set(RESOURCE ${CMAKE_SOURCE_DIR}/../../src/qt/common/qrc/pc9801vf.qrc)
pcm1bit.cpp
${VMFILES_LIB}
)
- set(FLAG_USE_I386_VARIANTS ON)
set(FLAG_USE_I286 OFF)
# set(FLAG_USE_I86 ON)
set(RESOURCE ${CMAKE_SOURCE_DIR}/../../src/qt/common/qrc/pc9801ra.qrc)
pcm1bit.cpp
${VMFILES_LIB}
)
- set(FLAG_USE_I386_VARIANTS ON)
set(FLAG_USE_I286 OFF)
# set(FLAG_USE_I86 ON)
set(RESOURCE ${CMAKE_SOURCE_DIR}/../../src/qt/common/qrc/pc98rl.qrc)
pcm1bit.cpp
upd4991a.cpp
)
- set(FLAG_USE_I386_VARIANTS OFF)
set(FLAG_USE_I286 ON)
# set(FLAG_USE_I86 ON)
set(VM_APPEND_LIBS vm_pc8801)
pcm1bit.cpp
upd4991a.cpp
)
- set(FLAG_USE_I386_VARIANTS OFF)
set(FLAG_USE_I286 ON)
# set(FLAG_USE_I86 ON)
set(VM_APPEND_LIBS vm_pc8801)
#ifdef HAS_PENTIUM
add_feature(_T("HAS_PENTIUM"), 1);
#endif
+#ifdef HAS_MEDIAGX
+ add_feature(_T("HAS_MEDIAGX"), 1);
+#endif
+#ifdef HAS_PENTIUM_PRO
+ add_feature(_T("HAS_PENTIUM_PRO"), 1);
+#endif
+#ifdef HAS_PENTIUM_MMX
+ add_feature(_T("HAS_PENTIUM_MMX"), 1);
+#endif
+#ifdef HAS_PENTIUM2
+ add_feature(_T("HAS_PENTIUM2"), 1);
+#endif
+#ifdef HAS_PENTIUM2
+ add_feature(_T("HAS_PENTIUM3"), 1);
+#endif
+#ifdef HAS_PENTIUM2
+ add_feature(_T("HAS_PENTIUM4"), 1);
+#endif
+
#ifdef HAS_V30
add_feature(_T("HAS_V30"), 1);
#endif
message("* vm/common_vm")
-SET(THIS_LIB_VERSION 2.8.3)
+SET(THIS_LIB_VERSION 2.9.0)
#include(cotire)
set(s_vm_common_vm_srcs
../hd63484.cpp
../huc6280_base.cpp
# ../i286.cpp
-# ../i386.cpp
+ ../i386.cpp
../i8080_base.cpp
../i8155.cpp
# ../libcpu_newdev/i86_base.cpp
- ../libcpu_newdev/libcpu_i386/i386_opdef.cpp
- ../libcpu_newdev/libcpu_i386/i386_base_ext.cpp
- ../libcpu_newdev/libcpu_i386/i386op16.cpp
- ../libcpu_newdev/libcpu_i386/i386op32.cpp
- ../libcpu_newdev/libcpu_i386/i386ops.cpp
- ../libcpu_newdev/libcpu_i386/i486ops.cpp
- ../libcpu_newdev/libcpu_i386/pentops.cpp
- ../libcpu_newdev/libcpu_i386/x87ops.cpp
- ../libcpu_newdev/libcpu_i386/vtlb.cpp
+# ../libcpu_newdev/libcpu_i386/i386_opdef.cpp
+# ../libcpu_newdev/libcpu_i386/i386_base_ext.cpp
+# ../libcpu_newdev/libcpu_i386/i386op16.cpp
+# ../libcpu_newdev/libcpu_i386/i386op32.cpp
+# ../libcpu_newdev/libcpu_i386/i386ops.cpp
+# ../libcpu_newdev/libcpu_i386/i486ops.cpp
+# ../libcpu_newdev/libcpu_i386/pentops.cpp
+# ../libcpu_newdev/libcpu_i386/x87ops.cpp
+# ../libcpu_newdev/libcpu_i386/vtlb.cpp
- ../libcpu_newdev/i386_base.cpp
+# ../libcpu_newdev/i386_base.cpp
# FM-7/77/AV
../fm7/hd6844.cpp
*/
#include "i386.h"
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
#include "debugger.h"
-#endif
+//#endif
/* ----------------------------------------------------------------------------
MAME i386
#pragma warning( disable : 4996 )
#endif
+#if 0
#if defined(HAS_I386)
#define CPU_MODEL i386
#elif defined(HAS_I486)
#elif defined(HAS_PENTIUM4)
#define CPU_MODEL pentium4
#endif
+#endif
#ifndef __BIG_ENDIAN__
#define LSB_FIRST
/* Highly useful macro for compile-time knowledge of an array size */
#define ARRAY_LENGTH(x) (sizeof(x) / sizeof(x[0]))
-#ifdef I386_PSEUDO_BIOS
+//#ifdef I386_PSEUDO_BIOS
#define BIOS_INT(num) if(cpustate->bios != NULL) { \
uint16_t regs[10], sregs[4]; \
regs[0] = REG16(AX); regs[1] = REG16(CX); regs[2] = REG16(DX); regs[3] = REG16(BX); \
return; \
} \
}
-#endif
+//#endif
static CPU_TRANSLATE(i386);
#include "mame/lib/softfloat/fsincos.c"
#include "mame/emu/cpu/vtlb.c"
#include "mame/emu/cpu/i386/i386.c"
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
#include "mame/emu/cpu/i386/i386dasm.c"
-#endif
+//#endif
void I386::initialize()
{
DEVICE::initialize();
- opaque = CPU_INIT_CALL(CPU_MODEL);
+ uint32_t n_cpu_type = N_CPU_TYPE_I386;
+ if(osd->check_feature("HAS_I386")) {
+ n_cpu_type = N_CPU_TYPE_I386;
+ } else if(osd->check_feature("HAS_I486")) {
+ n_cpu_type = N_CPU_TYPE_I486;
+ } else if(osd->check_feature("HAS_PENTIUM")) {
+ n_cpu_type = N_CPU_TYPE_PENTIUM;
+ } else if(osd->check_feature("HAS_MEDIAGX")) {
+ n_cpu_type = N_CPU_TYPE_MEDIAGX;
+ } else if(osd->check_feature("HAS_PENTIUM_PRO")) {
+ n_cpu_type = N_CPU_TYPE_PENTIUM_PRO;
+ } else if(osd->check_feature("HAS_PENTIUM_MMX")) {
+ n_cpu_type = N_CPU_TYPE_PENTIUM_MMX;
+ } else if(osd->check_feature("HAS_PENTIUM2")) {
+ n_cpu_type = N_CPU_TYPE_PENTIUM2;
+ } else if(osd->check_feature("HAS_PENTIUM3")) {
+ n_cpu_type = N_CPU_TYPE_PENTIUM3;
+ } else if(osd->check_feature("HAS_PENTIUM4")) {
+ n_cpu_type = N_CPU_TYPE_PENTIUM4;
+ }
+ switch(n_cpu_type) {
+ case N_CPU_TYPE_I386:
+ set_device_name(_T("i80386 CPU"));
+ opaque = CPU_INIT_CALL( i386 );
+ break;
+ case N_CPU_TYPE_I486:
+ set_device_name(_T("i80486 CPU"));
+ opaque = CPU_INIT_CALL( i486 );
+ break;
+ case N_CPU_TYPE_PENTIUM:
+ set_device_name(_T("Pentium CPU"));
+ opaque = CPU_INIT_CALL( pentium );
+ break;
+ case N_CPU_TYPE_MEDIAGX:
+ set_device_name(_T("Media GX CPU"));
+ opaque = CPU_INIT_CALL( mediagx );
+ break;
+ case N_CPU_TYPE_PENTIUM_PRO:
+ set_device_name(_T("Pentium PRO CPU"));
+ opaque = CPU_INIT_CALL( pentium_pro );
+ break;
+ case N_CPU_TYPE_PENTIUM_MMX:
+ set_device_name(_T("Pentium MMX CPU"));
+ opaque = CPU_INIT_CALL( pentium_mmx );
+ break;
+ case N_CPU_TYPE_PENTIUM2:
+ set_device_name(_T("Pentium2 CPU"));
+ opaque = CPU_INIT_CALL( pentium2 );
+ break;
+ case N_CPU_TYPE_PENTIUM3:
+ set_device_name(_T("Pentium3 CPU"));
+ opaque = CPU_INIT_CALL( pentium3 );
+ break;
+ case N_CPU_TYPE_PENTIUM4:
+ set_device_name(_T("Pentium4 CPU"));
+ opaque = CPU_INIT_CALL( pentium4 );
+ break;
+ default: // ???
+ set_device_name(_T("i80386 CPU"));
+ opaque = CPU_INIT_CALL( i386 );
+ break;
+ }
i386_state *cpustate = (i386_state *)opaque;
cpustate->pic = d_pic;
cpustate->program = d_mem;
cpustate->io = d_io;
-#ifdef I386_PSEUDO_BIOS
+//#ifdef I386_PSEUDO_BIOS
cpustate->bios = d_bios;
-#endif
-#ifdef SINGLE_MODE_DMA
+//#endif
+//#ifdef SINGLE_MODE_DMA
cpustate->dma = d_dma;
-#endif
-#ifdef USE_DEBUGGER
+//#endif
+//#ifdef USE_DEBUGGER
cpustate->emu = emu;
cpustate->debugger = d_debugger;
cpustate->program_stored = d_mem;
d_debugger->set_context_mem(d_mem);
d_debugger->set_context_io(d_io);
-#endif
+//#endif
+ cpustate->parent_device = this; // This aims to log.
+ cpustate->cpu_type = n_cpu_type; // check cpu type
cpustate->shutdown = 0;
}
void I386::reset()
{
i386_state *cpustate = (i386_state *)opaque;
- CPU_RESET_CALL(CPU_MODEL);
+ cpu_reset_generic(cpustate);
}
int I386::run(int cycles)
{
i386_state *cpustate = (i386_state *)opaque;
- return CPU_EXECUTE_CALL(i386);
+ return CPU_EXECUTE_CALL(i386); // OK?
}
void I386::write_signal(int id, uint32_t data, uint32_t mask)
return cpustate->pc;
}
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
void I386::write_debug_data8(uint32_t addr, uint32_t data)
{
int wait;
return CPU_DISASSEMBLE_CALL(x86_16) & DASMFLAG_LENGTHMASK;
}
}
-#endif
+//#endif
void I386::set_address_mask(uint32_t mask)
{
return cpustate->shutdown;
}
-#define STATE_VERSION 4
+#define STATE_VERSION 5
void process_state_SREG(I386_SREG* val, FILEIO* state_fio)
{
state_fio->StateValue(cpustate->address_prefix);
state_fio->StateValue(cpustate->segment_prefix);
state_fio->StateValue(cpustate->segment_override);
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
state_fio->StateValue(cpustate->total_cycles);
-#endif
+//#endif
state_fio->StateValue(cpustate->cycles);
state_fio->StateValue(cpustate->extra_cycles);
state_fio->StateValue(cpustate->base_cycles);
state_fio->StateValue(cpustate->opcode_bytes_length);
#endif
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
// post process
if(loading) {
cpustate->prev_total_cycles = cpustate->total_cycles;
}
-#endif
+//#endif
return true;
}
#ifndef _I386_H_
#define _I386_H_
-#if defined(USE_SHARED_DLL)
+//#if defined(USE_SHARED_DLL)
//#if 0
-#include "libcpu_newdev/i386.h"
-#else
-#include "vm.h"
+//#include "libcpu_newdev/i386.h"
+//#else
+//#include "vm.h"
#include "../emu.h"
#include "device.h"
#define SIG_I386_A20 1
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
class DEBUGGER;
-#endif
+//#endif
class I386 : public DEVICE
{
private:
DEVICE *d_mem, *d_io, *d_pic;
-#ifdef I386_PSEUDO_BIOS
+//#ifdef I386_PSEUDO_BIOS
DEVICE *d_bios;
-#endif
-#ifdef SINGLE_MODE_DMA
+//#endif
+//#ifdef SINGLE_MODE_DMA
DEVICE *d_dma;
-#endif
-#ifdef USE_DEBUGGER
+//#endif
+//#ifdef USE_DEBUGGER
DEBUGGER *d_debugger;
-#endif
+//#endif
void *opaque;
public:
I386(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
{
-#ifdef I386_PSEUDO_BIOS
+//#ifdef I386_PSEUDO_BIOS
d_bios = NULL;
-#endif
-#ifdef SINGLE_MODE_DMA
+//#endif
+//#ifdef SINGLE_MODE_DMA
d_dma = NULL;
-#endif
-#if defined(HAS_I386)
- set_device_name(_T("i80386 CPU"));
-#elif defined(HAS_I486)
- set_device_name(_T("i80486 CPU"));
-#elif defined(HAS_PENTIUM)
- set_device_name(_T("Pentium CPU"));
-#elif defined(HAS_MEDIAGX)
- set_device_name(_T("Media GX CPU"));
-#elif defined(HAS_PENTIUM_PRO)
- set_device_name(_T("Pentium Pro CPU"));
-#elif defined(HAS_PENTIUM_MMX)
- set_device_name(_T("Pentium MMX CPU"));
-#elif defined(HAS_PENTIUM2)
- set_device_name(_T("Pentium2 CPU"));
-#elif defined(HAS_PENTIUM3)
- set_device_name(_T("Pentium3 CPU"));
-#elif defined(HAS_PENTIUM4)
- set_device_name(_T("Pentium4 CPU"));
-#endif
-#if defined(HAS_I386)
- set_device_name(_T("80386 CPU"));
-#elif defined(HAS_I486)
- set_device_name(_T("80486 CPU"));
-#elif defined(HAS_PENTIUM)
- set_device_name(_T("Pentium CPU"));
-#elif defined(HAS_MEDIAGX)
- set_device_name(_T("Media GX CPU"));
-#elif defined(HAS_PENTIUM_PRO)
- set_device_name(_T("Pentium Pro CPU"));
-#elif defined(HAS_PENTIUM_MMX)
- set_device_name(_T("Pentium MMX CPU"));
-#elif defined(HAS_PENTIUM2)
- set_device_name(_T("Pentium2 CPU"));
-#elif defined(HAS_PENTIUM3)
- set_device_name(_T("Pentium3 CPU"));
-#elif defined(HAS_PENTIUM4)
- set_device_name(_T("Pentium4 CPU"));
-#endif
+//#endif
+//#if defined(HAS_I386)
+// set_device_name(_T("i80386 CPU"));
+//#elif defined(HAS_I486)
+// set_device_name(_T("i80486 CPU"));
+//#elif defined(HAS_PENTIUM)
+// set_device_name(_T("Pentium CPU"));
+//#elif defined(HAS_MEDIAGX)
+// set_device_name(_T("Media GX CPU"));
+//#elif defined(HAS_PENTIUM_PRO)
+// set_device_name(_T("Pentium Pro CPU"));
+//#elif defined(HAS_PENTIUM_MMX)
+// set_device_name(_T("Pentium MMX CPU"));
+//#elif defined(HAS_PENTIUM2)
+// set_device_name(_T("Pentium2 CPU"));
+//#elif defined(HAS_PENTIUM3)
+// set_device_name(_T("Pentium3 CPU"));
+//#elif defined(HAS_PENTIUM4)
+// set_device_name(_T("Pentium4 CPU"));
+//#endif
+ set_device_name(_T("Intel i80x86 CPU"));
}
~I386() {}
int get_extra_clock();
uint32_t get_pc();
uint32_t get_next_pc();
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
bool is_cpu()
{
return true;
uint32_t read_debug_reg(const _TCHAR *reg);
bool get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
int debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len);
-#endif
+//#endif
bool process_state(FILEIO* state_fio, bool loading);
// unique function
{
d_pic = device;
}
-#ifdef I386_PSEUDO_BIOS
+//#ifdef I386_PSEUDO_BIOS
void set_context_bios(DEVICE* device)
{
d_bios = device;
}
-#endif
-#ifdef SINGLE_MODE_DMA
+//#endif
+//#ifdef SINGLE_MODE_DMA
void set_context_dma(DEVICE* device)
{
d_dma = device;
}
-#endif
-#ifdef USE_DEBUGGER
+//#endif
+//#ifdef USE_DEBUGGER
void set_context_debugger(DEBUGGER* device)
{
d_debugger = device;
}
-#endif
+//#endif
void set_address_mask(uint32_t mask);
uint32_t get_address_mask();
void set_shutdown_flag(int shutdown);
int get_shutdown_flag();
};
-#endif // USE_SHARED_DLL
+//#endif // USE_SHARED_DLL
#endif
/* seems to be defined on mingw-gcc */
#undef i386
-static CPU_RESET( CPU_MODEL );
+static CPU_RESET( i386 );
+static CPU_RESET( i486 );
+static CPU_RESET( pentium );
+static CPU_RESET( mediagx );
+static CPU_RESET( pentium_pro );
+static CPU_RESET( pentium_mmx );
+static CPU_RESET( pentium2 );
+static CPU_RESET( pentium3 );
+static CPU_RESET( pentium4 );
+
+static void cpu_reset_generic(i386_state *cpustate);
int i386_parity_table[256];
MODRM_TABLE i386_MODRM_table[256];
#define FAULT(fault,error) {cpustate->ext = 1; i386_trap_with_error(cpustate,fault,0,0,error); return;}
#define FAULT_EXP(fault,error) {cpustate->ext = 1; i386_trap_with_error(cpustate,fault,0,trap_level+1,error); return;}
+static void cpu_reset_generic(i386_state* cpustate)
+{
+ switch(cpustate->cpu_type) {
+ case N_CPU_TYPE_I386:
+ CPU_RESET_CALL( i386 );
+ break;
+ case N_CPU_TYPE_I486:
+ CPU_RESET_CALL( i486 );
+ break;
+ case N_CPU_TYPE_PENTIUM:
+ CPU_RESET_CALL( pentium );
+ break;
+ case N_CPU_TYPE_MEDIAGX:
+ CPU_RESET_CALL( mediagx );
+ break;
+ case N_CPU_TYPE_PENTIUM_PRO:
+ CPU_RESET_CALL( pentium_pro );
+ break;
+ case N_CPU_TYPE_PENTIUM_MMX:
+ CPU_RESET_CALL( pentium_mmx );
+ break;
+ case N_CPU_TYPE_PENTIUM2:
+ CPU_RESET_CALL( pentium2 );
+ break;
+ case N_CPU_TYPE_PENTIUM3:
+ CPU_RESET_CALL( pentium3 );
+ break;
+ case N_CPU_TYPE_PENTIUM4:
+ CPU_RESET_CALL( pentium4 );
+ break;
+ default: // ??
+ CPU_RESET_CALL( i386 );
+ break;
+ }
+}
+
+
/*************************************************************************/
static UINT32 i386_load_protected_mode_segment(i386_state *cpustate, I386_SREG *seg, UINT64 *desc )
if(trap_level >= 3)
{
logerror("IRQ: Triple fault. CPU reset.\n");
- CPU_RESET_CALL(CPU_MODEL);
+ //CPU_RESET_CALL(CPU_MODEL);
+ cpu_reset_generic(cpustate);
cpustate->shutdown = 1;
return;
}
if (cpustate->halted || cpustate->busreq)
{
-#ifdef SINGLE_MODE_DMA
+//#ifdef SINGLE_MODE_DMA
if(cpustate->dma != NULL) {
cpustate->dma->do_dma();
}
-#endif
+//#endif
if (cycles == -1) {
int passed_cycles = max(1, cpustate->extra_cycles);
// this is main cpu, cpustate->cycles is not used
/*cpustate->cycles = */cpustate->extra_cycles = 0;
cpustate->tsc += passed_cycles;
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
cpustate->total_cycles += passed_cycles;
-#endif
+//#endif
return passed_cycles;
} else {
cpustate->cycles += cycles;
}
int passed_cycles = cpustate->base_cycles - cpustate->cycles;
cpustate->tsc += passed_cycles;
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
cpustate->total_cycles += passed_cycles;
-#endif
+//#endif
return passed_cycles;
}
}
cpustate->base_cycles = cpustate->cycles;
/* adjust for any interrupts that came in */
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
cpustate->total_cycles += cpustate->extra_cycles;
-#endif
+//#endif
cpustate->cycles -= cpustate->extra_cycles;
cpustate->extra_cycles = 0;
while( cpustate->cycles > 0 && !cpustate->busreq )
{
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
bool now_debugging = cpustate->debugger->now_debugging;
if(now_debugging) {
cpustate->debugger->check_break_points(cpustate->pc);
cpustate->ext = 1;
i386_trap_with_error(cpustate,e&0xffffffff,0,0,e>>32);
}
-#ifdef SINGLE_MODE_DMA
+//#ifdef SINGLE_MODE_DMA
if(cpustate->dma != NULL) {
cpustate->dma->do_dma();
}
-#endif
+//#endif
/* adjust for any interrupts that came in */
cpustate->cycles -= cpustate->extra_cycles;
cpustate->extra_cycles = 0;
}
} else {
int first_cycles = cpustate->cycles;
-#endif
+//#endif
i386_check_irq_line(cpustate);
cpustate->operand_size = cpustate->sreg[CS].d;
cpustate->xmm_operand_size = 0;
cpustate->ext = 1;
int old_tf = cpustate->TF;
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
cpustate->debugger->add_cpu_trace(cpustate->pc);
-#endif
+//#endif
cpustate->segment_prefix = 0;
cpustate->prev_eip = cpustate->eip;
cpustate->prev_pc = cpustate->pc;
cpustate->ext = 1;
i386_trap_with_error(cpustate,e&0xffffffff,0,0,e>>32);
}
-#ifdef SINGLE_MODE_DMA
+//#ifdef SINGLE_MODE_DMA
if(cpustate->dma != NULL) {
cpustate->dma->do_dma();
}
-#endif
+//#endif
/* adjust for any interrupts that came in */
cpustate->cycles -= cpustate->extra_cycles;
cpustate->extra_cycles = 0;
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
cpustate->total_cycles += first_cycles - cpustate->cycles;
}
-#endif
+//#endif
}
/* if busreq is raised, spin cpu while remained clock */
if (cpustate->cycles > 0 && cpustate->busreq) {
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
cpustate->total_cycles += cpustate->cycles;
-#endif
+//#endif
cpustate->cycles = 0;
}
int passed_cycles = cpustate->base_cycles - cpustate->cycles;
CYCLES(cpustate,CYCLES_CALL_INTERSEG); /* TODO: Timing = 17 + m */
-#ifdef I386_PSEUDO_BIOS
+//#ifdef I386_PSEUDO_BIOS
BIOS_CALL_FAR(((ptr << 4) + offset) & cpustate->a20_mask)
-#endif
+//#endif
if( PROTECTED_MODE && !V8086_MODE)
{
address = READ16(cpustate,ea + 0);
selector = READ16(cpustate,ea + 2);
CYCLES(cpustate,CYCLES_CALL_MEM_INTERSEG); /* TODO: Timing = 10 + m */
-#ifdef I386_PSEUDO_BIOS
+//#ifdef I386_PSEUDO_BIOS
BIOS_CALL_FAR(((selector << 4) + address) & cpustate->a20_mask)
-#endif
+//#endif
if(PROTECTED_MODE && !V8086_MODE)
{
i386_protected_mode_call(cpustate,selector,address,1,0);
{
int interrupt = FETCH(cpustate);
CYCLES(cpustate,CYCLES_INT);
-#ifdef I386_PSEUDO_BIOS
+//#ifdef I386_PSEUDO_BIOS
BIOS_INT(interrupt)
-#endif
+//#endif
cpustate->ext = 0; // not an external interrupt
i386_trap(cpustate,interrupt, 1, 0);
cpustate->ext = 1;
double f64[2];
};
+enum {
+ N_CPU_TYPE_I386 = 0,
+ N_CPU_TYPE_I486,
+ N_CPU_TYPE_PENTIUM,
+ N_CPU_TYPE_MEDIAGX,
+ N_CPU_TYPE_PENTIUM_PRO,
+ N_CPU_TYPE_PENTIUM_MMX,
+ N_CPU_TYPE_PENTIUM2,
+ N_CPU_TYPE_PENTIUM3,
+ N_CPU_TYPE_PENTIUM4
+};
+
struct i386_state
{
I386_GPR reg;
int segment_prefix;
int segment_override;
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
uint64_t total_cycles;
uint64_t prev_total_cycles;
-#endif
+//#endif
int cycles;
int extra_cycles;
int base_cycles;
DEVICE *pic;
DEVICE *program;
DEVICE *io;
-#ifdef I386_PSEUDO_BIOS
+//#ifdef I386_PSEUDO_BIOS
DEVICE *bios;
-#endif
-#ifdef SINGLE_MODE_DMA
+//#endif
+//#ifdef SINGLE_MODE_DMA
DEVICE *dma;
-#endif
-#ifdef USE_DEBUGGER
+//#endif
+//#ifdef USE_DEBUGGER
EMU *emu;
DEBUGGER *debugger;
DEVICE *program_stored;
DEVICE *io_stored;
-#endif
+//#endif
+ DEVICE *parent_device;
+ UINT32 cpu_type;
UINT32 a20_mask;
int cpuid_max_input_value_eax;