diff --git a/lib/intcode/assembler.ex b/lib/intcode/assembler.ex index b37269d..0e3915c 100644 --- a/lib/intcode/assembler.ex +++ b/lib/intcode/assembler.ex @@ -214,6 +214,11 @@ defmodule Assembler do add #{a}, $#{dest}, #{dest} """ + assemble_macro ["not", src, dest], + """ + sub 1, #{src}, #{dest} + """ + assemble_macro ["cle", a, b, dest], """ clt #{a}, #{b}, #{dest} @@ -225,16 +230,14 @@ defmodule Assembler do assemble_macro ["cgt", a, b, dest], """ - clt #{a}, #{b}, #{dest} - jnz $#{dest}, false - ceq #{a}, #{b}, #{dest} - jnz $#{dest}, false - mov 1, #{dest} - jmp end + cle #{a}, #{b}, #{dest} + not $#{dest}, #{dest} + """ - false: - mov 0, #{dest} - end: + assemble_macro ["cge", a, b, dest], + """ + clt #{a}, #{b}, #{dest} + not $#{dest}, #{dest} """ @doc """ @@ -262,9 +265,9 @@ defmodule Assembler do iex> Assembler.parse_params(["$1", "2", "3"], [:read, :read, :write]) {[1, 2, 3], 1000} iex> Assembler.parse_params(["$label", "2", "3"], [:read, :read, :write]) - {[{:expr, "label"}, 2, 3], 1000} + {[{:expr, ["label"]}, 2, 3], 1000} iex> Assembler.parse_params(["1", "label", "3"], [:read, :read, :write]) - {[1, {:expr, "label"}, 3], 1100} + {[1, {:expr, ["label"]}, 3], 1100} """ def parse_params(params, param_types) do params diff --git a/test/intcode/assembler_test.exs b/test/intcode/assembler_test.exs index 4929dda..1bd3005 100644 --- a/test/intcode/assembler_test.exs +++ b/test/intcode/assembler_test.exs @@ -28,6 +28,31 @@ defmodule AssemblerTest do assert assemble("mov 1, 2") == [1101, 0, 1, 2] assert assemble("jmp 2") == [1105, 1, 2] assert assemble("sub 5, 3, res\nres: 0") == [1102, 3, -1, 8, 101, 5, 8, 8, 0] + assert assemble("not 4, 4") == [1102, 4, -1, 4, 101, 1, 4, 4] + assert assemble("cle 1, 2, res\nres: 0") == [1107, 1, 2, 11, 1005, 11, 11, 1108, 1, 2, 11, 0] + + assert assemble("cgt 1, 2, res\nres: 0") == [ + 1107, + 1, + 2, + 19, + 1005, + 19, + 11, + 1108, + 1, + 2, + 19, + 1002, + 19, + -1, + 19, + 101, + 1, + 19, + 19, + 0 + ] end test "assembles simple program" do