cpu/thumb: fix multiple load/store

Signed-off-by: Amneesh Singh <natto@weirdnatto.in>
This commit is contained in:
2024-06-19 14:18:37 +05:30
parent 41b625790e
commit f5aa73e7ca
2 changed files with 7 additions and 6 deletions

View File

@@ -499,10 +499,10 @@ Instruction::exec(Cpu& cpu) {
} }
} }
} else { } else {
for (int8_t i = 7; i >= 0; i--) { for (uint8_t i = 0; i < 8; i++) {
if (get_bit(data.regs, i)) { if (get_bit(data.regs, i)) {
rb -= alignment;
cpu.bus->write_word(rb, cpu.gpr[i], sequential); cpu.bus->write_word(rb, cpu.gpr[i], sequential);
rb += alignment;
sequential = true; sequential = true;
} }
} }

View File

@@ -855,18 +855,19 @@ TEST_CASE_METHOD(CpuFixture, "Multiple Load/Store", TAG) {
setr(6, 131313333); setr(6, 131313333);
setr(7, 131); setr(7, 131);
// set R2 (base) to top of stack // base
setr(2, address + alignment * 5); setr(2, address);
exec(data); exec(data);
CHECK(bus->read_word(address) == 237164); CHECK(bus->read_word(address) == 237164);
CHECK(bus->read_word(address + alignment) == address + alignment * 5); CHECK(bus->read_word(address + alignment) == address);
CHECK(bus->read_word(address + alignment * 2) == 905895898); CHECK(bus->read_word(address + alignment * 2) == 905895898);
CHECK(bus->read_word(address + alignment * 3) == 131313333); CHECK(bus->read_word(address + alignment * 3) == 131313333);
CHECK(bus->read_word(address + alignment * 4) == 131); CHECK(bus->read_word(address + alignment * 4) == 131);
// write back // write back
CHECK(getr(2) == address); CHECK(getr(2) == address + alignment * 5);
} }
SECTION("load") { SECTION("load") {