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