void Interpreter::BasicUnaryArithmetic(const Instruction & instruction, std::function<UInt16(UInt16)> ins) { UInt16 val = mCPU.DumpRegister(instruction.GetSecondOperand()); mErrorCode = mCPU.SetRegister(instruction.GetFirstOperand(), ins(val)); mCPU.SetSignZeroFlag(mCPU.DumpRegister(instruction.GetFirstOperand())); }
void Interpreter::JME(const Instruction & instruction) { UInt16 xVal = mCPU.DumpRegister(instruction.GetFirstOperand()); UInt16 yVal = mCPU.DumpRegister(instruction.GetSecondOperand()); if(xVal == yVal) mErrorCode = mCPU.SetProgramCounter(instruction.GetImmediateValue()); }
void Interpreter::IndirectLDM(const Instruction & instruction) { UInt8 addrX = instruction.GetFirstOperand(); UInt8 addrY = instruction.GetSecondOperand(); UInt16 val; mErrorCode = mCPU.Load(mCPU.DumpRegister(addrY), val); mErrorCode = mCPU.SetRegister(addrX, val); }
void Interpreter::DirectLDM(const Instruction & instruction) { UInt8 addr = instruction.GetFirstOperand(); UInt16 iVal = instruction.GetImmediateValue(); UInt16 val; mErrorCode = mCPU.Load(iVal, val); mErrorCode |= mCPU.SetRegister(addr, val); }
void Interpreter::RND(const Instruction & instruction) { UInt8 addr = instruction.GetFirstOperand(); UInt16 maxVal = instruction.GetImmediateValue(); UInt16 randVal = mDist(mRandEngine); while(randVal > maxVal) randVal= mDist(mRandEngine); mErrorCode = mCPU.SetRegister(addr, randVal); }
void Interpreter::Cx(const Instruction & instruction) { UInt8 condCode = instruction.GetFirstOperand(); if(InterpretConditions(condCode)) { mErrorCode = mCPU.PushPC(); mErrorCode |= mCPU.SetProgramCounter(instruction.GetImmediateValue()); } }
void Interpreter::InplaceUnaryArithmetic(const Instruction & instruction, std::function<UInt16(UInt16)> ins) { UInt8 reg = instruction.GetFirstOperand(); UInt16 val = mCPU.DumpRegister(reg); mErrorCode = mCPU.SetRegister(reg, ins(val)); mCPU.SetSignZeroFlag(mCPU.DumpRegister(reg)); }
void Interpreter::DiscardImmediateBinaryArithmetic(const Instruction & instruction, std::function<UInt16(UInt16,UInt16)> ins, std::function<void(UInt16,UInt16)> frh) { UInt16 xVal = mCPU.DumpRegister(instruction.GetFirstOperand()); UInt16 iVal = instruction.GetImmediateValue(); if (frh) frh(xVal, iVal); UInt16 result = ins(xVal, iVal); mCPU.SetSignZeroFlag(result); }
void Interpreter::ImmediateBinaryArithmetic(const Instruction & instruction, std::function<UInt16(UInt16,UInt16)> ins, std::function<void(UInt16,UInt16)> frh) { UInt8 reg = instruction.GetFirstOperand(); UInt16 iVal = instruction.GetImmediateValue(); if (frh) frh(mCPU.DumpRegister(reg), iVal); mErrorCode = mCPU.SetRegister(reg, ins(mCPU.DumpRegister(reg), iVal)); mCPU.SetSignZeroFlag(mCPU.DumpRegister(reg)); }
void Interpreter::InplaceBinaryArithmetic(const Instruction & instruction, std::function<UInt16(UInt16,UInt16)> ins, std::function<void(UInt16,UInt16)> frh) { UInt8 xReg = instruction.GetFirstOperand(); UInt16 xVal = mCPU.DumpRegister(xReg); UInt16 yVal = mCPU.DumpRegister(instruction.GetSecondOperand()); if (frh) frh(xVal, yVal); mErrorCode = mCPU.SetRegister(xReg, ins(xVal, yVal)); mCPU.SetSignZeroFlag(mCPU.DumpRegister(xReg)); }
void Interpreter::PUSH(const Instruction & instruction) { mErrorCode = mCPU.Push(mCPU.DumpRegister(instruction.GetFirstOperand())); }
void Interpreter::RegisterLDI(const Instruction & instruction) { mErrorCode = mCPU.SetRegister(instruction.GetFirstOperand(), instruction.GetImmediateValue()); }
void Interpreter::IndirectCALL(const Instruction & instruction) { mErrorCode = mCPU.PushPC(); mErrorCode |= mCPU.SetProgramCounter(mCPU.DumpRegister(instruction.GetFirstOperand())); }
void Interpreter::IndirectSTM(const Instruction & instruction) { UInt16 xVal = mCPU.DumpRegister(instruction.GetFirstOperand()); UInt16 yVal = mCPU.DumpRegister(instruction.GetSecondOperand()); mErrorCode = mCPU.Store(yVal, xVal); }
void Interpreter::DirectSTM(const Instruction & instruction) { UInt8 regAddr = instruction.GetFirstOperand(); UInt16 memAddr = instruction.GetImmediateValue(); mErrorCode = mCPU.Store(memAddr, mCPU.DumpRegister(regAddr)); }
void Interpreter::RegisterSAR(const Instruction & instruction) { UInt8 addr = instruction.GetFirstOperand(); mErrorCode = mCPU.SetRegister(addr, ArithmeticRightShift()(mCPU.DumpRegister(addr), mCPU.DumpRegister(instruction.GetSecondOperand()))); mCPU.SetSignZeroFlag(mCPU.DumpRegister(addr)); }
void Interpreter::NSHR(const Instruction & instruction) { UInt8 addr = instruction.GetFirstOperand(); mErrorCode = mCPU.SetRegister(addr, LogicalRightShift()(mCPU.DumpRegister(addr), instruction.GetThirdOperand())); mCPU.SetSignZeroFlag(mCPU.DumpRegister(addr)); }
void Interpreter::MOV(const Instruction & instruction) { UInt8 addrX = instruction.GetFirstOperand(); UInt16 yVal = mCPU.DumpRegister(instruction.GetSecondOperand()); mErrorCode = mCPU.SetRegister(addrX, yVal); }
void Interpreter::POP(const Instruction & instruction) { UInt16 val; mErrorCode = mCPU.Pop(val); mErrorCode |= mCPU.SetRegister(instruction.GetFirstOperand(), val); }
void Interpreter::Jx(const Instruction & instruction) { UInt8 condCode = instruction.GetFirstOperand(); if(InterpretConditions(condCode)) mCPU.SetProgramCounter(instruction.GetImmediateValue()); }