Files
ComSquare/tests/APU/testAPUInstructions.cpp
2021-07-06 23:35:56 +02:00

1266 lines
34 KiB
C++

//
// Created by Melefo on 11/02/2020.
//
#include <catch2/catch_test_macros.hpp>
#include <iostream>
#include <bitset>
#include "../tests.hpp"
#include "../../sources/SNES.hpp"
#include "../../sources/APU/APU.hpp"
#include "../../sources/Utility/Utility.hpp"
using namespace ComSquare;
////////////////////Init()\n\tauto apu = snes.apu
// //
// Standbys tests //
// //
////////////////////
TEST_CASE("NOP Standbys", "[Standbys]")
{
Init()
int result = 0;
result = snes.apu.NOP();
REQUIRE(result == 2);
}
TEST_CASE("SLEEP Standbys", "[Standbys]")
{
Init()
int result = 0;
result = snes.apu.SLEEP();
REQUIRE(result == 3);
REQUIRE(snes.apu._state == APU::Sleeping);
}
TEST_CASE("STOP Standbys", "[Standbys]")
{
Init()
int result = 0;
result = snes.apu.STOP();
REQUIRE(result == 3);
REQUIRE(snes.apu._state == APU::Stopped);
}
///////////////
// //
// PSW tests //
// //
///////////////
TEST_CASE("CLRC PSW", "[PSW]")
{
Init()
int result = 0;
result = snes.apu.CLRC();
REQUIRE(result == 2);
REQUIRE(snes.apu._internalRegisters.c == false);
}
TEST_CASE("SETC PSW", "[PSW]")
{
Init()
int result = 0;
result = snes.apu.SETC();
REQUIRE(result == 2);
REQUIRE(snes.apu._internalRegisters.c == true);
}
TEST_CASE("NOTC PSW", "[PSW]")
{
Init()
int result = 0;
snes.apu._internalRegisters.c = false;
result = snes.apu.NOTC();
REQUIRE(result == 3);
REQUIRE(snes.apu._internalRegisters.c == true);
}
TEST_CASE("CLRV PSW", "[PSW]")
{
Init()
int result = 0;
result = snes.apu.CLRV();
REQUIRE(result == 2);
REQUIRE(snes.apu._internalRegisters.v == false);
REQUIRE(snes.apu._internalRegisters.h == false);
}
TEST_CASE("CLRP PSW", "[PSW]")
{
Init()
int result = 0;
result = snes.apu.CLRP();
REQUIRE(result == 2);
REQUIRE(snes.apu._internalRegisters.p == false);
}
TEST_CASE("SETP PSW", "[PSW]")
{
Init()
int result = 0;
result = snes.apu.SETP();
REQUIRE(result == 2);
REQUIRE(snes.apu._internalRegisters.p == true);
}
TEST_CASE("EI PSW", "[PSW]")
{
Init()
int result = 0;
result = snes.apu.EI();
REQUIRE(result == 3);
REQUIRE(snes.apu._internalRegisters.i == true);
}
TEST_CASE("DI PSW", "[PSW]")
{
Init()
int result = 0;
result = snes.apu.DI();
REQUIRE(result == 3);
REQUIRE(snes.apu._internalRegisters.i == false);
}
///////////////
// //
// Bit tests //
// //
///////////////
TEST_CASE("SET1 Bit", "[Bit]")
{
Init()
int result = 0;
snes.apu._internalRegisters.pc = 0x32;
snes.apu._internalWrite(snes.apu._getDirectAddr(), 0b00000000);
snes.apu._internalRegisters.pc--;
result = snes.apu.SET1(snes.apu._getDirectAddr(), 0);
snes.apu._internalRegisters.pc--;
REQUIRE(result == 4);
REQUIRE(snes.apu._internalRead(snes.apu._getDirectAddr()) == 1);
}
TEST_CASE("CLR1 Bit", "[Bit]")
{
Init()
int result = 0;
snes.apu._internalRegisters.pc = 0x32;
snes.apu._internalWrite(snes.apu._getDirectAddr(), 0b11111111);
snes.apu._internalRegisters.pc--;
result = snes.apu.CLR1(snes.apu._getDirectAddr(), 0);
snes.apu._internalRegisters.pc--;
REQUIRE(result == 4);
REQUIRE(snes.apu._internalRead(snes.apu._getDirectAddr()) == 0b11111110);
}
TEST_CASE("TSET1 Bit", "[Bit]")
{
Init()
int result = 0;
snes.apu._internalRegisters.a = 42;
snes.apu._internalRegisters.pc = 0x32;
snes.apu._internalWrite(0x32, 0b00001111);
snes.apu._internalWrite(0x33, 0b11110000);
snes.apu._internalWrite(snes.apu._getAbsoluteAddr(), 123);
snes.apu._internalRegisters.pc -= 2;
result = snes.apu.TSET1(snes.apu._getAbsoluteAddr());
snes.apu._internalRegisters.pc -= 2;
REQUIRE(snes.apu._internalRead(snes.apu._getAbsoluteAddr()) == 0x7B);
REQUIRE(result == 6);
}
TEST_CASE("TCLR1 Bit", "[Bit]")
{
Init()
int result = 0;
snes.apu._internalRegisters.a = 0x80;
snes.apu._internalRegisters.pc = 0x32;
snes.apu._internalWrite(0x32, 0b00001111);
snes.apu._internalWrite(0x33, 0b11110000);
snes.apu._internalWrite(snes.apu._getAbsoluteAddr(), 0x80);
snes.apu._internalRegisters.pc -= 2;
result = snes.apu.TCLR1(snes.apu._getAbsoluteAddr());
snes.apu._internalRegisters.pc -= 2;
REQUIRE(snes.apu._internalRead(snes.apu._getAbsoluteAddr()) == 0x00);
REQUIRE(result == 6);
}
TEST_CASE("AND1 Bit", "[Bit]")
{
Init()
int result = 0;
snes.apu._internalRegisters.a = 42;
snes.apu._internalRegisters.pc = 0x32;
snes.apu._internalWrite(0x32, 0b00001111);
snes.apu._internalWrite(0x33, 0b11110000);
snes.apu._internalWrite(snes.apu._getAbsoluteAddr() & 0x1FFFu, 123);
snes.apu._internalRegisters.pc -= 2;
result = snes.apu.AND1(snes.apu._getAbsoluteBit());
snes.apu._internalRegisters.pc -= 2;
REQUIRE(snes.apu._internalRegisters.c == false);
REQUIRE(result == 4);
}
TEST_CASE("AND1_invert Bit", "[Bit]")
{
Init()
int result = 0;
snes.apu._internalRegisters.a = 42;
snes.apu._internalRegisters.pc = 0x32;
snes.apu._internalWrite(0x32, 0b00001111);
snes.apu._internalWrite(0x33, 0b11110000);
snes.apu._internalWrite(snes.apu._getAbsoluteAddr() & 0x1FFFu, 123);
snes.apu._internalRegisters.pc -= 2;
result = snes.apu.AND1(snes.apu._getAbsoluteBit(), true);
snes.apu._internalRegisters.pc -= 2;
REQUIRE(snes.apu._internalRegisters.c == false);
REQUIRE(result == 4);
}
TEST_CASE("OR1 Bit", "[Bit]")
{
Init()
int result = 0;
snes.apu._internalRegisters.a = 42;
snes.apu._internalRegisters.pc = 0x32;
snes.apu._internalWrite(0x32, 0b00001111);
snes.apu._internalWrite(0x33, 0b11110000);
snes.apu._internalWrite(snes.apu._getAbsoluteAddr() & 0x1FFFu, 123);
snes.apu._internalRegisters.pc -= 2;
result = snes.apu.OR1(snes.apu._getAbsoluteBit());
snes.apu._internalRegisters.pc -= 2;
REQUIRE(snes.apu._internalRegisters.c == false);
REQUIRE(result == 5);
}
TEST_CASE("OR1_invert Bit", "[Bit]")
{
Init()
int result = 0;
snes.apu._internalRegisters.a = 42;
snes.apu._internalRegisters.pc = 0x32;
snes.apu._internalWrite(0x32, 0b00001111);
snes.apu._internalWrite(0x33, 0b11110000);
snes.apu._internalWrite(snes.apu._getAbsoluteAddr() & 0x1FFFu, 123);
snes.apu._internalRegisters.pc -= 2;
result = snes.apu.OR1(snes.apu._getAbsoluteBit(), true);
snes.apu._internalRegisters.pc -= 2;
REQUIRE(snes.apu._internalRegisters.c == true);
REQUIRE(result == 5);
}
TEST_CASE("EOR1 Bit", "[Bit]")
{
Init()
int result = 0;
snes.apu._internalRegisters.a = 42;
snes.apu._internalRegisters.pc = 0x32;
snes.apu._internalWrite(0x32, 0b00001111);
snes.apu._internalWrite(0x33, 0b11110000);
snes.apu._internalWrite(snes.apu._getAbsoluteAddr() & 0x1FFFu, 123);
snes.apu._internalRegisters.pc -= 2;
result = snes.apu.EOR1(snes.apu._getAbsoluteBit());
snes.apu._internalRegisters.pc -= 2;
REQUIRE(snes.apu._internalRegisters.c == false);
REQUIRE(result == 5);
}
TEST_CASE("NOT1 Bit", "[Bit]")
{
Init()
int result = 0;
snes.apu._internalRegisters.a = 42;
snes.apu._internalRegisters.pc = 0x32;
snes.apu._internalWrite(0x32, 0b00001111);
snes.apu._internalWrite(0x33, 0b11110000);
snes.apu._internalWrite(snes.apu._getAbsoluteAddr() & 0x1FFFu, 123);
snes.apu._internalRegisters.pc -= 2;
result = snes.apu.NOT1(snes.apu._getAbsoluteBit());
snes.apu._internalRegisters.pc -= 2;
REQUIRE(snes.apu._internalRegisters.c == false);
REQUIRE(result == 5);
}
TEST_CASE("MOV1 Bit", "[Bit]")
{
Init()
int result = 0;
snes.apu._internalRegisters.a = 42;
snes.apu._internalRegisters.pc = 0x32;
snes.apu._internalWrite(0x32, 0b00001111);
snes.apu._internalWrite(0x33, 0b11110000);
snes.apu._internalWrite(snes.apu._getAbsoluteAddr() & 0x1FFFu, 123);
snes.apu._internalRegisters.pc -= 2;
result = snes.apu.MOV1(snes.apu._getAbsoluteBit());
snes.apu._internalRegisters.pc -= 2;
REQUIRE(snes.apu._internalRead(snes.apu._getAbsoluteAddr() & 0x1FFFu) == 123);
REQUIRE(result == 6);
}
TEST_CASE("MOV1_carry Bit", "[Bit]")
{
Init()
int result = 0;
snes.apu._internalRegisters.a = 42;
snes.apu._internalRegisters.pc = 0x32;
snes.apu._internalWrite(0x32, 0b00001111);
snes.apu._internalWrite(0x33, 0b11110000);
snes.apu._internalWrite(snes.apu._getAbsoluteAddr() & 0x1FFFu, 123);
snes.apu._internalRegisters.pc -= 2;
result = snes.apu.MOV1(snes.apu._getAbsoluteBit(), true);
snes.apu._internalRegisters.pc -= 2;
REQUIRE(snes.apu._internalRegisters.c == false);
REQUIRE(result == 4);
}
/////////////////
// //
// Stack tests //
// //
/////////////////
TEST_CASE("PUSH Stack", "[Stack]")
{
Init()
int result = 0;
snes.apu._internalRegisters.a = 56;
result = snes.apu.PUSH(snes.apu._internalRegisters.a);
snes.apu._internalRegisters.sp++;
REQUIRE(result == 4);
REQUIRE(snes.apu._internalRead(snes.apu._internalRegisters.sp | 0x100u) == 56);
}
TEST_CASE("POP Stack", "[Stack]")
{
Init()
int result = 0;
snes.apu._internalWrite(++snes.apu._internalRegisters.sp | 0x100u, 82);
snes.apu._internalRegisters.sp--;
result = snes.apu.POP(snes.apu._internalRegisters.y);
REQUIRE(result == 4);
REQUIRE(snes.apu._internalRegisters.y == 82);
}
//////////////////////
// //
// Subroutine tests //
// //
//////////////////////
TEST_CASE("CALL Subroutine", "[Subroutine]")
{
Init()
int result = 0;
snes.apu._internalRegisters.pc = 0;
snes.apu._internalWrite(snes.apu._getAbsoluteAddr(), 23);
snes.apu._internalRegisters.pc -= 2;
result = snes.apu.CALL(snes.apu._getAbsoluteAddr());
REQUIRE(result == 8);
REQUIRE(snes.apu._internalRegisters.pc == 23);
REQUIRE(snes.apu._internalRead(++snes.apu._internalRegisters.sp + 0x0100u) == 2);
REQUIRE(snes.apu._internalRead(++snes.apu._internalRegisters.sp + 0x0100u) == 0);
}
TEST_CASE("PCALL Subroutine", "[Subroutine]")
{
Init()
int result = 0;
snes.apu._internalWrite(snes.apu._internalRegisters.pc, 123);
result = snes.apu.PCALL();
REQUIRE(result == 6);
REQUIRE(snes.apu._internalRegisters.pc == 65403);
}
TEST_CASE("TCALL Subroutine", "[Subroutine]")
{
Init()
int result = 0;
snes.apu._internalWrite(0xFFD0, 45);
result = snes.apu.TCALL(7);
REQUIRE(result == 8);
REQUIRE(snes.apu._internalRegisters.pc == 45);
}
TEST_CASE("BRK Subroutine", "[Subroutine]")
{
Init()
int result = 0;
snes.apu._internalRegisters.pch = 0xFF;
snes.apu._internalRegisters.pcl = 0xEE;
snes.apu._internalRegisters.psw = 0xDD;
snes.apu._internalWrite(0xFFDF, 0xAA);
snes.apu._internalWrite(0xFFDE, 0xBB);
result = snes.apu.BRK();
snes.apu._internalRegisters.sp += 3;
REQUIRE(result == 8);
REQUIRE(snes.apu._internalRegisters.i == false);
REQUIRE(snes.apu._internalRegisters.b == true);
REQUIRE(snes.apu._internalRegisters.pc == 0xAABB);
REQUIRE(snes.apu._internalRead(snes.apu._internalRegisters.sp-- | 0x100u) == 0xFF);
REQUIRE(snes.apu._internalRead(snes.apu._internalRegisters.sp-- | 0x100u) == 0xEE);
REQUIRE(snes.apu._internalRead(snes.apu._internalRegisters.sp | 0x100u) == 0xDD);
}
TEST_CASE("RET Subroutine", "[Subroutine]")
{
Init()
int result = 0;
snes.apu._internalWrite(++snes.apu._internalRegisters.sp | 0x100u, 0x12);
snes.apu._internalWrite(++snes.apu._internalRegisters.sp | 0x100u, 0x34);
snes.apu._internalRegisters.sp -= 2;
result = snes.apu.RET();
REQUIRE(result == 5);
REQUIRE(snes.apu._internalRegisters.pch == 0x12);
REQUIRE(snes.apu._internalRegisters.pcl == 0x34);
}
TEST_CASE("RETI Subroutine", "[Subroutine]")
{
Init()
int result = 0;
snes.apu._internalWrite(++snes.apu._internalRegisters.sp | 0x100u, 0x12);
snes.apu._internalWrite(++snes.apu._internalRegisters.sp | 0x100u, 0x34);
snes.apu._internalWrite(++snes.apu._internalRegisters.sp | 0x100u, 0x56);
snes.apu._internalRegisters.sp -= 3;
result = snes.apu.RETI();
REQUIRE(result == 6);
REQUIRE(snes.apu._internalRegisters.psw == 0x12);
REQUIRE(snes.apu._internalRegisters.pch == 0x34);
REQUIRE(snes.apu._internalRegisters.pcl == 0x56);
}
////////////////////////
// //
// Program Flow tests //
// //
////////////////////////
TEST_CASE("BRA ProgramFlow", "[ProgramFlow]")
{
Init()
int result = 0;
snes.apu._internalRegisters.pc = 0;
snes.apu._internalWrite(snes.apu._internalRegisters.pc, 23);
result = snes.apu.BRA(snes.apu._getImmediateData());
REQUIRE(result == 4);
REQUIRE(snes.apu._internalRegisters.pc == 24);
}
TEST_CASE("BEQ ProgramFlow", "[ProgramFlow]")
{
Init()
int result = 0;
snes.apu._internalRegisters.pc = 0;
snes.apu._internalWrite(snes.apu._internalRegisters.pc + 1, 23);
result = snes.apu.BEQ(snes.apu._getImmediateData());
REQUIRE(result == 2);
snes.apu._internalRegisters.z = true;
result = snes.apu.BEQ(snes.apu._getImmediateData());
REQUIRE(result == 4);
REQUIRE(snes.apu._internalRegisters.pc == 25);
}
TEST_CASE("BNE ProgramFlow", "[ProgramFlow]")
{
Init()
int result = 0;
snes.apu._internalRegisters.pc = 0;
snes.apu._internalWrite(snes.apu._internalRegisters.pc + 1, 23);
snes.apu._internalRegisters.z = true;
result = snes.apu.BNE(snes.apu._getImmediateData());
REQUIRE(result == 2);
snes.apu._internalRegisters.z = false;
result = snes.apu.BNE(snes.apu._getImmediateData());
REQUIRE(result == 4);
REQUIRE(snes.apu._internalRegisters.pc == 25);
}
TEST_CASE("BCS ProgramFlow", "[ProgramFlow]")
{
Init()
int result = 0;
snes.apu._internalRegisters.pc = 0;
snes.apu._internalWrite(snes.apu._internalRegisters.pc + 1, 23);
result = snes.apu.BCS(snes.apu._getImmediateData());
REQUIRE(result == 2);
snes.apu._internalRegisters.c = true;
result = snes.apu.BCS(snes.apu._getImmediateData());
REQUIRE(result == 4);
REQUIRE(snes.apu._internalRegisters.pc == 25);
}
TEST_CASE("BCC ProgramFlow", "[ProgramFlow]")
{
Init()
int result = 0;
snes.apu._internalRegisters.pc = 0;
snes.apu._internalWrite(snes.apu._internalRegisters.pc + 1, 23);
snes.apu._internalRegisters.c = true;
result = snes.apu.BCC(snes.apu._getImmediateData());
REQUIRE(result == 2);
snes.apu._internalRegisters.c = false;
result = snes.apu.BCC(snes.apu._getImmediateData());
REQUIRE(result == 4);
REQUIRE(snes.apu._internalRegisters.pc == 25);
}
TEST_CASE("BVS ProgramFlow", "[ProgramFlow]")
{
Init()
int result = 0;
snes.apu._internalRegisters.pc = 0;
snes.apu._internalWrite(snes.apu._internalRegisters.pc + 1, 23);
result = snes.apu.BVS(snes.apu._getImmediateData());
REQUIRE(result == 2);
snes.apu._internalRegisters.v = true;
result = snes.apu.BVS(snes.apu._getImmediateData());
REQUIRE(result == 4);
REQUIRE(snes.apu._internalRegisters.pc == 25);
}
TEST_CASE("BVC ProgramFlow", "[ProgramFlow]")
{
Init()
int result = 0;
snes.apu._internalRegisters.pc = 0;
snes.apu._internalWrite(snes.apu._internalRegisters.pc + 1, 23);
snes.apu._internalRegisters.v = true;
result = snes.apu.BVC(snes.apu._getImmediateData());
REQUIRE(result == 2);
snes.apu._internalRegisters.v = false;
result = snes.apu.BVC(snes.apu._getImmediateData());
REQUIRE(result == 4);
REQUIRE(snes.apu._internalRegisters.pc == 25);
}
TEST_CASE("BMI ProgramFlow", "[ProgramFlow]")
{
Init()
int result = 0;
snes.apu._internalRegisters.pc = 0;
snes.apu._internalWrite(snes.apu._internalRegisters.pc + 1, 23);
result = snes.apu.BMI(snes.apu._getImmediateData());
REQUIRE(result == 2);
snes.apu._internalRegisters.n = true;
result = snes.apu.BMI(snes.apu._getImmediateData());
REQUIRE(result == 4);
REQUIRE(snes.apu._internalRegisters.pc == 25);
}
TEST_CASE("BPL ProgramFlow", "[ProgramFlow]")
{
Init()
int result = 0;
snes.apu._internalRegisters.pc = 0;
snes.apu._internalWrite(snes.apu._internalRegisters.pc + 1, 23);
snes.apu._internalRegisters.n = true;
result = snes.apu.BPL(snes.apu._getImmediateData());
REQUIRE(result == 2);
snes.apu._internalRegisters.n = false;
result = snes.apu.BPL(snes.apu._getImmediateData());
REQUIRE(result == 4);
REQUIRE(snes.apu._internalRegisters.pc == 25);
}
TEST_CASE("BBS ProgramFlow", "[ProgramFlow]")
{
Init()
int result = 0;
snes.apu._internalRegisters.pc = 0;
snes.apu._internalWrite(snes.apu._internalRegisters.pc + 1, 23);
snes.apu._internalWrite(23, 0);
result = snes.apu.BBS(snes.apu._getDirectAddr(), snes.apu._getImmediateData(), 2);
REQUIRE(result == 5);
snes.apu._internalRegisters.pc = 0;
snes.apu._internalWrite(snes.apu._internalRegisters.pc, 10);
snes.apu._internalWrite(23, 100);
result = snes.apu.BBS(snes.apu._getDirectAddr(), snes.apu._getImmediateData(), 2);
REQUIRE(result == 7);
REQUIRE(snes.apu._internalRegisters.pc == 12);
}
TEST_CASE("BBC ProgramFlow", "[ProgramFlow]")
{
Init()
int result = 0;
snes.apu._internalRegisters.pc = 0;
snes.apu._internalWrite(snes.apu._internalRegisters.pc + 1, 10);
snes.apu._internalWrite(10, 255);
result = snes.apu.BBC(snes.apu._getDirectAddr(), snes.apu._getImmediateData(), 2);
REQUIRE(result == 5);
snes.apu._internalRegisters.pc = 0;
snes.apu._internalWrite(snes.apu._internalRegisters.pc, 10);
snes.apu._internalWrite(snes.apu._internalRegisters.pc + 1, 0);
result = snes.apu.BBC(snes.apu._getDirectAddr(), snes.apu._getImmediateData(), 2);
REQUIRE(result == 7);
REQUIRE(snes.apu._internalRegisters.pc == 12);
}
TEST_CASE("CBNE ProgramFlow", "[ProgramFlow]")
{
Init()
int result = 0;
snes.apu._internalRegisters.pc = 0;
snes.apu._internalRegisters.a = 4;
snes.apu._internalWrite(snes.apu._internalRegisters.pc + 1, 10);
snes.apu._internalWrite(10, 4);
result = snes.apu.CBNE(snes.apu._getDirectAddr(), snes.apu._getImmediateData());
REQUIRE(result == 5);
snes.apu._internalRegisters.pc = 0;
snes.apu._internalRegisters.a = 0;
snes.apu._internalWrite(snes.apu._internalRegisters.pc, 10);
result = snes.apu.CBNE(snes.apu._getDirectAddrByX(), snes.apu._getImmediateData(), true);
REQUIRE(result == 8);
REQUIRE(snes.apu._internalRegisters.pc == 12);
}
TEST_CASE("DBNZ ProgramFlow", "[ProgramFlow]")
{
Init()
int result = 0;
snes.apu._internalRegisters.pc = 0;
snes.apu._internalRegisters.y = 1;
result = snes.apu.DBNZ(snes.apu._getImmediateData());
REQUIRE(result == 4);
snes.apu._internalWrite(snes.apu._internalRegisters.pc, 10);
snes.apu._internalWrite(snes.apu._internalRegisters.pc + 1, 5);
snes.apu._internalWrite(5, 55);
result = snes.apu.DBNZ(snes.apu._getImmediateData(), true);
REQUIRE(result == 7);
REQUIRE( snes.apu._internalRead(5) == 54);
REQUIRE(snes.apu._internalRegisters.pc == 13);
}
TEST_CASE("JMP ProgramFlow", "[ProgramFlow]")
{
Init()
int result = 0;
snes.apu._internalRegisters.pc = 0x32;
snes.apu._internalWrite(0x32, 0b00001111);
snes.apu._internalWrite(0x33, 0b11110000);
result = snes.apu.JMP(snes.apu._getAbsoluteAddr());
REQUIRE(result == 3);
REQUIRE(snes.apu._internalRegisters.pc == 61455);
snes.apu._internalRegisters.pc = 0x32;
snes.apu._internalRegisters.x = 0b000000001;
snes.apu._internalWrite(0b1111000000001111 + 1, 0b00010000);
snes.apu._internalWrite(0b1111000000001111 + 2, 0b11110001);
result = snes.apu.JMP(snes.apu._getAbsoluteByXAddr(), true);
REQUIRE(result == 6);
REQUIRE(snes.apu._internalRegisters.pc == 61712);
}
////////////////////////////////
// //
// Decimal Compensation tests //
// //
////////////////////////////////
TEST_CASE("DAA DecimalCompensation", "[DecimalCompensation]")
{
Init()
int result = 0;
snes.apu._internalRegisters.c = true;
snes.apu._internalRegisters.h = true;
snes.apu._internalRegisters.a = 0x1A;
result = snes.apu.DAA();
REQUIRE(result == 3);
REQUIRE(snes.apu._internalRegisters.a == 0x80);
}
TEST_CASE("DAS DecimalCompensation", "[DecimalCompensation]")
{
Init()
int result = 0;
snes.apu._internalRegisters.c = false;
snes.apu._internalRegisters.h = false;
snes.apu._internalRegisters.a = 0xFF;
result = snes.apu.DAS();
REQUIRE(result == 3);
REQUIRE(snes.apu._internalRegisters.a == 0x99);
}
///////////////////////////////////
// //
// Multiplication Division tests //
// //
///////////////////////////////////
TEST_CASE("MUL MultiplicationDivision", "[MultiplicationDivision]")
{
Init()
int result = 0;
snes.apu._internalRegisters.a = 10;
snes.apu._internalRegisters.y = 23;
result = snes.apu.MUL();
REQUIRE(result == 9);
REQUIRE(snes.apu._internalRegisters.ya == 230);
}
TEST_CASE("DIV MultiplicationDivision", "[MultiplicationDivision]")
{
Init()
int result = 0;
snes.apu._internalRegisters.ya = 235;
snes.apu._internalRegisters.x = 10;
result = snes.apu.DIV();
REQUIRE(result == 12);
REQUIRE(snes.apu._internalRegisters.y == 5);
REQUIRE(snes.apu._internalRegisters.a == 23);
snes.apu._internalRegisters.ya = 12345;
snes.apu._internalRegisters.x = 2;
result = snes.apu.DIV();
REQUIRE(snes.apu._internalRegisters.y == 147);
REQUIRE(snes.apu._internalRegisters.a == 211);
}
//////////////////////////////////
// //
// (XVI)16-bit Arithmetic tests //
// //
//////////////////////////////////
TEST_CASE("INCW XVIbitArithmetic", "[XVIbitArithmetic]")
{
Init()
int result = 0;
snes.apu._internalWrite(snes.apu._internalRegisters.pc, 0x55);
snes.apu._internalWrite(0x55, 0xFF);
snes.apu._internalWrite(0x55 + 1, 0x22);
result = snes.apu.INCW(snes.apu._getDirectAddr());
REQUIRE(result == 6);
REQUIRE(snes.apu._internalRead(0x55) == 0x00);
REQUIRE(snes.apu._internalRead(0x55 + 1) == 0x23);
}
TEST_CASE("DECW XVIbitArithmetic", "[XVIbitArithmetic]")
{
Init()
int result = 0;
snes.apu._internalWrite(snes.apu._internalRegisters.pc, 0x55);
snes.apu._internalWrite(0x55, 0x00);
snes.apu._internalWrite(0x55 + 1, 0x23);
result = snes.apu.DECW(snes.apu._getDirectAddr());
REQUIRE(result == 6);
REQUIRE(snes.apu._internalRead(0x55) == 0xFF);
REQUIRE(snes.apu._internalRead(0x55 + 1) == 0x22);
}
TEST_CASE("ADDW XVIbitArithmetic", "[XVIbitArithmetic]")
{
Init()
int result = 0;
snes.apu._internalRegisters.ya = 0x4321;
snes.apu._internalWrite(snes.apu._internalRegisters.pc, 0x55);
snes.apu._internalWrite(0x55, 0x11);
snes.apu._internalWrite(0x55 + 1, 0x22);
result = snes.apu.ADDW(snes.apu._getDirectAddr());
REQUIRE(result == 5);
REQUIRE(snes.apu._internalRegisters.ya == 0x6532);
REQUIRE(snes.apu._internalRegisters.v == false);
REQUIRE(snes.apu._internalRegisters.h == false);
REQUIRE(snes.apu._internalRegisters.c == false);
}
TEST_CASE("SUBW XVIbitArithmetic", "[XVIbitArithmetic]")
{
Init()
int result = 0;
snes.apu._internalRegisters.ya = 0x4321;
snes.apu._internalWrite(snes.apu._internalRegisters.pc, 0x55);
snes.apu._internalWrite(0x55, 0x11);
snes.apu._internalWrite(0x55 + 1, 0x22);
result = snes.apu.SUBW(snes.apu._getDirectAddr());
REQUIRE(result == 5);
REQUIRE(snes.apu._internalRegisters.ya == 0x2110);
REQUIRE(snes.apu._internalRegisters.v == false);
REQUIRE(snes.apu._internalRegisters.h == true);
REQUIRE(snes.apu._internalRegisters.c == true);
}
TEST_CASE("CMPW XVIbitArithmetic", "[XVIbitArithmetic]")
{
Init()
int result = 0;
snes.apu._internalRegisters.ya = 0x2211;
snes.apu._internalWrite(snes.apu._internalRegisters.pc, 0x55);
snes.apu._internalWrite(0x55, 0x11);
snes.apu._internalWrite(0x55 + 1, 0x22);
result = snes.apu.CMPW(snes.apu._getDirectAddr());
REQUIRE(result == 4);
REQUIRE(snes.apu._internalRegisters.c == true);
}
/////////////////////////////////////////
// //
// (XVI)16-bit Data Transmission tests //
// //
/////////////////////////////////////////
TEST_CASE("MOVW XVIbitDataTransmission", "[XVIbitDataTransmission]")
{
Init()
int result = 0;
snes.apu._internalRegisters.pc = 0;
snes.apu._internalRegisters.ya = 0x2211;
snes.apu._internalWrite(snes.apu._internalRegisters.pc, 0x55);
result = snes.apu.MOVW(snes.apu._getDirectAddr());
REQUIRE(result == 5);
REQUIRE(snes.apu._internalRead(0x55) == 0x11);
REQUIRE(snes.apu._internalRead(0x56) == 0x22);
snes.apu._internalRegisters.ya = 0x0000;
snes.apu._internalRegisters.pc = 0;
snes.apu._internalWrite(0x55, 0x33);
snes.apu._internalWrite(0x55 + 1, 0x44);
snes.apu.MOVW(snes.apu._getDirectAddr(), true);
REQUIRE(snes.apu._internalRegisters.ya == 0x4433);
}
//////////////////////////////////////
// //
// (VIII)8-bit Shift Rotation tests //
// //
//////////////////////////////////////
TEST_CASE("ASL VIIIbitShiftRotation", "[VIIIbitShiftRotation]")
{
Init()
int result = 0;
snes.apu._internalRegisters.a = 0x66;
result = snes.apu.ASL(snes.apu._internalRegisters.a, 2, true);
REQUIRE(result == 2);
REQUIRE(snes.apu._internalRegisters.a == 0xCC);
REQUIRE(snes.apu._internalRegisters.c == false);
snes.apu._internalWrite(snes.apu._internalRegisters.pc, 0x55);
snes.apu._internalWrite(0x55, 0xDD);
result = snes.apu.ASL(snes.apu._getDirectAddr(), 5);
REQUIRE(result == 5);
REQUIRE(snes.apu._internalRead(0x55) == 0xBA);
REQUIRE(snes.apu._internalRegisters.c == true);
}
TEST_CASE("LSR VIIIbitShiftRotation", "[VIIIbitShiftRotation]")
{
Init()
int result = 0;
snes.apu._internalRegisters.a = 0x66;
result = snes.apu.LSR(snes.apu._internalRegisters.a, 2, true);
REQUIRE(result == 2);
REQUIRE(snes.apu._internalRegisters.a == 0x33);
REQUIRE(snes.apu._internalRegisters.c == false);
snes.apu._internalWrite(snes.apu._internalRegisters.pc, 0x55);
snes.apu._internalWrite(0x55, 0xDD);
result = snes.apu.LSR(snes.apu._getDirectAddr(), 5);
REQUIRE(result == 5);
REQUIRE(snes.apu._internalRead(0x55) == 0x6E);
REQUIRE(snes.apu._internalRegisters.c == true);
}
TEST_CASE("ROL VIIIbitShiftRotation", "[VIIIbitShiftRotation]")
{
Init()
int result = 0;
snes.apu._internalRegisters.a = 0x66;
result = snes.apu.ROL(snes.apu._internalRegisters.a, 2, true);
REQUIRE(result == 2);
REQUIRE(snes.apu._internalRegisters.a == 0xCC);
REQUIRE(snes.apu._internalRegisters.c == false);
snes.apu._internalWrite(snes.apu._internalRegisters.pc, 0x55);
snes.apu._internalWrite(0x55, 0xDD);
result = snes.apu.ROL(snes.apu._getDirectAddr(), 5);
REQUIRE(result == 5);
REQUIRE(snes.apu._internalRead(0x55) == 0xBA);
REQUIRE(snes.apu._internalRegisters.c == true);
}
TEST_CASE("ROR VIIIbitShiftRotation", "[VIIIbitShiftRotation]")
{
Init()
int result = 0;
snes.apu._internalRegisters.a = 0x66;
result = snes.apu.ROR(snes.apu._internalRegisters.a, 2, true);
REQUIRE(result == 2);
REQUIRE(snes.apu._internalRegisters.a == 0x33);
REQUIRE(snes.apu._internalRegisters.c == false);
snes.apu._internalWrite(snes.apu._internalRegisters.pc, 0x55);
snes.apu._internalWrite(0x55, 0xDD);
result = snes.apu.ROR(snes.apu._getDirectAddr(), 5);
REQUIRE(result == 5);
REQUIRE(snes.apu._internalRead(0x55) == 0x6E);
REQUIRE(snes.apu._internalRegisters.c == true);
}
TEST_CASE("XCN VIIIShiftRotation", "[VIIIShiftRotation]")
{
Init()
int result = 0;
snes.apu._internalRegisters.a = 0b10101010;
result = snes.apu.XCN();
REQUIRE(result == 5);
REQUIRE(snes.apu._internalRegisters.a == 0xAA);
}
///////////////////////////////////////////
// //
// (VIII)8-bit Increment Decrement tests //
// //
///////////////////////////////////////////
TEST_CASE("INC VIIIbitIncrementDecrement", "[VIIIbitIncrementDecrement]")
{
Init()
int result = 0;
snes.apu._internalWrite(snes.apu._internalRegisters.pc, 0x55);
snes.apu._internalWrite(0x55, 0xDD);
result = snes.apu.INC(snes.apu._getDirectAddr(), 4);
REQUIRE(result == 4);
REQUIRE(snes.apu._internalRead(0x55) == 0xDE);
}
TEST_CASE("INCreg VIIIbitIncrementDecrement", "[VIIIbitIncrementDecrement]")
{
Init()
int result = 0;
snes.apu._internalRegisters.a = 0x76;
result = snes.apu.INCreg(snes.apu._internalRegisters.a);
REQUIRE(result == 2);
REQUIRE(snes.apu._internalRegisters.a == 0x77);
}
TEST_CASE("DEC VIIIbitIncrementDecrement", "[VIIIbitIncrementDecrement]")
{
Init()
int result = 0;
snes.apu._internalWrite(snes.apu._internalRegisters.pc, 0x55);
snes.apu._internalWrite(0x55, 0xDD);
result = snes.apu.DEC(snes.apu._getDirectAddr(), 4);
REQUIRE(result == 4);
REQUIRE(snes.apu._internalRead(0x55) == 0xDC);
}
TEST_CASE("DECreg VIIIbitIncrementDecrement", "[VIIIbitIncrementDecrement]")
{
Init()
int result = 0;
snes.apu._internalRegisters.a = 0x76;
result = snes.apu.DECreg(snes.apu._internalRegisters.a);
REQUIRE(result == 2);
REQUIRE(snes.apu._internalRegisters.a == 0x75);
}
///////////////////////////////
// //
// (VIII)8-bit Logical tests //
// //
///////////////////////////////
TEST_CASE("ANDacc VIIILogical", "[VIIILogical]")
{
Init()
int result = 0;
snes.apu._internalRegisters.x = 4;
snes.apu._internalRegisters.a = 24;
snes.apu._internalWrite(4, 23);
result = snes.apu.ANDacc(snes.apu._getIndexXAddr(), 3);
REQUIRE(result == 3);
REQUIRE(snes.apu._internalRegisters.a == 16);
}
TEST_CASE("AND VIIILogical", "[VIIILogical]")
{
Init()
int result = 0;
snes.apu._internalRegisters.x = 4;
snes.apu._internalRegisters.y = 7;
snes.apu._internalWrite(4, 12);
snes.apu._internalWrite(7, 44);
result = snes.apu.AND(snes.apu._getIndexXAddr(), snes.apu._getIndexYAddr(), 5);
REQUIRE(result == 5);
REQUIRE(snes.apu._internalRead(4) == 12);
}
TEST_CASE("ORacc VIIILogical", "[VIIILogical]")
{
Init()
int result = 0;
snes.apu._internalRegisters.x = 4;
snes.apu._internalRegisters.a = 24;
snes.apu._internalWrite(4, 23);
result = snes.apu.ORacc(snes.apu._getIndexXAddr(), 3);
REQUIRE(result == 3);
REQUIRE(snes.apu._internalRegisters.a == 31);
}
TEST_CASE("OR VIIILogical", "[VIIILogical]")
{
Init()
int result = 0;
snes.apu._internalRegisters.x = 4;
snes.apu._internalRegisters.y = 7;
snes.apu._internalWrite(4, 12);
snes.apu._internalWrite(7, 44);
result = snes.apu.OR(snes.apu._getIndexXAddr(), snes.apu._getIndexYAddr(), 5);
REQUIRE(result == 5);
REQUIRE(snes.apu._internalRead(4) == 44);
}
TEST_CASE("EORacc VIIILogical", "[VIIILogical]")
{
Init()
int result = 0;
snes.apu._internalRegisters.x = 4;
snes.apu._internalRegisters.a = 24;
snes.apu._internalWrite(4, 23);
result = snes.apu.EORacc(snes.apu._getIndexXAddr(), 3);
REQUIRE(result == 3);
REQUIRE(snes.apu._internalRegisters.a == 15);
}
TEST_CASE("EOR VIIILogical", "[VIIILogical]")
{
Init()
int result = 0;
snes.apu._internalRegisters.x = 4;
snes.apu._internalRegisters.y = 7;
snes.apu._internalWrite(4, 12);
snes.apu._internalWrite(7, 44);
result = snes.apu.EOR(snes.apu._getIndexXAddr(), snes.apu._getIndexYAddr(), 5);
REQUIRE(result == 5);
REQUIRE(snes.apu._internalRead(4) == 32);
}
//////////////////////////////////
// //
// (VIII)8-bit Arithmetic tests //
// //
//////////////////////////////////
TEST_CASE("ADC VIIIArithmetic", "[VIIIArithmetic]")
{
Init()
int result = 0;
snes.apu._internalRegisters.x = 4;
snes.apu._internalRegisters.y = 7;
snes.apu._internalRegisters.c = true;
snes.apu._internalWrite(4, 53);
snes.apu._internalWrite(7, 76);
result = snes.apu.ADC(snes.apu._getIndexXAddr(), snes.apu._getIndexYAddr(), 5);
REQUIRE(result == 5);
REQUIRE(snes.apu._internalRead(4) == 130);
REQUIRE(snes.apu._internalRegisters.c == false);
REQUIRE(snes.apu._internalRegisters.h == true);
REQUIRE(snes.apu._internalRegisters.v == true);
}
TEST_CASE("ADCacc VIIIArithmetic", "[VIIIArithmetic]")
{
Init()
int result = 0;
snes.apu._internalRegisters.x = 4;
snes.apu._internalRegisters.a = 53;
snes.apu._internalRegisters.c = true;
snes.apu._internalWrite(4, 76);
result = snes.apu.ADCacc(snes.apu._getIndexXAddr(), 3);
REQUIRE(result == 3);
REQUIRE(snes.apu._internalRegisters.a == 130);
REQUIRE(snes.apu._internalRegisters.c == false);
REQUIRE(snes.apu._internalRegisters.h == true);
REQUIRE(snes.apu._internalRegisters.v == true);
}
TEST_CASE("SBC VIIIArithmetic", "[VIIIArithmetic]")
{
Init()
int result = 0;
snes.apu._internalRegisters.x = 4;
snes.apu._internalRegisters.y = 7;
snes.apu._internalRegisters.c = true;
snes.apu._internalWrite(4, 67);
snes.apu._internalWrite(7, 45);
result = snes.apu.SBC(snes.apu._getIndexXAddr(), snes.apu._getIndexYAddr(), 5);
REQUIRE(result == 5);
REQUIRE(snes.apu._internalRead(4) == 22);
REQUIRE(snes.apu._internalRegisters.c == true);
REQUIRE(snes.apu._internalRegisters.h == false);
REQUIRE(snes.apu._internalRegisters.v == false);
}
TEST_CASE("SBCacc VIIIArithmetic", "[VIIIArithmetic]")
{
Init()
int result = 0;
snes.apu._internalRegisters.x = 4;
snes.apu._internalRegisters.a = 67;
snes.apu._internalRegisters.c = true;
snes.apu._internalWrite(4, 45);
result = snes.apu.SBCacc(snes.apu._getIndexXAddr(), 3);
REQUIRE(result == 3);
REQUIRE(snes.apu._internalRegisters.a == 22);
REQUIRE(snes.apu._internalRegisters.c == true);
REQUIRE(snes.apu._internalRegisters.h == false);
REQUIRE(snes.apu._internalRegisters.v == false);
}
TEST_CASE("CMP VIIIArithmetic", "[VIIIArithmetic]")
{
Init()
int result = 0;
snes.apu._internalRegisters.x = 4;
snes.apu._internalRegisters.y = 7;
snes.apu._internalWrite(4, 67);
snes.apu._internalWrite(7, 45);
result = snes.apu.CMP(snes.apu._getIndexXAddr(), snes.apu._getIndexYAddr(), 5);
REQUIRE(result == 5);
REQUIRE(snes.apu._internalRegisters.c == true);
}
TEST_CASE("CMPacc VIIIArithmetic", "[VIIIArithmetic]")
{
Init()
int result = 0;
snes.apu._internalRegisters.x = 4;
snes.apu._internalRegisters.a = 67;
snes.apu._internalWrite(4, 45);
result = snes.apu.CMPreg(snes.apu._internalRegisters.a, snes.apu._getIndexXAddr(), 3);
REQUIRE(result == 3);
REQUIRE(snes.apu._internalRegisters.c == true);
}
/////////////////////////////////////////
// //
// (VIII)8-bit Data Transmission tests //
// //
/////////////////////////////////////////
TEST_CASE("MovRegToReg VIIIDataTransmission", "[VIIIDataTransmission]")
{
Init()
int result = 0;
snes.apu._internalRegisters.a = 23;
snes.apu._internalRegisters.x = 45;
result = snes.apu.MOV(snes.apu._internalRegisters.x, snes.apu._internalRegisters.a);
REQUIRE(result == 2);
REQUIRE(snes.apu._internalRegisters.a == 45);
}
TEST_CASE("MovMemToMem VIIIDataTransmission", "[VIIIDataTransmission]")
{
Init()
int result = 0;
snes.apu._internalRegisters.pc = 0x23;
snes.apu._internalWrite(0x23, 0x56);
snes.apu._internalWrite(0x24, 0x33);
snes.apu._internalWrite(0x56, 99);
snes.apu._internalWrite(0x33, 66);
result = snes.apu.MOV(snes.apu._getDirectAddr(), snes.apu._getImmediateData());
REQUIRE(result == 5);
REQUIRE(snes.apu._internalRead(0x33) == 0x56);
}
TEST_CASE("MovRegToMem VIIIDataTransmission", "[VIIIDataTransmission]")
{
Init()
int result = 0;
snes.apu._internalRegisters.x = 0x23;
snes.apu._internalRegisters.a = 0x44;
snes.apu._internalWrite(0x23, 0x56);
result = snes.apu.MOV(snes.apu._internalRegisters.a, snes.apu._getIndexXAddr(), 4, true);
REQUIRE(result == 4);
REQUIRE(snes.apu._internalRead(0x23) == 0x44);
REQUIRE(snes.apu._internalRegisters.x == 0x24);
}
TEST_CASE("MovMemToReg VIIIDataTransmission", "[VIIIDataTransmission]")
{
Init()
int result = 0;
snes.apu._internalRegisters.x = 0x23;
snes.apu._internalRegisters.a = 0x44;
result = snes.apu.MOV(snes.apu._getIndexXAddr(), snes.apu._internalRegisters.a, 4, true);
REQUIRE(result == 4);
REQUIRE(snes.apu._internalRegisters.x == 0x24);
REQUIRE(snes.apu._internalRegisters.a == 0x23);
}