mirror of
https://github.com/tdinucci/6502-emulator.git
synced 2024-11-15 16:05:49 +00:00
207 lines
6.2 KiB
C++
207 lines
6.2 KiB
C++
|
#include "gtest/gtest.h"
|
||
|
#include "test-utils.h"
|
||
|
|
||
|
using namespace std;
|
||
|
using namespace emu_6502;
|
||
|
|
||
|
const uint8_t TAX = 0xAA;
|
||
|
const uint8_t TAY = 0xA8;
|
||
|
const uint8_t TSX = 0xBA;
|
||
|
const uint8_t TXA = 0x8A;
|
||
|
const uint8_t TXS = 0x9A;
|
||
|
const uint8_t TYA = 0x98;
|
||
|
|
||
|
TEST(TransferOpcodeHandlerContainer, TAX) {
|
||
|
auto machine = create_machine({TAX});
|
||
|
machine->get_cpu().get_a().set_value(0x11);
|
||
|
machine->execute();
|
||
|
|
||
|
ASSERT_EQ(0x11, machine->get_cpu().get_x().get_value());
|
||
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), RegisterFlagSet{}));
|
||
|
}
|
||
|
|
||
|
TEST(TransferOpcodeHandlerContainer, TAX_ZeroFlag) {
|
||
|
auto machine = create_machine({TAX});
|
||
|
machine->get_cpu().get_a().set_value(0);
|
||
|
machine->execute();
|
||
|
|
||
|
ASSERT_EQ(0, machine->get_cpu().get_x().get_value());
|
||
|
|
||
|
RegisterFlagSet flags{};
|
||
|
flags.zero = true;
|
||
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
|
||
|
}
|
||
|
|
||
|
TEST(TransferOpcodeHandlerContainer, TAX_NegativeFlag) {
|
||
|
auto machine = create_machine({TAX});
|
||
|
machine->get_cpu().get_a().set_value(0xf0);
|
||
|
machine->execute();
|
||
|
|
||
|
ASSERT_EQ(0xf0, machine->get_cpu().get_x().get_value());
|
||
|
|
||
|
RegisterFlagSet flags{};
|
||
|
flags.negative = true;
|
||
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
|
||
|
}
|
||
|
|
||
|
TEST(TransferOpcodeHandlerContainer, TAY) {
|
||
|
auto machine = create_machine({TAY});
|
||
|
machine->get_cpu().get_a().set_value(0x11);
|
||
|
machine->execute();
|
||
|
|
||
|
ASSERT_EQ(0x11, machine->get_cpu().get_y().get_value());
|
||
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), RegisterFlagSet{}));
|
||
|
}
|
||
|
|
||
|
TEST(TransferOpcodeHandlerContainer, TAY_ZeroFlag) {
|
||
|
auto machine = create_machine({TAY});
|
||
|
machine->get_cpu().get_a().set_value(0);
|
||
|
machine->execute();
|
||
|
|
||
|
ASSERT_EQ(0, machine->get_cpu().get_y().get_value());
|
||
|
|
||
|
RegisterFlagSet flags{};
|
||
|
flags.zero = true;
|
||
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
|
||
|
}
|
||
|
|
||
|
TEST(TransferOpcodeHandlerContainer, TAY_NegativeFlag) {
|
||
|
auto machine = create_machine({TAY});
|
||
|
machine->get_cpu().get_a().set_value(0xf0);
|
||
|
machine->execute();
|
||
|
|
||
|
ASSERT_EQ(0xf0, machine->get_cpu().get_y().get_value());
|
||
|
|
||
|
RegisterFlagSet flags{};
|
||
|
flags.negative = true;
|
||
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
|
||
|
}
|
||
|
|
||
|
TEST(TransferOpcodeHandlerContainer, TSX) {
|
||
|
auto machine = create_machine({TSX});
|
||
|
machine->get_cpu().get_sp().set_value(0x11);
|
||
|
machine->execute();
|
||
|
|
||
|
ASSERT_EQ(0x11, machine->get_cpu().get_x().get_value());
|
||
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), RegisterFlagSet{}));
|
||
|
}
|
||
|
|
||
|
TEST(TransferOpcodeHandlerContainer, TSX_ZeroFlag) {
|
||
|
auto machine = create_machine({TSX});
|
||
|
machine->get_cpu().get_sp().set_value(0);
|
||
|
machine->execute();
|
||
|
|
||
|
ASSERT_EQ(0, machine->get_cpu().get_x().get_value());
|
||
|
|
||
|
RegisterFlagSet flags{};
|
||
|
flags.zero = true;
|
||
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
|
||
|
}
|
||
|
|
||
|
TEST(TransferOpcodeHandlerContainer, TSX_NegativeFlag) {
|
||
|
auto machine = create_machine({TSX});
|
||
|
machine->get_cpu().get_sp().set_value(0xf0);
|
||
|
machine->execute();
|
||
|
|
||
|
ASSERT_EQ(0xf0, machine->get_cpu().get_x().get_value());
|
||
|
|
||
|
RegisterFlagSet flags{};
|
||
|
flags.negative = true;
|
||
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
|
||
|
}
|
||
|
|
||
|
TEST(TransferOpcodeHandlerContainer, TXA) {
|
||
|
auto machine = create_machine({TXA});
|
||
|
machine->get_cpu().get_x().set_value(0x11);
|
||
|
machine->execute();
|
||
|
|
||
|
ASSERT_EQ(0x11, machine->get_cpu().get_a().get_value());
|
||
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), RegisterFlagSet{}));
|
||
|
}
|
||
|
|
||
|
TEST(TransferOpcodeHandlerContainer, TXA_ZeroFlag) {
|
||
|
auto machine = create_machine({TXA});
|
||
|
machine->get_cpu().get_x().set_value(0);
|
||
|
machine->execute();
|
||
|
|
||
|
ASSERT_EQ(0, machine->get_cpu().get_a().get_value());
|
||
|
|
||
|
RegisterFlagSet flags{};
|
||
|
flags.zero = true;
|
||
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
|
||
|
}
|
||
|
|
||
|
TEST(TransferOpcodeHandlerContainer, TXA_NegativeFlag) {
|
||
|
auto machine = create_machine({TXA});
|
||
|
machine->get_cpu().get_x().set_value(0xf0);
|
||
|
machine->execute();
|
||
|
|
||
|
ASSERT_EQ(0xf0, machine->get_cpu().get_a().get_value());
|
||
|
|
||
|
RegisterFlagSet flags{};
|
||
|
flags.negative = true;
|
||
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
|
||
|
}
|
||
|
|
||
|
TEST(TransferOpcodeHandlerContainer, TXS) {
|
||
|
auto machine = create_machine({TXS});
|
||
|
machine->get_cpu().get_x().set_value(0x11);
|
||
|
machine->execute();
|
||
|
|
||
|
ASSERT_EQ(0x11, machine->get_cpu().get_sp().get_value());
|
||
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), RegisterFlagSet{}));
|
||
|
}
|
||
|
|
||
|
TEST(TransferOpcodeHandlerContainer, TXS_ZeroFlag) {
|
||
|
auto machine = create_machine({TXS});
|
||
|
machine->get_cpu().get_x().set_value(0);
|
||
|
machine->execute();
|
||
|
|
||
|
ASSERT_EQ(0, machine->get_cpu().get_sp().get_value());
|
||
|
|
||
|
// flags not affected with this op
|
||
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), RegisterFlagSet{}));
|
||
|
}
|
||
|
|
||
|
TEST(TransferOpcodeHandlerContainer, TXS_NegativeFlag) {
|
||
|
auto machine = create_machine({TXS});
|
||
|
machine->get_cpu().get_x().set_value(0xf0);
|
||
|
machine->execute();
|
||
|
|
||
|
ASSERT_EQ(0xf0, machine->get_cpu().get_sp().get_value());
|
||
|
// flags not affected with this op
|
||
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), RegisterFlagSet{}));
|
||
|
}
|
||
|
|
||
|
TEST(TransferOpcodeHandlerContainer, TYA) {
|
||
|
auto machine = create_machine({TYA});
|
||
|
machine->get_cpu().get_y().set_value(0x11);
|
||
|
machine->execute();
|
||
|
|
||
|
ASSERT_EQ(0x11, machine->get_cpu().get_a().get_value());
|
||
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), RegisterFlagSet{}));
|
||
|
}
|
||
|
|
||
|
TEST(TransferOpcodeHandlerContainer, TYA_ZeroFlag) {
|
||
|
auto machine = create_machine({TYA});
|
||
|
machine->get_cpu().get_y().set_value(0);
|
||
|
machine->execute();
|
||
|
|
||
|
ASSERT_EQ(0, machine->get_cpu().get_a().get_value());
|
||
|
|
||
|
RegisterFlagSet flags{};
|
||
|
flags.zero = true;
|
||
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
|
||
|
}
|
||
|
|
||
|
TEST(TransferOpcodeHandlerContainer, TYA_NegativeFlag) {
|
||
|
auto machine = create_machine({TYA});
|
||
|
machine->get_cpu().get_y().set_value(0xf0);
|
||
|
machine->execute();
|
||
|
|
||
|
ASSERT_EQ(0xf0, machine->get_cpu().get_a().get_value());
|
||
|
|
||
|
RegisterFlagSet flags{};
|
||
|
flags.negative = true;
|
||
|
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
|
||
|
}
|