mirror of
https://github.com/zoriya/ComSquare.git
synced 2026-06-04 10:44:37 +00:00
Implementing the CLC/CLI/CLD/CLV
This commit is contained in:
@@ -301,6 +301,11 @@ namespace ComSquare::CPU
|
|||||||
|
|
||||||
case Instructions::JSL: this->JSR(this->_getAbsoluteLongAddr()); return 8;
|
case Instructions::JSL: this->JSR(this->_getAbsoluteLongAddr()); return 8;
|
||||||
|
|
||||||
|
case Instructions::CLC: this->CLC(); return 2;
|
||||||
|
case Instructions::CLI: this->CLI(); return 2;
|
||||||
|
case Instructions::CLD: this->CLD(); return 2;
|
||||||
|
case Instructions::CLV: this->CLV(); return 2;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw InvalidOpcode("CPU", opcode);
|
throw InvalidOpcode("CPU", opcode);
|
||||||
}
|
}
|
||||||
|
|||||||
+14
-1
@@ -282,7 +282,12 @@ namespace ComSquare::CPU
|
|||||||
JSR_ABS = 0x20,
|
JSR_ABS = 0x20,
|
||||||
JSR_ABSXi = 0xFC,
|
JSR_ABSXi = 0xFC,
|
||||||
|
|
||||||
JSL = 0x22
|
JSL = 0x22,
|
||||||
|
|
||||||
|
CLC = 0x18,
|
||||||
|
CLI = 0x58,
|
||||||
|
CLD = 0xD8,
|
||||||
|
CLV = 0xB8
|
||||||
};
|
};
|
||||||
|
|
||||||
//! @brief The main CPU
|
//! @brief The main CPU
|
||||||
@@ -415,6 +420,14 @@ namespace ComSquare::CPU
|
|||||||
void PLX();
|
void PLX();
|
||||||
//! @brief Pull the y index register to the stack.
|
//! @brief Pull the y index register to the stack.
|
||||||
void PLY();
|
void PLY();
|
||||||
|
//! @brief Clear the carry flag.
|
||||||
|
void CLC();
|
||||||
|
//! @brief Clear the Interrupt Disable flag.
|
||||||
|
void CLI();
|
||||||
|
//! @brief Clear the decimal flag.
|
||||||
|
void CLD();
|
||||||
|
//! @brief Clear the overflow flag.
|
||||||
|
void CLV();
|
||||||
public:
|
public:
|
||||||
explicit CPU(std::shared_ptr<Memory::MemoryBus> bus, Cartridge::Header &cartridgeHeader);
|
explicit CPU(std::shared_ptr<Memory::MemoryBus> bus, Cartridge::Header &cartridgeHeader);
|
||||||
CPU(const CPU &) = default;
|
CPU(const CPU &) = default;
|
||||||
|
|||||||
@@ -112,4 +112,24 @@ namespace ComSquare::CPU
|
|||||||
this->_registers.p.z = this->_registers.y == 0;
|
this->_registers.p.z = this->_registers.y == 0;
|
||||||
this->_registers.p.n = this->_registers.y & 0x8000u;
|
this->_registers.p.n = this->_registers.y & 0x8000u;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CPU::CLC()
|
||||||
|
{
|
||||||
|
this->_registers.p.c = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CPU::CLI()
|
||||||
|
{
|
||||||
|
this->_registers.p.i = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CPU::CLD()
|
||||||
|
{
|
||||||
|
this->_registers.p.d = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CPU::CLV()
|
||||||
|
{
|
||||||
|
this->_registers.p.v = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -405,4 +405,36 @@ Test(PLP, emulation)
|
|||||||
auto data = pair.second.cpu->_registers.p.flags;
|
auto data = pair.second.cpu->_registers.p.flags;
|
||||||
cr_assert_eq(data, 0b00110000, "The flags should be 0b00110000 but it was %x", data);
|
cr_assert_eq(data, 0b00110000, "The flags should be 0b00110000 but it was %x", data);
|
||||||
cr_assert_eq(pair.second.cpu->_registers.s, 0x1, "The Stack pointer should be equal to 0x1 but it was %x", pair.second.cpu->_registers.s);
|
cr_assert_eq(pair.second.cpu->_registers.s, 0x1, "The Stack pointer should be equal to 0x1 but it was %x", pair.second.cpu->_registers.s);
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(CLC, clear)
|
||||||
|
{
|
||||||
|
auto pair = Init();
|
||||||
|
pair.second.cpu->_registers.p.flags = 0xFF;
|
||||||
|
pair.second.cpu->CLC();
|
||||||
|
cr_assert_eq(pair.second.cpu->_registers.p.c, false, "The carry flag should not be set");
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(CLI, clear)
|
||||||
|
{
|
||||||
|
auto pair = Init();
|
||||||
|
pair.second.cpu->_registers.p.flags = 0xFF;
|
||||||
|
pair.second.cpu->CLI();
|
||||||
|
cr_assert_eq(pair.second.cpu->_registers.p.i, false, "The interrupt flag should not be set");
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(CLD, clear)
|
||||||
|
{
|
||||||
|
auto pair = Init();
|
||||||
|
pair.second.cpu->_registers.p.flags = 0xFF;
|
||||||
|
pair.second.cpu->CLD();
|
||||||
|
cr_assert_eq(pair.second.cpu->_registers.p.d, false, "The decimal flag should not be set");
|
||||||
|
}
|
||||||
|
|
||||||
|
Test(CLV, clear)
|
||||||
|
{
|
||||||
|
auto pair = Init();
|
||||||
|
pair.second.cpu->_registers.p.flags = 0xFF;
|
||||||
|
pair.second.cpu->CLV();
|
||||||
|
cr_assert_eq(pair.second.cpu->_registers.p.v, false, "The overflow flag should not be set");
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user