diff options
author | Nat Lasseter <user@4574.co.uk> | 2019-12-11 21:53:12 +0000 |
---|---|---|
committer | Nat Lasseter <user@4574.co.uk> | 2019-12-11 21:53:12 +0000 |
commit | 693130cae9bdb145af79ee2eb256b661003b6e45 (patch) | |
tree | fc4a450b012545c0f5599c667426d44451fbf71d /intcode/das | |
parent | 3bea5ec1373b842e6ad9f7cff050615e1f5ebde8 (diff) |
Wrote Intcode (dis-)assembler
Diffstat (limited to 'intcode/das')
-rwxr-xr-x | intcode/das | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/intcode/das b/intcode/das new file mode 100755 index 0000000..c84d9a0 --- /dev/null +++ b/intcode/das @@ -0,0 +1,77 @@ +#!/usr/bin/env ruby + +class Program + def initialize(program) + @mem = program + @pc = 0 + end + + def dis_next + opcode = @mem[@pc] % 100 + + p3, p2, p1 = ("%03d" % (@mem[@pc] / 100)).chars + + print "#{@pc}: " + case opcode + when 1 + puts "add #{Program.sigil(p1)}#{@mem[@pc+1]}, #{Program.sigil(p2)}#{@mem[@pc+2]}, #{Program.sigil(p3)}#{@mem[@pc+3]}" + @pc += 4 + when 2 + puts "mul #{Program.sigil(p1)}#{@mem[@pc+1]}, #{Program.sigil(p2)}#{@mem[@pc+2]}, #{Program.sigil(p3)}#{@mem[@pc+3]}" + @pc += 4 + when 3 + puts "inp #{Program.sigil(p1)}#{@mem[@pc+1]}" + @pc += 2 + when 4 + puts "out #{Program.sigil(p1)}#{@mem[@pc+1]}" + @pc += 2 + when 5 + puts "jnz #{Program.sigil(p1)}#{@mem[@pc+1]}, #{Program.sigil(p2)}#{@mem[@pc+2]}" + @pc += 3 + when 6 + puts "jez #{Program.sigil(p1)}#{@mem[@pc+1]}, #{Program.sigil(p2)}#{@mem[@pc+2]}" + @pc += 3 + when 7 + puts "tlt #{Program.sigil(p1)}#{@mem[@pc+1]}, #{Program.sigil(p2)}#{@mem[@pc+2]}, #{Program.sigil(p3)}#{@mem[@pc+3]}" + @pc += 4 + when 8 + puts "teq #{Program.sigil(p1)}#{@mem[@pc+1]}, #{Program.sigil(p2)}#{@mem[@pc+2]}, #{Program.sigil(p3)}#{@mem[@pc+3]}" + @pc += 4 + when 9 + puts "arb #{Program.sigil(p1)}#{@mem[@pc+1]}" + @pc += 2 + when 99 + puts "hlt" + @pc += 1 + else + puts "@dat #{@mem[@pc]}" + @pc += 1 + end + end + + def dis_all + until @pc >= @mem.length do + dis_next + end + end + + private + + def self.sigil(p) + case p + when "0" + "@" + when "2" + "&" + end + end +end + +exit 1 if ARGV.length != 1 + +source = ARGV.shift.strip + +input = File.readlines(source)[0].strip.split(",").map(&:to_i) + +p = Program.new(input) +p.dis_all |