6502-emulator/test/store-opcode-handler-test.cpp

229 lines
7.3 KiB
C++

#include "gtest/gtest.h"
#include "test-utils.h"
using namespace std;
using namespace emu_6502;
const uint8_t STA_ZPG = 0x85;
const uint8_t STA_ZPG_X = 0x95;
const uint8_t STA_ABS = 0x8D;
const uint8_t STA_ABS_X = 0x9D;
const uint8_t STA_ABS_Y = 0x99;
const uint8_t STA_IND_X = 0x81;
const uint8_t STA_IND_Y = 0x91;
const uint8_t STX_ZPG = 0x86;
const uint8_t STX_ZPG_Y = 0x96;
const uint8_t STX_ABS = 0x8E;
const uint8_t STY_ZPG = 0x84;
const uint8_t STY_ZPG_X = 0x94;
const uint8_t STY_ABS = 0x8C;
TEST(StoreOpcodeHandlerContainer, STA_ZPG) {
auto machine = create_machine({STA_ZPG, 0xe5});
machine->get_cpu().get_a().set_value(0x9d);
machine->execute();
ASSERT_EQ(0x9d, machine->get_memory().get_at(0xe5));
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), RegisterFlagSet{}));
}
TEST(StoreOpcodeHandlerContainer, STA_ZPG_FlagsUnaffected) {
auto machine = create_machine({STA_ZPG, 0xe5});
machine->get_cpu().get_a().set_value(0x9d);
auto& ps = machine->get_cpu().get_ps();
ps.set_overflow(true);
ps.set_zero(true);
ps.set_negative(true);
ps.set_carry(true);
ps.set_break(true);
ps.set_decimal(true);
ps.set_interupt_disable(true);
machine->execute();
ASSERT_EQ(0x9d, machine->get_memory().get_at(0xe5));
RegisterFlagSet flags{};
flags.overflow = true;
flags.zero = true;
flags.negative = true;
flags.carry = true;
flags.brk = true;
flags.decimal = true;
flags.interupt_disable = true;
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), flags));
}
TEST(StoreOpcodeHandlerContainer, STA_ZPG_X) {
auto machine = create_machine({STA_ZPG_X, 0x10});
machine->get_cpu().get_x().set_value(0x15);
machine->get_cpu().get_a().set_value(0x4f);
machine->execute();
ASSERT_EQ(0x4f, machine->get_memory().get_at(0x25));
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), RegisterFlagSet{}));
}
TEST(StoreOpcodeHandlerContainer, STA_ZPG_X_Wrap) {
auto machine = create_machine({STA_ZPG_X, 0xFF});
machine->get_cpu().get_x().set_value(0x80);
machine->get_cpu().get_a().set_value(0x4f);
machine->execute();
ASSERT_EQ(0x4f, machine->get_memory().get_at(0x7F));
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), RegisterFlagSet{}));
}
TEST(StoreOpcodeHandlerContainer, STA_ABS) {
auto machine = create_machine({STA_ABS, 0x55, 0x66});
machine->get_cpu().get_a().set_value(0x10);
machine->execute();
ASSERT_EQ(0x10, machine->get_memory().get_at(0x6655));
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), RegisterFlagSet{}));
}
TEST(StoreOpcodeHandlerContainer, STA_ABS_X) {
auto machine = create_machine({STA_ABS_X, 0x55, 0x66});
machine->get_cpu().get_x().set_value(0x4);
machine->get_cpu().get_a().set_value(0x10);
machine->execute();
ASSERT_EQ(0x10, machine->get_memory().get_at(0x6659));
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), RegisterFlagSet{}));
}
TEST(StoreOpcodeHandlerContainer, STA_ABS_Y) {
auto machine = create_machine({STA_ABS_Y, 0x55, 0x66});
machine->get_cpu().get_y().set_value(0x4);
machine->get_cpu().get_a().set_value(0x10);
machine->execute();
ASSERT_EQ(0x10, machine->get_memory().get_at(0x6659));
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), RegisterFlagSet{}));
}
TEST(StoreOpcodeHandlerContainer, STA_IND_X) {
auto machine = create_machine({STA_IND_X, 0x55});
machine->get_cpu().get_x().set_value(0x4);
machine->get_cpu().get_a().set_value(0x33);
// pointer
machine->get_memory().set_at(0x59, 0x3c);
machine->get_memory().set_at(0x5A, 0x4d);
machine->execute();
ASSERT_EQ(0x33, machine->get_memory().get_at(0x4d3c));
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), RegisterFlagSet{}));
}
TEST(StoreOpcodeHandlerContainer, STA_IND_X_Wrap) {
auto machine = create_machine({STA_IND_X, 0xFF});
machine->get_cpu().get_x().set_value(0x6b);
machine->get_cpu().get_a().set_value(0x33);
// pointer
machine->get_memory().set_at(0x6a, 0x3c);
machine->get_memory().set_at(0x6b, 0x4d);
machine->execute();
ASSERT_EQ(0x33, machine->get_memory().get_at(0x4d3c));
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), RegisterFlagSet{}));
}
TEST(StoreOpcodeHandlerContainer, STA_IND_Y) {
auto machine = create_machine({STA_IND_Y, 0x55});
machine->get_memory().set_at(0x55, 0x12);
machine->get_memory().set_at(0x56, 0x34);
machine->get_cpu().get_y().set_value(0x1a);
machine->get_cpu().get_a().set_value(0x33);
machine->execute();
ASSERT_EQ(0x33, machine->get_memory().get_at(0x342c));
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), RegisterFlagSet{}));
}
TEST(StoreOpcodeHandlerContainer, STX_ZPG) {
auto machine = create_machine({STX_ZPG, 123});
machine->get_cpu().get_x().set_value(78);
machine->execute();
ASSERT_EQ(78, machine->get_memory().get_at(123));
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), RegisterFlagSet{}));
}
TEST(StoreOpcodeHandlerContainer, STX_ZPG_Y) {
auto machine = create_machine({STX_ZPG_Y, 0x10});
machine->get_cpu().get_y().set_value(0x15);
machine->get_cpu().get_x().set_value(78);
machine->execute();
ASSERT_EQ(78, machine->get_memory().get_at(0x25));
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), RegisterFlagSet{}));
}
TEST(StoreOpcodeHandlerContainer, STX_ZPG_Y_Wrap) {
auto machine = create_machine({STX_ZPG_Y, 0xFF});
machine->get_cpu().get_y().set_value(0x80);
machine->get_cpu().get_x().set_value(78);
machine->execute();
ASSERT_EQ(78, machine->get_memory().get_at(0x7F));
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), RegisterFlagSet{}));
}
TEST(StoreOpcodeHandlerContainer, STX_ABS) {
auto machine = create_machine({STX_ABS, 0x55, 0x66});
machine->get_cpu().get_x().set_value(0x10);
machine->execute();
ASSERT_EQ(0x10, machine->get_memory().get_at(0x6655));
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), RegisterFlagSet{}));
}
TEST(StoreOpcodeHandlerContainer, STY_ZPG) {
auto machine = create_machine({STY_ZPG, 123});
machine->get_cpu().get_y().set_value(78);
machine->execute();
ASSERT_EQ(78, machine->get_memory().get_at(123));
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), RegisterFlagSet{}));
}
TEST(StoreOpcodeHandlerContainer, STY_ZPG_X) {
auto machine = create_machine({STY_ZPG_X, 0x10});
machine->get_cpu().get_x().set_value(0x15);
machine->get_cpu().get_y().set_value(78);
machine->execute();
ASSERT_EQ(78, machine->get_memory().get_at(0x25));
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), RegisterFlagSet{}));
}
TEST(StoreOpcodeHandlerContainer, STY_ZPG_X_Wrap) {
auto machine = create_machine({STY_ZPG_X, 0xFF});
machine->get_cpu().get_x().set_value(0x80);
machine->get_cpu().get_y().set_value(78);
machine->execute();
ASSERT_EQ(78, machine->get_memory().get_at(0x7F));
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), RegisterFlagSet{}));
}
TEST(StoreOpcodeHandlerContainer, STY_ABS) {
auto machine = create_machine({STY_ABS, 0x55, 0x66});
machine->get_cpu().get_y().set_value(0x10);
machine->execute();
ASSERT_EQ(0x10, machine->get_memory().get_at(0x6655));
ASSERT_TRUE(are_flags_set(machine->get_cpu().get_ps(), RegisterFlagSet{}));
}