update return address in label

so return jumps go to the right address
This commit is contained in:
Torsten Ruger 2018-06-10 09:15:57 +03:00
parent c7ad1d98ca
commit 0513cd504f
3 changed files with 22 additions and 8 deletions

View File

@ -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

View File

@ -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

View File

@ -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