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

📄 instruction.cpp

📁 一款国产的8051模拟器(全部源代码) 本软件是一款8051模拟器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	APC(2);
	Clock(1);
}

void instruction::INC_DPTR()
{
	DPTR++;
	APC(1);
	Clock(2);
}

void instruction::DEC_A()
{
/*	buf3.bufs=A;
	buf1=buf3.ACa.AL-1;
	buf1=buf1>>4;
	ACw(buf1);
	buf5.bufa=buf3.ACa7.A7-1;
	buf3.bufa-=1;
	buf1=buf5.ACa7.A8^buf3.ACa7.CYa;
	OVw(buf1);
	CYw(buf3.ACa.CYa);
	A=buf3.Aa;*/
	A--;
	APC(1);
	Clock(1);
}

void instruction::DEC_DRi()
{
	buf1=DR(code(0)-0x16)-1;
	DRw(code(0)-0x16,buf1);
	APC(1);
	Clock(1);
}

void instruction::DEC_Rn()
{
	buf1=R(code(0)-0x18)-1;
	Rw(code(0)-0x18,buf1);
	APC(1);
	Clock(1);
}

void instruction::DEC_direct()
{
	buf1=mem->GetidataMemByte(code(1))-1;
	mem->SetidataMemByte(code(1),buf1);
	APC(2);
	Clock(1);
}

void instruction::DA_A()//疑问:执行后是否影响标志?
{
	buf3.bufa=A;
	if(buf3.ACa.AL>9||AC==1)
	{
		buf3.bufa+=0x06;
		if(buf3.bufa>255)
		{
			CYw(buf3.ACa.CYa); 
		}

	}
	if(buf3.ACa.AH>9||CY==1)
	{
		buf3.bufa+=0x60;
		if(buf3.bufa>255)
		{
			CYw(buf3.ACa.CYa); 
		}                                                                                                                                                                                                                                                                                                                                                                                    
	}	
	A=buf3.Aa;
	APC(1);
	Clock(1);
}

void instruction::MUL_AB()
{
	buf3.bufa=A;
	buf4.bufa=mem->GetidataMemByte(0xf0);//B
	buf3.bufa=buf3.bufa*buf4.bufa;
	if(buf3.bufa>0xff)
	{
		OVw(1);
	}
	else
	{
		OVw(0);
	}
	A=buf3.Aa;
	buf3.bufa=buf3.bufa>>8;//高8位移入Aa
	mem->SetidataMemByte(0xf0,buf3.Aa);
	APC(1);
	Clock(4);
}

void instruction::DIV_AB()//53
{
	buf3.bufa=A;
	buf4.bufa=mem->GetidataMemByte(0xf0);//B
	if(buf4.Aa==0)
	{
		OVw(1);
		CYw(0);
		APC(1);
		Clock(4);
		return;
	}
	buf1=buf3.Aa/buf4.Aa;
	CYw(0);
	OVw(0);
	A=buf1;
	buf2=buf3.Aa%buf4.Aa;//求余数
	mem->SetidataMemByte(0xf0,buf2);
	APC(1);
	Clock(4);
}




///////////////////////////
void instruction::ANL_A_Rn()
{
	A=A&R(code(0)-0x58);
	APC(1);
	Clock(1);
}

void instruction::ANL_A_DRi()
{
	A=A&DR(code(0)-0x56);
	APC(1);
	Clock(1);
}

void instruction::ANL_A_direct()
{
	buf1=mem->GetidataMemByte(code(1));
	A=A&buf1;
	APC(2);
	Clock(1);
}

void instruction::ANL_direct_A()
{
	buf1=mem->GetidataMemByte(code(1));
	buf1=A&buf1;
	mem->SetidataMemByte(code(1),buf1);
	APC(2);
	Clock(1);
}

void instruction::ANL_A_Idata()
{
	buf1=code(1);
	A=A&buf1;
	APC(2);
	Clock(1);
}

void instruction::ANL_direct_Idata()
{
	buf1=mem->GetidataMemByte(code(1));
	buf2=code(2);
	buf1=buf1&buf2;
	mem->SetidataMemByte(code(1),buf1);
	APC(3);
	Clock(2);
}

void instruction::ORL_A_Rn()
{
	A=A|R(code(0)-0x48);
	APC(1);
	Clock(1);
}

void instruction::ORL_A_DRi()
{
	A=A|DR(code(0)-0x46);
	APC(1);
	Clock(1);
}

