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

📄 instruction.cpp

📁 这个也是我们的毕业设计课题
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	{
		DWORD dwTemp2=dwCode & 0X0000FFFF;
		WORD wData2=WORD(dwTemp2);
		BYTE bIndexSrc=BYTE((dwCode & 0X00070000)>>16);
		BYTE bIndexDst=BYTE((dwCode & 0X00380000)>>19);

		//shift operation
		wData2+=_cpu->GetGR(bIndexSrc);
		wData2=_cpu->GetGR(bIndexDst)>>wData2;
		_cpu->SetGR(wData2,bIndexDst);
		
		//change the flags
		if(wData2>0)
		{
			wFlags &=0XFFFC;
			_cpu->SetFLAGS(wFlags);
		}
		else if(wData2=0)
		{
			wFlags &=0XFFFC;
			wFlags |=0X0001;
			_cpu->SetFLAGS(wFlags);
		}
		else if(wData2<0)
		{
			wFlags &=0XFFFC;
			wFlags |=0X0002;
			_cpu->SetFLAGS(wFlags);
		}
	}
	else
	{
		ReportState("the 'SRA' instruction can't handle this code");
		return;
	}
	UNSHORT uAddr=_cpu->GetPC();
	_cpu->SetPC(uAddr+2);
}
void AND::Excute(DWORD dwCode)
{
	WORD uIP=_cpu->GetIP();
	DWORD dw=dwCode & 0X01C00000;//specify operand number
	WORD wFlags=_cpu->GetFLAGS();//flag register
	if(dw==0x00800000)//2 operand (ADD GR,ADR),GR<-(GR)&(ADR)
	{
		DWORD dwTemp1=dwCode & 0X0000FFFF;//get the immediate data
		UNSHORT uAddr1=UNSHORT(dwTemp1+uIP);
		_cpu->RequestBUS();
		_cpu->WriteAddrToAddrBUS(uAddr1);
		WORD wData1=_cpu->ReadDataFromMemory();
		_cpu->ReleaseBUS();
		//register operation
		BYTE bIndex=BYTE((dwCode & 0X00070000)>>16);
		wData1 =wData1 & _cpu->GetGR(bIndex);
		_cpu->SetGR(wData1,bIndex);
				//change the flags register
		if(wData1>0)
		{
			wFlags &=0XFFFC;
			_cpu->SetFLAGS(wFlags);
		}
		else if(wData1=0)
		{
			wFlags &=0XFFFC;
			wFlags |=0X0001;
			_cpu->SetFLAGS(wFlags);
		}
		else if(wData1<0)
		{
			wFlags &=0XFFFC;
			wFlags |=0X0002;
			_cpu->SetFLAGS(wFlags);
		}
	}
	else if(dw==0X00C00000)//3 operand (AND GRd,imm,GRs),GRd<-(GRd)&(imm+(GRs))
	{
		DWORD dwTemp2=dwCode & 0X0000FFFF;
		WORD wData2=WORD(dwTemp2+uIP);
		BYTE bIndexSrc=BYTE((dwCode & 0X00070000)>>16);
		BYTE bIndexDst=BYTE((dwCode & 0X00380000)>>19);
		UNSHORT uAddr2=UNSHORT(wData2+_cpu->GetGR(bIndexSrc));
		_cpu->RequestBUS();
		_cpu->WriteAddrToAddrBUS(uAddr2);
		wData2=_cpu->ReadDataFromMemory();
		_cpu->ReleaseBUS();
		wData2 =wData2 & _cpu->GetGR(bIndexDst);
		_cpu->SetGR(wData2,bIndexDst);
		//change the flags
		if(wData2>0)
		{
			wFlags &=0XFFFC;
			_cpu->SetFLAGS(wFlags);
		}
		else if(wData2=0)
		{
			wFlags &=0XFFFC;
			wFlags |=0X0001;
			_cpu->SetFLAGS(wFlags);
		}
		else if(wData2<0)
		{
			wFlags &=0XFFFC;
			wFlags |=0X0002;
			_cpu->SetFLAGS(wFlags);
		}
	}
	else
	{
		ReportState("the 'AND' instruction can't handle this code");
		return;
	}
	UNSHORT uAddr=_cpu->GetPC();
	_cpu->SetPC(uAddr+2);
}
void OR::Excute(DWORD dwCode)
{
	WORD uIP=_cpu->GetIP();
	DWORD dw=dwCode & 0X01C00000;//specify operand number
	WORD wFlags=_cpu->GetFLAGS();//flag register
	if(dw==0x00800000)//2 operand (ADD GR,ADR),GR<-(GR)|(ADR)
	{
		DWORD dwTemp1=dwCode & 0X0000FFFF;//get the immediate data
		UNSHORT uAddr1=UNSHORT(dwTemp1+uIP);
		_cpu->RequestBUS();
		_cpu->WriteAddrToAddrBUS(uAddr1);
		WORD wData1=_cpu->ReadDataFromMemory();
		_cpu->ReleaseBUS();
		//register operation
		BYTE bIndex=BYTE((dwCode & 0X00070000)>>16);
		wData1 =wData1 | _cpu->GetGR(bIndex);
		_cpu->SetGR(wData1,bIndex);
				//change the flags register
		if(wData1>0)
		{
			wFlags &=0XFFFC;
			_cpu->SetFLAGS(wFlags);
		}
		else if(wData1=0)
		{
			wFlags &=0XFFFC;
			wFlags |=0X0001;
			_cpu->SetFLAGS(wFlags);
		}
		else if(wData1<0)
		{
			wFlags &=0XFFFC;
			wFlags |=0X0002;
			_cpu->SetFLAGS(wFlags);
		}
	}
	else if(dw==0X00C00000)//3 operand (OR GRd,imm,GRs),GRd<-(GRd)|(imm+(GRs))
	{
		DWORD dwTemp2=dwCode & 0X0000FFFF;
		WORD wData2=WORD(dwTemp2+uIP);
		BYTE bIndexSrc=BYTE((dwCode & 0X00070000)>>16);
		BYTE bIndexDst=BYTE((dwCode & 0X00380000)>>19);
		UNSHORT uAddr2=UNSHORT(wData2+_cpu->GetGR(bIndexSrc));
		_cpu->RequestBUS();
		_cpu->WriteAddrToAddrBUS(uAddr2);
		wData2=_cpu->ReadDataFromMemory();
		_cpu->ReleaseBUS();
		wData2 =wData2 | _cpu->GetGR(bIndexDst);
		_cpu->SetGR(wData2,bIndexDst);
		//change the flags
		if(wData2>0)
		{
			wFlags &=0XFFFC;
			_cpu->SetFLAGS(wFlags);
		}
		else if(wData2=0)
		{
			wFlags &=0XFFFC;
			wFlags |=0X0001;
			_cpu->SetFLAGS(wFlags);
		}
		else if(wData2<0)
		{
			wFlags &=0XFFFC;
			wFlags |=0X0002;
			_cpu->SetFLAGS(wFlags);
		}
	}
	else
	{
		ReportState("the 'OR' instrcution can't handle this code");
		return;
	}
	UNSHORT uAddr=_cpu->GetPC();
	_cpu->SetPC(uAddr+2);
}
void EOR::Excute(DWORD dwCode)
{
	WORD uIP=_cpu->GetIP();
	DWORD dw=dwCode & 0X01C00000;//specify operand number
	WORD wFlags=_cpu->GetFLAGS();//flag register
	if(dw==0x00800000)//2 operand (ADD GR,ADR),GR<-(GR)|(ADR)
	{
		DWORD dwTemp1=dwCode & 0X0000FFFF;//get the immediate data
		UNSHORT uAddr1=UNSHORT(dwTemp1+uIP);
		_cpu->RequestBUS();
		_cpu->WriteAddrToAddrBUS(uAddr1);
		WORD wData1=_cpu->ReadDataFromMemory();
		_cpu->ReleaseBUS();
		//register operation
		BYTE bIndex=BYTE((dwCode & 0X00070000)>>16);
		wData1 =wData1 ^ _cpu->GetGR(bIndex);
		_cpu->SetGR(wData1,bIndex);
				//change the flags register
		if(wData1>0)
		{
			wFlags &=0XFFFC;
			_cpu->SetFLAGS(wFlags);
		}
		else if(wData1=0)
		{
			wFlags &=0XFFFC;
			wFlags |=0X0001;
			_cpu->SetFLAGS(wFlags);
		}
		else if(wData1<0)
		{
			wFlags &=0XFFFC;
			wFlags |=0X0002;
			_cpu->SetFLAGS(wFlags);
		}
	}
	else if(dw==0X00C00000)//3 operand (OR GRd,imm,GRs),GRd<-(GRd)|(imm+(GRs))
	{
		DWORD dwTemp2=dwCode & 0X0000FFFF;
		WORD wData2=WORD(dwTemp2+uIP);
		BYTE bIndexSrc=BYTE((dwCode & 0X00070000)>>16);
		BYTE bIndexDst=BYTE((dwCode & 0X00380000)>>19);
		UNSHORT uAddr2=UNSHORT(wData2+_cpu->GetGR(bIndexSrc));
		_cpu->RequestBUS();
		_cpu->WriteAddrToAddrBUS(uAddr2);
		wData2=_cpu->ReadDataFromMemory();
		_cpu->ReleaseBUS();
		wData2 =wData2 ^ _cpu->GetGR(bIndexDst);
		_cpu->SetGR(wData2,bIndexDst);
		//change the flags
		if(wData2>0)
		{
			wFlags &=0XFFFC;
			_cpu->SetFLAGS(wFlags);
		}
		else if(wData2=0)
		{
			wFlags &=0XFFFC;
			wFlags |=0X0001;
			_cpu->SetFLAGS(wFlags);
		}
		else if(wData2<0)
		{
			wFlags &=0XFFFC;
			wFlags |=0X0002;
			_cpu->SetFLAGS(wFlags);
		}
	}
	else
	{
		ReportState("the 'EOR' instruction can't handle this code");
		return;
	}
	UNSHORT uAddr=_cpu->GetPC();
	_cpu->SetPC(uAddr+2);
}
void NOT::Excute(DWORD dwCode)
{
	WORD uIP=_cpu->GetIP();
	ReportState("the 'NOT' instruction haven't implemented");
	UNSHORT uAddr=_cpu->GetPC();
	_cpu->SetPC(uAddr+2);
	return;
}
void SLL::Excute(DWORD dwCode)
{
	WORD uIP=_cpu->GetIP();
	DWORD dw=dwCode & 0X01C00000;//specify the operand mumber
	WORD wFlags=_cpu->GetFLAGS();//flag register
	if(dw==0x00800000)//2 operand (SLL GR,ADR)
	{
		DWORD dwTemp1=dwCode & 0X0000FFFF;//get the immediate data
		WORD wData1=WORD(dwTemp1);//convert it into 16 bits format
		BYTE bIndex=BYTE((dwCode & 0X00070000)>>16);//specify the register index
		//the index is stored in the 18-16 bit of dwCode
		
		//shift operation
		wData1=((_cpu->GetGR(bIndex))<<wData1);
		_cpu->SetGR(wData1,bIndex);
		//change the flags register
		if(wData1>0)
		{
			wFlags &=0XFFFC;
			_cpu->SetFLAGS(wFlags);
		}
		else if(wData1=0)
		{
			wFlags &=0XFFFC;
			wFlags |=0X0001;
			_cpu->SetFLAGS(wFlags);
		}
		else if(wData1<0)
		{
			wFlags &=0XFFFC;
			wFlags |=0X0002;
			_cpu->SetFLAGS(wFlags);
		}
	}
	else if(dw==0X00C00000)//3 operand (SLL GRd,imm,GRs)
	{
		DWORD dwTemp2=dwCode & 0X0000FFFF;
		WORD wData2=WORD(dwTemp2);
		BYTE bIndexSrc=BYTE((dwCode & 0X00070000)>>16);
		BYTE bIndexDst=BYTE((dwCode & 0X00380000)>>19);

		//shift operation
		wData2+=_cpu->GetGR(bIndexSrc);
		wData2=_cpu->GetGR(bIndexDst)<<wData2;
		_cpu->SetGR(wData2,bIndexDst);
		
		//change the flags
		if(wData2>0)
		{
			wFlags &=0XFFFC;
			_cpu->SetFLAGS(wFlags);
		}
		else if(wData2=0)
		{
			wFlags &=0XFFFC;
			wFlags |=0X0001;
			_cpu->SetFLAGS(wFlags);
		}
		else if(wData2<0)
		{
			wFlags &=0XFFFC;
			wFlags |=0X0002;
			_cpu->SetFLAGS(wFlags);
		}
	}
	else
	{
		ReportState("the 'SLL' instruction can't handle this code");
		return;
	}
	UNSHORT uAddr=_cpu->GetPC();
	_cpu->SetPC(uAddr+2);
}
void SRL::Excute(DWORD dwCode)
{
	WORD uIP=_cpu->GetIP();
	DWORD dw=dwCode & 0X01C00000;//specify the operand mumber
	WORD wFlags=_cpu->GetFLAGS();//flag register
	if(dw==0x00800000)//2 operand (SRL GR,ADR)
	{
		DWORD dwTemp1=dwCode & 0X0000FFFF;//get the immediate data
		WORD wData1=WORD(dwTemp1);//convert it into 16 bits format
		BYTE bIndex=BYTE((dwCode & 0X00070000)>>16);//specify the register index
		//the index is stored in the 18-16 bit of dwCode
		
		//shift operation
		wData1=((_cpu->GetGR(bIndex))>>wData1);
		_cpu->SetGR(wData1,bIndex);
		//change the flags register
		if(wData1>0)
		{
			wFlags &=0XFFFC;
			_cpu->SetFLAGS(wFlags);
		}
		else if(wData1=0)
		{
			wFlags &=0XFFFC;
			wFlags |=0X0001;
			_cpu->SetFLAGS(wFlags);
		}
		else if(wData1<0)
		{
			wFlags &=0XFFFC;
			wFlags |=0X0002;
			_cpu->SetFLAGS(wFlags);
		}
	}
	else if(dw==0X00C00000)//3 operand (SRL GRd,imm,GRs)
	{
		DWORD dwTemp2=dwCode & 0X0000FFFF;
		WORD wData2=WORD(dwTemp2);
		BYTE bIndexSrc=BYTE((dwCode & 0X00070000)>>16);
		BYTE bIndexDst=BYTE((dwCode & 0X00380000)>>19);

		//shift operation
		wData2+=_cpu->GetGR(bIndexSrc);
		wData2=_cpu->GetGR(bIndexDst)>>wData2;
		_cpu->SetGR(wData2,bIndexDst);
		
		//change the flags
		if(wData2>0)
		{
			wFlags &=0XFFFC;
			_cpu->SetFLAGS(wFlags);
		}
		else if(wData2=0)
		{
			wFlags &=0XFFFC;
			wFlags |=0X0001;
			_cpu->SetFLAGS(wFlags);
		}
		else if(wData2<0)
		{
			wFlags &=0XFFFC;
			wFlags |=0X0002;
			_cpu->SetFLAGS(wFlags);
		}
	}
	else
	{
		ReportState("the 'SRL' instruction can't handle this code");
		return;
	}
	UNSHORT uAddr=_cpu->GetPC();
	_cpu->SetPC(uAddr+2);
}
void CPA::Excute(DWORD dwCode)
{
	WORD uIP=_cpu->GetIP();
	DWORD dw=dwCode & 0X01C00000;//specify operand number
	WORD wFlags=_cpu->GetFLAGS();//flag register
	if(dw==0x00800000)//2 operand (CPA GR,ADR)
	{
		DWORD dwTemp1=dwCode & 0X0000FFFF;//get the meory address
		UNSHORT uAddr1=UNSHORT(dwTemp1+uIP);
		_cpu->RequestBUS();
		_cpu->WriteAddrToAddrBUS(uAddr1);
		WORD wData1=_cpu->ReadDataFromMemory();
		_cpu->ReleaseBUS();
		//register operation
		BYTE bIndex=BYTE((dwCode & 0X00070000)>>16);
		wData1=_cpu->GetGR(bIndex)-wData1;
				//change the flags register
		if(wData1>0)
		{
			wFlags &=0XFFFC;
			_cpu->SetFLAGS(wFlags);
		}
		else if(wData1=0)
		{
			wFlags &=0XFFFC;
			wFlags |=0X0001;
			_cpu->SetFLAGS(wFlags);
		}
		else if(wData1<0)
		{
			wFlags &=0XFFFC;
			wFlags |=0X0002;
			_cpu->SetFLAGS(wFlags);
		}
	}
	else if(dw==0X00C00000)//3 operand (CPA GRd,imm,GRs)
	{
		DWORD dwTemp2=dwCode & 0X0000FFFF;
		WORD wData2=WORD(dwTemp2+uIP);
		BYTE bIndexSrc=BYTE((dwCode & 0X00070000)>>16);
		BYTE bIndexDst=BYTE((dwCode & 0X00380000)>>19);
		UNSHORT uAddr2=UNSHORT(wData2+_cpu->GetGR(bIndexSrc));
		_cpu->RequestBUS();
		_cpu->WriteAddrToAddrBUS(uAddr2);
		wData2=_cpu->ReadDataFromMemory();
		_cpu->ReleaseBUS();
		wData2=_cpu->GetGR(bIndexDst)-wData2;
		//change the flags
		if(wData2>0)
		{
			wFlags &=0XFFFC;
			_cpu->SetFLAGS(wFlags);
		}
		else if(wData2=0)
		{
			wFlags &=0XFFFC;
			wFlags |=0X0001;
			_cpu->SetFLAGS(wFlags);
		}
		else if(wData2<0)

⌨️ 快捷键说明

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