mirror of
https://github.com/tdinucci/6502-emulator.git
synced 2024-09-27 13:55:49 +00:00
260 lines
8.0 KiB
C++
260 lines
8.0 KiB
C++
#include "gtest/gtest.h"
|
|
#include "test-utils.h"
|
|
|
|
using namespace std;
|
|
using namespace emu_6502;
|
|
|
|
const uint8_t CMP_IMM = 0xC9;
|
|
const uint8_t CMP_ZPG = 0xC5;
|
|
const uint8_t CMP_ZPG_X = 0xD5;
|
|
const uint8_t CMP_ABS = 0xCD;
|
|
const uint8_t CMP_ABS_X = 0xDD;
|
|
const uint8_t CMP_ABS_Y = 0xD9;
|
|
const uint8_t CMP_IND_X = 0xC1;
|
|
const uint8_t CMP_IND_Y = 0xD1;
|
|
|
|
const uint8_t CPX_IMM = 0xE0;
|
|
const uint8_t CPX_ZPG = 0xE4;
|
|
const uint8_t CPX_ABS = 0xEC;
|
|
|
|
const uint8_t CPY_IMM = 0xC0;
|
|
const uint8_t CPY_ZPG = 0xC4;
|
|
const uint8_t CPY_ABS = 0xCC;
|
|
|
|
TEST(CompareOpcodeHandlerContainer, CMP_IMM_Equal) {
|
|
auto machine = create_machine({CMP_IMM, 100});
|
|
machine->get_cpu().get_a().set_value(100);
|
|
machine->execute();
|
|
|
|
ASSERT_EQ(100, machine->get_cpu().get_a().get_value());
|
|
|
|
RegisterFlagSet flags{};
|
|
flags.zero = true;
|
|
flags.carry = true;
|
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
|
|
}
|
|
|
|
TEST(CompareOpcodeHandlerContainer, CMP_IMM_LessThan) {
|
|
auto machine = create_machine({CMP_IMM, 100});
|
|
machine->get_cpu().get_a().set_value(99);
|
|
machine->execute();
|
|
|
|
ASSERT_EQ(99, machine->get_cpu().get_a().get_value());
|
|
|
|
RegisterFlagSet flags{};
|
|
flags.negative = true;
|
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
|
|
}
|
|
|
|
TEST(CompareOpcodeHandlerContainer, CMP_IMM_GreaterThan) {
|
|
auto machine = create_machine({CMP_IMM, 100});
|
|
machine->get_cpu().get_a().set_value(101);
|
|
machine->execute();
|
|
|
|
ASSERT_EQ(101, machine->get_cpu().get_a().get_value());
|
|
|
|
RegisterFlagSet flags{};
|
|
flags.carry = true;
|
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
|
|
}
|
|
|
|
TEST(CompareOpcodeHandlerContainer, CMP_ZPG) {
|
|
auto machine = create_machine({CMP_ZPG, 0x10});
|
|
machine->get_memory().set_at(0x10, 100);
|
|
machine->get_cpu().get_a().set_value(100);
|
|
machine->execute();
|
|
|
|
ASSERT_EQ(100, machine->get_cpu().get_a().get_value());
|
|
ASSERT_EQ(100, machine->get_memory().get_at(0x10));
|
|
|
|
RegisterFlagSet flags{};
|
|
flags.zero = true;
|
|
flags.carry = true;
|
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
|
|
}
|
|
|
|
TEST(CompareOpcodeHandlerContainer, CMP_ZPG_X) {
|
|
auto machine = create_machine({CMP_ZPG_X, 0x10});
|
|
machine->get_cpu().get_x().set_value(0x5);
|
|
machine->get_memory().set_at(0x15, 100);
|
|
machine->get_cpu().get_a().set_value(100);
|
|
machine->execute();
|
|
|
|
ASSERT_EQ(100, machine->get_cpu().get_a().get_value());
|
|
ASSERT_EQ(100, machine->get_memory().get_at(0x15));
|
|
|
|
RegisterFlagSet flags{};
|
|
flags.zero = true;
|
|
flags.carry = true;
|
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
|
|
}
|
|
|
|
TEST(CompareOpcodeHandlerContainer, CMP_ABS) {
|
|
auto machine = create_machine({CMP_ABS, 0x10, 0x2a});
|
|
machine->get_memory().set_at(0x2a10, 100);
|
|
machine->get_cpu().get_a().set_value(100);
|
|
machine->execute();
|
|
|
|
ASSERT_EQ(100, machine->get_cpu().get_a().get_value());
|
|
ASSERT_EQ(100, machine->get_memory().get_at(0x2a10));
|
|
|
|
RegisterFlagSet flags{};
|
|
flags.zero = true;
|
|
flags.carry = true;
|
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
|
|
}
|
|
|
|
TEST(CompareOpcodeHandlerContainer, CMP_ABS_X) {
|
|
auto machine = create_machine({CMP_ABS_X, 0x10, 0x2a});
|
|
machine->get_cpu().get_x().set_value(0x5);
|
|
machine->get_memory().set_at(0x2a15, 100);
|
|
machine->get_cpu().get_a().set_value(100);
|
|
machine->execute();
|
|
|
|
ASSERT_EQ(100, machine->get_cpu().get_a().get_value());
|
|
ASSERT_EQ(100, machine->get_memory().get_at(0x2a15));
|
|
|
|
RegisterFlagSet flags{};
|
|
flags.zero = true;
|
|
flags.carry = true;
|
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
|
|
}
|
|
|
|
TEST(CompareOpcodeHandlerContainer, CMP_ABS_Y) {
|
|
auto machine = create_machine({CMP_ABS_Y, 0x10, 0x2a});
|
|
machine->get_cpu().get_y().set_value(0x7);
|
|
machine->get_memory().set_at(0x2a17, 100);
|
|
machine->get_cpu().get_a().set_value(100);
|
|
machine->execute();
|
|
|
|
ASSERT_EQ(100, machine->get_cpu().get_a().get_value());
|
|
ASSERT_EQ(100, machine->get_memory().get_at(0x2a17));
|
|
|
|
RegisterFlagSet flags{};
|
|
flags.zero = true;
|
|
flags.carry = true;
|
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
|
|
}
|
|
|
|
TEST(CompareOpcodeHandlerContainer, CMP_IND_X) {
|
|
auto machine = create_machine({CMP_IND_X, 0x55});
|
|
machine->get_cpu().get_x().set_value(0x22);
|
|
machine->get_cpu().get_a().set_value(100);
|
|
machine->get_memory().set_at(0x77, 0x34);
|
|
machine->get_memory().set_at(0x78, 0x12);
|
|
machine->get_memory().set_at(0x1234, 100);
|
|
machine->execute();
|
|
|
|
ASSERT_EQ(100, machine->get_cpu().get_a().get_value());
|
|
ASSERT_EQ(100, machine->get_memory().get_at(0x1234));
|
|
|
|
RegisterFlagSet flags{};
|
|
flags.zero = true;
|
|
flags.carry = true;
|
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
|
|
}
|
|
|
|
TEST(CompareOpcodeHandlerContainer, CMP_IND_Y) {
|
|
auto machine = create_machine({CMP_IND_Y, 0x41});
|
|
machine->get_cpu().get_y().set_value(0x22);
|
|
machine->get_cpu().get_a().set_value(100);
|
|
machine->get_memory().set_at(0x41, 0x34);
|
|
machine->get_memory().set_at(0x42, 0x12);
|
|
machine->get_memory().set_at(0x1256, 100);
|
|
machine->execute();
|
|
|
|
ASSERT_EQ(100, machine->get_cpu().get_a().get_value());
|
|
ASSERT_EQ(100, machine->get_memory().get_at(0x1256));
|
|
|
|
RegisterFlagSet flags{};
|
|
flags.zero = true;
|
|
flags.carry = true;
|
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
|
|
}
|
|
|
|
TEST(CompareOpcodeHandlerContainer, CPX_IMM) {
|
|
auto machine = create_machine({CPX_IMM, 100});
|
|
machine->get_cpu().get_x().set_value(100);
|
|
machine->execute();
|
|
|
|
ASSERT_EQ(100, machine->get_cpu().get_x().get_value());
|
|
|
|
RegisterFlagSet flags{};
|
|
flags.zero = true;
|
|
flags.carry = true;
|
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
|
|
}
|
|
|
|
TEST(CompareOpcodeHandlerContainer, CPX_ZPG) {
|
|
auto machine = create_machine({CPX_ZPG, 0x10});
|
|
machine->get_memory().set_at(0x10, 100);
|
|
machine->get_cpu().get_x().set_value(100);
|
|
machine->execute();
|
|
|
|
ASSERT_EQ(100, machine->get_cpu().get_x().get_value());
|
|
ASSERT_EQ(100, machine->get_memory().get_at(0x10));
|
|
|
|
RegisterFlagSet flags{};
|
|
flags.zero = true;
|
|
flags.carry = true;
|
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
|
|
}
|
|
|
|
TEST(CompareOpcodeHandlerContainer, CPX_ABS) {
|
|
auto machine = create_machine({CPX_ABS, 0x10, 0x2a});
|
|
machine->get_memory().set_at(0x2a10, 100);
|
|
machine->get_cpu().get_x().set_value(100);
|
|
machine->execute();
|
|
|
|
ASSERT_EQ(100, machine->get_cpu().get_x().get_value());
|
|
ASSERT_EQ(100, machine->get_memory().get_at(0x2a10));
|
|
|
|
RegisterFlagSet flags{};
|
|
flags.zero = true;
|
|
flags.carry = true;
|
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
|
|
}
|
|
|
|
TEST(CompareOpcodeHandlerContainer, CPY_IMM) {
|
|
auto machine = create_machine({CPY_IMM, 100});
|
|
machine->get_cpu().get_y().set_value(100);
|
|
machine->execute();
|
|
|
|
ASSERT_EQ(100, machine->get_cpu().get_y().get_value());
|
|
|
|
RegisterFlagSet flags{};
|
|
flags.zero = true;
|
|
flags.carry = true;
|
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
|
|
}
|
|
|
|
TEST(CompareOpcodeHandlerContainer, CPY_ZPG) {
|
|
auto machine = create_machine({CPY_ZPG, 0x10});
|
|
machine->get_memory().set_at(0x10, 100);
|
|
machine->get_cpu().get_y().set_value(100);
|
|
machine->execute();
|
|
|
|
ASSERT_EQ(100, machine->get_cpu().get_y().get_value());
|
|
ASSERT_EQ(100, machine->get_memory().get_at(0x10));
|
|
|
|
RegisterFlagSet flags{};
|
|
flags.zero = true;
|
|
flags.carry = true;
|
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
|
|
}
|
|
|
|
TEST(CompareOpcodeHandlerContainer, CPY_ABS) {
|
|
auto machine = create_machine({CPY_ABS, 0x10, 0x2a});
|
|
machine->get_memory().set_at(0x2a10, 100);
|
|
machine->get_cpu().get_y().set_value(100);
|
|
machine->execute();
|
|
|
|
ASSERT_EQ(100, machine->get_cpu().get_y().get_value());
|
|
ASSERT_EQ(100, machine->get_memory().get_at(0x2a10));
|
|
|
|
RegisterFlagSet flags{};
|
|
flags.zero = true;
|
|
flags.carry = true;
|
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
|
|
}
|