⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simulator.cpp

📁 类似vc的集成开发环境
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// simulator.cpp: implementation of the simulator class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "simulator.h"
#include "c02ide.h"
#include "MainFrm.h"
#include<string.h>
#include <stdlib.h>
#define REG_BIT  65536
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

simulator::simulator()
{
	operation[0]="ini";
	operation[1]="lit";
	operation[2]="lod";
	operation[3]="sto";
	operation[4]="substo";
	operation[5]="subpush";
	operation[6]="subpop";
	operation[7]="jmp";
	operation[8]="sub";
	operation[9]="goto";
	operation[10]="gosub";
	operation[11]="jpc";
	operation[12]="jfc";
	operation[13]="return";
	operation[14]="main";
	operation[15]="resever";
	operation[16]="opr";
	operation[17]="stoex";
	operation[18]="lodex";
//	operation[17]="sublit";
	

	BreakpointList=new Breakpoint;
	BreakpointList->value=0;
	BreakpointList->next=NULL;
	wholevar=new table;
	wholevar=NULL;

	pc=0;
	i_pcpre=0;
	subflag=0;
	RunoverFlag=0;
	
}

simulator::~simulator()
{
	struct table *p1;
	for(int i=0;i<cx;i++)
		delete code[i].operation;
	delete 	BreakpointList;

	while(wholevar!=NULL)
	{
		p1=wholevar;
		if(wholevar->next!=NULL)
	      wholevar=wholevar->next;
		else
		{
		delete p1;
		break;
		}
		delete p1;
	}
	for(int k=0;k<sub_count;k++)
	{
        while(PartVar[k].var!=NULL)
		{
			p1=PartVar[k].var;
			PartVar[k].var=PartVar[k].var->next;
			delete p1;
		}
	}

}

void simulator::ReSimu()
{

	pc=0;
	i_pcpre=0;
	subflag=0;
	RunoverFlag=0;

	CMDIFrameWnd *nowframe = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
	//活动子窗口指针
	CMDIChildWnd *nowchild = nowframe->MDIGetActive();
	//获得当前活动视图
	CCrystalTextView* m_pexpandview=NULL;	
	m_pexpandview=(CCrystalTextView*)nowchild->GetActiveView();


	 m_pexpandview->SetCursorPos(prunlinepre);
	 //编辑控件光标所在行 
	m_pexpandview->OnToggleBookmark(0);
//	prunlinepre=pselend;
	
}
void simulator::ReadDbgCmd()
{

}

void simulator::RemoveBreakpoint(int line)
{
	struct Breakpoint *p1,*p2;
	int i,k;
	k=BreakpointList->value;
	p1=BreakpointList;
	for(i=1;i<=k;i++)
	{
		if(p1->next->value==line)
		{
			p2=p1->next;
			p1->next=p2->next;
			BreakpointList->value--;
			delete p2;
			i=k;
		}
		else
			p1=p1->next;
	}

}

int simulator::SetBreakpoint(int line)
{
	struct Breakpoint *p1,*p2;
	int i,k=0;

	p1=BreakpointList;
	for(i=1;i<=BreakpointList->value;i++)
	{
		p1=p1->next;
		if(p1->value==line)
			k=1;
	}

	if(k==0)
	{
		p2=new Breakpoint;
		p2->value=line;
		p2->next=NULL;
		p1->next=p2;
		BreakpointList->value++;
	}

	return 1;
}

int simulator::SimRun(int line)

//**该函数功能是模拟执行三元式程序代码,对于输入的每
//**一个三元式代码,该函数都给出相应的模拟执行操作。

