blob: de23a46171248798c7caa21011b2b2c645c9c14f (
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
|
#pragma once
#include "nes/util/cycle-count.hh"
#include <vector>
#include <cstdint>
namespace nes
{
/// System snapshot used for comparison with a reference implementation.
struct snapshot
{
explicit snapshot() = default;
cycle_count cpu_cycle;
cycle_count ppu_cycle;
std::vector<std::uint8_t> ram;
std::vector<std::uint8_t> sram;
std::vector<std::uint8_t> vram;
std::vector<std::uint8_t> oam;
struct
{
std::uint16_t pc{};
std::uint8_t sp{};
std::uint8_t a{};
std::uint8_t x{};
std::uint8_t y{};
std::uint8_t 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
|