📄 instruction.cpp
字号:
// 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 + -