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

📄 instruction.cpp

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

void instruction::SETB_C()
{
	CYw(1);
	APC(1);
	Clock(1);
}

void instruction::CPL_bit()//气死我了,
{
	
	buf1=(~Gb(code(1)))&0x01;//注意掩码
	//if(mem->CLKNUM==7571)
	//{
	//	Sleep(100);
	//	CString str;
	//	str.Format("buf1=0x%X",buf1);
	//	AfxMessageBox(str);
	//}
	Sb(code(1),buf1);
	APC(2);
	Clock(1);
}

void instruction::CLR_bit()
{
	Sb(code(1),0);
	APC(2);
	Clock(1);
}

void instruction::SETB_bit()
{
	Sb(code(1),1);
	APC(2);
	Clock(1);
}

void instruction::ANL_C_bit()
{
	buf1=Gb(code(1));
	buf2=CY&buf1;
	CYw(buf2);
	APC(2);
	Clock(2);
}

void instruction::ORL_C_bit()
{
	buf1=Gb(code(1));
	buf2=CY|buf1;
	CYw(buf2);
	APC(2);
	Clock(1);
}

void instruction::ANL_C_NOT_bit()
{	
	buf1=~Gb(code(1));
	buf2=CY&buf1;
	CYw(buf2);
	APC(2);
	Clock(2);
}

void instruction::ORL_C_NOT_bit()
{
	buf1=~Gb(code(1));
	buf2=CY|buf1;
	CYw(buf2);
	APC(2);
	Clock(1);
}

void instruction::JC_rel()
{
	if(CY==1)
	{
		buf7=code(1);
		PC=PC+2+buf7;
	}
	else
	{
			APC(2);
	}
	Clock(2);
}

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

void instruction::JB_bit_rel()
{
	buf1=Gb(code(1));
	if(buf1==1)
	{
		buf7=code(2);
		PC=PC+3+buf7;
	}
	else
	{
		APC(3);
	}
	Clock(2);
}

void instruction::JNB_bit_rel()
{
	buf1=Gb(code(1));
	if(buf1!=1)
	{
		buf7=code(2);
		PC=PC+3+buf7;
	}
	else
	{
		APC(3);
	}
	Clock(2);
}

void instruction::JBC_bit_rel()
{
	buf1=Gb(code(1));
	if(buf1==1)
	{
		Sb(code(1),0);
		buf7=code(2);
		PC=PC+3+buf7;
	}
	else
	{
		APC(3);
	}
	Clock(2);
}

void instruction::NULLFun()
{

}

