summaryrefslogtreecommitdiff
path: root/lib/nes/sys/types/snapshot.hh
blob: ff3f6a6e777bbf49ec0d4e9e097dae823a183a00 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#pragma once

#ifdef NES_ENABLE_SNAPSHOTS

#include "nes/sys/types/cycle-count.hh"
#include "nes/common/types.hh"
#include <vector>

namespace nes::sys
{
	/// System snapshot used for comparison with a reference implementation.
	struct snapshot
	{
		explicit snapshot() = default;

		cycle_count cpu_cycle;
		cycle_count ppu_cycle;
		std::vector<u8> ram;
		std::vector<u8> sram;
		std::vector<u8> vram;
		std::vector<u8> oam;
		struct
		{
			u16 pc{};
			u8 sp{};
			u8 a{};
			u8 x{};
			u8 y{};
			u8 p{};
			bool c{};
			bool z{};
			bool i{};
			bool d{};
			bool b{};
			bool v{};
			bool n{};
		} registers{};
	};

	inline auto operator==(snapshot const& a, snapshot const& b) -> bool
	{
		if (a.cpu_cycle != b.cpu_cycle) { return false; }
		if (a.ppu_cycle != b.ppu_cycle) { return false; }
		if (a.ram != b.ram) { return false; }
		if (a.sram != b.sram) { return false; }
		if (a.vram != b.vram) { return false; }
		if (a.oam != b.oam) { return false; }
		if (a.registers.pc != b.registers.pc) { return false; }
		if (a.registers.sp != b.registers.sp) { return false; }
		if (a.registers.a != b.registers.a) { return false; }
		if (a.registers.x != b.registers.x) { return false; }
		if (a.registers.y != b.registers.y) { return false; }
		if (a.registers.p != b.registers.p) { return false; }
		if (a.registers.c != b.registers.c) { return false; }
		if (a.registers.z != b.registers.z) { return false; }
		if (a.registers.i != b.registers.i) { return false; }
		if (a.registers.d != b.registers.d) { return false; }
		if (a.registers.b != b.registers.b) { return false; }
		if (a.registers.v != b.registers.v) { return false; }
		if (a.registers.n != b.registers.n) { return false; }
		return true;
	}

	inline auto operator!=(snapshot const& a, snapshot const& b) -> bool { return !(a == b); }
} // namespace nes::sys

#endif