From 7d51bc623e7f52a141c992fb8ef0379ba76ddd2e Mon Sep 17 00:00:00 2001
From: AnonymusRaccoon
Date: Tue, 11 Feb 2020 11:45:22 +0100
Subject: [PATCH] Adding the program counter relative addressing mode
---
sources/CPU/CPU.cpp | 7 +++++++
sources/CPU/CPU.hpp | 2 ++
tests/CPU/testAddressingMode.cpp | 18 ++++++++++++++++++
3 files changed, 27 insertions(+)
diff --git a/sources/CPU/CPU.cpp b/sources/CPU/CPU.cpp
index 6bcb7ca..ca4052d 100644
--- a/sources/CPU/CPU.cpp
+++ b/sources/CPU/CPU.cpp
@@ -318,4 +318,11 @@ namespace ComSquare::CPU
lng += this->_bus->read(this->_registers.pac++) << 16u;
return lng + this->_registers.x;
}
+
+ uint24_t CPU::_getProgramCounterRelativeAddr()
+ {
+ uint24_t pc = this->_registers.pac;
+ int8_t mod = this->_bus->read(this->_registers.pac++);
+ return pc + mod;
+ }
}
\ No newline at end of file
diff --git a/sources/CPU/CPU.hpp b/sources/CPU/CPU.hpp
index cb520c3..64903d2 100644
--- a/sources/CPU/CPU.hpp
+++ b/sources/CPU/CPU.hpp
@@ -218,6 +218,8 @@ namespace ComSquare::CPU
uint24_t _getAbsoluteIndexedByYAddr();
//! @brief The effective address is formed by adding the with X.
uint24_t _getAbsoluteLongIndexedByXAddr();
+ //! @brief The <8-bit signed exp> is added to PC (program counter) to form the new location.
+ uint24_t _getProgramCounterRelativeAddr();
//! @brief Execute a single instruction.
diff --git a/tests/CPU/testAddressingMode.cpp b/tests/CPU/testAddressingMode.cpp
index ba97e75..b585eba 100644
--- a/tests/CPU/testAddressingMode.cpp
+++ b/tests/CPU/testAddressingMode.cpp
@@ -162,4 +162,22 @@ Test(AddrMode, AbsoluteLongIndexByX)
pair.second.cpu->_registers.x = 0x0005;
cr_assert_eq(pair.second.cpu->_getAbsoluteLongIndexedByXAddr(), 0xEFAC15, "Returned address was %x but was expecting 0xEFAC15.", pair.second.cpu->_getAbsoluteLongIndexedByXAddr());
cr_assert_eq(pair.second.cpu->_registers.pac, 0x808003);
+}
+
+Test(AddrMode, ProgramCounterRelativePositive)
+{
+ auto pair = Init();
+ pair.second.cpu->_registers.pac = 0x808010;
+ pair.second.cartridge->_data[0x10] = 0x15;
+ cr_assert_eq(pair.second.cpu->_getProgramCounterRelativeAddr(), 0x808025, "Returned address was %x but was expecting 0x808025.", pair.second.cpu->_getProgramCounterRelativeAddr());
+ cr_assert_eq(pair.second.cpu->_registers.pac, 0x808011);
+}
+
+Test(AddrMode, ProgramCounterRelativeNegative)
+{
+ auto pair = Init();
+ pair.second.cpu->_registers.pac = 0x808010;
+ pair.second.cartridge->_data[0x10] = -0x15;
+ cr_assert_eq(pair.second.cpu->_getProgramCounterRelativeAddr(), 0x807FFB, "Returned address was %x but was expecting 0x807FFB.", pair.second.cpu->_getProgramCounterRelativeAddr());
+ cr_assert_eq(pair.second.cpu->_registers.pac, 0x808011);
}
\ No newline at end of file