diff --git a/include/cpu.h b/include/cpu.h index 20f25870..6a1bb85c 100644 --- a/include/cpu.h +++ b/include/cpu.h @@ -29,12 +29,19 @@ #include "mem.h" #endif +#define CPU_AUTODETERMINE_NONE 0x00 +#define CPU_AUTODETERMINE_CORE 0x01 +#define CPU_AUTODETERMINE_CYCLES 0x02 + +#define CPU_AUTODETERMINE_SHIFT 0x02 +#define CPU_AUTODETERMINE_MASK 0x03 + /* CPU Cycle Timing */ extern Bits CPU_Cycles; extern Bits CPU_CycleLeft; extern Bits CPU_CycleMax; extern bool CPU_CycleAutoAdjust; -extern bool CPU_AutoDetermineMode; +extern Bitu CPU_AutoDetermineMode; /* Some common Defines */ /* A CPU Handler */ diff --git a/src/cpu/cpu.cpp b/src/cpu/cpu.cpp index 719e36e1..edae46ef 100644 --- a/src/cpu/cpu.cpp +++ b/src/cpu/cpu.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: cpu.cpp,v 1.82 2006-06-25 18:49:32 c2woody Exp $ */ +/* $Id: cpu.cpp,v 1.83 2006-06-29 09:10:09 c2woody Exp $ */ #include #include "dosbox.h" @@ -47,7 +47,7 @@ Bits CPU_CycleUp = 0; Bits CPU_CycleDown = 0; CPU_Decoder * cpudecoder; bool CPU_CycleAutoAdjust; -bool CPU_AutoDetermineMode; +Bitu CPU_AutoDetermineMode; void CPU_Core_Full_Init(void); void CPU_Core_Normal_Init(void); @@ -1441,17 +1441,21 @@ void CPU_SET_CRX(Bitu cr,Bitu value) { LOG(LOG_CPU,LOG_NORMAL)("Protected mode"); PAGING_Enable((value & CR0_PAGING)>0); - if (!CPU_AutoDetermineMode) break; + if (!(CPU_AutoDetermineMode&CPU_AUTODETERMINE_MASK)) break; - CPU_AutoDetermineMode=false; - CPU_CycleAutoAdjust=true; - CPU_CycleLeft=0; - CPU_Cycles=0; - CPU_CycleMax=0; -/* #if (C_DYNAMIC_X86) - CPU_Core_Dyn_X86_Cache_Init(true); - cpudecoder=&CPU_Core_Dyn_X86_Run; -#endif */ + if (CPU_AutoDetermineMode&CPU_AUTODETERMINE_CYCLES) { + CPU_CycleAutoAdjust=true; + CPU_CycleLeft=0; + CPU_Cycles=0; + CPU_CycleMax=0; + } + #if (C_DYNAMIC_X86) + if (CPU_AutoDetermineMode&CPU_AUTODETERMINE_CORE) { + CPU_Core_Dyn_X86_Cache_Init(true); + cpudecoder=&CPU_Core_Dyn_X86_Run; + } +#endif + CPU_AutoDetermineMode<<=CPU_AUTODETERMINE_SHIFT; GFX_SetTitle(-1,-1,false); } else { cpu.pmode=false; @@ -1989,16 +1993,20 @@ public: } bool Change_Config(Section* newconfig){ Section_prop * section=static_cast(newconfig); + CPU_AutoDetermineMode=CPU_AUTODETERMINE_NONE; CPU_CycleLeft=0;//needed ? CPU_Cycles=0; const char *cyclesLine = section->Get_string("cycles"); - CPU_AutoDetermineMode=false; if (!strcasecmp(cyclesLine,"max")) { CPU_CycleMax=0; CPU_CycleAutoAdjust=true; } else { - if (!strcasecmp(cyclesLine,"auto")) CPU_AutoDetermineMode=true; - CPU_CycleMax=atoi(cyclesLine); + if (!strcasecmp(cyclesLine,"auto")) { + CPU_AutoDetermineMode|=CPU_AUTODETERMINE_CYCLES; + CPU_CycleMax=3000; + } else { + CPU_CycleMax=atoi(cyclesLine); + } CPU_CycleAutoAdjust=false; } CPU_CycleUp=section->Get_int("cycleup"); @@ -2015,6 +2023,9 @@ public: #if (C_DYNAMIC_X86) else if (!strcasecmp(core,"dynamic")) { cpudecoder=&CPU_Core_Dyn_X86_Run; + } else if (!strcasecmp(core,"auto")) { + cpudecoder=&CPU_Core_Normal_Run; + CPU_AutoDetermineMode|=CPU_AUTODETERMINE_CORE; } #endif else { diff --git a/src/dos/dos_execute.cpp b/src/dos/dos_execute.cpp index c7acbae6..e938537d 100644 --- a/src/dos/dos_execute.cpp +++ b/src/dos/dos_execute.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: dos_execute.cpp,v 1.55 2006-04-08 11:25:41 qbix79 Exp $ */ +/* $Id: dos_execute.cpp,v 1.56 2006-06-29 09:10:09 c2woody Exp $ */ #include #include @@ -26,6 +26,7 @@ #include "regs.h" #include "callback.h" #include "debug.h" +#include "cpu.h" const char * RunningProgram="DOSBOX"; @@ -137,6 +138,25 @@ bool DOS_Terminate(bool tsr) { // Free memory owned by process if (!tsr) DOS_FreeProcessMemory(mempsp); DOS_UpdatePSPName(); + + if ((!(CPU_AutoDetermineMode>>CPU_AUTODETERMINE_SHIFT)) || (cpu.pmode)) return true; + + CPU_AutoDetermineMode>>=CPU_AUTODETERMINE_SHIFT; + if (CPU_AutoDetermineMode&CPU_AUTODETERMINE_CYCLES) { + CPU_CycleAutoAdjust=false; + CPU_CycleLeft=0; + CPU_Cycles=0; + CPU_CycleMax=3000; + } + #if (C_DYNAMIC_X86) + if (CPU_AutoDetermineMode&CPU_AUTODETERMINE_CORE) { + cpudecoder=&CPU_Core_Normal_Run; + CPU_CycleLeft=0; + CPU_Cycles=0; + } +#endif + GFX_SetTitle(-1,-1,false); + return true; } diff --git a/src/dosbox.cpp b/src/dosbox.cpp index 2cd62f02..47c746c6 100644 --- a/src/dosbox.cpp +++ b/src/dosbox.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: dosbox.cpp,v 1.100 2006-06-25 18:49:32 c2woody Exp $ */ +/* $Id: dosbox.cpp,v 1.101 2006-06-29 09:10:10 c2woody Exp $ */ #include #include @@ -282,7 +282,8 @@ void DOSBOX_Init(void) { MSG_Add("CPU_CONFIGFILE_HELP", "core -- CPU Core used in emulation: simple,normal,full" #if (C_DYNAMIC_X86) - ",dynamic" + ",dynamic,auto.\n" + " auto switches from normal to dynamic if appropriate" #endif ".\n" "cycles -- Amount of instructions dosbox tries to emulate each millisecond.\n"