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