diff --git a/lib/arm/constants.rb b/lib/arm/constants.rb index a2e2fa8c..58ca65f9 100644 --- a/lib/arm/constants.rb +++ b/lib/arm/constants.rb @@ -92,6 +92,7 @@ module Arm #slighly wrong place for this code, but since the module gets included in instructions anyway . . . # implement the barrel shifter on the operand (which is set up before as an integer) def shift_handling + op = 0 #codes that one can shift, first two probably most common. # l (in lsr) means logical, ie unsigned, a (in asr) is arithmetic, ie signed {'lsl' => 0b000, 'lsr' => 0b010, 'asr' => 0b100, 'ror' => 0b110, 'rrx' => 0b110}.each do |short, bin| @@ -104,11 +105,12 @@ module Arm shift = shif.register << 1 end raise "0 < shift <= 32 #{shif} #{inspect}" if (shif >= 32) or( shif < 0) - @operand |= shift(bin , 4 ) - @operand |= shift(shif , 4+3) + op |= shift(bin , 4 ) + op |= shift(shif , 4+3) break end end + return op end end end \ No newline at end of file diff --git a/lib/arm/logic_instruction.rb b/lib/arm/logic_instruction.rb index b6006c1a..2151dc10 100644 --- a/lib/arm/logic_instruction.rb +++ b/lib/arm/logic_instruction.rb @@ -49,13 +49,14 @@ module Arm else raise "invalid operand argument #{right.inspect} , #{inspect}" end - shift_handling end def assemble(io) build + op = shift_handling instuction_class = 0b00 # OPC_DATA_PROCESSING val = shift(@operand , 0) + val |= shift(op , 0) # any barral action, is already shifted val |= shift(reg_code(@result) , 12) val |= shift(reg_code(@left) , 12+4) val |= shift(@attributes[:update_status] , 12+4+4)#20 diff --git a/lib/arm/move_instruction.rb b/lib/arm/move_instruction.rb index c1a4d033..bbc3319b 100644 --- a/lib/arm/move_instruction.rb +++ b/lib/arm/move_instruction.rb @@ -52,13 +52,14 @@ module Arm else raise "invalid operand argument #{right.inspect} , #{inspect}" end - shift_handling end def assemble(io) build + op = shift_handling instuction_class = 0b00 # OPC_DATA_PROCESSING val = shift(@operand , 0) + val |= shift(op , 0) # any barral action, is already shifted val |= shift(reg_code(@to) , 12) val |= shift(reg_code(@rn) , 12+4) val |= shift(@attributes[:update_status] , 12+4+4)#20