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

📄 instruction.cpp

📁 一款国产的8051模拟器(全部源代码) 本软件是一款8051模拟器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// instruction.cpp: implementation of the instruction class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "GlobalVar.h"
//#include "8051classDlg.h"
#include "instruction.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
void PSW_RS_WRITE_HOOK(BYTE VarNum,int mode,BYTE data)
{
	var8051[VarNum]->inst->PSW_RS=(var8051[VarNum]->mem->GetBitf(PSW_RS1))<<4;
	var8051[VarNum]->inst->PSW_RS|=((var8051[VarNum]->mem->GetBitf(PSW_RS0))<<3);
}


void PSW_WRITE_HOOK(BYTE VarNum,int mode,BYTE data)
{
	var8051[VarNum]->inst->PSW_RS=(var8051[VarNum]->mem->GetBitf(PSW_RS1))<<4;
	var8051[VarNum]->inst->PSW_RS|=((var8051[VarNum]->mem->GetBitf(PSW_RS0))<<3);
}


void CheckOutABit(BYTE VarNum,int mode,BYTE data)
{
	BYTE buf=var8051[VarNum]->mem->idata[Acc];
	BYTE buf1=0;
	for(;buf!=0;buf=buf>>1)
	{
		buf1=buf1+buf&0x1;
	}
	var8051[0]->mem->SetBitf(PSW_P,buf1&0x1);
/*	if(var8051.KMsg->CheckOutABackBit)
	{
		(var8051.KMsg->CheckOutABackBit)(mode,data);
	}*/
	return ;
}

void CheckOutAIdata(BYTE  VarNum,int mode,BYTE data)
{
	BYTE buf=var8051[VarNum]->mem->idata[Acc];
	BYTE buf1=0;
	for(;buf!=0;buf=buf>>1)
	{
		buf1=buf1+buf&0x1;
	}
	var8051[0]->mem->SetBitf(PSW_P,buf1&0x1);
/*	if(var8051.KMsg->CheckOutABackIdata)
	{
		(var8051.KMsg->CheckOutABackIdata)(mode,data);
	}*/
	return ;
}
instruction::instruction()
{
#if OS!=1
	memset(INSMAP,0,256*sizeof(Fun));
	memset(ClockEventPos,0,sizeof(ClockHook)*65536);
#endif

#if OS==1
	ZeroMemory(ClockEventPos,sizeof(ClockHook)*65536);
	ZeroMemory(INSMAP,256*sizeof(Fun));
#endif
#if debug ==1
	memset(INSMAPMON,0,256);
	dbuf1=0;
#endif
	
	buf1=0;
	buf2=0;
	buf3.bufa=0;
	buf4.bufa=0;
	buf5.bufa=0;
	buf6=0;
	buf7=0;
	BackClockCount=0;
}

instruction::~instruction()
{
//	if(INSMAP==NULL)
//		return ;
//delete [] MAP;
}



void instruction::MOV_A_Idata()
{
	A=code(1);
	mem->AddPC(2);
	Clock(1);
}

void instruction::MOV_Rn_Idata()
{
	//mem->SetidataMemByte(GetRnAddr(mem->GetCodeMemByte(mem->PC)-0x78),mem->GetCodeMemByte(mem->PC+1));

	//	this->SetRndata(mem->GetCodeMemByte(mem->PC)-0x78,mem->GetCodeMemByte(mem->PC+1));
	Rw(code(0)-0x78,code(1));
	mem->AddPC(2);
	Clock(1);
}

void instruction::MOV_DRi_Idata()
{
	//mem->SetidataMemByte(mem->GetidataMemByte(GetRnAddr(mem->GetCodeMemByte(mem->PC)-0x76)mem->GetCodeMemByte(mem->PC+1)
	//	this->SetDRiData(mem->GetCodeMemByte(mem->PC)-0x76,mem->GetCodeMemByte(mem->PC+1));
	DRw(code(0)-0x76,code(1));
	mem->AddPC(2);
	Clock(1);
}

void instruction::MOV_direct_Idata()
{
	mem->SetidataMemByte(code(1),code(2));
	mem->AddPC(3);
	Clock(2);
}

void instruction::MOV_DPTR_Idata16()
{
	//mem->SetidataMemByte(DPL,mem->GetCodeMemByte(mem->PC+2));
	//mem->SetidataMemByte(DPH,mem->GetCodeMemByte(mem->PC+1));
	DPTR=code(2)+((code(1)<<8));
	mem->AddPC(3);
	Clock(2);
}

