Enabling the memory bus debugger

This commit is contained in:
Zoe Roux
2021-07-05 00:23:48 +02:00
parent f16815c36f
commit cb6fb8a240
20 changed files with 475 additions and 418 deletions
+26 -26
View File
@@ -10,13 +10,13 @@ namespace ComSquare::CPU
{
int CPU::TSB(uint24_t valueAddr, AddressingMode mode)
{
uint16_t value = this->_bus.read(valueAddr);
uint16_t value = this->getBus().read(valueAddr);
if (!this->_registers.p.m)
value += this->_bus.read(valueAddr + 1) << 8u;
value += this->getBus().read(valueAddr + 1) << 8u;
value |= this->_registers.a;
this->_bus.write(valueAddr, value);
this->getBus().write(valueAddr, value);
if (!this->_registers.p.m)
this->_bus.write(valueAddr + 1, value >> 8u);
this->getBus().write(valueAddr + 1, value >> 8u);
this->_registers.p.z = value == 0;
@@ -30,14 +30,14 @@ namespace ComSquare::CPU
int CPU::TRB(uint24_t valueAddr, AddressingMode mode)
{
uint16_t value = this->_bus.read(valueAddr);
uint16_t value = this->getBus().read(valueAddr);
if (!this->_registers.p.m)
value += this->_bus.read(valueAddr + 1) << 8u;
value += this->getBus().read(valueAddr + 1) << 8u;
uint16_t newValue = value & ~this->_registers.a;
this->_bus.write(valueAddr, newValue);
this->getBus().write(valueAddr, newValue);
if (!this->_registers.p.m)
this->_bus.write(valueAddr + 1, newValue >> 8u);
this->getBus().write(valueAddr + 1, newValue >> 8u);
this->_registers.p.z = (value & this->_registers.a) == 0;
@@ -52,9 +52,9 @@ namespace ComSquare::CPU
int CPU::BIT(uint24_t valueAddr, AddressingMode mode)
{
unsigned negativeMask = this->_registers.p.m ? 0x80u : 0x8000u;
unsigned value = this->_bus.read(valueAddr);
unsigned value = this->getBus().read(valueAddr);
if (!this->_registers.p.m)
value += this->_bus.read(valueAddr + 1) << 8u;
value += this->getBus().read(valueAddr + 1) << 8u;
if (mode != ImmediateForA) {
this->_registers.p.n = value & negativeMask;
@@ -89,18 +89,18 @@ namespace ComSquare::CPU
return 0;
}
uint16_t value = this->_bus.read(valueAddr);
uint16_t value = this->getBus().read(valueAddr);
if (!this->_registers.p.m)
value += this->_bus.read(valueAddr + 1) << 8u;
value += this->getBus().read(valueAddr + 1) << 8u;
this->_registers.p.c = value & highByte;
value <<= 1u;
this->_registers.p.n = value & highByte;
this->_registers.p.z = value == 0;
this->_bus.write(valueAddr, value);
this->getBus().write(valueAddr, value);
if (!this->_registers.p.m)
this->_bus.write(valueAddr + 1, value >> 8u);
this->getBus().write(valueAddr + 1, value >> 8u);
int cycles = 2 * !this->_registers.p.m;
switch (mode) {
@@ -128,17 +128,17 @@ namespace ComSquare::CPU
return 0;
}
uint16_t value = this->_bus.read(valueAddr);
uint16_t value = this->getBus().read(valueAddr);
if (!this->_registers.p.m)
value += this->_bus.read(valueAddr + 1) << 8u;
value += this->getBus().read(valueAddr + 1) << 8u;
this->_registers.p.c = value & 1u;
value >>= 1u;
this->_registers.p.z = value == 0;
this->_bus.write(valueAddr, value);
this->getBus().write(valueAddr, value);
if (!this->_registers.p.m)
this->_bus.write(valueAddr + 1, value >> 8u);
this->getBus().write(valueAddr + 1, value >> 8u);
int cycles = 2 * !this->_registers.p.m;
switch (mode) {
@@ -169,9 +169,9 @@ namespace ComSquare::CPU
return 0;
}
uint16_t value = this->_bus.read(valueAddr);
uint16_t value = this->getBus().read(valueAddr);
if (!this->_registers.p.m)
value += this->_bus.read(valueAddr + 1) << 8u;
value += this->getBus().read(valueAddr + 1) << 8u;
this->_registers.p.c = value & highByte;
value <<= 1u;
@@ -179,9 +179,9 @@ namespace ComSquare::CPU
this->_registers.p.n = value & highByte;
this->_registers.p.z = value == 0;
this->_bus.write(valueAddr, value);
this->getBus().write(valueAddr, value);
if (!this->_registers.p.m)
this->_bus.write(valueAddr + 1, value >> 8u);
this->getBus().write(valueAddr + 1, value >> 8u);
int cycles = 2 * !this->_registers.p.m;
switch (mode) {
@@ -212,18 +212,18 @@ namespace ComSquare::CPU
return 0;
}
uint16_t value = this->_bus.read(valueAddr);
uint16_t value = this->getBus().read(valueAddr);
if (!this->_registers.p.m)
value += this->_bus.read(valueAddr + 1) << 8u;
value += this->getBus().read(valueAddr + 1) << 8u;
this->_registers.p.c = value & 1u;
value >>= 1u;
value |= oldCarry << highByteIndex;
this->_registers.p.z = value == 0;
this->_bus.write(valueAddr, value);
this->getBus().write(valueAddr, value);
if (!this->_registers.p.m)
this->_bus.write(valueAddr + 1, value >> 8u);
this->getBus().write(valueAddr + 1, value >> 8u);
int cycles = 2 * !this->_registers.p.m;
switch (mode) {
@@ -50,13 +50,13 @@ namespace ComSquare::CPU
int CPU::SEP(uint24_t valueAddr, AddressingMode)
{
this->_registers.p.flags |= this->_bus.read(valueAddr);
this->_registers.p.flags |= this->getBus().read(valueAddr);
return 0;
}
int CPU::REP(uint24_t valueAddr, AddressingMode)
{
this->_registers.p.flags &= ~this->_bus.read(valueAddr);
this->_registers.p.flags &= ~this->getBus().read(valueAddr);
if (this->_isEmulationMode) {
this->_registers.p.x_b = true;
this->_registers.p.m = true;
@@ -189,8 +189,8 @@ namespace ComSquare::CPU
int CPU::PER(uint24_t valueAddr, AddressingMode)
{
uint16_t value = this->_bus.read(valueAddr);
value += this->_bus.read(valueAddr + 1) << 8u;
uint16_t value = this->getBus().read(valueAddr);
value += this->getBus().read(valueAddr + 1) << 8u;
value += this->_registers.pc;
this->_push(value);
return 0;
@@ -226,55 +226,55 @@ namespace ComSquare::CPU
int CPU::BCC(uint24_t valueAddr, AddressingMode)
{
if (!this->_registers.p.c)
this->_registers.pc += static_cast<int8_t>(this->_bus.read(valueAddr));
this->_registers.pc += static_cast<int8_t>(this->getBus().read(valueAddr));
return !this->_registers.p.c + this->_isEmulationMode;
}
int CPU::BCS(uint24_t valueAddr, AddressingMode)
{
if (this->_registers.p.c)
this->_registers.pc += static_cast<int8_t>(this->_bus.read(valueAddr));
this->_registers.pc += static_cast<int8_t>(this->getBus().read(valueAddr));
return this->_registers.p.c + this->_isEmulationMode;
}
int CPU::BEQ(uint24_t valueAddr, AddressingMode)
{
if (this->_registers.p.z)
this->_registers.pc += static_cast<int8_t>(this->_bus.read(valueAddr));
this->_registers.pc += static_cast<int8_t>(this->getBus().read(valueAddr));
return this->_registers.p.z + this->_isEmulationMode;
}
int CPU::BNE(uint24_t valueAddr, AddressingMode)
{
if (!this->_registers.p.z)
this->_registers.pc += static_cast<int8_t>(this->_bus.read(valueAddr));
this->_registers.pc += static_cast<int8_t>(this->getBus().read(valueAddr));
return !this->_registers.p.z + this->_isEmulationMode;
}
int CPU::BMI(uint24_t valueAddr, AddressingMode)
{
if (this->_registers.p.n)
this->_registers.pc += static_cast<int8_t>(this->_bus.read(valueAddr));
this->_registers.pc += static_cast<int8_t>(this->getBus().read(valueAddr));
return this->_registers.p.n + this->_isEmulationMode;
}
int CPU::BPL(uint24_t valueAddr, AddressingMode)
{
if (!this->_registers.p.n)
this->_registers.pc += static_cast<int8_t>(this->_bus.read(valueAddr));
this->_registers.pc += static_cast<int8_t>(this->getBus().read(valueAddr));
return !this->_registers.p.n + this->_isEmulationMode;
}
int CPU::BRA(uint24_t valueAddr, AddressingMode)
{
this->_registers.pc += static_cast<int8_t>(this->_bus.read(valueAddr));
this->_registers.pc += static_cast<int8_t>(this->getBus().read(valueAddr));
return this->_isEmulationMode;
}
int CPU::BRL(uint24_t valueAddr, AddressingMode)
{
unsigned value = this->_bus.read(valueAddr);
value += this->_bus.read(valueAddr + 1) << 8u;
unsigned value = this->getBus().read(valueAddr);
value += this->getBus().read(valueAddr + 1) << 8u;
this->_registers.pc += static_cast<int16_t>(value);
return 0;
@@ -283,14 +283,14 @@ namespace ComSquare::CPU
int CPU::BVC(uint24_t valueAddr, AddressingMode)
{
if (!this->_registers.p.v)
this->_registers.pc += static_cast<int8_t>(this->_bus.read(valueAddr));
this->_registers.pc += static_cast<int8_t>(this->getBus().read(valueAddr));
return !this->_registers.p.v + this->_isEmulationMode;
}
int CPU::BVS(uint24_t valueAddr, AddressingMode)
{
if (this->_registers.p.v)
this->_registers.pc += static_cast<int8_t>(this->_bus.read(valueAddr));
this->_registers.pc += static_cast<int8_t>(this->getBus().read(valueAddr));
return this->_registers.p.v + this->_isEmulationMode;
}
@@ -9,9 +9,9 @@ namespace ComSquare::CPU
{
int CPU::ADC(uint24_t valueAddr, AddressingMode mode)
{
unsigned value = this->_bus.read(valueAddr) + this->_registers.p.c;
unsigned value = this->getBus().read(valueAddr) + this->_registers.p.c;
if (!this->_registers.p.m)
value += this->_bus.read(valueAddr + 1) << 8u;
value += this->getBus().read(valueAddr + 1) << 8u;
unsigned negativeMask = this->_registers.p.m ? 0x80u : 0x8000u;
unsigned maxValue = this->_registers.p.m ? UINT8_MAX : UINT16_MAX;
@@ -52,9 +52,9 @@ namespace ComSquare::CPU
int CPU::SBC(uint24_t valueAddr, AddressingMode mode)
{
unsigned negativeMask = this->_registers.p.m ? 0x80u : 0x8000u;
unsigned value = this->_bus.read(valueAddr);
unsigned value = this->getBus().read(valueAddr);
if (!this->_registers.p.m)
value += this->_bus.read(valueAddr + 1) << 8u;
value += this->getBus().read(valueAddr + 1) << 8u;
bool oldCarry = this->_registers.p.c;
this->_registers.p.c = this->_registers.a >= value;
@@ -94,9 +94,9 @@ namespace ComSquare::CPU
int CPU::ORA(uint24_t valueAddr, AddressingMode mode)
{
unsigned negativeMask = this->_registers.p.m ? 0x80u : 0x8000u;
unsigned value = this->_bus.read(valueAddr);
unsigned value = this->getBus().read(valueAddr);
if (!this->_registers.p.m)
value += this->_bus.read(valueAddr + 1) << 8u;
value += this->getBus().read(valueAddr + 1) << 8u;
this->_registers.a |= value;
this->_registers.p.z = this->_registers.a == 0;
this->_registers.p.n = this->_registers.a & negativeMask;
@@ -151,9 +151,9 @@ namespace ComSquare::CPU
int CPU::CMP(uint24_t valueAddr, AddressingMode mode)
{
unsigned negativeMask = this->_registers.p.m ? 0x80u : 0x8000u;
unsigned value = this->_bus.read(valueAddr);
unsigned value = this->getBus().read(valueAddr);
if (!this->_registers.p.m)
value += this->_bus.read(valueAddr + 1) << 8u;
value += this->getBus().read(valueAddr + 1) << 8u;
unsigned result = this->_registers.a - value;
if (this->_registers.p.m)
result %= 0x100;
@@ -214,7 +214,7 @@ namespace ComSquare::CPU
int CPU::CPX(uint24_t valueAddr, AddressingMode mode)
{
unsigned value = this->_bus.read(valueAddr++);
unsigned value = this->getBus().read(valueAddr++);
if (this->_registers.p.x_b) {
uint8_t x = this->_registers.x;
@@ -222,7 +222,7 @@ namespace ComSquare::CPU
this->_registers.p.z = x == 0;
this->_registers.p.n = x & 0x80u;
} else {
value += this->_bus.read(valueAddr) << 8u;
value += this->getBus().read(valueAddr) << 8u;
uint16_t x = this->_registers.x;
x -= value;
this->_registers.p.z = x == 0;
@@ -234,7 +234,7 @@ namespace ComSquare::CPU
int CPU::CPY(uint24_t valueAddr, AddressingMode mode)
{
unsigned value = this->_bus.read(valueAddr++);
unsigned value = this->getBus().read(valueAddr++);
this->_registers.p.c = this->_registers.y >= value;
if (this->_registers.p.x_b) {
@@ -243,7 +243,7 @@ namespace ComSquare::CPU
this->_registers.p.z = y == 0;
this->_registers.p.n = y & 0x80u;
} else {
value += this->_bus.read(valueAddr) << 8u;
value += this->getBus().read(valueAddr) << 8u;
uint16_t y = this->_registers.y;
y -= value;
this->_registers.p.z = y == 0;
@@ -255,9 +255,9 @@ namespace ComSquare::CPU
int CPU::AND(uint24_t valueAddr, AddressingMode mode)
{
unsigned negativeMask = this->_registers.p.m ? 0x80u : 0x8000u;
unsigned value = this->_bus.read(valueAddr);
unsigned value = this->getBus().read(valueAddr);
if (!this->_registers.p.m)
value += this->_bus.read(valueAddr + 1) << 8u;
value += this->getBus().read(valueAddr + 1) << 8u;
this->_registers.a &= value;
this->_registers.p.n = this->_registers.a & negativeMask;
@@ -297,15 +297,15 @@ namespace ComSquare::CPU
this->_registers.ah = 0;
result = this->_registers.a;
} else if (!this->_registers.p.m) {
result = this->_bus.read(valueAddr);
result += this->_bus.read(valueAddr + 1) << 8u;
result = this->getBus().read(valueAddr);
result += this->getBus().read(valueAddr + 1) << 8u;
result = (uint16_t)(result + 1);
this->_bus.write(valueAddr, result);
this->_bus.write(valueAddr + 1, result << 8u);
this->getBus().write(valueAddr, result);
this->getBus().write(valueAddr + 1, result << 8u);
} else {
result = this->_bus.read(valueAddr);
result = this->getBus().read(valueAddr);
result = (uint8_t)(result + 1);
this->_bus.write(valueAddr, result);
this->getBus().write(valueAddr, result);
}
this->_registers.p.z = result == 0;
@@ -337,15 +337,15 @@ namespace ComSquare::CPU
this->_registers.ah = 0;
result = this->_registers.a;
} else if (!this->_registers.p.m) {
result = this->_bus.read(valueAddr);
result += this->_bus.read(valueAddr + 1) << 8u;
result = this->getBus().read(valueAddr);
result += this->getBus().read(valueAddr + 1) << 8u;
result = (uint16_t)(result - 1);
this->_bus.write(valueAddr, result);
this->_bus.write(valueAddr + 1, result << 8u);
this->getBus().write(valueAddr, result);
this->getBus().write(valueAddr + 1, result << 8u);
} else {
result = this->_bus.read(valueAddr);
result = this->getBus().read(valueAddr);
result = (uint8_t)(result - 1);
this->_bus.write(valueAddr, result);
this->getBus().write(valueAddr, result);
}
this->_registers.p.z = result == 0;
@@ -369,9 +369,9 @@ namespace ComSquare::CPU
int CPU::EOR(uint24_t valueAddr, AddressingMode mode)
{
unsigned negativeMask = this->_registers.p.m ? 0x80u : 0x8000u;
unsigned value = this->_bus.read(valueAddr);
unsigned value = this->getBus().read(valueAddr);
if (!this->_registers.p.m)
value += this->_bus.read(valueAddr + 1) << 8u;
value += this->getBus().read(valueAddr + 1) << 8u;
this->_registers.a ^= value;
this->_registers.p.z = this->_registers.a == 0;
this->_registers.p.n = this->_registers.a & negativeMask;
+20 -20
View File
@@ -9,10 +9,10 @@ namespace ComSquare::CPU
int CPU::STA(uint24_t addr, AddressingMode mode)
{
if (this->_registers.p.m)
this->_bus.write(addr, this->_registers.al);
this->getBus().write(addr, this->_registers.al);
else {
this->_bus.write(addr, this->_registers.al);
this->_bus.write(addr + 1, this->_registers.ah);
this->getBus().write(addr, this->_registers.al);
this->getBus().write(addr + 1, this->_registers.ah);
}
int cycles = !this->_registers.p.m;
@@ -34,10 +34,10 @@ namespace ComSquare::CPU
int CPU::STX(uint24_t addr, AddressingMode mode)
{
if (this->_registers.p.x_b)
this->_bus.write(addr, this->_registers.xl);
this->getBus().write(addr, this->_registers.xl);
else {
this->_bus.write(addr, this->_registers.xl);
this->_bus.write(addr + 1, this->_registers.xh);
this->getBus().write(addr, this->_registers.xl);
this->getBus().write(addr + 1, this->_registers.xh);
}
return !this->_registers.p.x_b + (mode != Absolute && this->_registers.dl != 0);
}
@@ -45,19 +45,19 @@ namespace ComSquare::CPU
int CPU::STY(uint24_t addr, AddressingMode mode)
{
if (this->_registers.p.x_b)
this->_bus.write(addr, this->_registers.yl);
this->getBus().write(addr, this->_registers.yl);
else {
this->_bus.write(addr, this->_registers.yl);
this->_bus.write(addr + 1, this->_registers.yh);
this->getBus().write(addr, this->_registers.yl);
this->getBus().write(addr + 1, this->_registers.yh);
}
return !this->_registers.p.x_b + (mode != Absolute && this->_registers.dl != 0);
}
int CPU::STZ(uint24_t addr, AddressingMode mode)
{
this->_bus.write(addr, 0x00);
this->getBus().write(addr, 0x00);
if (!this->_registers.p.m)
this->_bus.write(addr + 1, 0x00);
this->getBus().write(addr + 1, 0x00);
if (mode == Absolute || mode == AbsoluteIndexedByX)
return !this->_registers.p.m;
return !this->_registers.p.m + this->_registers.dl != 0;
@@ -66,11 +66,11 @@ namespace ComSquare::CPU
int CPU::LDA(uint24_t addr, AddressingMode mode)
{
if (this->_registers.p.m) {
this->_registers.a = this->_bus.read(addr);
this->_registers.a = this->getBus().read(addr);
this->_registers.p.n = this->_registers.al & 0xF0u;
} else {
this->_registers.al = this->_bus.read(addr);
this->_registers.ah = this->_bus.read(addr + 1);
this->_registers.al = this->getBus().read(addr);
this->_registers.ah = this->getBus().read(addr + 1);
this->_registers.p.n = this->_registers.a & 0xF000u;
}
this->_registers.p.z = this->_registers.a == 0x0;
@@ -101,11 +101,11 @@ namespace ComSquare::CPU
int CPU::LDX(uint24_t addr, AddressingMode mode)
{
if (this->_registers.p.x_b) {
this->_registers.x = this->_bus.read(addr);
this->_registers.x = this->getBus().read(addr);
this->_registers.p.n = this->_registers.xl & 0xF0u;
} else {
this->_registers.xl = this->_bus.read(addr);
this->_registers.xh = this->_bus.read(addr + 1);
this->_registers.xl = this->getBus().read(addr);
this->_registers.xh = this->getBus().read(addr + 1);
this->_registers.p.n = this->_registers.x & 0xF000u;
}
this->_registers.p.z = this->_registers.x == 0x0;
@@ -128,11 +128,11 @@ namespace ComSquare::CPU
int CPU::LDY(uint24_t addr, AddressingMode mode)
{
if (this->_registers.p.x_b) {
this->_registers.y = this->_bus.read(addr);
this->_registers.y = this->getBus().read(addr);
this->_registers.p.n = this->_registers.yl & 0xF0u;
} else {
this->_registers.yl = this->_bus.read(addr);
this->_registers.yh = this->_bus.read(addr + 1);
this->_registers.yl = this->getBus().read(addr);
this->_registers.yh = this->getBus().read(addr + 1);
this->_registers.p.n = this->_registers.y & 0xF000u;
}
this->_registers.p.z = this->_registers.y == 0x0;
@@ -160,8 +160,8 @@ namespace ComSquare::CPU
this->_registers.dbr = destBank;
while (this->_registers.a != 0xFFFF) {
uint8_t data = this->_bus.read(srcBank << 24u | this->_registers.x);
this->_bus.write(destBank << 24u | this->_registers.y, data);
uint8_t data = this->getBus().read(srcBank << 24u | this->_registers.x);
this->getBus().write(destBank << 24u | this->_registers.y, data);
this->_registers.x++;
this->_registers.y++;
this->_registers.a--;
@@ -177,8 +177,8 @@ namespace ComSquare::CPU
this->_registers.dbr = destBank;
while (this->_registers.a != 0xFFFF) {
uint8_t data = this->_bus.read(srcBank << 24u | this->_registers.x);
this->_bus.write(destBank << 24u | this->_registers.y, data);
uint8_t data = this->getBus().read(srcBank << 24u | this->_registers.x);
this->getBus().write(destBank << 24u | this->_registers.y, data);
this->_registers.x--;
this->_registers.y--;
this->_registers.a--;