diff --git a/app/register_view.rb b/app/register_view.rb index d72c389..8dbad70 100644 --- a/app/register_view.rb +++ b/app/register_view.rb @@ -2,10 +2,20 @@ class RegisterView include React::Component required_param :interpreter + define_state :registers + + before_mount do + interpreter.register_event(:register_changed, self) + registers! interpreter.registers + end + + def register_changed reg , old , bl + registers! interpreter.registers + end def render div :class => :row do - interpreter.registers.each do |r , has| + registers.each do |r , has| div :class => "col-md-1" do "#{r} : #{has}" end diff --git a/lib/interpreter.rb b/lib/interpreter.rb index da6f92a..9b375c2 100644 --- a/lib/interpreter.rb +++ b/lib/interpreter.rb @@ -12,22 +12,40 @@ class Interpreter @registers = Hash[(0...12).collect{|i| ["r#{i}" , "undefined"]}] end - def start block - set_block block + def start bl + set_block bl end - def set_block block - return if @block == block + + def set_block bl + return if @block == bl + raise "Error, nil block" unless bl old = @block - @block = block - trigger(:block_changed , old , block) - set_instruction block.codes.first + @block = bl + trigger(:block_changed , old , bl) + set_instruction bl.codes.first end + def set_instruction i return if @instruction == i + raise "Error, nil instruction" unless i old = @instruction @instruction = i trigger(:instruction_changed, old , i) end + + def get_register( reg ) + reg = reg.symbol if reg.is_a? Register::RegisterReference + raise "Not a register #{reg}" unless Register::RegisterReference.look_like_reg(reg) + @registers[reg] + end + + def set_register reg , val + old = get_register( reg ) # also ensures format + return if old === val + @registers[reg] = val + trigger(:register_changed, reg , old , val) + end + def tick name = @instruction.class.name.split("::").last fetch = send "execute_#{name}" @@ -40,4 +58,10 @@ class Interpreter set_block target false end + def execute_LoadConstant + to = @instruction.register + value = @instruction.constant.object_id + set_register( to , value ) + true + end end