diff -urN dosbox_org/include/cpu.h dosbox/include/cpu.h --- dosbox_org/include/cpu.h 2005-02-10 11:20:47.000000000 +0100 +++ dosbox/include/cpu.h 2005-02-21 14:52:24.000000000 +0100 @@ -27,6 +27,9 @@ extern Bits CPU_Cycles; extern Bits CPU_CycleLeft; extern Bits CPU_CycleMax; +extern bool CPU_TimeSynched; +extern Bitu CPU_CyclesCur; +extern char core_mode[10]; /* Some common Defines */ /* A CPU Handler */ diff -urN dosbox_org/include/mapper.h dosbox/include/mapper.h --- dosbox_org/include/mapper.h 2005-02-10 11:20:47.000000000 +0100 +++ dosbox/include/mapper.h 2005-02-21 14:52:24.000000000 +0100 @@ -21,7 +21,8 @@ enum MapKeys { MK_f1,MK_f2,MK_f3,MK_f4,MK_f5,MK_f6,MK_f7,MK_f8,MK_f9,MK_f10,MK_f11,MK_f12, - MK_return,MK_kpminus,MK_scrolllock,MK_printscreen,MK_pause, + MK_return,MK_kpminus,MK_equals,MK_scrolllock,MK_printscreen,MK_pause, + MK_1, MK_2, MK_3, MK_4, }; diff -urN dosbox_org/src/cpu/core_dyn_x86.cpp dosbox/src/cpu/core_dyn_x86.cpp --- dosbox_org/src/cpu/core_dyn_x86.cpp 2005-02-10 11:20:48.000000000 +0100 +++ dosbox/src/cpu/core_dyn_x86.cpp 2005-02-21 14:52:24.000000000 +0100 @@ -188,6 +188,8 @@ } #include "core_dyn_x86/decoder.h" +Bitu CPU_CyclesOld; + Bits CPU_Core_Dyn_X86_Run(void) { /* Determine the linear address of CS:EIP */ restart_core: @@ -204,8 +206,10 @@ block=CreateCacheBlock(chandler,ip_point,32); } run_block: + CPU_CyclesOld = CPU_Cycles; cache.block.running=0; BlockReturn ret=gen_runcode(block->cache.start); + cycle_count += CPU_CyclesOld - CPU_Cycles; switch (ret) { case BR_Normal: /* Maybe check if we staying in the same page? */ diff -urN dosbox_org/src/cpu/core_full.cpp dosbox/src/cpu/core_full.cpp --- dosbox_org/src/cpu/core_full.cpp 2005-02-10 11:20:48.000000000 +0100 +++ dosbox/src/cpu/core_full.cpp 2005-02-21 14:52:24.000000000 +0100 @@ -64,8 +64,8 @@ Bits CPU_Core_Full_Run(void) { FullData inst; while (CPU_Cycles-->0) { -#if C_DEBUG cycle_count++; +#if C_DEBUG #if C_HEAVY_DEBUG if (DEBUG_HeavyIsBreakpoint()) { FillFlags(); diff -urN dosbox_org/src/cpu/core_normal.cpp dosbox/src/cpu/core_normal.cpp --- dosbox_org/src/cpu/core_normal.cpp 2005-02-10 11:20:48.000000000 +0100 +++ dosbox/src/cpu/core_normal.cpp 2005-02-21 14:52:24.000000000 +0100 @@ -48,7 +48,7 @@ #define SaveMd(off,val) mem_writed_inline(off,val) #endif -extern Bitu cycle_count; +Bitu cycle_count; #if C_FPU #define CPU_FPU 1 //Enable FPU escape instructions @@ -151,8 +151,8 @@ return debugCallback; }; #endif - cycle_count++; #endif + cycle_count++; restart_opcode: switch (core.opcode_index+Fetchb()) { #include "core_normal/prefix_none.h" diff -urN dosbox_org/src/cpu/core_simple.cpp dosbox/src/cpu/core_simple.cpp --- dosbox_org/src/cpu/core_simple.cpp 2005-02-10 11:20:48.000000000 +0100 +++ dosbox/src/cpu/core_simple.cpp 2005-02-21 14:52:24.000000000 +0100 @@ -144,8 +144,8 @@ return debugCallback; }; #endif - cycle_count++; #endif + cycle_count++; restart_opcode: switch (core.opcode_index+Fetchb()) { diff -urN dosbox_org/src/cpu/cpu.cpp dosbox/src/cpu/cpu.cpp --- dosbox_org/src/cpu/cpu.cpp 2005-02-10 11:20:48.000000000 +0100 +++ dosbox/src/cpu/cpu.cpp 2005-02-21 14:52:24.000000000 +0100 @@ -44,6 +44,9 @@ Bits CPU_CycleMax = 2500; Bits CPU_CycleUp = 0; Bits CPU_CycleDown = 0; +bool CPU_TimeSynched = false; +Bitu CPU_CyclesCur = 0; +char core_mode[10]; CPU_Decoder * cpudecoder; void CPU_Core_Full_Init(void); @@ -1793,6 +1796,37 @@ GFX_SetTitle(CPU_CycleMax,-1,false); } +static void CPU_ToggleTimeSynch(void) { + CPU_TimeSynched = ! CPU_TimeSynched; + GFX_SetTitle(CPU_CycleMax,-1,false); +} + +static void CPU_ToggleFullCore(void) { + strcpy(core_mode, "Full"); + cpudecoder=&CPU_Core_Full_Run; + GFX_SetTitle(CPU_CycleMax,-1,false); +} + +static void CPU_ToggleNormalCore(void) { + strcpy(core_mode, "Normal"); + cpudecoder=&CPU_Core_Normal_Run; + GFX_SetTitle(CPU_CycleMax,-1,false); +} + +static void CPU_ToggleDynamicCore(void) { + strcpy(core_mode, "Dynamic"); + cpudecoder=&CPU_Core_Dyn_X86_Run; + GFX_SetTitle(CPU_CycleMax,-1,false); +} + +static void CPU_ToggleSimpleCore(void) { + strcpy(core_mode, "Simple"); + cpudecoder=&CPU_Core_Simple_Run;; + GFX_SetTitle(CPU_CycleMax,-1,false); +} + +extern bool showcycles; + void CPU_Init(Section* sec) { Section_prop * section=static_cast(sec); reg_eax=0; @@ -1829,22 +1863,33 @@ #endif MAPPER_AddHandler(CPU_CycleDecrease,MK_f11,MMOD1,"cycledown","Dec Cycles"); MAPPER_AddHandler(CPU_CycleIncrease,MK_f12,MMOD1,"cycleup" ,"Inc Cycles"); + MAPPER_AddHandler(CPU_ToggleTimeSynch,MK_equals,MMOD1,"timesynched" ,"Tog. TimeSynch"); + MAPPER_AddHandler(CPU_ToggleNormalCore,MK_1,MMOD1,"normal" ,"Tog. Normal Core"); + MAPPER_AddHandler(CPU_ToggleFullCore,MK_2,MMOD1,"full" ,"Tog. Full Core"); + MAPPER_AddHandler(CPU_ToggleDynamicCore,MK_3,MMOD1,"dynamic" ,"Tog. Dynamic Core"); + MAPPER_AddHandler(CPU_ToggleSimpleCore,MK_4,MMOD1,"simple" ,"Tog. Simple Core"); CPU_Cycles=0; CPU_CycleMax=section->Get_int("cycles");; CPU_CycleUp=section->Get_int("cycleup"); CPU_CycleDown=section->Get_int("cycledown"); + CPU_TimeSynched=section->Get_bool("timesynched"); + showcycles=section->Get_bool("showcycles"); const char * core=section->Get_string("core"); + strcpy(core_mode, "Normal"); cpudecoder=&CPU_Core_Normal_Run; if (!strcasecmp(core,"normal")) { cpudecoder=&CPU_Core_Normal_Run; } else if (!strcasecmp(core,"simple")) { cpudecoder=&CPU_Core_Simple_Run; + strcpy(core_mode, "Simple"); } else if (!strcasecmp(core,"full")) { cpudecoder=&CPU_Core_Full_Run; + strcpy(core_mode, "Full"); } #if (C_DYNAMIC_X86) else if (!strcasecmp(core,"dynamic")) { cpudecoder=&CPU_Core_Dyn_X86_Run; + strcpy(core_mode, "Dynamic"); } #endif else { diff -urN dosbox_org/src/debug/debug.cpp dosbox/src/debug/debug.cpp --- dosbox_org/src/debug/debug.cpp 2005-02-10 11:20:50.000000000 +0100 +++ dosbox/src/debug/debug.cpp 2005-02-21 14:52:24.000000000 +0100 @@ -92,7 +92,7 @@ static Bitu oldflags; DBGBlock dbg; static Bitu input_count; -Bitu cycle_count; +extern Bitu cycle_count; static bool debugging; diff -urN dosbox_org/src/dosbox.cpp dosbox/src/dosbox.cpp --- dosbox_org/src/dosbox.cpp 2005-02-10 11:20:47.000000000 +0100 +++ dosbox/src/dosbox.cpp 2005-02-21 14:58:12.000000000 +0100 @@ -116,11 +116,34 @@ Bits RemainTicks; Bits LastTicks; +Bits Ticks = 0; + +bool showcycles; + +extern void GFX_SetTitle(Bits cycles, Bits frameskip,bool paused); +extern Bitu cycle_count; +extern Bitu frames; static Bitu Normal_Loop(void) { Bits ret,NewTicks; while (1) { if (PIC_RunQueue()) { + if((CPU_TimeSynched) || (showcycles)) { + NewTicks=GetTicks(); + + if((CPU_TimeSynched) && (NewTicks!=LastTicks)) + CPU_Cycles=0; + + if((showcycles) && (NewTicks>=Ticks)) { + CPU_CyclesCur=(cycle_count-CPU_CyclesCur) >> 9; + Ticks=NewTicks + 512; // next update in 512ms + frames*=1.95; // compensate for 512ms interval + GFX_SetTitle(CPU_CycleMax,-1,false); + CPU_CyclesCur=cycle_count; + frames=0; + } + } + ret=(*cpudecoder)(); if (ret<0) return 1; if (ret>0) { @@ -243,6 +266,8 @@ secprop->Add_int("cycles",3000); secprop->Add_int("cycleup",500); secprop->Add_int("cycledown",20); + secprop->Add_bool("timesynched",false); + secprop->Add_bool("showcycles",false); MSG_Add("CPU_CONFIGFILE_HELP", "core -- CPU Core used in emulation: simple,normal,full" #if (C_DYNAMIC_X86) @@ -250,9 +275,11 @@ #endif ".\n" "cycles -- Amount of instructions dosbox tries to emulate each millisecond.\n" - " Setting this higher than your machine can handle is bad!\n" + " Setting this higher than your machine can handle is bad! (unless timesynched is set)\n" "cycleup -- Amount of cycles to increase/decrease with keycombo.\n" "cycledown Setting it lower than 100 will be a percentage.\n" + "timesynched -- Do not emulate more cycles than possible.\n" + "showcycles -- Display the number of emulated cycles in the titlebar (uses some CPU).\n" ); #if C_FPU secprop->AddInitFunction(&FPU_Init); diff -urN dosbox_org/src/gui/sdl_mapper.cpp dosbox/src/gui/sdl_mapper.cpp --- dosbox_org/src/gui/sdl_mapper.cpp 2005-02-10 11:21:07.000000000 +0100 +++ dosbox/src/gui/sdl_mapper.cpp 2005-02-21 14:52:24.000000000 +0100 @@ -748,6 +748,9 @@ case MK_kpminus: key=SDLK_KP_MINUS; break; + case MK_equals: + key=SDLK_EQUALS; + break; case MK_scrolllock: key=SDLK_SCROLLOCK; break; @@ -757,6 +760,18 @@ case MK_printscreen: key=SDLK_PRINT; break; + case MK_1: + key=SDLK_1; + break; + case MK_2: + key=SDLK_2; + break; + case MK_3: + key=SDLK_3; + break; + case MK_4: + key=SDLK_4; + break; } sprintf(buf,"%s \"key %d%s%s%s\"", entry, @@ -1133,7 +1148,7 @@ } void MAPPER_AddHandler(MAPPER_Handler * handler,MapKeys key,Bitu mods,char * eventname,char * buttonname) { - char tempname[17]; + char tempname[99]; strcpy(tempname,"hand_"); strcat(tempname,eventname); new CHandlerEvent(tempname,handler,key,mods,buttonname); diff -urN dosbox_org/src/gui/sdlmain.cpp dosbox/src/gui/sdlmain.cpp --- dosbox_org/src/gui/sdlmain.cpp 2005-02-10 11:21:07.000000000 +0100 +++ dosbox/src/gui/sdlmain.cpp 2005-02-21 14:52:24.000000000 +0100 @@ -197,16 +197,23 @@ //Globals for keyboard initialisation bool startup_state_numlock=false; bool startup_state_capslock=false; + +Bitu frames = 0; +extern bool showcycles; + +#include "cpu.h" + void GFX_SetTitle(Bits cycles,Bits frameskip,bool paused){ char title[200]={0}; static Bits internal_cycles=0; static Bits internal_frameskip=0; if(cycles != -1) internal_cycles = cycles; if(frameskip != -1) internal_frameskip = frameskip; + if(!showcycles) frames = 0; if(paused) - sprintf(title,"DOSBox %s,Cpu Cycles: %8d, Frameskip %2d, Program: %8s PAUSED",VERSION,internal_cycles,internal_frameskip,RunningProgram); + sprintf(title,"Core: %s, Cpu Cycles: %8d %c %8d, FPS: %d, skip %2d, Program: %8s PAUSED",core_mode,CPU_CyclesCur,CPU_TimeSynched ? '<' : '=',internal_cycles,frames,internal_frameskip,RunningProgram); else - sprintf(title,"DOSBox %s,Cpu Cycles: %8d, Frameskip %2d, Program: %8s",VERSION,internal_cycles,internal_frameskip,RunningProgram); + sprintf(title,"Core: %s, Cpu Cycles: %8d %c %8d, FPS: %d, skip %2d, Program: %8s",core_mode,CPU_CyclesCur,CPU_TimeSynched ? '<' : '=',internal_cycles,frames,internal_frameskip,RunningProgram); SDL_WM_SetCaption(title,VERSION); } @@ -597,6 +604,7 @@ int ret; if (!sdl.updating) return; sdl.updating=false; + frames++; switch (sdl.desktop.type) { case SCREEN_SURFACE: if (SDL_MUSTLOCK(sdl.surface)) {