mirror of
https://github.com/mattrberry/crab.git
synced 2025-02-05 08:45:50 +01:00
arm block data transfer
This commit is contained in:
parent
e29bde0bcf
commit
705113eae2
2 changed files with 35 additions and 1 deletions
|
@ -31,7 +31,7 @@ module ARM
|
||||||
elsif idx & 0b111000000000 == 0b101000000000
|
elsif idx & 0b111000000000 == 0b101000000000
|
||||||
lut[idx] = ->arm_branch(Word)
|
lut[idx] = ->arm_branch(Word)
|
||||||
elsif idx & 0b111000000000 == 0b100000000000
|
elsif idx & 0b111000000000 == 0b100000000000
|
||||||
# block data transfer
|
lut[idx] = ->arm_block_data_transfer(Word)
|
||||||
elsif idx & 0b111000000001 == 0b011000000001
|
elsif idx & 0b111000000001 == 0b011000000001
|
||||||
# undefined
|
# undefined
|
||||||
elsif idx & 0b110000000000 == 0b010000000000
|
elsif idx & 0b110000000000 == 0b010000000000
|
||||||
|
|
34
src/crab/arm/block_data_transfer.cr
Normal file
34
src/crab/arm/block_data_transfer.cr
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
module ARM
|
||||||
|
def arm_block_data_transfer(instr : Word) : Nil
|
||||||
|
pre_index = bit?(instr, 24)
|
||||||
|
add = bit?(instr, 23)
|
||||||
|
s_bit = bit?(instr, 22) # todo respect this bit
|
||||||
|
write_back = bit?(instr, 21)
|
||||||
|
load = bit?(instr, 20)
|
||||||
|
rn = bits(instr, 16..19)
|
||||||
|
list = bits(instr, 0..15)
|
||||||
|
|
||||||
|
address = @r[rn]
|
||||||
|
|
||||||
|
if load
|
||||||
|
16.times do |idx|
|
||||||
|
if bit?(list, idx)
|
||||||
|
address &+= add ? 4 : -4 if pre_index
|
||||||
|
@r[idx] = @gba.bus.read_word(address)
|
||||||
|
address &+= add ? 4 : -4 unless pre_index
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
16.times do |idx|
|
||||||
|
if bit?(list, idx)
|
||||||
|
address &+= add ? 4 : -4 if pre_index
|
||||||
|
@gba.bus[address] = @r[idx]
|
||||||
|
address &+= add ? 4 : -4 unless pre_index
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@r[rn] = address if write_back
|
||||||
|
# todo reset pipeline if r15 is written (this needs to be done in all other instrs that write to r15 as well)
|
||||||
|
end
|
||||||
|
end
|
Loading…
Add table
Reference in a new issue