From f516e7ec66428bd38b6bad6f375a2d2f68f4aa86 Mon Sep 17 00:00:00 2001
From: AnonymusRaccoon
Date: Mon, 10 Feb 2020 17:09:12 +0100
Subject: [PATCH] Adding more tests for the data bus
---
sources/CPU/CPU.cpp | 13 ++++---
sources/CPU/CPU.hpp | 10 +++---
tests/CPU/testAddressingMode.cpp | 61 ++++++++++++++++++++++++++------
tests/tests.cpp | 2 +-
4 files changed, 66 insertions(+), 20 deletions(-)
diff --git a/sources/CPU/CPU.cpp b/sources/CPU/CPU.cpp
index b0ed691..3e27385 100644
--- a/sources/CPU/CPU.cpp
+++ b/sources/CPU/CPU.cpp
@@ -225,18 +225,18 @@ namespace ComSquare::CPU
/// Addressing modes
////////////////////////////////////////////////////////////////////
- uint24_t CPU::_GetImmediateAddr()
+ uint24_t CPU::_getImmediateAddr()
{
return this->_registers.pac++;
}
- uint24_t CPU::_GetDirectAddr()
+ uint24_t CPU::_getDirectAddr()
{
uint8_t addr = this->_bus->read(this->_registers.pac++);
return this->_registers.d + addr;
}
- uint24_t CPU::_GetAbsoluteAddr()
+ uint24_t CPU::_getAbsoluteAddr()
{
uint24_t addr = this->_registers.dbr << 16u;
addr += this->_bus->read(this->_registers.pac++) << 8u;
@@ -244,7 +244,12 @@ namespace ComSquare::CPU
return addr;
}
- uint24_t CPU::_GetAbsoluteLongAddr()
+ uint24_t CPU::_getAbsoluteLongAddr()
+ {
+ return 0;
+ }
+
+ uint24_t CPU::_getDirectIndirectIndexedAddr()
{
return 0;
}
diff --git a/sources/CPU/CPU.hpp b/sources/CPU/CPU.hpp
index 13977a6..92b51d9 100644
--- a/sources/CPU/CPU.hpp
+++ b/sources/CPU/CPU.hpp
@@ -195,13 +195,15 @@ namespace ComSquare::CPU
Cartridge::Header &_cartridgeHeader;
//! @brief Immediate address mode is specified with a value. (This functions returns the 24bit space address of the value).
- uint24_t _GetImmediateAddr();
+ uint24_t _getImmediateAddr();
//! @brief The destination is formed by adding the direct page register with the 8-bit address to form an effective address. (This functions returns the 24bit space address of the value).
- uint24_t _GetDirectAddr();
+ uint24_t _getDirectAddr();
//! @brief The effective address is formed by DBR:<16-bit exp>. (This functions returns the 24bit space address of the value).
- uint24_t _GetAbsoluteAddr();
+ uint24_t _getAbsoluteAddr();
//! @brief The effective address is the expression. (This functions returns the 24bit space address of the value).
- uint24_t _GetAbsoluteLongAddr();
+ uint24_t _getAbsoluteLongAddr();
+ //! @brief The address is DBR:$(read($($Value + D)) + Y). (This functions returns the 24bit space address of the value).
+ uint24_t _getDirectIndirectIndexedAddr();
//! @brief Execute a single instruction.
diff --git a/tests/CPU/testAddressingMode.cpp b/tests/CPU/testAddressingMode.cpp
index 250359a..d2e795c 100644
--- a/tests/CPU/testAddressingMode.cpp
+++ b/tests/CPU/testAddressingMode.cpp
@@ -4,6 +4,7 @@
#include
#include
+#include
#include "../tests.hpp"
#include "../../sources/SNES.hpp"
using namespace ComSquare;
@@ -19,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 %i, Expected 0x000015");
cr_assert_eq(pair.second.cpu->_registers.pac, 0x000016);
}
@@ -27,16 +28,54 @@ 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->_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
+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.",
+ pair.second.cpu->_getDirectAddr());
+ cr_assert_eq(pair.second.cpu->_registers.pac, 0x808001);
+}
+
+Test(AddrMode, Absolute)
+{
+ auto pair = Init();
+ pair.second.cartridge->_data[0] = 0x1C;
+ 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->_registers.pac, 0x808002);
+}
+
+Test(AddrMode, AbsoluteLong)
+{
+ auto pair = Init();
+ pair.second.cartridge->_data[0] = 0x1C;
+ pair.second.cartridge->_data[1] = 0x90;
+ pair.second.cartridge->_data[1] = 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->_registers.pac, 0x808003);
+}
+
+Test(AddrMode, DirectIndirectIndexed)
+{
+ auto pair = Init();
+ pair.second.cartridge->_data[0] = 0x10;
+ pair.second.sram->_data[0x1000] = 0x30;
+ pair.second.sram->_data[0x1001] = 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->_registers.pac, 0x808001);
+}
\ No newline at end of file
diff --git a/tests/tests.cpp b/tests/tests.cpp
index f6ff907..22fc2dd 100644
--- a/tests/tests.cpp
+++ b/tests/tests.cpp
@@ -19,7 +19,7 @@ std::pair, SNES> Init()
snes.cartridge->_size = 100;
snes.cartridge->_data = new uint8_t[snes.cartridge->_size];
snes.cartridge->header.mappingMode = Cartridge::LoRom;
- snes.sram->_size = 10;
+ snes.sram->_size = 0x2000;
snes.sram->_data = new uint8_t[snes.cartridge->_size];
bus->mapComponents(snes);
return std::make_pair(bus, snes);