mirror of
https://github.com/MoleskiCoder/EightBit.git
synced 2024-11-04 12:05:03 +00:00
cf32f37fc3
Signed-off-by: Adrian Conlon <Adrian.conlon@gmail.com>
126 lines
3.1 KiB
C++
126 lines
3.1 KiB
C++
#include "pch.h"
|
|
#include "Board.h"
|
|
|
|
// Using examples from 6809 Assembly Language Programming, by Lance A. Leventhal
|
|
// Just test the basics...
|
|
|
|
TEST_CASE("Add Accumulator B to Index Register X Unsigned", "[ABX]") {
|
|
|
|
Board board;
|
|
board.initialise();
|
|
auto& cpu = board.CPU();
|
|
cpu.step(); // Step over the reset
|
|
|
|
SECTION("Inherent") {
|
|
board.poke(0, 0x3a);
|
|
cpu.B() = 0x84;
|
|
cpu.X() = 0x1097;
|
|
cpu.step();
|
|
REQUIRE(cpu.X() == 0x111b);
|
|
REQUIRE(cpu.cycles() == 3);
|
|
}
|
|
}
|
|
|
|
TEST_CASE("Add Memory Plus Carry to Accumulator A", "[ADC][ADCA]") {
|
|
|
|
Board board;
|
|
board.initialise();
|
|
auto& cpu = board.CPU();
|
|
cpu.step(); // Step over the reset
|
|
|
|
SECTION("Immediate (byte)") {
|
|
board.poke(0, 0x89);
|
|
board.poke(1, 0x7c);
|
|
EightBit::Chip::setFlag(cpu.CC(), EightBit::mc6809::CF);
|
|
cpu.A() = 0x3a;
|
|
cpu.step();
|
|
REQUIRE(cpu.A() == 0xb7);
|
|
REQUIRE((cpu.CC() & EightBit::mc6809::ZF) == 0);
|
|
REQUIRE((cpu.CC() & EightBit::mc6809::HF) != 0);
|
|
REQUIRE((cpu.CC() & EightBit::mc6809::VF) != 0);
|
|
REQUIRE((cpu.CC() & EightBit::mc6809::NF) != 0);
|
|
REQUIRE((cpu.CC() & EightBit::mc6809::CF) == 0);
|
|
REQUIRE(cpu.cycles() == 2);
|
|
}
|
|
}
|
|
|
|
TEST_CASE("Add Memory to Accumulator A", "[ADD][ADDA]") {
|
|
|
|
Board board;
|
|
board.initialise();
|
|
auto& cpu = board.CPU();
|
|
cpu.step(); // Step over the reset
|
|
|
|
SECTION("Immediate (byte)") {
|
|
board.poke(0, 0x8b);
|
|
board.poke(1, 0x8b);
|
|
cpu.A() = 0x24;
|
|
cpu.step();
|
|
REQUIRE(cpu.A() == 0xaf);
|
|
REQUIRE((cpu.CC() & EightBit::mc6809::ZF) == 0);
|
|
REQUIRE((cpu.CC() & EightBit::mc6809::HF) == 0);
|
|
REQUIRE((cpu.CC() & EightBit::mc6809::VF) == 0);
|
|
REQUIRE((cpu.CC() & EightBit::mc6809::NF) != 0);
|
|
REQUIRE((cpu.CC() & EightBit::mc6809::CF) == 0);
|
|
REQUIRE(cpu.cycles() == 2);
|
|
}
|
|
}
|
|
|
|
TEST_CASE("Logical AND Accumulator", "[AND][ANDA]") {
|
|
|
|
Board board;
|
|
board.initialise();
|
|
auto& cpu = board.CPU();
|
|
cpu.step(); // Step over the reset
|
|
|
|
SECTION("Immediate (byte)") {
|
|
board.poke(0, 0x84);
|
|
board.poke(1, 0x13);
|
|
cpu.A() = 0xfc;
|
|
cpu.step();
|
|
REQUIRE(cpu.A() == 0x10);
|
|
REQUIRE((cpu.CC() & EightBit::mc6809::ZF) == 0);
|
|
REQUIRE((cpu.CC() & EightBit::mc6809::VF) == 0);
|
|
REQUIRE((cpu.CC() & EightBit::mc6809::NF) == 0);
|
|
REQUIRE(cpu.cycles() == 2);
|
|
}
|
|
}
|
|
|
|
TEST_CASE("Shift Accumulator or Memory Byte Left", "[ASL][ASLA]") {
|
|
|
|
Board board;
|
|
board.initialise();
|
|
auto& cpu = board.CPU();
|
|
cpu.step(); // Step over the reset
|
|
|
|
SECTION("Inherent") {
|
|
board.poke(0, 0x48);
|
|
cpu.A() = 0x7a;
|
|
cpu.step();
|
|
REQUIRE(cpu.A() == 0xf4);
|
|
REQUIRE((cpu.CC() & EightBit::mc6809::ZF) == 0);
|
|
REQUIRE((cpu.CC() & EightBit::mc6809::VF) != 0);
|
|
REQUIRE((cpu.CC() & EightBit::mc6809::NF) != 0);
|
|
REQUIRE(cpu.cycles() == 2);
|
|
}
|
|
}
|
|
|
|
TEST_CASE("Shift Accumulator or Memory Byte Right", "[ASR][ASRA]") {
|
|
|
|
Board board;
|
|
board.initialise();
|
|
auto& cpu = board.CPU();
|
|
cpu.step(); // Step over the reset
|
|
|
|
SECTION("Inherent") {
|
|
board.poke(0, 0x47);
|
|
cpu.A() = 0xcb;
|
|
cpu.step();
|
|
REQUIRE(cpu.A() == 0xe5);
|
|
REQUIRE((cpu.CC() & EightBit::mc6809::CF) != 0);
|
|
REQUIRE((cpu.CC() & EightBit::mc6809::ZF) == 0);
|
|
REQUIRE((cpu.CC() & EightBit::mc6809::NF) != 0);
|
|
REQUIRE(cpu.cycles() == 2);
|
|
}
|
|
}
|