void instruction::MOV_direct_Rn()
{
	mem->SetidataMemByte(code(1),R(code(0)-0x88));
	mem->AddPC(2);
	Clock(2);
}

void instruction::MOV_Rn_A()
{
	//	this->SetRndata(mem->GetCodeMemByte(mem->PC)-0xf8,A);
	Rw(code(0)-0xf8,A);
	mem->AddPC(1);
	Clock(1);

}

void instruction::MOV_A_Rn()
{
	//	mem->SetidataMemByte(Acc,mem->GetidataMemByte(mem->GetCodeMemByte(mem->PC)-0xe8));
	A=R(code(0)-0xe8);
	mem->AddPC(1);
	Clock(1);

}

void instruction::MOV_direct_A()
{
	mem->SetidataMemByte(code(1),A);
	mem->AddPC(2);
	Clock(1);

}

void instruction::MOV_DRi_A()//10
{
	//	SetDRiData(mem->GetCodeMemByte(mem->PC)-0xf6,mem->GetidataMemByte(Acc));
	DRw(code(0)-0xf6,A);
	mem->AddPC(1);
	Clock(1);

}

void instruction::MOV_Rn_direct()
{
	Rw(code(0)-0xa8,mem->GetidataMemByte(code(1)));
	APC(2);
	Clock(2);
}

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

void instruction::MOV_DRi_direct()
{
	DRw(code(0)-0xa6,mem->GetidataMemByte(code(1)));
	APC(2);
	Clock(2);
}

void instruction::MOV_direct2_direct1()
{
	mem->SetidataMemByte(code(2),mem->GetidataMemByte(code(1)));
	APC(3);
	Clock(2);
}

void instruction::MOV_direct_DRi()
{
	mem->SetidataMemByte(code(1),DR(code(0)-0x86));
	APC(2);
	Clock(2);
}

void instruction::MOV_A_DRi()
{
	A=DR(code(0)-0xe6);
	APC(1);
	Clock(1);
}

void instruction::MOVX_A_DDPTR()
{
	A=mem->GetxdataMemByte(DPTR);
	APC(1);
	Clock(2);
}

void instruction::MOVX_DRi_A()
{
	DxRw(code(0)-0xf2,A);
	APC(1);
	Clock(2);
}

void instruction::MOVX_A_DRi()
{
	A=DR(code(0)-0xe2);
	APC(1);
	Clock(2);
}

void instruction::MOVX_DDPTR_A()
{
	mem->SetxdataMemByte(DPTR,A);
	APC(1);
	Clock(2);
}

void instruction::MOVC_A_DAaddDPTR()
{
	A=mem->GetCodeMemByte(A+DPTR);
	APC(1);
	Clock(2);
}

void instruction::MOVC_A_DAaddPC()//22 2005.4.26修改了此处错误
{
	APC(1);//这条指令居然是先增加PC
	A=mem->GetCodeMemByte(A+PC);
	//APC(1);
	Clock(2);
}

void instruction::XCH_A_Rn()
{
	buf1=A;
	A=R(code(0)-0xc8);
	Rw(code(0)-0xc8,buf1);
	APC(1);
	Clock(1);
}

void instruction::XCH_A_DRi()
{
	buf1=A;
	A=DR(code(0)-0xc6);
	DRw(code(0)-0xc6,buf1);
	APC(1);
	Clock(1);
}

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

void instruction::XCHD_A_DRi()
{
	buf2=DR(code(0)-0xd6);//@Ri
	buf1=A&0xf+buf2&0xf0;//@RiHAL
	A=(buf2&0xf)+(A&0xf0);
	DRw(code(0)-0xd6,buf1);
	APC(1);
	Clock(1);
}

void instruction::SWAP_A()//27
{
	buf1=(A&0xf)<<4;
	buf2=(A&0xf0)>>4;
	A=buf1+buf2;
	APC(1);
	Clock(1);
}



///////////////////////
void instruction::PUSH_direct()
{
	SP=SP+1;
	mem->SetidataMemByte(SP,mem->GetidataMemByte(code(1)));
	APC(2);
	Clock(2);
}

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

void instruction::ADD_A_Rn()
{
	//CFB;
	buf3.bufa=A;
	buf4.bufa=R(code(0)-0x28);
	buf1=(buf3.ACa.AL+buf4.ACa.AL);
	buf1=buf1>>4;
	ACw(buf1);
	buf5.bufa=buf3.ACa7.A7+buf4.ACa7.A7;
	buf3.bufa+=buf4.bufa;
	buf1=buf5.ACa7.A8^buf3.ACa7.CYa;
	OVw(buf1);
	CYw(buf3.ACa.CYa);
	A=buf3.Aa;
//	buf5=buf3+buf4;
//	A=(BYTE)(buf5&0xff);
//	CYw((buf5&0x100)>>9);
//	OVw((buf5&
	APC(1);
	Clock(1);
}

void instruction::ADD_A_DRi()
{
	//CFB;
	buf3.bufa=A;
	buf4.bufa=DR(code(0)-0x26);
	buf1=(buf3.ACa.AL+buf4.ACa.AL);
	buf1=buf1>>4;
	ACw(buf1);
	buf5.bufa=buf3.ACa7.A7+buf4.ACa7.A7;
	buf3.bufa+=buf4.bufa;
	buf1=buf5.ACa7.A8^buf3.ACa7.CYa;
	OVw(buf1);
	CYw(buf3.ACa.CYa);
	A=buf3.Aa;
	APC(1);
	Clock(1);
}

void instruction::ADD_A_direct()
{
	//CFB;
	buf3.bufa=A;
	buf4.bufa=mem->GetidataMemByte(code(1));
	buf1=(buf3.ACa.AL+buf4.ACa.AL);
	buf1=buf1>>4;
	ACw(buf1);
	buf5.bufa=buf3.ACa7.A7+buf4.ACa7.A7;
	buf3.bufa+=buf4.bufa;
	buf1=buf5.ACa7.A8^buf3.ACa7.CYa;
	OVw(buf1);
	CYw(buf3.ACa.CYa);
	A=buf3.Aa;
	
	APC(2);
	Clock(1);
}

void instruction::ADD_A_Idata()
{
	//CFB;
	buf3.bufa=A;
	buf4.bufa=code(1);
	buf1=(buf3.ACa.AL+buf4.ACa.AL);
	buf1=buf1>>4;
	ACw(buf1);
	buf5.bufa=buf3.ACa7.A7+buf4.ACa7.A7;
	buf3.bufa+=buf4.bufa;
	buf1=buf5.ACa7.A8^buf3.ACa7.CYa;
	OVw(buf1);
	CYw(buf3.ACa.CYa);
	A=buf3.Aa;
	APC(2);
	Clock(1);
}

void instruction::ADDC_A_Rn()
{
	//CFB;
	buf3.bufs=A;
	buf4.bufs=R(code(0)-0x38);
	//buf3.bufs+=CY;
	buf1=buf3.ACa.AL+buf4.ACa.AL+CY;
	buf1=buf1>>4;
	ACw(buf1);
	buf5.bufa=buf3.ACa7.A7+buf4.ACa7.A7+CY;
	buf3.bufa+=buf4.bufa;
	buf3.bufs+=CY;
	buf1=buf5.ACa7.A8^buf3.ACa7.CYa;
	OVw(buf1);
	CYw(buf3.ACa.CYa);
	A=buf3.Aa;
	APC(1);
	Clock(1);
}

void instruction::ADDC_A_DRi()
{
	//CFB;
	buf3.bufs=A;
	buf4.bufs=DR(code(0)-0x36);
	//buf3.bufs+=CY;
	buf1=buf3.ACa.AL+buf4.ACa.AL+CY;
	buf1=buf1>>4;
	ACw(buf1);
	buf5.bufa=buf3.ACa7.A7+buf4.ACa7.A7+CY;
	buf3.bufa+=buf4.bufa;
	buf3.bufs+=CY;
	buf1=buf5.ACa7.A8^buf3.ACa7.CYa;
	OVw(buf1);
	CYw(buf3.ACa.CYa);
	A=buf3.Aa;
	APC(1);
	Clock(1);
}

void instruction::ADDC_A_direct()
{
	//CFB;
	buf3.bufs=A;
	buf4.bufs=mem->GetidataMemByte(code(1));
	//buf3.bufs+=CY;
	buf1=buf3.ACa.AL+buf4.ACa.AL+CY;
	buf1=buf1>>4;
	ACw(buf1);
	buf5.bufa=buf3.ACa7.A7+buf4.ACa7.A7+CY;
	buf3.bufa+=buf4.bufa;
	buf3.bufs+=CY;
	buf1=buf5.ACa7.A8^buf3.ACa7.CYa;
	OVw(buf1);
	CYw(buf3.ACa.CYa);
	A=buf3.Aa;
	APC(2);
	Clock(1);
}

void instruction::ADDC_A_Idata()
{
	//CFB;
	buf3.bufs=A;
	buf4.bufs=code(1);
	//buf3.bufs+=CY;
	buf1=buf3.ACa.AL+buf4.ACa.AL+CY;
	buf1=buf1>>4;
	ACw(buf1);
	buf5.bufa=buf3.ACa7.A7+buf4.ACa7.A7+CY;
	buf3.bufa+=buf4.bufa;
	buf3.bufs+=CY;
	buf1=buf5.ACa7.A8^buf3.ACa7.CYa;
	OVw(buf1);
	CYw(buf3.ACa.CYa);
	A=buf3.Aa;
	APC(2);
	Clock(1);
}

void instruction::SUB_A_Rn()
{
	//CFB;
	buf3.bufs=A;	
	buf4.bufs=R(code(0)-0x98);
	//buf3.bufa-=CY;
	buf1=buf3.ACa.AL-buf4.ACa.AL-CY;
	buf1=buf1>>4;
	ACw(buf1);
	//buf3.ACa.CYa=CY;
	buf5.bufa=buf3.ACa7.A7-buf4.ACa7.A7-CY;
	buf3.bufa-=buf4.bufa;
	buf3.bufa-=CY;
	buf1=buf5.ACa7.A8^buf3.ACa7.CYa;
	OVw(buf1);
	CYw(buf3.ACa.CYa);
	A=buf3.Aa;
	//COB(buf3.bufa)
	APC(1);
	Clock(1);
}

void instruction::SUB_A_DRi()
{
	//CFB;
	buf3.bufs=A;
	buf4.bufs=DR(code(0)-0x96);
	//buf3.bufa-=CY;
	buf1=buf3.ACa.AL-buf4.ACa.AL-CY;
	buf1=buf1>>4;
	ACw(buf1);
	//buf3.ACa.CYa=CY;
	buf5.bufa=buf3.ACa7.A7-buf4.ACa7.A7-CY;
	buf3.bufa-=buf4.bufa;
	buf3.bufa-=CY;
	buf1=buf5.ACa7.A8^buf3.ACa7.CYa;
	OVw(buf1);
	CYw(buf3.ACa.CYa);
	A=buf3.Aa;
	//COB(buf3.bufa)
	APC(1);
	Clock(1);
}

void instruction::SUB_A_direct()
{
	//CFB;
	buf3.bufs=A;
	buf4.bufs=mem->GetidataMemByte(code(1));
	//buf3.bufa-=CY;
	buf1=buf3.ACa.AL-buf4.ACa.AL-CY;
	buf1=buf1>>4;
	ACw(buf1);
	//buf3.ACa.CYa=CY;
	buf5.bufa=buf3.ACa7.A7-buf4.ACa7.A7-CY;
	buf3.bufa-=buf4.bufa;
	buf3.bufa-=CY;
	buf1=buf5.ACa7.A8^buf3.ACa7.CYa;
	OVw(buf1);
	CYw(buf3.ACa.CYa);
	A=buf3.Aa;
	//COB(buf3.bufa)
	APC(2);
	Clock(1);
}

void instruction::SUB_A_Idata()
{
	//CFB;
	buf3.bufs=A;
	buf4.bufs=code(1);
	//buf3.bufa-=;
	buf1=buf3.ACa.AL-buf4.ACa.AL-CY;
	buf1=buf1>>4;
	ACw(buf1);
	//buf3.ACa.CYa=CY;
	buf5.bufa=buf3.ACa7.A7-buf4.ACa7.A7-CY;
	buf3.bufa-=buf4.bufa;
	buf3.bufa-=CY;
	buf1=buf5.ACa7.A8^buf3.ACa7.CYa;
	OVw(buf1);
	CYw(buf3.ACa.CYa);
	A=buf3.Aa;
	//COB(buf3.bufa)
	APC(2);
	Clock(1);
}

void instruction::INC_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::inc_Rn()
{
	buf1=R(code(0)-0x08)+1;
	Rw(code(0)-0x08,buf1);
	APC(1);
	Clock(1);
}

void instruction::INC_DRi()
{
	buf1=DR(code(0)-0x06)+1;
	DRw(code(0)-0x06,buf1);
	APC(1);
	Clock(1);
}

void instruction::INC_direct()
{
	buf1=mem->GetidataMemByte(code(1))+1;
	mem->SetidataMemByte(code(1),buf1);

⌨️ 快捷键说明

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