module Risc
  class InterpreterPlatform < Platform
    def translator
      IdentityTranslator.new
    end
    def loaded_at
      0x90
    end
    def padding
      0x100 - loaded_at
    end
    def num_registers
      16
    end
  end
  class Instruction
    def nil_next
      @next = nil
      self
    end
    def byte_length
      4
    end
    def assemble(io)
      pos = Position.get(self).at
      io.write_unsigned_int_32(pos)
    end
    class Branch < Instruction
      def first #some logging assumes arm
        self
      end
    end
  end
  class IdentityTranslator
    def translate(code)
      case code
      when Branch
        new_label = code.label.is_a?(Label) ? code.label.to_cpu(self) : code.label
        ret = code.class.new(code.source , new_label)
      when LoadConstant
        const = code.constant
        const = const.to_cpu(self) if const.is_a?(Label)
        ret = LoadConstant.new(code.source , const , code.register)
      else
        ret = code.dup
      end
      ret.nil_next
      ret
    end
  end
end