From 02760c469da68104e3096cafc63c546d7107b2c1 Mon Sep 17 00:00:00 2001
From: AnonymusRaccoon
Date: Tue, 11 Feb 2020 10:57:35 +0100
Subject: [PATCH] Solving bugs with the rectangle shadow
---
sources/CPU/CPU.cpp | 2 --
sources/Memory/IRectangleMemory.cpp | 5 +--
sources/Memory/MemoryBus.cpp | 14 ++++----
sources/Memory/MemoryBus.hpp | 2 +-
sources/Memory/RectangleShadow.cpp | 1 +
tests/CPU/testAddressingMode.cpp | 14 ++++----
tests/testMemoryBus.cpp | 55 +++++++++++++++++++++++++++--
7 files changed, 72 insertions(+), 21 deletions(-)
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 //