📄 cometvm.cpp
字号:
//格式: JPZ ADR[,XR]
//功能: E = ADR [ + XR] (mod 2 ^ 16)
// 根据FR的值(00)向有效地址E转移,即 E---> PC; 不转移时执行下一条指令
//---------------JPZ指令的功能描述 ends----------------------------------
//---------------变量定义部分 begins----------------------------------
S2 s2EA = 0;
int iRegNumber = 0;
//---------------变量定义部分 ends------------------------------------
m_errorHandler.WriteErrorMessage("Execute Instruction JPZ : 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;
}
//根据FR的值设置PC的值
if (!(m_FR & 0x00))
{
//将有效地址赋给 PC
m_PC = s2EA;
}
else
{
m_PC += 2;
}
m_errorHandler.WriteErrorMessage("Execute Instruction JPZ : ends OK! ");
return STATUS_OK;
}
/////////////////////////////////////////////////////////////////////////
//函数名称:Instruction_JMI
//函数功能:---------------------JMI指令的执行函数----------------------------
//入口参数:无
//出口参数:无
//返回值:int--------------STATUS_OK表示操作成功,其他表示操作出现问题
//开发人员:杨军
//开发日期:2004-4-19
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CCometVM::Instruction_JMI()
{
//---------------JMI指令的功能描述 begins-------------------------------
//格式: JPZ ADR[,XR]
//功能: E = ADR [ + XR] (mod 2 ^ 16)
// 根据FR的值(10)向有效地址E转移,即 E---> PC; 不转移时执行下一条指令
//---------------JMI指令的功能描述 ends----------------------------------
//---------------变量定义部分 begins----------------------------------
S2 s2EA = 0;
int iRegNumber = 0;
//---------------变量定义部分 ends------------------------------------
m_errorHandler.WriteErrorMessage("Execute Instruction JMI : 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;
}
//根据FR的值设置PC的值
if (m_FR & 0x02)
{
//将有效地址赋给 PC
m_PC = s2EA;
}
else
{
m_PC += 2;
}
m_errorHandler.WriteErrorMessage("Execute Instruction JMI : ends OK! ");
return STATUS_OK;
}
/////////////////////////////////////////////////////////////////////////
//函数名称:Instruction_JNZ
//函数功能:---------------------JNZ指令的执行函数----------------------------
//入口参数:无
//出口参数:无
//返回值:int--------------STATUS_OK表示操作成功,其他表示操作出现问题
//开发人员:杨军
//开发日期:2004-4-19
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CCometVM::Instruction_JNZ()
{
//---------------JNZ指令的功能描述 begins-------------------------------
//格式: JPZ ADR[,XR]
//功能: E = ADR [ + XR] (mod 2 ^ 16)
// 根据FR的值(不等于01)向有效地址E转移,即 E---> PC; 不转移时执行下一条指令
//---------------JNZ指令的功能描述 ends----------------------------------
//---------------变量定义部分 begins----------------------------------
S2 s2EA = 0;
int iRegNumber = 0;
//---------------变量定义部分 ends------------------------------------
m_errorHandler.WriteErrorMessage("Execute Instruction JNZ : 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;
}
//根据FR的值设置PC的值
if (!(m_FR & 0x01))
{
//将有效地址赋给 PC
m_PC = s2EA;
}
else
{
m_PC += 2;
}
m_errorHandler.WriteErrorMessage("Execute Instruction JNZ : ends OK! ");
return STATUS_OK;
}
/////////////////////////////////////////////////////////////////////////
//函数名称:Instruction_JZE
//函数功能:---------------------JZE指令的执行函数----------------------------
//入口参数:无
//出口参数:无
//返回值:int--------------STATUS_OK表示操作成功,其他表示操作出现问题
//开发人员:杨军
//开发日期:2004-4-19
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CCometVM::Instruction_JZE()
{
//---------------JZE指令的功能描述 begins-------------------------------
//格式: JZE ADR[,XR]
//功能: E = ADR [ + XR] (mod 2 ^ 16)
// 根据FR的值(等于01)向有效地址E转移,即 E---> PC; 不转移时执行下一条指令
//---------------JZE指令的功能描述 ends----------------------------------
//---------------变量定义部分 begins----------------------------------
S2 s2EA = 0;
int iRegNumber = 0;
//---------------变量定义部分 ends------------------------------------
m_errorHandler.WriteErrorMessage("Execute Instruction JZE : 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;
}
//根据FR的值设置PC的值
if (m_FR & 0x01)
{
//将有效地址赋给 PC
m_PC = s2EA;
}
else
{
m_PC += 2;
}
m_errorHandler.WriteErrorMessage("Execute Instruction JZE : ends OK! ");
return STATUS_OK;
}
/////////////////////////////////////////////////////////////////////////
//函数名称:Instruction_Push
//函数功能:---------------------PUSH指令的执行函数----------------------------
//入口参数:无
//出口参数:无
//返回值:int--------------STATUS_OK表示操作成功,其他表示操作出现问题
//开发人员:杨军
//开发日期:2004-4-19
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CCometVM::Instruction_Push()
{
//---------------PUSH指令的功能描述 begins-------------------------------
//格式: PUSH ADR[,XR]
//功能: E = ADR [ + XR] (mod 2 ^ 16)
// SP - 1 ---> SP(注意,这里的计量单位是字,即双字节)
// E--->(SP)
//---------------PUSH指令的功能描述 ends----------------------------------
//---------------变量定义部分 begins----------------------------------
S2 s2EA = 0;
int iRegNumber = 0;
//---------------变量定义部分 ends------------------------------------
m_errorHandler.WriteErrorMessage("Execute Instruction PUSH : 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;
}
}
//修改SP指针(实际上就是GR4)
m_GR[4] = m_GR[4] - 1;
//将E送至栈顶
*(S2*)(m_pVMMemoryBase + (m_GR[4] << 1)) = s2EA;
m_errorHandler.WriteErrorMessage("Execute Instruction PUSH : ends OK! ");
return STATUS_OK;
}
/////////////////////////////////////////////////////////////////////////
//函数名称:Instruction_Pop
//函数功能:---------------------POP指令的执行函数----------------------------
//入口参数:无
//出口参数:无
//返回值:int--------------STATUS_OK表示操作成功,其他表示操作出现问题
//开发人员:杨军
//开发日期:2004-4-19
//修改人员:
//修改日期:
/////////////////////////////////////////////////////////////////////////
int CCometVM::Instruction_Pop()
{
//---------------POP指令的功能描述 begins-------------------------------
//格式: POP GR
//功能:
// (SP)----->GR
// SP + 1 ---> SP(注意,这里的计量单位是字,即双字节)
//---------------POP指令的功能描述 ends----------------------------------
//---------------变量定义部分 begins----------------------------------
S2 s2EA = 0;
int iRegNumber = 0;
//---------------变量定义部分 ends------------------------------------
m_errorHandler.WriteErrorMessage("Execute Instruction POP : begins");
//获得目的寄存器编号
iRegNumber = m_objInstruction.regNumber & 0x0f;
//------------ 将取出的数据 + 通用寄存器中现有的数据然后将结果赋给通用寄存器----
if (iRegNumber >= 0 && iRegNumber <= 4)
{
m_GR[iRegNumber] = *(S2*)(m_pVMMemoryBase + (m_GR[4] << 1));
m_GR[4] = m_GR[4] + 1;
}
//目的寄存器的编号不合法(在0 到 4之外)
else
{
m_errorHandler.WriteErrorMessage("POP指令的目的寄器不合法");
return STATUS_FAILED;
}
m_errorHandler.WriteErrorMessage("Execute Instruction POP : ends OK! ");
return STATUS_OK;
}
/////////////////////////////////////////////////////////////////////////
//函数名称:Instruction_Call
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -