diff --git a/sources/CPU/CPU.cpp b/sources/CPU/CPU.cpp index 69420cc..b0ed691 100644 --- a/sources/CPU/CPU.cpp +++ b/sources/CPU/CPU.cpp @@ -227,20 +227,20 @@ namespace ComSquare::CPU uint24_t CPU::_GetImmediateAddr() { - return this->_registers.pc++; + return this->_registers.pac++; } uint24_t CPU::_GetDirectAddr() { - uint8_t addr = this->_bus->read(this->_registers.pc++); + uint8_t addr = this->_bus->read(this->_registers.pac++); return this->_registers.d + addr; } uint24_t CPU::_GetAbsoluteAddr() { uint24_t addr = this->_registers.dbr << 16u; - addr += this->_bus->read(this->_registers.pc++) << 8u; - addr += this->_bus->read(this->_registers.pc++); + addr += this->_bus->read(this->_registers.pac++) << 8u; + addr += this->_bus->read(this->_registers.pac++); return addr; } diff --git a/sources/CPU/CPU.hpp b/sources/CPU/CPU.hpp index 6fd235c..13977a6 100644 --- a/sources/CPU/CPU.hpp +++ b/sources/CPU/CPU.hpp @@ -33,15 +33,21 @@ namespace ComSquare::CPU }; uint16_t d; }; - //! @brief The program banK register; - uint8_t k; - //! @brief The Program Counter; union { struct { - uint8_t pch; - uint8_t pcl; + //! @brief The Program Bank Register; + uint8_t pbr; + //! @brief The Program Counter; + union { + struct { + uint8_t pch; + uint8_t pcl; + }; + uint16_t pc; + }; }; - uint16_t pc; + //! @brief The current Program Address Counter (does not exist in a snes but is useful here). + uint24_t pac; }; //! @brief The Stack pointer union { diff --git a/sources/Cartridge/Cartridge.cpp b/sources/Cartridge/Cartridge.cpp index 4a9b712..9b2bf61 100644 --- a/sources/Cartridge/Cartridge.cpp +++ b/sources/Cartridge/Cartridge.cpp @@ -49,6 +49,7 @@ namespace ComSquare::Cartridge uint8_t Cartridge::read_internal(uint24_t addr) { + std::cout << "Reading a addr: " << std::hex << addr << " romStart: " << std::hex << _romStart << std::endl; if (addr >= this->_size) throw InvalidAddress("Cartridge read", addr); return this->_data[addr + this->_romStart]; diff --git a/sources/Memory/IRectangleMemory.cpp b/sources/Memory/IRectangleMemory.cpp index c9c3ec7..2ecb1b3 100644 --- a/sources/Memory/IRectangleMemory.cpp +++ b/sources/Memory/IRectangleMemory.cpp @@ -2,7 +2,6 @@ // Created by anonymus-raccoon on 1/29/20. // -#include #include "IRectangleMemory.hpp" #include "../Exceptions/InvalidAddress.hpp" diff --git a/sources/Memory/MemoryBus.cpp b/sources/Memory/MemoryBus.cpp index 0b8e602..ba26e3d 100644 --- a/sources/Memory/MemoryBus.cpp +++ b/sources/Memory/MemoryBus.cpp @@ -15,7 +15,6 @@ namespace ComSquare::Memory { auto it = std::find_if(this->_memoryAccessors.begin(), this->_memoryAccessors.end(), [addr](std::shared_ptr &accessor) { -// std::cout << "Accessor: " << std::hex << accessor->getStart() << " Has access:: " << accessor->hasMemoryAt(addr) << std::endl; return accessor->hasMemoryAt(addr); }); if (it == this->_memoryAccessors.end()) diff --git a/tests/CPU/testAddressingMode.cpp b/tests/CPU/testAddressingMode.cpp index 696b0af..dd726c8 100644 --- a/tests/CPU/testAddressingMode.cpp +++ b/tests/CPU/testAddressingMode.cpp @@ -12,7 +12,25 @@ using namespace ComSquare; Test(AddrMode, Immediate) { auto pair = Init(); - pair.second.cpu->_registers.pc = 0x15; - cr_assert_eq(pair.second.cpu->_GetImmediateAddr(), 0x15); - cr_assert_eq(pair.second.cpu->_registers.pc, 0x16); + pair.second.cpu->_registers.pac = 0x000015; + cr_assert_eq(pair.second.cpu->_GetImmediateAddr(), 0x000015, "Got %i, Expected 0x000015"); + cr_assert_eq(pair.second.cpu->_registers.pac, 0x000016); +} + +Test(AddrMode, ImmediateBankChange) +{ + auto pair = Init(); + pair.second.cpu->_registers.pac = 0x00FFFF; + cr_assert_eq(pair.second.cpu->_GetImmediateAddr(), 0x00FFFF); + cr_assert_eq(pair.second.cpu->_registers.pac, 0x010000); +} + +Test(AddrMode, Direct) +{ + auto pair = Init(); + 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."); + 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 9adc07b..49805be 100644 --- a/tests/testMemoryBus.cpp +++ b/tests/testMemoryBus.cpp @@ -287,6 +287,16 @@ Test(BusRead, ReadROM) cr_assert_eq(data, 123); } +Test(BusRead, ReadROMStart) +{ + auto pair = Init(); + uint8_t data; + + pair.second.cartridge->_data[0] = 123; + data = pair.first.read(0x808000); + cr_assert_eq(data, 123); +} + Test(BusRead, ReadCPU) { auto pair = Init(); diff --git a/tests/tests.cpp b/tests/tests.cpp index 395f61d..2debbca 100644 --- a/tests/tests.cpp +++ b/tests/tests.cpp @@ -14,7 +14,7 @@ std::pair Init() Memory::MemoryBus bus; Renderer::NoRenderer norenderer(0, 0, 0); SNES snes(std::make_shared(bus), "", norenderer); - snes.cartridge->_size = 10; + snes.cartridge->_size = 100; snes.cartridge->_data = new uint8_t[snes.cartridge->_size]; snes.cartridge->header.mappingMode = Cartridge::LoRom; snes.sram->_size = 10;