new configuration layer. Cpu can change cores and other settings
Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2159
This commit is contained in:
parent
7f54c626ce
commit
3b4e696309
2 changed files with 106 additions and 69 deletions
148
src/cpu/cpu.cpp
148
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.67 2005-02-21 15:36:14 qbix79 Exp $ */
|
||||
/* $Id: cpu.cpp,v 1.68 2005-03-25 11:45:37 qbix79 Exp $ */
|
||||
|
||||
#include <assert.h>
|
||||
#include "dosbox.h"
|
||||
|
@ -1804,69 +1804,97 @@ static void CPU_CycleDecrease(void) {
|
|||
GFX_SetTitle(CPU_CycleMax,-1,false);
|
||||
}
|
||||
|
||||
void CPU_Init(Section* sec) {
|
||||
Section_prop * section=static_cast<Section_prop *>(sec);
|
||||
reg_eax=0;
|
||||
reg_ebx=0;
|
||||
reg_ecx=0;
|
||||
reg_edx=0;
|
||||
reg_edi=0;
|
||||
reg_esi=0;
|
||||
reg_ebp=0;
|
||||
reg_esp=0;
|
||||
|
||||
SegSet16(cs,0);
|
||||
SegSet16(ds,0);
|
||||
SegSet16(es,0);
|
||||
SegSet16(fs,0);
|
||||
SegSet16(gs,0);
|
||||
SegSet16(ss,0);
|
||||
|
||||
CPU_SetFlags(FLAG_IF,FMASK_ALL); //Enable interrupts
|
||||
cpu.cr0=0xffffffff;
|
||||
CPU_SET_CRX(0,0); //Initialize
|
||||
cpu.code.big=false;
|
||||
cpu.stack.mask=0xffff;
|
||||
cpu.stack.big=false;
|
||||
cpu.idt.SetBase(0);
|
||||
cpu.idt.SetLimit(1023);
|
||||
class CPU: public Module_base {
|
||||
private:
|
||||
static bool inited;
|
||||
public:
|
||||
CPU(Section* configuration):Module_base(configuration) {
|
||||
if(inited) {
|
||||
Change_Config(configuration);
|
||||
return;
|
||||
}
|
||||
inited=true;
|
||||
Section_prop * section=static_cast<Section_prop *>(configuration);
|
||||
reg_eax=0;
|
||||
reg_ebx=0;
|
||||
reg_ecx=0;
|
||||
reg_edx=0;
|
||||
reg_edi=0;
|
||||
reg_esi=0;
|
||||
reg_ebp=0;
|
||||
reg_esp=0;
|
||||
|
||||
/* Init the cpu cores */
|
||||
CPU_Core_Normal_Init();
|
||||
CPU_Core_Simple_Init();
|
||||
CPU_Core_Full_Init();
|
||||
SegSet16(cs,0);
|
||||
SegSet16(ds,0);
|
||||
SegSet16(es,0);
|
||||
SegSet16(fs,0);
|
||||
SegSet16(gs,0);
|
||||
SegSet16(ss,0);
|
||||
|
||||
CPU_SetFlags(FLAG_IF,FMASK_ALL); //Enable interrupts
|
||||
cpu.cr0=0xffffffff;
|
||||
CPU_SET_CRX(0,0); //Initialize
|
||||
cpu.code.big=false;
|
||||
cpu.stack.mask=0xffff;
|
||||
cpu.stack.big=false;
|
||||
cpu.idt.SetBase(0);
|
||||
cpu.idt.SetLimit(1023);
|
||||
|
||||
/* Init the cpu cores */
|
||||
CPU_Core_Normal_Init();
|
||||
CPU_Core_Simple_Init();
|
||||
CPU_Core_Full_Init();
|
||||
#if (C_DYNAMIC_X86)
|
||||
CPU_Core_Dyn_X86_Init();
|
||||
CPU_Core_Dyn_X86_Init();
|
||||
#endif
|
||||
MAPPER_AddHandler(CPU_CycleDecrease,MK_f11,MMOD1,"cycledown","Dec Cycles");
|
||||
MAPPER_AddHandler(CPU_CycleIncrease,MK_f12,MMOD1,"cycleup" ,"Inc Cycles");
|
||||
CPU_Cycles=0;
|
||||
CPU_CycleMax=section->Get_int("cycles");;
|
||||
CPU_CycleUp=section->Get_int("cycleup");
|
||||
CPU_CycleDown=section->Get_int("cycledown");
|
||||
const char * core=section->Get_string("core");
|
||||
cpudecoder=&CPU_Core_Normal_Run;
|
||||
if (!strcasecmp(core,"normal")) {
|
||||
cpudecoder=&CPU_Core_Normal_Run;
|
||||
} else if (!strcasecmp(core,"simple")) {
|
||||
cpudecoder=&CPU_Core_Simple_Run;
|
||||
} else if (!strcasecmp(core,"full")) {
|
||||
cpudecoder=&CPU_Core_Full_Run;
|
||||
}
|
||||
#if (C_DYNAMIC_X86)
|
||||
else if (!strcasecmp(core,"dynamic")) {
|
||||
cpudecoder=&CPU_Core_Dyn_X86_Run;
|
||||
}
|
||||
#endif
|
||||
else {
|
||||
LOG_MSG("CPU:Unknown core type %s, switcing back to normal.",core);
|
||||
MAPPER_AddHandler(CPU_CycleDecrease,MK_f11,MMOD1,"cycledown","Dec Cycles");
|
||||
MAPPER_AddHandler(CPU_CycleIncrease,MK_f12,MMOD1,"cycleup" ,"Inc Cycles");
|
||||
Change_Config(configuration);
|
||||
CPU_JMP(false,0,0,0); //Setup the first cpu core
|
||||
}
|
||||
CPU_JMP(false,0,0,0); //Setup the first cpu core
|
||||
bool Change_Config(Section* newconfig){
|
||||
Section_prop * section=static_cast<Section_prop *>(newconfig);
|
||||
CPU_CycleLeft=0;//needed ?
|
||||
CPU_Cycles=0;
|
||||
CPU_CycleMax=section->Get_int("cycles");;
|
||||
CPU_CycleUp=section->Get_int("cycleup");
|
||||
CPU_CycleDown=section->Get_int("cycledown");
|
||||
const char * core=section->Get_string("core");
|
||||
cpudecoder=&CPU_Core_Normal_Run;
|
||||
if (!strcasecmp(core,"normal")) {
|
||||
cpudecoder=&CPU_Core_Normal_Run;
|
||||
} else if (!strcasecmp(core,"simple")) {
|
||||
cpudecoder=&CPU_Core_Simple_Run;
|
||||
} else if (!strcasecmp(core,"full")) {
|
||||
cpudecoder=&CPU_Core_Full_Run;
|
||||
}
|
||||
#if (C_DYNAMIC_X86)
|
||||
else if (!strcasecmp(core,"dynamic")) {
|
||||
cpudecoder=&CPU_Core_Dyn_X86_Run;
|
||||
}
|
||||
#endif
|
||||
else {
|
||||
LOG_MSG("CPU:Unknown core type %s, switcing back to normal.",core);
|
||||
}
|
||||
|
||||
if (!CPU_CycleMax) CPU_CycleMax = 2500;
|
||||
if(!CPU_CycleUp) CPU_CycleUp = 500;
|
||||
if(!CPU_CycleDown) CPU_CycleDown = 20;
|
||||
GFX_SetTitle(CPU_CycleMax,-1,false);
|
||||
return true;
|
||||
}
|
||||
~CPU(){ /* empty */};
|
||||
};
|
||||
|
||||
static CPU * test;
|
||||
|
||||
if (!CPU_CycleMax) CPU_CycleMax = 2500;
|
||||
if(!CPU_CycleUp) CPU_CycleUp = 500;
|
||||
if(!CPU_CycleDown) CPU_CycleDown = 20;
|
||||
CPU_CycleLeft=0;
|
||||
GFX_SetTitle(CPU_CycleMax,-1,false);
|
||||
void CPU_ShutDown(Section* sec) {
|
||||
delete test;
|
||||
}
|
||||
|
||||
void CPU_Init(Section* sec) {
|
||||
test = new CPU(sec);
|
||||
sec->AddDestroyFunction(&CPU_ShutDown,true);
|
||||
}
|
||||
//initialize static members
|
||||
bool CPU::inited=false;
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include "lazyflags.h"
|
||||
#include "cpu.h"
|
||||
#include "debug.h"
|
||||
#include "setup.h"
|
||||
|
||||
#define LINK_TOTAL (64*1024)
|
||||
|
||||
|
@ -326,14 +327,22 @@ bool PAGING_Enabled(void) {
|
|||
return paging.enabled;
|
||||
}
|
||||
|
||||
void PAGING_Init(Section * sec) {
|
||||
/* Setup default Page Directory, force it to update */
|
||||
paging.enabled=false;
|
||||
PAGING_InitTLB();
|
||||
Bitu i;
|
||||
for (i=0;i<LINK_START;i++) {
|
||||
paging.firstmb[i]=i;
|
||||
class PAGING:public Module_base{
|
||||
public:
|
||||
PAGING(Section* configuration):Module_base(configuration){
|
||||
/* Setup default Page Directory, force it to update */
|
||||
paging.enabled=false;
|
||||
PAGING_InitTLB();
|
||||
Bitu i;
|
||||
for (i=0;i<LINK_START;i++) {
|
||||
paging.firstmb[i]=i;
|
||||
}
|
||||
pf_queue.used=0;
|
||||
}
|
||||
pf_queue.used=0;
|
||||
}
|
||||
~PAGING(){}
|
||||
};
|
||||
|
||||
static PAGING* test;
|
||||
void PAGING_Init(Section * sec) {
|
||||
test = new PAGING(sec);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue