Beispiel #1
0
        // Compiles single instruction to bytecode.
        // INPUT: Four parts, each having 3 chars. Example: { "MOV", "001", "@0C", "000" }
        // OUTPUT: Compiled instruction as executable bytecode (byte[4])
        public static byte[] AssembleInstruction(string[] line)
        {
            if (line.Length == 0)
            {
                return new byte[4] {
                           0, 0, 0, 0
                }
            }
            ;

            if (!IsInstruction(line))
            {
                return new byte[4] {
                           ParamToValue(line[0]), ParamToValue(line[1]), ParamToValue(line[2]), ParamToValue(line[3])
                }
            }
            ;

            byte[] result = new byte[4];

            if (IsCommutativeOperation(line[0]) && PointerDepth(line[1]) < PointerDepth(line[2]))
            {
                string tmp = line[1];

                line[1] = line[2];
                line[2] = tmp;
            }

            if (IsMathOperation(line[0]))
            {
                if (PointerDepth(line[1]) == 0 && PointerDepth(line[2]) == 0)
                {
                    string target = line[3];
                    if (line[0] == "ADD")
                    {
                        line[1] = (ParamToValue(line[1]) + ParamToValue(line[2])).ToString("X2");
                    }
                    if (line[0] == "SUB")
                    {
                        line[1] = (ParamToValue(line[1]) - ParamToValue(line[2])).ToString("X2");
                    }
                    if (line[0] == "MUL")
                    {
                        line[1] = (ParamToValue(line[1]) * ParamToValue(line[2])).ToString("X2");
                    }
                    if (line[0] == "DIV")
                    {
                        line[1] = ParamToValue(line[2]) > 0
                                                        ? (ParamToValue(line[1]) / ParamToValue(line[2])).ToString("X2")
                                                        : (0).ToString("X2");
                    }
                    if (line[0] == "MOD")
                    {
                        line[1] = ParamToValue(line[2]) > 0
                                                        ? (ParamToValue(line[1]) % ParamToValue(line[2])).ToString("X2")
                                                        : (0).ToString("X2");
                    }
                    line[0] = "MOV";
                    line[2] = target;
                    line[3] = "001";
                }
            }

            if (IsLengthOperation(line[0]) && line[3] == "000")
            {
                line[3] = "001";
            }

            OpCodes.OpCode opCode = InstructionToOpCode(line[0], line[1], line[2], line[3]);
            result[0] = (byte)opCode;
            result[1] = ParamToValue(line[1]);
            result[2] = ParamToValue(line[2]);
            result[3] = ParamToValue(line[3]);
            return(result);
        }
