📄 cometvm.cpp
字号:
//获得目的寄存器编号
iRegNumber = m_objInstruction.regNumber & 0x0f;
//------------- 自可执行文件的内存映像中的相应地址中取出数据------------
//注意: 数据的长度是 16 bits
//------------- 将取出的数据赋给指定的通用寄存器-----------------------
if (iRegNumber >= 0 && iRegNumber <= 4)
{
m_GR[iRegNumber] = *(short*)(m_pVMMemoryBase + s2EA * 2);
}
//目的寄存器的编号不合法(在0 到 4之外)
else
{
m_errorHandler.WriteErrorMessage("LD指令的目的寄器不合法");
return STATUS_FAILED;
}
m_errorHandler.WriteErrorMessage("Execute Instruction LD: Ends OK !");
return STATUS_OK;
}
/////////////////////////////////////////////////////////////////////////
//函数名称:Instruction_LEA
//函数功能:---------------------LEA指令的执行函数----------------------------
//入口参数:无
//出口参数:无
//返回值:int--------------STATUS_OK表示操作成功,其他表示操作出现问题
//开发人员:杨军
//开发日期:2004-4-19
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CCometVM::Instruction_LEA()
{
//---------------LEA指令的功能描述 begins-------------------------------
//格式: LEAD GR, ADR[,XR]
//功能: 将E ----> GR (E = ADR [ + XR] (mod 2 ^ 16)
//---------------LEA指令的功能描述 ends----------------------------------
//---------------变量定义部分 begins----------------------------------
S2 s2EA = 0;
int iRegNumber = 0;
//---------------变量定义部分 ends------------------------------------
m_errorHandler.WriteErrorMessage("Execute Instruction LEA : 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;
//------------- 将计算出的有效地址赋给指定的通用寄存器-----------------------
if (iRegNumber >= 0 && iRegNumber <= 4)
{
m_GR[iRegNumber] = s2EA;
//更新标志寄存器的数据
if (STATUS_OK != AdjustFR(iRegNumber))
{
m_errorHandler.WriteErrorMessage("update FR failed");
return STATUS_FAILED;
}
}
//目的寄存器的编号不合法(在0 到 4之外)
else
{
m_errorHandler.WriteErrorMessage("LEA指令的目的寄器不合法");
return STATUS_FAILED;
}
m_errorHandler.WriteErrorMessage("Execute Instruction LEA : ends OK! ");
return STATUS_OK;
}
/////////////////////////////////////////////////////////////////////////
//函数名称:Instruction_ST
//函数功能:---------------------ST指令的执行函数----------------------------
//入口参数:无
//出口参数:无
//返回值:int--------------STATUS_OK表示操作成功,其他表示操作出现问题
//开发人员:杨军
//开发日期:2004-4-19
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CCometVM::Instruction_ST()
{
//---------------ST指令的功能描述 begins-------------------------------
//格式: ST GR, ADR[,XR]
//功能: 将 GR ----> (E) (E = ADR [ + XR] (mod 2 ^ 16)
//---------------ST指令的功能描述 ends----------------------------------
//---------------变量定义部分 begins----------------------------------
S2 s2EA = 0;
int iRegNumber = 0;
//---------------变量定义部分 ends------------------------------------
m_errorHandler.WriteErrorMessage("Execute Instruction ST: 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;
//------------- 将指定的通用寄存器中的内容赋给有效地址指向的内存单元中-------------
if (iRegNumber >= 0 && iRegNumber <= 4)
{
*(short*)(m_pVMMemoryBase + ((U2)s2EA << 1)) = m_GR[iRegNumber];
}
//目的寄存器的编号不合法(在0 到 4之外)
else
{
m_errorHandler.WriteErrorMessage("ST指令的目的寄器不合法");
return STATUS_FAILED;
}
m_errorHandler.WriteErrorMessage("Execute Instruction ST: Ends Ok !!!");
return STATUS_OK;
}
/////////////////////////////////////////////////////////////////////////
//函数名称:Instruction_ADD
//函数功能:---------------------ADD指令的执行函数----------------------------
//入口参数:无
//出口参数:无
//返回值:int--------------STATUS_OK表示操作成功,其他表示操作出现问题
//开发人员:杨军
//开发日期:2004-4-19
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CCometVM::Instruction_ADD()
{
//---------------ADD指令的功能描述 begins-------------------------------
//格式: ADD GR, ADR[,XR]
//功能: 将 (GR) + (E) ----> GR (E = ADR [ + XR] (mod 2 ^ 16)
//---------------ADD指令的功能描述 ends----------------------------------
//---------------变量定义部分 begins----------------------------------
S2 s2EA = 0;
int iRegNumber = 0;
//---------------变量定义部分 ends------------------------------------
m_errorHandler.WriteErrorMessage("Execute Instruction ADD: 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;
}
//获得目的寄存器编号
iRegNumber = m_objInstruction.regNumber & 0x0f;
//------------ 将取出的数据 + 通用寄存器中现有的数据然后将结果赋给通用寄存器----
if (iRegNumber >= 0 && iRegNumber <= 4)
{
m_GR[iRegNumber] = *(short*)(m_pVMMemoryBase + s2EA * 2) + m_GR[iRegNumber];
if (STATUS_OK != AdjustFR(iRegNumber))
{
m_errorHandler.WriteErrorMessage("Update FR failed");
return STATUS_FAILED;
}
}
//目的寄存器的编号不合法(在0 到 4之外)
else
{
m_errorHandler.WriteErrorMessage("ADD指令的目的寄器不合法");
return STATUS_FAILED;
}
m_errorHandler.WriteErrorMessage("Execute Instruction ADD: Ends OK !");
return STATUS_OK;
}
/////////////////////////////////////////////////////////////////////////
//函数名称:Instruction_Sub
//函数功能:---------------------SUB指令的执行函数----------------------------
//入口参数:无
//出口参数:无
//返回值:int--------------STATUS_OK表示操作成功,其他表示操作出现问题
//开发人员:杨军
//开发日期:2004-4-19
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CCometVM::Instruction_Sub()
{
//---------------SUB指令的功能描述 begins-------------------------------
//格式: SUB GR, ADR[,XR]
//功能: 将 (GR) - (E) ----> GR (E = ADR [ + XR] (mod 2 ^ 16)
//---------------SUB指令的功能描述 ends----------------------------------
//---------------变量定义部分 begins----------------------------------
S2 s2EA = 0;
int iRegNumber = 0;
//---------------变量定义部分 ends------------------------------------
m_errorHandler.WriteErrorMessage("Execute Instruction SUB: 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;
}
//获得目的寄存器编号
iRegNumber = m_objInstruction.regNumber & 0x0f;
//------------ 将通用寄存器中现有的数据 - 取出的数据 然后将结果赋给通用寄存器----
if (iRegNumber >= 0 && iRegNumber <= 4)
{
m_GR[iRegNumber] = m_GR[iRegNumber] - *(short*)(m_pVMMemoryBase + s2EA * 2);
if (STATUS_OK != AdjustFR(iRegNumber))
{
m_errorHandler.WriteErrorMessage("Update FR failed");
return STATUS_FAILED;
}
}
//目的寄存器的编号不合法(在0 到 4之外)
else
{
m_errorHandler.WriteErrorMessage("SUB指令的目的寄器不合法");
return STATUS_FAILED;
}
m_errorHandler.WriteErrorMessage("Execute Instruction SUB: Ends OK !");
return STATUS_OK;
}
/////////////////////////////////////////////////////////////////////////
//函数名称:Instruction_AND
//函数功能:---------------------AND指令的执行函数----------------------------
//入口参数:无
//出口参数:无
//返回值:int--------------STATUS_OK表示操作成功,其他表示操作出现问题
//开发人员:杨军
//开发日期:2004-4-19
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CCometVM::Instruction_AND()
{
//---------------AND指令的功能描述 begins-------------------------------
//格式: AND GR, ADR[,XR]
//功能: 将 (GR) ^ (E) ----> GR (E = ADR [ + XR] (mod 2 ^ 16)
//---------------AND指令的功能描述 ends----------------------------------
//---------------变量定义部分 begins----------------------------------
S2 s2EA = 0;
int iRegNumber = 0;
//---------------变量定义部分 ends------------------------------------
m_errorHandler.WriteErrorMessage("Execute Instruction AND: 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;
}
//获得目的寄存器编号
iRegNumber = m_objInstruction.regNumber & 0x0f;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -