diff --git a/emu/src/cpu/thumb/operations.rs b/emu/src/cpu/thumb/operations.rs index a0d7da0..0bfb6d3 100644 --- a/emu/src/cpu/thumb/operations.rs +++ b/emu/src/cpu/thumb/operations.rs @@ -500,6 +500,8 @@ impl Arm7tdmi { match load_store { LoadStoreKind::Store => { + let mut first_written = false; + for r in 0..=15 { if register_list.is_bit_on(r) { let value = self.registers.register_at(r as usize) @@ -508,8 +510,17 @@ impl Arm7tdmi { thumb::operations::SIZE_OF_INSTRUCTION } else { 0 + } + // If we store the base register as second register (or later) we store + // the updated value as if it was already written back. + + if first_written && r as usize == base_register { + register_count * 4 + } else { + 0 }; + first_written = true; + self.bus.write_word(address as usize, value); address += 4;