start on new binary creation process

now writing into BinaryCode instead of stream
also in the risc layer, not arm, for reusability
This commit is contained in:
Torsten Ruger 2018-03-27 20:47:41 +03:00
parent 2e57674008
commit 500851d246
4 changed files with 50 additions and 3 deletions

34
lib/risc/binary_writer.rb Normal file
View File

@ -0,0 +1,34 @@
module Risc
# Little glue class to get the assembled binary from the Arm Instructions into
# the BinaryCode instances. Arm code originally uses io, but slightly modified
# really only uses write_unsigned_int_32 , which converts
# to an set_internal_word on the BinaryCode
#
# Machine instantiates and the writer reads from the arm Instructions
# and writes to the BinaryCode
class BinaryWriter
def initialize( code )
@code = code
end
# write into the given BinaryCode instance
def assemble( instruction )
@index = 1
while(instruction)
begin
instruction.assemble(self)
rescue LinkException
instruction.assemble(self)
end
instruction = instruction.next
puts "Next #{instruction.to_s}"
end
end
def write_unsigned_int_32( bin )
@code.set_word( @index , bin )
@index += 1
end
end
end

View File

@ -1,4 +1,5 @@
require_relative "collector"
require_relative "binary_writer"
module Risc
# The Risc Machine is an abstraction of the register level. This is seperate from the
@ -93,6 +94,15 @@ module Risc
at
end
def create_binary
objects.each do |id , method|
next unless method.is_a? Parfait::TypedMethod
puts "CODE1 #{method.name}:#{}"
writer = BinaryWriter.new(method.binary)
writer.assemble(method.cpu_instructions)
end
end
def boot
initialize
@objects = nil

View File

@ -28,8 +28,9 @@ module Risc
assert @assembler.assemble
end
def test_write_space
@assembler = Assembler.new(@machine , Collector.collect_space)
assert @machine.translate_arm
assert @machine.position_all
@assembler = Assembler.new(@machine , Collector.collect_space)
#assert @assembler.write_as_string
end
end

View File

@ -6,13 +6,11 @@ module Risc
def setup
@machine = Risc.machine.boot
end
def test_objects
objects = @machine.objects
assert_equal Hash , objects.class
assert 350 < objects.length
end
def test_position_length
@machine.position_all
objects = @machine.objects
@ -25,5 +23,9 @@ module Risc
assert Positioned.position(obj)
end
end
def test_binary
@machine.position_all
@machine.create_binary
end
end
end