diff --git a/lib/risc/position/instruction_listener.rb b/lib/risc/position/instruction_listener.rb index 2dbc2de5..106fcb61 100644 --- a/lib/risc/position/instruction_listener.rb +++ b/lib/risc/position/instruction_listener.rb @@ -50,8 +50,11 @@ module Risc raise "Invalid negative index #{@index} , #{Position.get(@binary)}" if index < 0 end + # update label positions. All else done in position_changing def position_changed(position) - #code moved to position_changing + instruction = position.object + return unless instruction.is_a?(Label) + instruction.address.set_value(position.at) end # When this is called, only the actual insert has happened (keeping the diff --git a/test/risc/position/test_instruction_listener.rb b/test/risc/position/test_instruction_listener.rb index 45d57f1e..8be17ff9 100644 --- a/test/risc/position/test_instruction_listener.rb +++ b/test/risc/position/test_instruction_listener.rb @@ -10,6 +10,13 @@ module Risc @instruction = DummyInstruction.new(DummyInstruction.new) @position = InstructionListener.init(@instruction , @binary) end + def test_label_address + label = Label.new("hi" ,"ho" , FakeAddress.new(0)) + label_pos = Position.new( label , -1 ) + label_pos.position_listener(InstructionListener.new(@binary)) + label_pos.set(8) + assert_equal 8 , label_pos.object.address.value + end def test_init assert InstructionListener.init(@instruction , @binary) end diff --git a/test/risc/test_interpreter.rb b/test/risc/test_interpreter.rb index 96f630c0..7ab407f8 100644 --- a/test/risc/test_interpreter.rb +++ b/test/risc/test_interpreter.rb @@ -52,7 +52,7 @@ module Risc end def test_pc1 @interpreter.tick - assert_equal 20172 , @interpreter.pc + assert_equal 20344 , @interpreter.pc end def test_tick2 @interpreter.tick @@ -66,22 +66,26 @@ module Risc def test_pc2 @interpreter.tick @interpreter.tick - assert_equal 20176 , @interpreter.pc + assert_equal 20348 , @interpreter.pc end - def pest_tick_14_jump + def test_tick_14_jump 14.times {@interpreter.tick} assert_equal Branch , @interpreter.instruction.class end - def pest_tick_14_bin + def test_tick_14_bin 13.times {@interpreter.tick} binary_pos = binary_position + @interpreter.tick #jump has no listener @interpreter.tick - assert_equal binary_pos , binary_position , "#{binary_pos.to_s(16)}!=#{binary_position.to_s(16)}" + assert binary_pos.at != binary_position.at , "#{binary_pos}!=#{binary_position}" end def binary_position - Position.get(Position.get(@interpreter.instruction).binary).at + pos = Position.get(@interpreter.instruction) + list = pos.event_table[:position_changed].first + assert_equal InstructionListener, list.class + Position.get(list.binary) end - def pest_tick_15 #more than a binary code worth + def test_tick_15 #more than a binary code worth 15.times {@interpreter.tick} end end