void instruction::CreateMap()
{
INSMAP[0x00]=this->NOP;
INSMAP[0x01]=this->AJMP_addr11;
INSMAP[0x02]=this->LJMP_addr16;
INSMAP[0x03]=this->RR_A;
INSMAP[0x04]=this->INC_A;//2005.4.17可能有问题,问题已解决,加入了标志位的判断
INSMAP[0x05]=this->INC_direct;
INSMAP[0x06]=this->INC_DRi;
INSMAP[0x07]=this->INC_DRi;
INSMAP[0x08]=this->inc_Rn;
INSMAP[0x09]=this->inc_Rn;
INSMAP[0x0a]=this->inc_Rn;
INSMAP[0x0b]=this->inc_Rn;
INSMAP[0x0c]=this->inc_Rn;
INSMAP[0x0d]=this->inc_Rn;
INSMAP[0x0e]=this->inc_Rn;
INSMAP[0x0f]=this->inc_Rn;
INSMAP[0x10]=this->JBC_bit_rel;
INSMAP[0x11]=this->ACALL_addr11;
INSMAP[0x12]=this->LCALL_addr16;
INSMAP[0x13]=this->RRC_A;
INSMAP[0x14]=this->DEC_A;//2005.4.17可能有问题,问题已解决,加入了标志位的判断
INSMAP[0x15]=this->DEC_direct;
INSMAP[0x16]=this->DEC_DRi;
INSMAP[0x17]=this->DEC_DRi;
INSMAP[0x18]=this->DEC_Rn;
INSMAP[0x19]=this->DEC_Rn;
INSMAP[0x1a]=this->DEC_Rn;
INSMAP[0x1b]=this->DEC_Rn;
INSMAP[0x1c]=this->DEC_Rn;
INSMAP[0x1d]=this->DEC_Rn;
INSMAP[0x1e]=this->DEC_Rn;
INSMAP[0x1f]=this->DEC_Rn;
INSMAP[0x20]=this->JB_bit_rel;//2005.4.17可能有问题
INSMAP[0x21]=this->AJMP_addr11;
INSMAP[0x22]=this->RET;
INSMAP[0x23]=this->RL_A;
INSMAP[0x24]=this->ADD_A_Idata;
INSMAP[0x25]=this->ADD_A_direct;
INSMAP[0x26]=this->ADD_A_DRi;
INSMAP[0x27]=this->ADD_A_DRi;
INSMAP[0x28]=this->ADD_A_Rn;
INSMAP[0x29]=this->ADD_A_Rn;
INSMAP[0x2a]=this->ADD_A_Rn;
INSMAP[0x2b]=this->ADD_A_Rn;
INSMAP[0x2c]=this->ADD_A_Rn;
INSMAP[0x2d]=this->ADD_A_Rn;
INSMAP[0x2e]=this->ADD_A_Rn;
INSMAP[0x2f]=this->ADD_A_Rn;
INSMAP[0x30]=this->JNB_bit_rel;
INSMAP[0x31]=this->ACALL_addr11;
INSMAP[0x32]=this->RETI;
INSMAP[0x33]=this->RLC_A;
INSMAP[0x34]=this->ADDC_A_Idata;
INSMAP[0x35]=this->ADDC_A_direct;
INSMAP[0x36]=this->ADDC_A_DRi;
INSMAP[0x37]=this->ADDC_A_DRi;
INSMAP[0x38]=this->ADDC_A_Rn;
INSMAP[0x39]=this->ADDC_A_Rn;
INSMAP[0x3a]=this->ADDC_A_Rn;
INSMAP[0x3b]=this->ADDC_A_Rn;
INSMAP[0x3c]=this->ADDC_A_Rn;
INSMAP[0x3d]=this->ADDC_A_Rn;
INSMAP[0x3e]=this->ADDC_A_Rn;
INSMAP[0x3f]=this->ADDC_A_Rn;
INSMAP[0x40]=this->JC_rel;
INSMAP[0x41]=this->AJMP_addr11;
INSMAP[0x42]=this->ORL_direct_A;
INSMAP[0x43]=this->ORL_direct_Idata;
INSMAP[0x44]=this->ORL_A_Idata;
INSMAP[0x45]=this->ORL_A_direct;//2005.4.17可能有问题
INSMAP[0x46]=this->ORL_A_DRi;
INSMAP[0x47]=this->ORL_A_DRi;
INSMAP[0x48]=this->ORL_A_Rn;
INSMAP[0x49]=this->ORL_A_Rn;
INSMAP[0x4a]=this->ORL_A_Rn;
INSMAP[0x4b]=this->ORL_A_Rn;
INSMAP[0x4c]=this->ORL_A_Rn;
INSMAP[0x4d]=this->ORL_A_Rn;
INSMAP[0x4e]=this->ORL_A_Rn;
INSMAP[0x4f]=this->ORL_A_Rn;
INSMAP[0x50]=this->JNC_rel;
INSMAP[0x51]=this->ACALL_addr11;
INSMAP[0x52]=this->ANL_direct_A;
INSMAP[0x53]=this->ANL_direct_Idata;
INSMAP[0x54]=this->ANL_A_Idata;
INSMAP[0x55]=this->ANL_A_direct;
INSMAP[0x56]=this->ANL_A_DRi;
INSMAP[0x57]=this->ANL_A_DRi;
INSMAP[0x58]=this->ANL_A_Rn;
INSMAP[0x59]=this->ANL_A_Rn;
INSMAP[0x5a]=this->ANL_A_Rn;
INSMAP[0x5b]=this->ANL_A_Rn;
INSMAP[0x5c]=this->ANL_A_Rn;
INSMAP[0x5d]=this->ANL_A_Rn;
INSMAP[0x5e]=this->ANL_A_Rn;
INSMAP[0x5f]=this->ANL_A_Rn;
INSMAP[0x60]=this->JZ_rel;
INSMAP[0x61]=this->AJMP_addr11;
INSMAP[0x62]=this->XRL_direct_A;
INSMAP[0x63]=this->XRL_direct_Idata;
INSMAP[0x64]=this->XRL_A_Idata;
INSMAP[0x65]=this->XRL_A_direct;
INSMAP[0x66]=this->XRL_A_DRi;
INSMAP[0x67]=this->XRL_A_DRi;
INSMAP[0x68]=this->XRL_A_Rn;
INSMAP[0x69]=this->XRL_A_Rn;
INSMAP[0x6a]=this->XRL_A_Rn;
INSMAP[0x6b]=this->XRL_A_Rn;
INSMAP[0x6c]=this->XRL_A_Rn;
INSMAP[0x6d]=this->XRL_A_Rn;
INSMAP[0x6e]=this->XRL_A_Rn;
INSMAP[0x6f]=this->XRL_A_Rn;
INSMAP[0x70]=this->JNZ_rel;
INSMAP[0x71]=this->ACALL_addr11;
INSMAP[0x72]=this->ORL_C_bit;
INSMAP[0x73]=this->JMP_DAaddDPTR;
INSMAP[0x74]=this->MOV_A_Idata;
INSMAP[0x75]=this->MOV_direct_Idata;
INSMAP[0x76]=this->MOV_DRi_Idata;
INSMAP[0x77]=this->MOV_DRi_Idata;
INSMAP[0x78]=this->MOV_Rn_Idata;
INSMAP[0x79]=this->MOV_Rn_Idata;
INSMAP[0x7a]=this->MOV_Rn_Idata;
INSMAP[0x7b]=this->MOV_Rn_Idata;
INSMAP[0x7c]=this->MOV_Rn_Idata;
INSMAP[0x7d]=this->MOV_Rn_Idata;
INSMAP[0x7e]=this->MOV_Rn_Idata;
INSMAP[0x7f]=this->MOV_Rn_Idata;
INSMAP[0x80]=this->SJMP_rel;
INSMAP[0x81]=this->AJMP_addr11;
INSMAP[0x82]=this->ANL_C_bit;
INSMAP[0x83]=this->MOVC_A_DAaddPC;
INSMAP[0x84]=this->DIV_AB;
INSMAP[0x85]=this->MOV_direct2_direct1;
INSMAP[0x86]=this->MOV_direct_DRi;
INSMAP[0x87]=this->MOV_direct_DRi;
INSMAP[0x88]=this->MOV_direct_Rn;
INSMAP[0x89]=this->MOV_direct_Rn;
INSMAP[0x8a]=this->MOV_direct_Rn;
INSMAP[0x8b]=this->MOV_direct_Rn;
INSMAP[0x8c]=this->MOV_direct_Rn;
INSMAP[0x8d]=this->MOV_direct_Rn;
INSMAP[0x8e]=this->MOV_direct_Rn;
INSMAP[0x8f]=this->MOV_direct_Rn;
INSMAP[0x90]=this->MOV_DPTR_Idata16;
INSMAP[0x91]=this->ACALL_addr11;
INSMAP[0x92]=this->MOV_bit_C;
INSMAP[0x93]=this->MOVC_A_DAaddDPTR;
INSMAP[0x94]=this->SUB_A_Idata;
INSMAP[0x95]=this->SUB_A_direct;
INSMAP[0x96]=this->SUB_A_DRi;
INSMAP[0x97]=this->SUB_A_DRi;
INSMAP[0x98]=this->SUB_A_Rn;
INSMAP[0x99]=this->SUB_A_Rn;
INSMAP[0x9a]=this->SUB_A_Rn;
INSMAP[0x9b]=this->SUB_A_Rn;
INSMAP[0x9c]=this->SUB_A_Rn;
INSMAP[0x9d]=this->SUB_A_Rn;
INSMAP[0x9e]=this->SUB_A_Rn;
INSMAP[0x9f]=this->SUB_A_Rn;
INSMAP[0xa0]=this->ORL_C_NOT_bit;
INSMAP[0xa1]=this->AJMP_addr11;
INSMAP[0xa2]=this->MOV_C_bit;
INSMAP[0xa3]=this->INC_DPTR;
INSMAP[0xa4]=this->MUL_AB;
INSMAP[0xa5]=this->NULLFun;
INSMAP[0xa6]=this->MOV_DRi_direct;
INSMAP[0xa7]=this->MOV_DRi_direct;
INSMAP[0xa8]=this->MOV_Rn_direct;
INSMAP[0xa9]=this->MOV_Rn_direct;
INSMAP[0xaa]=this->MOV_Rn_direct;
INSMAP[0xab]=this->MOV_Rn_direct;
INSMAP[0xac]=this->MOV_Rn_direct;
INSMAP[0xad]=this->MOV_Rn_direct;
INSMAP[0xae]=this->MOV_Rn_direct;
INSMAP[0xaf]=this->MOV_Rn_direct;
INSMAP[0xb0]=this->ANL_C_NOT_bit;
INSMAP[0xb1]=this->ACALL_addr11;
INSMAP[0xb2]=this->CPL_bit;
INSMAP[0xb3]=this->CPL_C;
INSMAP[0xb4]=this->CJNE_A_Idata_rel;
INSMAP[0xb5]=this->CJNE_A_direct_rel;
INSMAP[0xb6]=this->CJNE_DRi_Idata_rel;
INSMAP[0xb7]=this->CJNE_DRi_Idata_rel;
INSMAP[0xb8]=this->CJNE_Rn_Idata_rel;
INSMAP[0xb9]=this->CJNE_Rn_Idata_rel;
INSMAP[0xba]=this->CJNE_Rn_Idata_rel;
INSMAP[0xbb]=this->CJNE_Rn_Idata_rel;
INSMAP[0xbc]=this->CJNE_Rn_Idata_rel;
INSMAP[0xbd]=this->CJNE_Rn_Idata_rel;
INSMAP[0xbe]=this->CJNE_Rn_Idata_rel;
INSMAP[0xbf]=this->CJNE_Rn_Idata_rel;
INSMAP[0xc0]=this->PUSH_direct;
INSMAP[0xc1]=this->AJMP_addr11;
INSMAP[0xc2]=this->CLR_bit;
INSMAP[0xc3]=this->CLR_C;
INSMAP[0xc4]=this->SWAP_A;
INSMAP[0xc5]=this->XCH_A_direct;
INSMAP[0xc6]=this->XCH_A_DRi;
INSMAP[0xc7]=this->XCH_A_DRi;
INSMAP[0xc8]=this->XCH_A_Rn;
INSMAP[0xc9]=this->XCH_A_Rn;
INSMAP[0xca]=this->XCH_A_Rn;
INSMAP[0xcb]=this->XCH_A_Rn;
INSMAP[0xcc]=this->XCH_A_Rn;
INSMAP[0xcd]=this->XCH_A_Rn;
INSMAP[0xce]=this->XCH_A_Rn;
INSMAP[0xcf]=this->XCH_A_Rn;
INSMAP[0xd0]=this->POP_direct;
INSMAP[0xd1]=this->ACALL_addr11;
INSMAP[0xd2]=this->SETB_bit;
INSMAP[0xd3]=this->SETB_C;
INSMAP[0xd4]=this->DA_A;
INSMAP[0xd5]=this->DJNZ_direct_rel;
INSMAP[0xd6]=this->XCHD_A_DRi;
INSMAP[0xd7]=this->XCHD_A_DRi;
INSMAP[0xd8]=this->DJNZ_Rn_rel;
INSMAP[0xd9]=this->DJNZ_Rn_rel;
INSMAP[0xda]=this->DJNZ_Rn_rel;
INSMAP[0xdb]=this->DJNZ_Rn_rel;
INSMAP[0xdc]=this->DJNZ_Rn_rel;
INSMAP[0xdd]=this->DJNZ_Rn_rel;
INSMAP[0xde]=this->DJNZ_Rn_rel;
INSMAP[0xdf]=this->DJNZ_Rn_rel;
INSMAP[0xe0]=this->MOVX_A_DDPTR;
INSMAP[0xe1]=this->AJMP_addr11;
INSMAP[0xe2]=this->MOVX_A_DRi;
INSMAP[0xe3]=this->MOVX_A_DRi;
INSMAP[0xe4]=this->CLR_A;
INSMAP[0xe5]=this->MOV_A_direct;
INSMAP[0xe6]=this->MOV_A_DRi;
INSMAP[0xe7]=this->MOV_A_DRi;
INSMAP[0xe8]=this->MOV_A_Rn;
INSMAP[0xe9]=this->MOV_A_Rn;
INSMAP[0xea]=this->MOV_A_Rn;
INSMAP[0xeb]=this->MOV_A_Rn;
INSMAP[0xec]=this->MOV_A_Rn;
INSMAP[0xed]=this->MOV_A_Rn;
INSMAP[0xee]=this->MOV_A_Rn;
INSMAP[0xef]=this->MOV_A_Rn;
INSMAP[0xf0]=this->MOVX_DDPTR_A;
INSMAP[0xf1]=this->ACALL_addr11;
INSMAP[0xf2]=this->MOVX_DRi_A;
INSMAP[0xf3]=this->MOVX_DRi_A;
INSMAP[0xf4]=this->CPL_A;
INSMAP[0xf5]=this->MOV_direct_A;
INSMAP[0xf6]=this->MOV_DRi_A;
INSMAP[0xf7]=this->MOV_DRi_A;
INSMAP[0xf8]=this->MOV_Rn_A;
INSMAP[0xf9]=this->MOV_Rn_A;
INSMAP[0xfa]=this->MOV_Rn_A;
INSMAP[0xfb]=this->MOV_Rn_A;
INSMAP[0xfc]=this->MOV_Rn_A;
INSMAP[0xfd]=this->MOV_Rn_A;
INSMAP[0xfe]=this->MOV_Rn_A;
INSMAP[0xff]=this->MOV_Rn_A;
}

