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

📄 microins.cpp

📁 模拟了tec2000的所有功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	Full=0;
}

void MicroIns::Push(int a)
{
	if(Full==1)
	{
		uStack[uSP]=a;
	}
	else
	{
		uSP++;
		if(uSP==4)Full=1;
		uStack[uSP]=a;
	}
}



int MicroIns::GetTop()
{
	if(uSP==-1)return 0;
	return uStack[uSP];
}



int MicroIns::Pop()
{
	if(uSP==-1)return 0;
	int Temp=uStack[uSP];
	if(uSP==4)Full=0;
	uSP--;
	return Temp;
}

void MicroIns::getADDR()
{
	if(MicroIR[18]==1)
	{
		MicroIR[30]=IR[5];
		MicroIR[31]=IR[6];
		MicroIR[32]=IR[7];
		MicroIR[33]=IR[8];
	}
	if(MicroIR[22]==1)
	{
		MicroIR[26]=IR[1];
		MicroIR[27]=IR[2];
		MicroIR[28]=IR[3];
		MicroIR[29]=IR[4];
	}
	if(IR[9]!=-1)
		d=IR[9];
//	cout<<"ADDR:"<<d<<endl;
}

void MicroIns::SetDwithMIR()
{
	D=MicroIR[1];
}

void MicroIns::SetuIinSCCi()
{
	uI3=MicroIR[2];
	uI2=MicroIR[3];
	uI1=MicroIR[4];
	uI0=MicroIR[5];
	SCC3=MicroIR[6];
	SCC2=MicroIR[7];
	SCC1=MicroIR[8];
	SCC0=MicroIR[9];
//	cout<<"UI3-uI0:"<<uI3<<uI2<<uI1<<uI0<<endl;
//	cout<<"SCC:"<<SCC3<<SCC2<<SCC1<<SCC0<<endl;
}

void MicroIns::setAm2901(Am2901 *m)
{
	m->clean();
	if(d!=-1) 
	{
		m->getD(d);
//		cout<<"D:"<<d<<endl;
	}
	int a[40];
	for(int i=0;i<40;i++)
	{
		a[i]=MicroIR[10+i];
	}
	char b[41];
	for(i=0;i<40;i++)
		b[i]=(char)(a[i]+48);
	b[40]='\0';
//	cout<<b<<endl;
//	char *p=b;
	m->getStack(b,41);
//	for(i=0;i<40;i++)
//		cout<<m->stack[i]<<' ';
//	cout<<endl;

	m->getReg(R,16);
	m->getA();
	m->getB();
	m->getflages0(flages0);
	m->getSCI();
	m->getI2_I0();
	m->getI5_I3();
	m->getSST();
	m->getI8_I6();
	for(i=0;i<16;i++)
	{
		R[i]=m->RR[i];
	}
	flages=m->flages;
//	cout<<"flages:"<<flages<<endl;
}


void MicroIns::SetCC()
{
	int Temp=IR[0];
	switch(8*SCC3+4*SCC2+2*SCC1+SCC0)
	{
	case 0:CC=0;break;
	case 2:CC=1;break;
	case 4:
		if((Temp==0x44)&&(C==0))CC=0;
		if((Temp==0x44)&&(C==1))CC=1,uPC=0x2f;
		if((Temp==0x45)&&(C==0))CC=1,uPC=0x2f;
		if((Temp==0x45)&&(C==1))CC=0;
		if((Temp==0x46)&&(Z==0))CC=0;
		if((Temp==0x46)&&(Z==1))CC=1,uPC=0x2f;
		if((Temp==0x47)&&(Z==0))CC=1;
		if((Temp==0x47)&&(Z==1))CC=0,uPC=0x2f;
		break;
	case 5:
		if((Temp==0x64)&&(S==0))CC=0;
		if((Temp==0x64)&&(S==1))CC=1,uPC=0x2f;
		if((Temp==0x65)&&(S==0))CC=1;
		if((Temp==0x65)&&(S==1))CC=0,uPC=0x2f;
		break;
	case 6:
		if(Temp&2)CC=1;
		else CC=0;
		break;

	case 7:
		if(Temp&1)CC=0;
		else CC=1;
		break;
	}
//	cout<<"CC:"<<CC<<endl;
}

