diff --git a/src/crab/thumb/long_branch_link.cr b/src/crab/thumb/long_branch_link.cr new file mode 100644 index 0000000..455940b --- /dev/null +++ b/src/crab/thumb/long_branch_link.cr @@ -0,0 +1,13 @@ +module THUMB + def thumb_long_branch_link(instr : Word) : Nil + second_instr = bit?(instr, 11) + offset = bits(instr, 0..10) + if second_instr + @r[14] &+= (offset << 1) + @r[15], @r[14] = @r[14], @r[15] - 1 + clear_pipeline + else + @r[14] = (offset << 12) + @r[15] + end + end +end diff --git a/src/crab/thumb/thumb.cr b/src/crab/thumb/thumb.cr index cceb1d2..4ac6a1d 100644 --- a/src/crab/thumb/thumb.cr +++ b/src/crab/thumb/thumb.cr @@ -7,7 +7,7 @@ module THUMB lut = Slice(Proc(Word, Nil)).new 256, ->thumb_unimplemented(Word) 256.times do |idx| if idx & 0b11110000 == 0b11110000 - # long branch with link + lut[idx] = ->thumb_long_branch_link(Word) elsif idx & 0b11111000 == 0b11100000 # unconditional branch elsif idx & 0b11111111 == 0b11011111