From 04ea6f25d0924eba5878b6ffd5ed5a88dc7c2d1f Mon Sep 17 00:00:00 2001 From: AnonymusRaccoon Date: Mon, 10 Feb 2020 17:50:48 +0100 Subject: [PATCH] Implementing some addressing modes --- sources/CPU/CPU.cpp | 16 +++++++++++++--- tests/CPU/testAddressingMode.cpp | 9 ++++----- tests/tests.cpp | 4 ++-- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/sources/CPU/CPU.cpp b/sources/CPU/CPU.cpp index 3e27385..d99f73e 100644 --- a/sources/CPU/CPU.cpp +++ b/sources/CPU/CPU.cpp @@ -5,6 +5,7 @@ #include "CPU.hpp" #include +#include #include "../Exceptions/NotImplementedException.hpp" #include "../Exceptions/InvalidAddress.hpp" #include "../Exceptions/InvalidOpcode.hpp" @@ -239,18 +240,27 @@ namespace ComSquare::CPU uint24_t CPU::_getAbsoluteAddr() { uint24_t addr = this->_registers.dbr << 16u; - addr += this->_bus->read(this->_registers.pac++) << 8u; addr += this->_bus->read(this->_registers.pac++); + addr += this->_bus->read(this->_registers.pac++) << 8u; return addr; } uint24_t CPU::_getAbsoluteLongAddr() { - return 0; + uint24_t addr = this->_bus->read(this->_registers.pac++); + addr += this->_bus->read(this->_registers.pac++) << 8u; + addr += this->_bus->read(this->_registers.pac++) << 16u; + return addr; } uint24_t CPU::_getDirectIndirectIndexedAddr() { - return 0; + uint16_t dp = this->_bus->read(this->_registers.pac++) + this->_registers.d; + std::cout << "DP: " << std::hex << dp << std::endl; + uint24_t base = this->_bus->read(dp); + std::cout << "Base: " << std::hex << base << std::endl; + base += this->_bus->read(dp + 1) << 8u; + base += this->_registers.dbr << 16u; + return base + this->_registers.y; } } \ No newline at end of file diff --git a/tests/CPU/testAddressingMode.cpp b/tests/CPU/testAddressingMode.cpp index d2e795c..8f63664 100644 --- a/tests/CPU/testAddressingMode.cpp +++ b/tests/CPU/testAddressingMode.cpp @@ -38,8 +38,7 @@ Test(AddrMode, Direct) 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->_getDirectAddr(), 0x1015, "Returned address was %i but was expecting 0x1015.", pair.second.cpu->_getDirectAddr()); cr_assert_eq(pair.second.cpu->_registers.pac, 0x808001); } @@ -59,7 +58,7 @@ 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.cartridge->_data[2] = 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()); @@ -70,8 +69,8 @@ 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.wram->_data[0x1000] = 0x30; + pair.second.wram->_data[0x1001] = 0x40; pair.second.cpu->_registers.pac = 0x808000; pair.second.cpu->_registers.dbr = 0x80; pair.second.cpu->_registers.y = 0x0001; diff --git a/tests/tests.cpp b/tests/tests.cpp index 22fc2dd..c9a3bd7 100644 --- a/tests/tests.cpp +++ b/tests/tests.cpp @@ -19,8 +19,8 @@ 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 = 0x2000; + snes.sram->_size = 100; snes.sram->_data = new uint8_t[snes.cartridge->_size]; - bus->mapComponents(snes); +// bus->mapComponents(snes); return std::make_pair(bus, snes); } \ No newline at end of file