void MicroIns::getR(int *a,int k)
{
	for(int i=0;i<k;i++)
		R[i]=a[i];
}

void MicroIns::getupc()
{
	int x;
	x=IR[0];
	for(int i=0;i<20;i++)
	{
		if(x==MicroAddr[i][0])
		{
			uPC=MicroAddr[i][1];
//			cout<<"uPC:"<<uPC<<endl;
		}
	}
}

void MicroIns::getD()
{
	D=getd();
}

void MicroIns::getRC()
{
	RC=MicroIR[1];
	RC=RC+1;
}
void MicroIns::AM2910()
{
	int a=8*uI3+4*uI2+2*uI1+uI0;
//	cout<<a<<endl;
	if(CC==1)
	{
		switch(8*uI3+4*uI2+2*uI1+uI0)
		{
		case 0:
			SetDwithMIR();
			Y=0;
			ClearStack();
			break;
		case 1:
			SetDwithMIR();
			Y=uPC+1;
			break;
		case 2:
			getD();
			Y=D;
			break;
		case 3:
			SetDwithMIR();
			Y=uPC+1;
			break;
		case 4:
			SetDwithMIR();
			Y=uPC+1;
			Push(uPC+1);
			getRC();
			break;
		case 5:
			SetDwithMIR();
			Y=RC;
			Push(uPC+1);
			break;
		case 6:
			Y=uPC+1;
			break;
		case 7:
			SetDwithMIR();
			Y=RC;
			break;
		case 8:
			SetDwithMIR();
			if(RC!=0)
			{
				Y=GetTop();
				RC--;
			}
			if(RC==0)
			{
				Y=uPC+1;
				Pop();
			}
			break;
		case 9:
			SetDwithMIR();
			if(RC!=0)
			{
				Y=uPC;
				RC--;
			}
			if(RC==0)Y=uPC+1;
			break;
		case 10:
			SetDwithMIR();
			Y=uPC+1;
			break;
		case 11:
			SetDwithMIR();
			Y=uPC+1;
			break;
		case 12:
			SetDwithMIR();
			getRC();
			Y=uPC+1;
			RC=D;
			break;
		case 13:
			SetDwithMIR();
			Y=GetTop();
			break;
		case 14:
			SetDwithMIR();
			Y=uPC+1;
			break;
		case 15:
			SetDwithMIR();
			if(RC!=0)
			{
				Y=GetTop();
				RC--;
			}
			if(RC==0)
			{
				Y=D;
				Pop();
			}
			break;
		}
	}
	if(CC==0)
	{
		switch(8*uI3+4*uI2+2*uI1+uI0)
		{
		case 0:
			SetDwithMIR();
			Y=0;
			ClearStack();
			break;
		case 1:
			SetDwithMIR();
			Y=D;
			Push(uPC+1);
			break;
		case 2:
			getD();
			Y=D;
			break;
		case 3:
			SetDwithMIR();
			Y=D;
			break;
		case 4:
			SetDwithMIR();
			getRC();
			Y=uPC+1;
			Push(uPC+1);
			break;
		case 5:
			SetDwithMIR();
			Y=D;
			Push(uPC+1);
			break;
		case 6:
			Y=D;
			break;
		case 7:
			SetDwithMIR();
			Y=D;
			break;
		case 8:
			SetDwithMIR();
			if(RC!=0)
			{
				Y=GetTop();
				RC--;
			}
			if(RC==0)
			{
				Y=uPC+1;
				Pop();
			}
			break;
		case 9:
			SetDwithMIR();
			if(RC!=0)
			{
				Y=D;
				RC--;
			}
			if(RC==0)Y=uPC+1;
			break;
		case 10:
			SetDwithMIR();
			Y=Pop();
			break;
		case 11:
			SetDwithMIR();
			Y=D;
			Pop();
			break;
		case 12:
			SetDwithMIR();
			getRC();
			Y=uPC+1;
			RC=D;
			break;
		case 13:
			SetDwithMIR();
			Y=uPC+1;
			Pop();
			break;
		case 14:
			SetDwithMIR();
			Y=uPC+1;
			break;
		case 15:
			SetDwithMIR();
			if(RC!=0)
			{
				Y=uPC+1;
				Pop();
				RC--;
			}
			if(RC==0)
			{
				Y=uPC+1;
				Pop();
			}
			break;
		}
	}
	uPC=Y;
//	cout<<"upc:"<<uPC<<endl;
//	cout<<"RC:"<<RC<<endl;
}

