mirror of
https://github.com/tdinucci/6502-emulator.git
synced 2024-09-23 16:57:47 +00:00
229 lines
7.3 KiB
C++
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{}));
|
|
}
|
|
|