void instruction::ORL_A_direct()
{
	buf1=mem->GetidataMemByte(code(1));
	A=A|buf1;
	APC(2);
	Clock(1);
}

void instruction::ORL_direct_A()
{
	buf1=mem->GetidataMemByte(code(1));
	buf1=buf1|A;
	mem->SetidataMemByte(code(1),buf1);
	APC(2);
	Clock(1);
}

void instruction::ORL_A_Idata()
{
	A=A|code(1);
	APC(2);
	Clock(1);
}

void instruction::ORL_direct_Idata()
{
	buf1=mem->GetidataMemByte(code(1));
	buf2=code(2);
	buf1=buf1|buf2;
	mem->SetidataMemByte(code(1),buf1);
	APC(3);
	Clock(2);
}

void instruction::XRL_A_Rn()
{
	A=A^R(code(0)-0x68);
	APC(1);
	Clock(1);
}

void instruction::XRL_A_direct()
{
	buf1=mem->GetidataMemByte(code(1));
	A=A^buf1;
	APC(2);
	Clock(1);
}

void instruction::XRL_A_DRi()
{
	A=A^DR(code(0)-0x66);
	APC(1);
	Clock(1);
}

void instruction::XRL_direct_A()
{
	buf1=mem->GetidataMemByte(code(1));
	buf1=A^buf1;
	mem->SetidataMemByte(code(1),buf1);
	APC(2);
	Clock(1);
}

void instruction::XRL_A_Idata()
{
	A=A^code(1);
	APC(2);
	Clock(1);
}

void instruction::XRL_direct_Idata()
{
	buf1=mem->GetidataMemByte(code(1));
	buf2=code(2);
	buf1=buf1^buf2;
	mem->SetidataMemByte(code(1),buf1);
	APC(3);
	Clock(1);
}

void instruction::CPL_A()
{
	A=~A;
	APC(1);
	Clock(1);
}

void instruction::CLR_A()
{
	A=0;
	APC(1);
	Clock(1);
}

void instruction::RL_A()//
{
	buf3.bufa=0;
	buf3.ACa.bufR=A;
	buf3.bufa=buf3.bufa<<1;
	A=buf3.ACa.bufR+buf3.ACa.CY3;
	APC(1);
	Clock(1);
}

void instruction::RR_A()//
{
	buf3.bufa=0;
	buf3.ACa.bufR=A;
	buf3.bufa=buf3.bufa>>1;
	A=buf3.ACa.bufR+((buf3.ACa.CY2)<<8);
	APC(1);
	Clock(1);
}

void instruction::RLC_A()//
{
	buf3.bufa=0;
	buf3.ACa.bufR=A;
	buf3.ACa.CY3=CY;
	buf3.bufa=buf3.bufa<<1;
	A=buf3.ACa.bufR+buf3.ACa.CY4;
	CYw(buf3.ACa.CY3);
	APC(1);
	Clock(1);
}

void instruction::RRC_A()//77
{
	buf3.bufa=0;
	buf3.ACa.bufR=A;
	buf3.ACa.CY3=CY;
	buf3.bufa=buf3.bufa>>1;
	A=buf3.ACa.bufR+buf3.ACa.CY4;
	CYw(buf3.ACa.CY2);
	APC(1);
	Clock(1);
}



///////////////////////
void instruction::AJMP_addr11()
{
	buf1=code(1);
	buf2=code(0);
	buf6=(buf2-1)<<3;
	PC=buf6+buf1+(PC&0xf800);
	Clock(2);
}

void instruction::LJMP_addr16()
{
//	buf1=code(2);
//	buf2=code(1);
//	buf6=((buf2<<8)+buf1);
	PC=code(2)+(code(1)<<8);
	Clock(2);
}

void instruction::SJMP_rel()
{
	buf7=code(1);
	PC=PC+2+buf7;
	Clock(2);
}

void instruction::JMP_DAaddDPTR()//为何有个@
{
	PC=DPTR+A;
	Clock(2);
}

void instruction::JZ_rel()
{
	if(A==0)
	{
		buf7=code(1);
		PC=PC+2+buf7;
	}
	else
	{
		APC(2);
	}
	Clock(2);
}

void instruction::JNZ_rel()
{
	if(A!=0)
	{
		buf7=code(1);
		PC=PC+2+buf7;
	}
	else
	{
		APC(2);
	}
	Clock(2);
}

