예제 #1
0
파일: Vm.cs 프로젝트: MuranagaTamura/LessVm
        public bool OpMoveIB(BytecodeStream code)
        {
            int  regId = code.ReadByte();
            byte imm   = code.ReadByte();

            if (!TrySetRegUi8(regId, imm))
            {
                return(PushRegError(regId));
            }
            return(true);
        }
예제 #2
0
파일: Vm.cs 프로젝트: MuranagaTamura/LessVm
        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);
        }
예제 #3
0
파일: Vm.cs 프로젝트: MuranagaTamura/LessVm
        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);
        }
예제 #4
0
파일: Vm.cs 프로젝트: MuranagaTamura/LessVm
        public bool OpMoveID(BytecodeStream code)
        {
            int  regId = code.ReadByte();
            uint imm   = (uint)code.ReadInt();

            if (!TrySetRegUi32(regId, imm))
            {
                return(PushRegError(regId));
            }
            return(true);
        }
예제 #5
0
파일: Vm.cs 프로젝트: MuranagaTamura/LessVm
        public bool OpMoveIW(BytecodeStream code)
        {
            int    regId = code.ReadByte();
            ushort imm   = code.ReadChar();

            if (!TrySetRegUi16(regId, imm))
            {
                return(PushRegError(regId));
            }
            return(true);
        }
예제 #6
0
파일: Vm.cs 프로젝트: MuranagaTamura/LessVm
        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));
        }
예제 #7
0
파일: Vm.cs 프로젝트: MuranagaTamura/LessVm
        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}"));
        }
예제 #8
0
파일: Vm.cs 프로젝트: MuranagaTamura/LessVm
        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);
        }
예제 #9
0
파일: Vm.cs 프로젝트: MuranagaTamura/LessVm
        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);
        }
예제 #10
0
파일: Vm.cs 프로젝트: MuranagaTamura/LessVm
        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}"));
        }