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