📄 cometvm.cpp
字号:
S2 s2Flag = 0;
int iRegNumber = 0;
//---------------变量定义部分 ends------------------------------------
m_errorHandler.WriteErrorMessage("Execute Instruction SLA: begins");
//--------------计算出有效地址E-----------------------------------------
//获得变址寄存器的编号
iRegNumber = (m_objInstruction.regNumber & 0xf0) >> 4;
//如果变址寄存器的编号合法的话(GR0---GR4)
//则有效地址 = Addr + XR
if (0 <= iRegNumber && iRegNumber <= 4)
{
//memcpy(&s2EA, m_objInstruction.address, sizeof(s2EA) / sizeof(char));
s2EA = (*(S2*)m_objInstruction.address) + m_GR[iRegNumber];
}
//否则 有效地址 = Addr
else
{
//如果变址寄存器值为空的话
if (REG_EMPTY == iRegNumber)
{
s2EA = *(short*)m_objInstruction.address;
}
//如果变址寄存器引用一个非法的编号的话
else
{
m_errorHandler.WriteErrorMessage(" unsupported XR number");
return STATUS_FAILED;
}
}
//获得目的寄存器编号
iRegNumber = m_objInstruction.regNumber & 0x0f;
//------------将指定寄存器算术左移(E)位-----------------------
if (iRegNumber >= 0 && iRegNumber <= 4)
{
//保存寄存器中现有数据的符号位
s2Flag = m_GR[iRegNumber] & 0x8000;
//进行逻辑左移
//m_GR[iRegNumber] <<= *(short*)(m_pVMMemoryBase + s2EA * 2);
m_GR[iRegNumber] <<= ((U2)s2EA);
//恢复原有的符号位
m_GR[iRegNumber] |= s2Flag;
if (STATUS_OK != AdjustFR(iRegNumber))
{
m_errorHandler.WriteErrorMessage("Update FR failed");
return STATUS_FAILED;
}
}
//目的寄存器的编号不合法(在0 到 4之外)
else
{
m_errorHandler.WriteErrorMessage("SLA指令的目的寄器不合法");
return STATUS_FAILED;
}
m_errorHandler.WriteErrorMessage("Execute Instruction SLA: Ends OK !");
return STATUS_OK;
}
/////////////////////////////////////////////////////////////////////////
//函数名称:Instruction_SRA
//函数功能:---------------------SRA指令的执行函数----------------------------
//入口参数:无
//出口参数:无
//返回值:int--------------STATUS_OK表示操作成功,其他表示操作出现问题
//开发人员:杨军
//开发日期:2004-4-19
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CCometVM::Instruction_SRA()
{
//---------------SRA指令的功能描述 begins-------------------------------
//格式: SRA GR, ADR[,XR]
//功能: E = ADR [ + XR] (mod 2 ^ 16)
// 将 (GR)向右算术移动 E 位(即符号位不变)
//---------------SLA指令的功能描述 ends----------------------------------
//---------------变量定义部分 begins----------------------------------
S2 s2EA = 0;
S2 s2Flag = 0;
int iRegNumber = 0;
int i = 0;
int iSize = 0;
//---------------变量定义部分 ends------------------------------------
m_errorHandler.WriteErrorMessage("Execute Instruction SRA: begins");
//--------------计算出有效地址E-----------------------------------------
//获得变址寄存器的编号
iRegNumber = (m_objInstruction.regNumber & 0xf0) >> 4;
//如果变址寄存器的编号合法的话(GR0---GR4)
//则有效地址 = Addr + XR
if (0 <= iRegNumber && iRegNumber <= 4)
{
//memcpy(&s2EA, m_objInstruction.address, sizeof(s2EA) / sizeof(char));
s2EA = (*(S2*)m_objInstruction.address) + m_GR[iRegNumber];
}
//否则 有效地址 = Addr
else
{
//如果变址寄存器值为空的话
if (REG_EMPTY == iRegNumber)
{
s2EA = *(short*)m_objInstruction.address;
}
//如果变址寄存器引用一个非法的编号的话
else
{
m_errorHandler.WriteErrorMessage(" unsupported XR number");
return STATUS_FAILED;
}
}
//获得目的寄存器编号
iRegNumber = m_objInstruction.regNumber & 0x0f;
//------------将指定寄存器算术右移E位-----------------------
if (iRegNumber >= 0 && iRegNumber <= 4)
{
//保存寄存器中现有数据的符号位
s2Flag = m_GR[iRegNumber] & 0x8000;
i = 0;
iSize = (int)((U2)s2EA);
//通过循环完成算术右移iSize位
while (i < iSize)
{
//进行逻辑右移1位
m_GR[iRegNumber] >>= 1;
//恢复原有的符号位
m_GR[iRegNumber] |= s2Flag;
i++;
}
if (STATUS_OK != AdjustFR(iRegNumber))
{
m_errorHandler.WriteErrorMessage("Update FR failed");
return STATUS_FAILED;
}
}
//目的寄存器的编号不合法(在0 到 4之外)
else
{
m_errorHandler.WriteErrorMessage("SRA指令的目的寄器不合法");
return STATUS_FAILED;
}
m_errorHandler.WriteErrorMessage("Execute Instruction SRA: Ends OK !");
return STATUS_OK;
}
/////////////////////////////////////////////////////////////////////////
//函数名称:Instruction_SLL
//函数功能:---------------------SLL指令的执行函数----------------------------
//入口参数:无
//出口参数:无
//返回值:int--------------STATUS_OK表示操作成功,其他表示操作出现问题
//开发人员:杨军
//开发日期:2004-4-19
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CCometVM::Instruction_SLL()
{
//---------------SLL指令的功能描述 begins-------------------------------
//格式: SLL GR, ADR[,XR]
//功能: E = ADR [ + XR] (mod 2 ^ 16)
// 将 (GR)向左逻辑移动 E 位
//---------------SLL指令的功能描述 ends----------------------------------
//---------------变量定义部分 begins----------------------------------
S2 s2EA = 0;
S2 s2Flag = 0;
int iRegNumber = 0;
//---------------变量定义部分 ends------------------------------------
m_errorHandler.WriteErrorMessage("Execute Instruction SLL: begins");
//--------------计算出有效地址E-----------------------------------------
//获得变址寄存器的编号
iRegNumber = (m_objInstruction.regNumber & 0xf0) >> 4;
//如果变址寄存器的编号合法的话(GR0---GR4)
//则有效地址 = Addr + XR
if (0 <= iRegNumber && iRegNumber <= 4)
{
//memcpy(&s2EA, m_objInstruction.address, sizeof(s2EA) / sizeof(char));
s2EA = (*(S2*)m_objInstruction.address) + m_GR[iRegNumber];
}
//否则 有效地址 = Addr
else
{
//如果变址寄存器值为空的话
if (REG_EMPTY == iRegNumber)
{
s2EA = *(short*)m_objInstruction.address;
}
//如果变址寄存器引用一个非法的编号的话
else
{
m_errorHandler.WriteErrorMessage(" unsupported XR number");
return STATUS_FAILED;
}
}
//获得目的寄存器编号
iRegNumber = m_objInstruction.regNumber & 0x0f;
//------------将指定寄存器逻辑左移(E)位-----------------------
if (iRegNumber >= 0 && iRegNumber <= 4)
{
//进行逻辑左移
//m_GR[iRegNumber] <<= *(short*)(m_pVMMemoryBase + s2EA * 2);
m_GR[iRegNumber] <<= (U2)s2EA;
if (STATUS_OK != AdjustFR(iRegNumber))
{
m_errorHandler.WriteErrorMessage("Update FR failed");
return STATUS_FAILED;
}
}
//目的寄存器的编号不合法(在0 到 4之外)
else
{
m_errorHandler.WriteErrorMessage("SLL指令的目的寄器不合法");
return STATUS_FAILED;
}
m_errorHandler.WriteErrorMessage("Execute Instruction SLL: Ends OK !");
return STATUS_OK;
}
/////////////////////////////////////////////////////////////////////////
//函数名称:Instruction_SRL
//函数功能:---------------------SRL指令的执行函数----------------------------
//入口参数:无
//出口参数:无
//返回值:int--------------STATUS_OK表示操作成功,其他表示操作出现问题
//开发人员:杨军
//开发日期:2004-4-19
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CCometVM::Instruction_SRL()
{
//---------------SRL指令的功能描述 begins-------------------------------
//格式: SRL GR, ADR[,XR]
//功能: E = ADR [ + XR] (mod 2 ^ 16)
// 将 (GR)向右逻辑移动 E 位
//---------------SRL指令的功能描述 ends----------------------------------
//---------------变量定义部分 begins----------------------------------
S2 s2EA = 0;
S2 s2Flag = 0;
int iRegNumber = 0;
//---------------变量定义部分 ends------------------------------------
m_errorHandler.WriteErrorMessage("Execute Instruction SRL: begins");
//--------------计算出有效地址E-----------------------------------------
//获得变址寄存器的编号
iRegNumber = (m_objInstruction.regNumber & 0xf0) >> 4;
//如果变址寄存器的编号合法的话(GR0---GR4)
//则有效地址 = Addr + XR
if (0 <= iRegNumber && iRegNumber <= 4)
{
//memcpy(&s2EA, m_objInstruction.address, sizeof(s2EA) / sizeof(char));
s2EA = (*(S2*)m_objInstruction.address) + m_GR[iRegNumber];
}
//否则 有效地址 = Addr
else
{
//如果变址寄存器值为空的话
if (REG_EMPTY == iRegNumber)
{
s2EA = *(short*)m_objInstruction.address;
}
//如果变址寄存器引用一个非法的编号的话
else
{
m_errorHandler.WriteErrorMessage(" unsupported XR number");
return STATUS_FAILED;
}
}
//获得目的寄存器编号
iRegNumber = m_objInstruction.regNumber & 0x0f;
//------------将指定寄存器逻辑右移E位-----------------------
if (iRegNumber >= 0 && iRegNumber <= 4)
{
//进行逻辑右移
m_GR[iRegNumber] >>= ((U2)s2EA);
if (STATUS_OK != AdjustFR(iRegNumber))
{
m_errorHandler.WriteErrorMessage("Update FR failed");
return STATUS_FAILED;
}
}
//目的寄存器的编号不合法(在0 到 4之外)
else
{
m_errorHandler.WriteErrorMessage("SRL指令的目的寄器不合法");
return STATUS_FAILED;
}
m_errorHandler.WriteErrorMessage("Execute Instruction SRL: Ends OK !");
return STATUS_OK;
}
/////////////////////////////////////////////////////////////////////////
//函数名称:Instruction_JMP
//函数功能:---------------------JMP指令的执行函数----------------------------
//入口参数:无
//出口参数:无
//返回值:int--------------STATUS_OK表示操作成功,其他表示操作出现问题
//开发人员:杨军
//开发日期:2004-4-19
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CCometVM::Instruction_JMP()
{
//---------------JMP指令的功能描述 begins-------------------------------
//格式: JMP ADR[,XR]
//功能: 将E ----> PC (E = ADR [ + XR] (mod 2 ^ 16)
//---------------JMP指令的功能描述 ends----------------------------------
//---------------变量定义部分 begins----------------------------------
S2 s2EA = 0;
int iRegNumber = 0;
//---------------变量定义部分 ends------------------------------------
m_errorHandler.WriteErrorMessage("Execute Instruction JMP : begins");
//--------------计算出有效地址E-----------------------------------------
//获得变址寄存器的编号
iRegNumber = (m_objInstruction.regNumber & 0xf0) >> 4;
//如果变址寄存器的编号合法的话(GR0---GR4)
//则有效地址 = Addr + XR
if (0 <= iRegNumber && iRegNumber <= 4)
{
//memcpy(&s2EA, m_objInstruction.address, sizeof(s2EA) / sizeof(char));
s2EA = (*(S2*)m_objInstruction.address) + m_GR[iRegNumber];
}
//否则 有效地址 = Addr
else
{
//如果变址寄存器值为空的话
if (REG_EMPTY == iRegNumber)
{
s2EA = *(short*)m_objInstruction.address;
}
//如果变址寄存器引用一个非法的编号的话
else
{
m_errorHandler.WriteErrorMessage(" unsupported XR number");
return STATUS_FAILED;
}
}
//检查有效地址是否合法
if (!IsAddressValid(s2EA << 1))
{
return STATUS_FAILED;
}
//将有效地址赋给 PC
m_PC = s2EA;
m_errorHandler.WriteErrorMessage("Execute Instruction JMP : ends OK! ");
return STATUS_OK;
}
/////////////////////////////////////////////////////////////////////////
//函数名称:Instruction_JPZ
//函数功能:---------------------JPZ指令的执行函数----------------------------
//入口参数:无
//出口参数:无
//返回值:int--------------STATUS_OK表示操作成功,其他表示操作出现问题
//开发人员:杨军
//开发日期:2004-4-19
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CCometVM::Instruction_JPZ()
{
//---------------JPZ指令的功能描述 begins-------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -