mirror of
https://github.com/zoriya/ComSquare.git
synced 2026-05-12 19:04:58 +00:00
Implementing some addressing modes
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
#include "CPU.hpp"
|
||||
|
||||
#include <utility>
|
||||
#include <iostream>
|
||||
#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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -19,8 +19,8 @@ std::pair<std::shared_ptr<Memory::MemoryBus>, 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);
|
||||
}
|
||||
Reference in New Issue
Block a user