📄 simulator.cpp
字号:
// 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 + -