void MicroIns::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;
//	cout<<"CZVS:"<<C<<' '<<Z<<' '<<V<<' '<<S<<endl;
}

int MicroIns::HexToDec(char a)
{
	int x=-1;
	if(a=='0')
		x=0;
	if(a=='1')
		x=1;
	if(a=='2')
		x=2;
	if(a=='3')
		x=3;
	if(a=='4')
		x=4;
	if(a=='5')
		x=5;
	if(a=='6')
		x=6;
	if(a=='7')
		x=7;
	if(a=='8')
		x=8;
	if(a=='9')
		x=9;
	if(a=='a'||a=='A')
		x=10;
	if(a=='b'||a=='B')
		x=11;
	if(a=='c'||a=='C')
		x=12;
	if(a=='d'||a=='D')
		x=13;
	if(a=='e'||a=='E')
		x=14;
	if(a=='f'||a=='F')
		x=15;
	return x;
}

void MicroIns::Exec(WORD *Rtemp,WORD instype,WORD flags,WORD *pmemory)
{
//	AfxMessageBox("hello");
	memory=pmemory;
	for(int i=0;i<16;i++)
	{
		R[i]=Rtemp[i];
	}
	Getflages0(flags);
	int x=R[5];
	int temp=0;
	int a[10];
	temp=memory[x]&0xff00;
	temp=temp/(0x100);
	a[0]=temp;
	a[9]=-1;
	if(instype==41||instype==42||instype==6)
	{
		a[9]=memory[x+1];
		temp=memory[x]&0x00f0;
		temp=temp/(0x10);
		if(temp==0)
			a[1]=0,a[2]=0,a[3]=0,a[4]=0;
		if(temp==1)
			a[1]=0,a[2]=0,a[3]=0,a[4]=1;
		if(temp==2)
			a[1]=0,a[2]=0,a[3]=1,a[4]=0;
		if(temp==3)
			a[1]=0,a[2]=0,a[3]=1,a[4]=1;
		if(temp==4)
			a[1]=0,a[2]=1,a[3]=0,a[4]=0;
		if(temp==5)
			a[1]=0,a[2]=1,a[3]=0,a[4]=1;
		if(temp==6)
			a[1]=0,a[2]=1,a[3]=1,a[4]=0;
		if(temp==7)
			a[1]=0,a[2]=1,a[3]=1,a[4]=1;
		if(temp==8)
			a[1]=1,a[2]=0,a[3]=0,a[4]=0;
		if(temp==9)
			a[1]=1,a[2]=0,a[3]=0,a[4]=1;
		if(temp==10)
			a[1]=1,a[2]=0,a[3]=1,a[4]=0;
		if(temp==11)
			a[1]=1,a[2]=0,a[3]=1,a[4]=1;
		if(temp==12)
			a[1]=1,a[2]=1,a[3]=0,a[4]=0;
		if(temp==13)
			a[1]=1,a[2]=1,a[3]=0,a[4]=1;
		if(temp==14)
			a[1]=0,a[2]=1,a[3]=1,a[4]=0;
		if(temp==15)
			a[1]=1,a[2]=1,a[3]=1,a[4]=1;
		temp=memory[x]&0x000f;
		if(temp==0)
			a[5]=0,a[6]=0,a[7]=0,a[8]=0;
		if(temp==1)
			a[5]=0,a[6]=0,a[7]=0,a[8]=1;
		if(temp==2)
			a[5]=0,a[6]=0,a[7]=1,a[8]=0;
		if(temp==3)
			a[5]=0,a[6]=0,a[7]=1,a[8]=1;
		if(temp==4)
			a[5]=0,a[6]=1,a[7]=0,a[8]=0;
		if(temp==5)
			a[5]=0,a[6]=1,a[7]=0,a[8]=1;
		if(temp==6)
			a[5]=0,a[6]=1,a[7]=1,a[8]=0;
		if(temp==7)
			a[5]=0,a[6]=1,a[7]=1,a[8]=1;
		if(temp==8)
			a[5]=1,a[6]=0,a[7]=0,a[8]=0;
		if(temp==9)
			a[5]=1,a[6]=0,a[7]=0,a[8]=1;
		if(temp==10)
			a[5]=1,a[6]=0,a[7]=1,a[8]=0;
		if(temp==11)
			a[5]=1,a[6]=0,a[7]=1,a[8]=1;
		if(temp==12)
			a[5]=1,a[6]=1,a[7]=0,a[8]=0;
		if(temp==13)
			a[5]=1,a[6]=1,a[7]=0,a[8]=1;
		if(temp==14)
			a[5]=0,a[6]=1,a[7]=1,a[8]=0;
		if(temp==15)
			a[5]=1,a[6]=1,a[7]=1,a[8]=1;
	}
	if(instype==5)
	{
		a[9]=memory[x]&0x00ff;
		for(int i=1;i<9;i++)
			a[i]=0;
	}
	if(instype==1||instype==22||instype==23||instype==21||instype==3)
	{
		temp=memory[x]&0x00f0;
		temp=temp/(0x10);
		if(temp==0)
			a[1]=0,a[2]=0,a[3]=0,a[4]=0;
		if(temp==1)
			a[1]=0,a[2]=0,a[3]=0,a[4]=1;
		if(temp==2)
			a[1]=0,a[2]=0,a[3]=1,a[4]=0;
		if(temp==3)
			a[1]=0,a[2]=0,a[3]=1,a[4]=1;
		if(temp==4)
			a[1]=0,a[2]=1,a[3]=0,a[4]=0;
		if(temp==5)
			a[1]=0,a[2]=1,a[3]=0,a[4]=1;
		if(temp==6)
			a[1]=0,a[2]=1,a[3]=1,a[4]=0;
		if(temp==7)
			a[1]=0,a[2]=1,a[3]=1,a[4]=1;
		if(temp==8)
			a[1]=1,a[2]=0,a[3]=0,a[4]=0;
		if(temp==9)
			a[1]=1,a[2]=0,a[3]=0,a[4]=1;
		if(temp==10)
			a[1]=1,a[2]=0,a[3]=1,a[4]=0;
		if(temp==11)
			a[1]=1,a[2]=0,a[3]=1,a[4]=1;
		if(temp==12)
			a[1]=1,a[2]=1,a[3]=0,a[4]=0;
		if(temp==13)
			a[1]=1,a[2]=1,a[3]=0,a[4]=1;
		if(temp==14)
			a[1]=0,a[2]=1,a[3]=1,a[4]=0;
		if(temp==15)
			a[1]=1,a[2]=1,a[3]=1,a[4]=1;
		temp=memory[x]&0x000f;
		if(temp==0)
			a[5]=0,a[6]=0,a[7]=0,a[8]=0;
		if(temp==1)
			a[5]=0,a[6]=0,a[7]=0,a[8]=1;
		if(temp==2)
			a[5]=0,a[6]=0,a[7]=1,a[8]=0;
		if(temp==3)
			a[5]=0,a[6]=0,a[7]=1,a[8]=1;
		if(temp==4)
			a[5]=0,a[6]=1,a[7]=0,a[8]=0;
		if(temp==5)
			a[5]=0,a[6]=1,a[7]=0,a[8]=1;
		if(temp==6)
			a[5]=0,a[6]=1,a[7]=1,a[8]=0;
		if(temp==7)
			a[5]=0,a[6]=1,a[7]=1,a[8]=1;
		if(temp==8)
			a[5]=1,a[6]=0,a[7]=0,a[8]=0;
		if(temp==9)
			a[5]=1,a[6]=0,a[7]=0,a[8]=1;
		if(temp==10)
			a[5]=1,a[6]=0,a[7]=1,a[8]=0;
		if(temp==11)
			a[5]=1,a[6]=0,a[7]=1,a[8]=1;
		if(temp==12)
			a[5]=1,a[6]=1,a[7]=0,a[8]=0;
		if(temp==13)
			a[5]=1,a[6]=1,a[7]=0,a[8]=1;
		if(temp==14)
			a[5]=0,a[6]=1,a[7]=1,a[8]=0;
		if(temp==15)
			a[5]=1,a[6]=1,a[7]=1,a[8]=1;
		a[9]=-1;
	}
/*	CString temp2,temp1;
	for(i=0;i<10;i++){
		temp2.Format("%d",a[i]);
		temp1+=temp2;
	}
	AfxMessageBox(temp1);*/
	getIR(a);
	Read();
	Do();
	R[5]++;
}
void MicroIns::Read()
{
	char buffer[200];
	GetCurrentDirectory(200,buffer);
	CString temp1="\\MicroIns.txt";
	char buffer1[20];
	strcpy(buffer1,temp1);
	strcat(buffer,buffer1);

	ifstream in_file(buffer,ios::in);
	if(!in_file) exit(-1);
	char buf[20][69];
    int temp=0;
	while(in_file.eof()==0)
	{
		in_file.getline(buf[temp],70,'\n');
		buf[temp][68]='\0';
		temp++;
	}
//	for(int j=0;j<temp;j++)
//		cout<<buf[j]<<endl;
	int *a[20];
	for(int i=0;i<temp;i++)
	{
		a[i]=new int[2];
		char x0,y0;
		int x1,y1;
		x0=buf[i][0];
		y0=buf[i][1];
		x1=HexToDec(x0);
		y1=HexToDec(y0);
		a[i][0]=x1*16+y1;
		x0=buf[i][3];
		y0=buf[i][4];
		x1=HexToDec(x0);
		y1=HexToDec(y0);
		a[i][1]=x1*16+y1;
	}
	int *b[20];
	for(i=0;i<temp;i++)
	{
		b[i]=new int[50];
		char x0,y0;
		int x1,y1;
		x0=buf[i][3];
		y0=buf[i][4];
		x1=HexToDec(x0);
		y1=HexToDec(y0);
		b[i][0]=x1*16+y1;
		x0=buf[i][6];
		y0=buf[i][7];
		x1=HexToDec(x0);
		y1=HexToDec(y0);
		b[i][1]=x1*16+y1;
		int m0=2;
		for(int m=8;m<68;m++)
		{
			char y2;
			int x2;
			y2=buf[i][m];
			if(y2!=' '&&m0<50)
			{

				x2=HexToDec(y2);
				b[i][m0]=x2;
				m0++;
			}
		}
	}
/*	for(i=0;i<temp;i++)
		for(int j=0;j<2;j++)
			cout<<a[i][j]<<' ';
		cout<<endl;
	for(i=0;i<temp;i++)
		for(int j=0;j<50;j++)
			cout<<b[i][j]<<' ';
		cout<<endl;*/
	getMicroAddr(temp,a);
	getMicroP(temp,b);

}
void MicroIns::Do()
{
	Read();
	getCZVS();
	getupc();
//	cout<<"uPC:"<<uPC<<endl;
	for(int i=0;i<50;i++)
	{
		if(uPC!=48&&uPC!=00)
		{
			getMicroIR();
			Am2901 m;
			SetuIinSCCi();
			getADDR();
			SetCC();
			//cout<<"flages0:"<<flages<<endl;
			AM2910();
			setAm2901(&m);			
			//cout<<"uPC:"<<uPC<<endl;
			//cout<<"flages1:"<<flages<<endl;			
		}
		//cout<<"flages2:"<<flages<<endl;
	}
}


/*
void main()
{
	int x;
	cout<<"flages:";
	cin>>x;
	int c[16];
	for(int i=0;i<16;i++)
		c[i]=0;
	c[0]=0x1234,c[1]=23,c[2]=43;
	cout<<"put IR:";
	MicroIns a;
	a.getflages0(x);
	a.getR(c,16);
	int b[10];
	for(i=0;i<10;i++)
		cin>>b[i];
	a.getIR(b);
	a.Do();
	for(i=0;i<5;i++)
	{
		for(int j=0;j<2;j++)
			cout<<a.MicroAddr[i][j]<<' ';
		cout<<endl;
	}
	for(i=0;i<5;i++){
		for(int j=0;j<50;j++){
			cout<<a.MicroP[i][j]<<' ';
		}
		cout<<endl;
	}
	for(i=0;i<16;i++)
		cout<<a.R[i]<<' ';
	cout<<endl;
	cout<<"flages:"<<a.ReturnFlages()<<endl;
}
*/

⌨️ 快捷键说明

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