From e4a79aac50cad329c9f73a79095cef0b9e408e92 Mon Sep 17 00:00:00 2001 From: Torsten Date: Tue, 17 Mar 2020 10:37:35 +0200 Subject: [PATCH] reset flags in interpreter fix at least part of the problem why comparisons dont work --- lib/risc/interpreter.rb | 11 ++++++++--- test/support/risc_interpreter.rb | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/risc/interpreter.rb b/lib/risc/interpreter.rb index 64adffdd..0bf91f2e 100644 --- a/lib/risc/interpreter.rb +++ b/lib/risc/interpreter.rb @@ -27,8 +27,7 @@ module Risc def initialize( linker , stdout = "") @stdout , @clock , @pc , @state = stdout, 0 , 0 , :stopped @registers = {} - @flags = { :zero => false , :plus => false , - :minus => false , :overflow => false } + reset_flags (0...InterpreterPlatform.new.num_registers).each do |reg| #set_register "r#{reg}".to_sym , "r#{reg}:unknown" end @@ -48,6 +47,12 @@ module Risc trigger(:state_changed , old , state ) end + # set all flags to false + def reset_flags + @flags = { :zero => false , :plus => false , + :minus => false , :overflow => false } + end + def set_pc( pos ) raise "Not int #{pos}" unless pos.is_a? Numeric position = Position.at(pos) @@ -278,10 +283,10 @@ module Risc end def execute_OperatorInstruction + reset_flags left = get_register(@instruction.left) || 0 rr = @instruction.right right = get_register(rr) || 0 - @flags[:overflow] = false result = handle_operator(left,right) if( result > 2**32 ) @flags[:overflow] = true diff --git a/test/support/risc_interpreter.rb b/test/support/risc_interpreter.rb index 80f2b0d0..562ddb74 100644 --- a/test/support/risc_interpreter.rb +++ b/test/support/risc_interpreter.rb @@ -98,7 +98,7 @@ module Risc # get the return from the message (not exit code) # exit code must be int def get_message_return - @interpreter.get_register(:r8).return_value + @interpreter.get_register(:message).return_value end # wrap the input so it is a main, compile and run it