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

📄 microins.cpp

📁 模拟了tec2000的所有功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include "MicroIns.h"
#include <iostream.h>
#include <string.h>
#include<fstream.h>
#include<stdlib.h>

//int flages;       //标志位

void Am2901::clean()
{
	R=0,S=0;
	A=0,B=0;
	D=0,F=0;
	temp=0;
	flages=0x0;
}

int Am2901::IC(int p)
{
	int x=0,y=0;
	int z=1;
	for(int i=0;i<16;i++)
	{
		y=p&z;
		z=z*2;
		if(y!=0)
			x=z/2;
	}
	return x;
}


int Am2901::QuFan(int p)
{
	int a[16];
	int i=15;
	int x=p;
	while(i>=0)
	{
		a[i]=x%2;
		x=x/2;
		i--;
	}
	for(int j=0;j<16;j++)
	{
		if(a[j]==0)
			a[j]=1;
		else
			a[j]=0;
	}
	int y=0;
	int n=1;
	for(j=0;j<16;j++)
	{
		y=y+a[15-j]*n;
		n=n*2;
	}
	return y;
}


void Am2901::getI2_I0()
{
	char a[5];
	for(int i=0;i<4;i++)
		a[i]=stack[4+i];
	a[4]='\0';
	char *p=a;
//	cout<<"I2-I0:"<<p<<endl;
	if(strcmp(p,"0000")==0) 
		R=A,S=Q;
	if(strcmp(p,"0001")==0)
		R=A,S=B;
	if(strcmp(p,"0010")==0)
		R=0,S=Q;
	if(strcmp(p,"0011")==0)
		R=0,S=B;
	if(strcmp(p,"0100")==0)
		R=0,S=A;
	if(strcmp(p,"0101")==0)
		R=D,S=A;
	if(strcmp(p,"0110")==0)
		R=D,S=Q;
	if(strcmp(p,"0111")==0)
		R=D,S=0;
//	cout<<"D:"<<D<<endl;
//	cout<<"R:"<<R<<' '<<"S:"<<S<<endl;
}

void Am2901::getReg(int *a,int k)
{
	for(int i=0;i<k;i++)
	{
		RR[i]=a[i];
	//	cout<<RR[i]<<' ';
	}
//	cout<<endl;
}
void Am2901::ShiftLeft()
{
	char a[3];
	for(int i=0;i<2;i++)
		a[i]=stack[28+i];
	a[2]='\0';
	char *p=a;
//	cout<<"SSH:"<<p<<endl;
	if(strcmp(p,"00")==0)
	{
		temp=temp*2;
		int m=0x10000;
		temp=temp%m;
	}
	if(strcmp(p,"01")==0)
	{
		int x=flages0;
		if((x&8)!=0)
			c=1;
		else c=0;
		temp=temp*2;
		temp=temp+c;
		int m=0x10000;
		temp=temp%m;
	}
	if(strcmp(p,"10")==0)
	{
		int m,n,k;
		k=0x10000;
		n=temp;
		m=0x8000;
		temp=temp*2;
		temp=temp%k;
		if(Q&m)
		{
			temp=temp+1;
		}
		Q=Q*2;
		Q=Q%k;
		if(n&m)
		{
			Q=Q+1;
		}
	}
}

void Am2901::ShiftRight()
{
	char a[3];
	for(int i=0;i<2;i++)
		a[i]=stack[28+i];
	a[2]='\0';
	char *p=a;
	//cout<<a<<endl;
	if(strcmp(p,"00")==0)
	{
		//cout<<"hello:"<<endl;
		if(temp%2)
		{
			temp=temp-1;
		    temp=temp/2;
		}
		else
			temp=temp/2;
	}
	if(strcmp(p,"01")==0)
	{
		int m=flages0;
		if((m&8)!=0)
			c=1;
		else c=0;
		if(temp%2)
		{
			temp=temp-1;
			temp=temp/2;
		}
		else
			temp=temp/2;
		if(c==1)
			temp=temp+0x8000;
	}
	if(strcmp(p,"10")==0)
	{
		int m,k;
		k=temp;
		m=flages0;
		c=m&0x8;
		int n;
		n=0x8000;
		if(temp%2)
			temp=(temp-1)/2;
		else
			temp=temp/2;
		if(c==1)
			temp=temp+0x8000;
		if(Q%2)
			Q=(Q-1)/2;
		else
			Q=Q/2;
		if(k&0x8000)
			Q=Q+0x8000;
	}
	if(strcmp(p,"11")==0)
	{
		int m;
		m=temp;
		if(temp%2)
			temp=(temp-1)/2;
		else
			temp=temp/2;
		if(m&0x8000)
			temp=temp+0x8000;
		if(Q%2)
			Q=(Q-1)/2;
		else
			Q=Q/2;
		if(m%2)
			Q=Q+0x8000;
	}
}

