OSDN Git Service

[VM][I386][COMMON_VM] Integrate to upstream.Use vm/i386.[cpp|h] instead of libcpu_new...
authorK.Ohta <whatisthis.sowhat@gmail.com>
Mon, 18 Mar 2019 19:19:53 +0000 (04:19 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Mon, 18 Mar 2019 19:19:53 +0000 (04:19 +0900)
12 files changed:
source/build-cmake/cmake/config_commonsource.cmake
source/build-cmake/cmake/config_emufm16beta.cmake
source/build-cmake/cmake/config_emufmr50.cmake
source/build-cmake/cmake/config_emupc9801.cmake
source/src/qt/osd.cpp
source/src/vm/common_vm/CMakeLists.txt
source/src/vm/i386.cpp
source/src/vm/i386.h
source/src/vm/mame/emu/cpu/i386/i386.c
source/src/vm/mame/emu/cpu/i386/i386op16.c
source/src/vm/mame/emu/cpu/i386/i386ops.c
source/src/vm/mame/emu/cpu/i386/i386priv.h

index 45ff1ff..adde7fd 100644 (file)
@@ -10,12 +10,12 @@ if(USE_DEVICES_SHARED_LIB)
   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
   )
@@ -43,9 +43,6 @@ endif()
 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()
index d1e7a6f..1ffd764 100644 (file)
@@ -63,13 +63,11 @@ if(BUILD_FM16BETA_286)
   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()
index 5e9454c..796f72b 100644 (file)
@@ -72,34 +72,29 @@ if(BUILD_FMR50_286)
   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)
@@ -107,21 +102,18 @@ elseif(BUILD_FMR70)
   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()
index 0d2c890..73b8e0b 100644 (file)
@@ -63,7 +63,6 @@ if(BUILD_PC9801)
        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)
@@ -78,7 +77,6 @@ elseif(BUILD_PC9801E)
        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)
@@ -94,7 +92,6 @@ elseif(BUILD_PC9801U)
        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)
@@ -108,7 +105,6 @@ elseif(BUILD_PC9801VM)
        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)
@@ -125,7 +121,6 @@ elseif(BUILD_PC9801VX)
        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)
@@ -142,7 +137,6 @@ elseif(BUILD_PC98XA)
        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)
@@ -159,7 +153,6 @@ elseif(BUILD_PC98XL)
        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)
@@ -173,7 +166,6 @@ elseif(BUILD_PC9801VF)
        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)
@@ -190,7 +182,6 @@ elseif(BUILD_PC9801RA)
        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)
@@ -207,7 +198,6 @@ elseif(BUILD_PC98RL)
        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)
@@ -224,7 +214,6 @@ elseif(BUILD_PC98DO)
        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)
@@ -245,7 +234,6 @@ elseif(BUILD_PC98DOP)
        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)
index c6edb2d..712f402 100644 (file)
@@ -614,6 +614,25 @@ void OSD::set_features_cpu(void)
 #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
index 89a49b8..2abcb58 100644 (file)
@@ -1,6 +1,6 @@
 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