BYTE instruction::GetRnAddr(BYTE Rn)
{
	if(Rn>7)
	{
		return 0xee;//定义ee为Rn错误寄存器地址
	}
	RnAddr=PSW_RS+Rn;
	return RnAddr;
}

void instruction::Clock(int count)
{
	for(int i=0;i<count;i++)
	{
		if(ClockEventPos[pKMsg->Clockpos])
		{
			pClockHookFunpos=ClockEventPos[pKMsg->Clockpos];
			ClockEventPos[pKMsg->Clockpos]=0;
			pKMsg->ClockCallHook(pClockHookFunpos);
			//ClockHookFunpos=ClockHookFun[pKMsg->Clockpos];
			//ClockHookFunpos(mem->VarNum,pKMsg->Clockpos);
			//
		}
		pKMsg->Clockpos++;
	}
//	BackClockCount=count;
	mem->CLKNUML+=count;

}



BYTE instruction::GetDRiData(BYTE Ri,BYTE AddrMode)
{
	if(Ri>1)
	{
		return 0xee;//定义ee为Rn错误寄存器地址
	}
	RnAddr=PSW_RS+Ri;
	switch(AddrMode)
	{
	case 0:
		return mem->GetidataMemByte(mem->GetidataMemBytef(RnAddr));
		break;
	case 1:
		return mem->GetxdataMemByte(mem->GetidataMemBytef(RnAddr));
		break;
	case 2:
		return mem->GetCodeMemByte(mem->GetidataMemBytef(RnAddr));
		break;
	default:
		return mem->GetidataMemByte(mem->GetidataMemBytef(RnAddr));
	}

}

