Fixing a bug with the write in 0x0

This commit is contained in:
AnonymusRaccoon
2020-02-13 11:09:18 +01:00
parent b1a2222b55
commit a6c3e54f9f
11 changed files with 96 additions and 9 deletions
+1 -1
View File
@@ -52,7 +52,7 @@ add_executable(unit_tests
sources/CPU/Instructions/CommonInstructions.hpp sources/CPU/Instructions/CommonInstructions.hpp
sources/Exceptions/InvalidOpcode.hpp sources/Exceptions/InvalidOpcode.hpp
sources/CPU/Instructions/Interrupts.cpp sources/CPU/Instructions/Interrupts.cpp
sources/CPU/Instructions/MathematicalOperations.cpp tests/CPU/Math/testADC.cpp) sources/CPU/Instructions/MathematicalOperations.cpp tests/CPU/Math/testADC.cpp tests/CPU/testStore.cpp)
# include criterion & coverage # include criterion & coverage
target_link_libraries(unit_tests criterion -lgcov) target_link_libraries(unit_tests criterion -lgcov)
+11
View File
@@ -441,4 +441,15 @@ namespace ComSquare::CPU
base += this->_registers.dbr << 16u; base += this->_registers.dbr << 16u;
return base + this->_registers.y; return base + this->_registers.y;
} }
unsigned CPU::STA(uint24_t addr)
{
if (this->_registers.p.m)
this->_bus->write(addr, this->_registers.al);
else {
this->_bus->write(addr, this->_registers.al);
this->_bus->write(addr + 1, this->_registers.ah);
}
return 0;
}
} }
+2
View File
@@ -288,6 +288,8 @@ namespace ComSquare::CPU
//! @brief Add with carry - Adds operand to the Accumulator; adds an additional 1 if carry is set. //! @brief Add with carry - Adds operand to the Accumulator; adds an additional 1 if carry is set.
//! @return The number of extra cycles that this operation took. //! @return The number of extra cycles that this operation took.
unsigned ADC(uint24_t valueAddr); unsigned ADC(uint24_t valueAddr);
//! @brief Store the accumulator to memory.
unsigned STA(uint24_t addr);
public: public:
explicit CPU(std::shared_ptr<Memory::MemoryBus> bus, Cartridge::Header &cartridgeHeader); explicit CPU(std::shared_ptr<Memory::MemoryBus> bus, Cartridge::Header &cartridgeHeader);
//! @brief This function continue to execute the Cartridge code. //! @brief This function continue to execute the Cartridge code.
+1 -1
View File
@@ -11,7 +11,7 @@
namespace ComSquare namespace ComSquare
{ {
//! @brief Exception thrown when someone tries to load an invalid rom. //! @brief Exception thrown when someone tries to load an invalid rom.
class InvalidAction : std::exception { class InvalidAction : public std::exception {
private: private:
std::string _msg; std::string _msg;
public: public:
+19 -1
View File
@@ -13,7 +13,7 @@
namespace ComSquare namespace ComSquare
{ {
//! @brief Exception thrown when trying to read/write to an invalid address. //! @brief Exception thrown when trying to read/write to an invalid address.
class InvalidAddress : std::exception { class InvalidAddress : public std::exception {
private: private:
std::string _msg; std::string _msg;
public: public:
@@ -25,6 +25,24 @@ namespace ComSquare
} }
const char *what() const noexcept override { return this->_msg.c_str(); } const char *what() const noexcept override { return this->_msg.c_str(); }
}; };
//! @brief Exception thrown when trying to read/write to an invalid address in a rectangle memory region.
class InvalidRectangleAddress : public std::exception {
private:
std::string _msg;
public:
InvalidRectangleAddress(std::string where, int32_t addr, int16_t subaddr, int16_t start, int16_t end)
{
std::stringstream stream;
stream << "Could not read/write data at address: 0x" << std::hex << addr << " from " << where;
if (subaddr < start)
stream << " (" << std::hex << subaddr << " < " << start << ")";
else
stream << " (" << std::hex << subaddr << " > " << end << ")";
this->_msg = stream.str();
}
const char *what() const noexcept override { return this->_msg.c_str(); }
};
} }
#endif //COMSQUARE_INVALIDADDRESS_HPP #endif //COMSQUARE_INVALIDADDRESS_HPP
+1 -1
View File
@@ -11,7 +11,7 @@
namespace ComSquare namespace ComSquare
{ {
//! @brief Exception thrown when someone tries to load an invalid rom. //! @brief Exception thrown when someone tries to load an invalid rom.
class InvalidRomException : std::exception { class InvalidRomException : public std::exception {
private: private:
std::string _msg; std::string _msg;
public: public:
@@ -10,7 +10,7 @@
namespace ComSquare namespace ComSquare
{ {
//! @brief When this is thrown, it means that we should work more. //! @brief When this is thrown, it means that we should work more.
class NotImplementedException : std::exception { class NotImplementedException : public std::exception {
public: public:
explicit NotImplementedException() = default; explicit NotImplementedException() = default;
const char *what() const noexcept override { return "Not implemented yet."; } const char *what() const noexcept override { return "Not implemented yet."; }
+4 -4
View File
@@ -31,10 +31,10 @@ namespace ComSquare::Memory
unsigned bankCount = bank - this->_startBank; unsigned bankCount = bank - this->_startBank;
unsigned pageCount = this->_endPage - this->_startPage; unsigned pageCount = this->_endPage - this->_startPage;
if (bank < this->_startBank || bank >= this->_endBank) if (bank < this->_startBank || bank > this->_endBank)
throw InvalidAddress("Rectangle memory write Invalid Bank", addr); throw InvalidRectangleAddress("Rectangle memory write Invalid Bank", addr, bank, this->_startBank, this->_endBank);
if (page < this->_startPage || page >= this->_endPage) if (page < this->_startPage || page > this->_endPage)
throw InvalidAddress("Rectangle memory write Invalid Page", addr); throw InvalidRectangleAddress("Rectangle memory write Invalid Page", addr, page, this->_startPage, this->_endPage);
page -= this->_startPage; page -= this->_startPage;
page += pageCount * bankCount; page += pageCount * bankCount;
this->write_internal(page, data); this->write_internal(page, data);
+4
View File
@@ -20,6 +20,8 @@ Test(AddrMode, Immediate)
{ {
auto pair = Init(); auto pair = Init();
pair.second.cpu->_registers.pac = 0x000015; pair.second.cpu->_registers.pac = 0x000015;
pair.second.cpu->_isEmulationMode = true;
pair.second.cpu->_registers.p.m = false;
cr_assert_eq(pair.second.cpu->_getImmediateAddr(), 0x000015, "Got %x, Expected 0x000015"); cr_assert_eq(pair.second.cpu->_getImmediateAddr(), 0x000015, "Got %x, Expected 0x000015");
cr_assert_eq(pair.second.cpu->_registers.pac, 0x000016); cr_assert_eq(pair.second.cpu->_registers.pac, 0x000016);
} }
@@ -27,6 +29,7 @@ Test(AddrMode, Immediate)
Test(AddrMode, ImmediateMemoryFlag) Test(AddrMode, ImmediateMemoryFlag)
{ {
auto pair = Init(); auto pair = Init();
pair.second.cpu->_isEmulationMode = true;
pair.second.cpu->_registers.pac = 0x000015; pair.second.cpu->_registers.pac = 0x000015;
pair.second.cpu->_registers.p.m = true; pair.second.cpu->_registers.p.m = true;
cr_assert_eq(pair.second.cpu->_getImmediateAddr(), 0x000015, "Got %x, Expected 0x000015"); cr_assert_eq(pair.second.cpu->_getImmediateAddr(), 0x000015, "Got %x, Expected 0x000015");
@@ -37,6 +40,7 @@ Test(AddrMode, ImmediateBankChange)
{ {
auto pair = Init(); auto pair = Init();
pair.second.cpu->_registers.pac = 0x00FFFF; pair.second.cpu->_registers.pac = 0x00FFFF;
pair.second.cpu->_registers.p.m = false;
cr_assert_eq(pair.second.cpu->_getImmediateAddr(), 0x00FFFF); cr_assert_eq(pair.second.cpu->_getImmediateAddr(), 0x00FFFF);
cr_assert_eq(pair.second.cpu->_registers.pac, 0x010000); cr_assert_eq(pair.second.cpu->_registers.pac, 0x010000);
} }
+20
View File
@@ -0,0 +1,20 @@
//
// Created by anonymus-raccoon on 2/12/20.
//
#include <criterion/criterion.h>
#include <iostream>
#include <bitset>
#include "../tests.hpp"
#include "../../sources/SNES.hpp"
using namespace ComSquare;
//
//Test(STA, 8bits)
//{
// auto pair = Init();
// pair.second.cpu->_registers.p.m = false;
// pair.second.cpu->_registers.a = 0x11;
// pair.second.cpu->STA(0x0);
// auto data = pair.second.wram->_data[0];
// cr_assert_eq(data, 0x11, "The stored value should be 0x11 but it was 0x%x.", data);
//}
+32
View File
@@ -261,12 +261,31 @@ Test(BusAccessor, GetRomMirror3)
cr_assert_eq(accessor->_initial.get(), pair.second.cartridge.get()); cr_assert_eq(accessor->_initial.get(), pair.second.cartridge.get());
} }
Test(BusAccessor, Get0x0)
{
auto pair = Init();
std::shared_ptr<Memory::RectangleShadow> accessor = nullptr;
accessor = std::static_pointer_cast<Memory::RectangleShadow>(pair.first->getAccessor(0x0));
cr_assert_eq(accessor->_initial.get(), pair.second.wram.get());
}
/////////////////////////// ///////////////////////////
// // // //
// MemoryBus::read tests // // MemoryBus::read tests //
// // // //
/////////////////////////// ///////////////////////////
Test(BusRead, Read0x0)
{
auto pair = Init();
uint8_t data;
pair.second.wram->_data[0] = 123;
data = pair.first->read(0x0);
cr_assert_eq(data, 123);
}
Test(BusRead, ReadOutside, .init = cr_redirect_stdout) Test(BusRead, ReadOutside, .init = cr_redirect_stdout)
{ {
auto pair = Init(); auto pair = Init();
@@ -394,6 +413,19 @@ Test(BusRead, ReadWRAMMirror)
// // // //
//////////////////////////// ////////////////////////////
Test(BusWrite, Write0x0)
{
auto pair = Init();
try {
pair.first->write(0x0, 123);
} catch (std::exception &ex) {
std::cout << ex.what() << std::endl;
}
cr_assert_eq(pair.second.wram->_data[0], 123);
}
Test(BusWrite, WriteAPU) Test(BusWrite, WriteAPU)
{ {
auto pair = Init(); auto pair = Init();