@@ -19,7 +19,7 @@ set(s_vm_common_vm_srcs
        ../hd63484.cpp
        ../huc6280_base.cpp
 #      ../i286.cpp
-#      ../i386.cpp
+       ../i386.cpp
        ../i8080_base.cpp
 
        ../i8155.cpp
@@ -99,17 +99,17 @@ set(s_vm_common_vm_srcs
 
 #      ../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
index 4062df7..e55fc9d 100644 (file)
@@ -9,9 +9,9 @@
 */
 
 #include "i386.h"
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
 #include "debugger.h"
-#endif
+//#endif
 
 /* ----------------------------------------------------------------------------
        MAME i386
@@ -30,6 +30,7 @@
 #pragma warning( disable : 4996 )
 #endif
 
+#if 0
 #if defined(HAS_I386)
        #define CPU_MODEL i386
 #elif defined(HAS_I486)
@@ -49,6 +50,7 @@
 #elif defined(HAS_PENTIUM4)
        #define CPU_MODEL pentium4
 #endif
+#endif
 
 #ifndef __BIG_ENDIAN__
 #define LSB_FIRST
@@ -193,7 +195,7 @@ typedef UINT32      offs_t;
 /* 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); \
@@ -238,7 +240,7 @@ typedef UINT32      offs_t;
                return; \
        } \
 }
-#endif
+//#endif
 
 static CPU_TRANSLATE(i386);
 
@@ -246,26 +248,87 @@ 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;
@@ -273,7 +336,9 @@ void I386::initialize()
        
        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;
 }
 
@@ -287,13 +352,13 @@ void I386::release()
 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)
@@ -341,7 +406,7 @@ uint32_t I386::get_next_pc()
        return cpustate->pc;
 }
 
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
 void I386::write_debug_data8(uint32_t addr, uint32_t data)
 {
        int wait;
@@ -530,7 +595,7 @@ int I386::debug_dasm(uint32_t pc, _TCHAR *buffer, size_t buffer_len)
                return CPU_DISASSEMBLE_CALL(x86_16) & DASMFLAG_LENGTHMASK;
        }
 }
-#endif
+//#endif
 
 void I386::set_address_mask(uint32_t mask)
 {
@@ -559,7 +624,7 @@ int I386::get_shutdown_flag()
        return cpustate->shutdown;
 }
 
-#define STATE_VERSION  4
+#define STATE_VERSION  5
 
 void process_state_SREG(I386_SREG* val, FILEIO* state_fio)
 {
@@ -690,9 +755,9 @@ bool I386::process_state(FILEIO* state_fio, bool loading)
        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);
@@ -738,12 +803,12 @@ bool I386::process_state(FILEIO* state_fio, bool loading)
        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;
 }
 
index ac921fb..b190e17 100644 (file)
 
 #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() {}
        
@@ -100,7 +82,7 @@ public:
        int get_extra_clock();
        uint32_t get_pc();
        uint32_t get_next_pc();
-#ifdef USE_DEBUGGER
+//#ifdef USE_DEBUGGER
        bool is_cpu()
        {
                return true;
@@ -137,7 +119,7 @@ public:
        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
@@ -153,28 +135,28 @@ public:
        {
                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
index 39a85fe..4d09f94 100644 (file)
 /* 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];
@@ -42,6 +52,43 @@ static void pentium_smi(i386_state* cpustate);
 #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 )
@@ -676,7 +723,8 @@ static void i386_trap(i386_state *cpustate,int irq, int irq_gate, int trap_level
                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;
                }
@@ -3379,19 +3427,19 @@ static CPU_EXECUTE( i386 )
 
        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;
@@ -3407,9 +3455,9 @@ static CPU_EXECUTE( i386 )
                        }
                        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;
                }
        }
@@ -3422,15 +3470,15 @@ static CPU_EXECUTE( i386 )
        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);
@@ -3490,11 +3538,11 @@ static CPU_EXECUTE( i386 )
                                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;
@@ -3509,7 +3557,7 @@ static CPU_EXECUTE( i386 )
                        }
                } 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;
@@ -3520,9 +3568,9 @@ static CPU_EXECUTE( i386 )
                        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;
@@ -3553,25 +3601,25 @@ static CPU_EXECUTE( i386 )
                                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;
index 2bdacaa..2eeecae 100644 (file)
@@ -494,9 +494,9 @@ static void I386OP(call_abs16)(i386_state *cpustate)        // Opcode 0x9a
 
        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)
        {
@@ -3038,9 +3038,9 @@ static void I386OP(groupFF_16)(i386_state *cpustate)        // Opcode 0xff
                                        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);
index b74fa8a..7830437 100644 (file)
@@ -2332,9 +2332,9 @@ static void I386OP(int)(i386_state *cpustate)               // Opcode 0xcd
 {
        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;
index f4f4d93..04f0de8 100644 (file)
@@ -344,6 +344,18 @@ union XMM_REG {
        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;
@@ -402,10 +414,10 @@ struct i386_state
        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;
@@ -415,18 +427,20 @@ struct i386_state
        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;