📄 instruction.cpp
字号:
{
DWORD dwTemp2=dwCode & 0X0000FFFF;
WORD wData2=WORD(dwTemp2);
BYTE bIndexSrc=BYTE((dwCode & 0X00070000)>>16);
BYTE bIndexDst=BYTE((dwCode & 0X00380000)>>19);
//shift operation
wData2+=_cpu->GetGR(bIndexSrc);
wData2=_cpu->GetGR(bIndexDst)>>wData2;
_cpu->SetGR(wData2,bIndexDst);
//change the flags
if(wData2>0)
{
wFlags &=0XFFFC;
_cpu->SetFLAGS(wFlags);
}
else if(wData2=0)
{
wFlags &=0XFFFC;
wFlags |=0X0001;
_cpu->SetFLAGS(wFlags);
}
else if(wData2<0)
{
wFlags &=0XFFFC;
wFlags |=0X0002;
_cpu->SetFLAGS(wFlags);
}
}
else
{
ReportState("the 'SRA' instruction can't handle this code");
return;
}
UNSHORT uAddr=_cpu->GetPC();
_cpu->SetPC(uAddr+2);
}
void AND::Excute(DWORD dwCode)
{
WORD uIP=_cpu->GetIP();
DWORD dw=dwCode & 0X01C00000;//specify operand number
WORD wFlags=_cpu->GetFLAGS();//flag register
if(dw==0x00800000)//2 operand (ADD GR,ADR),GR<-(GR)&(ADR)
{
DWORD dwTemp1=dwCode & 0X0000FFFF;//get the immediate data
UNSHORT uAddr1=UNSHORT(dwTemp1+uIP);
_cpu->RequestBUS();
_cpu->WriteAddrToAddrBUS(uAddr1);
WORD wData1=_cpu->ReadDataFromMemory();
_cpu->ReleaseBUS();
//register operation
BYTE bIndex=BYTE((dwCode & 0X00070000)>>16);
wData1 =wData1 & _cpu->GetGR(bIndex);
_cpu->SetGR(wData1,bIndex);
//change the flags register
if(wData1>0)
{
wFlags &=0XFFFC;
_cpu->SetFLAGS(wFlags);
}
else if(wData1=0)
{
wFlags &=0XFFFC;
wFlags |=0X0001;
_cpu->SetFLAGS(wFlags);
}
else if(wData1<0)
{
wFlags &=0XFFFC;
wFlags |=0X0002;
_cpu->SetFLAGS(wFlags);
}
}
else if(dw==0X00C00000)//3 operand (AND GRd,imm,GRs),GRd<-(GRd)&(imm+(GRs))
{
DWORD dwTemp2=dwCode & 0X0000FFFF;
WORD wData2=WORD(dwTemp2+uIP);
BYTE bIndexSrc=BYTE((dwCode & 0X00070000)>>16);
BYTE bIndexDst=BYTE((dwCode & 0X00380000)>>19);
UNSHORT uAddr2=UNSHORT(wData2+_cpu->GetGR(bIndexSrc));
_cpu->RequestBUS();
_cpu->WriteAddrToAddrBUS(uAddr2);
wData2=_cpu->ReadDataFromMemory();
_cpu->ReleaseBUS();
wData2 =wData2 & _cpu->GetGR(bIndexDst);
_cpu->SetGR(wData2,bIndexDst);
//change the flags
if(wData2>0)
{
wFlags &=0XFFFC;
_cpu->SetFLAGS(wFlags);
}
else if(wData2=0)
{
wFlags &=0XFFFC;
wFlags |=0X0001;
_cpu->SetFLAGS(wFlags);
}
else if(wData2<0)
{
wFlags &=0XFFFC;
wFlags |=0X0002;
_cpu->SetFLAGS(wFlags);
}
}
else
{
ReportState("the 'AND' instruction can't handle this code");
return;
}
UNSHORT uAddr=_cpu->GetPC();
_cpu->SetPC(uAddr+2);
}
void OR::Excute(DWORD dwCode)
{
WORD uIP=_cpu->GetIP();
DWORD dw=dwCode & 0X01C00000;//specify operand number
WORD wFlags=_cpu->GetFLAGS();//flag register
if(dw==0x00800000)//2 operand (ADD GR,ADR),GR<-(GR)|(ADR)
{
DWORD dwTemp1=dwCode & 0X0000FFFF;//get the immediate data
UNSHORT uAddr1=UNSHORT(dwTemp1+uIP);
_cpu->RequestBUS();
_cpu->WriteAddrToAddrBUS(uAddr1);
WORD wData1=_cpu->ReadDataFromMemory();
_cpu->ReleaseBUS();
//register operation
BYTE bIndex=BYTE((dwCode & 0X00070000)>>16);
wData1 =wData1 | _cpu->GetGR(bIndex);
_cpu->SetGR(wData1,bIndex);
//change the flags register
if(wData1>0)
{
wFlags &=0XFFFC;
_cpu->SetFLAGS(wFlags);
}
else if(wData1=0)
{
wFlags &=0XFFFC;
wFlags |=0X0001;
_cpu->SetFLAGS(wFlags);
}
else if(wData1<0)
{
wFlags &=0XFFFC;
wFlags |=0X0002;
_cpu->SetFLAGS(wFlags);
}
}
else if(dw==0X00C00000)//3 operand (OR GRd,imm,GRs),GRd<-(GRd)|(imm+(GRs))
{
DWORD dwTemp2=dwCode & 0X0000FFFF;
WORD wData2=WORD(dwTemp2+uIP);
BYTE bIndexSrc=BYTE((dwCode & 0X00070000)>>16);
BYTE bIndexDst=BYTE((dwCode & 0X00380000)>>19);
UNSHORT uAddr2=UNSHORT(wData2+_cpu->GetGR(bIndexSrc));
_cpu->RequestBUS();
_cpu->WriteAddrToAddrBUS(uAddr2);
wData2=_cpu->ReadDataFromMemory();
_cpu->ReleaseBUS();
wData2 =wData2 | _cpu->GetGR(bIndexDst);
_cpu->SetGR(wData2,bIndexDst);
//change the flags
if(wData2>0)
{
wFlags &=0XFFFC;
_cpu->SetFLAGS(wFlags);
}
else if(wData2=0)
{
wFlags &=0XFFFC;
wFlags |=0X0001;
_cpu->SetFLAGS(wFlags);
}
else if(wData2<0)
{
wFlags &=0XFFFC;
wFlags |=0X0002;
_cpu->SetFLAGS(wFlags);
}
}
else
{
ReportState("the 'OR' instrcution can't handle this code");
return;
}
UNSHORT uAddr=_cpu->GetPC();
_cpu->SetPC(uAddr+2);
}
void EOR::Excute(DWORD dwCode)
{
WORD uIP=_cpu->GetIP();
DWORD dw=dwCode & 0X01C00000;//specify operand number
WORD wFlags=_cpu->GetFLAGS();//flag register
if(dw==0x00800000)//2 operand (ADD GR,ADR),GR<-(GR)|(ADR)
{
DWORD dwTemp1=dwCode & 0X0000FFFF;//get the immediate data
UNSHORT uAddr1=UNSHORT(dwTemp1+uIP);
_cpu->RequestBUS();
_cpu->WriteAddrToAddrBUS(uAddr1);
WORD wData1=_cpu->ReadDataFromMemory();
_cpu->ReleaseBUS();
//register operation
BYTE bIndex=BYTE((dwCode & 0X00070000)>>16);
wData1 =wData1 ^ _cpu->GetGR(bIndex);
_cpu->SetGR(wData1,bIndex);
//change the flags register
if(wData1>0)
{
wFlags &=0XFFFC;
_cpu->SetFLAGS(wFlags);
}
else if(wData1=0)
{
wFlags &=0XFFFC;
wFlags |=0X0001;
_cpu->SetFLAGS(wFlags);
}
else if(wData1<0)
{
wFlags &=0XFFFC;
wFlags |=0X0002;
_cpu->SetFLAGS(wFlags);
}
}
else if(dw==0X00C00000)//3 operand (OR GRd,imm,GRs),GRd<-(GRd)|(imm+(GRs))
{
DWORD dwTemp2=dwCode & 0X0000FFFF;
WORD wData2=WORD(dwTemp2+uIP);
BYTE bIndexSrc=BYTE((dwCode & 0X00070000)>>16);
BYTE bIndexDst=BYTE((dwCode & 0X00380000)>>19);
UNSHORT uAddr2=UNSHORT(wData2+_cpu->GetGR(bIndexSrc));
_cpu->RequestBUS();
_cpu->WriteAddrToAddrBUS(uAddr2);
wData2=_cpu->ReadDataFromMemory();
_cpu->ReleaseBUS();
wData2 =wData2 ^ _cpu->GetGR(bIndexDst);
_cpu->SetGR(wData2,bIndexDst);
//change the flags
if(wData2>0)
{
wFlags &=0XFFFC;
_cpu->SetFLAGS(wFlags);
}
else if(wData2=0)
{
wFlags &=0XFFFC;
wFlags |=0X0001;
_cpu->SetFLAGS(wFlags);
}
else if(wData2<0)
{
wFlags &=0XFFFC;
wFlags |=0X0002;
_cpu->SetFLAGS(wFlags);
}
}
else
{
ReportState("the 'EOR' instruction can't handle this code");
return;
}
UNSHORT uAddr=_cpu->GetPC();
_cpu->SetPC(uAddr+2);
}
void NOT::Excute(DWORD dwCode)
{
WORD uIP=_cpu->GetIP();
ReportState("the 'NOT' instruction haven't implemented");
UNSHORT uAddr=_cpu->GetPC();
_cpu->SetPC(uAddr+2);
return;
}
void SLL::Excute(DWORD dwCode)
{
WORD uIP=_cpu->GetIP();
DWORD dw=dwCode & 0X01C00000;//specify the operand mumber
WORD wFlags=_cpu->GetFLAGS();//flag register
if(dw==0x00800000)//2 operand (SLL GR,ADR)
{
DWORD dwTemp1=dwCode & 0X0000FFFF;//get the immediate data
WORD wData1=WORD(dwTemp1);//convert it into 16 bits format
BYTE bIndex=BYTE((dwCode & 0X00070000)>>16);//specify the register index
//the index is stored in the 18-16 bit of dwCode
//shift operation
wData1=((_cpu->GetGR(bIndex))<<wData1);
_cpu->SetGR(wData1,bIndex);
//change the flags register
if(wData1>0)
{
wFlags &=0XFFFC;
_cpu->SetFLAGS(wFlags);
}
else if(wData1=0)
{
wFlags &=0XFFFC;
wFlags |=0X0001;
_cpu->SetFLAGS(wFlags);
}
else if(wData1<0)
{
wFlags &=0XFFFC;
wFlags |=0X0002;
_cpu->SetFLAGS(wFlags);
}
}
else if(dw==0X00C00000)//3 operand (SLL GRd,imm,GRs)
{
DWORD dwTemp2=dwCode & 0X0000FFFF;
WORD wData2=WORD(dwTemp2);
BYTE bIndexSrc=BYTE((dwCode & 0X00070000)>>16);
BYTE bIndexDst=BYTE((dwCode & 0X00380000)>>19);
//shift operation
wData2+=_cpu->GetGR(bIndexSrc);
wData2=_cpu->GetGR(bIndexDst)<<wData2;
_cpu->SetGR(wData2,bIndexDst);
//change the flags
if(wData2>0)
{
wFlags &=0XFFFC;
_cpu->SetFLAGS(wFlags);
}
else if(wData2=0)
{
wFlags &=0XFFFC;
wFlags |=0X0001;
_cpu->SetFLAGS(wFlags);
}
else if(wData2<0)
{
wFlags &=0XFFFC;
wFlags |=0X0002;
_cpu->SetFLAGS(wFlags);
}
}
else
{
ReportState("the 'SLL' instruction can't handle this code");
return;
}
UNSHORT uAddr=_cpu->GetPC();
_cpu->SetPC(uAddr+2);
}
void SRL::Excute(DWORD dwCode)
{
WORD uIP=_cpu->GetIP();
DWORD dw=dwCode & 0X01C00000;//specify the operand mumber
WORD wFlags=_cpu->GetFLAGS();//flag register
if(dw==0x00800000)//2 operand (SRL GR,ADR)
{
DWORD dwTemp1=dwCode & 0X0000FFFF;//get the immediate data
WORD wData1=WORD(dwTemp1);//convert it into 16 bits format
BYTE bIndex=BYTE((dwCode & 0X00070000)>>16);//specify the register index
//the index is stored in the 18-16 bit of dwCode
//shift operation
wData1=((_cpu->GetGR(bIndex))>>wData1);
_cpu->SetGR(wData1,bIndex);
//change the flags register
if(wData1>0)
{
wFlags &=0XFFFC;
_cpu->SetFLAGS(wFlags);
}
else if(wData1=0)
{
wFlags &=0XFFFC;
wFlags |=0X0001;
_cpu->SetFLAGS(wFlags);
}
else if(wData1<0)
{
wFlags &=0XFFFC;
wFlags |=0X0002;
_cpu->SetFLAGS(wFlags);
}
}
else if(dw==0X00C00000)//3 operand (SRL GRd,imm,GRs)
{
DWORD dwTemp2=dwCode & 0X0000FFFF;
WORD wData2=WORD(dwTemp2);
BYTE bIndexSrc=BYTE((dwCode & 0X00070000)>>16);
BYTE bIndexDst=BYTE((dwCode & 0X00380000)>>19);
//shift operation
wData2+=_cpu->GetGR(bIndexSrc);
wData2=_cpu->GetGR(bIndexDst)>>wData2;
_cpu->SetGR(wData2,bIndexDst);
//change the flags
if(wData2>0)
{
wFlags &=0XFFFC;
_cpu->SetFLAGS(wFlags);
}
else if(wData2=0)
{
wFlags &=0XFFFC;
wFlags |=0X0001;
_cpu->SetFLAGS(wFlags);
}
else if(wData2<0)
{
wFlags &=0XFFFC;
wFlags |=0X0002;
_cpu->SetFLAGS(wFlags);
}
}
else
{
ReportState("the 'SRL' instruction can't handle this code");
return;
}
UNSHORT uAddr=_cpu->GetPC();
_cpu->SetPC(uAddr+2);
}
void CPA::Excute(DWORD dwCode)
{
WORD uIP=_cpu->GetIP();
DWORD dw=dwCode & 0X01C00000;//specify operand number
WORD wFlags=_cpu->GetFLAGS();//flag register
if(dw==0x00800000)//2 operand (CPA GR,ADR)
{
DWORD dwTemp1=dwCode & 0X0000FFFF;//get the meory address
UNSHORT uAddr1=UNSHORT(dwTemp1+uIP);
_cpu->RequestBUS();
_cpu->WriteAddrToAddrBUS(uAddr1);
WORD wData1=_cpu->ReadDataFromMemory();
_cpu->ReleaseBUS();
//register operation
BYTE bIndex=BYTE((dwCode & 0X00070000)>>16);
wData1=_cpu->GetGR(bIndex)-wData1;
//change the flags register
if(wData1>0)
{
wFlags &=0XFFFC;
_cpu->SetFLAGS(wFlags);
}
else if(wData1=0)
{
wFlags &=0XFFFC;
wFlags |=0X0001;
_cpu->SetFLAGS(wFlags);
}
else if(wData1<0)
{
wFlags &=0XFFFC;
wFlags |=0X0002;
_cpu->SetFLAGS(wFlags);
}
}
else if(dw==0X00C00000)//3 operand (CPA GRd,imm,GRs)
{
DWORD dwTemp2=dwCode & 0X0000FFFF;
WORD wData2=WORD(dwTemp2+uIP);
BYTE bIndexSrc=BYTE((dwCode & 0X00070000)>>16);
BYTE bIndexDst=BYTE((dwCode & 0X00380000)>>19);
UNSHORT uAddr2=UNSHORT(wData2+_cpu->GetGR(bIndexSrc));
_cpu->RequestBUS();
_cpu->WriteAddrToAddrBUS(uAddr2);
wData2=_cpu->ReadDataFromMemory();
_cpu->ReleaseBUS();
wData2=_cpu->GetGR(bIndexDst)-wData2;
//change the flags
if(wData2>0)
{
wFlags &=0XFFFC;
_cpu->SetFLAGS(wFlags);
}
else if(wData2=0)
{
wFlags &=0XFFFC;
wFlags |=0X0001;
_cpu->SetFLAGS(wFlags);
}
else if(wData2<0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -