diff --git a/README.md b/README.md index 0cd4288..1ce4e49 100644 --- a/README.md +++ b/README.md @@ -384,8 +384,8 @@ total number of interrupt instructions: `2`. | **Opcode** | **Addressing Mode** | **Opcode (Hex)** | **Bytes** | **Cycles** | **Supported** | |------------|---------------------|------------------|-----------|------------|--------------------| -| BIT | Zeropage | 0x24 | 2 | 3 | :ok: | -| BIT | Absolute | 0x2c | 3 | 4 | :ok: | +| BIT | Zeropage | 0x24 | 2 | 3 | :white_check_mark: | +| BIT | Absolute | 0x2c | 3 | 4 | :white_check_mark: | | NOP | Implied | 0xEA | 1 | 2 | :white_check_mark: | total number of random instructions: `2`. diff --git a/emulator/emulator.cpp b/emulator/emulator.cpp index f47a7a6..f44fa6c 100644 --- a/emulator/emulator.cpp +++ b/emulator/emulator.cpp @@ -236,9 +236,9 @@ std::optional nop(emulator::Cpu& cpu, std::span(value | 0b1000'0000); - cpu.flags.z = static_cast(value | 0b0100'0000); - cpu.flags.c = cpu.reg.a & value; + cpu.flags.n = static_cast(value & 0b1000'0000); + cpu.flags.v = static_cast(value & 0b0100'0000); + cpu.flags.z = !static_cast(cpu.reg.a & value); } std::optional bit_zp(emulator::Cpu& cpu, std::span program) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 44d8fcf..96fc768 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -25,6 +25,7 @@ create_tests(and_indirect_indexed_tests) create_tests(and_zeropage_indexed_tests) create_tests(and_zeropage_tests) create_tests(asl_tests) +create_tests(bit_tests) create_tests(branch_tests) create_tests(cmp_tests) create_tests(cpx_tests) diff --git a/tests/bit_tests.cpp b/tests/bit_tests.cpp new file mode 100644 index 0000000..c325a07 --- /dev/null +++ b/tests/bit_tests.cpp @@ -0,0 +1,114 @@ +import emulator; + +#include "common.h" + +#include + +#include +#include + +// NOLINTNEXTLINE +TEST(BITTests, ZeropageNegativeFlag) +{ + constexpr std::array program{0x24, 0xff}; + + emulator::Cpu cpu; + cpu.reg.a = 0b1111'1111; + cpu.mem[0xff] = 0b1000'0000; + + EXPECT_EQ(emulator::execute(cpu, program), 3); + EXPECT_EQ(cpu.reg.a, 0b1111'1111); + EXPECT_EQ(cpu.reg.x, 0x00); + EXPECT_EQ(cpu.reg.y, 0x00); + EXPECT_EQ(cpu.reg.sp, 0xff); + EXPECT_EQ(cpu.reg.pc, 0x02); + EXPECT_EQ(cpu.flags, make_flags(0b1000'0000)); +} + +// NOLINTNEXTLINE +TEST(BITTests, ZeropageOverflowFlag) +{ + constexpr std::array program{0x24, 0xff}; + + emulator::Cpu cpu; + cpu.reg.a = 0b1111'1111; + cpu.mem[0xff] = 0b0100'0000; + + EXPECT_EQ(emulator::execute(cpu, program), 3); + EXPECT_EQ(cpu.reg.a, 0b1111'1111); + EXPECT_EQ(cpu.reg.x, 0x00); + EXPECT_EQ(cpu.reg.y, 0x00); + EXPECT_EQ(cpu.reg.sp, 0xff); + EXPECT_EQ(cpu.reg.pc, 0x02); + EXPECT_EQ(cpu.flags, make_flags(0b0100'0000)); +} + +// NOLINTNEXTLINE +TEST(BITTests, ZeropageZeroFlag) +{ + constexpr std::array program{0x24, 0xff}; + + emulator::Cpu cpu; + cpu.mem[0xff] = 0b0011'1111; + + EXPECT_EQ(emulator::execute(cpu, program), 3); + EXPECT_EQ(cpu.reg.a, 0x00); + EXPECT_EQ(cpu.reg.x, 0x00); + EXPECT_EQ(cpu.reg.y, 0x00); + EXPECT_EQ(cpu.reg.sp, 0xff); + EXPECT_EQ(cpu.reg.pc, 0x02); + EXPECT_EQ(cpu.flags, make_flags(0b0000'0010)); +} + +// NOLINTNEXTLINE +TEST(BITTests, AbsoluteNegativeFlag) +{ + constexpr std::array program{0x2c, 0xfe, 0xff}; + + emulator::Cpu cpu; + cpu.reg.a = 0b1111'1111; + cpu.mem[0xfffe] = 0b1000'0000; + + EXPECT_EQ(emulator::execute(cpu, program), 4); + EXPECT_EQ(cpu.reg.a, 0b1111'1111); + EXPECT_EQ(cpu.reg.x, 0x00); + EXPECT_EQ(cpu.reg.y, 0x00); + EXPECT_EQ(cpu.reg.sp, 0xff); + EXPECT_EQ(cpu.reg.pc, 0x03); + EXPECT_EQ(cpu.flags, make_flags(0b1000'0000)); +} + +// NOLINTNEXTLINE +TEST(BITTests, AbsoluteOverflowFlag) +{ + constexpr std::array program{0x2c, 0xfe, 0xff}; + + emulator::Cpu cpu; + cpu.reg.a = 0b1111'1111; + cpu.mem[0xfffe] = 0b0100'0000; + + EXPECT_EQ(emulator::execute(cpu, program), 4); + EXPECT_EQ(cpu.reg.a, 0b1111'1111); + EXPECT_EQ(cpu.reg.x, 0x00); + EXPECT_EQ(cpu.reg.y, 0x00); + EXPECT_EQ(cpu.reg.sp, 0xff); + EXPECT_EQ(cpu.reg.pc, 0x03); + EXPECT_EQ(cpu.flags, make_flags(0b0100'0000)); +} + +// NOLINTNEXTLINE +TEST(BITTests, AbsoluteZeroFlag) +{ + constexpr std::array program{0x2c, 0xfe, 0xff}; + + emulator::Cpu cpu; + cpu.mem[0xfffe] = 0b0011'1111; + + EXPECT_EQ(emulator::execute(cpu, program), 4); + EXPECT_EQ(cpu.reg.a, 0x00); + EXPECT_EQ(cpu.reg.x, 0x00); + EXPECT_EQ(cpu.reg.y, 0x00); + EXPECT_EQ(cpu.reg.sp, 0xff); + EXPECT_EQ(cpu.reg.pc, 0x03); + EXPECT_EQ(cpu.flags, make_flags(0b0000'0010)); +}