diff --git a/CMakeLists.txt b/CMakeLists.txt index 4f38620..068a71a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -95,7 +95,7 @@ add_executable(unit_tests sources/Models/Components.hpp sources/CPU/Instruction.hpp sources/Exceptions/DebuggableError.hpp -) + tests/CPU/Math/testOthersMath.cpp) # include criterion & coverage target_link_libraries(unit_tests criterion -lgcov) diff --git a/sources/CPU/Instructions/MathematicalOperations.cpp b/sources/CPU/Instructions/MathematicalOperations.cpp index 2b16056..54fa345 100644 --- a/sources/CPU/Instructions/MathematicalOperations.cpp +++ b/sources/CPU/Instructions/MathematicalOperations.cpp @@ -93,7 +93,7 @@ namespace ComSquare::CPU int CPU::DEX(uint24_t, AddressingMode) { - unsigned negativeMask = this->_registers.p.x_b ? UINT8_MAX : UINT16_MAX; + unsigned negativeMask = this->_registers.p.x_b ? 0x80 : 0x8000; this->_registers.x--; if (this->_registers.p.x_b) @@ -105,7 +105,7 @@ namespace ComSquare::CPU int CPU::DEY(uint24_t, AddressingMode) { - unsigned negativeMask = this->_registers.p.x_b ? UINT8_MAX : UINT16_MAX; + unsigned negativeMask = this->_registers.p.x_b ? 0x80 : 0x8000; this->_registers.y--; if (this->_registers.p.x_b) diff --git a/tests/CPU/Math/testOthersMath.cpp b/tests/CPU/Math/testOthersMath.cpp new file mode 100644 index 0000000..1d8ed65 --- /dev/null +++ b/tests/CPU/Math/testOthersMath.cpp @@ -0,0 +1,119 @@ +// +// Created by anonymus-raccoon on 4/3/20. +// + +#include +#include +#include "../../tests.hpp" +#include "../../../sources/SNES.hpp" +using namespace ComSquare; + +Test(DEX, simple) +{ + Init() + snes.cpu->_registers.p.x_b = true; + snes.cpu->_registers.x = 0x57; + snes.cpu->DEX(0x0, ComSquare::CPU::AddressingMode::Implied); + cr_assert_eq(snes.cpu->_registers.x, 0x56, "The x index value should be 0x56 but it was 0x%x.", snes.cpu->_registers.x); + cr_assert_eq(snes.cpu->_registers.p.n, false, "The negative flags should not be set."); + cr_assert_eq(snes.cpu->_registers.p.z, false, "The zero flags should not be set."); +} + +Test(DEX, overflowEmul) +{ + Init() + snes.cpu->_registers.p.x_b = true; + snes.cpu->_registers.x = 0; + snes.cpu->DEX(0x0, ComSquare::CPU::AddressingMode::Implied); + cr_assert_eq(snes.cpu->_registers.x, 0xFF, "The x index value should be 0xFF but it was 0x%x.", snes.cpu->_registers.x); + cr_assert_eq(snes.cpu->_registers.p.n, true, "The negative flags should be set."); + cr_assert_eq(snes.cpu->_registers.p.z, false, "The zero flags should not be set."); +} + +Test(DEX, fakeOverflowNonEmul) +{ + Init() + snes.cpu->_registers.p.x_b = false; + snes.cpu->_registers.x = 0xFF00; + snes.cpu->DEX(0x0, ComSquare::CPU::AddressingMode::Implied); + cr_assert_eq(snes.cpu->_registers.x, 0xFEFF, "The x index value should be 0xFEFF but it was 0x%x.", snes.cpu->_registers.x); + cr_assert_eq(snes.cpu->_registers.p.n, true, "The negative flags should be set."); + cr_assert_eq(snes.cpu->_registers.p.z, false, "The zero flags should not be set."); +} + +Test(DEX, nonNegative) +{ + Init() + snes.cpu->_registers.p.x_b = true; + snes.cpu->_registers.x = 0x80; + snes.cpu->DEX(0x0, ComSquare::CPU::AddressingMode::Implied); + cr_assert_eq(snes.cpu->_registers.x, 0x7F, "The x index value should be 0x7F but it was 0x%x.", snes.cpu->_registers.x); + cr_assert_eq(snes.cpu->_registers.p.n, false, "The negative flags should not be set."); + cr_assert_eq(snes.cpu->_registers.p.z, false, "The zero flags should not be set."); +} + +Test(DEX, zero) +{ + Init() + snes.cpu->_registers.p.x_b = true; + snes.cpu->_registers.x = 1; + snes.cpu->DEX(0x0, ComSquare::CPU::AddressingMode::Implied); + cr_assert_eq(snes.cpu->_registers.x, 0, "The x index value should be 0 but it was 0x%x.", snes.cpu->_registers.x); + cr_assert_eq(snes.cpu->_registers.p.n, false, "The negative flags should not be set."); + cr_assert_eq(snes.cpu->_registers.p.z, true, "The zero flags should be set."); +} + +Test(DEY, simple) +{ + Init() + snes.cpu->_registers.p.x_b = true; + snes.cpu->_registers.y = 0x57; + snes.cpu->DEY(0x0, ComSquare::CPU::AddressingMode::Implied); + cr_assert_eq(snes.cpu->_registers.y, 0x56, "The x index value should be 0x56 but it was 0x%x.", snes.cpu->_registers.y); + cr_assert_eq(snes.cpu->_registers.p.n, false, "The negative flags should not be set."); + cr_assert_eq(snes.cpu->_registers.p.z, false, "The zero flags should not be set."); +} + +Test(DEY, overflowEmul) +{ + Init() + snes.cpu->_registers.p.x_b = true; + snes.cpu->_registers.y = 0; + snes.cpu->DEY(0x0, ComSquare::CPU::AddressingMode::Implied); + cr_assert_eq(snes.cpu->_registers.y, 0xFF, "The x index value should be 0xFF but it was 0x%x.", snes.cpu->_registers.y); + cr_assert_eq(snes.cpu->_registers.p.n, true, "The negative flags should be set."); + cr_assert_eq(snes.cpu->_registers.p.z, false, "The zero flags should not be set."); +} + +Test(DEY, fakeOverflowNonEmul) +{ + Init() + snes.cpu->_registers.p.x_b = false; + snes.cpu->_registers.y = 0xFF00; + snes.cpu->DEY(0x0, ComSquare::CPU::AddressingMode::Implied); + cr_assert_eq(snes.cpu->_registers.y, 0xFEFF, "The x index value should be 0xFEFF but it was 0x%x.", snes.cpu->_registers.y); + cr_assert_eq(snes.cpu->_registers.p.n, true, "The negative flags should be set."); + cr_assert_eq(snes.cpu->_registers.p.z, false, "The zero flags should not be set."); +} + +Test(DEY, nonNegative) +{ + Init() + snes.cpu->_registers.p.x_b = true; + snes.cpu->_registers.y = 0x80; + snes.cpu->DEY(0x0, ComSquare::CPU::AddressingMode::Implied); + cr_assert_eq(snes.cpu->_registers.y, 0x7F, "The x index value should be 0x7F but it was 0x%x.", snes.cpu->_registers.y); + cr_assert_eq(snes.cpu->_registers.p.n, false, "The negative flags should not be set."); + cr_assert_eq(snes.cpu->_registers.p.z, false, "The zero flags should not be set."); +} + +Test(DEY, zero) +{ + Init() + snes.cpu->_registers.p.x_b = true; + snes.cpu->_registers.y = 1; + snes.cpu->DEY(0x0, ComSquare::CPU::AddressingMode::Implied); + cr_assert_eq(snes.cpu->_registers.y, 0, "The x index value should be 0 but it was 0x%x.", snes.cpu->_registers.y); + cr_assert_eq(snes.cpu->_registers.p.n, false, "The negative flags should not be set."); + cr_assert_eq(snes.cpu->_registers.p.z, true, "The zero flags should be set."); +} \ No newline at end of file