int Am2901::getSA()
{
	char p;
	p=stack[8];
//	cout<<"SA:"<<p<<endl;
	return p;
}

int Am2901::getSB()
{
	char p=stack[12];
//	cout<<"SB:"<<p<<endl;
	return p;
}

void Am2901::getA()
{
	char x;
	x=getSA();
//	cout<<"SA:"<<x<<endl;
	if(x=='1')
	{
		int a[4];
		for(int i=0;i<4;i++)
			a[i]=stack[20+i]-48;
//		cout<<"a[i]:";
//		for(i=0;i<4;i++)
//			cout<<a[i]<<' ';
//		cout<<endl;
		int m=0;
		int n=1;
		for(i=3;i>=0;i--)
		{
			m=m+a[i]*n;
			n=n*2;
		}
//		cout<<"m:"<<m<<endl;
		A=RR[m];
	}
	else
	{
		int a[4];
		for(int i=0;i<4;i++)
			a[i]=stack[20+i]-48;
		int x=0;
		x=a[0]*8+a[1]*4+a[2]*2+a[3];
		if(x==5)
		{
			A=RR[5];
		}
	}
//	cout<<"A:"<<A<<endl;
}

void Am2901::getB()
{
	char x;
	x=getSB();
//	cout<<"x:"<<x<<endl;
	if(x=='1')
	{
		int a[4];
		for(int i=0;i<4;i++)
			a[i]=stack[16+i]-48;
		int m=0;
		int n=1;
		for(i=3;i>=0;i--)
		{
			m=m+a[i]*n;
			n=n*2;
		}
//		cout<<"m:"<<m<<endl;
		B=RR[m];
	}
	else
	{
		int a[4];
		for(int i=0;i<4;i++)
			a[i]=stack[16+i]-48;
		int x=0;
		x=a[0]*8+a[1]*4+a[2]*2+a[3];
		if(x==5)
		{
			B=RR[5];
		}
	}
//	cout<<"B:"<<B<<endl;
}

int Am2901::Return()
{
	int a[4];
	for(int i=0;i<4;i++)
		a[i]=stack[16+i]-48;
	int m=0;
	int n=1;
	for(i=3;i>=0;i--)
	{
		m=m+a[i]*n;
		n=n*2;
	}
	return m;
}

void Am2901::getI8_I6() 
{
	int x=Return();
//	cout<<"X:"<<x<<endl;
	char a[4];
	for(int i=0;i<3;i++)
		a[i]=stack[9+i];
	a[3]='\0';
	char *p=a;
//	cout<<"I8-I6:"<<p<<endl;
	if(strcmp(p,"000")==0)
		Q=temp,F=temp;
	if(strcmp(p,"001")==0)
		F=temp;
	if(strcmp(p,"010")==0)
	{
		B=temp,F=A;
		if(x>=0)
			RR[x]=B;
	}
	if(strcmp(p,"011")==0)
	{
		B=temp,F=temp;
		if(x>=0)
			RR[x]=B;
	}
	if(strcmp(p,"100")==0)
	{
		ShiftRight(),F=temp;
		B=temp;
		if(x>=0)
			RR[x]=B;
	}
	if(strcmp(p,"101")==0)
	{
		ShiftRight(),F=temp;
		B=temp;
		if(x>=0)
			RR[x]=B;
	}
	if(strcmp(p,"110")==0)
	{
		ShiftLeft(),F=temp;
		B=temp;
		if(x>=0)
			RR[x]=B;
	}
	if(strcmp(p,"111")==0)
	{
		ShiftLeft(),F=temp;
		B=temp;
		if(x>=0)
			RR[x]=B;
	}
//	cout<<"F:"<<F<<' '<<"B:"<<B<<"Q:"<<Q<<endl;
}

void Am2901::getI5_I3()
{
	char a[4];
	for(int i=0;i<3;i++)
		a[i]=stack[13+i];
	a[3]='\0';
	char *p=a;
//	cout<<"I5-I3:"<<p<<endl;
	if(strcmp(p,"000")==0)
	{
		temp=R+S+Cin;
		int x,y,z;
		x=IC(R);
		y=IC(S);
		z=IC(temp);
		if(x>=y)
		{
			if(x==z)
				flages&=0x7;
			else flages|=0x8;
		}
		else
		{
			if(y==z)
				flages&=0x7;
			else flages|=0x8;
		}
		if(temp==0)
			flages|=0x4;
		else flages&=0xb;
		if(temp&0x10000)
		{
			flages|=0x2;
			int x=0x10000;
			temp=temp%x;
		}
		else flages&=0xd;
		if(temp<0)
			flages|=0x1;
		else flages&=0xe;
	}
	if(strcmp(p,"001")==0)
	{
		temp=S-R-(!Cin);
		//cout<<~Cin<<endl;
		//cout<<"hello"<<endl;
		//cout<<temp<<endl;
		//cout<<S<<' '<<R<<endl;
		if(S<R)
			flages&=0x7;
		else
		{
			int x,y;
			x=IC(S);
			y=IC(R);
			if(x==y)
			{
				if(S>=R)
					flages|=0x8;
				else flages&=0x7;
			}
			else
			{
				int X=S;
				X=X-x;
				if(X>=R)
					flages|=0x8;
				else flages&=0x7;
			}
		}
		if(temp==0)
			flages|=0x4;
		else flages&=0xb;
		flages&=0xd;
		if(S<R)
			flages|=0x1;
		else flages&=0xe;
//		cout<<"flages:"<<flages<<endl;
	}
	if(strcmp(p,"010")==0)
	{
		temp=R-S-(!Cin);
		int x,y;
		x=IC(R);
		y=IC(S);
		if(R<S)
			flages&=0x7;
		else
		{
			if(x==y)
			{
				if(R>=S)
					flages&=0x7;
				else flages|=0x8;
			}
			else
			{
				int X=R;
				X=X-x;
				if(X>=S)
					flages&=0x7;
				else flages|=0x8;
			}
		}
		if(temp==0)
			flages|=0x4;
		else flages&=0xb;
		flages&=0xd;
		if(R<S)
			flages|=0x1;
		else flages=0xe;
	}
	if(strcmp(p,"011")==0)
	{
		temp=R|S;
		flages=0x0;
		if(temp==0)
			flages|=0x4;
		else flages&=0xb;
	}
	if(strcmp(p,"100")==0)
	{
		temp=R&S;
		flages=0x0;
		if(temp==0)
			flages|=0x4;
		else flages&=0xb;
	}
	if(strcmp(p,"101")==0)
	{
		int x;
		x=R&S;
		temp=QuFan(x);
		flages=0x0;
		if(temp==0)
			flages|=0x4;
		else flages&=0xb;
	}
	if(strcmp(p,"110")==0)
	{
		temp=R^S;
		flages=0x0;
		if(temp==0)
			flages|=0x4;
		else flages&=0xb;
	}
	if(strcmp(p,"111")==0)
	{
		int x;
		x=R^S;
		temp=QuFan(x);
		flages=0x0;
		if(temp==0)
			flages|=0x4;
		else flages&=0xb;
	}
//	cout<<"temp:"<<temp<<endl;
}

void Am2901::getSST()
{
	char a[5];
	for(int i=0;i<4;i++)
		a[i]=stack[24+i];
	a[4]='\0';
	char *p=a;
//	cout<<"SST:"<<p<<endl;
	if(strcmp(p,"0000")==0)
		getCZVS();
	if(strcmp(p,"0001")==0)
	{
		if(flages&8)
			c=1;
		else c=0;
		if(flages&4)
			z=1;
		else z=0;
		if(flages&2)
			v=1;
		else v=0;
		if(flages&1)
			s=1;
		else s=0;
	}
	if(strcmp(p,"0011")==0)
	{
		getCZVS();
		c=0;
	}
	if(strcmp(p,"0100")==0)
	{
		getCZVS();
		c=1;
	}
	if(strcmp(p,"0101")==0)
	{
		getCZVS();
		int x=temp;
		int y=1;
		x=x&y;
		c=x;
		cout<<"C:"<<c<<endl;
	}
	if(strcmp(p,"0110")==0)
	{
		getCZVS();
		int x=temp;
		int y=0x8000;
		x=x&y;
		c=x;

	}
	if(strcmp(p,"0111")==0)
	{
		getCZVS();
		int x=Q;
		int y=1;
		x=x&y;
		c=x;
	}
	flages=0;
	if(c==1)
		flages|=8;
	if(z==1)
		flages|=4;
	if(v==1)
		flages|=2;
	if(s==1)
		flages|=1;
//	cout<<"hello"<<flages<<endl;
}