void instruction::CJNE_A_direct_rel()
{
	buf1=mem->GetidataMemByte(code(1));	
	if(A>=buf1)
	{
		CYw(0);
	}
	else
	{
		CYw(1);
	}
	if(A!=buf1)
	{
		buf7=code(2);
		PC=PC+3+buf7;
	}
	else
	{
		APC(3);
	}
	Clock(2);
}

void instruction::CJNE_A_Idata_rel()
{
	buf1=code(1);
	if(A>=buf1)
	{
		CYw(0);
	}
	else
	{
		CYw(1);
	}
	if(A!=buf1)
	{
		buf7=code(2);
		PC=PC+3+buf7;
	}
	else
	{
		APC(3);
	}
	Clock(2);
}

void instruction::CJNE_Rn_Idata_rel()
{
	buf1=R(code(0)-0xb8);
	buf2=code(1);
	if(buf1>=buf2)
	{
		CYw(0);
	}
	else
	{
		CYw(1);
	}
	if(buf1!=buf2)
	{
		buf7=code(2);
		PC=PC+3+buf7;
	}
	else
	{
		APC(3);
	}
	Clock(2);
}

void instruction::CJNE_DRi_Idata_rel()
{
	buf1=DR(code(0)-0xb6);
	buf2=code(1);
	if(buf1>=buf2)
	{
		CYw(0);
	}
	else
	{
		CYw(1);
	}
	if(buf1!=buf2)
	{
		buf7=code(2);
		PC=PC+3+buf7;
	}
	else
	{
		APC(3);
	}
	Clock(2);
}

void instruction::DJNZ_Rn_rel()
{
	buf1=R(code(0)-0xd8);
	buf1=buf1-1;
	Rw(code(0)-0xd8,buf1);
	if(buf1==0)
	{
		APC(2);
	}
	else
	{
		buf7=code(1);
		PC=PC+2+buf7;
	}
	Clock(2);
}

void instruction::DJNZ_direct_rel()
{
	buf1=mem->GetidataMemByte(code(1));
	buf1=buf1-1;
	mem->SetidataMemByte(code(1),buf1);
	if(buf1==0)
	{
		APC(3);
	}
	else
	{
		buf7=code(2);
		PC=PC+3+buf7;
	}
	Clock(2);
}

void instruction::ACALL_addr11()
{
	
	APC(2);
	buf1=(BYTE)PC;
	buf2=(BYTE)(PC>>8);
	SP=SP+1;
	mem->SetidataMemByte(SP,buf1);
	SP=SP+1;
	mem->SetidataMemByte(SP,buf2);
	buf1=code(-1);
	buf2=code(-2);
	buf6=(buf2-1)<<3;
	PC=buf6+buf1+(PC&0xf800);
	Clock(2);
}

void instruction::LCALL_addr16()
{
	APC(3);
	buf1=(BYTE)PC;
	buf2=(BYTE)(PC>>8);
	SP=SP+1;
	mem->SetidataMemByte(SP,buf1);
	SP=SP+1;                                                                                                                                                                                                                                                                                                                                                                                                                                                                1;
	mem->SetidataMemByte(SP,buf2);
	buf1=code(-1);
	buf2=code(-2);
	buf6=((buf2<<8)+buf1);
	PC=buf6;
	Clock(2);
}

void instruction::RET()
{
	buf1=mem->GetidataMemByte(SP);
	SP=SP-1;
	buf2=mem->GetidataMemByte(SP);
	SP=SP-1;
	buf6=((buf1<<8)+buf2);
	PC=buf6;
	Clock(2);
}

void instruction::RETI()//中断返回,未完成
{
	if(mem->CurrentCPULevel>127)
	{
		mem->CurrentCPULevel--;
	}
	buf1=mem->GetidataMemByte(SP);
	SP=SP-1;
	buf2=mem->GetidataMemByte(SP);
	SP=SP-1;
	buf6=((buf1<<8)+buf2);
	PC=buf6;
	//如果RETIANON();里面有中断发生则不符合8051中断标准,暂时无法解决
	Clock(2);
	RETIANON();
}



//////////////////////
void instruction::NOP()
{
	APC(1);
	Clock(1);
}

void instruction::MOV_C_bit()
{
	buf1=Gb(code(1));
	CYw(buf1);
	APC(2);
	Clock(1);
}

void instruction::MOV_bit_C()
{
	buf1=CY;
	Sb(code(1),buf1);
	APC(2);
	Clock(2);
}

void instruction::CPL_C()
{
	buf1=~CY;
	CYw(buf1);
	APC(1);
	Clock(1);
}

void instruction::CLR_C()
{
	CYw(0);

⌨️ 快捷键说明

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