Beispiel #2
0
        public void Tick()
        {
            m_ExecutionJumpedDuringTick = false;

            OpCodes.OpCode opCode = (OpCodes.OpCode)m_Memory[m_ProgramCounter];
            byte           p1     = m_Memory[(byte)(m_ProgramCounter + 1)];
            byte           p2     = m_Memory[(byte)(m_ProgramCounter + 2)];
            byte           p3     = m_Memory[(byte)(m_ProgramCounter + 3)];

            unchecked
            {
                switch (opCode)
                {
                case OpCodes.OpCode.MOV010:
                    SetMemory(ConstantToArray(p1, p3), p2);
                    break;

                case OpCodes.OpCode.MOV110:
                    SetMemory(GetMemory(p1, p3), p2);
                    break;

                case OpCodes.OpCode.MOV210:
                    SetMemory(GetMemory2(p1, p3), p2);
                    break;

                case OpCodes.OpCode.MOV020:
                    SetMemory(ConstantToArray(p1, p3), GetMemory(p2));
                    break;

                case OpCodes.OpCode.MOV120:
                    SetMemory(GetMemory(p1, p3), GetMemory(p2));
                    break;

                case OpCodes.OpCode.MOV220:
                    SetMemory(GetMemory2(p1, p3), GetMemory(p2));
                    break;

                case OpCodes.OpCode.MOV011:
                    SetMemory(ConstantToArray(p1, GetMemory(p3)), p2);
                    break;

                case OpCodes.OpCode.MOV111:
                    SetMemory(GetMemory(p1, GetMemory(p3)), p2);
                    break;

                case OpCodes.OpCode.MOV211:
                    SetMemory(GetMemory2(p1, GetMemory(p3)), p2);
                    break;

                case OpCodes.OpCode.MOV021:
                    SetMemory(ConstantToArray(p1, GetMemory(p3)), GetMemory(p2));
                    break;

                case OpCodes.OpCode.MOV121:
                    SetMemory(GetMemory(p1, GetMemory(p3)), GetMemory(p2));
                    break;

                case OpCodes.OpCode.MOV221:
                    SetMemory(GetMemory2(p1, GetMemory(p3)), GetMemory(p2));
                    break;

                case OpCodes.OpCode.MOV012:
                    SetMemory(ConstantToArray(p1, GetMemory(GetMemory(p3))), p2);
                    break;

                case OpCodes.OpCode.MOV112:
                    SetMemory(GetMemory(p1, GetMemory(GetMemory(p3))), p2);
                    break;

                case OpCodes.OpCode.MOV212:
                    SetMemory(GetMemory2(p1, GetMemory(GetMemory(p3))), p2);
                    break;

                case OpCodes.OpCode.MOV022:
                    SetMemory(ConstantToArray(p1, GetMemory(GetMemory(p3))), GetMemory(p2));
                    break;

                case OpCodes.OpCode.MOV122:
                    SetMemory(GetMemory(p1, GetMemory(GetMemory(p3))), GetMemory(p2));
                    break;

                case OpCodes.OpCode.MOV222:
                    SetMemory(GetMemory2(p1, GetMemory(GetMemory(p3))), GetMemory(p2));
                    break;

                case OpCodes.OpCode.JMP0:
                    Jump(p1);
                    break;

                case OpCodes.OpCode.JMP1:
                    JumpTo(p1);
                    break;

                case OpCodes.OpCode.JMP2:
                    JumpTo2(p1);
                    break;

                case OpCodes.OpCode.JEQ100:
                    if (GetMemory(p1) == p2)
                    {
                        Jump(p3);
                    }
                    break;

                case OpCodes.OpCode.JEQ110:
                    if (GetMemory(p1) == GetMemory(p2))
                    {
                        Jump(p3);
                    }
                    break;

                case OpCodes.OpCode.JEQ200:
                    if (GetMemory2(p1) == p2)
                    {
                        Jump(p3);
                    }
                    break;

                case OpCodes.OpCode.JEQ210:
                    if (GetMemory2(p1) == GetMemory(p2))
                    {
                        Jump(p3);
                    }
                    break;

                case OpCodes.OpCode.JEQ220:
                    if (GetMemory2(p1) == GetMemory2(p2))
                    {
                        Jump(p3);
                    }
                    break;

                case OpCodes.OpCode.JEQ101:
                    if (GetMemory(p1) == p2)
                    {
                        JumpTo(p3);
                    }
                    break;

                case OpCodes.OpCode.JEQ111:
                    if (GetMemory(p1) == GetMemory(p2))
                    {
                        JumpTo(p3);
                    }
                    break;

                case OpCodes.OpCode.JEQ201:
                    if (GetMemory2(p1) == p2)
                    {
                        JumpTo(p3);
                    }
                    break;

                case OpCodes.OpCode.JEQ211:
                    if (GetMemory2(p1) == GetMemory(p2))
                    {
                        JumpTo(p3);
                    }
                    break;

                case OpCodes.OpCode.JEQ221:
                    if (GetMemory2(p1) == GetMemory2(p2))
                    {
                        JumpTo(p3);
                    }
                    break;

                case OpCodes.OpCode.JEQ102:
                    if (GetMemory(p1) == p2)
                    {
                        JumpTo2(p3);
                    }
                    break;

                case OpCodes.OpCode.JEQ112:
                    if (GetMemory(p1) == GetMemory(p2))
                    {
                        JumpTo2(p3);
                    }
                    break;

                case OpCodes.OpCode.JEQ202:
                    if (GetMemory2(p1) == p2)
                    {
                        JumpTo2(p3);
                    }
                    break;

                case OpCodes.OpCode.JEQ212:
                    if (GetMemory2(p1) == GetMemory(p2))
                    {
                        JumpTo2(p3);
                    }
                    break;

                case OpCodes.OpCode.JEQ222:
                    if (GetMemory2(p1) == GetMemory2(p2))
                    {
                        JumpTo2(p3);
                    }
                    break;

                case OpCodes.OpCode.JNE100:
                    if (GetMemory(p1) != p2)
                    {
                        Jump(p3);
                    }
                    break;

                case OpCodes.OpCode.JNE110:
                    if (GetMemory(p1) != GetMemory(p2))
                    {
                        Jump(p3);
                    }
                    break;

                case OpCodes.OpCode.JNE200:
                    if (GetMemory2(p1) != p2)
                    {
                        Jump(p3);
                    }
                    break;

                case OpCodes.OpCode.JNE210:
                    if (GetMemory2(p1) != GetMemory(p2))
                    {
                        Jump(p3);
                    }
                    break;

                case OpCodes.OpCode.JNE220:
                    if (GetMemory2(p1) != GetMemory2(p2))
                    {
                        Jump(p3);
                    }
                    break;

                case OpCodes.OpCode.JNE101:
                    if (GetMemory(p1) != p2)
                    {
                        JumpTo(p3);
                    }
                    break;

                case OpCodes.OpCode.JNE111:
                    if (GetMemory(p1) != GetMemory(p2))
                    {
                        JumpTo(p3);
                    }
                    break;

                case OpCodes.OpCode.JNE201:
                    if (GetMemory2(p1) != p2)
                    {
                        JumpTo(p3);
                    }
                    break;

                case OpCodes.OpCode.JNE211:
                    if (GetMemory2(p1) != GetMemory(p2))
                    {
                        JumpTo(p3);
                    }
                    break;

                case OpCodes.OpCode.JNE221:
                    if (GetMemory2(p1) != GetMemory2(p2))
                    {
                        JumpTo(p3);
                    }
                    break;

                case OpCodes.OpCode.JNE102:
                    if (GetMemory(p1) != p2)
                    {
                        JumpTo2(p3);
                    }
                    break;

                case OpCodes.OpCode.JNE112:
                    if (GetMemory(p1) != GetMemory(p2))
                    {
                        JumpTo2(p3);
                    }
                    break;

                case OpCodes.OpCode.JNE202:
                    if (GetMemory2(p1) != p2)
                    {
                        JumpTo2(p3);
                    }
                    break;

                case OpCodes.OpCode.JNE212:
                    if (GetMemory2(p1) != GetMemory(p2))
                    {
                        JumpTo2(p3);
                    }
                    break;

                case OpCodes.OpCode.JNE222:
                    if (GetMemory2(p1) != GetMemory2(p2))
                    {
                        JumpTo2(p3);
                    }
                    break;

                case OpCodes.OpCode.JGR010:
                    if (p1 > GetMemory(p2))
                    {
                        Jump(p3);
                    }
                    break;

                case OpCodes.OpCode.JGR100:
                    if (GetMemory(p1) > p2)
                    {
                        Jump(p3);
                    }
                    break;

                case OpCodes.OpCode.JGR110:
                    if (GetMemory(p1) > GetMemory(p2))
                    {
                        Jump(p3);
                    }
                    break;

                case OpCodes.OpCode.JGR120:
                    if (GetMemory(p1) > GetMemory2(p2))
                    {
                        Jump(p3);
                    }
                    break;

                case OpCodes.OpCode.JGR200:
                    if (GetMemory2(p1) > p2)
                    {
                        Jump(p3);
                    }
                    break;

                case OpCodes.OpCode.JGR210:
                    if (GetMemory2(p1) > GetMemory(p2))
                    {
                        Jump(p3);
                    }
                    break;

                case OpCodes.OpCode.JGR220:
                    if (GetMemory2(p1) > GetMemory2(p2))
                    {
                        Jump(p3);
                    }
                    break;

                case OpCodes.OpCode.JGR011:
                    if (p1 > GetMemory(p2))
                    {
                        JumpTo(p3);
                    }
                    break;

                case OpCodes.OpCode.JGR101:
                    if (GetMemory(p1) > p2)
                    {
                        JumpTo(p3);
                    }
                    break;

                case OpCodes.OpCode.JGR111:
                    if (GetMemory(p1) > GetMemory(p2))
                    {
                        JumpTo(p3);
                    }
                    break;

                case OpCodes.OpCode.JGR121:
                    if (GetMemory(p1) > GetMemory2(p2))
                    {
                        JumpTo(p3);
                    }
                    break;

                case OpCodes.OpCode.JGR201:
                    if (GetMemory2(p1) > p2)
                    {
                        JumpTo(p3);
                    }
                    break;

                case OpCodes.OpCode.JGR211:
                    if (GetMemory2(p1) > GetMemory(p2))
                    {
                        JumpTo(p3);
                    }
                    break;

                case OpCodes.OpCode.JGR221:
                    if (GetMemory2(p1) > GetMemory2(p2))
                    {
                        JumpTo(p3);
                    }
                    break;

                case OpCodes.OpCode.JGR012:
                    if (p1 > GetMemory(p2))
                    {
                        JumpTo2(p3);
                    }
                    break;

                case OpCodes.OpCode.JGR102:
                    if (GetMemory(p1) > p2)
                    {
                        JumpTo2(p3);
                    }
                    break;

                case OpCodes.OpCode.JGR112:
                    if (GetMemory(p1) > GetMemory(p2))
                    {
                        JumpTo2(p3);
                    }
                    break;

                case OpCodes.OpCode.JGR122:
                    if (GetMemory(p1) > GetMemory2(p2))
                    {
                        JumpTo2(p3);
                    }
                    break;

                case OpCodes.OpCode.JGR202:
                    if (GetMemory2(p1) > p2)
                    {
                        JumpTo2(p3);
                    }
                    break;

                case OpCodes.OpCode.JGR212:
                    if (GetMemory2(p1) > GetMemory(p2))
                    {
                        JumpTo2(p3);
                    }
                    break;

                case OpCodes.OpCode.JGR222:
                    if (GetMemory2(p1) > GetMemory2(p2))
                    {
                        JumpTo2(p3);
                    }
                    break;

                case OpCodes.OpCode.ADD101:
                    SetMemory((byte)(GetMemory(p1) + p2), p3);
                    break;

                case OpCodes.OpCode.ADD111:
                    SetMemory((byte)(GetMemory(p1) + GetMemory(p2)), p3);
                    break;

                case OpCodes.OpCode.ADD201:
                    SetMemory((byte)(GetMemory2(p1) + p2), p3);
                    break;

                case OpCodes.OpCode.ADD211:
                    SetMemory((byte)(GetMemory2(p1) + GetMemory(p2)), p3);
                    break;

                case OpCodes.OpCode.ADD221:
                    SetMemory((byte)(GetMemory2(p1) + GetMemory2(p2)), p3);
                    break;

                case OpCodes.OpCode.ADD102:
                    SetMemory((byte)(GetMemory(p1) + p2), GetMemory(p3));
                    break;

                case OpCodes.OpCode.ADD112:
                    SetMemory((byte)(GetMemory(p1) + GetMemory(p2)), GetMemory(p3));
                    break;

                case OpCodes.OpCode.ADD202:
                    SetMemory((byte)(GetMemory2(p1) + p2), GetMemory(p3));
                    break;

                case OpCodes.OpCode.ADD212:
                    SetMemory((byte)(GetMemory2(p1) + GetMemory(p2)), GetMemory(p3));
                    break;

                case OpCodes.OpCode.ADD222:
                    SetMemory((byte)(GetMemory2(p1) + GetMemory2(p2)), GetMemory(p3));
                    break;

                case OpCodes.OpCode.SUB011:
                    SetMemory((byte)(p1 - GetMemory(p2)), p3);
                    break;

                case OpCodes.OpCode.SUB101:
                    SetMemory((byte)(GetMemory(p1) - p2), p3);
                    break;

                case OpCodes.OpCode.SUB111:
                    SetMemory((byte)(GetMemory(p1) - GetMemory(p2)), p3);
                    break;

                case OpCodes.OpCode.SUB021:
                    SetMemory((byte)(p1 - GetMemory2(p2)), p3);
                    break;

                case OpCodes.OpCode.SUB201:
                    SetMemory((byte)(GetMemory2(p1) - p2), p3);
                    break;

                case OpCodes.OpCode.SUB211:
                    SetMemory((byte)(GetMemory2(p1) - GetMemory(p2)), p3);
                    break;

                case OpCodes.OpCode.SUB121:
                    SetMemory((byte)(GetMemory(p1) - GetMemory2(p2)), p3);
                    break;

                case OpCodes.OpCode.SUB221:
                    SetMemory((byte)(GetMemory2(p1) - GetMemory2(p2)), p3);
                    break;

                case OpCodes.OpCode.SUB012:
                    SetMemory((byte)(p1 - GetMemory(p2)), GetMemory(p3));
                    break;

                case OpCodes.OpCode.SUB102:
                    SetMemory((byte)(GetMemory(p1) - p2), GetMemory(p3));
                    break;

                case OpCodes.OpCode.SUB112:
                    SetMemory((byte)(GetMemory(p1) - GetMemory(p2)), GetMemory(p3));
                    break;

                case OpCodes.OpCode.SUB022:
                    SetMemory((byte)(p1 - GetMemory2(p2)), GetMemory(p3));
                    break;

                case OpCodes.OpCode.SUB202:
                    SetMemory((byte)(GetMemory2(p1) - p2), GetMemory(p3));
                    break;

                case OpCodes.OpCode.SUB212:
                    SetMemory((byte)(GetMemory2(p1) - GetMemory(p2)), GetMemory(p3));
                    break;

                case OpCodes.OpCode.SUB122:
                    SetMemory((byte)(GetMemory(p1) - GetMemory2(p2)), GetMemory(p3));
                    break;

                case OpCodes.OpCode.SUB222:
                    SetMemory((byte)(GetMemory2(p1) - GetMemory2(p2)), GetMemory(p3));
                    break;

                case OpCodes.OpCode.MUL101:
                    SetMemory((byte)(GetMemory(p1) * p2), p3);
                    break;

                case OpCodes.OpCode.MUL111:
                    SetMemory((byte)(GetMemory(p1) * GetMemory(p2)), p3);
                    break;

                case OpCodes.OpCode.MUL201:
                    SetMemory((byte)(GetMemory2(p1) * p2), p3);
                    break;

                case OpCodes.OpCode.MUL211:
                    SetMemory((byte)(GetMemory2(p1) * GetMemory(p2)), p3);
                    break;

                case OpCodes.OpCode.MUL221:
                    SetMemory((byte)(GetMemory2(p1) * GetMemory2(p2)), p3);
                    break;

                case OpCodes.OpCode.MUL102:
                    SetMemory((byte)(GetMemory(p1) * p2), GetMemory(p3));
                    break;

                case OpCodes.OpCode.MUL112:
                    SetMemory((byte)(GetMemory(p1) * GetMemory(p2)), GetMemory(p3));
                    break;

                case OpCodes.OpCode.MUL202:
                    SetMemory((byte)(GetMemory2(p1) * p2), GetMemory(p3));
                    break;

                case OpCodes.OpCode.MUL212:
                    SetMemory((byte)(GetMemory2(p1) * GetMemory(p2)), GetMemory(p3));
                    break;

                case OpCodes.OpCode.MUL222:
                    SetMemory((byte)(GetMemory2(p1) * GetMemory2(p2)), GetMemory(p3));
                    break;

                case OpCodes.OpCode.DIV011:
                    SetMemory((byte)Divide(p1, GetMemory(p2)), p3);
                    break;

                case OpCodes.OpCode.DIV021:
                    SetMemory((byte)Divide(p1, GetMemory2(p2)), p3);
                    break;

                case OpCodes.OpCode.DIV101:
                    SetMemory((byte)Divide(GetMemory(p1), p2), p3);
                    break;

                case OpCodes.OpCode.DIV111:
                    SetMemory((byte)Divide(GetMemory(p1), GetMemory(p2)), p3);
                    break;

                case OpCodes.OpCode.DIV201:
                    SetMemory((byte)Divide(GetMemory2(p1), p2), p3);
                    break;

                case OpCodes.OpCode.DIV211:
                    SetMemory((byte)Divide(GetMemory2(p1), GetMemory(p2)), p3);
                    break;

                case OpCodes.OpCode.DIV121:
                    SetMemory((byte)Divide(GetMemory(p1), GetMemory2(p2)), p3);
                    break;

                case OpCodes.OpCode.DIV221:
                    SetMemory((byte)Divide(GetMemory2(p1), GetMemory2(p2)), p3);
                    break;

                case OpCodes.OpCode.DIV012:
                    SetMemory((byte)Divide(p1, GetMemory(p2)), GetMemory(p3));
                    break;

                case OpCodes.OpCode.DIV022:
                    SetMemory((byte)Divide(p1, GetMemory2(p2)), GetMemory(p3));
                    break;

                case OpCodes.OpCode.DIV102:
                    SetMemory((byte)Divide(GetMemory(p1), p2), GetMemory(p3));
                    break;

                case OpCodes.OpCode.DIV112:
                    SetMemory((byte)Divide(GetMemory(p1), GetMemory(p2)), GetMemory(p3));
                    break;

                case OpCodes.OpCode.DIV202:
                    SetMemory((byte)Divide(GetMemory2(p1), p2), GetMemory(p3));
                    break;

                case OpCodes.OpCode.DIV212:
                    SetMemory((byte)Divide(GetMemory2(p1), GetMemory(p2)), GetMemory(p3));
                    break;

                case OpCodes.OpCode.DIV122:
                    SetMemory((byte)Divide(GetMemory(p1), GetMemory2(p2)), GetMemory(p3));
                    break;

                case OpCodes.OpCode.DIV222:
                    SetMemory((byte)Divide(GetMemory2(p1), GetMemory2(p2)), GetMemory(p3));
                    break;

                case OpCodes.OpCode.MOD011:
                    SetMemory((byte)Modulo(p1, GetMemory(p2)), p3);
                    break;

                case OpCodes.OpCode.MOD021:
                    SetMemory((byte)Modulo(p1, GetMemory2(p2)), p3);
                    break;

                case OpCodes.OpCode.MOD101:
                    SetMemory((byte)Modulo(GetMemory(p1), p2), p3);
                    break;

                case OpCodes.OpCode.MOD111:
                    SetMemory((byte)Modulo(GetMemory(p1), GetMemory(p2)), p3);
                    break;

                case OpCodes.OpCode.MOD201:
                    SetMemory((byte)Modulo(GetMemory2(p1), p2), p3);
                    break;

                case OpCodes.OpCode.MOD211:
                    SetMemory((byte)Modulo(GetMemory2(p1), GetMemory(p2)), p3);
                    break;

                case OpCodes.OpCode.MOD121:
                    SetMemory((byte)Modulo(GetMemory(p1), GetMemory2(p2)), p3);
                    break;

                case OpCodes.OpCode.MOD221:
                    SetMemory((byte)Modulo(GetMemory2(p1), GetMemory2(p2)), p3);
                    break;

                case OpCodes.OpCode.MOD012:
                    SetMemory((byte)Modulo(p1, GetMemory(p2)), GetMemory(p3));
                    break;

                case OpCodes.OpCode.MOD022:
                    SetMemory((byte)Modulo(p1, GetMemory2(p2)), GetMemory(p3));
                    break;

                case OpCodes.OpCode.MOD102:
                    SetMemory((byte)Modulo(GetMemory(p1), p2), GetMemory(p3));
                    break;

                case OpCodes.OpCode.MOD112:
                    SetMemory((byte)Modulo(GetMemory(p1), GetMemory(p2)), GetMemory(p3));
                    break;

                case OpCodes.OpCode.MOD202:
                    SetMemory((byte)Modulo(GetMemory2(p1), p2), GetMemory(p3));
                    break;

                case OpCodes.OpCode.MOD212:
                    SetMemory((byte)Modulo(GetMemory2(p1), GetMemory(p2)), GetMemory(p3));
                    break;

                case OpCodes.OpCode.MOD122:
                    SetMemory((byte)Modulo(GetMemory(p1), GetMemory2(p2)), GetMemory(p3));
                    break;

                case OpCodes.OpCode.MOD222:
                    SetMemory((byte)Modulo(GetMemory2(p1), GetMemory2(p2)), GetMemory(p3));
                    break;

                case OpCodes.OpCode.INP01:
                    SetMemory(Input(p1), p2);
                    break;

                case OpCodes.OpCode.INP11:
                    SetMemory(Input(GetMemory(p1)), p2);
                    break;

                case OpCodes.OpCode.INP21:
                    SetMemory(Input(GetMemory2(p1)), p2);
                    break;

                case OpCodes.OpCode.INP02:
                    SetMemory(Input(p1), GetMemory(p2));
                    break;

                case OpCodes.OpCode.INP12:
                    SetMemory(Input(GetMemory(p1)), GetMemory(p2));
                    break;

                case OpCodes.OpCode.INP22:
                    SetMemory(Input(GetMemory2(p1)), GetMemory(p2));
                    break;

                case OpCodes.OpCode.OUT00:
                    Output(p1, p2);
                    break;

                case OpCodes.OpCode.OUT10:
                    Output(GetMemory(p1), p2);
                    break;

                case OpCodes.OpCode.OUT20:
                    Output(GetMemory2(p1), p2);
                    break;

                case OpCodes.OpCode.OUT01:
                    Output(p1, GetMemory(p2));
                    break;

                case OpCodes.OpCode.OUT11:
                    Output(GetMemory(p1), GetMemory(p2));
                    break;

                case OpCodes.OpCode.OUT21:
                    Output(GetMemory2(p1), GetMemory(p2));
                    break;

                case OpCodes.OpCode.OUT02:
                    Output(p1, GetMemory2(p2));
                    break;

                case OpCodes.OpCode.OUT12:
                    Output(GetMemory(p1), GetMemory2(p2));
                    break;

                case OpCodes.OpCode.OUT22:
                    Output(GetMemory2(p1), GetMemory2(p2));
                    break;
                }
            }

            if (!m_ExecutionJumpedDuringTick)
            {
                Jump(4);
            }
        }