#include "gtest/gtest.h" #include "../src/machine.h" #include "../src/program.h" #include #include using namespace std; const uint8_t TAX = 0xAA; const uint8_t TXA = 0x8A; const uint8_t DEX = 0xCA; const uint8_t INX = 0xE8; const uint8_t TAY = 0xA8; const uint8_t TYA = 0x98; const uint8_t DEY = 0x88; const uint8_t INY = 0xC8; unique_ptr rt_get_machine(shared_ptr> code) { auto program = make_shared(Program(code)); auto machine = make_unique(Machine(program)); return machine; } TEST(RegisterOpcodeHandler, TransferAtoX) { auto code = make_shared>(vector{TAX}); auto machine = rt_get_machine(code); auto reg_man = machine->get_reg_man(); auto aval = reg_man->get_accumulator()->get_value(); auto xval = reg_man->get_x_index()->get_value(); ASSERT_EQ(0, aval); ASSERT_EQ(0, xval); machine->execute(); aval = reg_man->get_accumulator()->get_value(); xval = reg_man->get_x_index()->get_value(); ASSERT_EQ(0, aval); ASSERT_EQ(0, xval); reg_man->get_program_counter()->set_value(0); reg_man->get_accumulator()->set_value(0x3e); machine->execute(); aval = reg_man->get_accumulator()->get_value(); xval = reg_man->get_x_index()->get_value(); ASSERT_EQ(0x3e, aval); ASSERT_EQ(0x3e, xval); } TEST(RegisterOpcodeHandler, TransferXtoA) { auto code = make_shared>(vector{TXA}); auto machine = rt_get_machine(code); auto reg_man = machine->get_reg_man(); auto aval = reg_man->get_accumulator()->get_value(); auto xval = reg_man->get_x_index()->get_value(); ASSERT_EQ(0, aval); ASSERT_EQ(0, xval); machine->execute(); aval = reg_man->get_accumulator()->get_value(); xval = reg_man->get_x_index()->get_value(); ASSERT_EQ(0, aval); ASSERT_EQ(0, xval); reg_man->get_program_counter()->set_value(0); reg_man->get_x_index()->set_value(0x4f); machine->execute(); aval = reg_man->get_accumulator()->get_value(); xval = reg_man->get_x_index()->get_value(); ASSERT_EQ(0x4f, aval); ASSERT_EQ(0x4f, xval); } TEST(RegisterOpcodeHandler, DecrementX) { auto code = make_shared>(vector{DEX}); auto machine = rt_get_machine(code); auto reg_man = machine->get_reg_man(); auto xval = reg_man->get_x_index()->get_value(); ASSERT_EQ(0, xval); machine->execute(); xval = reg_man->get_x_index()->get_value(); ASSERT_EQ(0xff, xval); reg_man->get_program_counter()->set_value(0); machine->execute(); xval = reg_man->get_x_index()->get_value(); ASSERT_EQ(0xfe, xval); reg_man->get_program_counter()->set_value(0); reg_man->get_x_index()->set_value(0x45); machine->execute(); xval = reg_man->get_x_index()->get_value(); ASSERT_EQ(0x44, xval); } TEST(RegisterOpcodeHandler, IncrementX) { auto code = make_shared>(vector{INX}); auto machine = rt_get_machine(code); auto reg_man = machine->get_reg_man(); auto xval = reg_man->get_x_index()->get_value(); ASSERT_EQ(0, xval); machine->execute(); xval = reg_man->get_x_index()->get_value(); ASSERT_EQ(0x01, xval); reg_man->get_program_counter()->set_value(0); machine->execute(); xval = reg_man->get_x_index()->get_value(); ASSERT_EQ(0x02, xval); reg_man->get_program_counter()->set_value(0); reg_man->get_x_index()->set_value(0x45); machine->execute(); xval = reg_man->get_x_index()->get_value(); ASSERT_EQ(0x46, xval); } TEST(RegisterOpcodeHandler, TransferAtoY) { auto code = make_shared>(vector{TAY}); auto machine = rt_get_machine(code); auto reg_man = machine->get_reg_man(); auto aval = reg_man->get_accumulator()->get_value(); auto yval = reg_man->get_y_index()->get_value(); ASSERT_EQ(0, aval); ASSERT_EQ(0, yval); machine->execute(); aval = reg_man->get_accumulator()->get_value(); yval = reg_man->get_y_index()->get_value(); ASSERT_EQ(0, aval); ASSERT_EQ(0, yval); reg_man->get_program_counter()->set_value(0); reg_man->get_accumulator()->set_value(0xaf); machine->execute(); aval = reg_man->get_accumulator()->get_value(); yval = reg_man->get_y_index()->get_value(); ASSERT_EQ(0xaf, aval); ASSERT_EQ(0xaf, yval); } TEST(RegisterOpcodeHandler, TransferYtoA) { auto code = make_shared>(vector{TYA}); auto machine = rt_get_machine(code); auto reg_man = machine->get_reg_man(); auto aval = reg_man->get_accumulator()->get_value(); auto yval = reg_man->get_y_index()->get_value(); ASSERT_EQ(0, aval); ASSERT_EQ(0, yval); machine->execute(); aval = reg_man->get_accumulator()->get_value(); yval = reg_man->get_y_index()->get_value(); ASSERT_EQ(0, aval); ASSERT_EQ(0, yval); reg_man->get_program_counter()->set_value(0); reg_man->get_y_index()->set_value(0xff); machine->execute(); aval = reg_man->get_accumulator()->get_value(); yval = reg_man->get_y_index()->get_value(); ASSERT_EQ(0xff, aval); ASSERT_EQ(0xff, yval); } TEST(RegisterOpcodeHandler, DecrementY) { auto code = make_shared>(vector{DEY}); auto machine = rt_get_machine(code); auto reg_man = machine->get_reg_man(); auto yval = reg_man->get_y_index()->get_value(); ASSERT_EQ(0, yval); machine->execute(); yval = reg_man->get_y_index()->get_value(); ASSERT_EQ(0xff, yval); reg_man->get_program_counter()->set_value(0); machine->execute(); yval = reg_man->get_y_index()->get_value(); ASSERT_EQ(0xfe, yval); reg_man->get_program_counter()->set_value(0); reg_man->get_y_index()->set_value(0x3b); machine->execute(); yval = reg_man->get_y_index()->get_value(); ASSERT_EQ(0x3a, yval); } TEST(RegisterOpcodeHandler, IncrementY) { auto code = make_shared>(vector{INY}); auto machine = rt_get_machine(code); auto reg_man = machine->get_reg_man(); auto yval = reg_man->get_y_index()->get_value(); ASSERT_EQ(0, yval); machine->execute(); yval = reg_man->get_y_index()->get_value(); ASSERT_EQ(0x01, yval); reg_man->get_program_counter()->set_value(0); machine->execute(); yval = reg_man->get_y_index()->get_value(); ASSERT_EQ(0x02, yval); reg_man->get_program_counter()->set_value(0); reg_man->get_y_index()->set_value(0x3b); machine->execute(); yval = reg_man->get_y_index()->get_value(); ASSERT_EQ(0x3c, yval); }