// 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); }
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); } }