diff --git a/src/crab/thumb/load_store_register_offset.cr b/src/crab/thumb/load_store_register_offset.cr new file mode 100644 index 0000000..f9f8adc --- /dev/null +++ b/src/crab/thumb/load_store_register_offset.cr @@ -0,0 +1,16 @@ +module THUMB + def thumb_load_store_register_offset(instr : Word) : Nil + load_and_byte_quantity = bits(instr, 10..11) + ro = bits(instr, 6..8) + rb = bits(instr, 3..5) + rd = bits(instr, 0..2) + address = @r[rb] &+ @r[ro] + case load_and_byte_quantity + when 0b00 then @gba.bus[address] = @r[rd] + when 0b01 then @gba.bus[address] = 0xFF_u8 & @r[rd] + when 0b10 then @r[rd] = @gba.bus.read_word address + when 0b11 then @r[rd] = 0xFFFFFFFF_u32 & @gba.bus[address] + end + end + end + \ No newline at end of file diff --git a/src/crab/thumb/thumb.cr b/src/crab/thumb/thumb.cr index 9fddb8a..7539323 100644 --- a/src/crab/thumb/thumb.cr +++ b/src/crab/thumb/thumb.cr @@ -31,7 +31,7 @@ module THUMB elsif idx & 0b11110010 == 0b01010010 lut[idx] = ->thumb_load_store_sign_extended(Word) elsif idx & 0b11110010 == 0b01010000 - # load/store with register offset + lut[idx] = ->thumb_load_store_register_offset(Word) elsif idx & 0b11111000 == 0b01001000 lut[idx] = ->thumb_pc_relative_load(Word) elsif idx & 0b11111100 == 0b01000100