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);