void instruction::SetDRiData(BYTE Ri, BYTE data,BYTE AddrMode)
{
	if(Ri>1)
	{
		return ;//定义ee为Rn错误寄存器地址
	}	
	RnAddr=PSW_RS+Ri;
	switch(AddrMode)
	{
	case 0:
		mem->SetidataMemByte(mem->GetidataMemBytef(RnAddr),data);
		break;
	case 1:
		mem->SetxdataMemByte(mem->GetidataMemBytef(RnAddr),data);
		break;
	case 2:
		mem->SetCodeMemByte(mem->GetidataMemBytef(RnAddr),data);
		break;
	default:
		mem->SetidataMemByte(mem->GetidataMemBytef(RnAddr),data);
	}
	
}

BYTE instruction::GetRndata(BYTE Rn)
{
	if(Rn>7)
	{
		return 0xee;//定义ee为Rn错误寄存器地址
	}
	RnAddr=PSW_RS+Rn;
	return mem->GetidataMemByte(RnAddr);
}

void instruction::SetRndata(BYTE Rn, BYTE data)
{
	if(Rn>7)
	{
		return;//定义ee为Rn错误寄存器地址
	}
	RnAddr=PSW_RS+Rn;
	mem->SetidataMemByte(RnAddr,data);
	return ;
}

	    
void instruction::RUNCLK(int Code)
{
	Fun pfunc;
	while(Code)
	{
   		pfunc=(INSMAP[mem->pcode[mem->PCm]]);
	#if debug ==1
		INSMAPMON[mem->GetCodeMemByte(mem->PCm)]=1;
	#endif
		__asm{
				mov ecx,this;
				//push eax;
				call pfunc;
		}
		Code--;
	}

//	pfunc();
//	}


  //return false;
//	return 0;
}


