#include "gtest/gtest.h" #include "../src/machine.h" #include "../src/program.h" #include "../src/opcode/handler/stack-opcode-handler.h" #include #include using namespace std; const uint8_t IMMEDIATE = 0xA2; const uint8_t ZERO_PAGE = 0xA6; const uint8_t ZERO_PAGE_Y = 0xB6; const uint8_t ABSOLUTE = 0xAE; const uint8_t ABSOLUTE_Y = 0xBE; unique_ptr ldxt_get_machine(shared_ptr> code) { auto program = make_shared(Program(code)); auto machine = make_unique(Machine(program)); return machine; } TEST(LdxOpcodeHandler, Immediate) { auto code = make_shared>(vector{IMMEDIATE, 36}); auto machine = ldxt_get_machine(code); auto reg_man = machine->get_reg_man(); auto x_reg = reg_man->get_x_index(); ASSERT_EQ(0, x_reg->get_value()); machine->execute(); ASSERT_EQ(36, x_reg->get_value()); } TEST(LdxOpcodeHandler, ZeroPage) { auto code = make_shared>(vector{ZERO_PAGE, 123}); auto machine = ldxt_get_machine(code); auto reg_man = machine->get_reg_man(); auto x_reg = reg_man->get_x_index(); ASSERT_EQ(0, x_reg->get_value()); machine->get_memory()->set_byte_at(123, 78); machine->execute(); ASSERT_EQ(78, x_reg->get_value()); } TEST(LdxOpcodeHandler, ZeroPageY) { auto code = make_shared>(vector{ZERO_PAGE_Y, 250}); auto machine = ldxt_get_machine(code); auto reg_man = machine->get_reg_man(); auto x_reg = reg_man->get_x_index(); auto y_reg = reg_man->get_y_index(); ASSERT_EQ(0, x_reg->get_value()); ASSERT_EQ(0, y_reg->get_value()); machine->get_memory()->set_byte_at(250, 255); machine->execute(); ASSERT_EQ(255, x_reg->get_value()); reg_man->get_y_index()->set_value(100); reg_man->get_program_counter()->set_value(0); machine->execute(); ASSERT_EQ(0, x_reg->get_value()); machine->get_memory()->set_byte_at(350, 233); reg_man->get_program_counter()->set_value(0); machine->execute(); ASSERT_EQ(233, x_reg->get_value()); } TEST(LdxOpcodeHandler, Absolute) { auto code = make_shared>(vector{ABSOLUTE, 0xe5, 0xff}); auto machine = ldxt_get_machine(code); auto reg_man = machine->get_reg_man(); auto x_reg = reg_man->get_x_index(); ASSERT_EQ(0, x_reg->get_value()); machine->get_memory()->set_byte_at(0xffe5, 0xde); machine->execute(); ASSERT_EQ(0xde, x_reg->get_value()); } TEST(LdxOpcodeHandler, AbsoluteY) { auto code = make_shared>(vector{ABSOLUTE_Y, 0x33, 0xc2}); auto machine = ldxt_get_machine(code); auto reg_man = machine->get_reg_man(); auto x_reg = reg_man->get_x_index(); auto y_reg = reg_man->get_y_index(); ASSERT_EQ(0, x_reg->get_value()); ASSERT_EQ(0, y_reg->get_value()); machine->get_memory()->set_byte_at(0xc233, 0xc8); machine->execute(); ASSERT_EQ(0xc8, x_reg->get_value()); y_reg->set_value(0x55); machine->get_memory()->set_byte_at(0xc233 + 0x55, 0xab); reg_man->get_program_counter()->set_value(0); machine->execute(); ASSERT_EQ(0xab, x_reg->get_value()); }