diff --git a/sources/CPU/CPU.cpp b/sources/CPU/CPU.cpp index d99f73e..155da3f 100644 --- a/sources/CPU/CPU.cpp +++ b/sources/CPU/CPU.cpp @@ -256,9 +256,7 @@ namespace ComSquare::CPU uint24_t CPU::_getDirectIndirectIndexedAddr() { uint16_t dp = this->_bus->read(this->_registers.pac++) + this->_registers.d; - std::cout << "DP: " << std::hex << dp << std::endl; uint24_t base = this->_bus->read(dp); - std::cout << "Base: " << std::hex << base << std::endl; base += this->_bus->read(dp + 1) << 8u; base += this->_registers.dbr << 16u; return base + this->_registers.y; diff --git a/sources/Memory/IRectangleMemory.cpp b/sources/Memory/IRectangleMemory.cpp index 2ecb1b3..df5e7ef 100644 --- a/sources/Memory/IRectangleMemory.cpp +++ b/sources/Memory/IRectangleMemory.cpp @@ -2,6 +2,7 @@ // Created by anonymus-raccoon on 1/29/20. // +#include #include "IRectangleMemory.hpp" #include "../Exceptions/InvalidAddress.hpp" @@ -14,9 +15,9 @@ namespace ComSquare::Memory unsigned bankCount = bank - this->_startBank; unsigned pageCount = this->_endPage - this->_startPage; - if (bank < this->_startBank || bank >= this->_endBank) + if (bank < this->_startBank || bank > this->_endBank) throw InvalidAddress("Rectangle memory read Invalid Bank", addr); - if (page < this->_startPage || page >= this->_endPage) + if (page < this->_startPage || page > this->_endPage) throw InvalidAddress("Rectangle memory read Invalid Page", addr); page -= this->_startPage; page += pageCount * bankCount; diff --git a/sources/Memory/MemoryBus.cpp b/sources/Memory/MemoryBus.cpp index ba26e3d..bb9229f 100644 --- a/sources/Memory/MemoryBus.cpp +++ b/sources/Memory/MemoryBus.cpp @@ -46,12 +46,12 @@ namespace ComSquare::Memory handler->write(addr - handler->getStart(), data); } - void MemoryBus::_mirrorComponents(SNES &console, int i) + void MemoryBus::_mirrorComponents(SNES &console, unsigned i) { - this->_memoryAccessors.emplace_back(new Memory::MemoryShadow(console.wram, i, i + 0x1FFF)); - this->_memoryAccessors.emplace_back(new Memory::MemoryShadow(console.ppu, i + 0x2100, i + 0x213F)); - this->_memoryAccessors.emplace_back(new Memory::MemoryShadow(console.apu, i + 0x2140, i + 0x2143)); - this->_memoryAccessors.emplace_back(new Memory::MemoryShadow(console.cpu, i + 0x4200, i + 0x421F)); + this->_memoryAccessors.emplace_back(new Memory::RectangleShadow(console.wram, i, i, 0x0000, 0x1FFF)); + this->_memoryAccessors.emplace_back(new Memory::MemoryShadow(console.ppu, (i << 16u) + 0x2100, (i << 16u) + 0x213F)); + this->_memoryAccessors.emplace_back(new Memory::MemoryShadow(console.apu, (i << 16u) + 0x2140, (i << 16u) + 0x2143)); + this->_memoryAccessors.emplace_back(new Memory::MemoryShadow(console.cpu, (i << 16u) + 0x4200, (i << 16u) + 0x421F)); } void MemoryBus::mapComponents(SNES &console) @@ -73,10 +73,10 @@ namespace ComSquare::Memory // TODO implement Joys. // Mirror to the quarter 1. - for (uint24_t i = 0; i < 0x400000; i += 0x010000) + for (uint8_t i = 0x00; i < 0x40; i += 0x01) this->_mirrorComponents(console, i); // Mirror to the quarter 3. - for (uint24_t i = 0x800000; i < 0xC00000; i += 0x10000) + for (uint8_t i = 0x80; i < 0xC0; i += 0x01) this->_mirrorComponents(console, i); if (console.cartridge->header.mappingMode & Cartridge::LoRom) { diff --git a/sources/Memory/MemoryBus.hpp b/sources/Memory/MemoryBus.hpp index e2af811..b7689eb 100644 --- a/sources/Memory/MemoryBus.hpp +++ b/sources/Memory/MemoryBus.hpp @@ -33,7 +33,7 @@ namespace ComSquare //! @brief WRam, CPU, PPU & APU registers are mirrored to all banks of Q1 & Q3. This function is used for the mirroring. //! @param console All the components. //! @param i Base address for the mirrors. - inline void _mirrorComponents(SNES &console, int i); + inline void _mirrorComponents(SNES &console, unsigned i); public: //! @brief Read data at a global address. diff --git a/sources/Memory/RectangleShadow.cpp b/sources/Memory/RectangleShadow.cpp index 2da6c26..f336848 100644 --- a/sources/Memory/RectangleShadow.cpp +++ b/sources/Memory/RectangleShadow.cpp @@ -5,6 +5,7 @@ #include "RectangleShadow.hpp" #include +#include namespace ComSquare::Memory { diff --git a/tests/CPU/testAddressingMode.cpp b/tests/CPU/testAddressingMode.cpp index 8f63664..d385bfb 100644 --- a/tests/CPU/testAddressingMode.cpp +++ b/tests/CPU/testAddressingMode.cpp @@ -20,7 +20,7 @@ Test(AddrMode, Immediate) { auto pair = Init(); pair.second.cpu->_registers.pac = 0x000015; - cr_assert_eq(pair.second.cpu->_getImmediateAddr(), 0x000015, "Got %i, Expected 0x000015"); + cr_assert_eq(pair.second.cpu->_getImmediateAddr(), 0x000015, "Got %x, Expected 0x000015"); cr_assert_eq(pair.second.cpu->_registers.pac, 0x000016); } @@ -38,7 +38,7 @@ Test(AddrMode, Direct) pair.second.cartridge->_data[0] = 0x15; pair.second.cpu->_registers.pac = 0x808000; pair.second.cpu->_registers.d = 0x1000; - cr_assert_eq(pair.second.cpu->_getDirectAddr(), 0x1015, "Returned address was %i but was expecting 0x1015.", pair.second.cpu->_getDirectAddr()); + cr_assert_eq(pair.second.cpu->_getDirectAddr(), 0x1015, "Returned address was %x but was expecting 0x1015.", pair.second.cpu->_getDirectAddr()); cr_assert_eq(pair.second.cpu->_registers.pac, 0x808001); } @@ -49,7 +49,7 @@ Test(AddrMode, Absolute) pair.second.cartridge->_data[1] = 0x90; pair.second.cpu->_registers.pac = 0x808000; pair.second.cpu->_registers.dbr = 0x88; - cr_assert_eq(pair.second.cpu->_getAbsoluteAddr(), 0x88901C, "Returned address was %i but was expecting 0x88901C.", pair.second.cpu->_getAbsoluteAddr()); + cr_assert_eq(pair.second.cpu->_getAbsoluteAddr(), 0x88901C, "Returned address was %x but was expecting 0x88901C.", pair.second.cpu->_getAbsoluteAddr()); cr_assert_eq(pair.second.cpu->_registers.pac, 0x808002); } @@ -61,7 +61,7 @@ Test(AddrMode, AbsoluteLong) pair.second.cartridge->_data[2] = 0xFF; pair.second.cpu->_registers.pac = 0x808000; pair.second.cpu->_registers.dbr = 0x88; - cr_assert_eq(pair.second.cpu->_getAbsoluteLongAddr(), 0xFF901C, "Returned address was %i but was expecting 0xFF901C.", pair.second.cpu->_getAbsoluteLongAddr()); + cr_assert_eq(pair.second.cpu->_getAbsoluteLongAddr(), 0xFF901C, "Returned address was %x but was expecting 0xFF901C.", pair.second.cpu->_getAbsoluteLongAddr()); cr_assert_eq(pair.second.cpu->_registers.pac, 0x808003); } @@ -69,12 +69,12 @@ Test(AddrMode, DirectIndirectIndexed) { auto pair = Init(); pair.second.cartridge->_data[0] = 0x10; - pair.second.wram->_data[0x1000] = 0x30; - pair.second.wram->_data[0x1001] = 0x40; + pair.second.wram->_data[0x1010] = 0x30; + pair.second.wram->_data[0x1011] = 0x40; pair.second.cpu->_registers.pac = 0x808000; pair.second.cpu->_registers.dbr = 0x80; pair.second.cpu->_registers.y = 0x0001; pair.second.cpu->_registers.d = 0x1000; - cr_assert_eq(pair.second.cpu->_getDirectIndirectIndexedAddr(), 0x804031, "Returned address was %i but was expecting 0x804031.", pair.second.cpu->_getDirectIndirectIndexedAddr()); + cr_assert_eq(pair.second.cpu->_getDirectIndirectIndexedAddr(), 0x804031, "Returned address was %x but was expecting 0x804031.", pair.second.cpu->_getDirectIndirectIndexedAddr()); cr_assert_eq(pair.second.cpu->_registers.pac, 0x808001); } \ No newline at end of file diff --git a/tests/testMemoryBus.cpp b/tests/testMemoryBus.cpp index cf7dc38..ed9488d 100644 --- a/tests/testMemoryBus.cpp +++ b/tests/testMemoryBus.cpp @@ -45,9 +45,30 @@ Test(BusAccessor, GetWramEnd) Test(BusAccessor, GetWramMirror) { auto pair = Init(); - std::shared_ptr accessor = nullptr; + std::shared_ptr accessor = nullptr; - accessor = std::static_pointer_cast(pair.first->getAccessor(0x2F11FF)); + accessor = std::static_pointer_cast(pair.first->getAccessor(0x2F11FF)); + cr_assert_neq(accessor, nullptr); + cr_assert_eq(accessor->_initial.get(), pair.second.wram.get()); +} + +Test(BusAccessor, GetWramMirror2) +{ + auto pair = Init(); + std::shared_ptr accessor = nullptr; + + accessor = std::static_pointer_cast(pair.first->getAccessor(0x100000)); + cr_assert_neq(accessor, nullptr); + cr_assert_eq(accessor->_initial.get(), pair.second.wram.get()); +} + +Test(BusAccessor, GetWramMirror3) +{ + auto pair = Init(); + std::shared_ptr accessor = nullptr; + + accessor = std::static_pointer_cast(pair.first->getAccessor(0x1010)); + cr_assert_neq(accessor, nullptr); cr_assert_eq(accessor->_initial.get(), pair.second.wram.get()); } @@ -123,6 +144,15 @@ Test(BusAccessor, GetAPUMirror) cr_assert_eq(accessor->_initial.get(), pair.second.apu.get()); } +Test(BusAccessor, GetAPUMirrorFirstHalf) +{ + auto pair = Init(); + std::shared_ptr accessor = nullptr; + + accessor = std::static_pointer_cast(pair.first->getAccessor(0x052143)); + cr_assert_eq(accessor->_initial.get(), pair.second.apu.get()); +} + Test(BusAccessor, GetCPUStart) { auto pair = Init(); @@ -337,6 +367,27 @@ Test(BusRead, ReadWRAM) cr_assert_eq(data, 123); } +Test(BusRead, ReadWRAM2) +{ + auto pair = Init(); + uint8_t data; + + pair.second.wram->_data[0x1010] = 123; + data = pair.first->read(0x7E1010); + cr_assert_eq(data, 123); +} + + +Test(BusRead, ReadWRAMMirror) +{ + auto pair = Init(); + uint8_t data; + + pair.second.wram->_data[0x1010] = 123; + data = pair.first->read(0x1010); + cr_assert_eq(data, 123); +} + //////////////////////////// // // // MemoryBus::write tests //