public bool OpMoveIB(BytecodeStream code) { int regId = code.ReadByte(); byte imm = code.ReadByte(); if (!TrySetRegUi8(regId, imm)) { return(PushRegError(regId)); } return(true); }
public bool OpMoveD(BytecodeStream code) { int rsId = code.ReadByte(); int rtId = code.ReadByte(); uint a; if (!TryGetReg(rsId, out a)) { return(PushRegError(rsId)); } if (!TrySetRegUi32(rtId, a)) { return(PushRegError(rtId)); } return(true); }
private bool GetRegVal( BytecodeStream code, out int rsId, out uint a, out uint b) { rsId = code.ReadByte(); int rtId = code.ReadByte(); b = 0; if (!TryGetReg(rsId, out a)) { return(PushRegError(rsId)); } if (!TryGetReg(rtId, out b)) { return(PushRegError(rtId)); } return(true); }
public bool OpMoveID(BytecodeStream code) { int regId = code.ReadByte(); uint imm = (uint)code.ReadInt(); if (!TrySetRegUi32(regId, imm)) { return(PushRegError(regId)); } return(true); }
public bool OpMoveIW(BytecodeStream code) { int regId = code.ReadByte(); ushort imm = code.ReadChar(); if (!TrySetRegUi16(regId, imm)) { return(PushRegError(regId)); } return(true); }
public bool OpStoreD(BytecodeStream code) { int memPtr = code.ReadChar(); int regId = code.ReadByte(); if (TryGetReg(regId, out uint val)) { return(_memory.TrySetUi32(memPtr, val)); } return(PushRegError(regId)); }
public bool OpLoadD(BytecodeStream code) { int regId = code.ReadByte(); int memPtr = code.ReadChar(); if (_memory.TryGetUi32(memPtr, out uint val32)) { return(TrySetRegUi32(regId, val32)); } return(PushError($"メモリ範囲外を指定しました => ptr: {memPtr}")); }
private bool OpCmpHelper( BytecodeStream code, Func <uint, uint, bool> isSign) { int rsId = code.ReadByte(); int rtId = code.ReadByte(); uint a, b; if (!TryGetReg(rsId, out a)) { return(PushRegError(rsId)); } if (!TryGetReg(rtId, out b)) { return(PushRegError(rtId)); } IsZero = (a - b) == 0; IsSign = isSign(a, b); return(true); }
public bool InitMemory(BytecodeStream mem, int start, int end) { int length = end - start; if (length < 0) { return(PushError("メモリの初期化失敗しました")); } for (int i = 0; i < length && i < mem.Size; ++i) { if (!_memory.TrySetUi8(start + i, mem.ReadByte())) { return(PushError("メモリの初期化に失敗しました")); } } return(true); }
public bool StepRun() { if (IsEnd) { return(false); } if (_itr != null) { _itr.MoveNext(); switch (_itr.Current) { case VmStatus.HALT: IsEnd = true; return(PushError("組み込み関数からHALTを検出しました")); case VmStatus.FINISH: _itr = null; SetFromVmStatus(_status); return(true); case VmStatus.CONTINUE: return(true); default: IsEnd = true; return(PushError("組み込み関数で不正な値が検出されました")); } } if (_code.IsEnd) { return(false); } OPCODE op = (OPCODE)_code.ReadByte(); if (_opTable.TryGetValue(op, out Func <BytecodeStream, bool> opFunc)) { return(opFunc(_code)); } return(PushError($"実行できないOPCODEです => {op}")); }