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