require_relative "get_internal_byte"
require_relative "set_internal_byte"
require_relative "putstring"

module Mom
  module Builtin
    module Word
      module ClassMethods
        include CompileHelper

        # wrapper for the syscall
        # io/file currently hardcoded to stdout
        # set up registers for syscall, ie
        # - pointer in r1
        # - length in r2
        # - emit_syscall (which does the return of an integer, see there)
        def putstring( context)
          compiler = compiler_for(:Word , :putstring ,{})
          compiler.add_code Putstring.new("putstring")
          return compiler
        end
        # self[index] basically. Index is the first arg > 0
        # return a word sized new int, in return_value
        #
        # Note: no index (or type) checking. Method should be internal and check before.
        #       Which means the returned integer could be passed in, instead of allocated.
        def get_internal_byte( context)
          compiler = compiler_for(:Word , :get_internal_byte , {at: :Integer})
          compiler.add_code GetInternalByte.new("get_internal_byte")
          return compiler
        end
        # self[index] = val basically. Index is the first arg ( >0 , unchecked),
        # value the second, which is also returned
        def set_internal_byte( context )
          compiler = compiler_for(:Word, :set_internal_byte , {at: :Integer , value: :Integer} )
          compiler.add_code SetInternalByte.new("set_internal_byte")
          return compiler
        end
      end
      extend ClassMethods
    end
  end
end