{
	int oprcode;
	int Carry;
	struct instruction i;
	i=code[pc];




	oprcode=getopr(i.operation);
	switch(oprcode)
	{
	case 0:  //ini操作码的模拟执行操作
		if(i.l==0)   //
		{
			cpu.ra[0]=cpu.ra[0]-i.a;//通用地址寄存器
			cpu.ra[1]=cpu.ra[0];


		}
		else
		{
			cpu.rhp=cpu.ra[1];  //堆指针
			cpu.ra[1]=cpu.ra[1]-i.a;
			cpu.memony[cpu.ra[1]]=cpu.rhp;
		}

		pc++;
		break;
	case 1:  //lit操作码的模拟执行操作
		cpu.rsp++;
		cpu.memony[cpu.rsp]=i.a;

		pc++;

		break;
	case 2:  //lod操作码的模拟执行操作
		cpu.rsp++;
		if(i.l==0)
		{
			cpu.memony[cpu.rsp]=cpu.memony[cpu.ra[0]+i.a];
		}
		else
		{
			//int j=cpu.ra[1]+i.a;
			cpu.memony[cpu.rsp]=cpu.memony[cpu.ra[1]+i.a];
		}
		
		pc++;
		break;
	case 18:  //lodex操作码的模拟执行操作,栈顶是地址,将地址对应的数据送到栈顶,替换地址
		      //地址总是int
		//int j=cpu.ra[0];
		//cpu.rsp++;
		cpu.rd[3]=cpu.memony[cpu.rsp];
		switch(i.a)
		{
			case 0://int ,char to top
				cpu.memony[cpu.rsp]=cpu.memony[cpu.ra[1]+cpu.memony[cpu.rsp]];
				break;
			case 1://long to top
				cpu.memony[cpu.rsp]=cpu.memony[cpu.ra[1]+cpu.rd[3]-1];
				cpu.rsp++;
				cpu.memony[cpu.rsp]=cpu.memony[cpu.ra[1]+cpu.rd[3]];
				break;						
		}
		//cpu.ra[0]=j;
		pc++;
		break;
	case 3:  //sto操作码的模拟执行操作
		if(i.l==0)
		{	
			cpu.memony[cpu.ra[0]+i.a]=cpu.memony[cpu.rsp];   //函数内部变量
		}
		else
		{
			cpu.memony[cpu.ra[1]+i.a]=cpu.memony[cpu.rsp];  //主程序变量
		}
		
		cpu.rsp--;

		pc++;

		break;
	case 17:  //stoex操作码的模拟执行操作
//		if(i.l==0)
//		{	
//			cpu.memony[cpu.ra[0]+i.a]=cpu.memony[cpu.rsp];
//		}
//		else
//		{
		switch(i.a)
		{
		    case 0://int store to int
				cpu.memony[cpu.ra[1]+cpu.memony[cpu.rsp-1]]=cpu.memony[cpu.rsp];
//		}	
				cpu.rsp--;
				cpu.rsp--;
				break;
			case 1://int store to long
				cpu.memony[cpu.ra[1]+cpu.memony[cpu.rsp-1]]=cpu.memony[cpu.rsp];
				cpu.memony[cpu.ra[1]+cpu.memony[cpu.rsp-1]-1]=0;
				cpu.rsp--;
				cpu.rsp--;
				break;
			case 2://long store to long
				cpu.memony[cpu.ra[1]+cpu.memony[cpu.rsp-2]]=cpu.memony[cpu.rsp];
				cpu.memony[cpu.ra[1]+cpu.memony[cpu.rsp-2]-1]=cpu.memony[cpu.rsp-1];
				cpu.rsp--;
				cpu.rsp--;
				cpu.rsp--;
				break;






		}

		pc++;

		break;
	case 4:  //substo操作码的模拟执行操作
		if(i.l==0)
		{	
			cpu.memony[cpu.ra[0]+i.a]=cpu.memony[cpu.rsp];
		}
		else
		{
			cpu.memony[cpu.ra[1]+i.a]=cpu.memony[cpu.rsp];
		}
		
		cpu.rsp--;

		pc++;
		break;
	case 5:  //subpush操作码的模拟执行操作

		cpu.rsp++;

		if(i.l==0)
		{
			cpu.memony[cpu.rsp]=cpu.memony[cpu.ra[0]+i.a];
		}
		else
		{
			cpu.memony[cpu.rsp]=cpu.memony[cpu.ra[1]+i.a];
		}
		
		pc++;

		break;
	case 6:  //subpop操作码的模拟执行操作

		cpu.memony[cpu.ra[1]+i.a]=cpu.memony[cpu.rsp];

		cpu.rsp--;
		pc++;
		break;
	case 7:  //jmp操作码的模拟执行操作

		if(i.a==pc)
		{
	
			i_pcpre=pc;
			pc=-1;
			
			if(subflag!=0)
				cout<<"error"<<endl;
			RunoverFlag=1;
		}
		else
		{
			pc=i.a;
		}

		break;
	case 8:  //sub操作码的模拟执行操作

		pc++;

		break;
	case 9:  //goto操作码的模拟执行操作

		pc=i.a;

		break;
	case 10: //gosub操作码的模拟执行操作
		
		cpu.ra[2]=pc;
		pc=i.a;
		subflag++;
		

		break;
	case 11:  //jpc操作码的模拟执行操作

		if(cpu.memony[cpu.rsp]==0)
			pc=i.a;
	    else
			pc++;

		cpu.rsp--;

		break;
	case 12:  //jfc操作码的模拟执行操作

		if(cpu.memony[cpu.rsp]==1)
			pc=i.a;
		else
			pc++;

		cpu.rsp--;

		break;
	case 13:  //return操作码的模拟执行操作
		break;
	case 14: //main操作码的模拟执行操作
		cpu.rsp=0;
		cpu.rhp=1024;
		cpu.ra[0]=1024;
		cpu.ra[1]=1024;
		pc++;
		break;
	case 15:  //reveser操作码的模拟执行操作
		break;
	case 16: //opr操作码的模拟执行操作
		switch(i.a)
		{
		case 0:
			pc=cpu.ra[2];
			subflag--;
			break;
		case 1:
			
			break;
		case 2:
			switch(i.l)
			{
			case 0:   //int+int
				cpu.memony[cpu.rsp-1]+=cpu.memony[cpu.rsp];
				if(cpu.memony[cpu.rsp-1]>REG_BIT)
					cpu.memony[cpu.rsp-1]%=REG_BIT;
				cpu.rsp--;
				break;
			case 1:   //long +long
				cpu.memony[cpu.rsp-2]+=cpu.memony[cpu.rsp];

				Carry=cpu.memony[cpu.rsp-2]/REG_BIT;
				if(Carry!=0)
					cpu.memony[cpu.rsp-2]%=REG_BIT;

				cpu.memony[cpu.rsp-3]+=cpu.memony[cpu.rsp-1]+Carry;

				if(cpu.memony[cpu.rsp-3]>REG_BIT)
					cpu.memony[cpu.rsp-3]%=REG_BIT;
				cpu.rsp-=2;
				break;
			case 2:  //int +long
				cpu.memony[cpu.rsp]+=cpu.memony[cpu.rsp-2];
				Carry=cpu.memony[cpu.rsp]/REG_BIT;
				if(Carry!=0)
					cpu.memony[cpu.rsp]%=REG_BIT;
				cpu.memony[cpu.rsp-1]+=Carry;
				if(cpu.memony[cpu.rsp-1]>REG_BIT)
					cpu.memony[cpu.rsp-1]%=REG_BIT;

				cpu.memony[cpu.rsp-2]=cpu.memony[cpu.rsp-1];
				cpu.memony[cpu.rsp-1]=cpu.memony[cpu.rsp];

				cpu.rsp--;
				break;
			case 3:  //long+int 
				cpu.memony[cpu.rsp-1]+=cpu.memony[cpu.rsp];

				Carry=cpu.memony[cpu.rsp-1]/REG_BIT;
				if(Carry!=0)
					cpu.memony[cpu.rsp-1]%=REG_BIT;

				cpu.memony[cpu.rsp-2]+=Carry;
				if(cpu.memony[cpu.rsp-2]>REG_BIT)
					cpu.memony[cpu.rsp-2]%=REG_BIT;
				cpu.rsp--;
				break;

			}
			break;
		case 3:  //-
			switch(i.l)
			{
			case 0:
				cpu.memony[cpu.rsp-1]-=cpu.memony[cpu.rsp];
				cpu.rsp--;
				break;
			case 1:
				cpu.memony[cpu.rsp-2]-=cpu.memony[cpu.rsp];

				if(cpu.memony[cpu.rsp-2]<0)
				{
					Carry=1;
					cpu.memony[cpu.rsp-2]+=REG_BIT;
				}
				else
				{
					Carry=0;
				}

				cpu.memony[cpu.rsp-3]-=cpu.memony[cpu.rsp-1]+Carry;
				cpu.rsp-=2;
				break;
			case 2:
				cpu.memony[cpu.rsp]=cpu.memony[cpu.rsp-2]-cpu.memony[cpu.rsp];

				if(cpu.memony[cpu.rsp]<0)
				{
					Carry=1;
					cpu.memony[cpu.rsp]+=REG_BIT;
				}
				else
				{
					Carry=0;
				}
				cpu.memony[cpu.rsp-1]=-cpu.memony[cpu.rsp-1]-Carry;

				cpu.memony[cpu.rsp-2]+=cpu.memony[cpu.rsp-1];
				cpu.memony[cpu.rsp-1]+=cpu.memony[cpu.rsp];

				cpu.rsp--;
				break;
			case 3:
				cpu.memony[cpu.rsp-1]-=cpu.memony[cpu.rsp];

				if(cpu.memony[cpu.rsp]<0)
				{
					Carry=1;
					cpu.memony[cpu.rsp]+=REG_BIT;
				}
				else
				{
					Carry=0;
				}

				cpu.memony[cpu.rsp-2]-=Carry;
				cpu.rsp--;
				break;

			}
			break;
		case 4://* 
		     int i_temp;
				switch(i.l)
			{
			case 0:  //int *int =int
				cpu.memony[cpu.rsp-1]=cpu.memony[cpu.rsp-1]*cpu.memony[cpu.rsp];
				Carry=cpu.memony[cpu.rsp-1]/REG_BIT;
				if(Carry!=0)
					cpu.memony[cpu.rsp-1]%=REG_BIT;
				cpu.rsp--;
				break;
			case 1:  //long*int=long
				 i_temp=(cpu.memony[cpu.rsp-1]+cpu.memony[cpu.rsp-2]*REG_BIT)*cpu.memony[cpu.rsp];
				if(i_temp<REG_BIT)
				{
					cpu.memony[cpu.rsp-1]=i_temp;
					cpu.memony[cpu.rsp-2]=0;
				}
				else
				{
					cpu.memony[cpu.rsp-2]=i_temp/REG_BIT;
					cpu.memony[cpu.rsp-1]=i_temp%REG_BIT;
				}
				cpu.rsp--;
			
				break;
			case 2:  //int*long
				 i_temp=(cpu.memony[cpu.rsp-1]+cpu.memony[cpu.rsp]*REG_BIT)*cpu.memony[cpu.rsp-2];
					if(i_temp<REG_BIT)
				{
					cpu.memony[cpu.rsp-1]=i_temp;
					cpu.memony[cpu.rsp-2]=0;
				}
				else
				{
					cpu.memony[cpu.rsp-2]=i_temp/REG_BIT;
					cpu.memony[cpu.rsp-1]=i_temp%REG_BIT;
				}
				cpu.rsp--;
				
				break;
			case 3:  //long*long
				i_temp=(cpu.memony[cpu.rsp]+cpu.memony[cpu.rsp-1]*REG_BIT)*(cpu.memony[cpu.rsp-2]+cpu.memony[cpu.rsp-3]*REG_BIT);
				if(i_temp<REG_BIT)
				{
					cpu.memony[cpu.rsp-2]=i_temp;
					cpu.memony[cpu.rsp-3]=0;
				}
				else
				{
					cpu.memony[cpu.rsp-3]=i_temp/REG_BIT;
					cpu.memony[cpu.rsp-2]=i_temp%REG_BIT;
				}
				cpu.rsp--;
				cpu.rsp--;

				break;


			}


			break;
		case 5:// '/'
			

			break;
		case 6:
			//对栈顶操作数取非操作,栈顶数据如果为0,则结果为1
			//否则结果为0;
			//操作后操作数退栈,结果压栈

			if(i.l==0)
			{
				if(cpu.memony[cpu.rsp]==0)
					cpu.memony[cpu.rsp]=1;
				else
					cpu.memony[cpu.rsp]=0;
			}
			else
			{
				if((cpu.memony[cpu.rsp-1]==0)&&(cpu.memony[cpu.rsp]==0))
					cpu.memony[cpu.rsp-1]=1;
				else
					cpu.memony[cpu.rsp-1]=0;
				cpu.rsp--;
			}
			break;
		case 7:
			//对栈顶操作数取真操作,栈顶数据如果为0,则结果为0
			//否则结果为1;
			//操作后操作数退栈,结果压栈

			if(i.l==0)
			{
				if(cpu.memony[cpu.rsp]==0)
					cpu.memony[cpu.rsp]=0;
				else
					cpu.memony[cpu.rsp]=1;
			}
			else
			{
				if((cpu.memony[cpu.rsp-1]==0)&&(cpu.memony[cpu.rsp]==0))
					cpu.memony[cpu.rsp-1]=0;
				else

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -