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

📄 simu.cpp

📁 模拟了tec2000的所有功能
💻 CPP
字号:
#include "stdafx.h"
#include "TEC2000.h"
#include "MicroProDlg.h"

#include <iostream>
#include "simu.h"

using namespace std;


//以下为数据转化部分

COffSimu::COffSimu()
{
	int i;
	for(i=0;i<3;i++)
	{
		I8_6[i]=0;
		I5_3[i]=0;
		I2_0[i]=0;
		SST2_0[i]=0;
	}
	for(i=0;i<2;i++)
	{
		SCI1_0[i]=0;
		SSH1_0[i]=0;
	}
	for(i=0;i<16;i++)
	{
		Q[i]=0;
		for(int j=0;j<16;j++)
			r[i][j]=0;
	}
	for(i=0;i<4;i++)
	{
        A[i]=0;
		B[i]=0;
		flag[i]=0;
		temflag[i]=0;
	}
}




	void COffSimu::Dec2Bin(int dec)
	{
		//int x[17];
		int i;//存放每次运算后的余数
		for(i=0;i<17;i++)
			x[i]=0;
		int j=16;
		do{
			i=dec%2;
			x[j]=i;
			j--;
			dec=dec/2;
		}while(dec!=0);
		//return x;
	}

	int COffSimu::Bin2Dec(int bin[],int n)//二进制化为十进制(二进制为int型数组)
	{
		int x=1;
		int y=0,z=0;
		for(int i=1;i<n;i++)
		{
			x=2*x;
		}
		for(int j=0;j<n;j++)
		{
			y=bin[j]*x;
			z+=y;
			x=x/2;
		}
		return z;
	}

	//以下为运算部分
	void COffSimu::ADD(int R[],int S[])
	{
		int r,s;
		//int *p;
		//int x=Bin2Dec(B,4);//B口地址换算成十进制
		r=Bin2Dec(R,16);
		s=Bin2Dec(S,16);
		r=r+s+Cin;
		Dec2Bin(r);
		if(x[0]==1)
			temflag[0]=1;//进位
		if(x[1]==1)
			temflag[3]=1;//符号位
		if(x[1]==0)
			temflag[3]=0;
        for(int i=0;i<16;i++)
			F[i]=x[i+1];

	}

	void COffSimu::srSUB(int R[],int S[])
	{
		int i,y[16];
		for(i=0;i<16;i++)
			y[i]=(R[i]+1)%2;
	    int k=0,k1;
	    F[15]=y[15]+S[15]+1-(1-Cin);
		if(F[15]>=2)
		{
			F[15]=F[15]-2;
			k=1;
		}
	    for(i=14;i>=0;i--)
		{
			 k1=k;
			 F[i]=y[i]+S[i]+k;
			 if(F[i]>=2) 
			 { 
				 F[i]=F[i]-2;
				 k=1;
			 }
			 else 
				 k=0;
		     if(i==11) 
				 C0=k1;
		}
		if(k==1)
		{
			temflag[0]=0;
			if(k1==1) 
				temflag[2]=0;
			else temflag[2]=1;
		}
		else
		{
			temflag[0]=1;
			temflag[2]=0;
		}
	    if(F[0]==1) 
			temflag[3]=1;
		int sum=0;
		for(i=0;i<16;i++)  sum+=F[i];
		if(sum==0) 
			temflag[1]=1;
	}

	void COffSimu::rsSUB(int R[],int S[])
	{
		int i,k,k2,s[16];
		for(i=0;i<16;i++) s[i]=(S[i]+1)%2;
			    k=0;
			    F[15]=s[15]+R[15]+1-(1-Cin);
			    if(F[15]>=2){ F[15]=F[15]-2;k=1;}
			    for(i=14;i>=0;i--)
				{
				   k2=k;
				   F[i]=s[i]+R[i]+k;
				   if(F[i]>=2) { F[i]=F[i]-2;k=1;}
				   else k=0;
				   if(i==11) C0=k2;
				}
			    if(k==1) {temflag[0]=0;
			            if(k2==1) temflag[2]=0;
						else temflag[2]=1;}
			    else {temflag[0]=1;temflag[2]=0;}
			    if(F[0]==1) temflag[3]=1;
				int sum=0;
			    for(i=0;i<16;i++)  sum+=F[i];
			    if(sum==0) temflag[1]=1;
	}

	void COffSimu::OR(int R[],int S[])
	{
		//int x=Bin2Dec(B,4);//B口地址换算成十进制
		for(int i=0;i<16;i++)
		{
			if(R[i]==0&&S[i]==0)
				F[i]=0;
			else
				F[i]=1;
		}
		if(F[0]==1)
			temflag[3]=1;
	}

	void COffSimu::AND(int R[],int S[])
	{
		//int x=Bin2Dec(B,4);//B口地址换算成十进制
		for(int i=0;i<16;i++)
		{
			if(R[i]==1&&S[i]==1)
				F[i]=1;
			else
				F[i]=0;
		}
		if(F[0]==1)
			temflag[3]=1;
	}

	void COffSimu::XOR(int R[],int S[])
	{
		//int x=Bin2Dec(B,4);//B口地址换算成十进制
		for(int i=0;i<16;i++)
		{
			if(R[i]==S[i])
				F[i]=0;
			else
				F[i]=1;
		}
		if(F[0]==1)
			temflag[3]=1;
	}

	void COffSimu::NRAND(int R[],int S[])
	{
		//int x=Bin2Dec(B,4);//B口地址换算成十进制
		for(int i=0;i<16;i++)
		{
			if(R[i]==0)
				R[i]=1;
			else
				R[i]=0;
		}
		for(i=0;i<16;i++)
		{
			if(R[i]==1&&S[i]==1)
				F[i]=1;
			else
				F[i]=0;
		}
		if(F[0]==1)
			temflag[3]=1;
	}

	void COffSimu::NXOR(int R[],int S[])
	{
		//int x=Bin2Dec(B,4);//B口地址换算成十进制
		for(int i=0;i<16;i++)
		{
			if(R[i]==S[i])
				F[i]=1;
			else
				F[i]=0;
		}
		if(F[0]==1)
			temflag[3]=1;
	}

	//以下是控制码部分
	void COffSimu::OpRA()
	{
		int x=Bin2Dec(A,4);//A口地址换算成十进制
		for(int i=0;i<16;i++)
			tem1[i]=r[x][i];
	}

	void COffSimu::OpRB()
	{
		int x=Bin2Dec(B,4);//B口地址换算成十进制
		for(int i=0;i<16;i++)
			tem2[i]=r[x][i];
	}



	void COffSimu::OpI2_0()//分析I2_0字段,将来源数据放入R[],S[]
	{
		int x=Bin2Dec(I2_0,3);
		int i;
		switch(x)
		{
		case 0:
			for(i=0;i<16;i++)
			{
				R[i]=tem1[i];
				S[i]=Q[i];
			}
			break;
		case 1:
			for(i=0;i<16;i++)
			{
				R[i]=tem1[i];
				S[i]=tem2[i];
			}
			break;
		case 2:
			for(i=0;i<16;i++)
			{
				R[i]=0;
				S[i]=Q[i];
			}
			break;
		case 3:
			for(i=0;i<16;i++)
			{
				R[i]=0;
				S[i]=tem2[i];
			}
			break;
		case 4:
			for(i=0;i<16;i++)
			{
				R[i]=0;
				S[i]=tem1[i];
			}
			break;
		case 5:
			for(i=0;i<16;i++)
			{
				R[i]=D[i];
				S[i]=tem1[i];
			}
			break;
		case 6:
			for(i=0;i<16;i++)
			{
				R[i]=D[i];
				S[i]=Q[i];
			}
			break;
		case 7:
			for(i=0;i<16;i++)
			{
				R[i]=D[i];
				S[i]=0;
			}
			break;
		}
	}

	void COffSimu::OpI5_3()//分析I5_3字段,执行相应操作
	{
		int x=Bin2Dec(I5_3,3);
		switch(x)
		{
		case 0:
			ADD(R,S);
			break;
		case 1:
			srSUB(R,S);
			break;
		case 2:
			rsSUB(R,S);
			break;
		case 3:
			OR(R,S);
			break;
		case 4:
			AND(R,S);
			break;
		case 5:
			XOR(R,S);
			break;
		case 6:
			NRAND(R,S);
			break;
		case 7:
			NXOR(R,S);
			break;
		}
	}
	
	void COffSimu::OpI8_6()//分析I8_6字段,处理运算结果
	{
		int x=Bin2Dec(I8_6,3);
		int y=Bin2Dec(B,4);//B口地址换算成十进制
		int z=Bin2Dec(A,4);//A口地址换算成十进制
		int i;
        switch(x)
		{
		case 0:
			for(i=0;i<16;i++)
			{	
				Q2[i]=F[i];
				Y[i]=F[i];
			}
			break;
		case 1:
			for(i=0;i<16;i++)
			{
				Y[i]=F[i];
			}
			break;
		case 2:
			for(i=0;i<16;i++)
			{
				r2[y][i]=F[i];
				Y[i]=tem1[i];
			}
			break;
		case 3:
			for(i=0;i<16;i++)
			{
				r2[y][i]=F[i];
				Y[i]=F[i];
			}
			break;
		case 4:
			for(i=0;i<16;i++)
			{
				r2[y][i+1]=F[i];
				Q2[i+1]=Q[i];
				Y[i]=F[i];
			}
			RShift();
			break;
		case 5:
			for(i=0;i<16;i++)
			{
				r2[y][i+1]=F[i];
				Y[i]=F[i];
			}
			RShift();
			break;
		case 6:
			for(i=0;i<16;i++)
			{
				r2[y][i]=F[i+1];
				Q2[i]=Q[i+1];
				Y[i]=F[i];
			}
			LShift();
			break;
		case 7:
		for(i=0;i<16;i++)
			{
				r2[y][i]=F[i+1];
				Y[i]=F[i];
			}
			LShift();
			break;
		}
	}

	void COffSimu::OpSST2_0()//分析SST2_0字段,执行相应操作
	{
		int x,y;
		int i;
		x=Bin2Dec(SST2_0,3);
		y=Bin2Dec(B,4);
		switch(x)
		{
		case 0:
			break;
		case 1:
			for(i=0;i<4;i++)
				flag[i]=temflag[i];
			break;
		case 2:
			for(i=0;i<4;i++)
				flag[i]=0;
			break;
		case 3:
			flag[0]=0;
			break;
		case 4:
			flag[0]=1;
			break;
		case 5:
			flag[0]=r2[y][0];
			break;
		case 6:
			flag[0]=r2[y][15];
			break;
		case 7:
			flag[0]=Q[0];
			break;
		}
	}

	void COffSimu::LShift()//分析SSH1_0字段,执行相应操作
	{
		int x,y;
		x=Bin2Dec(SSH1_0,2);
		y=Bin2Dec(B,4);
		switch(x)
		{
		case 0:
			r2[y][15]=0;
			break;
		case 1:
			r2[y][15]=flag[0];
			break;
		case 2:
			r2[y][15]=Q[15];
			Q[15]=F[15];
		case 3:
			break;
		}
	}

	void COffSimu::RShift()
	{
		int x,y;
		x=Bin2Dec(SSH1_0,2);
		y=Bin2Dec(B,4);
		switch(x)
		{
		case 0:
			r2[y][0]=0;
			break;
		case 1:
			r2[y][0]=flag[0];
			break;
		case 2:
			r2[y][0]=flag[0];
			Q[0]=r2[y][0];
		case 3:
			r2[y][0]=F[15];
			Q[0]=r2[y][0];
			break;
		}
	}

    void COffSimu::OpSCI1_0()//分析SCI1_0字段,执行相应操作
	{
		int x;
		x=Bin2Dec(SCI1_0,2);
		switch(x)
		{
		case 0:
			Cin=0;
			break;
		case 1:
			Cin=1;
			break;
		case 2:
			Cin=flag[0];
			break;
		case 3:
			Cin=C0;
			break;
		}
	}
	void COffSimu::DoOperation()
	{
		OpRA();//A地址内容放入tem1[16]
		OpRB();//B地址内容放入tem2[16]
		OpI2_0();//来源数据放入R[16],S[16]
		OpSCI1_0();//最低位进位处理
		OpI5_3();//运算
		OpI8_6();//存储
	}

	void COffSimu::Start()
	{
		int x=Bin2Dec(B,4);
		for(int i=0;i<16;i++)
		{
			Q[i]=Q2[i];
			r[x][i]=r2[x][i];
		}
		DoOperation();
		OpSST2_0();
	}

⌨️ 快捷键说明

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