void instruction::RUNINS(int Code)
{
	
	
//	Fun ;
	//mem->GetBit(
//	for(;;)
//	{
//	var8051->IPC->CheakIRQ();
	Fun pfunc;
//	typedef void (instruction::*PFUNC)();
//	PFUNC pfunc;
	while(Code)
	{
		pfunc=(INSMAP[mem->pcode[mem->PCm]]);
	#if debug ==1
		INSMAPMON[mem->GetCodeMemByte(mem->PCm)]=1;
	#endif
		__asm{
				mov ecx,this;
				//push eax;
				call pfunc;
		}
		Code--;
	}

//	pfunc();
//	}


//  return false;
//	return 0;
}

int instruction::RETIANON()
{
	//有中断,IsCheakIRQ=1,退出
	//没有中断,IsCheakIRQ=0,退出
	BYTE IRQfalg=mem->GetidataMemByte(TCON)&0xaa;
	IRQfalg+=mem->GetidataMemByte(SCON)&0x3;
	if(IRQfalg)
	{
		var8051[0]->IPC->CheakIRQ();
	}
	return 0;
}

void instruction::init()
{
	pKMsg->SetupMemHook(PSW,IdataSpace,Read,CheckOutAIdata);
	pKMsg->SetupMemHook(PSW_P,BitSpace,Read,CheckOutABit);
	pKMsg->SetupMemHook(PSW_RS0,BitSpace,Write,PSW_RS_WRITE_HOOK);
	pKMsg->SetupMemHook(PSW_RS1,BitSpace,Write,PSW_RS_WRITE_HOOK);
	pKMsg->SetupMemHook(PSW,IdataSpace,Write,PSW_WRITE_HOOK);
	PSW_RS=0x00;
}

void instruction::RUN()
{
	Fun pfunc;
	pfunc=(INSMAP[mem->pcode[mem->PCm]]);
	__asm{
				mov ecx,this;
				//push eax;
				call pfunc;
		}
}

⌨️ 快捷键说明

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