diff --git a/src/cpu.c b/src/cpu.c index dfe6c65..64a9702 100644 --- a/src/cpu.c +++ b/src/cpu.c @@ -7,6 +7,9 @@ #include "pci.h" #include "codegen.h" +static int cpu_turbo_speed, cpu_nonturbo_speed; +static int cpu_turbo = 1; + int isa_cycles; int has_vlb; static uint8_t ccr0, ccr1, ccr2, ccr3, ccr4, ccr5, ccr6; @@ -505,6 +508,14 @@ void cpu_set() ccr0 = ccr1 = ccr2 = ccr3 = ccr4 = ccr5 = ccr6 = 0; has_vlb = (cpu_s->cpu_type >= CPU_i486SX) && (cpu_s->cpu_type <= CPU_Cx5x86); + cpu_turbo_speed = cpu_s->rspeed; + if (cpu_s->cpu_type < CPU_286) + cpu_nonturbo_speed = 4772728; + else if (cpu_s->rspeed < 8000000) + cpu_nonturbo_speed = cpu_s->rspeed; + else + cpu_nonturbo_speed = 8000000; + cpu_update_waitstates(); isa_cycles = cpu_s->atclk_div; @@ -1670,3 +1681,29 @@ void cpu_update_waitstates() cpu_prefetch_cycles *= 4; cpu_mem_prefetch_cycles = cpu_prefetch_cycles; } + +void cpu_set_turbo(int turbo) +{ + if (cpu_turbo != turbo) + { + cpu_turbo = turbo; + + cpu_s = &models[model].cpu[cpu_manufacturer].cpus[cpu]; + if (cpu_s->cpu_type >= CPU_286) + { + if (cpu_turbo) + setpitclock(cpu_turbo_speed); + else + setpitclock(cpu_nonturbo_speed); + } + else + setpitclock(14318184.0); + } +} + +int cpu_get_speed() +{ + if (cpu_turbo) + return cpu_turbo_speed; + return cpu_nonturbo_speed; +} diff --git a/src/cpu.h b/src/cpu.h index 62429e1..ef21835 100644 --- a/src/cpu.h +++ b/src/cpu.h @@ -148,6 +148,8 @@ extern int isa_cycles; void cpu_update_waitstates(); void cpu_set(); void cpu_set_edx(); +void cpu_set_turbo(int turbo); +int cpu_get_speed(); extern int has_vlb; diff --git a/src/ibm.h b/src/ibm.h index c5668d9..491116f 100644 --- a/src/ibm.h +++ b/src/ibm.h @@ -273,7 +273,6 @@ extern uint8_t opcode; extern int insc; extern int fpucount; extern float mips,flops; -extern int clockrate; extern int cgate16; extern int CPUID; diff --git a/src/pc.c b/src/pc.c index a12a56f..71fd9f4 100644 --- a/src/pc.c +++ b/src/pc.c @@ -70,7 +70,6 @@ int cycles_lost = 0; int config_override = 0; -int clockrate; int insc=0; float mips,flops; extern int mmuflush; @@ -361,6 +360,7 @@ void resetpc() { cpu_set(); pc_reset(); + cpu_set_turbo(1); // cpuspeed2=(AT)?2:1; // atfullspeed=0; ///* if (romset==ROM_AMI386 || romset==ROM_AMI486) */fullspeed(); @@ -467,6 +467,7 @@ void resetpchard() } sound_update_buf_length(); + cpu_set_turbo(1); } char romsets[17][40]={"IBM PC","IBM XT","Generic Turbo XT","Euro PC","Tandy 1000","Amstrad PC1512","Sinclair PC200","Amstrad PC1640","IBM AT","AMI 286 clone","Dell System 200","Misc 286","IBM AT 386","Misc 386","386 clone","486 clone","486 clone 2"}; @@ -490,21 +491,21 @@ void runpc() { char s[200]; int done=0; + int cycles_to_run = cpu_get_speed() / 100; startblit(); - clockrate = models[model].cpu[cpu_manufacturer].cpus[cpu].rspeed; if (is386) { if (cpu_use_dynarec) - exec386_dynarec(models[model].cpu[cpu_manufacturer].cpus[cpu].rspeed / 100); + exec386_dynarec(cycles_to_run); else - exec386(models[model].cpu[cpu_manufacturer].cpus[cpu].rspeed / 100); + exec386(cycles_to_run); } else if (AT) - exec386(models[model].cpu[cpu_manufacturer].cpus[cpu].rspeed / 100); + exec386(cycles_to_run); else - execx86(models[model].cpu[cpu_manufacturer].cpus[cpu].rspeed / 100); + execx86(cycles_to_run); keyboard_poll_host(); keyboard_process(); diff --git a/src/pit.c b/src/pit.c index 90dab32..eb0f828 100644 --- a/src/pit.c +++ b/src/pit.c @@ -41,7 +41,7 @@ void setpitclock(float clock) // pclog("PITCONST=%f CGACONST=%f\n", PITCONST, CGACONST); // pclog("CPUMULTI=%g\n", ((14318184.0*(double)(1 << TIMER_SHIFT)) / (double)models[model].cpu[cpu_manufacturer].cpus[cpu].rspeed)); - xt_cpu_multi = (int)((14318184.0*(double)(1 << TIMER_SHIFT)) / (double)models[model].cpu[cpu_manufacturer].cpus[cpu].rspeed); + xt_cpu_multi = (int)((14318184.0*(double)(1 << TIMER_SHIFT)) / (double)cpu_get_speed()); // pclog("egacycles %i egacycles2 %i temp %f clock %f\n",egacycles,egacycles2,temp,clock); /* if (video_recalctimings) video_recalctimings();*/ diff --git a/src/t1000.c b/src/t1000.c index fb5399a..42937eb 100644 --- a/src/t1000.c +++ b/src/t1000.c @@ -391,16 +391,9 @@ static void t1200_turbo_set(uint8_t value) } t1000.turbo = value; if (!value) - { - int c = cpu; - cpu = 0; /* 8088/4.77MHz */ - cpu_set(); - cpu = c; - } + cpu_set_turbo(0); else - { - cpu_set(); - } + cpu_set_turbo(1); } static void write_t1000_ctl(uint16_t addr, uint8_t val, void *priv) diff --git a/src/t3100e.c b/src/t3100e.c index e9730d7..5456c23 100644 --- a/src/t3100e.c +++ b/src/t3100e.c @@ -376,16 +376,9 @@ void t3100e_turbo_set(uint8_t value) { t3100e_ems.turbo = value; if (!value) - { - int c = cpu; - cpu = 0; /* 286/6 */ - cpu_set(); - cpu = c; - } + cpu_set_turbo(0); else - { - cpu_set(); - } + cpu_set_turbo(1); } diff --git a/src/wx-sdl2-status.c b/src/wx-sdl2-status.c index 8d16081..735fa44 100644 --- a/src/wx-sdl2-status.c +++ b/src/wx-sdl2-status.c @@ -145,7 +145,7 @@ int get_status(char* machine, char* device) #endif*/ segareads, segawrites, - clockrate - scycles_lost, + cpu_get_speed() - scycles_lost, pit_timer0_freq(), ((double)main_time * 100.0) / status_diff, ((double)main_time * 100.0) / timer_freq, diff --git a/src/xi8088.c b/src/xi8088.c index d4b7930..6ea95e6 100644 --- a/src/xi8088.c +++ b/src/xi8088.c @@ -29,15 +29,12 @@ void xi8088_turbo_set(uint8_t value) if (!value) { pclog("Xi8088 turbo off\n"); - int c = cpu; - cpu = 0; /* 8088/4.77 */ - cpu_set(); - cpu = c; + cpu_set_turbo(0); } else { pclog("Xi8088 turbo on\n"); - cpu_set(); + cpu_set_turbo(1); } }