void Am2901::getSCI()
{
	char a[3];
	a[0]=stack[30];
	a[1]=stack[31];
	a[2]='\0';
	char *p=a;
//	cout<<"SCI:"<<p<<endl;
	getCZVS();
	if(strcmp(p,"00")==0)
	{
		Cin=0;
	}
	if(strcmp(p,"01")==0)
	{
		Cin=1;
	}
	if(strcmp(p,"10")==0)
	{
		Cin=c;
	}
//	cout<<"Cin:"<<Cin<<endl;
}

void Am2901::getCZVS()
{
	if(flages0&8)
		c=1;
	else c=0;
	if(flages0&4)
		z=1;
	else z=0;
	if(flages0&2)
		v=1;
	else v=0;
	if(flages0&1)
		s=1;
	else s=0;
}

void Am2901::getStack(char *p,int count)
{
	for(int i=0;i<count;i++)
		this->stack[i]=p[i];
}

MicroIns::MicroIns()
{
//	MicroP=new int [5][50];
//	MicroAddr=new int[2];
	IR=new int[10];
	for(int j=0;j<10;j++)
		IR[j]=0;
	IR[9]=-1;
	IR=new int [10];
	RC=uPC=uSP=0;
	uStack=new int[5];
	for(int i=0;i<5;i++)uStack[i]=0;	
	d=-1;
	flages0=0;
	flages=0;
	MicroIR=new int [50];
	C=0,Z=0,V=0,S=0;
	uI3=uI2=uI1=uI0=0;
	SCC3=SCC2=SCC1=SCC0=0;
	Full=0;
}



MicroIns::~MicroIns()
{
	delete uStack;
	delete MicroIR;
	delete IR;

}

void MicroIns::getIR(int *a)
{
	for(int i=0;i<10;i++)
		IR[i]=a[i];
//	for( i=0;i<10;i++)
//		cout<<IR[i];
//	cout<<endl;
}

void MicroIns::Getflages0(WORD flag)
{
	int x=0;
	if(flag&0x8000)
		x=x+8;
	if(flag&0x4000)
		x=x+4;
	if(flag&0x2000)
		x=x+2;
	if(flag&0x1000)
		x=x+1;
	flages0=x;
}

void MicroIns::getMicroIR()
{

	for(int i=0;i<20;i++)
	{
		if(uPC==MicroP[i][0])
		{
			for(int j=0;j<50;j++)
				MicroIR[j]=MicroP[i][j];
		}
	}
//	for(i=0;i<50;i++)
//		cout<<MicroIR[i]<<' ';
//	cout<<endl;
}

void MicroIns::getMicroP(int argc,int * argv[]) //argc表示参数个数,即微指令个数,argv[]表示各个参数的指针
{
	for(int i=0;i<20;i++)
		MicroP[i]=new int[50];
	for(i=0;i<argc;i++)
	{
		for(int j=0;j<50;j++)
			MicroP[i][j]=argv[i][j];
	}
	for(i=argc;i<20;i++)
		for(int j=0;j<50;j++)
			MicroP[i][j]=-1;

}

void MicroIns::getMicroAddr(int argc,int * argv[])
{

	for(int i=0;i<20;i++)
		MicroAddr[i]=new int[2];

	for(i=0;i<argc;i++)
	{
		for(int j=0;j<2;j++)
			MicroAddr[i][j]=argv[i][j];
	}
	for(i=argc;i<20;i++)
		for(int j=0;j<2;j++)
			MicroAddr[i][j]=-1;

}


void MicroIns::ClearStack()
{
	uSP=-1;
	for(int i=0;i<5;i++)uStack[i]=0;

⌨️ 快捷键说明

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