📄 cpu.cpp
字号:
// 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()
{
}
//////////////////////////////////////////////////////////////////////
//进程执行完
//////////////////////////////////////////////////////////////////////
void CCpu::CpuRunover(CMemory * pmemory){ //进程执行完
pdlg->m_strdictate.Format("endl"); //在指令输出中显示endl
pdlg->Updatashow();
pmemory->Destroyprocess((int)process.ID);//删除进程
CpuChooseprocess(pmemory); //选择进程运行
}
//////////////////////////////////////////////////////////////////////
//进程执行完
//////////////////////////////////////////////////////////////////////
void CCpu::CpuParseprocess(CMemory * pmemory){ //解释运行指令
CString a="add";
if(!process.pdictate[process.idictaterun].strename.Compare(a)){ //如果为加法指令
if(process.pdictate[process.idictaterun].iparstate[2]==1){ //判断参数形式
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){ //判断参数形式
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")){ //如果为转移指令
if(process.pdictate[process.idictaterun].iparstate[2]==1){ //判断参数形式
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")){//如果需要设备A
psw[0]=1;
psw[1]=HALT_NA; //设置中断原因为需设备A
process.idictaterun++; //指令指向下一条
CpuOther(process.pdictate[process.idictaterun].strename); //其他指令
CpuBlockprocess(pmemory); //中断处理
}
else if(!process.pdictate[process.idictaterun].strename.Compare("needb")){//如果需要设备B
psw[0]=1;
psw[1]=HALT_NB; //设置中断原因为需设备B
process.idictaterun++; //指令指向下一条
CpuBlockprocess(pmemory); //中断处理
CpuOther(process.pdictate[process.idictaterun].strename); //其他指令
}
else if(!process.pdictate[process.idictaterun].strename.Compare("needc")){//如果需要设备C
psw[0]=1;
psw[1]=HALT_NC; //设置中断原因为需设备C
process.idictaterun++; //指令指向下一条
CpuBlockprocess(pmemory); //中断处理
CpuOther(process.pdictate[process.idictaterun].strename); //其他指令
}
else if(!process.pdictate[process.idictaterun].strename.Compare("needab")){//如果需要设备C
psw[0]=1;
psw[1]=HALT_NAB; //设置中断原因为需设备C
process.idictaterun++; //指令指向下一条
CpuBlockprocess(pmemory); //中断处理
CpuOther(process.pdictate[process.idictaterun].strename); //其他指令
}
else if(!process.pdictate[process.idictaterun].strename.Compare("needac")){//如果需要设备C
psw[0]=1;
psw[1]=HALT_NAC; //设置中断原因为需设备C
process.idictaterun++; //指令指向下一条
CpuBlockprocess(pmemory); //中断处理
CpuOther(process.pdictate[process.idictaterun].strename); //其他指令
}
else if(!process.pdictate[process.idictaterun].strename.Compare("needbc")){//如果需要设备C
psw[0]=1;
psw[1]=HALT_NBC; //设置中断原因为需设备C
process.idictaterun++; //指令指向下一条
CpuBlockprocess(pmemory); //中断处理
CpuOther(process.pdictate[process.idictaterun].strename); //其他指令
}
else if(!process.pdictate[process.idictaterun].strename.Compare("needabc")){//如果需要设备C
psw[0]=1;
psw[1]=HALT_NABC; //设置中断原因为需设备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; //设置中断原因为等待输入
process.idictaterun++; //指令指向下一条
CpuBlockprocess(pmemory); //中断处理
CpuOther(process.pdictate[process.idictaterun].strename); //其他指令
}
else
CpuOther(process.pdictate[process.idictaterun].strename); //其他指令
process.idictaterun++; //指令指向下一条
Cpushowregister();
}
//////////////////////////////////////////////////////////////////////
//进程执行完
//////////////////////////////////////////////////////////////////////
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]; //保护现场
process.ihaltreasion=psw[1]; //设置中断原因
pmemory->Blockprocess(process); //进程阻塞
CpuChooseprocess(pmemory); //选择进程
// CpuSetpsw(0,0); //设置psw[0]为0 表示已处理完中断
}
//////////////////////////////////////////////////////////////////////
//cpu一直运行函数
//////////////////////////////////////////////////////////////////////
void CCpu::CpuRun(CMemory * pmemory){ //cpu一直运行函数
if(psw[0]==0){ //如果无中断
if(process.idictaterun>=process.idictatenum){//如果运行完
//if(process.strname!="idle")
CpuRunover(pmemory);
CpuParseprocess(pmemory); //解释运行指令
}
else{
CpuParseprocess(pmemory); //解释运行指令
}
}
else{
CpuBlockprocess(pmemory); //中断处理
CpuParseprocess(pmemory); //解释运行指令
}
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个的值
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -