?? cpu.cpp
字號(hào):
// Cpu.cpp: implementation of the CCpu class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "os.h"
#include "Cpu.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CCpu::CCpu(CShowosDlg * dlg)
{
pdlg=dlg;
ax=bx=cx=cs=ds=0;
psw[0]=psw[1]=psw[2]=0;
process.ID=999999;
process.idictatenum=3;
process.idictaterun=0;
process.istate=1;
process.strname="idle";
process.waittime=0;
process.pdictate[0].strename="idle";
process.pdictate[3]=process.pdictate[2]=process.pdictate[0];
process.pdictate[1]=process.pdictate[4]=process.pdictate[0];
process.pdictate[5]=process.pdictate[6]=process.pdictate[0];
process.pdictate[7]=process.pdictate[8]=process.pdictate[0];
process.pdictate[9]=process.pdictate[10]=process.pdictate[0];
process.pdictate[11]=process.pdictate[12]=process.pdictate[0];
}
CCpu::~CCpu()
{
}
//////////////////////////////////////////////////////////////////////
//進(jìn)程執(zhí)行完
//////////////////////////////////////////////////////////////////////
void CCpu::CpuRunover(CMemory * pmemory){ //進(jìn)程執(zhí)行完
pdlg->m_strdictate.Format("endl"); //在指令輸出中顯示endl
pdlg->Updatashow();
pmemory->Destroyprocess((int)process.ID);//刪除進(jìn)程
CpuChooseprocess(pmemory); //選擇進(jìn)程運(yùn)行
}
//////////////////////////////////////////////////////////////////////
//進(jìn)程執(zhí)行完
//////////////////////////////////////////////////////////////////////
void CCpu::CpuParseprocess(CMemory * pmemory){ //解釋運(yùn)行指令
CString a="add";
if(!process.pdictate[process.idictaterun].strename.Compare(a)){ //如果為加法指令
if(process.pdictate[process.idictaterun].iparstate[2]==1){ //判斷參數(shù)形式
CpuAdd(process.pdictate[process.idictaterun].strpar[0],process.pdictate[process.idictaterun].ipar[0]);
}
else{
CpuAdd(process.pdictate[process.idictaterun].strpar[0],process.pdictate[process.idictaterun].strpar[1]);
}
}
else if(!process.pdictate[process.idictaterun].strename.Compare("sub")){ //如果為減法指令
if(process.pdictate[process.idictaterun].iparstate[2]==1){ //判斷參數(shù)形式
CpuSub(process.pdictate[process.idictaterun].strpar[0],process.pdictate[process.idictaterun].ipar[0]);
}
else{
CpuSub(process.pdictate[process.idictaterun].strpar[0],process.pdictate[process.idictaterun].strpar[1]);
}
}
else if(!process.pdictate[process.idictaterun].strename.Compare("mul")){ //如果為乘法指令
CpuMul(process.pdictate[process.idictaterun].strpar[0]);
}
else if(!process.pdictate[process.idictaterun].strename.Compare("mov")){ //如果為轉(zhuǎn)移指令
if(process.pdictate[process.idictaterun].iparstate[2]==1){ //判斷參數(shù)形式
CpuMov(process.pdictate[process.idictaterun].strpar[0],process.pdictate[process.idictaterun].ipar[0]);
}
else{
CpuMov(process.pdictate[process.idictaterun].strpar[0],process.pdictate[process.idictaterun].strpar[1]);
}
}
else if(!process.pdictate[process.idictaterun].strename.Compare("div")){ //如果為除法指令
CpuDiv(process.pdictate[process.idictaterun].strpar[0]);
}
else if(!process.pdictate[process.idictaterun].strename.Compare("needa")){//如果需要設(shè)備A
psw[0]=1;
psw[1]=HALT_NA; //設(shè)置中斷原因?yàn)樾柙O(shè)備A
process.idictaterun++; //指令指向下一條
CpuOther(process.pdictate[process.idictaterun].strename); //其他指令
CpuBlockprocess(pmemory); //中斷處理
}
else if(!process.pdictate[process.idictaterun].strename.Compare("needb")){//如果需要設(shè)備B
psw[0]=1;
psw[1]=HALT_NB; //設(shè)置中斷原因?yàn)樾柙O(shè)備B
process.idictaterun++; //指令指向下一條
CpuBlockprocess(pmemory); //中斷處理
CpuOther(process.pdictate[process.idictaterun].strename); //其他指令
}
else if(!process.pdictate[process.idictaterun].strename.Compare("needc")){//如果需要設(shè)備C
psw[0]=1;
psw[1]=HALT_NC; //設(shè)置中斷原因?yàn)樾柙O(shè)備C
process.idictaterun++; //指令指向下一條
CpuBlockprocess(pmemory); //中斷處理
CpuOther(process.pdictate[process.idictaterun].strename); //其他指令
}
else if(!process.pdictate[process.idictaterun].strename.Compare("needab")){//如果需要設(shè)備C
psw[0]=1;
psw[1]=HALT_NAB; //設(shè)置中斷原因?yàn)樾柙O(shè)備C
process.idictaterun++; //指令指向下一條
CpuBlockprocess(pmemory); //中斷處理
CpuOther(process.pdictate[process.idictaterun].strename); //其他指令
}
else if(!process.pdictate[process.idictaterun].strename.Compare("needac")){//如果需要設(shè)備C
psw[0]=1;
psw[1]=HALT_NAC; //設(shè)置中斷原因?yàn)樾柙O(shè)備C
process.idictaterun++; //指令指向下一條
CpuBlockprocess(pmemory); //中斷處理
CpuOther(process.pdictate[process.idictaterun].strename); //其他指令
}
else if(!process.pdictate[process.idictaterun].strename.Compare("needbc")){//如果需要設(shè)備C
psw[0]=1;
psw[1]=HALT_NBC; //設(shè)置中斷原因?yàn)樾柙O(shè)備C
process.idictaterun++; //指令指向下一條
CpuBlockprocess(pmemory); //中斷處理
CpuOther(process.pdictate[process.idictaterun].strename); //其他指令
}
else if(!process.pdictate[process.idictaterun].strename.Compare("needabc")){//如果需要設(shè)備C
psw[0]=1;
psw[1]=HALT_NABC; //設(shè)置中斷原因?yàn)樾柙O(shè)備C
process.idictaterun++; //指令指向下一條
CpuBlockprocess(pmemory); //中斷處理
CpuOther(process.pdictate[process.idictaterun].strename); //其他指令
}
else if(!process.pdictate[process.idictaterun].strename.Compare("needinput")){//如果需要輸入
psw[0]=1;
psw[1]=5; //設(shè)置中斷原因?yàn)榈却斎? process.idictaterun++; //指令指向下一條
CpuBlockprocess(pmemory); //中斷處理
CpuOther(process.pdictate[process.idictaterun].strename); //其他指令
}
else
CpuOther(process.pdictate[process.idictaterun].strename); //其他指令
process.idictaterun++; //指令指向下一條
Cpushowregister();
}
//////////////////////////////////////////////////////////////////////
//進(jìn)程執(zhí)行完
//////////////////////////////////////////////////////////////////////
void CCpu::CpuBlockprocess(CMemory * pmemory){ //中斷處理
process.isavereg[0]=ax;
process.isavereg[1]=bx;
process.isavereg[2]=cx;
process.isavereg[3]=cs;
process.isavereg[4]=ds;
process.isavereg[5]=psw[0];
process.isavereg[6]=psw[1];
process.isavereg[7]=psw[2]; //保護(hù)現(xiàn)場(chǎng)
process.ihaltreasion=psw[1]; //設(shè)置中斷原因
pmemory->Blockprocess(process); //進(jìn)程阻塞
CpuChooseprocess(pmemory); //選擇進(jìn)程
// CpuSetpsw(0,0); //設(shè)置psw[0]為0 表示已處理完中斷
}
//////////////////////////////////////////////////////////////////////
//cpu一直運(yùn)行函數(shù)
//////////////////////////////////////////////////////////////////////
void CCpu::CpuRun(CMemory * pmemory){ //cpu一直運(yùn)行函數(shù)
if(psw[0]==0){ //如果無中斷
if(process.idictaterun>=process.idictatenum){//如果運(yùn)行完
//if(process.strname!="idle")
CpuRunover(pmemory);
CpuParseprocess(pmemory); //解釋運(yùn)行指令
}
else{
CpuParseprocess(pmemory); //解釋運(yùn)行指令
}
}
else{
CpuBlockprocess(pmemory); //中斷處理
CpuParseprocess(pmemory); //解釋運(yùn)行指令
}
pdlg->Updatashow();
}
//////////////////////////////////////////////////////////////////////
//初始化寄存器
//////////////////////////////////////////////////////////////////////
void CCpu::CpuInit(int iax,int ibx,int icx,int ics,int ids,int ipsw[3]){
ax=iax;
bx=ibx;
cx=icx;
cs=ics;
ds=ids;
psw[0]=ipsw[0];
psw[1]=ipsw[1];
psw[2]=ipsw[3];
Cpushowregister();
}
//////////////////////////////////////////////////////////////////////
void CCpu::CpuInit(int iax,int ibx,int icx,int ics,int ids,int ipsw1,int ipsw2,int ipsw3){
int ips[3];
ips[0]=ipsw1;
ips[1]=ipsw2;
ips[2]=ipsw3;
CpuInit(iax,ibx,icx,ics,ids,ips);
Cpushowregister();
}
///////////////////////////////////////////////////////////////////////
void CCpu::CpuInit(Sprocess process){ //初始化寄存器
CpuInit(process.isavereg[0],process.isavereg[1],process.isavereg[2],process.isavereg[3],
process.isavereg[4],process.isavereg[5],process.isavereg[6],process.isavereg[7]);
}
//////////////////////////////////////////////////////////////////////
//得到寄存器的值
//////////////////////////////////////////////////////////////////////
int CCpu::CpuGetax(){ //得到ax的值
return ax;
}
int CCpu::CpuGetbx(){ //得到bx的值
return bx;
}
int CCpu::CpuGetcx(){ //得到cx的值
return cx;
}
int CCpu::CpuGetcs(){ //得到cs的值
return cs;
}
int CCpu::CpuGetds(){ //得到ds的值
return ds;
}
int CCpu::CpuGetpsw(int a){ //得到psw 的第a個(gè)的值
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -