srctree

Johan Norberg parent 7ee2b5de 4c63bbae
Translate address in mapped membank to fix mirroring of ppu registers

core/src/mapped_membank.h added: 16, removed: 12, total 4
@@ -19,11 +19,13 @@ public:
: reader_{std::move(reader)}, writer_{std::move(writer)} {}
 
uint8_t read_byte(uint16_t addr) const override {
return reader_(addr);
addr %= Size;
return reader_(StartAddr + addr);
}
 
void write_byte(uint16_t addr, uint8_t byte) override {
writer_(addr, byte);
addr %= Size;
writer_(StartAddr + addr, byte);
}
 
private:
 
core/test/src/test_mmu.cpp added: 16, removed: 12, total 4
@@ -50,17 +50,19 @@ TEST_F(NesMmuTest, read_write_byte) {
}
 
TEST_F(NesMmuTest, read_write_byte_to_ppu) {
const uint8_t byte = 0xAB;
 
EXPECT_CALL(ppu, write_byte(0x2000, 0xAB));
EXPECT_CALL(ppu, read_byte(0x2000)).WillOnce(testing::Return(0xAB));
EXPECT_CALL(ppu, write_byte(0x3000, 0xAB));
EXPECT_CALL(ppu, read_byte(0x3000)).WillOnce(testing::Return(0xAB));
 
mmu->write_byte(0x2000, byte);
EXPECT_EQ(byte, mmu->read_byte(0x2000));
mmu->write_byte(0x3000, byte);
EXPECT_EQ(byte, mmu->read_byte(0x3000));
mmu->write_byte(0x2000, 0xAB);
EXPECT_EQ(0xAB, mmu->read_byte(0x2000));
}
 
TEST_F(NesMmuTest, read_write_byte_to_ppu_mirrored) {
EXPECT_CALL(ppu, write_byte(0x2000, 0xCD));
EXPECT_CALL(ppu, read_byte(0x2000)).WillOnce(testing::Return(0xCD));
 
mmu->write_byte(0x3000, 0xCD);
EXPECT_EQ(0xCD, mmu->read_byte(0x3000));
}
 
TEST_F(NesMmuTest, read_write_byte_io_dev_bank) {